Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Side by Side Diff: src/compiler/machine-operator.cc

Issue 2816743003: [turbofan] Add alignment parameter to StackSlot operator (Closed)
Patch Set: Upload missing file Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 int StackSlotSizeOf(Operator const* op) { 73 bool operator==(StackSlotRepresentation lhs, StackSlotRepresentation rhs) {
74 return lhs.size() == rhs.size() && lhs.alignment() == rhs.alignment();
75 }
76
77 bool operator!=(StackSlotRepresentation lhs, StackSlotRepresentation rhs) {
78 return !(lhs == rhs);
79 }
80
81 size_t hash_value(StackSlotRepresentation rep) {
82 return base::hash_combine(rep.size(), rep.alignment());
83 }
84
85 std::ostream& operator<<(std::ostream& os, StackSlotRepresentation rep) {
86 return os << "(" << rep.size() << " : " << rep.alignment() << ")";
87 }
88
89 StackSlotRepresentation const& StackSlotRepresentationOf(Operator const* op) {
74 DCHECK_EQ(IrOpcode::kStackSlot, op->opcode()); 90 DCHECK_EQ(IrOpcode::kStackSlot, op->opcode());
75 return OpParameter<int>(op); 91 return OpParameter<StackSlotRepresentation>(op);
76 } 92 }
77 93
78 MachineRepresentation AtomicStoreRepresentationOf(Operator const* op) { 94 MachineRepresentation AtomicStoreRepresentationOf(Operator const* op) {
79 DCHECK_EQ(IrOpcode::kAtomicStore, op->opcode()); 95 DCHECK_EQ(IrOpcode::kAtomicStore, op->opcode());
80 return OpParameter<MachineRepresentation>(op); 96 return OpParameter<MachineRepresentation>(op);
81 } 97 }
82 98
83 MachineType AtomicOpRepresentationOf(Operator const* op) { 99 MachineType AtomicOpRepresentationOf(Operator const* op) {
84 return OpParameter<MachineType>(op); 100 return OpParameter<MachineType>(op);
85 } 101 }
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 V(F32x4, 4) \ 435 V(F32x4, 4) \
420 V(I32x4, 4) \ 436 V(I32x4, 4) \
421 V(I16x8, 8) \ 437 V(I16x8, 8) \
422 V(I8x16, 16) 438 V(I8x16, 16)
423 439
424 #define SIMD_FORMAT_LIST(V) \ 440 #define SIMD_FORMAT_LIST(V) \
425 V(32x4, 32) \ 441 V(32x4, 32) \
426 V(16x8, 16) \ 442 V(16x8, 16) \
427 V(8x16, 8) 443 V(8x16, 8)
428 444
429 #define STACK_SLOT_CACHED_SIZES_LIST(V) V(4) V(8) V(16) 445 #define STACK_SLOT_CACHED_SIZES_ALIGNMENTS_LIST(V) \
446 V(4, 0) V(8, 0) V(16, 0) V(4, 4) V(8, 8) V(16, 16)
430 447
431 struct StackSlotOperator : public Operator1<int> { 448 struct StackSlotOperator : public Operator1<StackSlotRepresentation> {
432 explicit StackSlotOperator(int size) 449 explicit StackSlotOperator(int size, int alignment)
433 : Operator1<int>(IrOpcode::kStackSlot, 450 : Operator1<StackSlotRepresentation>(
434 Operator::kNoDeopt | Operator::kNoThrow, "StackSlot", 0, 451 IrOpcode::kStackSlot, Operator::kNoDeopt | Operator::kNoThrow,
435 0, 0, 1, 0, 0, size) {} 452 "StackSlot", 0, 0, 0, 1, 0, 0,
453 StackSlotRepresentation(size, alignment)) {}
436 }; 454 };
437 455
438 struct MachineOperatorGlobalCache { 456 struct MachineOperatorGlobalCache {
439 #define PURE(Name, properties, value_input_count, control_input_count, \ 457 #define PURE(Name, properties, value_input_count, control_input_count, \
440 output_count) \ 458 output_count) \
441 struct Name##Operator final : public Operator { \ 459 struct Name##Operator final : public Operator { \
442 Name##Operator() \ 460 Name##Operator() \
443 : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \ 461 : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \
444 value_input_count, 0, control_input_count, output_count, 0, \ 462 value_input_count, 0, control_input_count, output_count, 0, \
445 0) {} \ 463 0) {} \
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 Operator::kNoDeopt | Operator::kNoThrow, "ProtectedLoad", 3, 1, \ 510 Operator::kNoDeopt | Operator::kNoThrow, "ProtectedLoad", 3, 1, \
493 1, 1, 1, 0, MachineType::Type()) {} \ 511 1, 1, 1, 0, MachineType::Type()) {} \
494 }; \ 512 }; \
495 Load##Type##Operator kLoad##Type; \ 513 Load##Type##Operator kLoad##Type; \
496 UnalignedLoad##Type##Operator kUnalignedLoad##Type; \ 514 UnalignedLoad##Type##Operator kUnalignedLoad##Type; \
497 CheckedLoad##Type##Operator kCheckedLoad##Type; \ 515 CheckedLoad##Type##Operator kCheckedLoad##Type; \
498 ProtectedLoad##Type##Operator kProtectedLoad##Type; 516 ProtectedLoad##Type##Operator kProtectedLoad##Type;
499 MACHINE_TYPE_LIST(LOAD) 517 MACHINE_TYPE_LIST(LOAD)
500 #undef LOAD 518 #undef LOAD
501 519
502 #define STACKSLOT(Size) \ 520 #define STACKSLOT(Size, Alignment) \
503 struct StackSlotOfSize##Size##Operator final : public StackSlotOperator { \ 521 struct StackSlotOfSize##Size##OfAlignment##Alignment##Operator final \
504 StackSlotOfSize##Size##Operator() : StackSlotOperator(Size) {} \ 522 : public StackSlotOperator { \
505 }; \ 523 StackSlotOfSize##Size##OfAlignment##Alignment##Operator() \
506 StackSlotOfSize##Size##Operator kStackSlotSize##Size; 524 : StackSlotOperator(Size, Alignment) {} \
507 STACK_SLOT_CACHED_SIZES_LIST(STACKSLOT) 525 }; \
526 StackSlotOfSize##Size##OfAlignment##Alignment##Operator \
527 kStackSlotOfSize##Size##OfAlignment##Alignment;
528 STACK_SLOT_CACHED_SIZES_ALIGNMENTS_LIST(STACKSLOT)
508 #undef STACKSLOT 529 #undef STACKSLOT
509 530
510 #define STORE(Type) \ 531 #define STORE(Type) \
511 struct Store##Type##Operator : public Operator1<StoreRepresentation> { \ 532 struct Store##Type##Operator : public Operator1<StoreRepresentation> { \
512 explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind) \ 533 explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind) \
513 : Operator1<StoreRepresentation>( \ 534 : Operator1<StoreRepresentation>( \
514 IrOpcode::kStore, \ 535 IrOpcode::kStore, \
515 Operator::kNoDeopt | Operator::kNoRead | Operator::kNoThrow, \ 536 Operator::kNoDeopt | Operator::kNoRead | Operator::kNoThrow, \
516 "Store", 3, 1, 1, 0, 1, 0, \ 537 "Store", 3, 1, 1, 0, 1, 0, \
517 StoreRepresentation(MachineRepresentation::Type, \ 538 StoreRepresentation(MachineRepresentation::Type, \
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 #define LOAD(Type) \ 769 #define LOAD(Type) \
749 if (rep == MachineType::Type()) { \ 770 if (rep == MachineType::Type()) { \
750 return &cache_.kProtectedLoad##Type; \ 771 return &cache_.kProtectedLoad##Type; \
751 } 772 }
752 MACHINE_TYPE_LIST(LOAD) 773 MACHINE_TYPE_LIST(LOAD)
753 #undef LOAD 774 #undef LOAD
754 UNREACHABLE(); 775 UNREACHABLE();
755 return nullptr; 776 return nullptr;
756 } 777 }
757 778
758 const Operator* MachineOperatorBuilder::StackSlot(int size) { 779 const Operator* MachineOperatorBuilder::StackSlot(int size, int alignment) {
759 DCHECK_LE(0, size); 780 DCHECK_LE(0, size);
760 #define CASE_CACHED_SIZE(Size) \ 781 #define CASE_CACHED_SIZE(Size, Alignment) \
761 case Size: \ 782 if (size == Size && alignment == Alignment) { \
762 return &cache_.kStackSlotSize##Size; 783 return &cache_.kStackSlotOfSize##Size##OfAlignment##Alignment; \
763 switch (size) {
764 STACK_SLOT_CACHED_SIZES_LIST(CASE_CACHED_SIZE);
765 default:
766 return new (zone_) StackSlotOperator(size);
767 } 784 }
785
786 STACK_SLOT_CACHED_SIZES_ALIGNMENTS_LIST(CASE_CACHED_SIZE)
787
768 #undef CASE_CACHED_SIZE 788 #undef CASE_CACHED_SIZE
789 return new (zone_) StackSlotOperator(size, alignment);
769 } 790 }
770 791
771 const Operator* MachineOperatorBuilder::StackSlot(MachineRepresentation rep) { 792 const Operator* MachineOperatorBuilder::StackSlot(MachineRepresentation rep,
793 int alignment) {
772 return StackSlot(1 << ElementSizeLog2Of(rep)); 794 return StackSlot(1 << ElementSizeLog2Of(rep));
773 } 795 }
774 796
775 const Operator* MachineOperatorBuilder::Store(StoreRepresentation store_rep) { 797 const Operator* MachineOperatorBuilder::Store(StoreRepresentation store_rep) {
776 switch (store_rep.representation()) { 798 switch (store_rep.representation()) {
777 #define STORE(kRep) \ 799 #define STORE(kRep) \
778 case MachineRepresentation::kRep: \ 800 case MachineRepresentation::kRep: \
779 switch (store_rep.write_barrier_kind()) { \ 801 switch (store_rep.write_barrier_kind()) { \
780 case kNoWriteBarrier: \ 802 case kNoWriteBarrier: \
781 return &cache_.k##Store##kRep##NoWriteBarrier; \ 803 return &cache_.k##Store##kRep##NoWriteBarrier; \
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 return new (zone_) \ 1036 return new (zone_) \
1015 Operator1<uint32_t>(IrOpcode::kS##format##Swizzle, Operator::kPure, \ 1037 Operator1<uint32_t>(IrOpcode::kS##format##Swizzle, Operator::kPure, \
1016 "Swizzle", 2, 0, 0, 1, 0, 0, swizzle); \ 1038 "Swizzle", 2, 0, 0, 1, 0, 0, swizzle); \
1017 } 1039 }
1018 SIMD_FORMAT_LIST(SIMD_PERMUTE_OPS) 1040 SIMD_FORMAT_LIST(SIMD_PERMUTE_OPS)
1019 #undef SIMD_PERMUTE_OPS 1041 #undef SIMD_PERMUTE_OPS
1020 1042
1021 } // namespace compiler 1043 } // namespace compiler
1022 } // namespace internal 1044 } // namespace internal
1023 } // namespace v8 1045 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698