Index: runtime/vm/stub_code_x64.cc |
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc |
index 2b2029197aafec7bdf44adefb71c11030eab8da4..98779359078a83f48c0b9a77f7a1c65ca2428eb7 100644 |
--- a/runtime/vm/stub_code_x64.cc |
+++ b/runtime/vm/stub_code_x64.cc |
@@ -470,7 +470,7 @@ void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) { |
DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame, |
intptr_t deopt_reason, |
- intptr_t* saved_registers_address); |
+ uword saved_registers_address); |
DECLARE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp); |
@@ -500,6 +500,14 @@ void StubCode::GenerateDeoptimizeStub(Assembler* assembler) { |
for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; i--) { |
__ pushq(static_cast<Register>(i)); |
} |
+ __ subq(RSP, Immediate(kNumberOfXmmRegisters * kDoubleSize)); |
+ intptr_t offset = 0; |
+ for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) { |
+ XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx); |
+ __ movsd(Address(RSP, offset), xmm_reg); |
+ offset += kDoubleSize; |
+ } |
+ |
__ movq(RCX, RSP); // Saved saved registers block. |
__ ReserveAlignedFrameSpace(0); |
__ SmiUntag(RAX); |
@@ -519,6 +527,11 @@ void StubCode::GenerateDeoptimizeStub(Assembler* assembler) { |
__ movq(RDI, RCX); // Set up argument 1 last_fp. |
__ CallRuntime(kDeoptimizeFillFrameRuntimeEntry); |
__ LeaveFrame(); |
+ |
+ __ EnterFrame(0); |
+ __ CallRuntime(kDeoptimizeMaterializeDoublesRuntimeEntry); |
+ __ LeaveFrame(); |
+ |
__ ret(); |
} |