| Index: src/x64/deoptimizer-x64.cc
|
| diff --git a/src/x64/deoptimizer-x64.cc b/src/x64/deoptimizer-x64.cc
|
| index 1664a1570fdbba3c956c6785dbc7bd889a6ef2dd..46176b13c6b9c45aea7087dd6f3f4d8a49c6f80d 100644
|
| --- a/src/x64/deoptimizer-x64.cc
|
| +++ b/src/x64/deoptimizer-x64.cc
|
| @@ -125,6 +125,16 @@ void Deoptimizer::TableEntryGenerator::Generate() {
|
| __ Movsd(Operand(rsp, offset), xmm_reg);
|
| }
|
|
|
| + const int kFloatRegsSize = kFloatSize * XMMRegister::kMaxNumRegisters;
|
| + __ subp(rsp, Immediate(kFloatRegsSize));
|
| +
|
| + for (int i = 0; i < config->num_allocatable_float_registers(); ++i) {
|
| + int code = config->GetAllocatableFloatCode(i);
|
| + XMMRegister xmm_reg = XMMRegister::from_code(code);
|
| + int offset = code * kFloatSize;
|
| + __ Movss(Operand(rsp, offset), xmm_reg);
|
| + }
|
| +
|
| // We push all registers onto the stack, even though we do not need
|
| // to restore all later.
|
| for (int i = 0; i < kNumberOfRegisters; i++) {
|
| @@ -132,8 +142,8 @@ void Deoptimizer::TableEntryGenerator::Generate() {
|
| __ pushq(r);
|
| }
|
|
|
| - const int kSavedRegistersAreaSize = kNumberOfRegisters * kRegisterSize +
|
| - kDoubleRegsSize;
|
| + const int kSavedRegistersAreaSize =
|
| + kNumberOfRegisters * kRegisterSize + kDoubleRegsSize + kFloatRegsSize;
|
|
|
| __ Store(ExternalReference(Isolate::kCEntryFPAddress, isolate()), rbp);
|
|
|
| @@ -190,6 +200,16 @@ void Deoptimizer::TableEntryGenerator::Generate() {
|
| __ PopQuad(Operand(rbx, offset));
|
| }
|
|
|
| + // Fill in the float input registers.
|
| + int float_regs_offset = FrameDescription::float_registers_offset();
|
| + for (int i = 0; i < XMMRegister::kMaxNumRegisters; i++) {
|
| + int src_offset = i * kFloatSize;
|
| + int dst_offset = i * kFloatSize + float_regs_offset;
|
| + __ movl(rcx, Operand(rsp, src_offset));
|
| + __ movl(Operand(rbx, dst_offset), rcx);
|
| + }
|
| + __ addp(rsp, Immediate(kFloatRegsSize));
|
| +
|
| // Fill in the double input registers.
|
| int double_regs_offset = FrameDescription::double_registers_offset();
|
| for (int i = 0; i < XMMRegister::kMaxNumRegisters; i++) {
|
|
|