Index: src/x64/lithium-x64.h |
=================================================================== |
--- src/x64/lithium-x64.h (revision 6222) |
+++ src/x64/lithium-x64.h (working copy) |
@@ -41,14 +41,45 @@ |
class LEnvironment; |
class Translation; |
+ |
+// Type hierarchy: |
+// |
+// LInstruction |
+// LGap |
+ |
+#define LITHIUM_ALL_INSTRUCTION_LIST(V) \ |
+ LITHIUM_CONCRETE_INSTRUCTION_LIST(V) |
+ |
+#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \ |
+ V(Gap) |
+ |
+ |
+#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 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()); \ |
+ } |
+ |
+ |
class LInstruction: public ZoneObject { |
public: |
- LInstruction() { } |
+ LInstruction() |
+ : hydrogen_value_(NULL) { } |
virtual ~LInstruction() { } |
- virtual void PrintTo(StringStream* stream) const { UNIMPLEMENTED(); } |
- virtual void PrintDataTo(StringStream* stream) const { } |
- |
// Predicates should be generated by macro as in lithium-ia32.h. |
virtual bool IsLabel() const { |
UNIMPLEMENTED(); |
@@ -59,6 +90,17 @@ |
return false; |
} |
+ virtual void CompileToNative(LCodeGen* generator) = 0; |
+ virtual const char* Mnemonic() const = 0; |
+ virtual void PrintTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream) const { } |
+ |
+ // Declare virtual type testers. |
+#define DECLARE_DO(type) virtual bool Is##type() const { return false; } |
+ LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO) |
+#undef DECLARE_DO |
+ virtual bool IsControl() const { return false; } |
+ |
void set_environment(LEnvironment* env) { environment_.set(env); } |
LEnvironment* environment() const { return environment_.get(); } |
bool HasEnvironment() const { return environment_.is_set(); } |
@@ -93,33 +135,23 @@ |
}; |
-class LParallelMove : public ZoneObject { |
+class LGap: public LInstruction { |
public: |
- LParallelMove() : move_operands_(4) { } |
- |
- void AddMove(LOperand* from, LOperand* to) { |
- UNIMPLEMENTED(); |
+ explicit LGap(HBasicBlock* block) |
+ : block_(block) { |
+ parallel_moves_[BEFORE] = NULL; |
+ parallel_moves_[START] = NULL; |
+ parallel_moves_[END] = NULL; |
+ parallel_moves_[AFTER] = NULL; |
} |
- const ZoneList<LMoveOperands>* move_operands() const { |
- UNIMPLEMENTED(); |
- return NULL; |
- } |
+ DECLARE_CONCRETE_INSTRUCTION(Gap, "gap") |
+ virtual void PrintDataTo(StringStream* stream) const; |
- private: |
- ZoneList<LMoveOperands> move_operands_; |
-}; |
+ bool IsRedundant() const; |
+ HBasicBlock* block() const { return block_; } |
-class LGap: public LInstruction { |
- public: |
- explicit LGap(HBasicBlock* block) { } |
- |
- HBasicBlock* block() const { |
- UNIMPLEMENTED(); |
- return NULL; |
- } |
- |
enum InnerPosition { |
BEFORE, |
START, |
@@ -130,13 +162,12 @@ |
}; |
LParallelMove* GetOrCreateParallelMove(InnerPosition pos) { |
- UNIMPLEMENTED(); |
- return NULL; |
+ if (parallel_moves_[pos] == NULL) parallel_moves_[pos] = new LParallelMove; |
+ return parallel_moves_[pos]; |
} |
LParallelMove* GetParallelMove(InnerPosition pos) { |
- UNIMPLEMENTED(); |
- return NULL; |
+ return parallel_moves_[pos]; |
} |
private: |