Index: src/ia32/lithium-ia32.h |
=================================================================== |
--- src/ia32/lithium-ia32.h (revision 7661) |
+++ src/ia32/lithium-ia32.h (working copy) |
@@ -39,13 +39,6 @@ |
// Forward declarations. |
class LCodeGen; |
- |
-#define LITHIUM_ALL_INSTRUCTION_LIST(V) \ |
- V(ControlInstruction) \ |
- V(Call) \ |
- LITHIUM_CONCRETE_INSTRUCTION_LIST(V) |
- |
- |
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \ |
V(AccessArgumentsAt) \ |
V(AddI) \ |
@@ -172,20 +165,16 @@ |
V(ValueOf) |
-#define DECLARE_INSTRUCTION(type) \ |
- virtual bool Is##type() const { return true; } \ |
- static L##type* cast(LInstruction* instr) { \ |
- ASSERT(instr->Is##type()); \ |
- return reinterpret_cast<L##type*>(instr); \ |
+#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \ |
+ virtual Opcode opcode() const { return LInstruction::k##type; } \ |
+ virtual void CompileToNative(LCodeGen* generator); \ |
+ virtual const char* Mnemonic() const { return mnemonic; } \ |
+ static L##type* cast(LInstruction* instr) { \ |
+ ASSERT(instr->Is##type()); \ |
+ return reinterpret_cast<L##type*>(instr); \ |
} |
-#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \ |
- virtual void CompileToNative(LCodeGen* generator); \ |
- virtual const char* Mnemonic() const { return mnemonic; } \ |
- DECLARE_INSTRUCTION(type) |
- |
- |
#define DECLARE_HYDROGEN_ACCESSOR(type) \ |
H##type* hydrogen() const { \ |
return H##type::cast(hydrogen_value()); \ |
@@ -207,10 +196,21 @@ |
virtual void PrintDataTo(StringStream* stream) = 0; |
virtual void PrintOutputOperandTo(StringStream* stream) = 0; |
+ enum Opcode { |
+ // Declare a unique enum value for each instruction. |
+ #define DECLARE_OPCODE(type) k##type, |
+ LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE) |
+ kNumberOfInstructions |
+ #undef DECLARE_OPCODE |
+ }; |
+ |
+ virtual Opcode opcode() const = 0; |
+ |
// Declare virtual type testers. |
-#define DECLARE_DO(type) virtual bool Is##type() const { return false; } |
- LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO) |
-#undef DECLARE_DO |
+#define DECLARE_PREDICATE(type) \ |
+ bool Is##type() const { return opcode() == k##type; } |
+ LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE) |
+#undef DECLARE_PREDICATE |
virtual bool IsControl() const { return false; } |
virtual void SetBranchTargets(int true_block_id, int false_block_id) { } |
@@ -463,7 +463,6 @@ |
template<int I, int T> |
class LControlInstruction: public LTemplateInstruction<0, I, T> { |
public: |
- DECLARE_INSTRUCTION(ControlInstruction) |
virtual bool IsControl() const { return true; } |
int true_block_id() const { return true_block_id_; } |
@@ -1133,6 +1132,7 @@ |
Token::Value op() const { return op_; } |
+ virtual Opcode opcode() const { return LInstruction::kArithmeticD; } |
virtual void CompileToNative(LCodeGen* generator); |
virtual const char* Mnemonic() const; |
@@ -1149,6 +1149,7 @@ |
inputs_[1] = right; |
} |
+ virtual Opcode opcode() const { return LInstruction::kArithmeticT; } |
virtual void CompileToNative(LCodeGen* generator); |
virtual const char* Mnemonic() const; |
@@ -2268,7 +2269,6 @@ |
}; |
#undef DECLARE_HYDROGEN_ACCESSOR |
-#undef DECLARE_INSTRUCTION |
#undef DECLARE_CONCRETE_INSTRUCTION |
} } // namespace v8::internal |