Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: runtime/vm/intermediate_language.h

Issue 10875030: Add support for XMM registers in SSA code generation pipeline. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: fix a bug pointed out by Florian Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/il_printer.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_
6 #define VM_INTERMEDIATE_LANGUAGE_H_ 6 #define VM_INTERMEDIATE_LANGUAGE_H_
7 7
8 #include "vm/allocation.h" 8 #include "vm/allocation.h"
9 #include "vm/ast.h" 9 #include "vm/ast.h"
10 #include "vm/growable_array.h" 10 #include "vm/growable_array.h"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 M(BinarySmiOp, BinarySmiOpComp) \ 97 M(BinarySmiOp, BinarySmiOpComp) \
98 M(BinaryMintOp, BinaryMintOpComp) \ 98 M(BinaryMintOp, BinaryMintOpComp) \
99 M(BinaryDoubleOp, BinaryDoubleOpComp) \ 99 M(BinaryDoubleOp, BinaryDoubleOpComp) \
100 M(UnarySmiOp, UnarySmiOpComp) \ 100 M(UnarySmiOp, UnarySmiOpComp) \
101 M(NumberNegate, NumberNegateComp) \ 101 M(NumberNegate, NumberNegateComp) \
102 M(CheckStackOverflow, CheckStackOverflowComp) \ 102 M(CheckStackOverflow, CheckStackOverflowComp) \
103 M(DoubleToDouble, DoubleToDoubleComp) \ 103 M(DoubleToDouble, DoubleToDoubleComp) \
104 M(SmiToDouble, SmiToDoubleComp) \ 104 M(SmiToDouble, SmiToDoubleComp) \
105 M(CheckClass, CheckClassComp) \ 105 M(CheckClass, CheckClassComp) \
106 M(CheckSmi, CheckSmiComp) \ 106 M(CheckSmi, CheckSmiComp) \
107 M(Materialize, MaterializeComp) 107 M(Materialize, MaterializeComp) \
108 M(CheckEitherNonSmi, CheckEitherNonSmiComp) \
109 M(UnboxedDoubleBinaryOp, UnboxedDoubleBinaryOpComp) \
110 M(UnboxDouble, UnboxDoubleComp) \
111 M(BoxDouble, BoxDoubleComp)
108 112
109 113
110 #define FORWARD_DECLARATION(ShortName, ClassName) class ClassName; 114 #define FORWARD_DECLARATION(ShortName, ClassName) class ClassName;
111 FOR_EACH_COMPUTATION(FORWARD_DECLARATION) 115 FOR_EACH_COMPUTATION(FORWARD_DECLARATION)
112 FOR_EACH_VALUE(FORWARD_DECLARATION) 116 FOR_EACH_VALUE(FORWARD_DECLARATION)
113 #undef FORWARD_DECLARATION 117 #undef FORWARD_DECLARATION
114 118
115 // Forward declarations. 119 // Forward declarations.
116 class BindInstr; 120 class BindInstr;
117 class BranchInstr; 121 class BranchInstr;
118 class BufferFormatter; 122 class BufferFormatter;
119 class ComparisonComp; 123 class ComparisonComp;
120 class Definition; 124 class Definition;
121 class Instruction; 125 class Instruction;
122 class PushArgumentInstr; 126 class PushArgumentInstr;
123 class Value; 127 class Value;
124 128
129
130 enum Representation {
131 kTagged, kUnboxedDouble
132 };
133
134
125 class Computation : public ZoneAllocated { 135 class Computation : public ZoneAllocated {
126 public: 136 public:
127 Computation() : deopt_id_(Isolate::kNoDeoptId), ic_data_(NULL), locs_(NULL) { 137 Computation() : deopt_id_(Isolate::kNoDeoptId), ic_data_(NULL), locs_(NULL) {
128 Isolate* isolate = Isolate::Current(); 138 Isolate* isolate = Isolate::Current();
129 deopt_id_ = isolate->GetNextDeoptId(); 139 deopt_id_ = isolate->GetNextDeoptId();
130 ic_data_ = isolate->GetICDataForDeoptId(deopt_id_); 140 ic_data_ = isolate->GetICDataForDeoptId(deopt_id_);
131 } 141 }
132 142
133 // Unique id used for deoptimization. 143 // Unique id used for deoptimization.
134 intptr_t deopt_id() const { return deopt_id_; } 144 intptr_t deopt_id() const { return deopt_id_; }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 enum ComputationKind { 228 enum ComputationKind {
219 #define DECLARE_COMPUTATION_KIND(ShortName, ClassName) k##ShortName, 229 #define DECLARE_COMPUTATION_KIND(ShortName, ClassName) k##ShortName,
220 230
221 FOR_EACH_COMPUTATION(DECLARE_COMPUTATION_KIND) 231 FOR_EACH_COMPUTATION(DECLARE_COMPUTATION_KIND)
222 232
223 #undef DECLARE_COMPUTATION_KIND 233 #undef DECLARE_COMPUTATION_KIND
224 }; 234 };
225 235
226 virtual ComputationKind computation_kind() const = 0; 236 virtual ComputationKind computation_kind() const = 0;
227 237
238 virtual Representation representation() const {
239 return kTagged;
240 }
241
228 // Declare predicate for each computation. 242 // Declare predicate for each computation.
229 #define DECLARE_PREDICATE(ShortName, ClassName) \ 243 #define DECLARE_PREDICATE(ShortName, ClassName) \
230 inline bool Is##ShortName() const; \ 244 inline bool Is##ShortName() const; \
231 inline const ClassName* As##ShortName() const; \ 245 inline const ClassName* As##ShortName() const; \
232 inline ClassName* As##ShortName(); 246 inline ClassName* As##ShortName();
233 FOR_EACH_COMPUTATION(DECLARE_PREDICATE) 247 FOR_EACH_COMPUTATION(DECLARE_PREDICATE)
234 #undef DECLARE_PREDICATE 248 #undef DECLARE_PREDICATE
235 249
236 private: 250 private:
237 intptr_t deopt_id_; 251 intptr_t deopt_id_;
(...skipping 1417 matching lines...) Expand 10 before | Expand all | Expand 10 after
1655 virtual bool CanDeoptimize() const { return false; } 1669 virtual bool CanDeoptimize() const { return false; }
1656 1670
1657 private: 1671 private:
1658 const LocalVariable& exception_var_; 1672 const LocalVariable& exception_var_;
1659 const LocalVariable& stacktrace_var_; 1673 const LocalVariable& stacktrace_var_;
1660 1674
1661 DISALLOW_COPY_AND_ASSIGN(CatchEntryComp); 1675 DISALLOW_COPY_AND_ASSIGN(CatchEntryComp);
1662 }; 1676 };
1663 1677
1664 1678
1679 class CheckEitherNonSmiComp : public TemplateComputation<2> {
1680 public:
1681 CheckEitherNonSmiComp(Value* left,
1682 Value* right,
1683 InstanceCallComp* instance_call)
1684 : instance_call_(instance_call) {
1685 ASSERT(left != NULL);
1686 ASSERT(right != NULL);
1687 inputs_[0] = left;
1688 inputs_[1] = right;
1689 }
1690
1691 DECLARE_COMPUTATION(CheckEitherNonSmi)
1692
1693 virtual bool CanDeoptimize() const { return true; }
1694
1695 virtual bool HasSideEffect() const { return false; }
1696
1697 Value* left() const { return inputs_[0]; }
1698
1699 Value* right() const { return inputs_[1]; }
1700
1701 virtual Definition* TryReplace(BindInstr* instr) const;
1702
1703 private:
1704 InstanceCallComp* instance_call_;
1705
1706 DISALLOW_COPY_AND_ASSIGN(CheckEitherNonSmiComp);
1707 };
1708
1709
1710 class BoxDoubleComp : public TemplateComputation<1> {
1711 public:
1712 BoxDoubleComp(Value* value, InstanceCallComp* instance_call)
1713 : instance_call_(instance_call) {
1714 ASSERT(value != NULL);
1715 inputs_[0] = value;
1716 }
1717
1718 Value* value() const { return inputs_[0]; }
1719 InstanceCallComp* instance_call() const { return instance_call_; }
1720
1721 virtual bool CanDeoptimize() const { return false; }
1722
1723 virtual intptr_t ResultCid() const;
1724
1725 DECLARE_COMPUTATION(BoxDouble)
1726
1727 private:
1728 InstanceCallComp* instance_call_;
1729
1730 DISALLOW_COPY_AND_ASSIGN(BoxDoubleComp);
1731 };
1732
1733
1734 class UnboxDoubleComp : public TemplateComputation<1> {
1735 public:
1736 UnboxDoubleComp(Value* value, InstanceCallComp* instance_call)
1737 : instance_call_(instance_call) {
1738 ASSERT(value != NULL);
1739 inputs_[0] = value;
1740 }
1741
1742 Value* value() const { return inputs_[0]; }
1743 InstanceCallComp* instance_call() const { return instance_call_; }
1744
1745 virtual bool CanDeoptimize() const {
1746 return value()->ResultCid() != kDoubleCid;
1747 }
1748
1749 virtual Representation representation() const {
1750 return kUnboxedDouble;
1751 }
1752
1753 DECLARE_COMPUTATION(UnboxDouble)
1754
1755 private:
1756 InstanceCallComp* instance_call_;
1757
1758 DISALLOW_COPY_AND_ASSIGN(UnboxDoubleComp);
1759 };
1760
1761
1762 class UnboxedDoubleBinaryOpComp : public TemplateComputation<2> {
1763 public:
1764 UnboxedDoubleBinaryOpComp(Token::Kind op_kind,
1765 Value* left,
1766 Value* right)
1767 : op_kind_(op_kind) {
1768 ASSERT(left != NULL);
1769 ASSERT(right != NULL);
1770 inputs_[0] = left;
1771 inputs_[1] = right;
1772 }
1773
1774 Value* left() const { return inputs_[0]; }
1775 Value* right() const { return inputs_[1]; }
1776
1777 Token::Kind op_kind() const { return op_kind_; }
1778
1779 virtual void PrintOperandsTo(BufferFormatter* f) const;
1780
1781 virtual bool CanDeoptimize() const { return false; }
1782
1783 virtual Representation representation() const {
1784 return kUnboxedDouble;
1785 }
1786
1787 DECLARE_COMPUTATION(UnboxedDoubleBinaryOp)
1788
1789 private:
1790 const Token::Kind op_kind_;
1791
1792 DISALLOW_COPY_AND_ASSIGN(UnboxedDoubleBinaryOpComp);
1793 };
1794
1795
1665 class BinarySmiOpComp : public TemplateComputation<2> { 1796 class BinarySmiOpComp : public TemplateComputation<2> {
1666 public: 1797 public:
1667 BinarySmiOpComp(Token::Kind op_kind, 1798 BinarySmiOpComp(Token::Kind op_kind,
1668 InstanceCallComp* instance_call, 1799 InstanceCallComp* instance_call,
1669 Value* left, 1800 Value* left,
1670 Value* right) 1801 Value* right)
1671 : op_kind_(op_kind), 1802 : op_kind_(op_kind),
1672 instance_call_(instance_call) { 1803 instance_call_(instance_call) {
1673 ASSERT(left != NULL); 1804 ASSERT(left != NULL);
1674 ASSERT(right != NULL); 1805 ASSERT(right != NULL);
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after
2128 } 2259 }
2129 2260
2130 Environment* env() const { return env_; } 2261 Environment* env() const { return env_; }
2131 void set_env(Environment* env) { env_ = env; } 2262 void set_env(Environment* env) { env_ = env; }
2132 2263
2133 intptr_t lifetime_position() const { return lifetime_position_; } 2264 intptr_t lifetime_position() const { return lifetime_position_; }
2134 void set_lifetime_position(intptr_t pos) { 2265 void set_lifetime_position(intptr_t pos) {
2135 lifetime_position_ = pos; 2266 lifetime_position_ = pos;
2136 } 2267 }
2137 2268
2269 virtual Representation representation() const {
2270 return kTagged;
2271 }
2272
2138 private: 2273 private:
2139 friend class BindInstr; // Needed for BindInstr::InsertBefore. 2274 friend class BindInstr; // Needed for BindInstr::InsertBefore.
2140 2275
2141 intptr_t lifetime_position_; // Position used by register allocator. 2276 intptr_t lifetime_position_; // Position used by register allocator.
2142 Instruction* previous_; 2277 Instruction* previous_;
2143 Instruction* next_; 2278 Instruction* next_;
2144 Environment* env_; 2279 Environment* env_;
2145 DISALLOW_COPY_AND_ASSIGN(Instruction); 2280 DISALLOW_COPY_AND_ASSIGN(Instruction);
2146 }; 2281 };
2147 2282
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after
2682 return computation()->Equals(other->computation()); 2817 return computation()->Equals(other->computation());
2683 } 2818 }
2684 2819
2685 virtual LocationSummary* locs() { 2820 virtual LocationSummary* locs() {
2686 return computation()->locs(); 2821 return computation()->locs();
2687 } 2822 }
2688 2823
2689 virtual void EmitNativeCode(FlowGraphCompiler* compiler); 2824 virtual void EmitNativeCode(FlowGraphCompiler* compiler);
2690 2825
2691 // Insert this instruction before 'next'. 2826 // Insert this instruction before 'next'.
2692 void InsertBefore(BindInstr* next); 2827 void InsertBefore(Instruction* next);
2828
2829 // Insert this instruction after 'prev'.
2830 void InsertAfter(Instruction* prev);
2831
2832 virtual Representation representation() const {
2833 return computation()->representation();
2834 }
2693 2835
2694 private: 2836 private:
2695 Computation* computation_; 2837 Computation* computation_;
2696 const bool is_used_; 2838 const bool is_used_;
2697 2839
2698 DISALLOW_COPY_AND_ASSIGN(BindInstr); 2840 DISALLOW_COPY_AND_ASSIGN(BindInstr);
2699 }; 2841 };
2700 2842
2701 2843
2702 class PhiInstr : public Definition { 2844 class PhiInstr : public Definition {
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
3135 ForwardInstructionIterator* current_iterator_; 3277 ForwardInstructionIterator* current_iterator_;
3136 3278
3137 private: 3279 private:
3138 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); 3280 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor);
3139 }; 3281 };
3140 3282
3141 3283
3142 } // namespace dart 3284 } // namespace dart
3143 3285
3144 #endif // VM_INTERMEDIATE_LANGUAGE_H_ 3286 #endif // VM_INTERMEDIATE_LANGUAGE_H_
OLDNEW
« no previous file with comments | « runtime/vm/il_printer.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698