Index: src/lithium.h |
diff --git a/src/lithium.h b/src/lithium.h |
index d4395f2d7ee39231f97f8773b991421fcff1930e..df7b1da31c49f9e7608c4032eab093d7373f5f3d 100644 |
--- a/src/lithium.h |
+++ b/src/lithium.h |
@@ -35,12 +35,16 @@ |
namespace v8 { |
namespace internal { |
-#define LITHIUM_OPERAND_LIST(V) \ |
- V(ConstantOperand, CONSTANT_OPERAND) \ |
- V(StackSlot, STACK_SLOT) \ |
- V(DoubleStackSlot, DOUBLE_STACK_SLOT) \ |
- V(Register, REGISTER) \ |
- V(DoubleRegister, DOUBLE_REGISTER) |
+#define LITHIUM_OPERAND_LIST(V) \ |
+ V(ConstantOperand, CONSTANT_OPERAND) \ |
+ V(StackSlot, STACK_SLOT) \ |
+ V(DoubleStackSlot, DOUBLE_STACK_SLOT) \ |
+ V(Float32x4StackSlot, FLOAT32x4_STACK_SLOT) \ |
+ V(Int32x4StackSlot, INT32x4_STACK_SLOT) \ |
+ V(Register, REGISTER) \ |
+ V(DoubleRegister, DOUBLE_REGISTER) \ |
+ V(Float32x4Register, FLOAT32x4_REGISTER) \ |
+ V(Int32x4Register, INT32x4_REGISTER) |
class LOperand : public ZoneObject { |
@@ -51,8 +55,12 @@ class LOperand : public ZoneObject { |
CONSTANT_OPERAND, |
STACK_SLOT, |
DOUBLE_STACK_SLOT, |
+ FLOAT32x4_STACK_SLOT, |
+ INT32x4_STACK_SLOT, |
REGISTER, |
DOUBLE_REGISTER, |
+ FLOAT32x4_REGISTER, |
+ INT32x4_REGISTER, |
ARGUMENT |
}; |
@@ -67,7 +75,17 @@ class LOperand : public ZoneObject { |
LITHIUM_OPERAND_PREDICATE(Unallocated, UNALLOCATED) |
LITHIUM_OPERAND_PREDICATE(Ignored, INVALID) |
#undef LITHIUM_OPERAND_PREDICATE |
- bool Equals(LOperand* other) const { return value_ == other->value_; } |
+ bool IsXMMRegister() const { |
+ return kind() == FLOAT32x4_REGISTER || kind() == INT32x4_REGISTER; |
+ } |
+ bool IsXMMStackSlot() const { |
+ return kind() == FLOAT32x4_STACK_SLOT || kind() == INT32x4_STACK_SLOT; |
+ } |
+ bool Equals(LOperand* other) const { |
+ return value_ == other->value_ || (index() == other->index() && |
+ ((IsXMMRegister() && other->IsXMMRegister()) || |
+ (IsXMMStackSlot() && other->IsXMMStackSlot()))); |
+ } |
void PrintTo(StringStream* stream); |
void ConvertTo(Kind kind, int index) { |
@@ -81,7 +99,7 @@ class LOperand : public ZoneObject { |
static void TearDownCaches(); |
protected: |
- static const int kKindFieldWidth = 3; |
+ static const int kKindFieldWidth = 4; |
class KindField : public BitField<Kind, 0, kKindFieldWidth> { }; |
LOperand(Kind kind, int index) { ConvertTo(kind, index); } |
@@ -165,32 +183,32 @@ class LUnallocated : public LOperand { |
// because it accommodates a larger pay-load. |
// |
// For FIXED_SLOT policy: |
- // +------------------------------------------+ |
- // | slot_index | vreg | 0 | 001 | |
- // +------------------------------------------+ |
+ // +-------------------------------------------+ |
+ // | slot_index | vreg | 0 | 0001 | |
+ // +-------------------------------------------+ |
// |
// For all other (extended) policies: |
- // +------------------------------------------+ |
- // | reg_index | L | PPP | vreg | 1 | 001 | L ... Lifetime |
- // +------------------------------------------+ P ... Policy |
+ // +-------------------------------------------+ |
+ // | reg_index | L | PPP | vreg | 1 | 0001 | L ... Lifetime |
+ // +-------------------------------------------+ P ... Policy |
// |
// The slot index is a signed value which requires us to decode it manually |
// instead of using the BitField utility class. |
// The superclass has a KindField. |
- STATIC_ASSERT(kKindFieldWidth == 3); |
+ STATIC_ASSERT(kKindFieldWidth == 4); |
// BitFields for all unallocated operands. |
- class BasicPolicyField : public BitField<BasicPolicy, 3, 1> {}; |
- class VirtualRegisterField : public BitField<unsigned, 4, 18> {}; |
+ class BasicPolicyField : public BitField<BasicPolicy, 4, 1> {}; |
+ class VirtualRegisterField : public BitField<unsigned, 5, 18> {}; |
// BitFields specific to BasicPolicy::FIXED_SLOT. |
- class FixedSlotIndexField : public BitField<int, 22, 10> {}; |
+ class FixedSlotIndexField : public BitField<int, 23, 9> {}; |
// BitFields specific to BasicPolicy::EXTENDED_POLICY. |
- class ExtendedPolicyField : public BitField<ExtendedPolicy, 22, 3> {}; |
- class LifetimeField : public BitField<Lifetime, 25, 1> {}; |
- class FixedRegisterField : public BitField<int, 26, 6> {}; |
+ class ExtendedPolicyField : public BitField<ExtendedPolicy, 23, 3> {}; |
+ class LifetimeField : public BitField<Lifetime, 26, 1> {}; |
+ class FixedRegisterField : public BitField<int, 27, 5> {}; |
static const int kMaxVirtualRegisters = VirtualRegisterField::kMax + 1; |
static const int kFixedSlotIndexWidth = FixedSlotIndexField::kSize; |
@@ -403,6 +421,58 @@ class LDoubleStackSlot V8_FINAL : public LOperand { |
}; |
+class LFloat32x4StackSlot V8_FINAL : public LOperand { |
+ public: |
+ static LFloat32x4StackSlot* Create(int index, Zone* zone) { |
+ ASSERT(index >= 0); |
+ if (index < kNumCachedOperands) return &cache[index]; |
+ return new(zone) LFloat32x4StackSlot(index); |
+ } |
+ |
+ static LFloat32x4StackSlot* cast(LOperand* op) { |
+ ASSERT(op->IsStackSlot()); |
+ return reinterpret_cast<LFloat32x4StackSlot*>(op); |
+ } |
+ |
+ static void SetUpCache(); |
+ static void TearDownCache(); |
+ |
+ private: |
+ static const int kNumCachedOperands = 128; |
+ static LFloat32x4StackSlot* cache; |
+ |
+ LFloat32x4StackSlot() : LOperand() { } |
+ explicit LFloat32x4StackSlot(int index) |
+ : LOperand(FLOAT32x4_STACK_SLOT, index) { } |
+}; |
+ |
+ |
+class LInt32x4StackSlot V8_FINAL : public LOperand { |
+ public: |
+ static LInt32x4StackSlot* Create(int index, Zone* zone) { |
+ ASSERT(index >= 0); |
+ if (index < kNumCachedOperands) return &cache[index]; |
+ return new(zone) LInt32x4StackSlot(index); |
+ } |
+ |
+ static LInt32x4StackSlot* cast(LOperand* op) { |
+ ASSERT(op->IsStackSlot()); |
+ return reinterpret_cast<LInt32x4StackSlot*>(op); |
+ } |
+ |
+ static void SetUpCache(); |
+ static void TearDownCache(); |
+ |
+ private: |
+ static const int kNumCachedOperands = 128; |
+ static LInt32x4StackSlot* cache; |
+ |
+ LInt32x4StackSlot() : LOperand() { } |
+ explicit LInt32x4StackSlot(int index) |
+ : LOperand(INT32x4_STACK_SLOT, index) { } |
+}; |
+ |
+ |
class LRegister V8_FINAL : public LOperand { |
public: |
static LRegister* Create(int index, Zone* zone) { |
@@ -453,6 +523,58 @@ class LDoubleRegister V8_FINAL : public LOperand { |
}; |
+class LFloat32x4Register V8_FINAL : public LOperand { |
+ public: |
+ static LFloat32x4Register* Create(int index, Zone* zone) { |
+ ASSERT(index >= 0); |
+ if (index < kNumCachedOperands) return &cache[index]; |
+ return new(zone) LFloat32x4Register(index); |
+ } |
+ |
+ static LFloat32x4Register* cast(LOperand* op) { |
+ ASSERT(op->IsFloat32x4Register()); |
+ return reinterpret_cast<LFloat32x4Register*>(op); |
+ } |
+ |
+ static void SetUpCache(); |
+ static void TearDownCache(); |
+ |
+ private: |
+ static const int kNumCachedOperands = 16; |
+ static LFloat32x4Register* cache; |
+ |
+ LFloat32x4Register() : LOperand() { } |
+ explicit LFloat32x4Register(int index) |
+ : LOperand(FLOAT32x4_REGISTER, index) { } |
+}; |
+ |
+ |
+class LInt32x4Register V8_FINAL : public LOperand { |
+ public: |
+ static LInt32x4Register* Create(int index, Zone* zone) { |
+ ASSERT(index >= 0); |
+ if (index < kNumCachedOperands) return &cache[index]; |
+ return new(zone) LInt32x4Register(index); |
+ } |
+ |
+ static LInt32x4Register* cast(LOperand* op) { |
+ ASSERT(op->IsInt32x4Register()); |
+ return reinterpret_cast<LInt32x4Register*>(op); |
+ } |
+ |
+ static void SetUpCache(); |
+ static void TearDownCache(); |
+ |
+ private: |
+ static const int kNumCachedOperands = 16; |
+ static LInt32x4Register* cache; |
+ |
+ LInt32x4Register() : LOperand() { } |
+ explicit LInt32x4Register(int index) |
+ : LOperand(INT32x4_REGISTER, index) { } |
+}; |
+ |
+ |
class LParallelMove V8_FINAL : public ZoneObject { |
public: |
explicit LParallelMove(Zone* zone) : move_operands_(4, zone) { } |