Index: runtime/vm/locations.h |
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h |
index 27e4ee783d07467171059648a2aa09e9f66b0328..ff6a4f070b585ea1ef5d4b92f710b5422886aca2 100644 |
--- a/runtime/vm/locations.h |
+++ b/runtime/vm/locations.h |
@@ -36,7 +36,9 @@ class Location : public ValueObject { |
kUnallocated = 2, |
// Register location represents a fixed register. |
- kRegister = 3 |
+ kRegister = 3, |
+ |
+ kSpillSlot = 4 |
}; |
static const uword kInvalidLocation = 0; |
@@ -69,6 +71,8 @@ class Location : public ValueObject { |
// Unallocated locations. |
enum Policy { |
+ kAny, |
+ kPrefersRegister, |
kRequiresRegister, |
kSameAsFirstInput, |
}; |
@@ -77,11 +81,23 @@ class Location : public ValueObject { |
return kind() == kUnallocated; |
} |
+ bool IsRegisterBeneficial() { |
+ return !Equals(Any()); |
+ } |
+ |
static Location UnallocatedLocation(Policy policy) { |
return Location(kUnallocated, PolicyField::encode(policy)); |
} |
// Any free register is suitable to replace this unallocated location. |
+ static Location Any() { |
+ return UnallocatedLocation(kAny); |
+ } |
+ |
+ static Location PrefersRegister() { |
+ return UnallocatedLocation(kPrefersRegister); |
+ } |
+ |
static Location RequiresRegister() { |
return UnallocatedLocation(kRequiresRegister); |
} |
@@ -116,7 +132,22 @@ class Location : public ValueObject { |
return static_cast<Register>(payload()); |
} |
+ // Spill slots. |
+ static Location SpillSlot(intptr_t spill_index) { |
+ return Location(kSpillSlot, static_cast<uword>(spill_index)); |
+ } |
+ |
+ bool IsSpillSlot() const { |
+ return kind() == kSpillSlot; |
+ } |
+ |
+ intptr_t spill_index() const { |
+ ASSERT(IsSpillSlot()); |
+ return static_cast<uword>(payload()); |
+ } |
+ |
const char* Name() const; |
+ void PrintTo(BufferFormatter* f) const; |
// Compare two non-constant locations. |
bool Equals(Location other) const { |
@@ -140,11 +171,11 @@ class Location : public ValueObject { |
return KindField::decode(value_); |
} |
- typedef BitField<Kind, 0, 2> KindField; |
- typedef BitField<uword, 2, kWordSize * kBitsPerByte - 2> PayloadField; |
+ typedef BitField<Kind, 0, 3> KindField; |
+ typedef BitField<uword, 3, kWordSize * kBitsPerByte - 2> PayloadField; |
// Layout for kUnallocated locations payload. |
- typedef BitField<Policy, 0, 1> PolicyField; |
+ typedef BitField<Policy, 0, 2> PolicyField; |
// Location either contains kind and payload fields or a tagged handle for |
// a constant locations. Values of enumeration Kind are selected in such a |