| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
| 6 | 6 |
| 7 #include "src/assembler.h" | 7 #include "src/assembler.h" |
| 8 #include "src/base/lazy-instance.h" | 8 #include "src/base/lazy-instance.h" |
| 9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
| 10 #include "src/compiler/opcodes.h" | 10 #include "src/compiler/opcodes.h" |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 | 95 |
| 96 std::ostream& operator<<(std::ostream& os, ParameterInfo const& i) { | 96 std::ostream& operator<<(std::ostream& os, ParameterInfo const& i) { |
| 97 if (i.debug_name()) os << i.debug_name() << '#'; | 97 if (i.debug_name()) os << i.debug_name() << '#'; |
| 98 os << i.index(); | 98 os << i.index(); |
| 99 return os; | 99 return os; |
| 100 } | 100 } |
| 101 | 101 |
| 102 | 102 |
| 103 #define CACHED_OP_LIST(V) \ | 103 #define CACHED_OP_LIST(V) \ |
| 104 V(Dead, Operator::kFoldable, 0, 0, 0, 0, 0, 1) \ | 104 V(Dead, Operator::kFoldable, 0, 0, 0, 0, 0, 1) \ |
| 105 V(End, Operator::kKontrol, 0, 0, 1, 0, 0, 0) \ | |
| 106 V(IfTrue, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 105 V(IfTrue, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| 107 V(IfFalse, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 106 V(IfFalse, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| 108 V(IfSuccess, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 107 V(IfSuccess, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| 109 V(IfException, Operator::kKontrol, 0, 0, 1, 1, 0, 1) \ | 108 V(IfException, Operator::kKontrol, 0, 0, 1, 1, 0, 1) \ |
| 110 V(IfDefault, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 109 V(IfDefault, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| 111 V(Throw, Operator::kKontrol, 1, 1, 1, 0, 0, 1) \ | 110 V(Throw, Operator::kKontrol, 1, 1, 1, 0, 0, 1) \ |
| 112 V(Deoptimize, Operator::kNoThrow, 1, 1, 1, 0, 0, 1) \ | 111 V(Deoptimize, Operator::kNoThrow, 1, 1, 1, 0, 0, 1) \ |
| 113 V(Return, Operator::kNoThrow, 1, 1, 1, 0, 0, 1) \ | 112 V(Return, Operator::kNoThrow, 1, 1, 1, 0, 0, 1) \ |
| 114 V(Terminate, Operator::kNoThrow, 0, 1, 1, 0, 0, 1) \ | 113 V(Terminate, Operator::kNoThrow, 0, 1, 1, 0, 0, 1) \ |
| 115 V(OsrNormalEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) \ | 114 V(OsrNormalEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) \ |
| 116 V(OsrLoopEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) | 115 V(OsrLoopEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) |
| 117 | 116 |
| 118 | 117 |
| 118 #define CACHED_END_LIST(V) \ |
| 119 V(1) \ |
| 120 V(2) \ |
| 121 V(3) \ |
| 122 V(4) \ |
| 123 V(5) \ |
| 124 V(6) \ |
| 125 V(7) \ |
| 126 V(8) |
| 127 |
| 128 |
| 119 #define CACHED_EFFECT_PHI_LIST(V) \ | 129 #define CACHED_EFFECT_PHI_LIST(V) \ |
| 120 V(1) \ | 130 V(1) \ |
| 121 V(2) \ | 131 V(2) \ |
| 122 V(3) \ | 132 V(3) \ |
| 123 V(4) \ | 133 V(4) \ |
| 124 V(5) \ | 134 V(5) \ |
| 125 V(6) | 135 V(6) |
| 126 | 136 |
| 127 | 137 |
| 128 #define CACHED_LOOP_LIST(V) \ | 138 #define CACHED_LOOP_LIST(V) \ |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 Name##Operator() \ | 203 Name##Operator() \ |
| 194 : Operator(IrOpcode::k##Name, properties, #Name, value_input_count, \ | 204 : Operator(IrOpcode::k##Name, properties, #Name, value_input_count, \ |
| 195 effect_input_count, control_input_count, \ | 205 effect_input_count, control_input_count, \ |
| 196 value_output_count, effect_output_count, \ | 206 value_output_count, effect_output_count, \ |
| 197 control_output_count) {} \ | 207 control_output_count) {} \ |
| 198 }; \ | 208 }; \ |
| 199 Name##Operator k##Name##Operator; | 209 Name##Operator k##Name##Operator; |
| 200 CACHED_OP_LIST(CACHED) | 210 CACHED_OP_LIST(CACHED) |
| 201 #undef CACHED | 211 #undef CACHED |
| 202 | 212 |
| 213 template <size_t kInputCount> |
| 214 struct EndOperator final : public Operator { |
| 215 EndOperator() |
| 216 : Operator( // -- |
| 217 IrOpcode::kEnd, Operator::kKontrol, // opcode |
| 218 "End", // name |
| 219 0, 0, kInputCount, 0, 0, 0) {} // counts |
| 220 }; |
| 221 #define CACHED_END(input_count) \ |
| 222 EndOperator<input_count> kEnd##input_count##Operator; |
| 223 CACHED_END_LIST(CACHED_END) |
| 224 #undef CACHED_END |
| 225 |
| 203 template <BranchHint kBranchHint> | 226 template <BranchHint kBranchHint> |
| 204 struct BranchOperator final : public Operator1<BranchHint> { | 227 struct BranchOperator final : public Operator1<BranchHint> { |
| 205 BranchOperator() | 228 BranchOperator() |
| 206 : Operator1<BranchHint>( // -- | 229 : Operator1<BranchHint>( // -- |
| 207 IrOpcode::kBranch, Operator::kKontrol, // opcode | 230 IrOpcode::kBranch, Operator::kKontrol, // opcode |
| 208 "Branch", // name | 231 "Branch", // name |
| 209 1, 0, 1, 0, 0, 2, // counts | 232 1, 0, 1, 0, 0, 2, // counts |
| 210 kBranchHint) {} // parameter | 233 kBranchHint) {} // parameter |
| 211 }; | 234 }; |
| 212 BranchOperator<BranchHint::kNone> kBranchNoneOperator; | 235 BranchOperator<BranchHint::kNone> kBranchNoneOperator; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 #define CACHED(Name, properties, value_input_count, effect_input_count, \ | 345 #define CACHED(Name, properties, value_input_count, effect_input_count, \ |
| 323 control_input_count, value_output_count, effect_output_count, \ | 346 control_input_count, value_output_count, effect_output_count, \ |
| 324 control_output_count) \ | 347 control_output_count) \ |
| 325 const Operator* CommonOperatorBuilder::Name() { \ | 348 const Operator* CommonOperatorBuilder::Name() { \ |
| 326 return &cache_.k##Name##Operator; \ | 349 return &cache_.k##Name##Operator; \ |
| 327 } | 350 } |
| 328 CACHED_OP_LIST(CACHED) | 351 CACHED_OP_LIST(CACHED) |
| 329 #undef CACHED | 352 #undef CACHED |
| 330 | 353 |
| 331 | 354 |
| 355 const Operator* CommonOperatorBuilder::End(size_t control_input_count) { |
| 356 DCHECK_NE(0u, control_input_count); // Disallow empty ends. |
| 357 switch (control_input_count) { |
| 358 #define CACHED_END(input_count) \ |
| 359 case input_count: \ |
| 360 return &cache_.kEnd##input_count##Operator; |
| 361 CACHED_END_LIST(CACHED_END) |
| 362 #undef CACHED_END |
| 363 default: |
| 364 break; |
| 365 } |
| 366 // Uncached. |
| 367 return new (zone()) Operator( //-- |
| 368 IrOpcode::kEnd, Operator::kKontrol, // opcode |
| 369 "End", // name |
| 370 0, 0, control_input_count, 0, 0, 0); // counts |
| 371 } |
| 372 |
| 373 |
| 332 const Operator* CommonOperatorBuilder::Branch(BranchHint hint) { | 374 const Operator* CommonOperatorBuilder::Branch(BranchHint hint) { |
| 333 switch (hint) { | 375 switch (hint) { |
| 334 case BranchHint::kNone: | 376 case BranchHint::kNone: |
| 335 return &cache_.kBranchNoneOperator; | 377 return &cache_.kBranchNoneOperator; |
| 336 case BranchHint::kTrue: | 378 case BranchHint::kTrue: |
| 337 return &cache_.kBranchTrueOperator; | 379 return &cache_.kBranchTrueOperator; |
| 338 case BranchHint::kFalse: | 380 case BranchHint::kFalse: |
| 339 return &cache_.kBranchFalseOperator; | 381 return &cache_.kBranchFalseOperator; |
| 340 } | 382 } |
| 341 UNREACHABLE(); | 383 UNREACHABLE(); |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 } else { | 732 } else { |
| 691 UNREACHABLE(); | 733 UNREACHABLE(); |
| 692 return nullptr; | 734 return nullptr; |
| 693 } | 735 } |
| 694 } | 736 } |
| 695 | 737 |
| 696 | 738 |
| 697 } // namespace compiler | 739 } // namespace compiler |
| 698 } // namespace internal | 740 } // namespace internal |
| 699 } // namespace v8 | 741 } // namespace v8 |
| OLD | NEW |