Index: src/lithium.h |
diff --git a/src/lithium.h b/src/lithium.h |
index 754f88da82184816de334a89daf09a86a55c1231..d44fda3255b26a2d0e0a91b7a3184aeca69146ca 100644 |
--- a/src/lithium.h |
+++ b/src/lithium.h |
@@ -35,12 +35,12 @@ |
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, 128) \ |
+ V(StackSlot, STACK_SLOT, 128) \ |
+ V(DoubleStackSlot, DOUBLE_STACK_SLOT, 128) \ |
+ V(Register, REGISTER, 16) \ |
+ V(DoubleRegister, DOUBLE_REGISTER, 16) |
class LOperand : public ZoneObject { |
@@ -60,12 +60,12 @@ class LOperand : public ZoneObject { |
Kind kind() const { return KindField::decode(value_); } |
int index() const { return static_cast<int>(value_) >> kKindFieldWidth; } |
-#define LITHIUM_OPERAND_PREDICATE(name, type) \ |
+#define LITHIUM_OPERAND_PREDICATE(name, type, number) \ |
bool Is##name() const { return kind() == type; } |
LITHIUM_OPERAND_LIST(LITHIUM_OPERAND_PREDICATE) |
- LITHIUM_OPERAND_PREDICATE(Argument, ARGUMENT) |
- LITHIUM_OPERAND_PREDICATE(Unallocated, UNALLOCATED) |
- LITHIUM_OPERAND_PREDICATE(Ignored, INVALID) |
+ LITHIUM_OPERAND_PREDICATE(Argument, ARGUMENT, 0) |
+ LITHIUM_OPERAND_PREDICATE(Unallocated, UNALLOCATED, 0) |
+ LITHIUM_OPERAND_PREDICATE(Ignored, INVALID, 0) |
#undef LITHIUM_OPERAND_PREDICATE |
bool Equals(LOperand* other) const { return value_ == other->value_; } |
@@ -317,31 +317,37 @@ class LMoveOperands V8_FINAL BASE_EMBEDDED { |
}; |
-class LConstantOperand V8_FINAL : public LOperand { |
+template<LOperand::Kind kOperandKind, int kNumCachedOperands> |
+class LSubKindOperand V8_FINAL : public LOperand { |
public: |
- static LConstantOperand* Create(int index, Zone* zone) { |
+ static LSubKindOperand* Create(int index, Zone* zone) { |
ASSERT(index >= 0); |
if (index < kNumCachedOperands) return &cache[index]; |
- return new(zone) LConstantOperand(index); |
+ return new(zone) LSubKindOperand(index); |
} |
- static LConstantOperand* cast(LOperand* op) { |
- ASSERT(op->IsConstantOperand()); |
- return reinterpret_cast<LConstantOperand*>(op); |
+ static LSubKindOperand* cast(LOperand* op) { |
+ ASSERT(op->kind() == kOperandKind); |
+ return reinterpret_cast<LSubKindOperand*>(op); |
} |
static void SetUpCache(); |
static void TearDownCache(); |
private: |
- static const int kNumCachedOperands = 128; |
- static LConstantOperand* cache; |
+ static LSubKindOperand* cache; |
- LConstantOperand() : LOperand() { } |
- explicit LConstantOperand(int index) : LOperand(CONSTANT_OPERAND, index) { } |
+ LSubKindOperand() : LOperand() { } |
+ explicit LSubKindOperand(int index) : LOperand(kOperandKind, index) { } |
}; |
+#define LITHIUM_TYPEDEF_SUBKIND_OPERAND_CLASS(name, type, number) \ |
+typedef LSubKindOperand<LOperand::type, number> L##name; |
+LITHIUM_OPERAND_LIST(LITHIUM_TYPEDEF_SUBKIND_OPERAND_CLASS) |
+#undef LITHIUM_TYPEDEF_SUBKIND_OPERAND_CLASS |
+ |
+ |
class LArgument V8_FINAL : public LOperand { |
public: |
explicit LArgument(int index) : LOperand(ARGUMENT, index) { } |
@@ -353,106 +359,6 @@ class LArgument V8_FINAL : public LOperand { |
}; |
-class LStackSlot V8_FINAL : public LOperand { |
- public: |
- static LStackSlot* Create(int index, Zone* zone) { |
- ASSERT(index >= 0); |
- if (index < kNumCachedOperands) return &cache[index]; |
- return new(zone) LStackSlot(index); |
- } |
- |
- static LStackSlot* cast(LOperand* op) { |
- ASSERT(op->IsStackSlot()); |
- return reinterpret_cast<LStackSlot*>(op); |
- } |
- |
- static void SetUpCache(); |
- static void TearDownCache(); |
- |
- private: |
- static const int kNumCachedOperands = 128; |
- static LStackSlot* cache; |
- |
- LStackSlot() : LOperand() { } |
- explicit LStackSlot(int index) : LOperand(STACK_SLOT, index) { } |
-}; |
- |
- |
-class LDoubleStackSlot V8_FINAL : public LOperand { |
- public: |
- static LDoubleStackSlot* Create(int index, Zone* zone) { |
- ASSERT(index >= 0); |
- if (index < kNumCachedOperands) return &cache[index]; |
- return new(zone) LDoubleStackSlot(index); |
- } |
- |
- static LDoubleStackSlot* cast(LOperand* op) { |
- ASSERT(op->IsStackSlot()); |
- return reinterpret_cast<LDoubleStackSlot*>(op); |
- } |
- |
- static void SetUpCache(); |
- static void TearDownCache(); |
- |
- private: |
- static const int kNumCachedOperands = 128; |
- static LDoubleStackSlot* cache; |
- |
- LDoubleStackSlot() : LOperand() { } |
- explicit LDoubleStackSlot(int index) : LOperand(DOUBLE_STACK_SLOT, index) { } |
-}; |
- |
- |
-class LRegister V8_FINAL : public LOperand { |
- public: |
- static LRegister* Create(int index, Zone* zone) { |
- ASSERT(index >= 0); |
- if (index < kNumCachedOperands) return &cache[index]; |
- return new(zone) LRegister(index); |
- } |
- |
- static LRegister* cast(LOperand* op) { |
- ASSERT(op->IsRegister()); |
- return reinterpret_cast<LRegister*>(op); |
- } |
- |
- static void SetUpCache(); |
- static void TearDownCache(); |
- |
- private: |
- static const int kNumCachedOperands = 16; |
- static LRegister* cache; |
- |
- LRegister() : LOperand() { } |
- explicit LRegister(int index) : LOperand(REGISTER, index) { } |
-}; |
- |
- |
-class LDoubleRegister V8_FINAL : public LOperand { |
- public: |
- static LDoubleRegister* Create(int index, Zone* zone) { |
- ASSERT(index >= 0); |
- if (index < kNumCachedOperands) return &cache[index]; |
- return new(zone) LDoubleRegister(index); |
- } |
- |
- static LDoubleRegister* cast(LOperand* op) { |
- ASSERT(op->IsDoubleRegister()); |
- return reinterpret_cast<LDoubleRegister*>(op); |
- } |
- |
- static void SetUpCache(); |
- static void TearDownCache(); |
- |
- private: |
- static const int kNumCachedOperands = 16; |
- static LDoubleRegister* cache; |
- |
- LDoubleRegister() : LOperand() { } |
- explicit LDoubleRegister(int index) : LOperand(DOUBLE_REGISTER, index) { } |
-}; |
- |
- |
class LParallelMove V8_FINAL : public ZoneObject { |
public: |
explicit LParallelMove(Zone* zone) : move_operands_(4, zone) { } |