Index: src/arm/virtual-frame-arm.cc |
=================================================================== |
--- src/arm/virtual-frame-arm.cc (revision 4568) |
+++ src/arm/virtual-frame-arm.cc (working copy) |
@@ -304,6 +304,21 @@ |
} |
+void VirtualFrame::CallStoreIC(Handle<String> name, bool is_contextual) { |
+ Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
+ PopToR0(); |
+ if (is_contextual) { |
+ SpillAll(); |
+ __ ldr(r1, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_INDEX))); |
+ } else { |
+ EmitPop(r1); |
+ SpillAll(); |
+ } |
+ __ mov(r2, Operand(name)); |
+ CallCodeObject(ic, RelocInfo::CODE_TARGET, 0); |
+} |
+ |
+ |
void VirtualFrame::CallKeyedLoadIC() { |
Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); |
CallCodeObject(ic, RelocInfo::CODE_TARGET, 0); |
@@ -311,6 +326,7 @@ |
void VirtualFrame::CallKeyedStoreIC() { |
+ ASSERT(SpilledScope::is_spilled()); |
Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); |
CallCodeObject(ic, RelocInfo::CODE_TARGET, 0); |
} |
@@ -477,6 +493,38 @@ |
} |
+void VirtualFrame::Dup() { |
+ AssertIsNotSpilled(); |
+ switch (top_of_stack_state_) { |
+ case NO_TOS_REGISTERS: |
+ __ ldr(r0, MemOperand(sp, 0)); |
+ top_of_stack_state_ = R0_TOS; |
+ break; |
+ case R0_TOS: |
+ __ mov(r1, r0); |
+ top_of_stack_state_ = R0_R1_TOS; |
+ break; |
+ case R1_TOS: |
+ __ mov(r0, r1); |
+ top_of_stack_state_ = R0_R1_TOS; |
+ break; |
+ case R0_R1_TOS: |
+ __ push(r1); |
+ __ mov(r1, r0); |
+ // No need to change state as r0 and r1 now contains the same value. |
+ break; |
+ case R1_R0_TOS: |
+ __ push(r0); |
+ __ mov(r0, r1); |
+ // No need to change state as r0 and r1 now contains the same value. |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+ element_count_++; |
+} |
+ |
+ |
Register VirtualFrame::PopToRegister(Register but_not_to_this_one) { |
ASSERT(but_not_to_this_one.is(r0) || |
but_not_to_this_one.is(r1) || |