Commit 081a86fd authored by Junliang Yan's avatar Junliang Yan Committed by Commit Bot

ppc: implement reverse js arg

Change-Id: Ica6b886ca0b16ab6eb86f3a90c598a0801230648
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2385918Reviewed-by: 's avatarVictor Gomes <victorgomes@chromium.org>
Commit-Queue: Victor Gomes <victorgomes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#69640}
parent 2d0b17d5
This diff is collapsed.
......@@ -320,6 +320,38 @@ void TurboAssembler::Push(Smi smi) {
push(r0);
}
void TurboAssembler::PushArray(Register array, Register size, Register scratch,
Register scratch2, PushArrayOrder order) {
Label loop, done;
if (order == kNormal) {
cmpi(size, Operand::Zero());
beq(&done);
ShiftLeftImm(scratch, size, Operand(kSystemPointerSizeLog2));
add(scratch, array, scratch);
mtctr(size);
bind(&loop);
LoadPU(scratch2, MemOperand(scratch, -kSystemPointerSize));
StorePU(scratch2, MemOperand(sp, -kSystemPointerSize));
bdnz(&loop);
bind(&done);
} else {
cmpi(size, Operand::Zero());
beq(&done);
mtctr(size);
subi(scratch, array, Operand(kSystemPointerSize));
bind(&loop);
LoadPU(scratch2, MemOperand(scratch, kSystemPointerSize));
StorePU(scratch2, MemOperand(sp, -kSystemPointerSize));
bdnz(&loop);
bind(&done);
}
}
void TurboAssembler::Move(Register dst, Handle<HeapObject> value,
RelocInfo::Mode rmode) {
// TODO(jgruber,v8:8887): Also consider a root-relative load when generating
......@@ -1350,8 +1382,7 @@ void MacroAssembler::CheckDebugHook(Register fun, Register new_target,
{
// Load receiver to pass it later to DebugOnFunctionCall hook.
ShiftLeftImm(r7, actual_parameter_count, Operand(kSystemPointerSizeLog2));
LoadPX(r7, MemOperand(sp, r7));
LoadReceiver(r7, actual_parameter_count);
FrameScope frame(this,
has_frame() ? StackFrame::NONE : StackFrame::INTERNAL);
......
......@@ -237,6 +237,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
StoreP(src1, MemOperand(sp, 4 * kSystemPointerSize));
}
enum PushArrayOrder { kNormal, kReverse };
void PushArray(Register array, Register size, Register scratch,
Register scratch2, PushArrayOrder order = kNormal);
void Pop(Register dst) { pop(dst); }
// Pop two registers. Pops rightmost register first (from lower address).
......@@ -719,6 +723,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
LoadP(dest, MemOperand(sp, 0));
#else
ShiftLeftImm(dest, argc, Operand(kSystemPointerSizeLog2));
LoadPX(dest, MemOperand(sp, dest));
#endif
}
void StoreReceiver(Register rec, Register argc, Register scratch) {
#ifdef V8_REVERSE_JSARGS
StoreP(rec, MemOperand(sp, 0));
#else
ShiftLeftImm(scratch, argc, Operand(kSystemPointerSizeLog2));
StorePX(rec, MemOperand(sp, scratch));
#endif
}
// ---------------------------------------------------------------------------
// GC Support
......
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