Chromium Code Reviews| Index: src/x64/cfg-x64.cc |
| =================================================================== |
| --- src/x64/cfg-x64.cc (revision 2651) |
| +++ src/x64/cfg-x64.cc (working copy) |
| @@ -122,25 +122,60 @@ |
| } |
| +void PropRefInstr::Compile(MacroAssembler* masm) { |
| + // The key should not be on the stack---if it is a compiler-generated |
| + // temporary it is in the accumulator. |
| + ASSERT(!key()->is_on_stack()); |
| + |
| + Comment cmnt(masm, "[ Load from Property"); |
| + // If the key is known at compile-time we may be able to use a load IC. |
| + bool is_keyed_load = true; |
| + if (key()->is_constant()) { |
| + // Still use the keyed load IC if the key can be parsed as an integer so |
| + // we will get into the case that handles [] on string objects. |
| + Handle<Object> key_val = Constant::cast(key())->handle(); |
| + uint32_t ignored; |
| + if (key_val->IsSymbol() && |
| + !String::cast(*key_val)->AsArrayIndex(&ignored)) { |
| + is_keyed_load = false; |
| + } |
| + } |
| + |
| + if (!object()->is_on_stack()) object()->Push(masm); |
| + // A test rax instruction after the call indicates to the IC code that it |
| + // was inlined. Ensure there is not one after the call below. |
| + if (is_keyed_load) { |
| + key()->Push(masm); |
| + Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); |
| + __ Call(ic, RelocInfo::CODE_TARGET); |
| + __ pop(kScratchRegister); // Discard key. |
|
William Hesse
2009/08/07 12:50:26
If you don't care what you pop to, popping to a le
Kevin Millikin (Chromium)
2009/08/07 13:25:33
Thanks for the tip, using rbx.
|
| + } else { |
| + key()->Get(masm, rcx); |
| + Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); |
| + __ Call(ic, RelocInfo::CODE_TARGET); |
| + } |
| + __ pop(kScratchRegister); // Discard receiver. |
| + location()->Set(masm, rax); |
| +} |
| + |
| + |
| void BinaryOpInstr::Compile(MacroAssembler* masm) { |
| // The right-hand value should not be on the stack---if it is a |
| // compiler-generated temporary it is in the accumulator. |
| - ASSERT(!value1()->is_on_stack()); |
| + ASSERT(!right()->is_on_stack()); |
| Comment cmnt(masm, "[ BinaryOpInstr"); |
| // We can overwrite one of the operands if it is a temporary. |
| OverwriteMode mode = NO_OVERWRITE; |
| - if (value0()->is_temporary()) { |
| + if (left()->is_temporary()) { |
| mode = OVERWRITE_LEFT; |
| - } else if (value1()->is_temporary()) { |
| + } else if (right()->is_temporary()) { |
| mode = OVERWRITE_RIGHT; |
| } |
| // Push both operands and call the specialized stub. |
| - if (!value0()->is_on_stack()) { |
| - value0()->Push(masm); |
| - } |
| - value1()->Push(masm); |
| + if (!left()->is_on_stack()) left()->Push(masm); |
| + right()->Push(masm); |
| GenericBinaryOpStub stub(op(), mode, SMI_CODE_IN_STUB); |
| __ CallStub(&stub); |
| location()->Set(masm, rax); |
| @@ -151,7 +186,7 @@ |
| // The location should be 'Effect'. As a side effect, move the value to |
| // the accumulator. |
| Comment cmnt(masm, "[ ReturnInstr"); |
| - value_->Get(masm, rax); |
| + value()->Get(masm, rax); |
| } |