diff options
Diffstat (limited to 'deps/v8/src/mips/deoptimizer-mips.cc')
-rw-r--r-- | deps/v8/src/mips/deoptimizer-mips.cc | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/deps/v8/src/mips/deoptimizer-mips.cc b/deps/v8/src/mips/deoptimizer-mips.cc index 46b8728170..c96eb67724 100644 --- a/deps/v8/src/mips/deoptimizer-mips.cc +++ b/deps/v8/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)); @@ -122,7 +123,15 @@ void Deoptimizer::TableEntryGenerator::Generate() { int code = config->GetAllocatableDoubleCode(i); const DoubleRegister fpu_reg = DoubleRegister::from_code(code); int offset = code * kDoubleSize; - __ sdc1(fpu_reg, MemOperand(sp, offset)); + __ 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_). @@ -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,9 +207,21 @@ 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; - __ ldc1(f0, MemOperand(sp, src_offset)); - __ sdc1(f0, MemOperand(a1, dst_offset)); + 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. @@ -270,7 +291,7 @@ void Deoptimizer::TableEntryGenerator::Generate() { int code = config->GetAllocatableDoubleCode(i); const DoubleRegister fpu_reg = DoubleRegister::from_code(code); int src_offset = code * kDoubleSize + double_regs_offset; - __ ldc1(fpu_reg, MemOperand(a1, src_offset)); + __ Ldc1(fpu_reg, MemOperand(a1, src_offset)); } // Push state, pc, and continuation from the last output frame. |