| 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 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 689 switch (mode) { | 729 switch (mode) { |
| 690 case CheckTaggedInputMode::kNumber: | 730 case CheckTaggedInputMode::kNumber: |
| 691 return &cache_.kCheckedTaggedToFloat64NumberOperator; | 731 return &cache_.kCheckedTaggedToFloat64NumberOperator; |
| 692 case CheckTaggedInputMode::kNumberOrOddball: | 732 case CheckTaggedInputMode::kNumberOrOddball: |
| 693 return &cache_.kCheckedTaggedToFloat64NumberOrOddballOperator; | 733 return &cache_.kCheckedTaggedToFloat64NumberOrOddballOperator; |
| 694 } | 734 } |
| 695 UNREACHABLE(); | 735 UNREACHABLE(); |
| 696 return nullptr; | 736 return nullptr; |
| 697 } | 737 } |
| 698 | 738 |
| 699 const Operator* SimplifiedOperatorBuilder::CheckMaps(int map_input_count) { | 739 const Operator* SimplifiedOperatorBuilder::CheckMaps(ZoneHandleSet<Map> maps) { |
| 700 // TODO(bmeurer): Cache the most important versions of this operator. | 740 CheckMapsParameters const parameters(maps); |
| 701 DCHECK_LT(0, map_input_count); | 741 return new (zone()) Operator1<CheckMapsParameters>( // -- |
| 702 int const value_input_count = 1 + map_input_count; | 742 IrOpcode::kCheckMaps, // opcode |
| 703 return new (zone()) Operator1<int>( // -- | 743 Operator::kNoThrow | Operator::kNoWrite, // flags |
| 704 IrOpcode::kCheckMaps, // opcode | 744 "CheckMaps", // name |
| 705 Operator::kNoThrow | Operator::kNoWrite, // flags | 745 1, 1, 1, 0, 1, 0, // counts |
| 706 "CheckMaps", // name | 746 parameters); // parameter |
| 707 value_input_count, 1, 1, 0, 1, 0, // counts | |
| 708 map_input_count); // parameter | |
| 709 } | 747 } |
| 710 | 748 |
| 711 const Operator* SimplifiedOperatorBuilder::CheckFloat64Hole( | 749 const Operator* SimplifiedOperatorBuilder::CheckFloat64Hole( |
| 712 CheckFloat64HoleMode mode) { | 750 CheckFloat64HoleMode mode) { |
| 713 switch (mode) { | 751 switch (mode) { |
| 714 case CheckFloat64HoleMode::kAllowReturnHole: | 752 case CheckFloat64HoleMode::kAllowReturnHole: |
| 715 return &cache_.kCheckFloat64HoleAllowReturnHoleOperator; | 753 return &cache_.kCheckFloat64HoleAllowReturnHoleOperator; |
| 716 case CheckFloat64HoleMode::kNeverReturnHole: | 754 case CheckFloat64HoleMode::kNeverReturnHole: |
| 717 return &cache_.kCheckFloat64HoleNeverReturnHoleOperator; | 755 return &cache_.kCheckFloat64HoleNeverReturnHoleOperator; |
| 718 } | 756 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 733 4, 1, 1, 1, 1, 0, // counts | 771 4, 1, 1, 1, 1, 0, // counts |
| 734 flags); // parameter | 772 flags); // parameter |
| 735 } | 773 } |
| 736 | 774 |
| 737 const Operator* SimplifiedOperatorBuilder::TransitionElementsKind( | 775 const Operator* SimplifiedOperatorBuilder::TransitionElementsKind( |
| 738 ElementsTransition transition) { | 776 ElementsTransition transition) { |
| 739 return new (zone()) Operator1<ElementsTransition>( // -- | 777 return new (zone()) Operator1<ElementsTransition>( // -- |
| 740 IrOpcode::kTransitionElementsKind, // opcode | 778 IrOpcode::kTransitionElementsKind, // opcode |
| 741 Operator::kNoDeopt | Operator::kNoThrow, // flags | 779 Operator::kNoDeopt | Operator::kNoThrow, // flags |
| 742 "TransitionElementsKind", // name | 780 "TransitionElementsKind", // name |
| 743 3, 1, 1, 0, 1, 0, // counts | 781 1, 1, 1, 0, 1, 0, // counts |
| 744 transition); // parameter | 782 transition); // parameter |
| 745 } | 783 } |
| 746 | 784 |
| 747 const Operator* SimplifiedOperatorBuilder::NewUnmappedArgumentsElements( | 785 const Operator* SimplifiedOperatorBuilder::NewUnmappedArgumentsElements( |
| 748 int parameter_count) { | 786 int parameter_count) { |
| 749 return new (zone()) Operator1<int>( // -- | 787 return new (zone()) Operator1<int>( // -- |
| 750 IrOpcode::kNewUnmappedArgumentsElements, // opcode | 788 IrOpcode::kNewUnmappedArgumentsElements, // opcode |
| 751 Operator::kEliminatable, // flags | 789 Operator::kEliminatable, // flags |
| 752 "NewUnmappedArgumentsElements", // name | 790 "NewUnmappedArgumentsElements", // name |
| 753 0, 1, 0, 1, 1, 0, // counts | 791 0, 1, 0, 1, 1, 0, // counts |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 Operator::kNoDeopt | Operator::kNoThrow | properties, \ | 885 Operator::kNoDeopt | Operator::kNoThrow | properties, \ |
| 848 #Name, value_input_count, 1, control_input_count, \ | 886 #Name, value_input_count, 1, control_input_count, \ |
| 849 output_count, 1, 0, access); \ | 887 output_count, 1, 0, access); \ |
| 850 } | 888 } |
| 851 ACCESS_OP_LIST(ACCESS) | 889 ACCESS_OP_LIST(ACCESS) |
| 852 #undef ACCESS | 890 #undef ACCESS |
| 853 | 891 |
| 854 } // namespace compiler | 892 } // namespace compiler |
| 855 } // namespace internal | 893 } // namespace internal |
| 856 } // namespace v8 | 894 } // namespace v8 |
| OLD | NEW |