Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(851)

Unified Diff: runtime/vm/code_generator.cc

Issue 10919008: Unbox phis that were proven to be of type Double. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address Srdjan's comments Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/code_generator.h ('k') | runtime/vm/compiler.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « runtime/vm/code_generator.h ('k') | runtime/vm/compiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698