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); |
} |