Commit 4d2b9e8e authored by Lu Yahan's avatar Lu Yahan Committed by V8 LUCI CQ

[riscv64] Save kCallerSaveFpu Register in LeaveExitFrame and EnterExitFrame.

Change-Id: I0ecd8450fce35925dc00f5db65a1132deb813b59
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3483696Reviewed-by: 's avatarji qiu <qiuji@iscas.ac.cn>
Commit-Queue: ji qiu <qiuji@iscas.ac.cn>
Cr-Commit-Position: refs/heads/main@{#79299}
parent 0e8e8a56
...@@ -4444,12 +4444,15 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space, ...@@ -4444,12 +4444,15 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space,
const int frame_alignment = MacroAssembler::ActivationFrameAlignment(); const int frame_alignment = MacroAssembler::ActivationFrameAlignment();
if (save_doubles) { if (save_doubles) {
// The stack is already aligned to 0 modulo 8 for stores with sdc1. // The stack is already aligned to 0 modulo 8 for stores with sdc1.
int kNumOfSavedRegisters = FPURegister::kNumRegisters; int space = kNumCallerSavedFPU * kDoubleSize;
int space = kNumOfSavedRegisters * kDoubleSize;
Sub64(sp, sp, Operand(space)); Sub64(sp, sp, Operand(space));
for (int i = 0; i < kNumOfSavedRegisters; i++) { int count = 0;
FPURegister reg = FPURegister::from_code(i); for (int i = 0; i < kNumFPURegisters; i++) {
StoreDouble(reg, MemOperand(sp, i * kDoubleSize)); if (kCallerSavedFPU & (1 << i)) {
FPURegister reg = FPURegister::from_code(i);
StoreDouble(reg, MemOperand(sp, count * kDoubleSize));
count++;
}
} }
} }
...@@ -4480,14 +4483,17 @@ void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count, ...@@ -4480,14 +4483,17 @@ void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count,
BlockTrampolinePoolScope block_trampoline_pool(this); BlockTrampolinePoolScope block_trampoline_pool(this);
// Optionally restore all double registers. // Optionally restore all double registers.
if (save_doubles) { if (save_doubles) {
// Remember: we only need to restore every 2nd double FPU value. // Remember: we only need to restore kCallerSavedFPU.
int kNumOfSavedRegisters = FPURegister::kNumRegisters / 2;
Sub64(scratch, fp, Sub64(scratch, fp,
Operand(ExitFrameConstants::kFixedFrameSizeFromFp + Operand(ExitFrameConstants::kFixedFrameSizeFromFp +
kNumOfSavedRegisters * kDoubleSize)); kNumCallerSavedFPU * kDoubleSize));
for (int i = 0; i < kNumOfSavedRegisters; i++) { int cout = 0;
FPURegister reg = FPURegister::from_code(2 * i); for (int i = 0; i < kNumFPURegisters; i++) {
LoadDouble(reg, MemOperand(scratch, i * kDoubleSize)); if (kCalleeSavedFPU & (1 << i)) {
FPURegister reg = FPURegister::from_code(i);
LoadDouble(reg, MemOperand(scratch, cout * kDoubleSize));
cout++;
}
} }
} }
......
...@@ -1107,7 +1107,7 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { ...@@ -1107,7 +1107,7 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
// Enter exit frame. // Enter exit frame.
// argc - argument count to be dropped by LeaveExitFrame. // argc - argument count to be dropped by LeaveExitFrame.
// save_doubles - saves FPU registers on stack, currently disabled. // save_doubles - saves FPU registers on stack.
// stack_space - extra stack space. // stack_space - extra stack space.
void EnterExitFrame(bool save_doubles, int stack_space = 0, void EnterExitFrame(bool save_doubles, int stack_space = 0,
StackFrame::Type frame_type = StackFrame::EXIT); StackFrame::Type frame_type = StackFrame::EXIT);
......
...@@ -121,7 +121,7 @@ const RegList kCalleeSavedFPU = 1 << 8 | // fs0 ...@@ -121,7 +121,7 @@ const RegList kCalleeSavedFPU = 1 << 8 | // fs0
1 << 26 | // fs10 1 << 26 | // fs10
1 << 27; // fs11 1 << 27; // fs11
const int kNumCalleeSavedFPU = 12; const int kNumCalleeSavedFPU = NumRegs(kCalleeSavedFPU);
const RegList kCallerSavedFPU = 1 << 0 | // ft0 const RegList kCallerSavedFPU = 1 << 0 | // ft0
1 << 1 | // ft1 1 << 1 | // ft1
...@@ -144,6 +144,8 @@ const RegList kCallerSavedFPU = 1 << 0 | // ft0 ...@@ -144,6 +144,8 @@ const RegList kCallerSavedFPU = 1 << 0 | // ft0
1 << 30 | // ft10 1 << 30 | // ft10
1 << 31; // ft11 1 << 31; // ft11
const int kNumCallerSavedFPU = NumRegs(kCallerSavedFPU);
// Number of registers for which space is reserved in safepoints. Must be a // Number of registers for which space is reserved in safepoints. Must be a
// multiple of 8. // multiple of 8.
const int kNumSafepointRegisters = 32; const int kNumSafepointRegisters = 32;
......
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