| Index: runtime/vm/locations.h
|
| diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
|
| index 90e87804b8757553145ffde89419a9f41ee6085b..24d9fd93ce000be9b7853c51351a1a3781cb2021 100644
|
| --- a/runtime/vm/locations.h
|
| +++ b/runtime/vm/locations.h
|
| @@ -21,6 +21,8 @@ enum Representation {
|
| kUntagged,
|
| kUnboxedDouble,
|
| kUnboxedMint,
|
| + kUnboxedFloat32x4,
|
| + kUnboxedUint32x4,
|
| kNumRepresentations
|
| };
|
|
|
| @@ -38,7 +40,7 @@ class Location : public ValueObject {
|
| private:
|
| enum {
|
| // Number of bits required to encode Kind value.
|
| - kBitsForKind = 3,
|
| + kBitsForKind = 4,
|
| kBitsForPayload = kWordSize * kBitsPerByte - kBitsForKind,
|
| };
|
|
|
| @@ -69,6 +71,8 @@ class Location : public ValueObject {
|
| // a spill index.
|
| kStackSlot = 3,
|
| kDoubleStackSlot = 4,
|
| + kFloat32x4StackSlot = 8,
|
| + kUint32x4StackSlot = 10,
|
|
|
| // Register location represents a fixed register. Payload contains
|
| // register code.
|
| @@ -187,6 +191,7 @@ class Location : public ValueObject {
|
| return RegisterField::decode(payload());
|
| }
|
|
|
| +
|
| Representation representation() const {
|
| return RepresentationField::decode(payload());
|
| }
|
| @@ -231,14 +236,19 @@ class Location : public ValueObject {
|
| return static_cast<intptr_t>(RegisterField::decode(payload()));
|
| }
|
|
|
| + static uword make_stack_index_payload(intptr_t stack_index,
|
| + Representation rep) {
|
| + ASSERT((-kStackIndexBias <= stack_index) &&
|
| + (stack_index < kStackIndexBias));
|
| + uword payload =
|
| + IndexField::encode(static_cast<uword>(kStackIndexBias + stack_index));
|
| + return payload | RepresentationField::encode(rep);
|
| + }
|
| +
|
| // Spill slots.
|
| static Location StackSlot(intptr_t stack_index,
|
| Representation rep = kTagged) {
|
| - ASSERT((-kStackIndexBias <= stack_index) &&
|
| - (stack_index < kStackIndexBias));
|
| - uword payload =
|
| - IndexField::encode(static_cast<uword>(kStackIndexBias + stack_index))
|
| - | RepresentationField::encode(rep);
|
| + uword payload = make_stack_index_payload(stack_index, rep);
|
| Location loc(kStackSlot, payload);
|
| // Ensure that sign is preserved.
|
| ASSERT(loc.stack_index() == stack_index);
|
| @@ -250,11 +260,7 @@ class Location : public ValueObject {
|
| }
|
|
|
| static Location DoubleStackSlot(intptr_t stack_index, Representation rep) {
|
| - ASSERT((-kStackIndexBias <= stack_index) &&
|
| - (stack_index < kStackIndexBias));
|
| - uword payload =
|
| - IndexField::encode(static_cast<uword>(kStackIndexBias + stack_index))
|
| - | RepresentationField::encode(rep);
|
| + uword payload = make_stack_index_payload(stack_index, rep);
|
| Location loc(kDoubleStackSlot, payload);
|
| // Ensure that sign is preserved.
|
| ASSERT(loc.stack_index() == stack_index);
|
| @@ -265,9 +271,34 @@ class Location : public ValueObject {
|
| return kind() == kDoubleStackSlot;
|
| }
|
|
|
| + static Location Float32x4StackSlot(intptr_t stack_index, Representation rep) {
|
| + uword payload = make_stack_index_payload(stack_index, rep);
|
| + 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, Representation rep) {
|
| + uword payload = make_stack_index_payload(stack_index, rep);
|
| + Location loc(kUint32x4StackSlot, payload);
|
| + // Ensure that sign is preserved.
|
| + ASSERT(loc.stack_index() == stack_index);
|
| + return loc;
|
| + }
|
| +
|
| + bool IsUint32x4StackSlot() const {
|
| + return kind() == kUint32x4StackSlot;
|
| + }
|
| +
|
|
|
| intptr_t stack_index() const {
|
| - ASSERT(IsStackSlot() || IsDoubleStackSlot());
|
| + ASSERT(IsStackSlot() || IsDoubleStackSlot() || IsFloat32x4StackSlot() ||
|
| + IsUint32x4StackSlot());
|
| // Decode stack index manually to preserve sign.
|
| return IndexField::decode(payload()) - kStackIndexBias;
|
| }
|
|
|