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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 DCHECK_EQ(IrOpcode::kCheckedLoad, op->opcode()); | 63 DCHECK_EQ(IrOpcode::kCheckedLoad, op->opcode()); |
64 return OpParameter<CheckedLoadRepresentation>(op); | 64 return OpParameter<CheckedLoadRepresentation>(op); |
65 } | 65 } |
66 | 66 |
67 | 67 |
68 CheckedStoreRepresentation CheckedStoreRepresentationOf(Operator const* op) { | 68 CheckedStoreRepresentation CheckedStoreRepresentationOf(Operator const* op) { |
69 DCHECK_EQ(IrOpcode::kCheckedStore, op->opcode()); | 69 DCHECK_EQ(IrOpcode::kCheckedStore, op->opcode()); |
70 return OpParameter<CheckedStoreRepresentation>(op); | 70 return OpParameter<CheckedStoreRepresentation>(op); |
71 } | 71 } |
72 | 72 |
73 MachineRepresentation StackSlotRepresentationOf(Operator const* op) { | 73 int StackSlotSizeOf(Operator const* op) { |
74 DCHECK_EQ(IrOpcode::kStackSlot, op->opcode()); | 74 DCHECK_EQ(IrOpcode::kStackSlot, op->opcode()); |
75 return OpParameter<MachineRepresentation>(op); | 75 return OpParameter<int>(op); |
76 } | 76 } |
77 | 77 |
78 MachineRepresentation AtomicStoreRepresentationOf(Operator const* op) { | 78 MachineRepresentation AtomicStoreRepresentationOf(Operator const* op) { |
79 DCHECK_EQ(IrOpcode::kAtomicStore, op->opcode()); | 79 DCHECK_EQ(IrOpcode::kAtomicStore, op->opcode()); |
80 return OpParameter<MachineRepresentation>(op); | 80 return OpParameter<MachineRepresentation>(op); |
81 } | 81 } |
82 | 82 |
83 #define PURE_BINARY_OP_LIST_32(V) \ | 83 #define PURE_BINARY_OP_LIST_32(V) \ |
84 V(Word32And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ | 84 V(Word32And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ |
85 V(Word32Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ | 85 V(Word32Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 V(Int16) \ | 451 V(Int16) \ |
452 V(Uint16) \ | 452 V(Uint16) \ |
453 V(Int32) \ | 453 V(Int32) \ |
454 V(Uint32) | 454 V(Uint32) |
455 | 455 |
456 #define ATOMIC_REPRESENTATION_LIST(V) \ | 456 #define ATOMIC_REPRESENTATION_LIST(V) \ |
457 V(kWord8) \ | 457 V(kWord8) \ |
458 V(kWord16) \ | 458 V(kWord16) \ |
459 V(kWord32) | 459 V(kWord32) |
460 | 460 |
| 461 #define STACK_SLOT_CACHED_SIZES_LIST(V) V(4) V(8) V(16) |
| 462 |
| 463 struct StackSlotOperator : public Operator1<int> { |
| 464 explicit StackSlotOperator(int size) |
| 465 : Operator1<int>(IrOpcode::kStackSlot, |
| 466 Operator::kNoDeopt | Operator::kNoThrow, "StackSlot", 0, |
| 467 0, 0, 1, 0, 0, size) {} |
| 468 }; |
| 469 |
461 struct MachineOperatorGlobalCache { | 470 struct MachineOperatorGlobalCache { |
462 #define PURE(Name, properties, value_input_count, control_input_count, \ | 471 #define PURE(Name, properties, value_input_count, control_input_count, \ |
463 output_count) \ | 472 output_count) \ |
464 struct Name##Operator final : public Operator { \ | 473 struct Name##Operator final : public Operator { \ |
465 Name##Operator() \ | 474 Name##Operator() \ |
466 : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \ | 475 : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \ |
467 value_input_count, 0, control_input_count, output_count, 0, \ | 476 value_input_count, 0, control_input_count, output_count, 0, \ |
468 0) {} \ | 477 0) {} \ |
469 }; \ | 478 }; \ |
470 Name##Operator k##Name; | 479 Name##Operator k##Name; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 Operator::kNoDeopt | Operator::kNoThrow, "ProtectedLoad", 3, 1, \ | 524 Operator::kNoDeopt | Operator::kNoThrow, "ProtectedLoad", 3, 1, \ |
516 1, 1, 1, 0, MachineType::Type()) {} \ | 525 1, 1, 1, 0, MachineType::Type()) {} \ |
517 }; \ | 526 }; \ |
518 Load##Type##Operator kLoad##Type; \ | 527 Load##Type##Operator kLoad##Type; \ |
519 UnalignedLoad##Type##Operator kUnalignedLoad##Type; \ | 528 UnalignedLoad##Type##Operator kUnalignedLoad##Type; \ |
520 CheckedLoad##Type##Operator kCheckedLoad##Type; \ | 529 CheckedLoad##Type##Operator kCheckedLoad##Type; \ |
521 ProtectedLoad##Type##Operator kProtectedLoad##Type; | 530 ProtectedLoad##Type##Operator kProtectedLoad##Type; |
522 MACHINE_TYPE_LIST(LOAD) | 531 MACHINE_TYPE_LIST(LOAD) |
523 #undef LOAD | 532 #undef LOAD |
524 | 533 |
525 #define STACKSLOT(Type) \ | 534 #define STACKSLOT(Size) \ |
526 struct StackSlot##Type##Operator final \ | 535 struct StackSlotOfSize##Size##Operator final : public StackSlotOperator { \ |
527 : public Operator1<MachineRepresentation> { \ | 536 StackSlotOfSize##Size##Operator() : StackSlotOperator(Size) {} \ |
528 StackSlot##Type##Operator() \ | 537 }; \ |
529 : Operator1<MachineRepresentation>( \ | 538 StackSlotOfSize##Size##Operator kStackSlotSize##Size; |
530 IrOpcode::kStackSlot, Operator::kNoDeopt | Operator::kNoThrow, \ | 539 STACK_SLOT_CACHED_SIZES_LIST(STACKSLOT) |
531 "StackSlot", 0, 0, 0, 1, 0, 0, \ | |
532 MachineType::Type().representation()) {} \ | |
533 }; \ | |
534 StackSlot##Type##Operator kStackSlot##Type; | |
535 MACHINE_TYPE_LIST(STACKSLOT) | |
536 #undef STACKSLOT | 540 #undef STACKSLOT |
537 | 541 |
538 #define STORE(Type) \ | 542 #define STORE(Type) \ |
539 struct Store##Type##Operator : public Operator1<StoreRepresentation> { \ | 543 struct Store##Type##Operator : public Operator1<StoreRepresentation> { \ |
540 explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind) \ | 544 explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind) \ |
541 : Operator1<StoreRepresentation>( \ | 545 : Operator1<StoreRepresentation>( \ |
542 IrOpcode::kStore, \ | 546 IrOpcode::kStore, \ |
543 Operator::kNoDeopt | Operator::kNoRead | Operator::kNoThrow, \ | 547 Operator::kNoDeopt | Operator::kNoRead | Operator::kNoThrow, \ |
544 "Store", 3, 1, 1, 0, 1, 0, \ | 548 "Store", 3, 1, 1, 0, 1, 0, \ |
545 StoreRepresentation(MachineRepresentation::Type, \ | 549 StoreRepresentation(MachineRepresentation::Type, \ |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
728 #define LOAD(Type) \ | 732 #define LOAD(Type) \ |
729 if (rep == MachineType::Type()) { \ | 733 if (rep == MachineType::Type()) { \ |
730 return &cache_.kProtectedLoad##Type; \ | 734 return &cache_.kProtectedLoad##Type; \ |
731 } | 735 } |
732 MACHINE_TYPE_LIST(LOAD) | 736 MACHINE_TYPE_LIST(LOAD) |
733 #undef LOAD | 737 #undef LOAD |
734 UNREACHABLE(); | 738 UNREACHABLE(); |
735 return nullptr; | 739 return nullptr; |
736 } | 740 } |
737 | 741 |
| 742 const Operator* MachineOperatorBuilder::StackSlot(int size) { |
| 743 DCHECK_LE(0, size); |
| 744 #define CASE_CACHED_SIZE(Size) \ |
| 745 case Size: \ |
| 746 return &cache_.kStackSlotSize##Size; |
| 747 switch (size) { |
| 748 STACK_SLOT_CACHED_SIZES_LIST(CASE_CACHED_SIZE); |
| 749 default: |
| 750 return new (zone_) StackSlotOperator(size); |
| 751 } |
| 752 #undef CASE_CACHED_SIZE |
| 753 } |
| 754 |
738 const Operator* MachineOperatorBuilder::StackSlot(MachineRepresentation rep) { | 755 const Operator* MachineOperatorBuilder::StackSlot(MachineRepresentation rep) { |
739 #define STACKSLOT(Type) \ | 756 return StackSlot(1 << ElementSizeLog2Of(rep)); |
740 if (rep == MachineType::Type().representation()) { \ | |
741 return &cache_.kStackSlot##Type; \ | |
742 } | |
743 MACHINE_TYPE_LIST(STACKSLOT) | |
744 #undef STACKSLOT | |
745 UNREACHABLE(); | |
746 return nullptr; | |
747 } | 757 } |
748 | 758 |
749 const Operator* MachineOperatorBuilder::Store(StoreRepresentation store_rep) { | 759 const Operator* MachineOperatorBuilder::Store(StoreRepresentation store_rep) { |
750 switch (store_rep.representation()) { | 760 switch (store_rep.representation()) { |
751 #define STORE(kRep) \ | 761 #define STORE(kRep) \ |
752 case MachineRepresentation::kRep: \ | 762 case MachineRepresentation::kRep: \ |
753 switch (store_rep.write_barrier_kind()) { \ | 763 switch (store_rep.write_barrier_kind()) { \ |
754 case kNoWriteBarrier: \ | 764 case kNoWriteBarrier: \ |
755 return &cache_.k##Store##kRep##NoWriteBarrier; \ | 765 return &cache_.k##Store##kRep##NoWriteBarrier; \ |
756 case kMapWriteBarrier: \ | 766 case kMapWriteBarrier: \ |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
847 } | 857 } |
848 ATOMIC_REPRESENTATION_LIST(STORE) | 858 ATOMIC_REPRESENTATION_LIST(STORE) |
849 #undef STORE | 859 #undef STORE |
850 UNREACHABLE(); | 860 UNREACHABLE(); |
851 return nullptr; | 861 return nullptr; |
852 } | 862 } |
853 | 863 |
854 } // namespace compiler | 864 } // namespace compiler |
855 } // namespace internal | 865 } // namespace internal |
856 } // namespace v8 | 866 } // namespace v8 |
OLD | NEW |