Index: dart/runtime/vm/locations.cc |
=================================================================== |
--- dart/runtime/vm/locations.cc (revision 44047) |
+++ dart/runtime/vm/locations.cc (working copy) |
@@ -244,6 +244,59 @@ |
} |
+Location Location::RemapForSlowPath(Definition* def, |
+ intptr_t* cpu_reg_slots, |
+ intptr_t* fpu_reg_slots) const { |
+ if (IsRegister()) { |
+ intptr_t index = cpu_reg_slots[reg()]; |
+ ASSERT(index >= 0); |
+ return Location::StackSlot(index); |
+ } else if (IsFpuRegister()) { |
+ intptr_t index = fpu_reg_slots[fpu_reg()]; |
+ ASSERT(index >= 0); |
+ switch (def->representation()) { |
+ case kUnboxedDouble: |
+ return Location::DoubleStackSlot(index); |
+ |
+ case kUnboxedFloat32x4: |
+ case kUnboxedInt32x4: |
+ case kUnboxedFloat64x2: |
+ return Location::QuadStackSlot(index); |
+ |
+ default: |
+ UNREACHABLE(); |
+ } |
+ } else if (IsPairLocation()) { |
+ ASSERT(def->representation() == kUnboxedMint); |
+ PairLocation* value_pair = 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(); |
+ } |
+ |
+ return Location::Pair(Location::StackSlot(index_lo), |
+ Location::StackSlot(index_hi)); |
+ } else if (IsInvalid() && def->IsMaterializeObject()) { |
+ def->AsMaterializeObject()->RemapRegisters(cpu_reg_slots, fpu_reg_slots); |
+ return *this; |
+ } |
+ |
+ return *this; |
+} |
+ |
+ |
void LocationSummary::PrintTo(BufferFormatter* f) const { |
if (input_count() > 0) { |
f->Print(" ("); |