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

Unified Diff: runtime/vm/locations.h

Issue 13801014: Fix bug in ParallelMoveResolver::EmitSwap: implement swaps of FPU spill slots. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: fix typo Created 7 years, 8 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 031a290f0b7fca1e6eaf717ae867d192fbf7a834..d74b91c048402e703193ea2841a41ae9e14d04d7 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -35,7 +35,12 @@ enum Representation {
// low 3 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
+// Object handle.
+//
+// Locations must satisfy the following invariant: if two locations' encodings
+// are bitwise unequal then these two locations are guaranteed to be disjoint.
+// Properties like representation belong to the value that is stored in
+// the location not to the location itself.
class Location : public ValueObject {
private:
enum {
@@ -54,6 +59,9 @@ class Location : public ValueObject {
// 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.
+ // Note that two locations with different kinds should never point to
+ // the same place. For example kQuadStackSlot location should never intersect
+ // with kDoubleStackSlot location.
enum Kind {
// This location is invalid. Payload must be zero.
kInvalid = 0,
@@ -67,12 +75,11 @@ class Location : public ValueObject {
// contains register allocation policy.
kUnallocated = 2,
- // Spill slot allocated by the register allocator. Payload contains
+ // Spill slots allocated by the register allocator. Payload contains
// a spill index.
- kStackSlot = 3,
- kDoubleStackSlot = 4,
- kFloat32x4StackSlot = 8,
- kUint32x4StackSlot = 10,
+ kStackSlot = 3, // Word size slot.
+ kDoubleStackSlot = 4, // 64bit stack slot.
+ kQuadStackSlot = 8, // 128bit stack slot.
// Register location represents a fixed register. Payload contains
// register code.
@@ -175,11 +182,8 @@ class Location : public ValueObject {
}
// Register locations.
- static Location RegisterLocation(Register reg, Representation rep = kTagged) {
- uword payload =
- RegisterField::encode(reg) |
- RepresentationField::encode(rep);
- return Location(kRegister, payload);
+ static Location RegisterLocation(Register reg) {
+ return Location(kRegister, reg);
}
bool IsRegister() const {
@@ -188,19 +192,12 @@ class Location : public ValueObject {
Register reg() const {
ASSERT(IsRegister());
- return RegisterField::decode(payload());
- }
-
-
- Representation representation() const {
- return RepresentationField::decode(payload());
+ return static_cast<Register>(payload());
}
// FpuRegister locations.
- static Location FpuRegisterLocation(FpuRegister reg, Representation rep) {
- uword payload =
- FpuRegisterField::encode(reg) | RepresentationField::encode(rep);
- return Location(kFpuRegister, payload);
+ static Location FpuRegisterLocation(FpuRegister reg) {
+ return Location(kFpuRegister, reg);
}
bool IsFpuRegister() const {
@@ -209,7 +206,7 @@ class Location : public ValueObject {
FpuRegister fpu_reg() const {
ASSERT(IsFpuRegister());
- return FpuRegisterField::decode(payload());
+ return static_cast<FpuRegister>(payload());
}
static bool IsMachineRegisterKind(Kind kind) {
@@ -217,13 +214,12 @@ class Location : public ValueObject {
}
static Location MachineRegisterLocation(Kind kind,
- intptr_t reg,
- Representation rep) {
+ intptr_t reg) {
if (kind == kRegister) {
return RegisterLocation(static_cast<Register>(reg));
} else {
ASSERT(kind == kFpuRegister);
- return FpuRegisterLocation(static_cast<FpuRegister>(reg), rep);
+ return FpuRegisterLocation(static_cast<FpuRegister>(reg));
}
}
@@ -233,22 +229,18 @@ class Location : public ValueObject {
intptr_t register_code() const {
ASSERT(IsMachineRegister());
- return static_cast<intptr_t>(RegisterField::decode(payload()));
+ return static_cast<intptr_t>(payload());
}
- static uword make_stack_index_payload(intptr_t stack_index,
- Representation rep) {
+ static uword EncodeStackIndex(intptr_t stack_index) {
ASSERT((-kStackIndexBias <= stack_index) &&
- (stack_index < kStackIndexBias));
- uword payload =
- IndexField::encode(static_cast<uword>(kStackIndexBias + stack_index));
- return payload | RepresentationField::encode(rep);
+ (stack_index < kStackIndexBias));
+ return static_cast<uword>(kStackIndexBias + stack_index);
}
// Spill slots.
- static Location StackSlot(intptr_t stack_index,
- Representation rep = kTagged) {
- uword payload = make_stack_index_payload(stack_index, rep);
+ static Location StackSlot(intptr_t stack_index) {
+ uword payload = EncodeStackIndex(stack_index);
Location loc(kStackSlot, payload);
// Ensure that sign is preserved.
ASSERT(loc.stack_index() == stack_index);
@@ -259,8 +251,8 @@ class Location : public ValueObject {
return kind() == kStackSlot;
}
- static Location DoubleStackSlot(intptr_t stack_index, Representation rep) {
- uword payload = make_stack_index_payload(stack_index, rep);
+ static Location DoubleStackSlot(intptr_t stack_index) {
+ uword payload = EncodeStackIndex(stack_index);
Location loc(kDoubleStackSlot, payload);
// Ensure that sign is preserved.
ASSERT(loc.stack_index() == stack_index);
@@ -271,36 +263,22 @@ class Location : public ValueObject {
return kind() == kDoubleStackSlot;
}
- static Location Float32x4StackSlot(intptr_t stack_index) {
- uword payload = make_stack_index_payload(stack_index, kUnboxedFloat32x4);
- Location loc(kFloat32x4StackSlot, payload);
- // Ensure that sign is preserved.
- ASSERT(loc.stack_index() == stack_index);
- return loc;
- }
-
- bool IsFloat32x4StackSlot() const {
- return kind() == kFloat32x4StackSlot;
- }
-
- static Location Uint32x4StackSlot(intptr_t stack_index) {
- uword payload = make_stack_index_payload(stack_index, kUnboxedUint32x4);
- Location loc(kUint32x4StackSlot, payload);
+ static Location QuadStackSlot(intptr_t stack_index) {
+ uword payload = EncodeStackIndex(stack_index);
+ Location loc(kQuadStackSlot, payload);
// Ensure that sign is preserved.
ASSERT(loc.stack_index() == stack_index);
return loc;
}
- bool IsUint32x4StackSlot() const {
- return kind() == kUint32x4StackSlot;
+ bool IsQuadStackSlot() const {
+ return kind() == kQuadStackSlot;
}
-
intptr_t stack_index() const {
- ASSERT(IsStackSlot() || IsDoubleStackSlot() || IsFloat32x4StackSlot() ||
- IsUint32x4StackSlot());
+ ASSERT(IsStackSlot() || IsDoubleStackSlot() || IsQuadStackSlot());
// Decode stack index manually to preserve sign.
- return IndexField::decode(payload()) - kStackIndexBias;
+ return payload() - kStackIndexBias;
}
// Return a memory operand for stack slot locations.
@@ -344,30 +322,9 @@ class Location : public ValueObject {
// Layout for kUnallocated locations payload.
typedef BitField<Policy, 0, 3> PolicyField;
- // Layout for register locations payload.
- static const intptr_t kBitsForRepresentation = 3;
- COMPILE_ASSERT(kNumRepresentations <= (1 << kBitsForRepresentation),
- invalid_enum);
- static const intptr_t kBitsForRegister =
- kBitsForPayload - kBitsForRepresentation;
- typedef BitField<Representation,
- 0,
- kBitsForRepresentation> RepresentationField;
- typedef BitField<Register,
- kBitsForRepresentation,
- kBitsForRegister> RegisterField;
- typedef BitField<FpuRegister,
- kBitsForRepresentation,
- kBitsForRegister> FpuRegisterField;
-
// Layout for stack slots.
- static const intptr_t kBitsForIndex =
- kBitsForPayload - kBitsForRepresentation;
- typedef BitField<uword,
- kBitsForRepresentation,
- kBitsForIndex> IndexField;
static const intptr_t kStackIndexBias =
- static_cast<intptr_t>(1) << (kBitsForIndex - 1);
+ static_cast<intptr_t>(1) << (kBitsForPayload - 1);
// Location either contains kind and payload fields or a tagged handle for
// a constant locations. Values of enumeration Kind are selected in such a

Powered by Google App Engine
This is Rietveld 408576698