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, ...@@ -2086,7 +2086,14 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
// Forward the arguments from the caller frame. // Forward the arguments from the caller frame.
{ {
Label loop; 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)); __ add(r4, r4, Operand(kPointerSize));
#endif
__ add(r0, r0, r5); __ add(r0, r0, r5);
__ bind(&loop); __ bind(&loop);
{ {
...@@ -2095,6 +2102,9 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, ...@@ -2095,6 +2102,9 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
__ sub(r5, r5, Operand(1), SetCC); __ sub(r5, r5, Operand(1), SetCC);
__ b(ne, &loop); __ b(ne, &loop);
} }
#ifdef V8_REVERSE_JSARGS
__ push(r8); // Recover new receiver.
#endif
} }
} }
__ b(&stack_done); __ b(&stack_done);
......
...@@ -2248,13 +2248,29 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, ...@@ -2248,13 +2248,29 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
Label loop; Label loop;
__ add(eax, edx); __ add(eax, edx);
__ PopReturnAddressTo(ecx); __ 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); __ bind(&loop);
{ {
__ Push(Operand(scratch, edx, times_system_pointer_size,
1 * kSystemPointerSize));
__ dec(edx); __ 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); __ j(not_zero, &loop);
} }
#ifdef V8_REVERSE_JSARGS
__ Push(ebx); // Push new receiver.
__ movd(ebx, xmm2); // Recover root register.
#endif
__ PushReturnAddressFrom(ecx); __ PushReturnAddressFrom(ecx);
} }
} }
......
...@@ -2352,13 +2352,27 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, ...@@ -2352,13 +2352,27 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
Label loop; Label loop;
__ addl(rax, r8); __ addl(rax, r8);
__ PopReturnAddressTo(rcx); __ 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); __ bind(&loop);
{ {
__ decl(r8); __ 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, __ Push(Operand(rbx, r8, times_system_pointer_size,
kFPOnStackSize + kPCOnStackSize)); kFPOnStackSize + kPCOnStackSize));
#endif
__ j(not_zero, &loop); __ j(not_zero, &loop);
} }
#ifdef V8_REVERSE_JSARGS
// Recover the new receiver.
__ Push(kScratchRegister);
#endif
__ PushReturnAddressFrom(rcx); __ 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