Chromium Code Reviews| Index: src/mips/deoptimizer-mips.cc |
| diff --git a/src/mips/deoptimizer-mips.cc b/src/mips/deoptimizer-mips.cc |
| index 40490018c7f345db1abe09873b7266b53251c229..4ae13811975197192d198e818f7b0e6bf8249f00 100644 |
| --- a/src/mips/deoptimizer-mips.cc |
| +++ b/src/mips/deoptimizer-mips.cc |
| @@ -114,6 +114,7 @@ void Deoptimizer::TableEntryGenerator::Generate() { |
| RegList saved_regs = restored_regs | sp.bit() | ra.bit(); |
| const int kDoubleRegsSize = kDoubleSize * DoubleRegister::kMaxNumRegisters; |
| + const int kFloatRegsSize = kFloatSize * FloatRegister::kMaxNumRegisters; |
| // Save all FPU registers before messing with them. |
| __ Subu(sp, sp, Operand(kDoubleRegsSize)); |
| @@ -125,6 +126,14 @@ void Deoptimizer::TableEntryGenerator::Generate() { |
| __ Sdc1(fpu_reg, MemOperand(sp, offset)); |
| } |
| + __ Subu(sp, sp, Operand(kFloatRegsSize)); |
| + for (int i = 0; i < config->num_allocatable_float_registers(); ++i) { |
| + int code = config->GetAllocatableFloatCode(i); |
| + const FloatRegister fpu_reg = FloatRegister::from_code(code); |
| + int offset = code * kFloatSize; |
| + __ swc1(fpu_reg, MemOperand(sp, offset)); |
| + } |
| + |
| // Push saved_regs (needed to populate FrameDescription::registers_). |
| // Leave gaps for other registers. |
| __ Subu(sp, sp, kNumberOfRegisters * kPointerSize); |
| @@ -138,7 +147,7 @@ void Deoptimizer::TableEntryGenerator::Generate() { |
| __ sw(fp, MemOperand(a2)); |
| const int kSavedRegistersAreaSize = |
| - (kNumberOfRegisters * kPointerSize) + kDoubleRegsSize; |
| + (kNumberOfRegisters * kPointerSize) + kDoubleRegsSize + kFloatRegsSize; |
| // Get the bailout id from the stack. |
| __ lw(a2, MemOperand(sp, kSavedRegistersAreaSize)); |
| @@ -198,11 +207,23 @@ void Deoptimizer::TableEntryGenerator::Generate() { |
| for (int i = 0; i < config->num_allocatable_double_registers(); ++i) { |
| int code = config->GetAllocatableDoubleCode(i); |
| int dst_offset = code * kDoubleSize + double_regs_offset; |
| - int src_offset = code * kDoubleSize + kNumberOfRegisters * kPointerSize; |
| + int src_offset = |
| + code * kDoubleSize + kNumberOfRegisters * kPointerSize + kFloatRegsSize; |
| __ Ldc1(f0, MemOperand(sp, src_offset)); |
| __ Sdc1(f0, MemOperand(a1, dst_offset)); |
| } |
| + // Copy FPU registers to |
| + // float_registers_[FloarRegister::kNumAllocatableRegisters] |
|
Jarin
2017/03/23 12:31:32
Floar -> Float?
|
| + int float_regs_offset = FrameDescription::float_registers_offset(); |
| + 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; |
| + __ lwc1(f0, MemOperand(sp, src_offset)); |
| + __ swc1(f0, MemOperand(a1, dst_offset)); |
| + } |
| + |
| // Remove the bailout id and the saved registers from the stack. |
| __ Addu(sp, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize))); |