Index: runtime/vm/stub_code_ia32.cc |
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc |
index 222d63b2fb157a2973f5abdeb3fb547b61f70569..75138cab0bd6c94345fbd33bb31d598fad6afb26 100644 |
--- a/runtime/vm/stub_code_ia32.cc |
+++ b/runtime/vm/stub_code_ia32.cc |
@@ -477,7 +477,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); |
@@ -507,6 +507,14 @@ void StubCode::GenerateDeoptimizeStub(Assembler* assembler) { |
for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; i--) { |
__ pushl(static_cast<Register>(i)); |
} |
+ __ subl(ESP, 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(ESP, offset), xmm_reg); |
+ offset += kDoubleSize; |
+ } |
+ |
__ movl(ECX, ESP); // Saved saved registers block. |
__ ReserveAlignedFrameSpace(1 * kWordSize); |
__ SmiUntag(EAX); |
@@ -525,6 +533,10 @@ void StubCode::GenerateDeoptimizeStub(Assembler* assembler) { |
__ movl(Address(ESP, 0), ECX); |
__ CallRuntime(kDeoptimizeFillFrameRuntimeEntry); |
__ LeaveFrame(); |
+ |
+ __ EnterFrame(0); |
srdjan
2012/08/30 17:59:24
Add comment somewhere that GC can occur only at ca
Vyacheslav Egorov (Google)
2012/09/21 12:51:52
Done.
|
+ __ CallRuntime(kDeoptimizeMaterializeDoublesRuntimeEntry); |
+ __ LeaveFrame(); |
__ ret(); |
} |