| 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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 | 68 |
| 69 std::ostream& operator<<(std::ostream& os, DeoptimizeParameters p) { | 69 std::ostream& operator<<(std::ostream& os, DeoptimizeParameters p) { |
| 70 return os << p.kind() << ":" << p.reason(); | 70 return os << p.kind() << ":" << p.reason(); |
| 71 } | 71 } |
| 72 | 72 |
| 73 DeoptimizeParameters const& DeoptimizeParametersOf(Operator const* const op) { | 73 DeoptimizeParameters const& DeoptimizeParametersOf(Operator const* const op) { |
| 74 DCHECK_EQ(IrOpcode::kDeoptimize, op->opcode()); | 74 DCHECK_EQ(IrOpcode::kDeoptimize, op->opcode()); |
| 75 return OpParameter<DeoptimizeParameters>(op); | 75 return OpParameter<DeoptimizeParameters>(op); |
| 76 } | 76 } |
| 77 | 77 |
| 78 IfExceptionHint ExceptionHintFromCatchPrediction( | |
| 79 HandlerTable::CatchPrediction prediction) { | |
| 80 switch (prediction) { | |
| 81 case HandlerTable::UNCAUGHT: | |
| 82 return IfExceptionHint::kLocallyUncaught; | |
| 83 case HandlerTable::CAUGHT: | |
| 84 return IfExceptionHint::kLocallyCaught; | |
| 85 case HandlerTable::PROMISE: | |
| 86 return IfExceptionHint::kLocallyCaughtForPromiseReject; | |
| 87 } | |
| 88 UNREACHABLE(); | |
| 89 return IfExceptionHint::kLocallyUncaught; | |
| 90 } | |
| 91 | |
| 92 size_t hash_value(IfExceptionHint hint) { return static_cast<size_t>(hint); } | |
| 93 | |
| 94 | |
| 95 std::ostream& operator<<(std::ostream& os, IfExceptionHint hint) { | |
| 96 switch (hint) { | |
| 97 case IfExceptionHint::kLocallyUncaught: | |
| 98 return os << "Uncaught"; | |
| 99 case IfExceptionHint::kLocallyCaught: | |
| 100 return os << "Caught"; | |
| 101 case IfExceptionHint::kLocallyCaughtForPromiseReject: | |
| 102 return os << "CaughtForPromiseReject"; | |
| 103 } | |
| 104 UNREACHABLE(); | |
| 105 return os; | |
| 106 } | |
| 107 | |
| 108 | 78 |
| 109 bool operator==(SelectParameters const& lhs, SelectParameters const& rhs) { | 79 bool operator==(SelectParameters const& lhs, SelectParameters const& rhs) { |
| 110 return lhs.representation() == rhs.representation() && | 80 return lhs.representation() == rhs.representation() && |
| 111 lhs.hint() == rhs.hint(); | 81 lhs.hint() == rhs.hint(); |
| 112 } | 82 } |
| 113 | 83 |
| 114 | 84 |
| 115 bool operator!=(SelectParameters const& lhs, SelectParameters const& rhs) { | 85 bool operator!=(SelectParameters const& lhs, SelectParameters const& rhs) { |
| 116 return !(lhs == rhs); | 86 return !(lhs == rhs); |
| 117 } | 87 } |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 os << elem; | 203 os << elem; |
| 234 } | 204 } |
| 235 return os; | 205 return os; |
| 236 } | 206 } |
| 237 | 207 |
| 238 #define CACHED_OP_LIST(V) \ | 208 #define CACHED_OP_LIST(V) \ |
| 239 V(Dead, Operator::kFoldable, 0, 0, 0, 1, 1, 1) \ | 209 V(Dead, Operator::kFoldable, 0, 0, 0, 1, 1, 1) \ |
| 240 V(IfTrue, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 210 V(IfTrue, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| 241 V(IfFalse, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 211 V(IfFalse, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| 242 V(IfSuccess, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 212 V(IfSuccess, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| 213 V(IfException, Operator::kKontrol, 0, 1, 1, 1, 1, 1) \ |
| 243 V(IfDefault, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 214 V(IfDefault, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| 244 V(Throw, Operator::kKontrol, 1, 1, 1, 0, 0, 1) \ | 215 V(Throw, Operator::kKontrol, 1, 1, 1, 0, 0, 1) \ |
| 245 V(Terminate, Operator::kKontrol, 0, 1, 1, 0, 0, 1) \ | 216 V(Terminate, Operator::kKontrol, 0, 1, 1, 0, 0, 1) \ |
| 246 V(OsrNormalEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) \ | 217 V(OsrNormalEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) \ |
| 247 V(OsrLoopEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) \ | 218 V(OsrLoopEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) \ |
| 248 V(LoopExit, Operator::kKontrol, 0, 0, 2, 0, 0, 1) \ | 219 V(LoopExit, Operator::kKontrol, 0, 0, 2, 0, 0, 1) \ |
| 249 V(LoopExitValue, Operator::kPure, 1, 0, 1, 1, 0, 0) \ | 220 V(LoopExitValue, Operator::kPure, 1, 0, 1, 1, 0, 0) \ |
| 250 V(LoopExitEffect, Operator::kNoThrow, 0, 1, 1, 0, 1, 0) \ | 221 V(LoopExitEffect, Operator::kNoThrow, 0, 1, 1, 0, 1, 0) \ |
| 251 V(Checkpoint, Operator::kKontrol, 0, 1, 1, 0, 1, 0) \ | 222 V(Checkpoint, Operator::kKontrol, 0, 1, 1, 0, 1, 0) \ |
| 252 V(FinishRegion, Operator::kKontrol, 1, 1, 0, 1, 1, 0) \ | 223 V(FinishRegion, Operator::kKontrol, 1, 1, 0, 1, 1, 0) \ |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 Name##Operator() \ | 322 Name##Operator() \ |
| 352 : Operator(IrOpcode::k##Name, properties, #Name, value_input_count, \ | 323 : Operator(IrOpcode::k##Name, properties, #Name, value_input_count, \ |
| 353 effect_input_count, control_input_count, \ | 324 effect_input_count, control_input_count, \ |
| 354 value_output_count, effect_output_count, \ | 325 value_output_count, effect_output_count, \ |
| 355 control_output_count) {} \ | 326 control_output_count) {} \ |
| 356 }; \ | 327 }; \ |
| 357 Name##Operator k##Name##Operator; | 328 Name##Operator k##Name##Operator; |
| 358 CACHED_OP_LIST(CACHED) | 329 CACHED_OP_LIST(CACHED) |
| 359 #undef CACHED | 330 #undef CACHED |
| 360 | 331 |
| 361 template <IfExceptionHint kCaughtLocally> | |
| 362 struct IfExceptionOperator final : public Operator1<IfExceptionHint> { | |
| 363 IfExceptionOperator() | |
| 364 : Operator1<IfExceptionHint>( // -- | |
| 365 IrOpcode::kIfException, Operator::kKontrol, // opcode | |
| 366 "IfException", // name | |
| 367 0, 1, 1, 1, 1, 1, // counts | |
| 368 kCaughtLocally) {} // parameter | |
| 369 }; | |
| 370 IfExceptionOperator<IfExceptionHint::kLocallyUncaught> kIfExceptionUOperator; | |
| 371 IfExceptionOperator<IfExceptionHint::kLocallyCaught> kIfExceptionCOperator; | |
| 372 IfExceptionOperator<IfExceptionHint::kLocallyCaughtForPromiseReject> | |
| 373 kIfExceptionPOperator; | |
| 374 | |
| 375 template <size_t kInputCount> | 332 template <size_t kInputCount> |
| 376 struct EndOperator final : public Operator { | 333 struct EndOperator final : public Operator { |
| 377 EndOperator() | 334 EndOperator() |
| 378 : Operator( // -- | 335 : Operator( // -- |
| 379 IrOpcode::kEnd, Operator::kKontrol, // opcode | 336 IrOpcode::kEnd, Operator::kKontrol, // opcode |
| 380 "End", // name | 337 "End", // name |
| 381 0, 0, kInputCount, 0, 0, 0) {} // counts | 338 0, 0, kInputCount, 0, 0, 0) {} // counts |
| 382 }; | 339 }; |
| 383 #define CACHED_END(input_count) \ | 340 #define CACHED_END(input_count) \ |
| 384 EndOperator<input_count> kEnd##input_count##Operator; | 341 EndOperator<input_count> kEnd##input_count##Operator; |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 DeoptimizeReason reason) { | 588 DeoptimizeReason reason) { |
| 632 // TODO(turbofan): Cache the most common versions of this. | 589 // TODO(turbofan): Cache the most common versions of this. |
| 633 return new (zone()) Operator1<DeoptimizeReason>( // -- | 590 return new (zone()) Operator1<DeoptimizeReason>( // -- |
| 634 IrOpcode::kDeoptimizeUnless, // opcode | 591 IrOpcode::kDeoptimizeUnless, // opcode |
| 635 Operator::kFoldable | Operator::kNoThrow, // properties | 592 Operator::kFoldable | Operator::kNoThrow, // properties |
| 636 "DeoptimizeUnless", // name | 593 "DeoptimizeUnless", // name |
| 637 2, 1, 1, 0, 1, 1, // counts | 594 2, 1, 1, 0, 1, 1, // counts |
| 638 reason); // parameter | 595 reason); // parameter |
| 639 } | 596 } |
| 640 | 597 |
| 641 const Operator* CommonOperatorBuilder::IfException(IfExceptionHint hint) { | |
| 642 switch (hint) { | |
| 643 case IfExceptionHint::kLocallyUncaught: | |
| 644 return &cache_.kIfExceptionUOperator; | |
| 645 case IfExceptionHint::kLocallyCaught: | |
| 646 return &cache_.kIfExceptionCOperator; | |
| 647 case IfExceptionHint::kLocallyCaughtForPromiseReject: | |
| 648 return &cache_.kIfExceptionPOperator; | |
| 649 } | |
| 650 UNREACHABLE(); | |
| 651 return nullptr; | |
| 652 } | |
| 653 | |
| 654 | 598 |
| 655 const Operator* CommonOperatorBuilder::Switch(size_t control_output_count) { | 599 const Operator* CommonOperatorBuilder::Switch(size_t control_output_count) { |
| 656 return new (zone()) Operator( // -- | 600 return new (zone()) Operator( // -- |
| 657 IrOpcode::kSwitch, Operator::kKontrol, // opcode | 601 IrOpcode::kSwitch, Operator::kKontrol, // opcode |
| 658 "Switch", // name | 602 "Switch", // name |
| 659 1, 0, 1, 0, 0, control_output_count); // counts | 603 1, 0, 1, 0, 0, control_output_count); // counts |
| 660 } | 604 } |
| 661 | 605 |
| 662 | 606 |
| 663 const Operator* CommonOperatorBuilder::IfValue(int32_t index) { | 607 const Operator* CommonOperatorBuilder::IfValue(int32_t index) { |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1031 CommonOperatorBuilder::CreateFrameStateFunctionInfo( | 975 CommonOperatorBuilder::CreateFrameStateFunctionInfo( |
| 1032 FrameStateType type, int parameter_count, int local_count, | 976 FrameStateType type, int parameter_count, int local_count, |
| 1033 Handle<SharedFunctionInfo> shared_info) { | 977 Handle<SharedFunctionInfo> shared_info) { |
| 1034 return new (zone()->New(sizeof(FrameStateFunctionInfo))) | 978 return new (zone()->New(sizeof(FrameStateFunctionInfo))) |
| 1035 FrameStateFunctionInfo(type, parameter_count, local_count, shared_info); | 979 FrameStateFunctionInfo(type, parameter_count, local_count, shared_info); |
| 1036 } | 980 } |
| 1037 | 981 |
| 1038 } // namespace compiler | 982 } // namespace compiler |
| 1039 } // namespace internal | 983 } // namespace internal |
| 1040 } // namespace v8 | 984 } // namespace v8 |
| OLD | NEW |