Index: src/x64/lithium-x64.h |
=================================================================== |
--- src/x64/lithium-x64.h (revision 7679) |
+++ src/x64/lithium-x64.h (working copy) |
@@ -93,7 +93,6 @@ |
V(ExternalArrayLength) \ |
V(FixedArrayLength) \ |
V(FunctionLiteral) \ |
- V(Gap) \ |
V(GetCachedArrayIndex) \ |
V(GlobalObject) \ |
V(GlobalReceiver) \ |
@@ -105,6 +104,7 @@ |
V(InstanceOf) \ |
V(InstanceOfAndBranch) \ |
V(InstanceOfKnownGlobal) \ |
+ V(InstructionGap) \ |
V(Integer32ToDouble) \ |
V(InvokeFunction) \ |
V(IsNull) \ |
@@ -171,20 +171,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,11 +203,26 @@ |
virtual void PrintDataTo(StringStream* stream) = 0; |
virtual void PrintOutputOperandTo(StringStream* stream) = 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 |
+ 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 non-virtual type testers for all leaf IR classes. |
+#define DECLARE_PREDICATE(type) \ |
+ bool Is##type() const { return opcode() == k##type; } |
+ LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE) |
+#undef DECLARE_PREDICATE |
+ |
+ // Declare virtual predicates for instructions that don't have |
+ // an opcode. |
+ virtual bool IsGap() const { return false; } |
+ |
virtual bool IsControl() const { return false; } |
virtual void SetBranchTargets(int true_block_id, int false_block_id) { } |
@@ -337,8 +348,13 @@ |
parallel_moves_[AFTER] = NULL; |
} |
- DECLARE_CONCRETE_INSTRUCTION(Gap, "gap") |
+ // Can't use the DECLARE-macro here because of sub-classes. |
+ virtual bool IsGap() const { return true; } |
virtual void PrintDataTo(StringStream* stream); |
+ static LGap* cast(LInstruction* instr) { |
+ ASSERT(instr->IsGap()); |
+ return reinterpret_cast<LGap*>(instr); |
+ } |
bool IsRedundant() const; |
@@ -368,6 +384,14 @@ |
}; |
+class LInstructionGap: public LGap { |
+ public: |
+ explicit LInstructionGap(HBasicBlock* block) : LGap(block) { } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap") |
+}; |
+ |
+ |
class LGoto: public LTemplateInstruction<0, 0, 0> { |
public: |
LGoto(int block_id, bool include_stack_check = false) |
@@ -456,7 +480,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_; } |
@@ -1092,6 +1115,7 @@ |
Token::Value op() const { return op_; } |
+ virtual Opcode opcode() const { return LInstruction::kArithmeticD; } |
virtual void CompileToNative(LCodeGen* generator); |
virtual const char* Mnemonic() const; |
@@ -1108,6 +1132,7 @@ |
inputs_[1] = right; |
} |
+ virtual Opcode opcode() const { return LInstruction::kArithmeticT; } |
virtual void CompileToNative(LCodeGen* generator); |
virtual const char* Mnemonic() const; |
@@ -2191,7 +2216,6 @@ |
}; |
#undef DECLARE_HYDROGEN_ACCESSOR |
-#undef DECLARE_INSTRUCTION |
#undef DECLARE_CONCRETE_INSTRUCTION |
} } // namespace v8::int |