Index: runtime/vm/flow_graph_compiler.cc |
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc |
index 3c2d60b2d92b88b9d249208bd1a9b4614117880d..9a06e5017453efd6a1a1953da47cbfdc441c3972 100644 |
--- a/runtime/vm/flow_graph_compiler.cc |
+++ b/runtime/vm/flow_graph_compiler.cc |
@@ -688,57 +688,11 @@ Environment* FlowGraphCompiler::SlowPathEnvironmentFor( |
// corresponding spill slot locations. |
for (Environment::DeepIterator it(env); !it.Done(); it.Advance()) { |
Location loc = it.CurrentLocation(); |
- if (loc.IsRegister()) { |
- intptr_t index = cpu_reg_slots[loc.reg()]; |
- ASSERT(index >= 0); |
- it.SetCurrentLocation(Location::StackSlot(index)); |
- } else if (loc.IsFpuRegister()) { |
- intptr_t index = fpu_reg_slots[loc.fpu_reg()]; |
- ASSERT(index >= 0); |
- Value* value = it.CurrentValue(); |
- switch (value->definition()->representation()) { |
- case kUnboxedDouble: |
- it.SetCurrentLocation(Location::DoubleStackSlot(index)); |
- break; |
- case kUnboxedFloat32x4: |
- case kUnboxedInt32x4: |
- case kUnboxedFloat64x2: |
- it.SetCurrentLocation(Location::QuadStackSlot(index)); |
- break; |
- default: |
- UNREACHABLE(); |
- } |
- } else if (loc.IsPairLocation()) { |
- intptr_t representation = |
- it.CurrentValue()->definition()->representation(); |
- ASSERT(representation == kUnboxedMint); |
- PairLocation* value_pair = loc.AsPairLocation(); |
- intptr_t index_lo; |
- intptr_t index_hi; |
- if (value_pair->At(0).IsRegister()) { |
- index_lo = cpu_reg_slots[value_pair->At(0).reg()]; |
- } else { |
- ASSERT(value_pair->At(0).IsStackSlot()); |
- index_lo = value_pair->At(0).stack_index(); |
- } |
- if (value_pair->At(1).IsRegister()) { |
- index_hi = cpu_reg_slots[value_pair->At(1).reg()]; |
- } else { |
- ASSERT(value_pair->At(1).IsStackSlot()); |
- index_hi = value_pair->At(1).stack_index(); |
- } |
- it.SetCurrentLocation(Location::Pair(Location::StackSlot(index_lo), |
- Location::StackSlot(index_hi))); |
- } else if (loc.IsInvalid()) { |
- Definition* def = |
- it.CurrentValue()->definition(); |
- ASSERT(def != NULL); |
- if (def->IsMaterializeObject()) { |
- def->AsMaterializeObject()->RemapRegisters(fpu_reg_slots, |
- cpu_reg_slots); |
- } |
- } |
+ Value* value = it.CurrentValue(); |
+ it.SetCurrentLocation(loc.RemapForSlowPath( |
+ value->definition(), cpu_reg_slots, fpu_reg_slots)); |
} |
+ |
return env; |
} |