Chromium Code Reviews| Index: runtime/vm/intermediate_language.h |
| diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h |
| index e5bd8d199788445cfba6b9f1a5d31cd08788015f..90cb4010f9b78073c43c46c99a434c9408426e2b 100644 |
| --- a/runtime/vm/intermediate_language.h |
| +++ b/runtime/vm/intermediate_language.h |
| @@ -14,8 +14,10 @@ |
| namespace dart { |
| class BitVector; |
| +class FlowGraphCompiler; |
| class FlowGraphVisitor; |
| class LocalVariable; |
| +class LocationSummary; |
| // M is a two argument macro. It is applied to each concrete value's |
| // typename and classname. |
| @@ -108,6 +110,19 @@ class Computation : public ZoneAllocated { |
| virtual void PrintTo(BufferFormatter* f) const; |
| virtual void PrintOperandsTo(BufferFormatter* f) const; |
| + // Returns structure describing location constraints required |
| + // to emit native code for this computation. |
| + virtual LocationSummary* locs() const { |
| + // TODO(vegorov): This should be pure virtual method. |
| + // However we are temporary using NULL for instructions that |
| + // were not converted to the location based code generation yet. |
| + return NULL; |
| + } |
| + |
| + virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
| + UNIMPLEMENTED(); |
| + } |
| + |
| private: |
| friend class Instruction; |
| static intptr_t GetNextCid(Isolate* isolate) { |
| @@ -143,15 +158,25 @@ class EmbeddedArray { |
| EmbeddedArray() : elements_() { } |
| intptr_t length() const { return N; } |
| + |
| const T& operator[](intptr_t i) const { |
| ASSERT(i < length()); |
| return elements_[i]; |
| } |
| + |
| T& operator[](intptr_t i) { |
| ASSERT(i < length()); |
| return elements_[i]; |
| } |
| + const T& At(intptr_t i) const { |
| + return (*this)[i]; |
| + } |
| + |
| + void SetAt(intptr_t i, const T& val) { |
| + (*this)[i] = val; |
| + } |
|
srdjan
2012/05/21 16:05:22
Maybe we should get rid of operators (some other C
|
| + |
| private: |
| T elements_[N]; |
| }; |
| @@ -449,6 +474,7 @@ class StrictCompareComp : public TemplateComputation<2> { |
| ASSERT((kind_ == Token::kEQ_STRICT) || (kind_ == Token::kNE_STRICT)); |
| inputs_[0] = left; |
| inputs_[1] = right; |
| + location_summary_ = MakeLocationSummary(); |
| } |
| DECLARE_COMPUTATION(StrictCompare) |
| @@ -459,9 +485,20 @@ class StrictCompareComp : public TemplateComputation<2> { |
| virtual void PrintOperandsTo(BufferFormatter* f) const; |
| + virtual LocationSummary* locs() const { |
| + return location_summary_; |
| + } |
| + |
| + // Platform specific summary factory for this instruction. |
| + LocationSummary* MakeLocationSummary(); |
| + |
| + virtual void EmitNativeCode(FlowGraphCompiler* compiler); |
| + |
| private: |
| const Token::Kind kind_; |
| + LocationSummary* location_summary_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(StrictCompareComp); |
| }; |
| @@ -1363,6 +1400,19 @@ FOR_EACH_INSTRUCTION(INSTRUCTION_TYPE_CHECK) |
| return AbstractType::null(); |
| } |
| + // Returns structure describing location constraints required |
| + // to emit native code for this instruction. |
| + virtual LocationSummary* locs() const { |
| + // TODO(vegorov): This should be pure virtual method. |
| + // However we are temporary using NULL for instructions that |
| + // were not converted to the location based code generation yet. |
| + return NULL; |
| + } |
| + |
| + virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
| + UNIMPLEMENTED(); |
| + } |
| + |
| private: |
| intptr_t cid_; |
| ICData* ic_data_; |
| @@ -1560,6 +1610,7 @@ class DoInstr : public Instruction { |
| virtual Instruction* StraightLineSuccessor() const { |
| return successor_; |
| } |
| + |
| virtual void SetSuccessor(Instruction* instr) { |
| ASSERT(successor_ == NULL); |
| successor_ = instr; |
| @@ -1567,6 +1618,14 @@ class DoInstr : public Instruction { |
| virtual void RecordAssignedVars(BitVector* assigned_vars); |
| + virtual LocationSummary* locs() const { |
| + return computation()->locs(); |
| + } |
| + |
| + virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
| + computation()->EmitNativeCode(compiler); |
| + } |
| + |
| private: |
| Computation* computation_; |
| Instruction* successor_; |
| @@ -1603,6 +1662,7 @@ class BindInstr : public Definition { |
| virtual Instruction* StraightLineSuccessor() const { |
| return successor_; |
| } |
| + |
| virtual void SetSuccessor(Instruction* instr) { |
| ASSERT(successor_ == NULL); |
| successor_ = instr; |
| @@ -1615,6 +1675,12 @@ class BindInstr : public Definition { |
| virtual void RecordAssignedVars(BitVector* assigned_vars); |
| + virtual LocationSummary* locs() const { |
| + return computation()->locs(); |
| + } |
| + |
| + virtual void EmitNativeCode(FlowGraphCompiler* compiler); |
| + |
| private: |
| Computation* computation_; |
| Instruction* successor_; |