Commit 2689fecc authored by Victor Gomes's avatar Victor Gomes Committed by V8 LUCI CQ

[maglev] Push double register with fixed size

Maglev double registers spill can use simple size kDoubleSize even
when wasm is enabled.

Bug: v8:7700
Change-Id: I485f69eeda781dddcbac4d34018b4442b6eb529d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3789382Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
Auto-Submit: Victor Gomes <victorgomes@chromium.org>
Commit-Queue: Leszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/main@{#81998}
parent 2746000c
......@@ -841,35 +841,37 @@ int TurboAssembler::PopAll(RegList registers) {
return bytes;
}
int TurboAssembler::PushAll(DoubleRegList registers) {
int TurboAssembler::PushAll(DoubleRegList registers, int stack_slot_size) {
if (registers.is_empty()) return 0;
const int delta = kStackSavedSavedFPSize * registers.Count();
const int delta = stack_slot_size * registers.Count();
AllocateStackSpace(delta);
int slot = 0;
for (XMMRegister reg : registers) {
#if V8_ENABLE_WEBASSEMBLY
Movdqu(Operand(rsp, slot), reg);
#else
Movsd(Operand(rsp, slot), reg);
#endif // V8_ENABLE_WEBASSEMBLY
slot += kStackSavedSavedFPSize;
if (stack_slot_size == kDoubleSize) {
Movsd(Operand(rsp, slot), reg);
} else {
DCHECK_EQ(stack_slot_size, 2 * kDoubleSize);
Movdqu(Operand(rsp, slot), reg);
}
slot += stack_slot_size;
}
DCHECK_EQ(slot, delta);
return delta;
}
int TurboAssembler::PopAll(DoubleRegList registers) {
int TurboAssembler::PopAll(DoubleRegList registers, int stack_slot_size) {
if (registers.is_empty()) return 0;
int slot = 0;
for (XMMRegister reg : registers) {
#if V8_ENABLE_WEBASSEMBLY
Movdqu(reg, Operand(rsp, slot));
#else
Movsd(reg, Operand(rsp, slot));
#endif // V8_ENABLE_WEBASSEMBLY
slot += kStackSavedSavedFPSize;
if (stack_slot_size == kDoubleSize) {
Movsd(reg, Operand(rsp, slot));
} else {
DCHECK_EQ(stack_slot_size, 2 * kDoubleSize);
Movdqu(reg, Operand(rsp, slot));
}
slot += stack_slot_size;
}
DCHECK_EQ(slot, kStackSavedSavedFPSize * registers.Count());
DCHECK_EQ(slot, stack_slot_size * registers.Count());
addq(rsp, Immediate(slot));
return slot;
}
......
......@@ -548,8 +548,10 @@ class V8_EXPORT_PRIVATE TurboAssembler
int PushAll(RegList registers);
int PopAll(RegList registers);
int PushAll(DoubleRegList registers);
int PopAll(DoubleRegList registers);
int PushAll(DoubleRegList registers,
int stack_slot_size = kStackSavedSavedFPSize);
int PopAll(DoubleRegList registers,
int stack_slot_size = kStackSavedSavedFPSize);
// Compute the start of the generated instruction stream from the current PC.
// This is an alternative to embedding the {CodeObject} handle as a reference.
......
......@@ -121,11 +121,11 @@ class SaveRegisterStateForCall {
RegisterSnapshot snapshot)
: code_gen_state(code_gen_state), snapshot_(snapshot) {
__ PushAll(snapshot_.live_registers);
__ PushAll(snapshot_.live_double_registers);
__ PushAll(snapshot_.live_double_registers, kDoubleSize);
}
~SaveRegisterStateForCall() {
__ PopAll(snapshot_.live_double_registers);
__ PopAll(snapshot_.live_double_registers, kDoubleSize);
__ PopAll(snapshot_.live_registers);
}
......
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