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

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

Issue 1928513002: Implement UnalignedLoad and UnalignedStore in WASM using LoadByte/Shift/Or and StoreByte/Shift/And. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase to master Created 4 years, 7 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
« no previous file with comments | « src/compiler/instruction-selector.h ('k') | src/compiler/machine-operator.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 #ifndef V8_COMPILER_MACHINE_OPERATOR_H_ 5 #ifndef V8_COMPILER_MACHINE_OPERATOR_H_
6 #define V8_COMPILER_MACHINE_OPERATOR_H_ 6 #define V8_COMPILER_MACHINE_OPERATOR_H_
7 7
8 #include "src/base/flags.h" 8 #include "src/base/flags.h"
9 #include "src/machine-type.h" 9 #include "src/machine-type.h"
10 10
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 kAllOptionalOps = kFloat32Max | kFloat32Min | kFloat64Max | kFloat64Min | 116 kAllOptionalOps = kFloat32Max | kFloat32Min | kFloat64Max | kFloat64Min |
117 kFloat32RoundDown | kFloat64RoundDown | kFloat32RoundUp | 117 kFloat32RoundDown | kFloat64RoundDown | kFloat32RoundUp |
118 kFloat64RoundUp | kFloat32RoundTruncate | 118 kFloat64RoundUp | kFloat32RoundTruncate |
119 kFloat64RoundTruncate | kFloat64RoundTiesAway | 119 kFloat64RoundTruncate | kFloat64RoundTiesAway |
120 kFloat32RoundTiesEven | kFloat64RoundTiesEven | 120 kFloat32RoundTiesEven | kFloat64RoundTiesEven |
121 kWord32Ctz | kWord64Ctz | kWord32Popcnt | kWord64Popcnt | 121 kWord32Ctz | kWord64Ctz | kWord32Popcnt | kWord64Popcnt |
122 kWord32ReverseBits | kWord64ReverseBits 122 kWord32ReverseBits | kWord64ReverseBits
123 }; 123 };
124 typedef base::Flags<Flag, unsigned> Flags; 124 typedef base::Flags<Flag, unsigned> Flags;
125 125
126 struct UnalignedAccessConfig {
titzer 2016/05/06 16:06:47 Can we call this simply AlignmentRequirements?
ivica.bogosavljevic 2016/05/10 08:32:22 Acknowledged.
127 public:
128 explicit UnalignedAccessConfig(bool fullUnalignedAccessSupport,
129 bool noUnalignedAccessSupport)
130 : fullUnalignedAccessSupport_(fullUnalignedAccessSupport),
131 noUnalignedAccessSupport_(noUnalignedAccessSupport),
132 unalingedLoadSupportedTypes_(NULL, 0),
133 unalingedStoreSupportedTypes_(NULL, 0) {
134 DCHECK(fullUnalignedAccessSupport != noUnalignedAccessSupport);
135 }
136 explicit UnalignedAccessConfig(
137 Vector<MachineType> unalingedLoadSupportedTypes,
138 Vector<MachineType> unalignedStoreSupportedTypes)
139 : fullUnalignedAccessSupport_(false),
140 noUnalignedAccessSupport_(false),
141 unalingedLoadSupportedTypes_(unalingedLoadSupportedTypes),
142 unalingedStoreSupportedTypes_(unalignedStoreSupportedTypes) {}
143
144 bool IsUnalignedLoadSupported(const MachineType& machineType,
145 uint8_t alignment) const {
146 return IsUnalingedSupported(unalingedLoadSupportedTypes_, machineType,
147 alignment);
148 }
149
150 bool IsUnalignedStoreSupported(const MachineType& machineType,
151 uint8_t alignment) const {
152 return IsUnalingedSupported(unalingedStoreSupportedTypes_, machineType,
153 alignment);
154 }
155
156 static UnalignedAccessConfig FullUnalignedAccessSupport() {
157 return UnalignedAccessConfig(true, false);
158 }
159 static UnalignedAccessConfig NoUnalignedAccessSupport() {
160 return UnalignedAccessConfig(false, true);
161 }
162
163 private:
164 bool IsUnalingedSupported(const Vector<MachineType>& supported,
165 const MachineType& machineType,
166 uint8_t alignment) const {
167 if (fullUnalignedAccessSupport_) {
168 return true;
169 } else if (noUnalignedAccessSupport_) {
170 return false;
171 } else {
172 for (MachineType m : supported) {
173 if (m == machineType) {
174 return true;
175 }
176 }
177 return false;
178 }
179 }
180
181 const bool fullUnalignedAccessSupport_;
182 const bool noUnalignedAccessSupport_;
183 const Vector<MachineType> unalingedLoadSupportedTypes_;
184 const Vector<MachineType> unalingedStoreSupportedTypes_;
185 };
186
126 explicit MachineOperatorBuilder( 187 explicit MachineOperatorBuilder(
127 Zone* zone, 188 Zone* zone,
128 MachineRepresentation word = MachineType::PointerRepresentation(), 189 MachineRepresentation word = MachineType::PointerRepresentation(),
129 Flags supportedOperators = kNoFlags); 190 Flags supportedOperators = kNoFlags,
191 UnalignedAccessConfig unalignedAccessConfig =
192 UnalignedAccessConfig::NoUnalignedAccessSupport());
130 193
131 const Operator* Word32And(); 194 const Operator* Word32And();
132 const Operator* Word32Or(); 195 const Operator* Word32Or();
133 const Operator* Word32Xor(); 196 const Operator* Word32Xor();
134 const Operator* Word32Shl(); 197 const Operator* Word32Shl();
135 const Operator* Word32Shr(); 198 const Operator* Word32Shr();
136 const Operator* Word32Sar(); 199 const Operator* Word32Sar();
137 const Operator* Word32Ror(); 200 const Operator* Word32Ror();
138 const Operator* Word32Equal(); 201 const Operator* Word32Equal();
139 const Operator* Word32Clz(); 202 const Operator* Word32Clz();
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 // atomic-load [base + index] 567 // atomic-load [base + index]
505 const Operator* AtomicLoad(LoadRepresentation rep); 568 const Operator* AtomicLoad(LoadRepresentation rep);
506 // atomic-store [base + index], value 569 // atomic-store [base + index], value
507 const Operator* AtomicStore(MachineRepresentation rep); 570 const Operator* AtomicStore(MachineRepresentation rep);
508 571
509 // Target machine word-size assumed by this builder. 572 // Target machine word-size assumed by this builder.
510 bool Is32() const { return word() == MachineRepresentation::kWord32; } 573 bool Is32() const { return word() == MachineRepresentation::kWord32; }
511 bool Is64() const { return word() == MachineRepresentation::kWord64; } 574 bool Is64() const { return word() == MachineRepresentation::kWord64; }
512 MachineRepresentation word() const { return word_; } 575 MachineRepresentation word() const { return word_; }
513 576
577 bool UnalignedLoadSupported(const MachineType& machineType,
578 uint8_t alignment) {
579 return unalignedAccessConfig_.IsUnalignedLoadSupported(machineType,
580 alignment);
581 }
582
583 bool UnalignedStoreSupported(const MachineType& machineType,
584 uint8_t alignment) {
585 return unalignedAccessConfig_.IsUnalignedStoreSupported(machineType,
586 alignment);
587 }
588
514 // Pseudo operators that translate to 32/64-bit operators depending on the 589 // Pseudo operators that translate to 32/64-bit operators depending on the
515 // word-size of the target machine assumed by this builder. 590 // word-size of the target machine assumed by this builder.
516 #define PSEUDO_OP_LIST(V) \ 591 #define PSEUDO_OP_LIST(V) \
517 V(Word, And) \ 592 V(Word, And) \
518 V(Word, Or) \ 593 V(Word, Or) \
519 V(Word, Xor) \ 594 V(Word, Xor) \
520 V(Word, Shl) \ 595 V(Word, Shl) \
521 V(Word, Shr) \ 596 V(Word, Shr) \
522 V(Word, Sar) \ 597 V(Word, Sar) \
523 V(Word, Ror) \ 598 V(Word, Ror) \
(...skipping 14 matching lines...) Expand all
538 return Is32() ? Prefix##32##Suffix() : Prefix##64##Suffix(); \ 613 return Is32() ? Prefix##32##Suffix() : Prefix##64##Suffix(); \
539 } 614 }
540 PSEUDO_OP_LIST(PSEUDO_OP) 615 PSEUDO_OP_LIST(PSEUDO_OP)
541 #undef PSEUDO_OP 616 #undef PSEUDO_OP
542 #undef PSEUDO_OP_LIST 617 #undef PSEUDO_OP_LIST
543 618
544 private: 619 private:
545 MachineOperatorGlobalCache const& cache_; 620 MachineOperatorGlobalCache const& cache_;
546 MachineRepresentation const word_; 621 MachineRepresentation const word_;
547 Flags const flags_; 622 Flags const flags_;
623 UnalignedAccessConfig const unalignedAccessConfig_;
548 624
549 DISALLOW_COPY_AND_ASSIGN(MachineOperatorBuilder); 625 DISALLOW_COPY_AND_ASSIGN(MachineOperatorBuilder);
550 }; 626 };
551 627
552 628
553 DEFINE_OPERATORS_FOR_FLAGS(MachineOperatorBuilder::Flags) 629 DEFINE_OPERATORS_FOR_FLAGS(MachineOperatorBuilder::Flags)
554 630
555 } // namespace compiler 631 } // namespace compiler
556 } // namespace internal 632 } // namespace internal
557 } // namespace v8 633 } // namespace v8
558 634
559 #endif // V8_COMPILER_MACHINE_OPERATOR_H_ 635 #endif // V8_COMPILER_MACHINE_OPERATOR_H_
OLDNEW
« no previous file with comments | « src/compiler/instruction-selector.h ('k') | src/compiler/machine-operator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698