Index: runtime/vm/code_generator.cc |
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc |
index 951efa9de16c6565db91d2df04464bbed7067b4a..2e658207d086b7f751cde975e66d656f02aa32e9 100644 |
--- a/runtime/vm/code_generator.cc |
+++ b/runtime/vm/code_generator.cc |
@@ -1397,15 +1397,23 @@ static void GetDeoptIxDescrAtPc(const Code& code, |
// Copy saved registers into the isolate buffer. |
-static void CopySavedRegisters(intptr_t* saved_registers_address) { |
- intptr_t* registers_copy = new intptr_t[kNumberOfCpuRegisters]; |
- ASSERT(registers_copy != NULL); |
- ASSERT(saved_registers_address != NULL); |
+static void CopySavedRegisters(uword saved_registers_address) { |
+ double* xmm_registers_copy = new double[kNumberOfXmmRegisters]; |
+ ASSERT(xmm_registers_copy != NULL); |
+ for (intptr_t i = 0; i < kNumberOfXmmRegisters; i++) { |
+ xmm_registers_copy[i] = *reinterpret_cast<double*>(saved_registers_address); |
+ saved_registers_address += kDoubleSize; |
+ } |
+ Isolate::Current()->set_deopt_xmm_registers_copy(xmm_registers_copy); |
+ |
+ intptr_t* cpu_registers_copy = new intptr_t[kNumberOfCpuRegisters]; |
+ ASSERT(cpu_registers_copy != NULL); |
for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) { |
- registers_copy[i] = *saved_registers_address; |
- saved_registers_address++; |
+ cpu_registers_copy[i] = |
+ *reinterpret_cast<intptr_t*>(saved_registers_address); |
+ saved_registers_address += kWordSize; |
} |
- Isolate::Current()->set_deopt_registers_copy(registers_copy); |
+ Isolate::Current()->set_deopt_cpu_registers_copy(cpu_registers_copy); |
} |
@@ -1439,14 +1447,14 @@ static void CopyFrame(const Code& optimized_code, const StackFrame& frame) { |
// Copies saved registers and caller's frame into temporary buffers. |
// Returns the stack size of unoptimzied frame. |
DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame, |
- intptr_t* saved_registers_address) { |
+ uword saved_registers_address) { |
Isolate* isolate = Isolate::Current(); |
Zone zone(isolate); |
HANDLESCOPE(isolate); |
// All registers have been saved below last-fp. |
- const uword last_fp = |
- reinterpret_cast<uword>(saved_registers_address + kNumberOfCpuRegisters); |
+ const uword last_fp = saved_registers_address + |
+ kNumberOfCpuRegisters * kWordSize + kNumberOfXmmRegisters * kDoubleSize; |
CopySavedRegisters(saved_registers_address); |
// Get optimized code and frame that need to be deoptimized. |
@@ -1557,7 +1565,8 @@ DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp) { |
ASSERT(!unoptimized_code.IsNull() && !unoptimized_code.is_optimized()); |
intptr_t* frame_copy = isolate->deopt_frame_copy(); |
- intptr_t* registers_copy = isolate->deopt_registers_copy(); |
+ intptr_t* cpu_registers_copy = isolate->deopt_cpu_registers_copy(); |
+ double* xmm_registers_copy = isolate->deopt_xmm_registers_copy(); |
intptr_t deopt_id, deopt_reason, deopt_index; |
GetDeoptIxDescrAtPc(optimized_code, caller_frame->pc(), |
@@ -1598,9 +1607,11 @@ DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp) { |
} |
isolate->SetDeoptFrameCopy(NULL, 0); |
- isolate->set_deopt_registers_copy(NULL); |
+ isolate->set_deopt_cpu_registers_copy(NULL); |
+ isolate->set_deopt_xmm_registers_copy(NULL); |
delete[] frame_copy; |
- delete[] registers_copy; |
+ delete[] cpu_registers_copy; |
+ delete[] xmm_registers_copy; |
// Clear invocation counter so that the function gets optimized after |
// classes have been collected. |
@@ -1613,4 +1624,26 @@ DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp) { |
} |
END_LEAF_RUNTIME_ENTRY |
+ |
+DEFINE_RUNTIME_ENTRY(DeoptimizeMaterializeDoubles, 0) { |
+ DeferredDouble* deferred_double = Isolate::Current()->DetachDeferredDoubles(); |
+ |
+ while (deferred_double != NULL) { |
+ DeferredDouble* current = deferred_double; |
+ deferred_double = deferred_double->next(); |
+ |
+ RawDouble** slot = current->slot(); |
+ *slot = Double::New(current->value()); |
+ |
+ if (FLAG_trace_deopt) { |
+ OS::Print("materialing double at 0x%" PRIxPTR ": %g\n", |
+ current->slot(), |
+ current->value()); |
+ } |
+ |
+ delete current; |
+ } |
+} |
+ |
+ |
} // namespace dart |