| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/simplified-operator.h" | 5 #include "src/compiler/simplified-operator.h" |
| 6 | 6 |
| 7 #include "src/base/lazy-instance.h" | 7 #include "src/base/lazy-instance.h" |
| 8 #include "src/compiler/opcodes.h" | 8 #include "src/compiler/opcodes.h" |
| 9 #include "src/compiler/operator.h" | 9 #include "src/compiler/operator.h" |
| 10 #include "src/compiler/types.h" | 10 #include "src/compiler/types.h" |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 switch (mode) { | 222 switch (mode) { |
| 223 case CheckForMinusZeroMode::kCheckForMinusZero: | 223 case CheckForMinusZeroMode::kCheckForMinusZero: |
| 224 return os << "check-for-minus-zero"; | 224 return os << "check-for-minus-zero"; |
| 225 case CheckForMinusZeroMode::kDontCheckForMinusZero: | 225 case CheckForMinusZeroMode::kDontCheckForMinusZero: |
| 226 return os << "dont-check-for-minus-zero"; | 226 return os << "dont-check-for-minus-zero"; |
| 227 } | 227 } |
| 228 UNREACHABLE(); | 228 UNREACHABLE(); |
| 229 return os; | 229 return os; |
| 230 } | 230 } |
| 231 | 231 |
| 232 bool operator==(CheckMapsParameters const& lhs, |
| 233 CheckMapsParameters const& rhs) { |
| 234 return lhs.maps() == rhs.maps(); |
| 235 } |
| 236 |
| 237 bool operator!=(CheckMapsParameters const& lhs, |
| 238 CheckMapsParameters const& rhs) { |
| 239 return !(lhs == rhs); |
| 240 } |
| 241 |
| 242 size_t hash_value(CheckMapsParameters const& p) { return hash_value(p.maps()); } |
| 243 |
| 244 std::ostream& operator<<(std::ostream& os, CheckMapsParameters const& p) { |
| 245 ZoneHandleSet<Map> const& maps = p.maps(); |
| 246 for (size_t i = 0; i < maps.size(); ++i) { |
| 247 if (i != 0) os << ", "; |
| 248 os << Brief(*maps[i]); |
| 249 } |
| 250 return os; |
| 251 } |
| 252 |
| 253 CheckMapsParameters const& CheckMapsParametersOf(Operator const* op) { |
| 254 DCHECK_EQ(IrOpcode::kCheckMaps, op->opcode()); |
| 255 return OpParameter<CheckMapsParameters>(op); |
| 256 } |
| 257 |
| 232 size_t hash_value(CheckTaggedInputMode mode) { | 258 size_t hash_value(CheckTaggedInputMode mode) { |
| 233 return static_cast<size_t>(mode); | 259 return static_cast<size_t>(mode); |
| 234 } | 260 } |
| 235 | 261 |
| 236 std::ostream& operator<<(std::ostream& os, CheckTaggedInputMode mode) { | 262 std::ostream& operator<<(std::ostream& os, CheckTaggedInputMode mode) { |
| 237 switch (mode) { | 263 switch (mode) { |
| 238 case CheckTaggedInputMode::kNumber: | 264 case CheckTaggedInputMode::kNumber: |
| 239 return os << "Number"; | 265 return os << "Number"; |
| 240 case CheckTaggedInputMode::kNumberOrOddball: | 266 case CheckTaggedInputMode::kNumberOrOddball: |
| 241 return os << "NumberOrOddball"; | 267 return os << "NumberOrOddball"; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 267 } | 293 } |
| 268 if (empty) os << "None"; | 294 if (empty) os << "None"; |
| 269 return os; | 295 return os; |
| 270 } | 296 } |
| 271 | 297 |
| 272 GrowFastElementsFlags GrowFastElementsFlagsOf(const Operator* op) { | 298 GrowFastElementsFlags GrowFastElementsFlagsOf(const Operator* op) { |
| 273 DCHECK_EQ(IrOpcode::kMaybeGrowFastElements, op->opcode()); | 299 DCHECK_EQ(IrOpcode::kMaybeGrowFastElements, op->opcode()); |
| 274 return OpParameter<GrowFastElementsFlags>(op); | 300 return OpParameter<GrowFastElementsFlags>(op); |
| 275 } | 301 } |
| 276 | 302 |
| 303 bool operator==(ElementsTransition const& lhs, ElementsTransition const& rhs) { |
| 304 return lhs.mode() == rhs.mode() && |
| 305 lhs.source().address() == rhs.source().address() && |
| 306 lhs.target().address() == rhs.target().address(); |
| 307 } |
| 308 |
| 309 bool operator!=(ElementsTransition const& lhs, ElementsTransition const& rhs) { |
| 310 return !(lhs == rhs); |
| 311 } |
| 312 |
| 277 size_t hash_value(ElementsTransition transition) { | 313 size_t hash_value(ElementsTransition transition) { |
| 278 return static_cast<uint8_t>(transition); | 314 return base::hash_combine(static_cast<uint8_t>(transition.mode()), |
| 315 transition.source().address(), |
| 316 transition.target().address()); |
| 279 } | 317 } |
| 280 | 318 |
| 281 std::ostream& operator<<(std::ostream& os, ElementsTransition transition) { | 319 std::ostream& operator<<(std::ostream& os, ElementsTransition transition) { |
| 282 switch (transition) { | 320 switch (transition.mode()) { |
| 283 case ElementsTransition::kFastTransition: | 321 case ElementsTransition::kFastTransition: |
| 284 return os << "fast-transition"; | 322 return os << "fast-transition from " << Brief(*transition.source()) |
| 323 << " to " << Brief(*transition.target()); |
| 285 case ElementsTransition::kSlowTransition: | 324 case ElementsTransition::kSlowTransition: |
| 286 return os << "slow-transition"; | 325 return os << "slow-transition from " << Brief(*transition.source()) |
| 326 << " to " << Brief(*transition.target()); |
| 287 } | 327 } |
| 288 UNREACHABLE(); | 328 UNREACHABLE(); |
| 289 return os; | 329 return os; |
| 290 } | 330 } |
| 291 | 331 |
| 292 ElementsTransition ElementsTransitionOf(const Operator* op) { | 332 ElementsTransition const& ElementsTransitionOf(const Operator* op) { |
| 293 DCHECK_EQ(IrOpcode::kTransitionElementsKind, op->opcode()); | 333 DCHECK_EQ(IrOpcode::kTransitionElementsKind, op->opcode()); |
| 294 return OpParameter<ElementsTransition>(op); | 334 return OpParameter<ElementsTransition>(op); |
| 295 } | 335 } |
| 296 | 336 |
| 297 std::ostream& operator<<(std::ostream& os, NumberOperationHint hint) { | 337 std::ostream& operator<<(std::ostream& os, NumberOperationHint hint) { |
| 298 switch (hint) { | 338 switch (hint) { |
| 299 case NumberOperationHint::kSignedSmall: | 339 case NumberOperationHint::kSignedSmall: |
| 300 return os << "SignedSmall"; | 340 return os << "SignedSmall"; |
| 301 case NumberOperationHint::kSigned32: | 341 case NumberOperationHint::kSigned32: |
| 302 return os << "Signed32"; | 342 return os << "Signed32"; |
| (...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 switch (mode) { | 730 switch (mode) { |
| 691 case CheckTaggedInputMode::kNumber: | 731 case CheckTaggedInputMode::kNumber: |
| 692 return &cache_.kCheckedTaggedToFloat64NumberOperator; | 732 return &cache_.kCheckedTaggedToFloat64NumberOperator; |
| 693 case CheckTaggedInputMode::kNumberOrOddball: | 733 case CheckTaggedInputMode::kNumberOrOddball: |
| 694 return &cache_.kCheckedTaggedToFloat64NumberOrOddballOperator; | 734 return &cache_.kCheckedTaggedToFloat64NumberOrOddballOperator; |
| 695 } | 735 } |
| 696 UNREACHABLE(); | 736 UNREACHABLE(); |
| 697 return nullptr; | 737 return nullptr; |
| 698 } | 738 } |
| 699 | 739 |
| 700 const Operator* SimplifiedOperatorBuilder::CheckMaps(int map_input_count) { | 740 const Operator* SimplifiedOperatorBuilder::CheckMaps(ZoneHandleSet<Map> maps) { |
| 701 // TODO(bmeurer): Cache the most important versions of this operator. | 741 CheckMapsParameters const parameters(maps); |
| 702 DCHECK_LT(0, map_input_count); | 742 return new (zone()) Operator1<CheckMapsParameters>( // -- |
| 703 int const value_input_count = 1 + map_input_count; | 743 IrOpcode::kCheckMaps, // opcode |
| 704 return new (zone()) Operator1<int>( // -- | 744 Operator::kNoThrow | Operator::kNoWrite, // flags |
| 705 IrOpcode::kCheckMaps, // opcode | 745 "CheckMaps", // name |
| 706 Operator::kNoThrow | Operator::kNoWrite, // flags | 746 1, 1, 1, 0, 1, 0, // counts |
| 707 "CheckMaps", // name | 747 parameters); // parameter |
| 708 value_input_count, 1, 1, 0, 1, 0, // counts | |
| 709 map_input_count); // parameter | |
| 710 } | 748 } |
| 711 | 749 |
| 712 const Operator* SimplifiedOperatorBuilder::CheckFloat64Hole( | 750 const Operator* SimplifiedOperatorBuilder::CheckFloat64Hole( |
| 713 CheckFloat64HoleMode mode) { | 751 CheckFloat64HoleMode mode) { |
| 714 switch (mode) { | 752 switch (mode) { |
| 715 case CheckFloat64HoleMode::kAllowReturnHole: | 753 case CheckFloat64HoleMode::kAllowReturnHole: |
| 716 return &cache_.kCheckFloat64HoleAllowReturnHoleOperator; | 754 return &cache_.kCheckFloat64HoleAllowReturnHoleOperator; |
| 717 case CheckFloat64HoleMode::kNeverReturnHole: | 755 case CheckFloat64HoleMode::kNeverReturnHole: |
| 718 return &cache_.kCheckFloat64HoleNeverReturnHoleOperator; | 756 return &cache_.kCheckFloat64HoleNeverReturnHoleOperator; |
| 719 } | 757 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 734 4, 1, 1, 1, 1, 0, // counts | 772 4, 1, 1, 1, 1, 0, // counts |
| 735 flags); // parameter | 773 flags); // parameter |
| 736 } | 774 } |
| 737 | 775 |
| 738 const Operator* SimplifiedOperatorBuilder::TransitionElementsKind( | 776 const Operator* SimplifiedOperatorBuilder::TransitionElementsKind( |
| 739 ElementsTransition transition) { | 777 ElementsTransition transition) { |
| 740 return new (zone()) Operator1<ElementsTransition>( // -- | 778 return new (zone()) Operator1<ElementsTransition>( // -- |
| 741 IrOpcode::kTransitionElementsKind, // opcode | 779 IrOpcode::kTransitionElementsKind, // opcode |
| 742 Operator::kNoDeopt | Operator::kNoThrow, // flags | 780 Operator::kNoDeopt | Operator::kNoThrow, // flags |
| 743 "TransitionElementsKind", // name | 781 "TransitionElementsKind", // name |
| 744 3, 1, 1, 0, 1, 0, // counts | 782 1, 1, 1, 0, 1, 0, // counts |
| 745 transition); // parameter | 783 transition); // parameter |
| 746 } | 784 } |
| 747 | 785 |
| 748 const Operator* SimplifiedOperatorBuilder::NewUnmappedArgumentsElements( | 786 const Operator* SimplifiedOperatorBuilder::NewUnmappedArgumentsElements( |
| 749 int parameter_count) { | 787 int parameter_count) { |
| 750 return new (zone()) Operator1<int>( // -- | 788 return new (zone()) Operator1<int>( // -- |
| 751 IrOpcode::kNewUnmappedArgumentsElements, // opcode | 789 IrOpcode::kNewUnmappedArgumentsElements, // opcode |
| 752 Operator::kEliminatable, // flags | 790 Operator::kEliminatable, // flags |
| 753 "NewUnmappedArgumentsElements", // name | 791 "NewUnmappedArgumentsElements", // name |
| 754 0, 1, 0, 1, 1, 0, // counts | 792 0, 1, 0, 1, 1, 0, // counts |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 Operator::kNoDeopt | Operator::kNoThrow | properties, \ | 886 Operator::kNoDeopt | Operator::kNoThrow | properties, \ |
| 849 #Name, value_input_count, 1, control_input_count, \ | 887 #Name, value_input_count, 1, control_input_count, \ |
| 850 output_count, 1, 0, access); \ | 888 output_count, 1, 0, access); \ |
| 851 } | 889 } |
| 852 ACCESS_OP_LIST(ACCESS) | 890 ACCESS_OP_LIST(ACCESS) |
| 853 #undef ACCESS | 891 #undef ACCESS |
| 854 | 892 |
| 855 } // namespace compiler | 893 } // namespace compiler |
| 856 } // namespace internal | 894 } // namespace internal |
| 857 } // namespace v8 | 895 } // namespace v8 |
| OLD | NEW |