| Index: runtime/vm/code_generator.cc
|
| diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
|
| index 2f92c1f73f064ffccc653ad2724c82924dab1b49..daafa59723152620853211a0b3dd23ccad6eef42 100644
|
| --- a/runtime/vm/code_generator.cc
|
| +++ b/runtime/vm/code_generator.cc
|
| @@ -1450,11 +1450,13 @@ void DeoptimizeIfOwner(const GrowableArray<intptr_t>& classes) {
|
|
|
| // Copy saved registers into the isolate buffer.
|
| static void CopySavedRegisters(uword saved_registers_address) {
|
| - double* fpu_registers_copy = new double[kNumberOfFpuRegisters];
|
| + fpu_register_t* fpu_registers_copy =
|
| + new fpu_register_t[kNumberOfFpuRegisters];
|
| ASSERT(fpu_registers_copy != NULL);
|
| for (intptr_t i = 0; i < kNumberOfFpuRegisters; i++) {
|
| - fpu_registers_copy[i] = *reinterpret_cast<double*>(saved_registers_address);
|
| - saved_registers_address += kDoubleSize;
|
| + fpu_registers_copy[i] =
|
| + *reinterpret_cast<fpu_register_t*>(saved_registers_address);
|
| + saved_registers_address += kFpuRegisterSize;
|
| }
|
| Isolate::Current()->set_deopt_fpu_registers_copy(fpu_registers_copy);
|
|
|
| @@ -1506,7 +1508,8 @@ DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
|
|
|
| // All registers have been saved below last-fp.
|
| const uword last_fp = saved_registers_address +
|
| - kNumberOfCpuRegisters * kWordSize + kNumberOfFpuRegisters * kDoubleSize;
|
| + kNumberOfCpuRegisters * kWordSize +
|
| + kNumberOfFpuRegisters * kFpuRegisterSize;
|
| CopySavedRegisters(saved_registers_address);
|
|
|
| // Get optimized code and frame that need to be deoptimized.
|
| @@ -1608,7 +1611,7 @@ DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeFillFrame, uword last_fp) {
|
|
|
| intptr_t* frame_copy = isolate->deopt_frame_copy();
|
| intptr_t* cpu_registers_copy = isolate->deopt_cpu_registers_copy();
|
| - double* fpu_registers_copy = isolate->deopt_fpu_registers_copy();
|
| + fpu_register_t* fpu_registers_copy = isolate->deopt_fpu_registers_copy();
|
|
|
| intptr_t deopt_reason = kDeoptUnknown;
|
| const DeoptInfo& deopt_info = DeoptInfo::Handle(
|
| @@ -1634,42 +1637,17 @@ END_LEAF_RUNTIME_ENTRY
|
|
|
| // This is the last step in the deoptimization, GC can occur.
|
| DEFINE_RUNTIME_ENTRY(DeoptimizeMaterializeDoubles, 0) {
|
| - DeferredDouble* deferred_double = Isolate::Current()->DetachDeferredDoubles();
|
| + DeferredObject* deferred_object = Isolate::Current()->DetachDeferredObjects();
|
|
|
| - while (deferred_double != NULL) {
|
| - DeferredDouble* current = deferred_double;
|
| - deferred_double = deferred_double->next();
|
| + while (deferred_object != NULL) {
|
| + DeferredObject* current = deferred_object;
|
| + deferred_object = deferred_object->next();
|
|
|
| - RawDouble** slot = current->slot();
|
| - *slot = Double::New(current->value());
|
| -
|
| - if (FLAG_trace_deoptimization_verbose) {
|
| - OS::PrintErr("materializing double at %"Px": %g\n",
|
| - reinterpret_cast<uword>(current->slot()),
|
| - current->value());
|
| - }
|
| + current->Materialize();
|
|
|
| delete current;
|
| }
|
|
|
| - DeferredMint* deferred_mint = Isolate::Current()->DetachDeferredMints();
|
| -
|
| - while (deferred_mint != NULL) {
|
| - DeferredMint* current = deferred_mint;
|
| - deferred_mint = deferred_mint->next();
|
| -
|
| - RawMint** slot = current->slot();
|
| - ASSERT(!Smi::IsValid64(current->value()));
|
| - *slot = Mint::New(current->value());
|
| -
|
| - if (FLAG_trace_deoptimization_verbose) {
|
| - OS::PrintErr("materializing mint at %"Px": %"Pd64"\n",
|
| - reinterpret_cast<uword>(current->slot()),
|
| - current->value());
|
| - }
|
| -
|
| - delete current;
|
| - }
|
| // Since this is the only step where GC can occur during deoptimization,
|
| // use it to report the source line where deoptimization occured.
|
| if (FLAG_trace_deoptimization) {
|
|
|