Commit 94953266 authored by Zhao Jiazhong's avatar Zhao Jiazhong Committed by Commit Bot

[mips32] Implement V8_REVERSE_JSARGS

Bug: v8:10201
Change-Id: I86cd6b73787cea307013dd311d048b20459ad573
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2465052Reviewed-by: 's avatarVictor Gomes <victorgomes@chromium.org>
Reviewed-by: 's avatarTobias Tebbi <tebbi@chromium.org>
Commit-Queue: Victor Gomes <victorgomes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#70447}
parent 5b46420d
......@@ -113,8 +113,7 @@ declare_args() {
v8_disable_arguments_adaptor = false
# Reverse JS arguments order in the stack (sets -dV8_REVERSE_JSARGS).
v8_enable_reverse_jsargs =
v8_current_cpu != "mipsel" && v8_current_cpu != "mips64el"
v8_enable_reverse_jsargs = true
# Sets -dOBJECT_PRINT.
v8_enable_object_print = ""
......
This diff is collapsed.
......@@ -4183,6 +4183,33 @@ void TurboAssembler::Push(Smi smi) {
push(scratch);
}
void TurboAssembler::PushArray(Register array, Register size, Register scratch,
Register scratch2, PushArrayOrder order) {
DCHECK(!AreAliased(array, size, scratch, scratch2));
Label loop, entry;
if (order == PushArrayOrder::kReverse) {
mov(scratch, zero_reg);
jmp(&entry);
bind(&loop);
Lsa(scratch2, array, scratch, kPointerSizeLog2);
Lw(scratch2, MemOperand(scratch2));
push(scratch2);
Addu(scratch, scratch, Operand(1));
bind(&entry);
Branch(&loop, less, scratch, Operand(size));
} else {
mov(scratch, size);
jmp(&entry);
bind(&loop);
Lsa(scratch2, array, scratch, kPointerSizeLog2);
Lw(scratch2, MemOperand(scratch2));
push(scratch2);
bind(&entry);
Addu(scratch, scratch, Operand(-1));
Branch(&loop, greater_equal, scratch, Operand(zero_reg));
}
}
void MacroAssembler::MaybeDropFrames() {
// Check whether we need to drop frames to restart a function on the stack.
li(a1, ExternalReference::debug_restart_fp_address(isolate()));
......@@ -4351,8 +4378,9 @@ void MacroAssembler::InvokePrologue(Register expected_parameter_count,
Label* done, InvokeFlag flag) {
Label regular_invoke;
// Check whether the expected and actual arguments count match. The registers
// are set up according to contract with ArgumentsAdaptorTrampoline:
// Check whether the expected and actual arguments count match. The
// registers are set up according to contract with
// ArgumentsAdaptorTrampoline:
// a0: actual arguments count
// a1: function (passed through to callee)
// a2: expected arguments count
......@@ -4386,8 +4414,8 @@ void MacroAssembler::CheckDebugHook(Register fun, Register new_target,
{
// Load receiver to pass it later to DebugOnFunctionCall hook.
Lsa(at, sp, actual_parameter_count, kPointerSizeLog2);
lw(t0, MemOperand(at));
LoadReceiver(t0, actual_parameter_count);
FrameScope frame(this,
has_frame() ? StackFrame::NONE : StackFrame::INTERNAL);
SmiTag(expected_parameter_count);
......
......@@ -312,6 +312,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
sw(src, MemOperand(sp, 0));
}
enum PushArrayOrder { kNormal, kReverse };
void PushArray(Register array, Register size, Register scratch,
Register scratch2, PushArrayOrder order = kNormal);
void SaveRegisters(RegList registers);
void RestoreRegisters(RegList registers);
......@@ -905,6 +909,28 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
public:
using TurboAssembler::TurboAssembler;
// It assumes that the arguments are located below the stack pointer.
// argc is the number of arguments not including the receiver.
// TODO(victorgomes): Remove this function once we stick with the reversed
// arguments order.
void LoadReceiver(Register dest, Register argc) {
#ifdef V8_REVERSE_JSARGS
Lw(dest, MemOperand(sp, 0));
#else
Lsa(dest, sp, argc, kPointerSizeLog2);
Lw(dest, MemOperand(dest, 0));
#endif
}
void StoreReceiver(Register rec, Register argc, Register scratch) {
#ifdef V8_REVERSE_JSARGS
Sw(rec, MemOperand(sp, 0));
#else
Lsa(scratch, sp, argc, kPointerSizeLog2);
Sw(rec, MemOperand(scratch, 0));
#endif
}
// Swap two registers. If the scratch register is omitted then a slightly
// less efficient form using xor instead of mov is emitted.
void Swap(Register reg1, Register reg2, Register scratch = no_reg);
......
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