| Index: src/x64/lithium-x64.h
|
| ===================================================================
|
| --- src/x64/lithium-x64.h (revision 6249)
|
| +++ src/x64/lithium-x64.h (working copy)
|
| @@ -45,13 +45,23 @@
|
| // Type hierarchy:
|
| //
|
| // LInstruction
|
| +// LDeoptimize
|
| // LGap
|
| +// LLabel
|
| +// LGoto
|
| +// LLazyBailout
|
| +// LOsrEntry
|
|
|
| #define LITHIUM_ALL_INSTRUCTION_LIST(V) \
|
| LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
|
|
|
| #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
|
| - V(Gap)
|
| + V(Deoptimize) \
|
| + V(Gap) \
|
| + V(Goto) \
|
| + V(Label) \
|
| + V(LazyBailout) \
|
| + V(OsrEntry)
|
|
|
|
|
| #define DECLARE_INSTRUCTION(type) \
|
| @@ -80,20 +90,10 @@
|
| : hydrogen_value_(NULL) { }
|
| virtual ~LInstruction() { }
|
|
|
| - // Predicates should be generated by macro as in lithium-ia32.h.
|
| - virtual bool IsLabel() const {
|
| - UNIMPLEMENTED();
|
| - return false;
|
| - }
|
| - virtual bool IsOsrEntry() const {
|
| - UNIMPLEMENTED();
|
| - 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 { }
|
| + virtual void PrintTo(StringStream* stream);
|
| + virtual void PrintDataTo(StringStream* stream) { }
|
|
|
| // Declare virtual type testers.
|
| #define DECLARE_DO(type) virtual bool Is##type() const { return false; }
|
| @@ -109,9 +109,7 @@
|
| LPointerMap* pointer_map() const { return pointer_map_.get(); }
|
| bool HasPointerMap() const { return pointer_map_.is_set(); }
|
|
|
| - void set_result(LOperand* operand) { result_.set(operand); }
|
| - LOperand* result() const { return result_.get(); }
|
| - bool HasResult() const { return result_.is_set(); }
|
| + virtual bool HasResult() const = 0;
|
|
|
| void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
|
| HValue* hydrogen_value() const { return hydrogen_value_; }
|
| @@ -129,14 +127,38 @@
|
| private:
|
| SetOncePointer<LEnvironment> environment_;
|
| SetOncePointer<LPointerMap> pointer_map_;
|
| - SetOncePointer<LOperand> result_;
|
| HValue* hydrogen_value_;
|
| SetOncePointer<LEnvironment> deoptimization_environment_;
|
| };
|
|
|
|
|
| -class LGap: public LInstruction {
|
| +template <int Result>
|
| +class LTemplateInstruction: public LInstruction { };
|
| +
|
| +
|
| +template<>
|
| +class LTemplateInstruction<0>: public LInstruction {
|
| + virtual bool HasResult() const { return false; }
|
| +};
|
| +
|
| +
|
| +template<>
|
| +class LTemplateInstruction<1>: public LInstruction {
|
| public:
|
| + static LTemplateInstruction<1>* cast(LInstruction* instr) {
|
| + ASSERT(instr->HasResult());
|
| + return reinterpret_cast<LTemplateInstruction<1>*>(instr);
|
| + }
|
| + void set_result(LOperand* operand) { result_.set(operand); }
|
| + LOperand* result() const { return result_.get(); }
|
| + virtual bool HasResult() const { return result_.is_set(); }
|
| + private:
|
| + SetOncePointer<LOperand> result_;
|
| +};
|
| +
|
| +
|
| +class LGap: public LTemplateInstruction<0> {
|
| + public:
|
| explicit LGap(HBasicBlock* block)
|
| : block_(block) {
|
| parallel_moves_[BEFORE] = NULL;
|
| @@ -146,7 +168,7 @@
|
| }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(Gap, "gap")
|
| - virtual void PrintDataTo(StringStream* stream) const;
|
| + virtual void PrintDataTo(StringStream* stream);
|
|
|
| bool IsRedundant() const;
|
|
|
| @@ -176,40 +198,80 @@
|
| };
|
|
|
|
|
| +class LGoto: public LTemplateInstruction<0> {
|
| + public:
|
| + LGoto(int block_id, bool include_stack_check = false)
|
| + : block_id_(block_id), include_stack_check_(include_stack_check) { }
|
| +
|
| + DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
|
| + virtual void PrintDataTo(StringStream* stream);
|
| + virtual bool IsControl() const { return true; }
|
| +
|
| + int block_id() const { return block_id_; }
|
| + bool include_stack_check() const { return include_stack_check_; }
|
| +
|
| + private:
|
| + int block_id_;
|
| + bool include_stack_check_;
|
| +};
|
| +
|
| +
|
| +class LLazyBailout: public LTemplateInstruction<0> {
|
| + public:
|
| + LLazyBailout() : gap_instructions_size_(0) { }
|
| +
|
| + DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
|
| +
|
| + void set_gap_instructions_size(int gap_instructions_size) {
|
| + gap_instructions_size_ = gap_instructions_size;
|
| + }
|
| + int gap_instructions_size() { return gap_instructions_size_; }
|
| +
|
| + private:
|
| + int gap_instructions_size_;
|
| +};
|
| +
|
| +
|
| +class LDeoptimize: public LTemplateInstruction<0> {
|
| + public:
|
| + DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
|
| +};
|
| +
|
| +
|
| class LLabel: public LGap {
|
| public:
|
| - explicit LLabel(HBasicBlock* block) : LGap(block) { }
|
| + explicit LLabel(HBasicBlock* block)
|
| + : LGap(block), replacement_(NULL) { }
|
|
|
| + DECLARE_CONCRETE_INSTRUCTION(Label, "label")
|
| +
|
| + virtual void PrintDataTo(StringStream* stream);
|
| +
|
| + int block_id() const { return block()->block_id(); }
|
| + bool is_loop_header() const { return block()->IsLoopHeader(); }
|
| + Label* label() { return &label_; }
|
| + LLabel* replacement() const { return replacement_; }
|
| + void set_replacement(LLabel* label) { replacement_ = label; }
|
| + bool HasReplacement() const { return replacement_ != NULL; }
|
| +
|
| private:
|
| Label label_;
|
| LLabel* replacement_;
|
| };
|
|
|
|
|
| -class LOsrEntry: public LInstruction {
|
| +class LOsrEntry: public LTemplateInstruction<0> {
|
| public:
|
| - // Function could be generated by a macro as in lithium-ia32.h.
|
| - static LOsrEntry* cast(LInstruction* instr) {
|
| - UNIMPLEMENTED();
|
| - return NULL;
|
| - }
|
| + LOsrEntry();
|
|
|
| - LOperand** SpilledRegisterArray() {
|
| - UNIMPLEMENTED();
|
| - return NULL;
|
| - }
|
| - LOperand** SpilledDoubleRegisterArray() {
|
| - UNIMPLEMENTED();
|
| - return NULL;
|
| - }
|
| + DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
|
|
|
| - void MarkSpilledRegister(int allocation_index, LOperand* spill_operand) {
|
| - UNIMPLEMENTED();
|
| - }
|
| + LOperand** SpilledRegisterArray() { return register_spills_; }
|
| + LOperand** SpilledDoubleRegisterArray() { return double_register_spills_; }
|
| +
|
| + void MarkSpilledRegister(int allocation_index, LOperand* spill_operand);
|
| void MarkSpilledDoubleRegister(int allocation_index,
|
| - LOperand* spill_operand) {
|
| - UNIMPLEMENTED();
|
| - }
|
| + LOperand* spill_operand);
|
|
|
| private:
|
| // Arrays of spill slot operands for registers with an assigned spill
|
|
|