| Index: src/x87/builtins-x87.cc
|
| diff --git a/src/x87/builtins-x87.cc b/src/x87/builtins-x87.cc
|
| index 8a4272ada80ddef80f7680ce3ba6bf54abd665e1..317166b294c433a5187f7e5251fb56aa6f2812ff 100644
|
| --- a/src/x87/builtins-x87.cc
|
| +++ b/src/x87/builtins-x87.cc
|
| @@ -603,27 +603,24 @@ void Builtins::Generate_InterpreterPushArgsAndConstruct(MacroAssembler* masm) {
|
| // they are to be pushed onto the stack.
|
| // -----------------------------------
|
|
|
| - // Save number of arguments on the stack below where arguments are going
|
| - // to be pushed.
|
| - __ mov(ecx, eax);
|
| - __ neg(ecx);
|
| - __ mov(Operand(esp, ecx, times_pointer_size, -kPointerSize), eax);
|
| - __ mov(eax, ecx);
|
| -
|
| // Pop return address to allow tail-call after pushing arguments.
|
| __ Pop(ecx);
|
|
|
| - // Find the address of the last argument.
|
| - __ shl(eax, kPointerSizeLog2);
|
| - __ add(eax, ebx);
|
| + // Push edi in the slot meant for receiver. We need an extra register
|
| + // so store edi temporarily on stack.
|
| + __ Push(edi);
|
|
|
| - // Push padding for receiver.
|
| - __ Push(Immediate(0));
|
| + // Find the address of the last argument.
|
| + __ mov(edi, eax);
|
| + __ neg(edi);
|
| + __ shl(edi, kPointerSizeLog2);
|
| + __ add(edi, ebx);
|
|
|
| - Generate_InterpreterPushArgs(masm, eax);
|
| + Generate_InterpreterPushArgs(masm, edi);
|
|
|
| - // Restore number of arguments from slot on stack.
|
| - __ mov(eax, Operand(esp, -kPointerSize));
|
| + // Restore the constructor from slot on stack. It was pushed at the slot
|
| + // meant for receiver.
|
| + __ mov(edi, Operand(esp, eax, times_pointer_size, 0));
|
|
|
| // Re-push return address.
|
| __ Push(ecx);
|
|
|