| 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/machine-operator.h" | 5 #include "src/compiler/machine-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 | 10 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 V(Word64And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ | 81 V(Word64And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ |
| 82 V(Word64Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ | 82 V(Word64Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ |
| 83 V(Word64Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ | 83 V(Word64Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ |
| 84 V(Word64Shl, Operator::kNoProperties, 2, 0, 1) \ | 84 V(Word64Shl, Operator::kNoProperties, 2, 0, 1) \ |
| 85 V(Word64Shr, Operator::kNoProperties, 2, 0, 1) \ | 85 V(Word64Shr, Operator::kNoProperties, 2, 0, 1) \ |
| 86 V(Word64Sar, Operator::kNoProperties, 2, 0, 1) \ | 86 V(Word64Sar, Operator::kNoProperties, 2, 0, 1) \ |
| 87 V(Word64Ror, Operator::kNoProperties, 2, 0, 1) \ | 87 V(Word64Ror, Operator::kNoProperties, 2, 0, 1) \ |
| 88 V(Word64Clz, Operator::kNoProperties, 1, 0, 1) \ | 88 V(Word64Clz, Operator::kNoProperties, 1, 0, 1) \ |
| 89 V(Word64Equal, Operator::kCommutative, 2, 0, 1) \ | 89 V(Word64Equal, Operator::kCommutative, 2, 0, 1) \ |
| 90 V(Int32Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ | 90 V(Int32Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ |
| 91 V(Int32AddWithOverflow, Operator::kAssociative | Operator::kCommutative, 2, \ | |
| 92 0, 2) \ | |
| 93 V(Int32Sub, Operator::kNoProperties, 2, 0, 1) \ | 91 V(Int32Sub, Operator::kNoProperties, 2, 0, 1) \ |
| 94 V(Int32SubWithOverflow, Operator::kNoProperties, 2, 0, 2) \ | |
| 95 V(Int32Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ | 92 V(Int32Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ |
| 96 V(Int32MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ | 93 V(Int32MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ |
| 97 V(Int32Div, Operator::kNoProperties, 2, 1, 1) \ | 94 V(Int32Div, Operator::kNoProperties, 2, 1, 1) \ |
| 98 V(Int32Mod, Operator::kNoProperties, 2, 1, 1) \ | 95 V(Int32Mod, Operator::kNoProperties, 2, 1, 1) \ |
| 99 V(Int32LessThan, Operator::kNoProperties, 2, 0, 1) \ | 96 V(Int32LessThan, Operator::kNoProperties, 2, 0, 1) \ |
| 100 V(Int32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ | 97 V(Int32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ |
| 101 V(Uint32Div, Operator::kNoProperties, 2, 1, 1) \ | 98 V(Uint32Div, Operator::kNoProperties, 2, 1, 1) \ |
| 102 V(Uint32LessThan, Operator::kNoProperties, 2, 0, 1) \ | 99 V(Uint32LessThan, Operator::kNoProperties, 2, 0, 1) \ |
| 103 V(Uint32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ | 100 V(Uint32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ |
| 104 V(Uint32Mod, Operator::kNoProperties, 2, 1, 1) \ | 101 V(Uint32Mod, Operator::kNoProperties, 2, 1, 1) \ |
| 105 V(Uint32MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ | 102 V(Uint32MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ |
| 106 V(Int64Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ | 103 V(Int64Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ |
| 107 V(Int64AddWithOverflow, Operator::kAssociative | Operator::kCommutative, 2, \ | |
| 108 0, 2) \ | |
| 109 V(Int64Sub, Operator::kNoProperties, 2, 0, 1) \ | 104 V(Int64Sub, Operator::kNoProperties, 2, 0, 1) \ |
| 110 V(Int64SubWithOverflow, Operator::kNoProperties, 2, 0, 2) \ | |
| 111 V(Int64Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ | 105 V(Int64Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ |
| 112 V(Int64Div, Operator::kNoProperties, 2, 1, 1) \ | 106 V(Int64Div, Operator::kNoProperties, 2, 1, 1) \ |
| 113 V(Int64Mod, Operator::kNoProperties, 2, 1, 1) \ | 107 V(Int64Mod, Operator::kNoProperties, 2, 1, 1) \ |
| 114 V(Int64LessThan, Operator::kNoProperties, 2, 0, 1) \ | 108 V(Int64LessThan, Operator::kNoProperties, 2, 0, 1) \ |
| 115 V(Int64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ | 109 V(Int64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ |
| 116 V(Uint64Div, Operator::kNoProperties, 2, 1, 1) \ | 110 V(Uint64Div, Operator::kNoProperties, 2, 1, 1) \ |
| 117 V(Uint64Mod, Operator::kNoProperties, 2, 1, 1) \ | 111 V(Uint64Mod, Operator::kNoProperties, 2, 1, 1) \ |
| 118 V(Uint64LessThan, Operator::kNoProperties, 2, 0, 1) \ | 112 V(Uint64LessThan, Operator::kNoProperties, 2, 0, 1) \ |
| 119 V(Uint64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ | 113 V(Uint64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \ |
| 120 V(BitcastWordToTagged, Operator::kNoProperties, 1, 0, 1) \ | 114 V(BitcastWordToTagged, Operator::kNoProperties, 1, 0, 1) \ |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 V(Float32RoundUp, Operator::kNoProperties, 1, 0, 1) \ | 377 V(Float32RoundUp, Operator::kNoProperties, 1, 0, 1) \ |
| 384 V(Float64RoundUp, Operator::kNoProperties, 1, 0, 1) \ | 378 V(Float64RoundUp, Operator::kNoProperties, 1, 0, 1) \ |
| 385 V(Float32RoundTruncate, Operator::kNoProperties, 1, 0, 1) \ | 379 V(Float32RoundTruncate, Operator::kNoProperties, 1, 0, 1) \ |
| 386 V(Float64RoundTruncate, Operator::kNoProperties, 1, 0, 1) \ | 380 V(Float64RoundTruncate, Operator::kNoProperties, 1, 0, 1) \ |
| 387 V(Float64RoundTiesAway, Operator::kNoProperties, 1, 0, 1) \ | 381 V(Float64RoundTiesAway, Operator::kNoProperties, 1, 0, 1) \ |
| 388 V(Float32RoundTiesEven, Operator::kNoProperties, 1, 0, 1) \ | 382 V(Float32RoundTiesEven, Operator::kNoProperties, 1, 0, 1) \ |
| 389 V(Float64RoundTiesEven, Operator::kNoProperties, 1, 0, 1) \ | 383 V(Float64RoundTiesEven, Operator::kNoProperties, 1, 0, 1) \ |
| 390 V(Float32Neg, Operator::kNoProperties, 1, 0, 1) \ | 384 V(Float32Neg, Operator::kNoProperties, 1, 0, 1) \ |
| 391 V(Float64Neg, Operator::kNoProperties, 1, 0, 1) | 385 V(Float64Neg, Operator::kNoProperties, 1, 0, 1) |
| 392 | 386 |
| 387 #define OVERFLOW_OP_LIST(V) \ |
| 388 V(Int32AddWithOverflow, Operator::kAssociative | Operator::kCommutative) \ |
| 389 V(Int32SubWithOverflow, Operator::kNoProperties) \ |
| 390 V(Int64AddWithOverflow, Operator::kAssociative | Operator::kCommutative) \ |
| 391 V(Int64SubWithOverflow, Operator::kNoProperties) |
| 392 |
| 393 #define MACHINE_TYPE_LIST(V) \ | 393 #define MACHINE_TYPE_LIST(V) \ |
| 394 V(Float32) \ | 394 V(Float32) \ |
| 395 V(Float64) \ | 395 V(Float64) \ |
| 396 V(Simd128) \ | 396 V(Simd128) \ |
| 397 V(Int8) \ | 397 V(Int8) \ |
| 398 V(Uint8) \ | 398 V(Uint8) \ |
| 399 V(Int16) \ | 399 V(Int16) \ |
| 400 V(Uint16) \ | 400 V(Uint16) \ |
| 401 V(Int32) \ | 401 V(Int32) \ |
| 402 V(Uint32) \ | 402 V(Uint32) \ |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 Name##Operator() \ | 435 Name##Operator() \ |
| 436 : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \ | 436 : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \ |
| 437 value_input_count, 0, control_input_count, output_count, 0, \ | 437 value_input_count, 0, control_input_count, output_count, 0, \ |
| 438 0) {} \ | 438 0) {} \ |
| 439 }; \ | 439 }; \ |
| 440 Name##Operator k##Name; | 440 Name##Operator k##Name; |
| 441 PURE_OP_LIST(PURE) | 441 PURE_OP_LIST(PURE) |
| 442 PURE_OPTIONAL_OP_LIST(PURE) | 442 PURE_OPTIONAL_OP_LIST(PURE) |
| 443 #undef PURE | 443 #undef PURE |
| 444 | 444 |
| 445 #define OVERFLOW_OP(Name, properties) \ |
| 446 struct Name##Operator final : public Operator { \ |
| 447 Name##Operator() \ |
| 448 : Operator(IrOpcode::k##Name, \ |
| 449 Operator::kEliminatable | Operator::kNoRead | properties, \ |
| 450 #Name, 2, 0, 1, 2, 0, 0) {} \ |
| 451 }; \ |
| 452 Name##Operator k##Name; |
| 453 OVERFLOW_OP_LIST(OVERFLOW_OP) |
| 454 #undef OVERFLOW_OP |
| 455 |
| 445 #define LOAD(Type) \ | 456 #define LOAD(Type) \ |
| 446 struct Load##Type##Operator final : public Operator1<LoadRepresentation> { \ | 457 struct Load##Type##Operator final : public Operator1<LoadRepresentation> { \ |
| 447 Load##Type##Operator() \ | 458 Load##Type##Operator() \ |
| 448 : Operator1<LoadRepresentation>( \ | 459 : Operator1<LoadRepresentation>( \ |
| 449 IrOpcode::kLoad, \ | 460 IrOpcode::kLoad, \ |
| 450 Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite, \ | 461 Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite, \ |
| 451 "Load", 2, 1, 1, 1, 1, 0, MachineType::Type()) {} \ | 462 "Load", 2, 1, 1, 1, 1, 0, MachineType::Type()) {} \ |
| 452 }; \ | 463 }; \ |
| 453 struct CheckedLoad##Type##Operator final \ | 464 struct CheckedLoad##Type##Operator final \ |
| 454 : public Operator1<CheckedLoadRepresentation> { \ | 465 : public Operator1<CheckedLoadRepresentation> { \ |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 #undef PURE | 598 #undef PURE |
| 588 | 599 |
| 589 #define PURE(Name, properties, value_input_count, control_input_count, \ | 600 #define PURE(Name, properties, value_input_count, control_input_count, \ |
| 590 output_count) \ | 601 output_count) \ |
| 591 const OptionalOperator MachineOperatorBuilder::Name() { \ | 602 const OptionalOperator MachineOperatorBuilder::Name() { \ |
| 592 return OptionalOperator(flags_ & k##Name ? &cache_.k##Name : nullptr); \ | 603 return OptionalOperator(flags_ & k##Name ? &cache_.k##Name : nullptr); \ |
| 593 } | 604 } |
| 594 PURE_OPTIONAL_OP_LIST(PURE) | 605 PURE_OPTIONAL_OP_LIST(PURE) |
| 595 #undef PURE | 606 #undef PURE |
| 596 | 607 |
| 608 #define OVERFLOW_OP(Name, properties) \ |
| 609 const Operator* MachineOperatorBuilder::Name() { return &cache_.k##Name; } |
| 610 OVERFLOW_OP_LIST(OVERFLOW_OP) |
| 611 #undef OVERFLOW_OP |
| 597 | 612 |
| 598 const Operator* MachineOperatorBuilder::Load(LoadRepresentation rep) { | 613 const Operator* MachineOperatorBuilder::Load(LoadRepresentation rep) { |
| 599 #define LOAD(Type) \ | 614 #define LOAD(Type) \ |
| 600 if (rep == MachineType::Type()) { \ | 615 if (rep == MachineType::Type()) { \ |
| 601 return &cache_.kLoad##Type; \ | 616 return &cache_.kLoad##Type; \ |
| 602 } | 617 } |
| 603 MACHINE_TYPE_LIST(LOAD) | 618 MACHINE_TYPE_LIST(LOAD) |
| 604 #undef LOAD | 619 #undef LOAD |
| 605 UNREACHABLE(); | 620 UNREACHABLE(); |
| 606 return nullptr; | 621 return nullptr; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 } | 726 } |
| 712 ATOMIC_REPRESENTATION_LIST(STORE) | 727 ATOMIC_REPRESENTATION_LIST(STORE) |
| 713 #undef STORE | 728 #undef STORE |
| 714 UNREACHABLE(); | 729 UNREACHABLE(); |
| 715 return nullptr; | 730 return nullptr; |
| 716 } | 731 } |
| 717 | 732 |
| 718 } // namespace compiler | 733 } // namespace compiler |
| 719 } // namespace internal | 734 } // namespace internal |
| 720 } // namespace v8 | 735 } // namespace v8 |
| OLD | NEW |