Index: src/arm/codegen-arm.cc |
=================================================================== |
--- src/arm/codegen-arm.cc (revision 4607) |
+++ src/arm/codegen-arm.cc (working copy) |
@@ -3473,7 +3473,8 @@ |
if (node->is_compound()) { |
// For a compound assignment the right-hand side is a binary operation |
// between the current property value and the actual right-hand side. |
- // Load of the current value leaves receiver and key on the stack. |
+ // Duplicate receiver and key for loading the current property value. |
+ frame_->Dup2(); |
EmitKeyedLoad(); |
frame_->EmitPush(r0); |
@@ -3767,19 +3768,23 @@ |
// ------------------------------------------- |
LoadAndSpill(property->obj()); |
+ if (!property->is_synthetic()) { |
+ // Duplicate receiver for later use. |
+ __ ldr(r0, MemOperand(sp, 0)); |
+ frame_->EmitPush(r0); |
+ } |
LoadAndSpill(property->key()); |
EmitKeyedLoad(); |
- frame_->Drop(); // key |
// Put the function below the receiver. |
if (property->is_synthetic()) { |
// Use the global receiver. |
- frame_->Drop(); |
- frame_->EmitPush(r0); |
+ frame_->EmitPush(r0); // Function. |
LoadGlobalReceiver(r0); |
} else { |
- frame_->EmitPop(r1); // receiver |
- frame_->EmitPush(r0); // function |
- frame_->EmitPush(r1); // receiver |
+ // Switch receiver and function. |
+ frame_->EmitPop(r1); // Receiver. |
+ frame_->EmitPush(r0); // Function. |
+ frame_->EmitPush(r1); // Receiver. |
} |
// Call the function. |
@@ -5388,8 +5393,7 @@ |
// The rest of the instructions in the deferred code must be together. |
{ Assembler::BlockConstPoolScope block_const_pool(masm_); |
- // Call keyed load IC. It has all arguments on the stack and the key in r0. |
- __ ldr(r0, MemOperand(sp, 0)); |
+ // Call keyed load IC. It has the arguments key and receiver in r0 and r1. |
Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); |
__ Call(ic, RelocInfo::CODE_TARGET); |
// The call must be followed by a nop instruction to indicate that the |
@@ -5522,12 +5526,13 @@ |
__ IncrementCounter(&Counters::keyed_load_inline, 1, |
frame_->scratch0(), frame_->scratch1()); |
- // Load the receiver and key from the stack. |
- frame_->SpillAllButCopyTOSToR1R0(); |
+ // Load the key and receiver from the stack to r0 and r1. |
+ frame_->PopToR1R0(); |
Register receiver = r0; |
Register key = r1; |
VirtualFrame::SpilledScope spilled(frame_); |
+ // The deferred code expects key and receiver in r0 and r1. |
DeferredReferenceGetKeyedValue* deferred = |
new DeferredReferenceGetKeyedValue(); |
@@ -5721,6 +5726,9 @@ |
Slot* slot = expression_->AsVariableProxy()->AsVariable()->slot(); |
ASSERT(slot != NULL); |
cgen_->LoadFromSlotCheckForArguments(slot, NOT_INSIDE_TYPEOF); |
+ if (!persist_after_get_) { |
+ cgen_->UnloadReference(this); |
+ } |
break; |
} |
@@ -5730,23 +5738,26 @@ |
ASSERT(!is_global || var->is_global()); |
cgen_->EmitNamedLoad(GetName(), is_global); |
cgen_->frame()->EmitPush(r0); |
+ if (!persist_after_get_) { |
+ cgen_->UnloadReference(this); |
+ } |
break; |
} |
case KEYED: { |
+ if (persist_after_get_) { |
+ cgen_->frame()->Dup2(); |
+ } |
ASSERT(property != NULL); |
cgen_->EmitKeyedLoad(); |
cgen_->frame()->EmitPush(r0); |
+ if (!persist_after_get_) set_unloaded(); |
break; |
} |
default: |
UNREACHABLE(); |
} |
- |
- if (!persist_after_get_) { |
- cgen_->UnloadReference(this); |
- } |
} |