Index: src/x64/full-codegen-x64.cc |
=================================================================== |
--- src/x64/full-codegen-x64.cc (revision 5833) |
+++ src/x64/full-codegen-x64.cc (working copy) |
@@ -1739,25 +1739,33 @@ |
void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr, |
Expression* key, |
RelocInfo::Mode mode) { |
- // Code common for calls using the IC. |
+ // Load the key. |
+ VisitForAccumulatorValue(key); |
+ |
+ // Swap the name of the function and the receiver on the stack to follow |
+ // the calling convention for call ICs. |
+ __ pop(rcx); |
+ __ push(rax); |
+ __ push(rcx); |
+ |
+ // Load the arguments. |
ZoneList<Expression*>* args = expr->arguments(); |
int arg_count = args->length(); |
{ PreserveStatementPositionScope scope(masm()->positions_recorder()); |
for (int i = 0; i < arg_count; i++) { |
VisitForStackValue(args->at(i)); |
} |
- VisitForAccumulatorValue(key); |
- __ movq(rcx, rax); |
} |
// Record source position for debugger. |
SetSourcePosition(expr->position(), FORCED_POSITION); |
// Call the IC initialization code. |
InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; |
Handle<Code> ic = StubCache::ComputeKeyedCallInitialize(arg_count, in_loop); |
+ __ movq(rcx, Operand(rsp, (arg_count + 1) * kPointerSize)); // Key. |
EmitCallIC(ic, mode); |
// Restore context register. |
__ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
- context()->Plug(rax); |
+ context()->DropAndPlug(1, rax); // Drop the key still on the stack. |
} |