OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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" |
11 #include "vm/handles_impl.h" | 11 #include "vm/handles_impl.h" |
12 #include "vm/locations.h" | 12 #include "vm/locations.h" |
13 #include "vm/method_recognizer.h" | 13 #include "vm/method_recognizer.h" |
14 #include "vm/object.h" | 14 #include "vm/object.h" |
15 #include "vm/parser.h" | 15 #include "vm/parser.h" |
| 16 #include "vm/token_position.h" |
16 | 17 |
17 namespace dart { | 18 namespace dart { |
18 | 19 |
19 DECLARE_FLAG(bool, throw_on_javascript_int_overflow); | 20 DECLARE_FLAG(bool, throw_on_javascript_int_overflow); |
20 | 21 |
21 class BitVector; | 22 class BitVector; |
22 class BlockEntryInstr; | 23 class BlockEntryInstr; |
23 class BoxIntegerInstr; | 24 class BoxIntegerInstr; |
24 class BufferFormatter; | 25 class BufferFormatter; |
25 class CatchBlockEntryInstr; | 26 class CatchBlockEntryInstr; |
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 virtual Tag tag() const = 0; | 621 virtual Tag tag() const = 0; |
621 | 622 |
622 intptr_t deopt_id() const { | 623 intptr_t deopt_id() const { |
623 ASSERT(CanDeoptimize() || CanBecomeDeoptimizationTarget()); | 624 ASSERT(CanDeoptimize() || CanBecomeDeoptimizationTarget()); |
624 return GetDeoptId(); | 625 return GetDeoptId(); |
625 } | 626 } |
626 | 627 |
627 const ICData* GetICData( | 628 const ICData* GetICData( |
628 const ZoneGrowableArray<const ICData*>& ic_data_array) const; | 629 const ZoneGrowableArray<const ICData*>& ic_data_array) const; |
629 | 630 |
630 virtual intptr_t token_pos() const { return Token::kNoSourcePos; } | 631 virtual TokenPosition token_pos() const { |
| 632 return TokenPosition::kNoSource; |
| 633 } |
631 | 634 |
632 virtual intptr_t InputCount() const = 0; | 635 virtual intptr_t InputCount() const = 0; |
633 virtual Value* InputAt(intptr_t i) const = 0; | 636 virtual Value* InputAt(intptr_t i) const = 0; |
634 void SetInputAt(intptr_t i, Value* value) { | 637 void SetInputAt(intptr_t i, Value* value) { |
635 ASSERT(value != NULL); | 638 ASSERT(value != NULL); |
636 value->set_instruction(this); | 639 value->set_instruction(this); |
637 value->set_use_index(i); | 640 value->set_use_index(i); |
638 RawSetInputAt(i, value); | 641 RawSetInputAt(i, value); |
639 } | 642 } |
640 | 643 |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1046 } | 1049 } |
1047 | 1050 |
1048 MoveOperands* MoveOperandsAt(intptr_t index) const { return moves_[index]; } | 1051 MoveOperands* MoveOperandsAt(intptr_t index) const { return moves_[index]; } |
1049 | 1052 |
1050 intptr_t NumMoves() const { return moves_.length(); } | 1053 intptr_t NumMoves() const { return moves_.length(); } |
1051 | 1054 |
1052 bool IsRedundant() const; | 1055 bool IsRedundant() const; |
1053 | 1056 |
1054 virtual void PrintTo(BufferFormatter* f) const; | 1057 virtual void PrintTo(BufferFormatter* f) const; |
1055 | 1058 |
1056 virtual intptr_t token_pos() const { | 1059 virtual TokenPosition token_pos() const { |
1057 return ClassifyingTokenPositions::kParallelMove; | 1060 return TokenPosition::kParallelMove; |
1058 } | 1061 } |
1059 | 1062 |
1060 private: | 1063 private: |
1061 GrowableArray<MoveOperands*> moves_; // Elements cannot be null. | 1064 GrowableArray<MoveOperands*> moves_; // Elements cannot be null. |
1062 | 1065 |
1063 DISALLOW_COPY_AND_ASSIGN(ParallelMoveInstr); | 1066 DISALLOW_COPY_AND_ASSIGN(ParallelMoveInstr); |
1064 }; | 1067 }; |
1065 | 1068 |
1066 | 1069 |
1067 // Basic block entries are administrative nodes. There is a distinguished | 1070 // Basic block entries are administrative nodes. There is a distinguished |
1068 // graph entry with no predecessor. Joins are the only nodes with multiple | 1071 // graph entry with no predecessor. Joins are the only nodes with multiple |
1069 // predecessors. Targets are all other basic block entries. The types | 1072 // predecessors. Targets are all other basic block entries. The types |
1070 // enforce edge-split form---joins are forbidden as the successors of | 1073 // enforce edge-split form---joins are forbidden as the successors of |
1071 // branches. | 1074 // branches. |
1072 class BlockEntryInstr : public Instruction { | 1075 class BlockEntryInstr : public Instruction { |
1073 public: | 1076 public: |
1074 virtual intptr_t PredecessorCount() const = 0; | 1077 virtual intptr_t PredecessorCount() const = 0; |
1075 virtual BlockEntryInstr* PredecessorAt(intptr_t index) const = 0; | 1078 virtual BlockEntryInstr* PredecessorAt(intptr_t index) const = 0; |
1076 | 1079 |
1077 intptr_t preorder_number() const { return preorder_number_; } | 1080 intptr_t preorder_number() const { return preorder_number_; } |
1078 void set_preorder_number(intptr_t number) { preorder_number_ = number; } | 1081 void set_preorder_number(intptr_t number) { preorder_number_ = number; } |
1079 | 1082 |
1080 intptr_t postorder_number() const { return postorder_number_; } | 1083 intptr_t postorder_number() const { return postorder_number_; } |
1081 void set_postorder_number(intptr_t number) { postorder_number_ = number; } | 1084 void set_postorder_number(intptr_t number) { postorder_number_ = number; } |
1082 | 1085 |
1083 intptr_t block_id() const { return block_id_; } | 1086 intptr_t block_id() const { return block_id_; } |
1084 | 1087 |
| 1088 // NOTE: These are SSA positions and not token positions. These are used by |
| 1089 // the register allocator. |
1085 void set_start_pos(intptr_t pos) { start_pos_ = pos; } | 1090 void set_start_pos(intptr_t pos) { start_pos_ = pos; } |
1086 intptr_t start_pos() const { return start_pos_; } | 1091 intptr_t start_pos() const { return start_pos_; } |
1087 void set_end_pos(intptr_t pos) { end_pos_ = pos; } | 1092 void set_end_pos(intptr_t pos) { end_pos_ = pos; } |
1088 intptr_t end_pos() const { return end_pos_; } | 1093 intptr_t end_pos() const { return end_pos_; } |
1089 | 1094 |
1090 BlockEntryInstr* dominator() const { return dominator_; } | 1095 BlockEntryInstr* dominator() const { return dominator_; } |
1091 BlockEntryInstr* ImmediateDominator() const; | 1096 BlockEntryInstr* ImmediateDominator() const; |
1092 | 1097 |
1093 const GrowableArray<BlockEntryInstr*>& dominated_blocks() { | 1098 const GrowableArray<BlockEntryInstr*>& dominated_blocks() { |
1094 return dominated_blocks_; | 1099 return dominated_blocks_; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1182 | 1187 |
1183 BitVector* loop_info() const { return loop_info_; } | 1188 BitVector* loop_info() const { return loop_info_; } |
1184 void set_loop_info(BitVector* loop_info) { | 1189 void set_loop_info(BitVector* loop_info) { |
1185 loop_info_ = loop_info; | 1190 loop_info_ = loop_info; |
1186 } | 1191 } |
1187 | 1192 |
1188 virtual BlockEntryInstr* GetBlock() { | 1193 virtual BlockEntryInstr* GetBlock() { |
1189 return this; | 1194 return this; |
1190 } | 1195 } |
1191 | 1196 |
1192 virtual intptr_t token_pos() const { | 1197 virtual TokenPosition token_pos() const { |
1193 return ClassifyingTokenPositions::kControlFlow; | 1198 return TokenPosition::kControlFlow; |
1194 } | 1199 } |
1195 | 1200 |
1196 // Helper to mutate the graph during inlining. This block should be | 1201 // Helper to mutate the graph during inlining. This block should be |
1197 // replaced with new_block as a predecessor of all of this block's | 1202 // replaced with new_block as a predecessor of all of this block's |
1198 // successors. | 1203 // successors. |
1199 void ReplaceAsPredecessorWith(BlockEntryInstr* new_block); | 1204 void ReplaceAsPredecessorWith(BlockEntryInstr* new_block); |
1200 | 1205 |
1201 void set_block_id(intptr_t block_id) { block_id_ = block_id; } | 1206 void set_block_id(intptr_t block_id) { block_id_ = block_id; } |
1202 | 1207 |
1203 intptr_t offset() const { return offset_; } | 1208 intptr_t offset() const { return offset_; } |
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2035 virtual CompileType ComputeType() const; | 2040 virtual CompileType ComputeType() const; |
2036 | 2041 |
2037 Value* value() const { return InputAt(0); } | 2042 Value* value() const { return InputAt(0); } |
2038 | 2043 |
2039 virtual bool CanDeoptimize() const { return false; } | 2044 virtual bool CanDeoptimize() const { return false; } |
2040 | 2045 |
2041 virtual EffectSet Effects() const { return EffectSet::None(); } | 2046 virtual EffectSet Effects() const { return EffectSet::None(); } |
2042 | 2047 |
2043 virtual void PrintOperandsTo(BufferFormatter* f) const; | 2048 virtual void PrintOperandsTo(BufferFormatter* f) const; |
2044 | 2049 |
2045 virtual intptr_t token_pos() const { | 2050 virtual TokenPosition token_pos() const { |
2046 return ClassifyingTokenPositions::kPushArgument; | 2051 return TokenPosition::kPushArgument; |
2047 } | 2052 } |
2048 | 2053 |
2049 private: | 2054 private: |
2050 DISALLOW_COPY_AND_ASSIGN(PushArgumentInstr); | 2055 DISALLOW_COPY_AND_ASSIGN(PushArgumentInstr); |
2051 }; | 2056 }; |
2052 | 2057 |
2053 | 2058 |
2054 inline Definition* Instruction::ArgumentAt(intptr_t index) const { | 2059 inline Definition* Instruction::ArgumentAt(intptr_t index) const { |
2055 return PushArgumentAt(index)->value()->definition(); | 2060 return PushArgumentAt(index)->value()->definition(); |
2056 } | 2061 } |
2057 | 2062 |
2058 | 2063 |
2059 class ReturnInstr : public TemplateInstruction<1, NoThrow> { | 2064 class ReturnInstr : public TemplateInstruction<1, NoThrow> { |
2060 public: | 2065 public: |
2061 ReturnInstr(intptr_t token_pos, Value* value) | 2066 ReturnInstr(TokenPosition token_pos, Value* value) |
2062 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), | 2067 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), |
2063 token_pos_(token_pos) { | 2068 token_pos_(token_pos) { |
2064 SetInputAt(0, value); | 2069 SetInputAt(0, value); |
2065 } | 2070 } |
2066 | 2071 |
2067 DECLARE_INSTRUCTION(Return) | 2072 DECLARE_INSTRUCTION(Return) |
2068 | 2073 |
2069 virtual intptr_t token_pos() const { return token_pos_; } | 2074 virtual TokenPosition token_pos() const { return token_pos_; } |
2070 Value* value() const { return inputs_[0]; } | 2075 Value* value() const { return inputs_[0]; } |
2071 | 2076 |
2072 virtual bool CanBecomeDeoptimizationTarget() const { | 2077 virtual bool CanBecomeDeoptimizationTarget() const { |
2073 // Return instruction might turn into a Goto instruction after inlining. | 2078 // Return instruction might turn into a Goto instruction after inlining. |
2074 // Every Goto must have an environment. | 2079 // Every Goto must have an environment. |
2075 return true; | 2080 return true; |
2076 } | 2081 } |
2077 | 2082 |
2078 virtual bool CanDeoptimize() const { return false; } | 2083 virtual bool CanDeoptimize() const { return false; } |
2079 | 2084 |
2080 virtual EffectSet Effects() const { return EffectSet::None(); } | 2085 virtual EffectSet Effects() const { return EffectSet::None(); } |
2081 | 2086 |
2082 private: | 2087 private: |
2083 const intptr_t token_pos_; | 2088 const TokenPosition token_pos_; |
2084 | 2089 |
2085 DISALLOW_COPY_AND_ASSIGN(ReturnInstr); | 2090 DISALLOW_COPY_AND_ASSIGN(ReturnInstr); |
2086 }; | 2091 }; |
2087 | 2092 |
2088 | 2093 |
2089 class ThrowInstr : public TemplateInstruction<0, Throws> { | 2094 class ThrowInstr : public TemplateInstruction<0, Throws> { |
2090 public: | 2095 public: |
2091 explicit ThrowInstr(intptr_t token_pos) | 2096 explicit ThrowInstr(TokenPosition token_pos) |
2092 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), | 2097 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), |
2093 token_pos_(token_pos) { | 2098 token_pos_(token_pos) { |
2094 } | 2099 } |
2095 | 2100 |
2096 DECLARE_INSTRUCTION(Throw) | 2101 DECLARE_INSTRUCTION(Throw) |
2097 | 2102 |
2098 virtual intptr_t ArgumentCount() const { return 1; } | 2103 virtual intptr_t ArgumentCount() const { return 1; } |
2099 | 2104 |
2100 virtual intptr_t token_pos() const { return token_pos_; } | 2105 virtual TokenPosition token_pos() const { return token_pos_; } |
2101 | 2106 |
2102 virtual bool CanDeoptimize() const { return true; } | 2107 virtual bool CanDeoptimize() const { return true; } |
2103 | 2108 |
2104 virtual EffectSet Effects() const { return EffectSet::None(); } | 2109 virtual EffectSet Effects() const { return EffectSet::None(); } |
2105 | 2110 |
2106 private: | 2111 private: |
2107 const intptr_t token_pos_; | 2112 const TokenPosition token_pos_; |
2108 | 2113 |
2109 DISALLOW_COPY_AND_ASSIGN(ThrowInstr); | 2114 DISALLOW_COPY_AND_ASSIGN(ThrowInstr); |
2110 }; | 2115 }; |
2111 | 2116 |
2112 | 2117 |
2113 class ReThrowInstr : public TemplateInstruction<0, Throws> { | 2118 class ReThrowInstr : public TemplateInstruction<0, Throws> { |
2114 public: | 2119 public: |
2115 // 'catch_try_index' can be CatchClauseNode::kInvalidTryIndex if the | 2120 // 'catch_try_index' can be CatchClauseNode::kInvalidTryIndex if the |
2116 // rethrow has been artifically generated by the parser. | 2121 // rethrow has been artifically generated by the parser. |
2117 ReThrowInstr(intptr_t token_pos, intptr_t catch_try_index) | 2122 ReThrowInstr(TokenPosition token_pos, intptr_t catch_try_index) |
2118 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), | 2123 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), |
2119 token_pos_(token_pos), | 2124 token_pos_(token_pos), |
2120 catch_try_index_(catch_try_index) { | 2125 catch_try_index_(catch_try_index) { |
2121 } | 2126 } |
2122 | 2127 |
2123 DECLARE_INSTRUCTION(ReThrow) | 2128 DECLARE_INSTRUCTION(ReThrow) |
2124 | 2129 |
2125 virtual intptr_t ArgumentCount() const { return 2; } | 2130 virtual intptr_t ArgumentCount() const { return 2; } |
2126 | 2131 |
2127 virtual intptr_t token_pos() const { return token_pos_; } | 2132 virtual TokenPosition token_pos() const { return token_pos_; } |
2128 intptr_t catch_try_index() const { return catch_try_index_; } | 2133 intptr_t catch_try_index() const { return catch_try_index_; } |
2129 | 2134 |
2130 virtual bool CanDeoptimize() const { return true; } | 2135 virtual bool CanDeoptimize() const { return true; } |
2131 | 2136 |
2132 virtual EffectSet Effects() const { return EffectSet::None(); } | 2137 virtual EffectSet Effects() const { return EffectSet::None(); } |
2133 | 2138 |
2134 private: | 2139 private: |
2135 const intptr_t token_pos_; | 2140 const TokenPosition token_pos_; |
2136 const intptr_t catch_try_index_; | 2141 const intptr_t catch_try_index_; |
2137 | 2142 |
2138 DISALLOW_COPY_AND_ASSIGN(ReThrowInstr); | 2143 DISALLOW_COPY_AND_ASSIGN(ReThrowInstr); |
2139 }; | 2144 }; |
2140 | 2145 |
2141 | 2146 |
2142 class StopInstr : public TemplateInstruction<0, NoThrow> { | 2147 class StopInstr : public TemplateInstruction<0, NoThrow> { |
2143 public: | 2148 public: |
2144 explicit StopInstr(const char* message) | 2149 explicit StopInstr(const char* message) |
2145 : message_(message) { | 2150 : message_(message) { |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2213 | 2218 |
2214 ParallelMoveInstr* GetParallelMove() { | 2219 ParallelMoveInstr* GetParallelMove() { |
2215 if (parallel_move_ == NULL) { | 2220 if (parallel_move_ == NULL) { |
2216 parallel_move_ = new ParallelMoveInstr(); | 2221 parallel_move_ = new ParallelMoveInstr(); |
2217 } | 2222 } |
2218 return parallel_move_; | 2223 return parallel_move_; |
2219 } | 2224 } |
2220 | 2225 |
2221 virtual void PrintTo(BufferFormatter* f) const; | 2226 virtual void PrintTo(BufferFormatter* f) const; |
2222 | 2227 |
2223 virtual intptr_t token_pos() const { | 2228 virtual TokenPosition token_pos() const { |
2224 return ClassifyingTokenPositions::kControlFlow; | 2229 return TokenPosition::kControlFlow; |
2225 } | 2230 } |
2226 | 2231 |
2227 private: | 2232 private: |
2228 BlockEntryInstr* block_; | 2233 BlockEntryInstr* block_; |
2229 JoinEntryInstr* successor_; | 2234 JoinEntryInstr* successor_; |
2230 double edge_weight_; | 2235 double edge_weight_; |
2231 | 2236 |
2232 // Parallel move that will be used by linear scan register allocator to | 2237 // Parallel move that will be used by linear scan register allocator to |
2233 // connect live ranges at the end of the block and resolve phis. | 2238 // connect live ranges at the end of the block and resolve phis. |
2234 ParallelMoveInstr* parallel_move_; | 2239 ParallelMoveInstr* parallel_move_; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2290 GrowableArray<TargetEntryInstr*> successors_; | 2295 GrowableArray<TargetEntryInstr*> successors_; |
2291 TypedData& offsets_; | 2296 TypedData& offsets_; |
2292 }; | 2297 }; |
2293 | 2298 |
2294 | 2299 |
2295 class ComparisonInstr : public TemplateDefinition<2, NoThrow, Pure> { | 2300 class ComparisonInstr : public TemplateDefinition<2, NoThrow, Pure> { |
2296 public: | 2301 public: |
2297 Value* left() const { return inputs_[0]; } | 2302 Value* left() const { return inputs_[0]; } |
2298 Value* right() const { return inputs_[1]; } | 2303 Value* right() const { return inputs_[1]; } |
2299 | 2304 |
2300 virtual intptr_t token_pos() const { return token_pos_; } | 2305 virtual TokenPosition token_pos() const { return token_pos_; } |
2301 Token::Kind kind() const { return kind_; } | 2306 Token::Kind kind() const { return kind_; } |
2302 | 2307 |
2303 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right) = 0; | 2308 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right) = 0; |
2304 | 2309 |
2305 virtual void EmitBranchCode(FlowGraphCompiler* compiler, | 2310 virtual void EmitBranchCode(FlowGraphCompiler* compiler, |
2306 BranchInstr* branch) = 0; | 2311 BranchInstr* branch) = 0; |
2307 | 2312 |
2308 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, | 2313 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, |
2309 BranchLabels labels) = 0; | 2314 BranchLabels labels) = 0; |
2310 | 2315 |
(...skipping 14 matching lines...) Expand all Loading... |
2325 | 2330 |
2326 virtual bool AttributesEqual(Instruction* other) const { | 2331 virtual bool AttributesEqual(Instruction* other) const { |
2327 ComparisonInstr* other_comparison = other->AsComparison(); | 2332 ComparisonInstr* other_comparison = other->AsComparison(); |
2328 return kind() == other_comparison->kind() && | 2333 return kind() == other_comparison->kind() && |
2329 (operation_cid() == other_comparison->operation_cid()); | 2334 (operation_cid() == other_comparison->operation_cid()); |
2330 } | 2335 } |
2331 | 2336 |
2332 DEFINE_INSTRUCTION_TYPE_CHECK(Comparison) | 2337 DEFINE_INSTRUCTION_TYPE_CHECK(Comparison) |
2333 | 2338 |
2334 protected: | 2339 protected: |
2335 ComparisonInstr(intptr_t token_pos, | 2340 ComparisonInstr(TokenPosition token_pos, |
2336 Token::Kind kind, | 2341 Token::Kind kind, |
2337 Value* left, | 2342 Value* left, |
2338 Value* right, | 2343 Value* right, |
2339 intptr_t deopt_id = Thread::kNoDeoptId) | 2344 intptr_t deopt_id = Thread::kNoDeoptId) |
2340 : TemplateDefinition(deopt_id), | 2345 : TemplateDefinition(deopt_id), |
2341 token_pos_(token_pos), | 2346 token_pos_(token_pos), |
2342 kind_(kind), | 2347 kind_(kind), |
2343 operation_cid_(kIllegalCid) { | 2348 operation_cid_(kIllegalCid) { |
2344 SetInputAt(0, left); | 2349 SetInputAt(0, left); |
2345 if (right != NULL) { | 2350 if (right != NULL) { |
2346 SetInputAt(1, right); | 2351 SetInputAt(1, right); |
2347 } | 2352 } |
2348 } | 2353 } |
2349 | 2354 |
2350 private: | 2355 private: |
2351 const intptr_t token_pos_; | 2356 const TokenPosition token_pos_; |
2352 Token::Kind kind_; | 2357 Token::Kind kind_; |
2353 intptr_t operation_cid_; // Set by optimizer. | 2358 intptr_t operation_cid_; // Set by optimizer. |
2354 | 2359 |
2355 DISALLOW_COPY_AND_ASSIGN(ComparisonInstr); | 2360 DISALLOW_COPY_AND_ASSIGN(ComparisonInstr); |
2356 }; | 2361 }; |
2357 | 2362 |
2358 | 2363 |
2359 class BranchInstr : public Instruction { | 2364 class BranchInstr : public Instruction { |
2360 public: | 2365 public: |
2361 explicit BranchInstr(ComparisonInstr* comparison) | 2366 explicit BranchInstr(ComparisonInstr* comparison) |
(...skipping 11 matching lines...) Expand all Loading... |
2373 DECLARE_INSTRUCTION(Branch) | 2378 DECLARE_INSTRUCTION(Branch) |
2374 | 2379 |
2375 virtual intptr_t ArgumentCount() const { | 2380 virtual intptr_t ArgumentCount() const { |
2376 return comparison()->ArgumentCount(); | 2381 return comparison()->ArgumentCount(); |
2377 } | 2382 } |
2378 | 2383 |
2379 intptr_t InputCount() const { return comparison()->InputCount(); } | 2384 intptr_t InputCount() const { return comparison()->InputCount(); } |
2380 | 2385 |
2381 Value* InputAt(intptr_t i) const { return comparison()->InputAt(i); } | 2386 Value* InputAt(intptr_t i) const { return comparison()->InputAt(i); } |
2382 | 2387 |
2383 virtual intptr_t token_pos() const { return comparison_->token_pos(); } | 2388 virtual TokenPosition token_pos() const { return comparison_->token_pos(); } |
2384 | 2389 |
2385 virtual bool CanDeoptimize() const { | 2390 virtual bool CanDeoptimize() const { |
2386 // Branches need a deoptimization info in checked mode if they | 2391 // Branches need a deoptimization info in checked mode if they |
2387 // can throw a type check error. | 2392 // can throw a type check error. |
2388 return comparison()->CanDeoptimize() || is_checked(); | 2393 return comparison()->CanDeoptimize() || is_checked(); |
2389 } | 2394 } |
2390 | 2395 |
2391 virtual bool CanBecomeDeoptimizationTarget() const { | 2396 virtual bool CanBecomeDeoptimizationTarget() const { |
2392 return comparison()->CanBecomeDeoptimizationTarget(); | 2397 return comparison()->CanBecomeDeoptimizationTarget(); |
2393 } | 2398 } |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2551 Range* constraint_; | 2556 Range* constraint_; |
2552 TargetEntryInstr* target_; | 2557 TargetEntryInstr* target_; |
2553 | 2558 |
2554 DISALLOW_COPY_AND_ASSIGN(ConstraintInstr); | 2559 DISALLOW_COPY_AND_ASSIGN(ConstraintInstr); |
2555 }; | 2560 }; |
2556 | 2561 |
2557 | 2562 |
2558 class ConstantInstr : public TemplateDefinition<0, NoThrow, Pure> { | 2563 class ConstantInstr : public TemplateDefinition<0, NoThrow, Pure> { |
2559 public: | 2564 public: |
2560 ConstantInstr(const Object& value, | 2565 ConstantInstr(const Object& value, |
2561 intptr_t token_pos = ClassifyingTokenPositions::kConstant); | 2566 TokenPosition token_pos = TokenPosition::kConstant); |
2562 | 2567 |
2563 DECLARE_INSTRUCTION(Constant) | 2568 DECLARE_INSTRUCTION(Constant) |
2564 virtual CompileType ComputeType() const; | 2569 virtual CompileType ComputeType() const; |
2565 | 2570 |
2566 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 2571 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
2567 | 2572 |
2568 const Object& value() const { return value_; } | 2573 const Object& value() const { return value_; } |
2569 | 2574 |
2570 virtual void PrintOperandsTo(BufferFormatter* f) const; | 2575 virtual void PrintOperandsTo(BufferFormatter* f) const; |
2571 | 2576 |
2572 virtual bool CanDeoptimize() const { return false; } | 2577 virtual bool CanDeoptimize() const { return false; } |
2573 | 2578 |
2574 virtual void InferRange(RangeAnalysis* analysis, Range* range); | 2579 virtual void InferRange(RangeAnalysis* analysis, Range* range); |
2575 | 2580 |
2576 virtual bool AttributesEqual(Instruction* other) const; | 2581 virtual bool AttributesEqual(Instruction* other) const; |
2577 | 2582 |
2578 virtual intptr_t token_pos() const { return token_pos_; } | 2583 virtual TokenPosition token_pos() const { return token_pos_; } |
2579 | 2584 |
2580 private: | 2585 private: |
2581 const Object& value_; | 2586 const Object& value_; |
2582 const intptr_t token_pos_; | 2587 const TokenPosition token_pos_; |
2583 | 2588 |
2584 DISALLOW_COPY_AND_ASSIGN(ConstantInstr); | 2589 DISALLOW_COPY_AND_ASSIGN(ConstantInstr); |
2585 }; | 2590 }; |
2586 | 2591 |
2587 | 2592 |
2588 // Merged ConstantInstr -> UnboxedXXX into UnboxedConstantInstr. | 2593 // Merged ConstantInstr -> UnboxedXXX into UnboxedConstantInstr. |
2589 // TODO(srdjan): Implemented currently for doubles only, should implement | 2594 // TODO(srdjan): Implemented currently for doubles only, should implement |
2590 // for other unboxing instructions. | 2595 // for other unboxing instructions. |
2591 class UnboxedConstantInstr : public ConstantInstr { | 2596 class UnboxedConstantInstr : public ConstantInstr { |
2592 public: | 2597 public: |
(...skipping 12 matching lines...) Expand all Loading... |
2605 private: | 2610 private: |
2606 const Representation representation_; | 2611 const Representation representation_; |
2607 uword constant_address_; // Either NULL or points to the untagged constant. | 2612 uword constant_address_; // Either NULL or points to the untagged constant. |
2608 | 2613 |
2609 DISALLOW_COPY_AND_ASSIGN(UnboxedConstantInstr); | 2614 DISALLOW_COPY_AND_ASSIGN(UnboxedConstantInstr); |
2610 }; | 2615 }; |
2611 | 2616 |
2612 | 2617 |
2613 class AssertAssignableInstr : public TemplateDefinition<2, Throws, Pure> { | 2618 class AssertAssignableInstr : public TemplateDefinition<2, Throws, Pure> { |
2614 public: | 2619 public: |
2615 AssertAssignableInstr(intptr_t token_pos, | 2620 AssertAssignableInstr(TokenPosition token_pos, |
2616 Value* value, | 2621 Value* value, |
2617 Value* instantiator_type_arguments, | 2622 Value* instantiator_type_arguments, |
2618 const AbstractType& dst_type, | 2623 const AbstractType& dst_type, |
2619 const String& dst_name, | 2624 const String& dst_name, |
2620 intptr_t deopt_id) | 2625 intptr_t deopt_id) |
2621 : TemplateDefinition(deopt_id), | 2626 : TemplateDefinition(deopt_id), |
2622 token_pos_(token_pos), | 2627 token_pos_(token_pos), |
2623 dst_type_(AbstractType::ZoneHandle(dst_type.raw())), | 2628 dst_type_(AbstractType::ZoneHandle(dst_type.raw())), |
2624 dst_name_(dst_name) { | 2629 dst_name_(dst_name) { |
2625 ASSERT(!dst_type.IsNull()); | 2630 ASSERT(!dst_type.IsNull()); |
2626 ASSERT(!dst_name.IsNull()); | 2631 ASSERT(!dst_name.IsNull()); |
2627 SetInputAt(0, value); | 2632 SetInputAt(0, value); |
2628 SetInputAt(1, instantiator_type_arguments); | 2633 SetInputAt(1, instantiator_type_arguments); |
2629 } | 2634 } |
2630 | 2635 |
2631 DECLARE_INSTRUCTION(AssertAssignable) | 2636 DECLARE_INSTRUCTION(AssertAssignable) |
2632 virtual CompileType ComputeType() const; | 2637 virtual CompileType ComputeType() const; |
2633 virtual bool RecomputeType(); | 2638 virtual bool RecomputeType(); |
2634 | 2639 |
2635 Value* value() const { return inputs_[0]; } | 2640 Value* value() const { return inputs_[0]; } |
2636 Value* instantiator_type_arguments() const { return inputs_[1]; } | 2641 Value* instantiator_type_arguments() const { return inputs_[1]; } |
2637 | 2642 |
2638 virtual intptr_t token_pos() const { return token_pos_; } | 2643 virtual TokenPosition token_pos() const { return token_pos_; } |
2639 const AbstractType& dst_type() const { return dst_type_; } | 2644 const AbstractType& dst_type() const { return dst_type_; } |
2640 void set_dst_type(const AbstractType& dst_type) { | 2645 void set_dst_type(const AbstractType& dst_type) { |
2641 dst_type_ = dst_type.raw(); | 2646 dst_type_ = dst_type.raw(); |
2642 } | 2647 } |
2643 const String& dst_name() const { return dst_name_; } | 2648 const String& dst_name() const { return dst_name_; } |
2644 | 2649 |
2645 virtual void PrintOperandsTo(BufferFormatter* f) const; | 2650 virtual void PrintOperandsTo(BufferFormatter* f) const; |
2646 | 2651 |
2647 virtual bool CanDeoptimize() const { return true; } | 2652 virtual bool CanDeoptimize() const { return true; } |
2648 | 2653 |
2649 virtual bool CanBecomeDeoptimizationTarget() const { | 2654 virtual bool CanBecomeDeoptimizationTarget() const { |
2650 // AssertAssignable instructions that are specialized by the optimizer | 2655 // AssertAssignable instructions that are specialized by the optimizer |
2651 // (e.g. replaced with CheckClass) need a deoptimization descriptor before. | 2656 // (e.g. replaced with CheckClass) need a deoptimization descriptor before. |
2652 return true; | 2657 return true; |
2653 } | 2658 } |
2654 | 2659 |
2655 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 2660 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
2656 | 2661 |
2657 virtual bool AttributesEqual(Instruction* other) const; | 2662 virtual bool AttributesEqual(Instruction* other) const; |
2658 | 2663 |
2659 private: | 2664 private: |
2660 const intptr_t token_pos_; | 2665 const TokenPosition token_pos_; |
2661 AbstractType& dst_type_; | 2666 AbstractType& dst_type_; |
2662 const String& dst_name_; | 2667 const String& dst_name_; |
2663 | 2668 |
2664 DISALLOW_COPY_AND_ASSIGN(AssertAssignableInstr); | 2669 DISALLOW_COPY_AND_ASSIGN(AssertAssignableInstr); |
2665 }; | 2670 }; |
2666 | 2671 |
2667 | 2672 |
2668 class AssertBooleanInstr : public TemplateDefinition<1, Throws, Pure> { | 2673 class AssertBooleanInstr : public TemplateDefinition<1, Throws, Pure> { |
2669 public: | 2674 public: |
2670 AssertBooleanInstr(intptr_t token_pos, Value* value) | 2675 AssertBooleanInstr(TokenPosition token_pos, Value* value) |
2671 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 2676 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), |
2672 token_pos_(token_pos) { | 2677 token_pos_(token_pos) { |
2673 SetInputAt(0, value); | 2678 SetInputAt(0, value); |
2674 } | 2679 } |
2675 | 2680 |
2676 DECLARE_INSTRUCTION(AssertBoolean) | 2681 DECLARE_INSTRUCTION(AssertBoolean) |
2677 virtual CompileType ComputeType() const; | 2682 virtual CompileType ComputeType() const; |
2678 | 2683 |
2679 virtual intptr_t token_pos() const { return token_pos_; } | 2684 virtual TokenPosition token_pos() const { return token_pos_; } |
2680 Value* value() const { return inputs_[0]; } | 2685 Value* value() const { return inputs_[0]; } |
2681 | 2686 |
2682 virtual void PrintOperandsTo(BufferFormatter* f) const; | 2687 virtual void PrintOperandsTo(BufferFormatter* f) const; |
2683 | 2688 |
2684 virtual bool CanDeoptimize() const { return true; } | 2689 virtual bool CanDeoptimize() const { return true; } |
2685 | 2690 |
2686 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 2691 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
2687 | 2692 |
2688 virtual bool AttributesEqual(Instruction* other) const { return true; } | 2693 virtual bool AttributesEqual(Instruction* other) const { return true; } |
2689 | 2694 |
2690 private: | 2695 private: |
2691 const intptr_t token_pos_; | 2696 const TokenPosition token_pos_; |
2692 | 2697 |
2693 DISALLOW_COPY_AND_ASSIGN(AssertBooleanInstr); | 2698 DISALLOW_COPY_AND_ASSIGN(AssertBooleanInstr); |
2694 }; | 2699 }; |
2695 | 2700 |
2696 | 2701 |
2697 // Denotes the current context, normally held in a register. This is | 2702 // Denotes the current context, normally held in a register. This is |
2698 // a computation, not a value, because it's mutable. | 2703 // a computation, not a value, because it's mutable. |
2699 class CurrentContextInstr : public TemplateDefinition<0, NoThrow> { | 2704 class CurrentContextInstr : public TemplateDefinition<0, NoThrow> { |
2700 public: | 2705 public: |
2701 CurrentContextInstr() | 2706 CurrentContextInstr() |
(...skipping 21 matching lines...) Expand all Loading... |
2723 ZoneGrowableArray<PushArgumentInstr*>* arguments) | 2728 ZoneGrowableArray<PushArgumentInstr*>* arguments) |
2724 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 2729 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), |
2725 ast_node_(*node), | 2730 ast_node_(*node), |
2726 arguments_(arguments) { | 2731 arguments_(arguments) { |
2727 SetInputAt(0, function); | 2732 SetInputAt(0, function); |
2728 } | 2733 } |
2729 | 2734 |
2730 DECLARE_INSTRUCTION(ClosureCall) | 2735 DECLARE_INSTRUCTION(ClosureCall) |
2731 | 2736 |
2732 const Array& argument_names() const { return ast_node_.arguments()->names(); } | 2737 const Array& argument_names() const { return ast_node_.arguments()->names(); } |
2733 virtual intptr_t token_pos() const { return ast_node_.token_pos(); } | 2738 virtual TokenPosition token_pos() const { |
| 2739 return ast_node_.token_pos(); |
| 2740 } |
2734 | 2741 |
2735 virtual intptr_t ArgumentCount() const { return arguments_->length(); } | 2742 virtual intptr_t ArgumentCount() const { return arguments_->length(); } |
2736 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { | 2743 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { |
2737 return (*arguments_)[index]; | 2744 return (*arguments_)[index]; |
2738 } | 2745 } |
2739 | 2746 |
2740 // TODO(kmillikin): implement exact call counts for closure calls. | 2747 // TODO(kmillikin): implement exact call counts for closure calls. |
2741 virtual intptr_t CallCount() const { return 1; } | 2748 virtual intptr_t CallCount() const { return 1; } |
2742 | 2749 |
2743 virtual void PrintOperandsTo(BufferFormatter* f) const; | 2750 virtual void PrintOperandsTo(BufferFormatter* f) const; |
2744 | 2751 |
2745 virtual bool CanDeoptimize() const { return true; } | 2752 virtual bool CanDeoptimize() const { return true; } |
2746 | 2753 |
2747 virtual EffectSet Effects() const { return EffectSet::All(); } | 2754 virtual EffectSet Effects() const { return EffectSet::All(); } |
2748 | 2755 |
2749 private: | 2756 private: |
2750 const ClosureCallNode& ast_node_; | 2757 const ClosureCallNode& ast_node_; |
2751 ZoneGrowableArray<PushArgumentInstr*>* arguments_; | 2758 ZoneGrowableArray<PushArgumentInstr*>* arguments_; |
2752 | 2759 |
2753 DISALLOW_COPY_AND_ASSIGN(ClosureCallInstr); | 2760 DISALLOW_COPY_AND_ASSIGN(ClosureCallInstr); |
2754 }; | 2761 }; |
2755 | 2762 |
2756 | 2763 |
2757 class InstanceCallInstr : public TemplateDefinition<0, Throws> { | 2764 class InstanceCallInstr : public TemplateDefinition<0, Throws> { |
2758 public: | 2765 public: |
2759 InstanceCallInstr(intptr_t token_pos, | 2766 InstanceCallInstr(TokenPosition token_pos, |
2760 const String& function_name, | 2767 const String& function_name, |
2761 Token::Kind token_kind, | 2768 Token::Kind token_kind, |
2762 ZoneGrowableArray<PushArgumentInstr*>* arguments, | 2769 ZoneGrowableArray<PushArgumentInstr*>* arguments, |
2763 const Array& argument_names, | 2770 const Array& argument_names, |
2764 intptr_t checked_argument_count, | 2771 intptr_t checked_argument_count, |
2765 const ZoneGrowableArray<const ICData*>& ic_data_array) | 2772 const ZoneGrowableArray<const ICData*>& ic_data_array) |
2766 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 2773 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), |
2767 ic_data_(NULL), | 2774 ic_data_(NULL), |
2768 token_pos_(token_pos), | 2775 token_pos_(token_pos), |
2769 function_name_(function_name), | 2776 function_name_(function_name), |
(...skipping 20 matching lines...) Expand all Loading... |
2790 DECLARE_INSTRUCTION(InstanceCall) | 2797 DECLARE_INSTRUCTION(InstanceCall) |
2791 | 2798 |
2792 const ICData* ic_data() const { return ic_data_; } | 2799 const ICData* ic_data() const { return ic_data_; } |
2793 bool HasICData() const { | 2800 bool HasICData() const { |
2794 return (ic_data() != NULL) && !ic_data()->IsNull(); | 2801 return (ic_data() != NULL) && !ic_data()->IsNull(); |
2795 } | 2802 } |
2796 | 2803 |
2797 // ICData can be replaced by optimizer. | 2804 // ICData can be replaced by optimizer. |
2798 void set_ic_data(const ICData* value) { ic_data_ = value; } | 2805 void set_ic_data(const ICData* value) { ic_data_ = value; } |
2799 | 2806 |
2800 virtual intptr_t token_pos() const { return token_pos_; } | 2807 virtual TokenPosition token_pos() const { return token_pos_; } |
2801 const String& function_name() const { return function_name_; } | 2808 const String& function_name() const { return function_name_; } |
2802 Token::Kind token_kind() const { return token_kind_; } | 2809 Token::Kind token_kind() const { return token_kind_; } |
2803 virtual intptr_t ArgumentCount() const { return arguments_->length(); } | 2810 virtual intptr_t ArgumentCount() const { return arguments_->length(); } |
2804 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { | 2811 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { |
2805 return (*arguments_)[index]; | 2812 return (*arguments_)[index]; |
2806 } | 2813 } |
2807 const Array& argument_names() const { return argument_names_; } | 2814 const Array& argument_names() const { return argument_names_; } |
2808 intptr_t checked_argument_count() const { return checked_argument_count_; } | 2815 intptr_t checked_argument_count() const { return checked_argument_count_; } |
2809 | 2816 |
2810 virtual void PrintOperandsTo(BufferFormatter* f) const; | 2817 virtual void PrintOperandsTo(BufferFormatter* f) const; |
2811 | 2818 |
2812 virtual bool CanDeoptimize() const { return true; } | 2819 virtual bool CanDeoptimize() const { return true; } |
2813 | 2820 |
2814 virtual bool CanBecomeDeoptimizationTarget() const { | 2821 virtual bool CanBecomeDeoptimizationTarget() const { |
2815 // Instance calls that are specialized by the optimizer need a | 2822 // Instance calls that are specialized by the optimizer need a |
2816 // deoptimization descriptor before the call. | 2823 // deoptimization descriptor before the call. |
2817 return true; | 2824 return true; |
2818 } | 2825 } |
2819 | 2826 |
2820 virtual EffectSet Effects() const { return EffectSet::All(); } | 2827 virtual EffectSet Effects() const { return EffectSet::All(); } |
2821 | 2828 |
2822 protected: | 2829 protected: |
2823 friend class FlowGraphOptimizer; | 2830 friend class FlowGraphOptimizer; |
2824 void set_ic_data(ICData* value) { ic_data_ = value; } | 2831 void set_ic_data(ICData* value) { ic_data_ = value; } |
2825 | 2832 |
2826 private: | 2833 private: |
2827 const ICData* ic_data_; | 2834 const ICData* ic_data_; |
2828 const intptr_t token_pos_; | 2835 const TokenPosition token_pos_; |
2829 const String& function_name_; | 2836 const String& function_name_; |
2830 const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL. | 2837 const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL. |
2831 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; | 2838 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; |
2832 const Array& argument_names_; | 2839 const Array& argument_names_; |
2833 const intptr_t checked_argument_count_; | 2840 const intptr_t checked_argument_count_; |
2834 | 2841 |
2835 DISALLOW_COPY_AND_ASSIGN(InstanceCallInstr); | 2842 DISALLOW_COPY_AND_ASSIGN(InstanceCallInstr); |
2836 }; | 2843 }; |
2837 | 2844 |
2838 | 2845 |
2839 class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> { | 2846 class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> { |
2840 public: | 2847 public: |
2841 PolymorphicInstanceCallInstr(InstanceCallInstr* instance_call, | 2848 PolymorphicInstanceCallInstr(InstanceCallInstr* instance_call, |
2842 const ICData& ic_data, | 2849 const ICData& ic_data, |
2843 bool with_checks) | 2850 bool with_checks) |
2844 : TemplateDefinition(instance_call->deopt_id()), | 2851 : TemplateDefinition(instance_call->deopt_id()), |
2845 instance_call_(instance_call), | 2852 instance_call_(instance_call), |
2846 ic_data_(ic_data), | 2853 ic_data_(ic_data), |
2847 with_checks_(with_checks) { | 2854 with_checks_(with_checks) { |
2848 ASSERT(instance_call_ != NULL); | 2855 ASSERT(instance_call_ != NULL); |
2849 ASSERT(ic_data.NumberOfChecks() > 0); | 2856 ASSERT(ic_data.NumberOfChecks() > 0); |
2850 } | 2857 } |
2851 | 2858 |
2852 InstanceCallInstr* instance_call() const { return instance_call_; } | 2859 InstanceCallInstr* instance_call() const { return instance_call_; } |
2853 bool with_checks() const { return with_checks_; } | 2860 bool with_checks() const { return with_checks_; } |
2854 virtual intptr_t token_pos() const { return instance_call_->token_pos(); } | 2861 virtual TokenPosition token_pos() const { |
| 2862 return instance_call_->token_pos(); |
| 2863 } |
2855 | 2864 |
2856 virtual intptr_t ArgumentCount() const { | 2865 virtual intptr_t ArgumentCount() const { |
2857 return instance_call()->ArgumentCount(); | 2866 return instance_call()->ArgumentCount(); |
2858 } | 2867 } |
2859 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { | 2868 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { |
2860 return instance_call()->PushArgumentAt(index); | 2869 return instance_call()->PushArgumentAt(index); |
2861 } | 2870 } |
2862 | 2871 |
2863 bool HasSingleRecognizedTarget() const; | 2872 bool HasSingleRecognizedTarget() const; |
2864 | 2873 |
(...skipping 15 matching lines...) Expand all Loading... |
2880 InstanceCallInstr* instance_call_; | 2889 InstanceCallInstr* instance_call_; |
2881 const ICData& ic_data_; | 2890 const ICData& ic_data_; |
2882 const bool with_checks_; | 2891 const bool with_checks_; |
2883 | 2892 |
2884 DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallInstr); | 2893 DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallInstr); |
2885 }; | 2894 }; |
2886 | 2895 |
2887 | 2896 |
2888 class StrictCompareInstr : public ComparisonInstr { | 2897 class StrictCompareInstr : public ComparisonInstr { |
2889 public: | 2898 public: |
2890 StrictCompareInstr(intptr_t token_pos, | 2899 StrictCompareInstr(TokenPosition token_pos, |
2891 Token::Kind kind, | 2900 Token::Kind kind, |
2892 Value* left, | 2901 Value* left, |
2893 Value* right, | 2902 Value* right, |
2894 bool needs_number_check); | 2903 bool needs_number_check); |
2895 | 2904 |
2896 DECLARE_INSTRUCTION(StrictCompare) | 2905 DECLARE_INSTRUCTION(StrictCompare) |
2897 | 2906 |
2898 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); | 2907 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
2899 | 2908 |
2900 virtual CompileType ComputeType() const; | 2909 virtual CompileType ComputeType() const; |
(...skipping 21 matching lines...) Expand all Loading... |
2922 bool needs_number_check_; | 2931 bool needs_number_check_; |
2923 | 2932 |
2924 DISALLOW_COPY_AND_ASSIGN(StrictCompareInstr); | 2933 DISALLOW_COPY_AND_ASSIGN(StrictCompareInstr); |
2925 }; | 2934 }; |
2926 | 2935 |
2927 | 2936 |
2928 // Comparison instruction that is equivalent to the (left & right) == 0 | 2937 // Comparison instruction that is equivalent to the (left & right) == 0 |
2929 // comparison pattern. | 2938 // comparison pattern. |
2930 class TestSmiInstr : public ComparisonInstr { | 2939 class TestSmiInstr : public ComparisonInstr { |
2931 public: | 2940 public: |
2932 TestSmiInstr(intptr_t token_pos, Token::Kind kind, Value* left, Value* right) | 2941 TestSmiInstr(TokenPosition token_pos, |
| 2942 Token::Kind kind, |
| 2943 Value* left, |
| 2944 Value* right) |
2933 : ComparisonInstr(token_pos, kind, left, right) { | 2945 : ComparisonInstr(token_pos, kind, left, right) { |
2934 ASSERT(kind == Token::kEQ || kind == Token::kNE); | 2946 ASSERT(kind == Token::kEQ || kind == Token::kNE); |
2935 } | 2947 } |
2936 | 2948 |
2937 DECLARE_INSTRUCTION(TestSmi); | 2949 DECLARE_INSTRUCTION(TestSmi); |
2938 | 2950 |
2939 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); | 2951 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
2940 | 2952 |
2941 virtual CompileType ComputeType() const; | 2953 virtual CompileType ComputeType() const; |
2942 | 2954 |
(...skipping 13 matching lines...) Expand all Loading... |
2956 DISALLOW_COPY_AND_ASSIGN(TestSmiInstr); | 2968 DISALLOW_COPY_AND_ASSIGN(TestSmiInstr); |
2957 }; | 2969 }; |
2958 | 2970 |
2959 | 2971 |
2960 // Checks the input value cid against cids stored in a table and returns either | 2972 // Checks the input value cid against cids stored in a table and returns either |
2961 // a result or deoptimizes. | 2973 // a result or deoptimizes. |
2962 // TODO(srdjan): Modify ComparisonInstr to allow 1 or 2 arguments, since | 2974 // TODO(srdjan): Modify ComparisonInstr to allow 1 or 2 arguments, since |
2963 // TestCidInstr needs only one argument | 2975 // TestCidInstr needs only one argument |
2964 class TestCidsInstr : public ComparisonInstr { | 2976 class TestCidsInstr : public ComparisonInstr { |
2965 public: | 2977 public: |
2966 TestCidsInstr(intptr_t token_pos, | 2978 TestCidsInstr(TokenPosition token_pos, |
2967 Token::Kind kind, | 2979 Token::Kind kind, |
2968 Value* value, | 2980 Value* value, |
2969 const ZoneGrowableArray<intptr_t>& cid_results, | 2981 const ZoneGrowableArray<intptr_t>& cid_results, |
2970 intptr_t deopt_id) | 2982 intptr_t deopt_id) |
2971 : ComparisonInstr(token_pos, kind, value, NULL, deopt_id), | 2983 : ComparisonInstr(token_pos, kind, value, NULL, deopt_id), |
2972 cid_results_(cid_results) { | 2984 cid_results_(cid_results) { |
2973 ASSERT((kind == Token::kIS) || (kind == Token::kISNOT)); | 2985 ASSERT((kind == Token::kIS) || (kind == Token::kISNOT)); |
2974 set_operation_cid(kObjectCid); | 2986 set_operation_cid(kObjectCid); |
2975 } | 2987 } |
2976 | 2988 |
(...skipping 28 matching lines...) Expand all Loading... |
3005 virtual void PrintOperandsTo(BufferFormatter* f) const; | 3017 virtual void PrintOperandsTo(BufferFormatter* f) const; |
3006 | 3018 |
3007 private: | 3019 private: |
3008 const ZoneGrowableArray<intptr_t>& cid_results_; | 3020 const ZoneGrowableArray<intptr_t>& cid_results_; |
3009 DISALLOW_COPY_AND_ASSIGN(TestCidsInstr); | 3021 DISALLOW_COPY_AND_ASSIGN(TestCidsInstr); |
3010 }; | 3022 }; |
3011 | 3023 |
3012 | 3024 |
3013 class EqualityCompareInstr : public ComparisonInstr { | 3025 class EqualityCompareInstr : public ComparisonInstr { |
3014 public: | 3026 public: |
3015 EqualityCompareInstr(intptr_t token_pos, | 3027 EqualityCompareInstr(TokenPosition token_pos, |
3016 Token::Kind kind, | 3028 Token::Kind kind, |
3017 Value* left, | 3029 Value* left, |
3018 Value* right, | 3030 Value* right, |
3019 intptr_t cid, | 3031 intptr_t cid, |
3020 intptr_t deopt_id) | 3032 intptr_t deopt_id) |
3021 : ComparisonInstr(token_pos, kind, left, right, deopt_id) { | 3033 : ComparisonInstr(token_pos, kind, left, right, deopt_id) { |
3022 ASSERT(Token::IsEqualityOperator(kind)); | 3034 ASSERT(Token::IsEqualityOperator(kind)); |
3023 set_operation_cid(cid); | 3035 set_operation_cid(cid); |
3024 } | 3036 } |
3025 | 3037 |
(...skipping 20 matching lines...) Expand all Loading... |
3046 return kTagged; | 3058 return kTagged; |
3047 } | 3059 } |
3048 | 3060 |
3049 private: | 3061 private: |
3050 DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr); | 3062 DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr); |
3051 }; | 3063 }; |
3052 | 3064 |
3053 | 3065 |
3054 class RelationalOpInstr : public ComparisonInstr { | 3066 class RelationalOpInstr : public ComparisonInstr { |
3055 public: | 3067 public: |
3056 RelationalOpInstr(intptr_t token_pos, | 3068 RelationalOpInstr(TokenPosition token_pos, |
3057 Token::Kind kind, | 3069 Token::Kind kind, |
3058 Value* left, | 3070 Value* left, |
3059 Value* right, | 3071 Value* right, |
3060 intptr_t cid, | 3072 intptr_t cid, |
3061 intptr_t deopt_id) | 3073 intptr_t deopt_id) |
3062 : ComparisonInstr(token_pos, kind, left, right, deopt_id) { | 3074 : ComparisonInstr(token_pos, kind, left, right, deopt_id) { |
3063 ASSERT(Token::IsRelationalOperator(kind)); | 3075 ASSERT(Token::IsRelationalOperator(kind)); |
3064 set_operation_cid(cid); | 3076 set_operation_cid(cid); |
3065 } | 3077 } |
3066 | 3078 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3169 ComparisonInstr* comparison_; | 3181 ComparisonInstr* comparison_; |
3170 const intptr_t if_true_; | 3182 const intptr_t if_true_; |
3171 const intptr_t if_false_; | 3183 const intptr_t if_false_; |
3172 | 3184 |
3173 DISALLOW_COPY_AND_ASSIGN(IfThenElseInstr); | 3185 DISALLOW_COPY_AND_ASSIGN(IfThenElseInstr); |
3174 }; | 3186 }; |
3175 | 3187 |
3176 | 3188 |
3177 class StaticCallInstr : public TemplateDefinition<0, Throws> { | 3189 class StaticCallInstr : public TemplateDefinition<0, Throws> { |
3178 public: | 3190 public: |
3179 StaticCallInstr(intptr_t token_pos, | 3191 StaticCallInstr(TokenPosition token_pos, |
3180 const Function& function, | 3192 const Function& function, |
3181 const Array& argument_names, | 3193 const Array& argument_names, |
3182 ZoneGrowableArray<PushArgumentInstr*>* arguments, | 3194 ZoneGrowableArray<PushArgumentInstr*>* arguments, |
3183 const ZoneGrowableArray<const ICData*>& ic_data_array) | 3195 const ZoneGrowableArray<const ICData*>& ic_data_array) |
3184 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 3196 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), |
3185 ic_data_(NULL), | 3197 ic_data_(NULL), |
3186 token_pos_(token_pos), | 3198 token_pos_(token_pos), |
3187 function_(function), | 3199 function_(function), |
3188 argument_names_(argument_names), | 3200 argument_names_(argument_names), |
3189 arguments_(arguments), | 3201 arguments_(arguments), |
(...skipping 11 matching lines...) Expand all Loading... |
3201 bool HasICData() const { | 3213 bool HasICData() const { |
3202 return (ic_data() != NULL) && !ic_data()->IsNull(); | 3214 return (ic_data() != NULL) && !ic_data()->IsNull(); |
3203 } | 3215 } |
3204 | 3216 |
3205 DECLARE_INSTRUCTION(StaticCall) | 3217 DECLARE_INSTRUCTION(StaticCall) |
3206 virtual CompileType ComputeType() const; | 3218 virtual CompileType ComputeType() const; |
3207 | 3219 |
3208 // Accessors forwarded to the AST node. | 3220 // Accessors forwarded to the AST node. |
3209 const Function& function() const { return function_; } | 3221 const Function& function() const { return function_; } |
3210 const Array& argument_names() const { return argument_names_; } | 3222 const Array& argument_names() const { return argument_names_; } |
3211 virtual intptr_t token_pos() const { return token_pos_; } | 3223 virtual TokenPosition token_pos() const { return token_pos_; } |
3212 | 3224 |
3213 virtual intptr_t ArgumentCount() const { return arguments_->length(); } | 3225 virtual intptr_t ArgumentCount() const { return arguments_->length(); } |
3214 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { | 3226 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { |
3215 return (*arguments_)[index]; | 3227 return (*arguments_)[index]; |
3216 } | 3228 } |
3217 | 3229 |
3218 virtual intptr_t CallCount() const { | 3230 virtual intptr_t CallCount() const { |
3219 return ic_data() == NULL ? 0 : ic_data()->AggregateCount(); | 3231 return ic_data() == NULL ? 0 : ic_data()->AggregateCount(); |
3220 } | 3232 } |
3221 | 3233 |
(...skipping 23 matching lines...) Expand all Loading... |
3245 | 3257 |
3246 bool IsRecognizedFactory() const { | 3258 bool IsRecognizedFactory() const { |
3247 return is_known_list_constructor() || is_native_list_factory(); | 3259 return is_known_list_constructor() || is_native_list_factory(); |
3248 } | 3260 } |
3249 | 3261 |
3250 virtual AliasIdentity Identity() const { return identity_; } | 3262 virtual AliasIdentity Identity() const { return identity_; } |
3251 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } | 3263 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } |
3252 | 3264 |
3253 private: | 3265 private: |
3254 const ICData* ic_data_; | 3266 const ICData* ic_data_; |
3255 const intptr_t token_pos_; | 3267 const TokenPosition token_pos_; |
3256 const Function& function_; | 3268 const Function& function_; |
3257 const Array& argument_names_; | 3269 const Array& argument_names_; |
3258 ZoneGrowableArray<PushArgumentInstr*>* arguments_; | 3270 ZoneGrowableArray<PushArgumentInstr*>* arguments_; |
3259 intptr_t result_cid_; // For some library functions we know the result. | 3271 intptr_t result_cid_; // For some library functions we know the result. |
3260 | 3272 |
3261 // 'True' for recognized list constructors. | 3273 // 'True' for recognized list constructors. |
3262 bool is_known_list_constructor_; | 3274 bool is_known_list_constructor_; |
3263 bool is_native_list_factory_; | 3275 bool is_native_list_factory_; |
3264 | 3276 |
3265 AliasIdentity identity_; | 3277 AliasIdentity identity_; |
3266 | 3278 |
3267 DISALLOW_COPY_AND_ASSIGN(StaticCallInstr); | 3279 DISALLOW_COPY_AND_ASSIGN(StaticCallInstr); |
3268 }; | 3280 }; |
3269 | 3281 |
3270 | 3282 |
3271 class LoadLocalInstr : public TemplateDefinition<0, NoThrow> { | 3283 class LoadLocalInstr : public TemplateDefinition<0, NoThrow> { |
3272 public: | 3284 public: |
3273 LoadLocalInstr(const LocalVariable& local, | 3285 LoadLocalInstr(const LocalVariable& local, |
3274 intptr_t token_pos) | 3286 TokenPosition token_pos) |
3275 : local_(local), is_last_(false), token_pos_(token_pos) { } | 3287 : local_(local), is_last_(false), token_pos_(token_pos) { } |
3276 | 3288 |
3277 DECLARE_INSTRUCTION(LoadLocal) | 3289 DECLARE_INSTRUCTION(LoadLocal) |
3278 virtual CompileType ComputeType() const; | 3290 virtual CompileType ComputeType() const; |
3279 | 3291 |
3280 const LocalVariable& local() const { return local_; } | 3292 const LocalVariable& local() const { return local_; } |
3281 | 3293 |
3282 virtual void PrintOperandsTo(BufferFormatter* f) const; | 3294 virtual void PrintOperandsTo(BufferFormatter* f) const; |
3283 | 3295 |
3284 virtual bool CanDeoptimize() const { return false; } | 3296 virtual bool CanDeoptimize() const { return false; } |
3285 | 3297 |
3286 virtual EffectSet Effects() const { | 3298 virtual EffectSet Effects() const { |
3287 UNREACHABLE(); // Eliminated by SSA construction. | 3299 UNREACHABLE(); // Eliminated by SSA construction. |
3288 return EffectSet::None(); | 3300 return EffectSet::None(); |
3289 } | 3301 } |
3290 | 3302 |
3291 void mark_last() { is_last_ = true; } | 3303 void mark_last() { is_last_ = true; } |
3292 bool is_last() const { return is_last_; } | 3304 bool is_last() const { return is_last_; } |
3293 | 3305 |
3294 virtual intptr_t token_pos() const { return token_pos_; } | 3306 virtual TokenPosition token_pos() const { return token_pos_; } |
3295 | 3307 |
3296 private: | 3308 private: |
3297 const LocalVariable& local_; | 3309 const LocalVariable& local_; |
3298 bool is_last_; | 3310 bool is_last_; |
3299 const intptr_t token_pos_; | 3311 const TokenPosition token_pos_; |
3300 | 3312 |
3301 DISALLOW_COPY_AND_ASSIGN(LoadLocalInstr); | 3313 DISALLOW_COPY_AND_ASSIGN(LoadLocalInstr); |
3302 }; | 3314 }; |
3303 | 3315 |
3304 | 3316 |
3305 class PushTempInstr : public TemplateDefinition<1, NoThrow> { | 3317 class PushTempInstr : public TemplateDefinition<1, NoThrow> { |
3306 public: | 3318 public: |
3307 explicit PushTempInstr(Value* value) { | 3319 explicit PushTempInstr(Value* value) { |
3308 SetInputAt(0, value); | 3320 SetInputAt(0, value); |
3309 } | 3321 } |
3310 | 3322 |
3311 DECLARE_INSTRUCTION(PushTemp) | 3323 DECLARE_INSTRUCTION(PushTemp) |
3312 | 3324 |
3313 Value* value() const { return inputs_[0]; } | 3325 Value* value() const { return inputs_[0]; } |
3314 | 3326 |
3315 virtual CompileType ComputeType() const; | 3327 virtual CompileType ComputeType() const; |
3316 | 3328 |
3317 virtual bool CanDeoptimize() const { return false; } | 3329 virtual bool CanDeoptimize() const { return false; } |
3318 | 3330 |
3319 virtual EffectSet Effects() const { | 3331 virtual EffectSet Effects() const { |
3320 UNREACHABLE(); // Eliminated by SSA construction. | 3332 UNREACHABLE(); // Eliminated by SSA construction. |
3321 return EffectSet::None(); | 3333 return EffectSet::None(); |
3322 } | 3334 } |
3323 | 3335 |
3324 virtual intptr_t token_pos() const { | 3336 virtual TokenPosition token_pos() const { |
3325 return ClassifyingTokenPositions::kTempMove; | 3337 return TokenPosition::kTempMove; |
3326 } | 3338 } |
3327 | 3339 |
3328 private: | 3340 private: |
3329 DISALLOW_COPY_AND_ASSIGN(PushTempInstr); | 3341 DISALLOW_COPY_AND_ASSIGN(PushTempInstr); |
3330 }; | 3342 }; |
3331 | 3343 |
3332 | 3344 |
3333 class DropTempsInstr : public Definition { | 3345 class DropTempsInstr : public Definition { |
3334 public: | 3346 public: |
3335 DropTempsInstr(intptr_t num_temps, Value* value) | 3347 DropTempsInstr(intptr_t num_temps, Value* value) |
(...skipping 24 matching lines...) Expand all Loading... |
3360 virtual EffectSet Effects() const { | 3372 virtual EffectSet Effects() const { |
3361 UNREACHABLE(); // Eliminated by SSA construction. | 3373 UNREACHABLE(); // Eliminated by SSA construction. |
3362 return EffectSet::None(); | 3374 return EffectSet::None(); |
3363 } | 3375 } |
3364 | 3376 |
3365 virtual bool MayThrow() const { | 3377 virtual bool MayThrow() const { |
3366 UNREACHABLE(); | 3378 UNREACHABLE(); |
3367 return false; | 3379 return false; |
3368 } | 3380 } |
3369 | 3381 |
3370 virtual intptr_t token_pos() const { | 3382 virtual TokenPosition token_pos() const { |
3371 return ClassifyingTokenPositions::kTempMove; | 3383 return TokenPosition::kTempMove; |
3372 } | 3384 } |
3373 | 3385 |
3374 private: | 3386 private: |
3375 virtual void RawSetInputAt(intptr_t i, Value* value) { | 3387 virtual void RawSetInputAt(intptr_t i, Value* value) { |
3376 value_ = value; | 3388 value_ = value; |
3377 } | 3389 } |
3378 | 3390 |
3379 const intptr_t num_temps_; | 3391 const intptr_t num_temps_; |
3380 Value* value_; | 3392 Value* value_; |
3381 | 3393 |
3382 DISALLOW_COPY_AND_ASSIGN(DropTempsInstr); | 3394 DISALLOW_COPY_AND_ASSIGN(DropTempsInstr); |
3383 }; | 3395 }; |
3384 | 3396 |
3385 | 3397 |
3386 class StoreLocalInstr : public TemplateDefinition<1, NoThrow> { | 3398 class StoreLocalInstr : public TemplateDefinition<1, NoThrow> { |
3387 public: | 3399 public: |
3388 StoreLocalInstr(const LocalVariable& local, | 3400 StoreLocalInstr(const LocalVariable& local, |
3389 Value* value, | 3401 Value* value, |
3390 intptr_t token_pos) | 3402 TokenPosition token_pos) |
3391 : local_(local), is_dead_(false), is_last_(false), token_pos_(token_pos) { | 3403 : local_(local), is_dead_(false), is_last_(false), token_pos_(token_pos) { |
3392 SetInputAt(0, value); | 3404 SetInputAt(0, value); |
3393 } | 3405 } |
3394 | 3406 |
3395 DECLARE_INSTRUCTION(StoreLocal) | 3407 DECLARE_INSTRUCTION(StoreLocal) |
3396 virtual CompileType ComputeType() const; | 3408 virtual CompileType ComputeType() const; |
3397 | 3409 |
3398 const LocalVariable& local() const { return local_; } | 3410 const LocalVariable& local() const { return local_; } |
3399 Value* value() const { return inputs_[0]; } | 3411 Value* value() const { return inputs_[0]; } |
3400 | 3412 |
3401 virtual void PrintOperandsTo(BufferFormatter* f) const; | 3413 virtual void PrintOperandsTo(BufferFormatter* f) const; |
3402 | 3414 |
3403 virtual bool CanDeoptimize() const { return false; } | 3415 virtual bool CanDeoptimize() const { return false; } |
3404 | 3416 |
3405 void mark_dead() { is_dead_ = true; } | 3417 void mark_dead() { is_dead_ = true; } |
3406 bool is_dead() const { return is_dead_; } | 3418 bool is_dead() const { return is_dead_; } |
3407 | 3419 |
3408 void mark_last() { is_last_ = true; } | 3420 void mark_last() { is_last_ = true; } |
3409 bool is_last() const { return is_last_; } | 3421 bool is_last() const { return is_last_; } |
3410 | 3422 |
3411 virtual EffectSet Effects() const { | 3423 virtual EffectSet Effects() const { |
3412 UNREACHABLE(); // Eliminated by SSA construction. | 3424 UNREACHABLE(); // Eliminated by SSA construction. |
3413 return EffectSet::None(); | 3425 return EffectSet::None(); |
3414 } | 3426 } |
3415 | 3427 |
3416 virtual intptr_t token_pos() const { return token_pos_; } | 3428 virtual TokenPosition token_pos() const { return token_pos_; } |
3417 | 3429 |
3418 private: | 3430 private: |
3419 const LocalVariable& local_; | 3431 const LocalVariable& local_; |
3420 bool is_dead_; | 3432 bool is_dead_; |
3421 bool is_last_; | 3433 bool is_last_; |
3422 const intptr_t token_pos_; | 3434 const TokenPosition token_pos_; |
3423 | 3435 |
3424 DISALLOW_COPY_AND_ASSIGN(StoreLocalInstr); | 3436 DISALLOW_COPY_AND_ASSIGN(StoreLocalInstr); |
3425 }; | 3437 }; |
3426 | 3438 |
3427 | 3439 |
3428 class NativeCallInstr : public TemplateDefinition<0, Throws> { | 3440 class NativeCallInstr : public TemplateDefinition<0, Throws> { |
3429 public: | 3441 public: |
3430 explicit NativeCallInstr(NativeBodyNode* node) | 3442 explicit NativeCallInstr(NativeBodyNode* node) |
3431 : ast_node_(*node), | 3443 : ast_node_(*node), |
3432 native_c_function_(NULL), | 3444 native_c_function_(NULL), |
3433 is_bootstrap_native_(false) { } | 3445 is_bootstrap_native_(false) { } |
3434 | 3446 |
3435 DECLARE_INSTRUCTION(NativeCall) | 3447 DECLARE_INSTRUCTION(NativeCall) |
3436 | 3448 |
3437 virtual intptr_t token_pos() const { return ast_node_.token_pos(); } | 3449 virtual TokenPosition token_pos() const { |
| 3450 return ast_node_.token_pos(); |
| 3451 } |
3438 | 3452 |
3439 const Function& function() const { return ast_node_.function(); } | 3453 const Function& function() const { return ast_node_.function(); } |
3440 | 3454 |
3441 const String& native_name() const { | 3455 const String& native_name() const { |
3442 return ast_node_.native_c_function_name(); | 3456 return ast_node_.native_c_function_name(); |
3443 } | 3457 } |
3444 | 3458 |
3445 NativeFunction native_c_function() const { | 3459 NativeFunction native_c_function() const { |
3446 return native_c_function_; | 3460 return native_c_function_; |
3447 } | 3461 } |
(...skipping 24 matching lines...) Expand all Loading... |
3472 const NativeBodyNode& ast_node_; | 3486 const NativeBodyNode& ast_node_; |
3473 NativeFunction native_c_function_; | 3487 NativeFunction native_c_function_; |
3474 bool is_bootstrap_native_; | 3488 bool is_bootstrap_native_; |
3475 | 3489 |
3476 DISALLOW_COPY_AND_ASSIGN(NativeCallInstr); | 3490 DISALLOW_COPY_AND_ASSIGN(NativeCallInstr); |
3477 }; | 3491 }; |
3478 | 3492 |
3479 | 3493 |
3480 class DebugStepCheckInstr : public TemplateInstruction<0, NoThrow> { | 3494 class DebugStepCheckInstr : public TemplateInstruction<0, NoThrow> { |
3481 public: | 3495 public: |
3482 DebugStepCheckInstr(intptr_t token_pos, | 3496 DebugStepCheckInstr(TokenPosition token_pos, |
3483 RawPcDescriptors::Kind stub_kind) | 3497 RawPcDescriptors::Kind stub_kind) |
3484 : token_pos_(token_pos), | 3498 : token_pos_(token_pos), |
3485 stub_kind_(stub_kind) { | 3499 stub_kind_(stub_kind) { |
3486 } | 3500 } |
3487 | 3501 |
3488 DECLARE_INSTRUCTION(DebugStepCheck) | 3502 DECLARE_INSTRUCTION(DebugStepCheck) |
3489 | 3503 |
3490 virtual intptr_t token_pos() const { return token_pos_; } | 3504 virtual TokenPosition token_pos() const { return token_pos_; } |
3491 virtual bool CanDeoptimize() const { return false; } | 3505 virtual bool CanDeoptimize() const { return false; } |
3492 virtual EffectSet Effects() const { return EffectSet::All(); } | 3506 virtual EffectSet Effects() const { return EffectSet::All(); } |
3493 virtual Instruction* Canonicalize(FlowGraph* flow_graph); | 3507 virtual Instruction* Canonicalize(FlowGraph* flow_graph); |
3494 | 3508 |
3495 private: | 3509 private: |
3496 const intptr_t token_pos_; | 3510 const TokenPosition token_pos_; |
3497 const RawPcDescriptors::Kind stub_kind_; | 3511 const RawPcDescriptors::Kind stub_kind_; |
3498 | 3512 |
3499 DISALLOW_COPY_AND_ASSIGN(DebugStepCheckInstr); | 3513 DISALLOW_COPY_AND_ASSIGN(DebugStepCheckInstr); |
3500 }; | 3514 }; |
3501 | 3515 |
3502 | 3516 |
3503 enum StoreBarrierType { | 3517 enum StoreBarrierType { |
3504 kNoStoreBarrier, | 3518 kNoStoreBarrier, |
3505 kEmitStoreBarrier | 3519 kEmitStoreBarrier |
3506 }; | 3520 }; |
3507 | 3521 |
3508 | 3522 |
3509 class StoreInstanceFieldInstr : public TemplateDefinition<2, NoThrow> { | 3523 class StoreInstanceFieldInstr : public TemplateDefinition<2, NoThrow> { |
3510 public: | 3524 public: |
3511 StoreInstanceFieldInstr(const Field& field, | 3525 StoreInstanceFieldInstr(const Field& field, |
3512 Value* instance, | 3526 Value* instance, |
3513 Value* value, | 3527 Value* value, |
3514 StoreBarrierType emit_store_barrier, | 3528 StoreBarrierType emit_store_barrier, |
3515 intptr_t token_pos) | 3529 TokenPosition token_pos) |
3516 : field_(field), | 3530 : field_(field), |
3517 offset_in_bytes_(field.Offset()), | 3531 offset_in_bytes_(field.Offset()), |
3518 emit_store_barrier_(emit_store_barrier), | 3532 emit_store_barrier_(emit_store_barrier), |
3519 token_pos_(token_pos), | 3533 token_pos_(token_pos), |
3520 is_potential_unboxed_initialization_(false), | 3534 is_potential_unboxed_initialization_(false), |
3521 is_object_reference_initialization_(false) { | 3535 is_object_reference_initialization_(false) { |
3522 SetInputAt(kInstancePos, instance); | 3536 SetInputAt(kInstancePos, instance); |
3523 SetInputAt(kValuePos, value); | 3537 SetInputAt(kValuePos, value); |
3524 } | 3538 } |
3525 | 3539 |
3526 StoreInstanceFieldInstr(intptr_t offset_in_bytes, | 3540 StoreInstanceFieldInstr(intptr_t offset_in_bytes, |
3527 Value* instance, | 3541 Value* instance, |
3528 Value* value, | 3542 Value* value, |
3529 StoreBarrierType emit_store_barrier, | 3543 StoreBarrierType emit_store_barrier, |
3530 intptr_t token_pos) | 3544 TokenPosition token_pos) |
3531 : field_(Field::ZoneHandle()), | 3545 : field_(Field::ZoneHandle()), |
3532 offset_in_bytes_(offset_in_bytes), | 3546 offset_in_bytes_(offset_in_bytes), |
3533 emit_store_barrier_(emit_store_barrier), | 3547 emit_store_barrier_(emit_store_barrier), |
3534 token_pos_(token_pos), | 3548 token_pos_(token_pos), |
3535 is_potential_unboxed_initialization_(false), | 3549 is_potential_unboxed_initialization_(false), |
3536 is_object_reference_initialization_(false) { | 3550 is_object_reference_initialization_(false) { |
3537 SetInputAt(kInstancePos, instance); | 3551 SetInputAt(kInstancePos, instance); |
3538 SetInputAt(kValuePos, value); | 3552 SetInputAt(kValuePos, value); |
3539 } | 3553 } |
3540 | 3554 |
(...skipping 12 matching lines...) Expand all Loading... |
3553 }; | 3567 }; |
3554 | 3568 |
3555 Value* instance() const { return inputs_[kInstancePos]; } | 3569 Value* instance() const { return inputs_[kInstancePos]; } |
3556 Value* value() const { return inputs_[kValuePos]; } | 3570 Value* value() const { return inputs_[kValuePos]; } |
3557 bool is_potential_unboxed_initialization() const { | 3571 bool is_potential_unboxed_initialization() const { |
3558 return is_potential_unboxed_initialization_; | 3572 return is_potential_unboxed_initialization_; |
3559 } | 3573 } |
3560 bool is_object_reference_initialization() const { | 3574 bool is_object_reference_initialization() const { |
3561 return is_object_reference_initialization_; | 3575 return is_object_reference_initialization_; |
3562 } | 3576 } |
3563 virtual intptr_t token_pos() const { return token_pos_; } | 3577 virtual TokenPosition token_pos() const { return token_pos_; } |
3564 | 3578 |
3565 const Field& field() const { return field_; } | 3579 const Field& field() const { return field_; } |
3566 intptr_t offset_in_bytes() const { return offset_in_bytes_; } | 3580 intptr_t offset_in_bytes() const { return offset_in_bytes_; } |
3567 | 3581 |
3568 bool ShouldEmitStoreBarrier() const { | 3582 bool ShouldEmitStoreBarrier() const { |
3569 return value()->NeedsStoreBuffer() | 3583 return value()->NeedsStoreBuffer() |
3570 && (emit_store_barrier_ == kEmitStoreBarrier); | 3584 && (emit_store_barrier_ == kEmitStoreBarrier); |
3571 } | 3585 } |
3572 | 3586 |
3573 virtual void PrintOperandsTo(BufferFormatter* f) const; | 3587 virtual void PrintOperandsTo(BufferFormatter* f) const; |
(...skipping 22 matching lines...) Expand all Loading... |
3596 bool CanValueBeSmi() const { | 3610 bool CanValueBeSmi() const { |
3597 const intptr_t cid = value()->Type()->ToNullableCid(); | 3611 const intptr_t cid = value()->Type()->ToNullableCid(); |
3598 // Write barrier is skipped for nullable and non-nullable smis. | 3612 // Write barrier is skipped for nullable and non-nullable smis. |
3599 ASSERT(cid != kSmiCid); | 3613 ASSERT(cid != kSmiCid); |
3600 return (cid == kDynamicCid); | 3614 return (cid == kDynamicCid); |
3601 } | 3615 } |
3602 | 3616 |
3603 const Field& field_; | 3617 const Field& field_; |
3604 intptr_t offset_in_bytes_; | 3618 intptr_t offset_in_bytes_; |
3605 const StoreBarrierType emit_store_barrier_; | 3619 const StoreBarrierType emit_store_barrier_; |
3606 const intptr_t token_pos_; | 3620 const TokenPosition token_pos_; |
3607 // This may be the first store to an unboxed field. | 3621 // This may be the first store to an unboxed field. |
3608 bool is_potential_unboxed_initialization_; | 3622 bool is_potential_unboxed_initialization_; |
3609 // True if this store initializes an object reference field of an object that | 3623 // True if this store initializes an object reference field of an object that |
3610 // was allocated uninitialized; see AllocateUninitializedContext. | 3624 // was allocated uninitialized; see AllocateUninitializedContext. |
3611 bool is_object_reference_initialization_; | 3625 bool is_object_reference_initialization_; |
3612 | 3626 |
3613 DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldInstr); | 3627 DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldInstr); |
3614 }; | 3628 }; |
3615 | 3629 |
3616 | 3630 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3674 | 3688 |
3675 virtual bool AttributesEqual(Instruction* other) const; | 3689 virtual bool AttributesEqual(Instruction* other) const; |
3676 | 3690 |
3677 private: | 3691 private: |
3678 DISALLOW_COPY_AND_ASSIGN(GuardFieldLengthInstr); | 3692 DISALLOW_COPY_AND_ASSIGN(GuardFieldLengthInstr); |
3679 }; | 3693 }; |
3680 | 3694 |
3681 | 3695 |
3682 class LoadStaticFieldInstr : public TemplateDefinition<1, NoThrow> { | 3696 class LoadStaticFieldInstr : public TemplateDefinition<1, NoThrow> { |
3683 public: | 3697 public: |
3684 LoadStaticFieldInstr(Value* field_value, intptr_t token_pos) | 3698 LoadStaticFieldInstr(Value* field_value, TokenPosition token_pos) |
3685 : token_pos_(token_pos) { | 3699 : token_pos_(token_pos) { |
3686 ASSERT(field_value->BindsToConstant()); | 3700 ASSERT(field_value->BindsToConstant()); |
3687 SetInputAt(0, field_value); | 3701 SetInputAt(0, field_value); |
3688 } | 3702 } |
3689 | 3703 |
3690 DECLARE_INSTRUCTION(LoadStaticField) | 3704 DECLARE_INSTRUCTION(LoadStaticField) |
3691 virtual CompileType ComputeType() const; | 3705 virtual CompileType ComputeType() const; |
3692 | 3706 |
3693 const Field& StaticField() const; | 3707 const Field& StaticField() const; |
3694 | 3708 |
3695 Value* field_value() const { return inputs_[0]; } | 3709 Value* field_value() const { return inputs_[0]; } |
3696 | 3710 |
3697 virtual void PrintOperandsTo(BufferFormatter* f) const; | 3711 virtual void PrintOperandsTo(BufferFormatter* f) const; |
3698 | 3712 |
3699 virtual bool CanDeoptimize() const { return false; } | 3713 virtual bool CanDeoptimize() const { return false; } |
3700 | 3714 |
3701 virtual bool AllowsCSE() const { return StaticField().is_final(); } | 3715 virtual bool AllowsCSE() const { return StaticField().is_final(); } |
3702 virtual EffectSet Effects() const { return EffectSet::None(); } | 3716 virtual EffectSet Effects() const { return EffectSet::None(); } |
3703 virtual EffectSet Dependencies() const; | 3717 virtual EffectSet Dependencies() const; |
3704 virtual bool AttributesEqual(Instruction* other) const; | 3718 virtual bool AttributesEqual(Instruction* other) const; |
3705 | 3719 |
3706 virtual intptr_t token_pos() const { return token_pos_; } | 3720 virtual TokenPosition token_pos() const { return token_pos_; } |
3707 | 3721 |
3708 private: | 3722 private: |
3709 const intptr_t token_pos_; | 3723 const TokenPosition token_pos_; |
3710 | 3724 |
3711 DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldInstr); | 3725 DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldInstr); |
3712 }; | 3726 }; |
3713 | 3727 |
3714 | 3728 |
3715 class StoreStaticFieldInstr : public TemplateDefinition<1, NoThrow> { | 3729 class StoreStaticFieldInstr : public TemplateDefinition<1, NoThrow> { |
3716 public: | 3730 public: |
3717 StoreStaticFieldInstr(const Field& field, | 3731 StoreStaticFieldInstr(const Field& field, |
3718 Value* value, | 3732 Value* value, |
3719 intptr_t token_pos) | 3733 TokenPosition token_pos) |
3720 : field_(field), | 3734 : field_(field), |
3721 token_pos_(token_pos) { | 3735 token_pos_(token_pos) { |
3722 ASSERT(field.IsZoneHandle()); | 3736 ASSERT(field.IsZoneHandle()); |
3723 SetInputAt(kValuePos, value); | 3737 SetInputAt(kValuePos, value); |
3724 } | 3738 } |
3725 | 3739 |
3726 enum { | 3740 enum { |
3727 kValuePos = 0 | 3741 kValuePos = 0 |
3728 }; | 3742 }; |
3729 | 3743 |
3730 DECLARE_INSTRUCTION(StoreStaticField) | 3744 DECLARE_INSTRUCTION(StoreStaticField) |
3731 | 3745 |
3732 const Field& field() const { return field_; } | 3746 const Field& field() const { return field_; } |
3733 Value* value() const { return inputs_[kValuePos]; } | 3747 Value* value() const { return inputs_[kValuePos]; } |
3734 | 3748 |
3735 virtual void PrintOperandsTo(BufferFormatter* f) const; | 3749 virtual void PrintOperandsTo(BufferFormatter* f) const; |
3736 | 3750 |
3737 virtual bool CanDeoptimize() const { return false; } | 3751 virtual bool CanDeoptimize() const { return false; } |
3738 | 3752 |
3739 // Currently CSE/LICM don't operate on any instructions that can be affected | 3753 // Currently CSE/LICM don't operate on any instructions that can be affected |
3740 // by stores/loads. LoadOptimizer handles loads separately. Hence stores | 3754 // by stores/loads. LoadOptimizer handles loads separately. Hence stores |
3741 // are marked as having no side-effects. | 3755 // are marked as having no side-effects. |
3742 virtual EffectSet Effects() const { return EffectSet::None(); } | 3756 virtual EffectSet Effects() const { return EffectSet::None(); } |
3743 | 3757 |
3744 virtual intptr_t token_pos() const { return token_pos_; } | 3758 virtual TokenPosition token_pos() const { return token_pos_; } |
3745 | 3759 |
3746 private: | 3760 private: |
3747 bool CanValueBeSmi() const { | 3761 bool CanValueBeSmi() const { |
3748 const intptr_t cid = value()->Type()->ToNullableCid(); | 3762 const intptr_t cid = value()->Type()->ToNullableCid(); |
3749 // Write barrier is skipped for nullable and non-nullable smis. | 3763 // Write barrier is skipped for nullable and non-nullable smis. |
3750 ASSERT(cid != kSmiCid); | 3764 ASSERT(cid != kSmiCid); |
3751 return (cid == kDynamicCid); | 3765 return (cid == kDynamicCid); |
3752 } | 3766 } |
3753 | 3767 |
3754 const Field& field_; | 3768 const Field& field_; |
3755 const intptr_t token_pos_; | 3769 const TokenPosition token_pos_; |
3756 | 3770 |
3757 DISALLOW_COPY_AND_ASSIGN(StoreStaticFieldInstr); | 3771 DISALLOW_COPY_AND_ASSIGN(StoreStaticFieldInstr); |
3758 }; | 3772 }; |
3759 | 3773 |
3760 | 3774 |
3761 class LoadIndexedInstr : public TemplateDefinition<2, NoThrow> { | 3775 class LoadIndexedInstr : public TemplateDefinition<2, NoThrow> { |
3762 public: | 3776 public: |
3763 LoadIndexedInstr(Value* array, | 3777 LoadIndexedInstr(Value* array, |
3764 Value* index, | 3778 Value* index, |
3765 intptr_t index_scale, | 3779 intptr_t index_scale, |
3766 intptr_t class_id, | 3780 intptr_t class_id, |
3767 intptr_t deopt_id, | 3781 intptr_t deopt_id, |
3768 intptr_t token_pos) | 3782 TokenPosition token_pos) |
3769 : TemplateDefinition(deopt_id), | 3783 : TemplateDefinition(deopt_id), |
3770 index_scale_(index_scale), | 3784 index_scale_(index_scale), |
3771 class_id_(class_id), | 3785 class_id_(class_id), |
3772 token_pos_(token_pos) { | 3786 token_pos_(token_pos) { |
3773 SetInputAt(0, array); | 3787 SetInputAt(0, array); |
3774 SetInputAt(1, index); | 3788 SetInputAt(1, index); |
3775 } | 3789 } |
3776 | 3790 |
3777 intptr_t token_pos() const { return token_pos_; } | 3791 TokenPosition token_pos() const { return token_pos_; } |
3778 | 3792 |
3779 DECLARE_INSTRUCTION(LoadIndexed) | 3793 DECLARE_INSTRUCTION(LoadIndexed) |
3780 virtual CompileType ComputeType() const; | 3794 virtual CompileType ComputeType() const; |
3781 | 3795 |
3782 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | 3796 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
3783 ASSERT(idx == 0 || idx == 1); | 3797 ASSERT(idx == 0 || idx == 1); |
3784 // The array may be tagged or untagged (for external arrays). | 3798 // The array may be tagged or untagged (for external arrays). |
3785 if (idx == 0) return kNoRepresentation; | 3799 if (idx == 0) return kNoRepresentation; |
3786 return kTagged; | 3800 return kTagged; |
3787 } | 3801 } |
(...skipping 12 matching lines...) Expand all Loading... |
3800 } | 3814 } |
3801 | 3815 |
3802 virtual Representation representation() const; | 3816 virtual Representation representation() const; |
3803 virtual void InferRange(RangeAnalysis* analysis, Range* range); | 3817 virtual void InferRange(RangeAnalysis* analysis, Range* range); |
3804 | 3818 |
3805 virtual EffectSet Effects() const { return EffectSet::None(); } | 3819 virtual EffectSet Effects() const { return EffectSet::None(); } |
3806 | 3820 |
3807 private: | 3821 private: |
3808 const intptr_t index_scale_; | 3822 const intptr_t index_scale_; |
3809 const intptr_t class_id_; | 3823 const intptr_t class_id_; |
3810 const intptr_t token_pos_; | 3824 const TokenPosition token_pos_; |
3811 | 3825 |
3812 DISALLOW_COPY_AND_ASSIGN(LoadIndexedInstr); | 3826 DISALLOW_COPY_AND_ASSIGN(LoadIndexedInstr); |
3813 }; | 3827 }; |
3814 | 3828 |
3815 | 3829 |
3816 // Loads the specified number of code units from the given string, packing | 3830 // Loads the specified number of code units from the given string, packing |
3817 // multiple code units into a single datatype. In essence, this is a specialized | 3831 // multiple code units into a single datatype. In essence, this is a specialized |
3818 // version of LoadIndexedInstr which accepts only string targets and can load | 3832 // version of LoadIndexedInstr which accepts only string targets and can load |
3819 // multiple elements at once. The result datatype differs depending on the | 3833 // multiple elements at once. The result datatype differs depending on the |
3820 // string type, element count, and architecture; if possible, the result is | 3834 // string type, element count, and architecture; if possible, the result is |
3821 // packed into a Smi, falling back to a Mint otherwise. | 3835 // packed into a Smi, falling back to a Mint otherwise. |
3822 // TODO(zerny): Add support for loading into UnboxedInt32x4. | 3836 // TODO(zerny): Add support for loading into UnboxedInt32x4. |
3823 class LoadCodeUnitsInstr : public TemplateDefinition<2, NoThrow> { | 3837 class LoadCodeUnitsInstr : public TemplateDefinition<2, NoThrow> { |
3824 public: | 3838 public: |
3825 LoadCodeUnitsInstr(Value* str, | 3839 LoadCodeUnitsInstr(Value* str, |
3826 Value* index, | 3840 Value* index, |
3827 intptr_t element_count, | 3841 intptr_t element_count, |
3828 intptr_t class_id, | 3842 intptr_t class_id, |
3829 intptr_t token_pos) | 3843 TokenPosition token_pos) |
3830 : class_id_(class_id), | 3844 : class_id_(class_id), |
3831 token_pos_(token_pos), | 3845 token_pos_(token_pos), |
3832 element_count_(element_count), | 3846 element_count_(element_count), |
3833 representation_(kTagged) { | 3847 representation_(kTagged) { |
3834 ASSERT(element_count == 1 || element_count == 2 || element_count == 4); | 3848 ASSERT(element_count == 1 || element_count == 2 || element_count == 4); |
3835 ASSERT(RawObject::IsStringClassId(class_id)); | 3849 ASSERT(RawObject::IsStringClassId(class_id)); |
3836 SetInputAt(0, str); | 3850 SetInputAt(0, str); |
3837 SetInputAt(1, index); | 3851 SetInputAt(1, index); |
3838 } | 3852 } |
3839 | 3853 |
3840 intptr_t token_pos() const { return token_pos_; } | 3854 TokenPosition token_pos() const { return token_pos_; } |
3841 | 3855 |
3842 DECLARE_INSTRUCTION(LoadCodeUnits) | 3856 DECLARE_INSTRUCTION(LoadCodeUnits) |
3843 virtual CompileType ComputeType() const; | 3857 virtual CompileType ComputeType() const; |
3844 | 3858 |
3845 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | 3859 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
3846 if (idx == 0) { | 3860 if (idx == 0) { |
3847 // The string may be tagged or untagged (for external strings). | 3861 // The string may be tagged or untagged (for external strings). |
3848 return kNoRepresentation; | 3862 return kNoRepresentation; |
3849 } | 3863 } |
3850 ASSERT(idx == 1); | 3864 ASSERT(idx == 1); |
(...skipping 17 matching lines...) Expand all Loading... |
3868 virtual bool CanDeoptimize() const { return false; } | 3882 virtual bool CanDeoptimize() const { return false; } |
3869 | 3883 |
3870 virtual Representation representation() const { return representation_; } | 3884 virtual Representation representation() const { return representation_; } |
3871 void set_representation(Representation repr) { representation_ = repr; } | 3885 void set_representation(Representation repr) { representation_ = repr; } |
3872 virtual void InferRange(RangeAnalysis* analysis, Range* range); | 3886 virtual void InferRange(RangeAnalysis* analysis, Range* range); |
3873 | 3887 |
3874 virtual EffectSet Effects() const { return EffectSet::None(); } | 3888 virtual EffectSet Effects() const { return EffectSet::None(); } |
3875 | 3889 |
3876 private: | 3890 private: |
3877 const intptr_t class_id_; | 3891 const intptr_t class_id_; |
3878 const intptr_t token_pos_; | 3892 const TokenPosition token_pos_; |
3879 const intptr_t element_count_; | 3893 const intptr_t element_count_; |
3880 Representation representation_; | 3894 Representation representation_; |
3881 | 3895 |
3882 DISALLOW_COPY_AND_ASSIGN(LoadCodeUnitsInstr); | 3896 DISALLOW_COPY_AND_ASSIGN(LoadCodeUnitsInstr); |
3883 }; | 3897 }; |
3884 | 3898 |
3885 | 3899 |
3886 class StringFromCharCodeInstr : public TemplateDefinition<1, NoThrow, Pure> { | 3900 class StringFromCharCodeInstr : public TemplateDefinition<1, NoThrow, Pure> { |
3887 public: | 3901 public: |
3888 StringFromCharCodeInstr(Value* char_code, intptr_t cid) : cid_(cid) { | 3902 StringFromCharCodeInstr(Value* char_code, intptr_t cid) : cid_(cid) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3931 | 3945 |
3932 private: | 3946 private: |
3933 const intptr_t cid_; | 3947 const intptr_t cid_; |
3934 | 3948 |
3935 DISALLOW_COPY_AND_ASSIGN(StringToCharCodeInstr); | 3949 DISALLOW_COPY_AND_ASSIGN(StringToCharCodeInstr); |
3936 }; | 3950 }; |
3937 | 3951 |
3938 | 3952 |
3939 class StringInterpolateInstr : public TemplateDefinition<1, Throws> { | 3953 class StringInterpolateInstr : public TemplateDefinition<1, Throws> { |
3940 public: | 3954 public: |
3941 StringInterpolateInstr(Value* value, intptr_t token_pos) | 3955 StringInterpolateInstr(Value* value, TokenPosition token_pos) |
3942 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 3956 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), |
3943 token_pos_(token_pos), | 3957 token_pos_(token_pos), |
3944 function_(Function::ZoneHandle()) { | 3958 function_(Function::ZoneHandle()) { |
3945 SetInputAt(0, value); | 3959 SetInputAt(0, value); |
3946 } | 3960 } |
3947 | 3961 |
3948 Value* value() const { return inputs_[0]; } | 3962 Value* value() const { return inputs_[0]; } |
3949 virtual intptr_t token_pos() const { return token_pos_; } | 3963 virtual TokenPosition token_pos() const { return token_pos_; } |
3950 | 3964 |
3951 virtual CompileType ComputeType() const; | 3965 virtual CompileType ComputeType() const; |
3952 // Issues a static call to Dart code which calls toString on objects. | 3966 // Issues a static call to Dart code which calls toString on objects. |
3953 virtual EffectSet Effects() const { return EffectSet::All(); } | 3967 virtual EffectSet Effects() const { return EffectSet::All(); } |
3954 virtual bool CanDeoptimize() const { return true; } | 3968 virtual bool CanDeoptimize() const { return true; } |
3955 | 3969 |
3956 const Function& CallFunction() const; | 3970 const Function& CallFunction() const; |
3957 | 3971 |
3958 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 3972 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
3959 | 3973 |
3960 DECLARE_INSTRUCTION(StringInterpolate) | 3974 DECLARE_INSTRUCTION(StringInterpolate) |
3961 | 3975 |
3962 private: | 3976 private: |
3963 const intptr_t token_pos_; | 3977 const TokenPosition token_pos_; |
3964 Function& function_; | 3978 Function& function_; |
3965 | 3979 |
3966 DISALLOW_COPY_AND_ASSIGN(StringInterpolateInstr); | 3980 DISALLOW_COPY_AND_ASSIGN(StringInterpolateInstr); |
3967 }; | 3981 }; |
3968 | 3982 |
3969 | 3983 |
3970 class StoreIndexedInstr : public TemplateDefinition<3, NoThrow> { | 3984 class StoreIndexedInstr : public TemplateDefinition<3, NoThrow> { |
3971 public: | 3985 public: |
3972 StoreIndexedInstr(Value* array, | 3986 StoreIndexedInstr(Value* array, |
3973 Value* index, | 3987 Value* index, |
3974 Value* value, | 3988 Value* value, |
3975 StoreBarrierType emit_store_barrier, | 3989 StoreBarrierType emit_store_barrier, |
3976 intptr_t index_scale, | 3990 intptr_t index_scale, |
3977 intptr_t class_id, | 3991 intptr_t class_id, |
3978 intptr_t deopt_id, | 3992 intptr_t deopt_id, |
3979 intptr_t token_pos) | 3993 TokenPosition token_pos) |
3980 : TemplateDefinition(deopt_id), | 3994 : TemplateDefinition(deopt_id), |
3981 emit_store_barrier_(emit_store_barrier), | 3995 emit_store_barrier_(emit_store_barrier), |
3982 index_scale_(index_scale), | 3996 index_scale_(index_scale), |
3983 class_id_(class_id), | 3997 class_id_(class_id), |
3984 token_pos_(token_pos) { | 3998 token_pos_(token_pos) { |
3985 SetInputAt(kArrayPos, array); | 3999 SetInputAt(kArrayPos, array); |
3986 SetInputAt(kIndexPos, index); | 4000 SetInputAt(kIndexPos, index); |
3987 SetInputAt(kValuePos, value); | 4001 SetInputAt(kValuePos, value); |
3988 } | 4002 } |
3989 | 4003 |
(...skipping 30 matching lines...) Expand all Loading... |
4020 // was inherited from another instruction that could deoptimize. | 4034 // was inherited from another instruction that could deoptimize. |
4021 return GetDeoptId(); | 4035 return GetDeoptId(); |
4022 } | 4036 } |
4023 | 4037 |
4024 virtual EffectSet Effects() const { return EffectSet::None(); } | 4038 virtual EffectSet Effects() const { return EffectSet::None(); } |
4025 | 4039 |
4026 private: | 4040 private: |
4027 const StoreBarrierType emit_store_barrier_; | 4041 const StoreBarrierType emit_store_barrier_; |
4028 const intptr_t index_scale_; | 4042 const intptr_t index_scale_; |
4029 const intptr_t class_id_; | 4043 const intptr_t class_id_; |
4030 const intptr_t token_pos_; | 4044 const TokenPosition token_pos_; |
4031 | 4045 |
4032 DISALLOW_COPY_AND_ASSIGN(StoreIndexedInstr); | 4046 DISALLOW_COPY_AND_ASSIGN(StoreIndexedInstr); |
4033 }; | 4047 }; |
4034 | 4048 |
4035 | 4049 |
4036 // Note overrideable, built-in: value ? false : true. | 4050 // Note overrideable, built-in: value ? false : true. |
4037 class BooleanNegateInstr : public TemplateDefinition<1, NoThrow> { | 4051 class BooleanNegateInstr : public TemplateDefinition<1, NoThrow> { |
4038 public: | 4052 public: |
4039 explicit BooleanNegateInstr(Value* value) { | 4053 explicit BooleanNegateInstr(Value* value) { |
4040 SetInputAt(0, value); | 4054 SetInputAt(0, value); |
(...skipping 10 matching lines...) Expand all Loading... |
4051 | 4065 |
4052 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 4066 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
4053 | 4067 |
4054 private: | 4068 private: |
4055 DISALLOW_COPY_AND_ASSIGN(BooleanNegateInstr); | 4069 DISALLOW_COPY_AND_ASSIGN(BooleanNegateInstr); |
4056 }; | 4070 }; |
4057 | 4071 |
4058 | 4072 |
4059 class InstanceOfInstr : public TemplateDefinition<2, Throws> { | 4073 class InstanceOfInstr : public TemplateDefinition<2, Throws> { |
4060 public: | 4074 public: |
4061 InstanceOfInstr(intptr_t token_pos, | 4075 InstanceOfInstr(TokenPosition token_pos, |
4062 Value* value, | 4076 Value* value, |
4063 Value* instantiator_type_arguments, | 4077 Value* instantiator_type_arguments, |
4064 const AbstractType& type, | 4078 const AbstractType& type, |
4065 bool negate_result, | 4079 bool negate_result, |
4066 intptr_t deopt_id) | 4080 intptr_t deopt_id) |
4067 : TemplateDefinition(deopt_id), | 4081 : TemplateDefinition(deopt_id), |
4068 token_pos_(token_pos), | 4082 token_pos_(token_pos), |
4069 type_(type), | 4083 type_(type), |
4070 negate_result_(negate_result) { | 4084 negate_result_(negate_result) { |
4071 ASSERT(!type.IsNull()); | 4085 ASSERT(!type.IsNull()); |
4072 SetInputAt(0, value); | 4086 SetInputAt(0, value); |
4073 SetInputAt(1, instantiator_type_arguments); | 4087 SetInputAt(1, instantiator_type_arguments); |
4074 } | 4088 } |
4075 | 4089 |
4076 DECLARE_INSTRUCTION(InstanceOf) | 4090 DECLARE_INSTRUCTION(InstanceOf) |
4077 virtual CompileType ComputeType() const; | 4091 virtual CompileType ComputeType() const; |
4078 | 4092 |
4079 Value* value() const { return inputs_[0]; } | 4093 Value* value() const { return inputs_[0]; } |
4080 Value* instantiator_type_arguments() const { return inputs_[1]; } | 4094 Value* instantiator_type_arguments() const { return inputs_[1]; } |
4081 | 4095 |
4082 bool negate_result() const { return negate_result_; } | 4096 bool negate_result() const { return negate_result_; } |
4083 const AbstractType& type() const { return type_; } | 4097 const AbstractType& type() const { return type_; } |
4084 virtual intptr_t token_pos() const { return token_pos_; } | 4098 virtual TokenPosition token_pos() const { return token_pos_; } |
4085 | 4099 |
4086 virtual void PrintOperandsTo(BufferFormatter* f) const; | 4100 virtual void PrintOperandsTo(BufferFormatter* f) const; |
4087 | 4101 |
4088 virtual bool CanDeoptimize() const { return true; } | 4102 virtual bool CanDeoptimize() const { return true; } |
4089 | 4103 |
4090 virtual EffectSet Effects() const { return EffectSet::None(); } | 4104 virtual EffectSet Effects() const { return EffectSet::None(); } |
4091 | 4105 |
4092 private: | 4106 private: |
4093 const intptr_t token_pos_; | 4107 const TokenPosition token_pos_; |
4094 Value* value_; | 4108 Value* value_; |
4095 Value* type_arguments_; | 4109 Value* type_arguments_; |
4096 const AbstractType& type_; | 4110 const AbstractType& type_; |
4097 const bool negate_result_; | 4111 const bool negate_result_; |
4098 | 4112 |
4099 DISALLOW_COPY_AND_ASSIGN(InstanceOfInstr); | 4113 DISALLOW_COPY_AND_ASSIGN(InstanceOfInstr); |
4100 }; | 4114 }; |
4101 | 4115 |
4102 | 4116 |
4103 class AllocateObjectInstr : public TemplateDefinition<0, NoThrow> { | 4117 class AllocateObjectInstr : public TemplateDefinition<0, NoThrow> { |
4104 public: | 4118 public: |
4105 AllocateObjectInstr(intptr_t token_pos, | 4119 AllocateObjectInstr(TokenPosition token_pos, |
4106 const Class& cls, | 4120 const Class& cls, |
4107 ZoneGrowableArray<PushArgumentInstr*>* arguments) | 4121 ZoneGrowableArray<PushArgumentInstr*>* arguments) |
4108 : token_pos_(token_pos), | 4122 : token_pos_(token_pos), |
4109 cls_(cls), | 4123 cls_(cls), |
4110 arguments_(arguments), | 4124 arguments_(arguments), |
4111 identity_(AliasIdentity::Unknown()), | 4125 identity_(AliasIdentity::Unknown()), |
4112 closure_function_(Function::ZoneHandle()) { | 4126 closure_function_(Function::ZoneHandle()) { |
4113 // Either no arguments or one type-argument and one instantiator. | 4127 // Either no arguments or one type-argument and one instantiator. |
4114 ASSERT(arguments->is_empty() || (arguments->length() == 1)); | 4128 ASSERT(arguments->is_empty() || (arguments->length() == 1)); |
4115 } | 4129 } |
4116 | 4130 |
4117 DECLARE_INSTRUCTION(AllocateObject) | 4131 DECLARE_INSTRUCTION(AllocateObject) |
4118 virtual CompileType ComputeType() const; | 4132 virtual CompileType ComputeType() const; |
4119 | 4133 |
4120 virtual intptr_t ArgumentCount() const { return arguments_->length(); } | 4134 virtual intptr_t ArgumentCount() const { return arguments_->length(); } |
4121 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { | 4135 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { |
4122 return (*arguments_)[index]; | 4136 return (*arguments_)[index]; |
4123 } | 4137 } |
4124 | 4138 |
4125 const Class& cls() const { return cls_; } | 4139 const Class& cls() const { return cls_; } |
4126 virtual intptr_t token_pos() const { return token_pos_; } | 4140 virtual TokenPosition token_pos() const { return token_pos_; } |
4127 | 4141 |
4128 const Function& closure_function() const { return closure_function_; } | 4142 const Function& closure_function() const { return closure_function_; } |
4129 void set_closure_function(const Function& function) { | 4143 void set_closure_function(const Function& function) { |
4130 closure_function_ ^= function.raw(); | 4144 closure_function_ ^= function.raw(); |
4131 } | 4145 } |
4132 | 4146 |
4133 virtual void PrintOperandsTo(BufferFormatter* f) const; | 4147 virtual void PrintOperandsTo(BufferFormatter* f) const; |
4134 | 4148 |
4135 virtual bool CanDeoptimize() const { return false; } | 4149 virtual bool CanDeoptimize() const { return false; } |
4136 | 4150 |
4137 virtual EffectSet Effects() const { return EffectSet::None(); } | 4151 virtual EffectSet Effects() const { return EffectSet::None(); } |
4138 | 4152 |
4139 virtual AliasIdentity Identity() const { return identity_; } | 4153 virtual AliasIdentity Identity() const { return identity_; } |
4140 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } | 4154 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } |
4141 | 4155 |
4142 private: | 4156 private: |
4143 const intptr_t token_pos_; | 4157 const TokenPosition token_pos_; |
4144 const Class& cls_; | 4158 const Class& cls_; |
4145 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; | 4159 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; |
4146 AliasIdentity identity_; | 4160 AliasIdentity identity_; |
4147 Function& closure_function_; | 4161 Function& closure_function_; |
4148 | 4162 |
4149 DISALLOW_COPY_AND_ASSIGN(AllocateObjectInstr); | 4163 DISALLOW_COPY_AND_ASSIGN(AllocateObjectInstr); |
4150 }; | 4164 }; |
4151 | 4165 |
4152 | 4166 |
4153 class AllocateUninitializedContextInstr | 4167 class AllocateUninitializedContextInstr |
4154 : public TemplateDefinition<0, NoThrow> { | 4168 : public TemplateDefinition<0, NoThrow> { |
4155 public: | 4169 public: |
4156 AllocateUninitializedContextInstr(intptr_t token_pos, | 4170 AllocateUninitializedContextInstr(TokenPosition token_pos, |
4157 intptr_t num_context_variables) | 4171 intptr_t num_context_variables) |
4158 : token_pos_(token_pos), | 4172 : token_pos_(token_pos), |
4159 num_context_variables_(num_context_variables), | 4173 num_context_variables_(num_context_variables), |
4160 identity_(AliasIdentity::Unknown()) {} | 4174 identity_(AliasIdentity::Unknown()) {} |
4161 | 4175 |
4162 DECLARE_INSTRUCTION(AllocateUninitializedContext) | 4176 DECLARE_INSTRUCTION(AllocateUninitializedContext) |
4163 virtual CompileType ComputeType() const; | 4177 virtual CompileType ComputeType() const; |
4164 | 4178 |
4165 virtual intptr_t token_pos() const { return token_pos_; } | 4179 virtual TokenPosition token_pos() const { return token_pos_; } |
4166 intptr_t num_context_variables() const { return num_context_variables_; } | 4180 intptr_t num_context_variables() const { return num_context_variables_; } |
4167 | 4181 |
4168 virtual void PrintOperandsTo(BufferFormatter* f) const; | 4182 virtual void PrintOperandsTo(BufferFormatter* f) const; |
4169 | 4183 |
4170 virtual bool CanDeoptimize() const { return false; } | 4184 virtual bool CanDeoptimize() const { return false; } |
4171 | 4185 |
4172 virtual EffectSet Effects() const { return EffectSet::None(); } | 4186 virtual EffectSet Effects() const { return EffectSet::None(); } |
4173 | 4187 |
4174 virtual AliasIdentity Identity() const { return identity_; } | 4188 virtual AliasIdentity Identity() const { return identity_; } |
4175 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } | 4189 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } |
4176 | 4190 |
4177 private: | 4191 private: |
4178 const intptr_t token_pos_; | 4192 const TokenPosition token_pos_; |
4179 const intptr_t num_context_variables_; | 4193 const intptr_t num_context_variables_; |
4180 AliasIdentity identity_; | 4194 AliasIdentity identity_; |
4181 | 4195 |
4182 DISALLOW_COPY_AND_ASSIGN(AllocateUninitializedContextInstr); | 4196 DISALLOW_COPY_AND_ASSIGN(AllocateUninitializedContextInstr); |
4183 }; | 4197 }; |
4184 | 4198 |
4185 | 4199 |
4186 // This instruction captures the state of the object which had its allocation | 4200 // This instruction captures the state of the object which had its allocation |
4187 // removed during the AllocationSinking pass. | 4201 // removed during the AllocationSinking pass. |
4188 // It does not produce any real code only deoptimization information. | 4202 // It does not produce any real code only deoptimization information. |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4292 | 4306 |
4293 bool visited_for_liveness_; | 4307 bool visited_for_liveness_; |
4294 bool registers_remapped_; | 4308 bool registers_remapped_; |
4295 | 4309 |
4296 DISALLOW_COPY_AND_ASSIGN(MaterializeObjectInstr); | 4310 DISALLOW_COPY_AND_ASSIGN(MaterializeObjectInstr); |
4297 }; | 4311 }; |
4298 | 4312 |
4299 | 4313 |
4300 class CreateArrayInstr : public TemplateDefinition<2, Throws> { | 4314 class CreateArrayInstr : public TemplateDefinition<2, Throws> { |
4301 public: | 4315 public: |
4302 CreateArrayInstr(intptr_t token_pos, | 4316 CreateArrayInstr(TokenPosition token_pos, |
4303 Value* element_type, | 4317 Value* element_type, |
4304 Value* num_elements) | 4318 Value* num_elements) |
4305 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 4319 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), |
4306 token_pos_(token_pos), | 4320 token_pos_(token_pos), |
4307 identity_(AliasIdentity::Unknown()) { | 4321 identity_(AliasIdentity::Unknown()) { |
4308 SetInputAt(kElementTypePos, element_type); | 4322 SetInputAt(kElementTypePos, element_type); |
4309 SetInputAt(kLengthPos, num_elements); | 4323 SetInputAt(kLengthPos, num_elements); |
4310 } | 4324 } |
4311 | 4325 |
4312 enum { | 4326 enum { |
4313 kElementTypePos = 0, | 4327 kElementTypePos = 0, |
4314 kLengthPos = 1 | 4328 kLengthPos = 1 |
4315 }; | 4329 }; |
4316 | 4330 |
4317 DECLARE_INSTRUCTION(CreateArray) | 4331 DECLARE_INSTRUCTION(CreateArray) |
4318 virtual CompileType ComputeType() const; | 4332 virtual CompileType ComputeType() const; |
4319 | 4333 |
4320 virtual intptr_t token_pos() const { return token_pos_; } | 4334 virtual TokenPosition token_pos() const { return token_pos_; } |
4321 Value* element_type() const { return inputs_[kElementTypePos]; } | 4335 Value* element_type() const { return inputs_[kElementTypePos]; } |
4322 Value* num_elements() const { return inputs_[kLengthPos]; } | 4336 Value* num_elements() const { return inputs_[kLengthPos]; } |
4323 | 4337 |
4324 // Throw needs environment, which is created only if instruction can | 4338 // Throw needs environment, which is created only if instruction can |
4325 // deoptimize. | 4339 // deoptimize. |
4326 virtual bool CanDeoptimize() const { return MayThrow(); } | 4340 virtual bool CanDeoptimize() const { return MayThrow(); } |
4327 | 4341 |
4328 virtual EffectSet Effects() const { return EffectSet::None(); } | 4342 virtual EffectSet Effects() const { return EffectSet::None(); } |
4329 | 4343 |
4330 virtual AliasIdentity Identity() const { return identity_; } | 4344 virtual AliasIdentity Identity() const { return identity_; } |
4331 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } | 4345 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } |
4332 | 4346 |
4333 private: | 4347 private: |
4334 const intptr_t token_pos_; | 4348 const TokenPosition token_pos_; |
4335 AliasIdentity identity_; | 4349 AliasIdentity identity_; |
4336 | 4350 |
4337 DISALLOW_COPY_AND_ASSIGN(CreateArrayInstr); | 4351 DISALLOW_COPY_AND_ASSIGN(CreateArrayInstr); |
4338 }; | 4352 }; |
4339 | 4353 |
4340 | 4354 |
4341 // Note: this instruction must not be moved without the indexed access that | 4355 // Note: this instruction must not be moved without the indexed access that |
4342 // depends on it (e.g. out of loops). GC may cause collect | 4356 // depends on it (e.g. out of loops). GC may cause collect |
4343 // the array while the external data-array is still accessed. | 4357 // the array while the external data-array is still accessed. |
4344 // TODO(vegorov) enable LICMing this instruction by ensuring that array itself | 4358 // TODO(vegorov) enable LICMing this instruction by ensuring that array itself |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4402 private: | 4416 private: |
4403 DISALLOW_COPY_AND_ASSIGN(LoadClassIdInstr); | 4417 DISALLOW_COPY_AND_ASSIGN(LoadClassIdInstr); |
4404 }; | 4418 }; |
4405 | 4419 |
4406 | 4420 |
4407 class LoadFieldInstr : public TemplateDefinition<1, NoThrow> { | 4421 class LoadFieldInstr : public TemplateDefinition<1, NoThrow> { |
4408 public: | 4422 public: |
4409 LoadFieldInstr(Value* instance, | 4423 LoadFieldInstr(Value* instance, |
4410 intptr_t offset_in_bytes, | 4424 intptr_t offset_in_bytes, |
4411 const AbstractType& type, | 4425 const AbstractType& type, |
4412 intptr_t token_pos) | 4426 TokenPosition token_pos) |
4413 : offset_in_bytes_(offset_in_bytes), | 4427 : offset_in_bytes_(offset_in_bytes), |
4414 type_(type), | 4428 type_(type), |
4415 result_cid_(kDynamicCid), | 4429 result_cid_(kDynamicCid), |
4416 immutable_(false), | 4430 immutable_(false), |
4417 recognized_kind_(MethodRecognizer::kUnknown), | 4431 recognized_kind_(MethodRecognizer::kUnknown), |
4418 field_(NULL), | 4432 field_(NULL), |
4419 token_pos_(token_pos) { | 4433 token_pos_(token_pos) { |
4420 ASSERT(offset_in_bytes >= 0); | 4434 ASSERT(offset_in_bytes >= 0); |
4421 // May be null if field is not an instance. | 4435 // May be null if field is not an instance. |
4422 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle()); | 4436 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle()); |
4423 SetInputAt(0, instance); | 4437 SetInputAt(0, instance); |
4424 } | 4438 } |
4425 | 4439 |
4426 LoadFieldInstr(Value* instance, | 4440 LoadFieldInstr(Value* instance, |
4427 const Field* field, | 4441 const Field* field, |
4428 const AbstractType& type, | 4442 const AbstractType& type, |
4429 intptr_t token_pos) | 4443 TokenPosition token_pos) |
4430 : offset_in_bytes_(field->Offset()), | 4444 : offset_in_bytes_(field->Offset()), |
4431 type_(type), | 4445 type_(type), |
4432 result_cid_(kDynamicCid), | 4446 result_cid_(kDynamicCid), |
4433 immutable_(false), | 4447 immutable_(false), |
4434 recognized_kind_(MethodRecognizer::kUnknown), | 4448 recognized_kind_(MethodRecognizer::kUnknown), |
4435 field_(field), | 4449 field_(field), |
4436 token_pos_(token_pos) { | 4450 token_pos_(token_pos) { |
4437 ASSERT(field->IsZoneHandle()); | 4451 ASSERT(field->IsZoneHandle()); |
4438 // May be null if field is not an instance. | 4452 // May be null if field is not an instance. |
4439 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle()); | 4453 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle()); |
4440 SetInputAt(0, instance); | 4454 SetInputAt(0, instance); |
4441 } | 4455 } |
4442 | 4456 |
4443 void set_is_immutable(bool value) { immutable_ = value; } | 4457 void set_is_immutable(bool value) { immutable_ = value; } |
4444 | 4458 |
4445 Value* instance() const { return inputs_[0]; } | 4459 Value* instance() const { return inputs_[0]; } |
4446 intptr_t offset_in_bytes() const { return offset_in_bytes_; } | 4460 intptr_t offset_in_bytes() const { return offset_in_bytes_; } |
4447 const AbstractType& type() const { return type_; } | 4461 const AbstractType& type() const { return type_; } |
4448 void set_result_cid(intptr_t value) { result_cid_ = value; } | 4462 void set_result_cid(intptr_t value) { result_cid_ = value; } |
4449 intptr_t result_cid() const { return result_cid_; } | 4463 intptr_t result_cid() const { return result_cid_; } |
4450 virtual intptr_t token_pos() const { return token_pos_; } | 4464 virtual TokenPosition token_pos() const { return token_pos_; } |
4451 | 4465 |
4452 const Field* field() const { return field_; } | 4466 const Field* field() const { return field_; } |
4453 | 4467 |
4454 virtual Representation representation() const; | 4468 virtual Representation representation() const; |
4455 | 4469 |
4456 bool IsUnboxedLoad() const; | 4470 bool IsUnboxedLoad() const; |
4457 | 4471 |
4458 bool IsPotentialUnboxedLoad() const; | 4472 bool IsPotentialUnboxedLoad() const; |
4459 | 4473 |
4460 void set_recognized_kind(MethodRecognizer::Kind kind) { | 4474 void set_recognized_kind(MethodRecognizer::Kind kind) { |
(...skipping 27 matching lines...) Expand all Loading... |
4488 virtual bool AttributesEqual(Instruction* other) const; | 4502 virtual bool AttributesEqual(Instruction* other) const; |
4489 | 4503 |
4490 private: | 4504 private: |
4491 const intptr_t offset_in_bytes_; | 4505 const intptr_t offset_in_bytes_; |
4492 const AbstractType& type_; | 4506 const AbstractType& type_; |
4493 intptr_t result_cid_; | 4507 intptr_t result_cid_; |
4494 bool immutable_; | 4508 bool immutable_; |
4495 | 4509 |
4496 MethodRecognizer::Kind recognized_kind_; | 4510 MethodRecognizer::Kind recognized_kind_; |
4497 const Field* field_; | 4511 const Field* field_; |
4498 const intptr_t token_pos_; | 4512 const TokenPosition token_pos_; |
4499 | 4513 |
4500 DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr); | 4514 DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr); |
4501 }; | 4515 }; |
4502 | 4516 |
4503 | 4517 |
4504 class InstantiateTypeInstr : public TemplateDefinition<1, Throws> { | 4518 class InstantiateTypeInstr : public TemplateDefinition<1, Throws> { |
4505 public: | 4519 public: |
4506 InstantiateTypeInstr(intptr_t token_pos, | 4520 InstantiateTypeInstr(TokenPosition token_pos, |
4507 const AbstractType& type, | 4521 const AbstractType& type, |
4508 const Class& instantiator_class, | 4522 const Class& instantiator_class, |
4509 Value* instantiator) | 4523 Value* instantiator) |
4510 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 4524 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), |
4511 token_pos_(token_pos), | 4525 token_pos_(token_pos), |
4512 type_(type), | 4526 type_(type), |
4513 instantiator_class_(instantiator_class) { | 4527 instantiator_class_(instantiator_class) { |
4514 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle()); | 4528 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle()); |
4515 SetInputAt(0, instantiator); | 4529 SetInputAt(0, instantiator); |
4516 } | 4530 } |
4517 | 4531 |
4518 DECLARE_INSTRUCTION(InstantiateType) | 4532 DECLARE_INSTRUCTION(InstantiateType) |
4519 | 4533 |
4520 Value* instantiator() const { return inputs_[0]; } | 4534 Value* instantiator() const { return inputs_[0]; } |
4521 const AbstractType& type() const { return type_; | 4535 const AbstractType& type() const { return type_; |
4522 } | 4536 } |
4523 const Class& instantiator_class() const { return instantiator_class_; } | 4537 const Class& instantiator_class() const { return instantiator_class_; } |
4524 virtual intptr_t token_pos() const { return token_pos_; } | 4538 virtual TokenPosition token_pos() const { return token_pos_; } |
4525 | 4539 |
4526 virtual void PrintOperandsTo(BufferFormatter* f) const; | 4540 virtual void PrintOperandsTo(BufferFormatter* f) const; |
4527 | 4541 |
4528 virtual bool CanDeoptimize() const { return true; } | 4542 virtual bool CanDeoptimize() const { return true; } |
4529 | 4543 |
4530 virtual EffectSet Effects() const { return EffectSet::None(); } | 4544 virtual EffectSet Effects() const { return EffectSet::None(); } |
4531 | 4545 |
4532 private: | 4546 private: |
4533 const intptr_t token_pos_; | 4547 const TokenPosition token_pos_; |
4534 const AbstractType& type_; | 4548 const AbstractType& type_; |
4535 const Class& instantiator_class_; | 4549 const Class& instantiator_class_; |
4536 | 4550 |
4537 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeInstr); | 4551 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeInstr); |
4538 }; | 4552 }; |
4539 | 4553 |
4540 | 4554 |
4541 class InstantiateTypeArgumentsInstr : public TemplateDefinition<1, Throws> { | 4555 class InstantiateTypeArgumentsInstr : public TemplateDefinition<1, Throws> { |
4542 public: | 4556 public: |
4543 InstantiateTypeArgumentsInstr(intptr_t token_pos, | 4557 InstantiateTypeArgumentsInstr(TokenPosition token_pos, |
4544 const TypeArguments& type_arguments, | 4558 const TypeArguments& type_arguments, |
4545 const Class& instantiator_class, | 4559 const Class& instantiator_class, |
4546 Value* instantiator) | 4560 Value* instantiator) |
4547 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 4561 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), |
4548 token_pos_(token_pos), | 4562 token_pos_(token_pos), |
4549 type_arguments_(type_arguments), | 4563 type_arguments_(type_arguments), |
4550 instantiator_class_(instantiator_class) { | 4564 instantiator_class_(instantiator_class) { |
4551 ASSERT(type_arguments.IsZoneHandle()); | 4565 ASSERT(type_arguments.IsZoneHandle()); |
4552 SetInputAt(0, instantiator); | 4566 SetInputAt(0, instantiator); |
4553 } | 4567 } |
4554 | 4568 |
4555 DECLARE_INSTRUCTION(InstantiateTypeArguments) | 4569 DECLARE_INSTRUCTION(InstantiateTypeArguments) |
4556 | 4570 |
4557 Value* instantiator() const { return inputs_[0]; } | 4571 Value* instantiator() const { return inputs_[0]; } |
4558 const TypeArguments& type_arguments() const { | 4572 const TypeArguments& type_arguments() const { |
4559 return type_arguments_; | 4573 return type_arguments_; |
4560 } | 4574 } |
4561 const Class& instantiator_class() const { return instantiator_class_; } | 4575 const Class& instantiator_class() const { return instantiator_class_; } |
4562 virtual intptr_t token_pos() const { return token_pos_; } | 4576 virtual TokenPosition token_pos() const { return token_pos_; } |
4563 | 4577 |
4564 virtual void PrintOperandsTo(BufferFormatter* f) const; | 4578 virtual void PrintOperandsTo(BufferFormatter* f) const; |
4565 | 4579 |
4566 virtual bool CanDeoptimize() const { return true; } | 4580 virtual bool CanDeoptimize() const { return true; } |
4567 | 4581 |
4568 virtual EffectSet Effects() const { return EffectSet::None(); } | 4582 virtual EffectSet Effects() const { return EffectSet::None(); } |
4569 | 4583 |
4570 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 4584 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
4571 | 4585 |
4572 private: | 4586 private: |
4573 const intptr_t token_pos_; | 4587 const TokenPosition token_pos_; |
4574 const TypeArguments& type_arguments_; | 4588 const TypeArguments& type_arguments_; |
4575 const Class& instantiator_class_; | 4589 const Class& instantiator_class_; |
4576 | 4590 |
4577 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeArgumentsInstr); | 4591 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeArgumentsInstr); |
4578 }; | 4592 }; |
4579 | 4593 |
4580 | 4594 |
4581 class AllocateContextInstr : public TemplateDefinition<0, NoThrow> { | 4595 class AllocateContextInstr : public TemplateDefinition<0, NoThrow> { |
4582 public: | 4596 public: |
4583 AllocateContextInstr(intptr_t token_pos, | 4597 AllocateContextInstr(TokenPosition token_pos, |
4584 intptr_t num_context_variables) | 4598 intptr_t num_context_variables) |
4585 : token_pos_(token_pos), | 4599 : token_pos_(token_pos), |
4586 num_context_variables_(num_context_variables) { } | 4600 num_context_variables_(num_context_variables) { } |
4587 | 4601 |
4588 DECLARE_INSTRUCTION(AllocateContext) | 4602 DECLARE_INSTRUCTION(AllocateContext) |
4589 virtual CompileType ComputeType() const; | 4603 virtual CompileType ComputeType() const; |
4590 | 4604 |
4591 virtual intptr_t token_pos() const { return token_pos_; } | 4605 virtual TokenPosition token_pos() const { return token_pos_; } |
4592 intptr_t num_context_variables() const { return num_context_variables_; } | 4606 intptr_t num_context_variables() const { return num_context_variables_; } |
4593 | 4607 |
4594 virtual void PrintOperandsTo(BufferFormatter* f) const; | 4608 virtual void PrintOperandsTo(BufferFormatter* f) const; |
4595 | 4609 |
4596 virtual bool CanDeoptimize() const { return false; } | 4610 virtual bool CanDeoptimize() const { return false; } |
4597 | 4611 |
4598 virtual EffectSet Effects() const { return EffectSet::None(); } | 4612 virtual EffectSet Effects() const { return EffectSet::None(); } |
4599 | 4613 |
4600 private: | 4614 private: |
4601 const intptr_t token_pos_; | 4615 const TokenPosition token_pos_; |
4602 const intptr_t num_context_variables_; | 4616 const intptr_t num_context_variables_; |
4603 | 4617 |
4604 DISALLOW_COPY_AND_ASSIGN(AllocateContextInstr); | 4618 DISALLOW_COPY_AND_ASSIGN(AllocateContextInstr); |
4605 }; | 4619 }; |
4606 | 4620 |
4607 | 4621 |
4608 class InitStaticFieldInstr : public TemplateInstruction<1, Throws> { | 4622 class InitStaticFieldInstr : public TemplateInstruction<1, Throws> { |
4609 public: | 4623 public: |
4610 InitStaticFieldInstr(Value* input, const Field& field) | 4624 InitStaticFieldInstr(Value* input, const Field& field) |
4611 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), | 4625 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), |
4612 field_(field) { | 4626 field_(field) { |
4613 SetInputAt(0, input); | 4627 SetInputAt(0, input); |
4614 } | 4628 } |
4615 | 4629 |
4616 virtual intptr_t token_pos() const { return field_.token_pos(); } | 4630 virtual TokenPosition token_pos() const { |
| 4631 return field_.token_pos(); |
| 4632 } |
4617 const Field& field() const { return field_; } | 4633 const Field& field() const { return field_; } |
4618 | 4634 |
4619 DECLARE_INSTRUCTION(InitStaticField) | 4635 DECLARE_INSTRUCTION(InitStaticField) |
4620 | 4636 |
4621 virtual bool CanDeoptimize() const { return true; } | 4637 virtual bool CanDeoptimize() const { return true; } |
4622 virtual EffectSet Effects() const { return EffectSet::All(); } | 4638 virtual EffectSet Effects() const { return EffectSet::All(); } |
4623 virtual Instruction* Canonicalize(FlowGraph* flow_graph); | 4639 virtual Instruction* Canonicalize(FlowGraph* flow_graph); |
4624 | 4640 |
4625 private: | 4641 private: |
4626 const Field& field_; | 4642 const Field& field_; |
4627 | 4643 |
4628 DISALLOW_COPY_AND_ASSIGN(InitStaticFieldInstr); | 4644 DISALLOW_COPY_AND_ASSIGN(InitStaticFieldInstr); |
4629 }; | 4645 }; |
4630 | 4646 |
4631 | 4647 |
4632 class CloneContextInstr : public TemplateDefinition<1, NoThrow> { | 4648 class CloneContextInstr : public TemplateDefinition<1, NoThrow> { |
4633 public: | 4649 public: |
4634 CloneContextInstr(intptr_t token_pos, Value* context_value) | 4650 CloneContextInstr(TokenPosition token_pos, Value* context_value) |
4635 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 4651 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), |
4636 token_pos_(token_pos) { | 4652 token_pos_(token_pos) { |
4637 SetInputAt(0, context_value); | 4653 SetInputAt(0, context_value); |
4638 } | 4654 } |
4639 | 4655 |
4640 virtual intptr_t token_pos() const { return token_pos_; } | 4656 virtual TokenPosition token_pos() const { return token_pos_; } |
4641 Value* context_value() const { return inputs_[0]; } | 4657 Value* context_value() const { return inputs_[0]; } |
4642 | 4658 |
4643 DECLARE_INSTRUCTION(CloneContext) | 4659 DECLARE_INSTRUCTION(CloneContext) |
4644 virtual CompileType ComputeType() const; | 4660 virtual CompileType ComputeType() const; |
4645 | 4661 |
4646 virtual bool CanDeoptimize() const { return true; } | 4662 virtual bool CanDeoptimize() const { return true; } |
4647 | 4663 |
4648 virtual EffectSet Effects() const { return EffectSet::None(); } | 4664 virtual EffectSet Effects() const { return EffectSet::None(); } |
4649 | 4665 |
4650 private: | 4666 private: |
4651 const intptr_t token_pos_; | 4667 const TokenPosition token_pos_; |
4652 | 4668 |
4653 DISALLOW_COPY_AND_ASSIGN(CloneContextInstr); | 4669 DISALLOW_COPY_AND_ASSIGN(CloneContextInstr); |
4654 }; | 4670 }; |
4655 | 4671 |
4656 | 4672 |
4657 class CheckEitherNonSmiInstr : public TemplateInstruction<2, NoThrow, Pure> { | 4673 class CheckEitherNonSmiInstr : public TemplateInstruction<2, NoThrow, Pure> { |
4658 public: | 4674 public: |
4659 CheckEitherNonSmiInstr(Value* left, Value* right, intptr_t deopt_id) | 4675 CheckEitherNonSmiInstr(Value* left, Value* right, intptr_t deopt_id) |
4660 : TemplateInstruction(deopt_id), licm_hoisted_(false) { | 4676 : TemplateInstruction(deopt_id), licm_hoisted_(false) { |
4661 SetInputAt(0, left); | 4677 SetInputAt(0, left); |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4761 ASSERT(idx == 0); | 4777 ASSERT(idx == 0); |
4762 return from_representation(); | 4778 return from_representation(); |
4763 } | 4779 } |
4764 | 4780 |
4765 virtual bool AttributesEqual(Instruction* other) const { | 4781 virtual bool AttributesEqual(Instruction* other) const { |
4766 return other->AsBox()->from_representation() == from_representation(); | 4782 return other->AsBox()->from_representation() == from_representation(); |
4767 } | 4783 } |
4768 | 4784 |
4769 Definition* Canonicalize(FlowGraph* flow_graph); | 4785 Definition* Canonicalize(FlowGraph* flow_graph); |
4770 | 4786 |
4771 virtual intptr_t token_pos() const { | 4787 virtual TokenPosition token_pos() const { |
4772 return ClassifyingTokenPositions::kBox; | 4788 return TokenPosition::kBox; |
4773 } | 4789 } |
4774 | 4790 |
4775 protected: | 4791 protected: |
4776 BoxInstr(Representation from_representation, Value* value) | 4792 BoxInstr(Representation from_representation, Value* value) |
4777 : from_representation_(from_representation) { | 4793 : from_representation_(from_representation) { |
4778 SetInputAt(0, value); | 4794 SetInputAt(0, value); |
4779 } | 4795 } |
4780 | 4796 |
4781 private: | 4797 private: |
4782 intptr_t ValueOffset() const { | 4798 intptr_t ValueOffset() const { |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4887 virtual bool AttributesEqual(Instruction* other) const { | 4903 virtual bool AttributesEqual(Instruction* other) const { |
4888 return representation() == other->AsUnbox()->representation(); | 4904 return representation() == other->AsUnbox()->representation(); |
4889 } | 4905 } |
4890 | 4906 |
4891 Definition* Canonicalize(FlowGraph* flow_graph); | 4907 Definition* Canonicalize(FlowGraph* flow_graph); |
4892 | 4908 |
4893 virtual intptr_t DeoptimizationTarget() const { | 4909 virtual intptr_t DeoptimizationTarget() const { |
4894 return GetDeoptId(); | 4910 return GetDeoptId(); |
4895 } | 4911 } |
4896 | 4912 |
4897 virtual intptr_t token_pos() const { | 4913 virtual TokenPosition token_pos() const { |
4898 return ClassifyingTokenPositions::kBox; | 4914 return TokenPosition::kBox; |
4899 } | 4915 } |
4900 | 4916 |
4901 protected: | 4917 protected: |
4902 UnboxInstr(Representation representation, | 4918 UnboxInstr(Representation representation, |
4903 Value* value, | 4919 Value* value, |
4904 intptr_t deopt_id) | 4920 intptr_t deopt_id) |
4905 : TemplateDefinition(deopt_id), | 4921 : TemplateDefinition(deopt_id), |
4906 representation_(representation) { | 4922 representation_(representation) { |
4907 SetInputAt(0, value); | 4923 SetInputAt(0, value); |
4908 } | 4924 } |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5207 DISALLOW_COPY_AND_ASSIGN(MathMinMaxInstr); | 5223 DISALLOW_COPY_AND_ASSIGN(MathMinMaxInstr); |
5208 }; | 5224 }; |
5209 | 5225 |
5210 | 5226 |
5211 class BinaryDoubleOpInstr : public TemplateDefinition<2, NoThrow, Pure> { | 5227 class BinaryDoubleOpInstr : public TemplateDefinition<2, NoThrow, Pure> { |
5212 public: | 5228 public: |
5213 BinaryDoubleOpInstr(Token::Kind op_kind, | 5229 BinaryDoubleOpInstr(Token::Kind op_kind, |
5214 Value* left, | 5230 Value* left, |
5215 Value* right, | 5231 Value* right, |
5216 intptr_t deopt_id, | 5232 intptr_t deopt_id, |
5217 intptr_t token_pos) | 5233 TokenPosition token_pos) |
5218 : TemplateDefinition(deopt_id), | 5234 : TemplateDefinition(deopt_id), |
5219 op_kind_(op_kind), | 5235 op_kind_(op_kind), |
5220 token_pos_(token_pos) { | 5236 token_pos_(token_pos) { |
5221 SetInputAt(0, left); | 5237 SetInputAt(0, left); |
5222 SetInputAt(1, right); | 5238 SetInputAt(1, right); |
5223 } | 5239 } |
5224 | 5240 |
5225 Value* left() const { return inputs_[0]; } | 5241 Value* left() const { return inputs_[0]; } |
5226 Value* right() const { return inputs_[1]; } | 5242 Value* right() const { return inputs_[1]; } |
5227 | 5243 |
5228 Token::Kind op_kind() const { return op_kind_; } | 5244 Token::Kind op_kind() const { return op_kind_; } |
5229 | 5245 |
5230 virtual intptr_t token_pos() const { return token_pos_; } | 5246 virtual TokenPosition token_pos() const { return token_pos_; } |
5231 | 5247 |
5232 virtual void PrintOperandsTo(BufferFormatter* f) const; | 5248 virtual void PrintOperandsTo(BufferFormatter* f) const; |
5233 | 5249 |
5234 virtual bool CanDeoptimize() const { return false; } | 5250 virtual bool CanDeoptimize() const { return false; } |
5235 | 5251 |
5236 virtual Representation representation() const { | 5252 virtual Representation representation() const { |
5237 return kUnboxedDouble; | 5253 return kUnboxedDouble; |
5238 } | 5254 } |
5239 | 5255 |
5240 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | 5256 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
(...skipping 11 matching lines...) Expand all Loading... |
5252 virtual CompileType ComputeType() const; | 5268 virtual CompileType ComputeType() const; |
5253 | 5269 |
5254 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 5270 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
5255 | 5271 |
5256 virtual bool AttributesEqual(Instruction* other) const { | 5272 virtual bool AttributesEqual(Instruction* other) const { |
5257 return op_kind() == other->AsBinaryDoubleOp()->op_kind(); | 5273 return op_kind() == other->AsBinaryDoubleOp()->op_kind(); |
5258 } | 5274 } |
5259 | 5275 |
5260 private: | 5276 private: |
5261 const Token::Kind op_kind_; | 5277 const Token::Kind op_kind_; |
5262 const intptr_t token_pos_; | 5278 const TokenPosition token_pos_; |
5263 | 5279 |
5264 DISALLOW_COPY_AND_ASSIGN(BinaryDoubleOpInstr); | 5280 DISALLOW_COPY_AND_ASSIGN(BinaryDoubleOpInstr); |
5265 }; | 5281 }; |
5266 | 5282 |
5267 | 5283 |
5268 class BinaryFloat32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> { | 5284 class BinaryFloat32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> { |
5269 public: | 5285 public: |
5270 BinaryFloat32x4OpInstr(Token::Kind op_kind, | 5286 BinaryFloat32x4OpInstr(Token::Kind op_kind, |
5271 Value* left, | 5287 Value* left, |
5272 Value* right, | 5288 Value* right, |
(...skipping 1885 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7158 | 7174 |
7159 private: | 7175 private: |
7160 const Token::Kind op_kind_; | 7176 const Token::Kind op_kind_; |
7161 | 7177 |
7162 DISALLOW_COPY_AND_ASSIGN(UnaryDoubleOpInstr); | 7178 DISALLOW_COPY_AND_ASSIGN(UnaryDoubleOpInstr); |
7163 }; | 7179 }; |
7164 | 7180 |
7165 | 7181 |
7166 class CheckStackOverflowInstr : public TemplateInstruction<0, NoThrow> { | 7182 class CheckStackOverflowInstr : public TemplateInstruction<0, NoThrow> { |
7167 public: | 7183 public: |
7168 CheckStackOverflowInstr(intptr_t token_pos, intptr_t loop_depth) | 7184 CheckStackOverflowInstr(TokenPosition token_pos, intptr_t loop_depth) |
7169 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), | 7185 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), |
7170 token_pos_(token_pos), | 7186 token_pos_(token_pos), |
7171 loop_depth_(loop_depth) { | 7187 loop_depth_(loop_depth) { |
7172 } | 7188 } |
7173 | 7189 |
7174 virtual intptr_t token_pos() const { return token_pos_; } | 7190 virtual TokenPosition token_pos() const { return token_pos_; } |
7175 bool in_loop() const { return loop_depth_ > 0; } | 7191 bool in_loop() const { return loop_depth_ > 0; } |
7176 intptr_t loop_depth() const { return loop_depth_; } | 7192 intptr_t loop_depth() const { return loop_depth_; } |
7177 | 7193 |
7178 DECLARE_INSTRUCTION(CheckStackOverflow) | 7194 DECLARE_INSTRUCTION(CheckStackOverflow) |
7179 | 7195 |
7180 virtual bool CanDeoptimize() const { return true; } | 7196 virtual bool CanDeoptimize() const { return true; } |
7181 | 7197 |
7182 virtual EffectSet Effects() const { return EffectSet::None(); } | 7198 virtual EffectSet Effects() const { return EffectSet::None(); } |
7183 | 7199 |
7184 virtual void PrintOperandsTo(BufferFormatter* f) const; | 7200 virtual void PrintOperandsTo(BufferFormatter* f) const; |
7185 | 7201 |
7186 private: | 7202 private: |
7187 const intptr_t token_pos_; | 7203 const TokenPosition token_pos_; |
7188 const intptr_t loop_depth_; | 7204 const intptr_t loop_depth_; |
7189 | 7205 |
7190 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowInstr); | 7206 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowInstr); |
7191 }; | 7207 }; |
7192 | 7208 |
7193 | 7209 |
7194 // TODO(vegorov): remove this instruction in favor of Int32ToDouble. | 7210 // TODO(vegorov): remove this instruction in favor of Int32ToDouble. |
7195 class SmiToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> { | 7211 class SmiToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> { |
7196 public: | 7212 public: |
7197 SmiToDoubleInstr(Value* value, intptr_t token_pos) | 7213 SmiToDoubleInstr(Value* value, TokenPosition token_pos) |
7198 : token_pos_(token_pos) { | 7214 : token_pos_(token_pos) { |
7199 SetInputAt(0, value); | 7215 SetInputAt(0, value); |
7200 } | 7216 } |
7201 | 7217 |
7202 Value* value() const { return inputs_[0]; } | 7218 Value* value() const { return inputs_[0]; } |
7203 virtual intptr_t token_pos() const { return token_pos_; } | 7219 virtual TokenPosition token_pos() const { return token_pos_; } |
7204 | 7220 |
7205 DECLARE_INSTRUCTION(SmiToDouble) | 7221 DECLARE_INSTRUCTION(SmiToDouble) |
7206 virtual CompileType ComputeType() const; | 7222 virtual CompileType ComputeType() const; |
7207 | 7223 |
7208 virtual Representation representation() const { | 7224 virtual Representation representation() const { |
7209 return kUnboxedDouble; | 7225 return kUnboxedDouble; |
7210 } | 7226 } |
7211 | 7227 |
7212 virtual bool CanDeoptimize() const { return false; } | 7228 virtual bool CanDeoptimize() const { return false; } |
7213 | 7229 |
7214 virtual bool AttributesEqual(Instruction* other) const { return true; } | 7230 virtual bool AttributesEqual(Instruction* other) const { return true; } |
7215 | 7231 |
7216 private: | 7232 private: |
7217 const intptr_t token_pos_; | 7233 const TokenPosition token_pos_; |
7218 | 7234 |
7219 DISALLOW_COPY_AND_ASSIGN(SmiToDoubleInstr); | 7235 DISALLOW_COPY_AND_ASSIGN(SmiToDoubleInstr); |
7220 }; | 7236 }; |
7221 | 7237 |
7222 | 7238 |
7223 class Int32ToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> { | 7239 class Int32ToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> { |
7224 public: | 7240 public: |
7225 explicit Int32ToDoubleInstr(Value* value) { | 7241 explicit Int32ToDoubleInstr(Value* value) { |
7226 SetInputAt(0, value); | 7242 SetInputAt(0, value); |
7227 } | 7243 } |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7454 private: | 7470 private: |
7455 DISALLOW_COPY_AND_ASSIGN(FloatToDoubleInstr); | 7471 DISALLOW_COPY_AND_ASSIGN(FloatToDoubleInstr); |
7456 }; | 7472 }; |
7457 | 7473 |
7458 | 7474 |
7459 class InvokeMathCFunctionInstr : public PureDefinition { | 7475 class InvokeMathCFunctionInstr : public PureDefinition { |
7460 public: | 7476 public: |
7461 InvokeMathCFunctionInstr(ZoneGrowableArray<Value*>* inputs, | 7477 InvokeMathCFunctionInstr(ZoneGrowableArray<Value*>* inputs, |
7462 intptr_t deopt_id, | 7478 intptr_t deopt_id, |
7463 MethodRecognizer::Kind recognized_kind, | 7479 MethodRecognizer::Kind recognized_kind, |
7464 intptr_t token_pos); | 7480 TokenPosition token_pos); |
7465 | 7481 |
7466 static intptr_t ArgumentCountFor(MethodRecognizer::Kind recognized_kind_); | 7482 static intptr_t ArgumentCountFor(MethodRecognizer::Kind recognized_kind_); |
7467 | 7483 |
7468 const RuntimeEntry& TargetFunction() const; | 7484 const RuntimeEntry& TargetFunction() const; |
7469 | 7485 |
7470 MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; } | 7486 MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; } |
7471 | 7487 |
7472 virtual intptr_t token_pos() const { return token_pos_; } | 7488 virtual TokenPosition token_pos() const { return token_pos_; } |
7473 | 7489 |
7474 DECLARE_INSTRUCTION(InvokeMathCFunction) | 7490 DECLARE_INSTRUCTION(InvokeMathCFunction) |
7475 virtual CompileType ComputeType() const; | 7491 virtual CompileType ComputeType() const; |
7476 virtual void PrintOperandsTo(BufferFormatter* f) const; | 7492 virtual void PrintOperandsTo(BufferFormatter* f) const; |
7477 | 7493 |
7478 virtual bool CanDeoptimize() const { return false; } | 7494 virtual bool CanDeoptimize() const { return false; } |
7479 | 7495 |
7480 virtual Representation representation() const { | 7496 virtual Representation representation() const { |
7481 return kUnboxedDouble; | 7497 return kUnboxedDouble; |
7482 } | 7498 } |
(...skipping 24 matching lines...) Expand all Loading... |
7507 static const intptr_t kObjectTempIndex = 1; | 7523 static const intptr_t kObjectTempIndex = 1; |
7508 static const intptr_t kDoubleTempIndex = 2; | 7524 static const intptr_t kDoubleTempIndex = 2; |
7509 | 7525 |
7510 private: | 7526 private: |
7511 virtual void RawSetInputAt(intptr_t i, Value* value) { | 7527 virtual void RawSetInputAt(intptr_t i, Value* value) { |
7512 (*inputs_)[i] = value; | 7528 (*inputs_)[i] = value; |
7513 } | 7529 } |
7514 | 7530 |
7515 ZoneGrowableArray<Value*>* inputs_; | 7531 ZoneGrowableArray<Value*>* inputs_; |
7516 const MethodRecognizer::Kind recognized_kind_; | 7532 const MethodRecognizer::Kind recognized_kind_; |
7517 const intptr_t token_pos_; | 7533 const TokenPosition token_pos_; |
7518 | 7534 |
7519 DISALLOW_COPY_AND_ASSIGN(InvokeMathCFunctionInstr); | 7535 DISALLOW_COPY_AND_ASSIGN(InvokeMathCFunctionInstr); |
7520 }; | 7536 }; |
7521 | 7537 |
7522 | 7538 |
7523 class ExtractNthOutputInstr : public TemplateDefinition<1, NoThrow, Pure> { | 7539 class ExtractNthOutputInstr : public TemplateDefinition<1, NoThrow, Pure> { |
7524 public: | 7540 public: |
7525 // Extract the Nth output register from value. | 7541 // Extract the Nth output register from value. |
7526 ExtractNthOutputInstr(Value* value, | 7542 ExtractNthOutputInstr(Value* value, |
7527 intptr_t n, | 7543 intptr_t n, |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7668 MergedMathInstr::Kind kind_; | 7684 MergedMathInstr::Kind kind_; |
7669 DISALLOW_COPY_AND_ASSIGN(MergedMathInstr); | 7685 DISALLOW_COPY_AND_ASSIGN(MergedMathInstr); |
7670 }; | 7686 }; |
7671 | 7687 |
7672 | 7688 |
7673 class CheckClassInstr : public TemplateInstruction<1, NoThrow> { | 7689 class CheckClassInstr : public TemplateInstruction<1, NoThrow> { |
7674 public: | 7690 public: |
7675 CheckClassInstr(Value* value, | 7691 CheckClassInstr(Value* value, |
7676 intptr_t deopt_id, | 7692 intptr_t deopt_id, |
7677 const ICData& unary_checks, | 7693 const ICData& unary_checks, |
7678 intptr_t token_pos); | 7694 TokenPosition token_pos); |
7679 | 7695 |
7680 DECLARE_INSTRUCTION(CheckClass) | 7696 DECLARE_INSTRUCTION(CheckClass) |
7681 | 7697 |
7682 virtual bool CanDeoptimize() const { return true; } | 7698 virtual bool CanDeoptimize() const { return true; } |
7683 | 7699 |
7684 virtual intptr_t token_pos() const { return token_pos_; } | 7700 virtual TokenPosition token_pos() const { return token_pos_; } |
7685 | 7701 |
7686 Value* value() const { return inputs_[0]; } | 7702 Value* value() const { return inputs_[0]; } |
7687 | 7703 |
7688 const ICData& unary_checks() const { return unary_checks_; } | 7704 const ICData& unary_checks() const { return unary_checks_; } |
7689 | 7705 |
7690 const GrowableArray<intptr_t>& cids() const { return cids_; } | 7706 const GrowableArray<intptr_t>& cids() const { return cids_; } |
7691 | 7707 |
7692 virtual Instruction* Canonicalize(FlowGraph* flow_graph); | 7708 virtual Instruction* Canonicalize(FlowGraph* flow_graph); |
7693 | 7709 |
7694 virtual void PrintOperandsTo(BufferFormatter* f) const; | 7710 virtual void PrintOperandsTo(BufferFormatter* f) const; |
(...skipping 15 matching lines...) Expand all Loading... |
7710 virtual bool AttributesEqual(Instruction* other) const; | 7726 virtual bool AttributesEqual(Instruction* other) const; |
7711 | 7727 |
7712 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } | 7728 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } |
7713 | 7729 |
7714 static bool IsImmutableClassId(intptr_t cid); | 7730 static bool IsImmutableClassId(intptr_t cid); |
7715 | 7731 |
7716 private: | 7732 private: |
7717 const ICData& unary_checks_; | 7733 const ICData& unary_checks_; |
7718 GrowableArray<intptr_t> cids_; // Sorted, lowest first. | 7734 GrowableArray<intptr_t> cids_; // Sorted, lowest first. |
7719 bool licm_hoisted_; | 7735 bool licm_hoisted_; |
7720 const intptr_t token_pos_; | 7736 const TokenPosition token_pos_; |
7721 | 7737 |
7722 DISALLOW_COPY_AND_ASSIGN(CheckClassInstr); | 7738 DISALLOW_COPY_AND_ASSIGN(CheckClassInstr); |
7723 }; | 7739 }; |
7724 | 7740 |
7725 | 7741 |
7726 class CheckSmiInstr : public TemplateInstruction<1, NoThrow, Pure> { | 7742 class CheckSmiInstr : public TemplateInstruction<1, NoThrow, Pure> { |
7727 public: | 7743 public: |
7728 CheckSmiInstr(Value* value, intptr_t deopt_id, intptr_t token_pos) | 7744 CheckSmiInstr(Value* value, intptr_t deopt_id, TokenPosition token_pos) |
7729 : TemplateInstruction(deopt_id), | 7745 : TemplateInstruction(deopt_id), |
7730 token_pos_(token_pos), | 7746 token_pos_(token_pos), |
7731 licm_hoisted_(false) { | 7747 licm_hoisted_(false) { |
7732 SetInputAt(0, value); | 7748 SetInputAt(0, value); |
7733 } | 7749 } |
7734 | 7750 |
7735 Value* value() const { return inputs_[0]; } | 7751 Value* value() const { return inputs_[0]; } |
7736 virtual intptr_t token_pos() const { return token_pos_; } | 7752 virtual TokenPosition token_pos() const { return token_pos_; } |
7737 | 7753 |
7738 DECLARE_INSTRUCTION(CheckSmi) | 7754 DECLARE_INSTRUCTION(CheckSmi) |
7739 | 7755 |
7740 virtual bool CanDeoptimize() const { return true; } | 7756 virtual bool CanDeoptimize() const { return true; } |
7741 | 7757 |
7742 virtual Instruction* Canonicalize(FlowGraph* flow_graph); | 7758 virtual Instruction* Canonicalize(FlowGraph* flow_graph); |
7743 | 7759 |
7744 virtual bool AttributesEqual(Instruction* other) const { return true; } | 7760 virtual bool AttributesEqual(Instruction* other) const { return true; } |
7745 | 7761 |
7746 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } | 7762 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } |
7747 | 7763 |
7748 private: | 7764 private: |
7749 const intptr_t token_pos_; | 7765 const TokenPosition token_pos_; |
7750 bool licm_hoisted_; | 7766 bool licm_hoisted_; |
7751 | 7767 |
7752 DISALLOW_COPY_AND_ASSIGN(CheckSmiInstr); | 7768 DISALLOW_COPY_AND_ASSIGN(CheckSmiInstr); |
7753 }; | 7769 }; |
7754 | 7770 |
7755 | 7771 |
7756 class CheckClassIdInstr : public TemplateInstruction<1, NoThrow> { | 7772 class CheckClassIdInstr : public TemplateInstruction<1, NoThrow> { |
7757 public: | 7773 public: |
7758 CheckClassIdInstr(Value* value, intptr_t cid, intptr_t deopt_id) | 7774 CheckClassIdInstr(Value* value, intptr_t cid, intptr_t deopt_id) |
7759 : TemplateInstruction(deopt_id), cid_(cid) { | 7775 : TemplateInstruction(deopt_id), cid_(cid) { |
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8175 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ | 8191 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ |
8176 UNIMPLEMENTED(); \ | 8192 UNIMPLEMENTED(); \ |
8177 return NULL; \ | 8193 return NULL; \ |
8178 } \ | 8194 } \ |
8179 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } | 8195 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } |
8180 | 8196 |
8181 | 8197 |
8182 } // namespace dart | 8198 } // namespace dart |
8183 | 8199 |
8184 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 8200 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
OLD | NEW |