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

Unified Diff: runtime/vm/locations.h

Issue 215363004: Support for multiple register values (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 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
Index: runtime/vm/locations.h
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 43182cd159ca42603bd9731fdc4eba70a61823cc..f70ea74603ed88737ebcdd2d4ebe2c7207468915 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -13,6 +13,7 @@ namespace dart {
class BufferFormatter;
class Value;
+class PairLocation;
enum Representation {
@@ -24,6 +25,8 @@ enum Representation {
kUnboxedFloat32x4,
kUnboxedInt32x4,
kUnboxedFloat64x2,
+ kPairOfTagged,
+ kPairOfUnboxedDouble,
kNumRepresentations
};
@@ -33,7 +36,7 @@ enum Representation {
// LocationSummary object which specifies expected location for every input
// and output.
// Each location is encoded as a single word: for non-constant locations
-// low 3 bits denote location kind, rest is kind specific location payload
+// low 4 bits denote location kind, rest is kind specific location payload
// e.g. for REGISTER kind payload is register code (value of the Register
// enumeration), constant locations contain a tagged (low 2 bits are set to 01)
// Object handle.
@@ -53,13 +56,10 @@ class Location : public ValueObject {
static const uword kInvalidLocation = 0;
static const uword kConstantMask = 0x3;
- static const intptr_t kMachineRegisterMask = 0x6;
- static const intptr_t kMachineRegister = 0x6;
-
public:
// Constant payload can overlap with kind field so Kind values
// have to be chosen in a way that their last 2 bits are never
- // the same as kConstant.
+ // the same as kConstant or kPairLocation.
Florian Schneider 2014/04/04 11:52:46 Maybe you can turn this comment into COMPILE_ASSER
Cutch 2014/04/04 16:34:46 Done.
// Note that two locations with different kinds should never point to
// the same place. For example kQuadStackSlot location should never intersect
// with kDoubleStackSlot location.
@@ -70,25 +70,28 @@ class Location : public ValueObject {
// Constant value. This location contains a tagged Object handle.
kConstant = 1,
+ // This location contains a pointer to a PairLocation.
+ kPairLocation = 2,
+
// Unallocated location represents a location that is not fixed and can be
// allocated by a register allocator. Each unallocated location has
// a policy that specifies what kind of location is suitable. Payload
// contains register allocation policy.
- kUnallocated = 2,
+ kUnallocated = 3,
// Spill slots allocated by the register allocator. Payload contains
// a spill index.
- kStackSlot = 3, // Word size slot.
- kDoubleStackSlot = 4, // 64bit stack slot.
- kQuadStackSlot = 8, // 128bit stack slot.
+ kStackSlot = 4, // Word size slot.
+ kDoubleStackSlot = 7, // 64bit stack slot.
+ kQuadStackSlot = 11, // 128bit stack slot.
// Register location represents a fixed register. Payload contains
// register code.
- kRegister = 6,
+ kRegister = 8,
// FpuRegister location represents a fixed fpu register. Payload contains
// its code.
- kFpuRegister = 7,
+ kFpuRegister = 12,
};
Location() : value_(kInvalidLocation) {
@@ -123,6 +126,15 @@ class Location : public ValueObject {
return *reinterpret_cast<const Object*>(value_ & ~kConstantMask);
}
+ bool IsPairLocation() const {
+ ASSERT((kPairLocation & kConstantMask) == kPairLocation);
Florian Schneider 2014/04/04 11:52:46 Use COMPILE_ASSERT here.
Cutch 2014/04/04 16:34:46 Done here and elsewhere.
+ return (value_ & kConstantMask) == kPairLocation;
Florian Schneider 2014/04/04 11:52:46 kConstantMask is not the right name anymore since
Cutch 2014/04/04 16:34:46 Renamed to kLocationTagMask.
+ }
+
+ static Location Pair(Location first, Location second);
+
+ PairLocation* AsPairLocation() const;
+
// Unallocated locations.
enum Policy {
kAny,
@@ -211,7 +223,7 @@ class Location : public ValueObject {
}
static bool IsMachineRegisterKind(Kind kind) {
- return (kind & kMachineRegisterMask) == kMachineRegister;
+ return (kind == kRegister) || (kind == kFpuRegister);
}
static Location MachineRegisterLocation(Kind kind,
@@ -337,6 +349,40 @@ class Location : public ValueObject {
};
+class PairLocation : public ZoneAllocated {
+ public:
+ PairLocation() {
+ for (intptr_t i = 0; i < kPairLength; i++) {
+ ASSERT(locations_[i].IsInvalid());
+ }
+ }
+
+ intptr_t length() const { return kPairLength; }
+
+ Location At(intptr_t i) const {
+ ASSERT(i >= 0);
+ ASSERT(i < kPairLength);
+ return locations_[i];
+ }
+
+ void SetAt(intptr_t i, Location loc) {
+ ASSERT(i >= 0);
+ ASSERT(i < kPairLength);
+ locations_[i] = loc;
+ }
+
+ Location* SlotAt(intptr_t i) {
+ ASSERT(i >= 0);
+ ASSERT(i < kPairLength);
+ return &locations_[i];
+ }
+
+ private:
+ static const intptr_t kPairLength = 2;
+ Location locations_[kPairLength];
+};
+
+
class RegisterSet : public ValueObject {
public:
RegisterSet() : cpu_registers_(0), fpu_registers_(0) {

Powered by Google App Engine
This is Rietveld 408576698