| Index: src/mips/deoptimizer-mips.cc
|
| diff --git a/src/mips/deoptimizer-mips.cc b/src/mips/deoptimizer-mips.cc
|
| index 40490018c7f345db1abe09873b7266b53251c229..c96eb67724b01b35be30198a9497e14ff89c4d1c 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_[FloatRegister::kNumAllocatableRegisters]
|
| + 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)));
|
|
|
|
|