Commit 9ed91576 authored by Milad Farazmand's avatar Milad Farazmand Committed by Commit Bot

PPC/s390: [deoptimizer, cleanup] Don't store values of single precision fp registers

Port 556e4859

Original Commit Message:

    Instead of storing the values of the single precision floating point registers,
    get their values from the aliased double precision registers.

    This saves, on arm64, 184 bytes per deoptimisation kind function (552 in total)
    and 128 bytes in the RegisterValues class.

R=joey.gouly@arm.com, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com
BUG=
LOG=N

Change-Id: If38a721cfaefb7980902f4f963119cb88061e342
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1726857Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Commit-Queue: Milad Farazmand <miladfar@ca.ibm.com>
Cr-Commit-Position: refs/heads/master@{#63006}
parent d4e65258
...@@ -31,7 +31,6 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm, ...@@ -31,7 +31,6 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm,
RegList saved_regs = restored_regs | sp.bit(); RegList saved_regs = restored_regs | sp.bit();
const int kDoubleRegsSize = kDoubleSize * DoubleRegister::kNumRegisters; const int kDoubleRegsSize = kDoubleSize * DoubleRegister::kNumRegisters;
const int kFloatRegsSize = kFloatSize * FloatRegister::kNumRegisters;
// Save all double registers before messing with them. // Save all double registers before messing with them.
__ subi(sp, sp, Operand(kDoubleRegsSize)); __ subi(sp, sp, Operand(kDoubleRegsSize));
...@@ -42,14 +41,6 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm, ...@@ -42,14 +41,6 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm,
int offset = code * kDoubleSize; int offset = code * kDoubleSize;
__ stfd(dreg, MemOperand(sp, offset)); __ stfd(dreg, MemOperand(sp, offset));
} }
// Save all float registers before messing with them.
__ subi(sp, sp, Operand(kFloatRegsSize));
for (int i = 0; i < config->num_allocatable_float_registers(); ++i) {
int code = config->GetAllocatableFloatCode(i);
const FloatRegister freg = FloatRegister::from_code(code);
int offset = code * kFloatSize;
__ stfs(freg, MemOperand(sp, offset));
}
// Push saved_regs (needed to populate FrameDescription::registers_). // Push saved_regs (needed to populate FrameDescription::registers_).
// Leave gaps for other registers. // Leave gaps for other registers.
...@@ -67,7 +58,7 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm, ...@@ -67,7 +58,7 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm,
__ StoreP(fp, MemOperand(scratch)); __ StoreP(fp, MemOperand(scratch));
} }
const int kSavedRegistersAreaSize = const int kSavedRegistersAreaSize =
(kNumberOfRegisters * kPointerSize) + kDoubleRegsSize + kFloatRegsSize; (kNumberOfRegisters * kPointerSize) + kDoubleRegsSize;
// Get the bailout id is passed as r29 by the caller. // Get the bailout id is passed as r29 by the caller.
__ mr(r5, r29); __ mr(r5, r29);
...@@ -117,21 +108,10 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm, ...@@ -117,21 +108,10 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm,
for (int i = 0; i < config->num_allocatable_double_registers(); ++i) { for (int i = 0; i < config->num_allocatable_double_registers(); ++i) {
int code = config->GetAllocatableDoubleCode(i); int code = config->GetAllocatableDoubleCode(i);
int dst_offset = code * kDoubleSize + double_regs_offset; int dst_offset = code * kDoubleSize + double_regs_offset;
int src_offset = int src_offset = code * kDoubleSize + kNumberOfRegisters * kPointerSize;
code * kDoubleSize + kNumberOfRegisters * kPointerSize + kFloatRegsSize;
__ lfd(d0, MemOperand(sp, src_offset)); __ lfd(d0, MemOperand(sp, src_offset));
__ stfd(d0, MemOperand(r4, dst_offset)); __ stfd(d0, MemOperand(r4, dst_offset));
} }
int float_regs_offset = FrameDescription::float_registers_offset();
// Copy float registers to
// float_registers_[FloatRegister::kNumRegisters]
for (int i = 0; i < config->num_allocatable_float_registers(); ++i) {
int code = config->GetAllocatableFloatCode(i);
int dst_offset = code * kFloatSize + float_regs_offset;
int src_offset = code * kFloatSize + kNumberOfRegisters * kPointerSize;
__ lfs(d0, MemOperand(sp, src_offset));
__ stfs(d0, MemOperand(r4, dst_offset));
}
// Remove the saved registers from the stack. // Remove the saved registers from the stack.
__ addi(sp, sp, Operand(kSavedRegistersAreaSize)); __ addi(sp, sp, Operand(kSavedRegistersAreaSize));
......
...@@ -28,7 +28,6 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm, ...@@ -28,7 +28,6 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm,
RegList restored_regs = kJSCallerSaved | kCalleeSaved; RegList restored_regs = kJSCallerSaved | kCalleeSaved;
const int kDoubleRegsSize = kDoubleSize * DoubleRegister::kNumRegisters; const int kDoubleRegsSize = kDoubleSize * DoubleRegister::kNumRegisters;
const int kFloatRegsSize = kFloatSize * FloatRegister::kNumRegisters;
// Save all double registers before messing with them. // Save all double registers before messing with them.
__ lay(sp, MemOperand(sp, -kDoubleRegsSize)); __ lay(sp, MemOperand(sp, -kDoubleRegsSize));
...@@ -39,14 +38,6 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm, ...@@ -39,14 +38,6 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm,
int offset = code * kDoubleSize; int offset = code * kDoubleSize;
__ StoreDouble(dreg, MemOperand(sp, offset)); __ StoreDouble(dreg, MemOperand(sp, offset));
} }
// Save all float registers before messing with them.
__ lay(sp, MemOperand(sp, -kFloatRegsSize));
for (int i = 0; i < config->num_allocatable_float_registers(); ++i) {
int code = config->GetAllocatableFloatCode(i);
const FloatRegister dreg = FloatRegister::from_code(code);
int offset = code * kFloatSize;
__ StoreFloat32(dreg, MemOperand(sp, offset));
}
// Push all GPRs onto the stack // Push all GPRs onto the stack
__ lay(sp, MemOperand(sp, -kNumberOfRegisters * kPointerSize)); __ lay(sp, MemOperand(sp, -kNumberOfRegisters * kPointerSize));
...@@ -57,7 +48,7 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm, ...@@ -57,7 +48,7 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm,
__ StoreP(fp, MemOperand(r1)); __ StoreP(fp, MemOperand(r1));
const int kSavedRegistersAreaSize = const int kSavedRegistersAreaSize =
(kNumberOfRegisters * kPointerSize) + kDoubleRegsSize + kFloatRegsSize; (kNumberOfRegisters * kPointerSize) + kDoubleRegsSize;
// The bailout id is passed using r10 // The bailout id is passed using r10
__ LoadRR(r4, r10); __ LoadRR(r4, r10);
...@@ -119,25 +110,12 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm, ...@@ -119,25 +110,12 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm,
for (int i = 0; i < config->num_allocatable_double_registers(); ++i) { for (int i = 0; i < config->num_allocatable_double_registers(); ++i) {
int code = config->GetAllocatableDoubleCode(i); int code = config->GetAllocatableDoubleCode(i);
int dst_offset = code * kDoubleSize + double_regs_offset; int dst_offset = code * kDoubleSize + double_regs_offset;
int src_offset = int src_offset = code * kDoubleSize + kNumberOfRegisters * kPointerSize;
code * kDoubleSize + kNumberOfRegisters * kPointerSize + kFloatRegsSize;
// TODO(joransiu): MVC opportunity // TODO(joransiu): MVC opportunity
__ LoadDouble(d0, MemOperand(sp, src_offset)); __ LoadDouble(d0, MemOperand(sp, src_offset));
__ StoreDouble(d0, MemOperand(r3, dst_offset)); __ StoreDouble(d0, MemOperand(r3, dst_offset));
} }
int float_regs_offset = FrameDescription::float_registers_offset();
// Copy float registers to
// float_registers_[FloatRegister::kNumRegisters]
for (int i = 0; i < config->num_allocatable_float_registers(); ++i) {
int code = config->GetAllocatableFloatCode(i);
int dst_offset = code * kFloatSize + float_regs_offset;
int src_offset = code * kFloatSize + kNumberOfRegisters * kPointerSize;
// TODO(joransiu): MVC opportunity
__ LoadFloat32(d0, MemOperand(sp, src_offset));
__ StoreFloat32(d0, MemOperand(r3, dst_offset));
}
// Remove the saved registers from the stack. // Remove the saved registers from the stack.
__ la(sp, MemOperand(sp, kSavedRegistersAreaSize)); __ la(sp, MemOperand(sp, kSavedRegistersAreaSize));
......
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