Commit 62e06b39 authored by Victor Gomes's avatar Victor Gomes Committed by Commit Bot

[builtins] Adapt CallOrConstructForwardVarargs to handle V8_REVERSE_JSARGS

This CL adapts the builtin for architectures ia32, x64 and arm.

Change-Id: Ib191e66a75eaddaee505e30b8cafb0c5e5bf42ce
Bug: v8:10201
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2292246
Auto-Submit: Victor Gomes <victorgomes@chromium.org>
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#68817}
parent 1f428bc4
......@@ -2086,7 +2086,14 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
// Forward the arguments from the caller frame.
{
Label loop;
#ifdef V8_REVERSE_JSARGS
// Skips frame pointer and old receiver.
__ add(r4, r4, Operand(2 * kPointerSize));
__ pop(r8); // Save new receiver.
#else
// Skips frame pointer.
__ add(r4, r4, Operand(kPointerSize));
#endif
__ add(r0, r0, r5);
__ bind(&loop);
{
......@@ -2095,6 +2102,9 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
__ sub(r5, r5, Operand(1), SetCC);
__ b(ne, &loop);
}
#ifdef V8_REVERSE_JSARGS
__ push(r8); // Recover new receiver.
#endif
}
}
__ b(&stack_done);
......
......@@ -2248,13 +2248,29 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
Label loop;
__ add(eax, edx);
__ PopReturnAddressTo(ecx);
#ifdef V8_REVERSE_JSARGS
// TODO(victor): When we remove the arguments adaptor machinery above,
// we can free the scratch register and avoid this move.
__ movd(xmm2, ebx); // Save root register.
__ Pop(ebx); // Save new receiver.
#endif
__ bind(&loop);
{
__ Push(Operand(scratch, edx, times_system_pointer_size,
1 * kSystemPointerSize));
__ dec(edx);
#ifdef V8_REVERSE_JSARGS
// Skips old receiver.
__ Push(Operand(scratch, edx, times_system_pointer_size,
kFPOnStackSize + kPCOnStackSize + kSystemPointerSize));
#else
__ Push(Operand(scratch, edx, times_system_pointer_size,
kFPOnStackSize + kPCOnStackSize));
#endif
__ j(not_zero, &loop);
}
#ifdef V8_REVERSE_JSARGS
__ Push(ebx); // Push new receiver.
__ movd(ebx, xmm2); // Recover root register.
#endif
__ PushReturnAddressFrom(ecx);
}
}
......
......@@ -2352,13 +2352,27 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
Label loop;
__ addl(rax, r8);
__ PopReturnAddressTo(rcx);
#ifdef V8_REVERSE_JSARGS
// The new receiver is already on the stack. Save it to push it later.
__ Pop(kScratchRegister);
#endif
__ bind(&loop);
{
__ decl(r8);
#ifdef V8_REVERSE_JSARGS
// Skips the old receiver.
__ Push(Operand(rbx, r8, times_system_pointer_size,
kFPOnStackSize + kPCOnStackSize + kSystemPointerSize));
#else
__ Push(Operand(rbx, r8, times_system_pointer_size,
kFPOnStackSize + kPCOnStackSize));
#endif
__ j(not_zero, &loop);
}
#ifdef V8_REVERSE_JSARGS
// Recover the new receiver.
__ Push(kScratchRegister);
#endif
__ PushReturnAddressFrom(rcx);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment