blob: 7c443f44c7ac7e7af3e8e36e7b2b96d74f17e40f [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
3// found in the LICENSE file.
4
5#ifndef V8_COMPILER_MACHINE_OPERATOR_H_
6#define V8_COMPILER_MACHINE_OPERATOR_H_
7
Emily Bernierd0a1eb72015-03-24 16:35:39 -04008#include "src/base/flags.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00009#include "src/machine-type.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000010
11namespace v8 {
12namespace internal {
13namespace compiler {
14
15// Forward declarations.
Emily Bernierd0a1eb72015-03-24 16:35:39 -040016struct MachineOperatorGlobalCache;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000017class Operator;
18
19
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000020// For operators that are not supported on all platforms.
21class OptionalOperator final {
22 public:
23 explicit OptionalOperator(const Operator* op) : op_(op) {}
24
25 bool IsSupported() const { return op_ != nullptr; }
26 const Operator* op() const {
27 DCHECK_NOT_NULL(op_);
28 return op_;
29 }
30
31 private:
32 const Operator* const op_;
33};
34
35
Emily Bernierd0a1eb72015-03-24 16:35:39 -040036// A Load needs a MachineType.
Ben Murdochb8a8cc12014-11-26 15:28:44 +000037typedef MachineType LoadRepresentation;
38
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000039LoadRepresentation LoadRepresentationOf(Operator const*);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000040
Emily Bernierd0a1eb72015-03-24 16:35:39 -040041// A Store needs a MachineType and a WriteBarrierKind in order to emit the
42// correct write barrier.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000043class StoreRepresentation final {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000044 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000045 StoreRepresentation(MachineRepresentation representation,
Ben Murdochb8a8cc12014-11-26 15:28:44 +000046 WriteBarrierKind write_barrier_kind)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000047 : representation_(representation),
48 write_barrier_kind_(write_barrier_kind) {}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000049
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000050 MachineRepresentation representation() const { return representation_; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000051 WriteBarrierKind write_barrier_kind() const { return write_barrier_kind_; }
52
53 private:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000054 MachineRepresentation representation_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000055 WriteBarrierKind write_barrier_kind_;
56};
57
Emily Bernierd0a1eb72015-03-24 16:35:39 -040058bool operator==(StoreRepresentation, StoreRepresentation);
59bool operator!=(StoreRepresentation, StoreRepresentation);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000060
Emily Bernierd0a1eb72015-03-24 16:35:39 -040061size_t hash_value(StoreRepresentation);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000062
Emily Bernierd0a1eb72015-03-24 16:35:39 -040063std::ostream& operator<<(std::ostream&, StoreRepresentation);
64
65StoreRepresentation const& StoreRepresentationOf(Operator const*);
66
67
68// A CheckedLoad needs a MachineType.
69typedef MachineType CheckedLoadRepresentation;
70
71CheckedLoadRepresentation CheckedLoadRepresentationOf(Operator const*);
72
73
74// A CheckedStore needs a MachineType.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000075typedef MachineRepresentation CheckedStoreRepresentation;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040076
77CheckedStoreRepresentation CheckedStoreRepresentationOf(Operator const*);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000078
Ben Murdoch097c5b22016-05-18 11:27:45 +010079MachineRepresentation StackSlotRepresentationOf(Operator const* op);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000080
Ben Murdochc5610432016-08-08 18:44:38 +010081MachineRepresentation AtomicStoreRepresentationOf(Operator const* op);
82
Ben Murdochb8a8cc12014-11-26 15:28:44 +000083// Interface for building machine-level operators. These operators are
84// machine-level but machine-independent and thus define a language suitable
85// for generating code to run on architectures such as ia32, x64, arm, etc.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000086class MachineOperatorBuilder final : public ZoneObject {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000087 public:
Emily Bernierd0a1eb72015-03-24 16:35:39 -040088 // Flags that specify which operations are available. This is useful
89 // for operations that are unsupported by some back-ends.
90 enum Flag {
91 kNoFlags = 0u,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000092 // Note that Float*Max behaves like `(b < a) ? a : b`, not like Math.max().
93 // Note that Float*Min behaves like `(a < b) ? a : b`, not like Math.min().
94 kFloat32Max = 1u << 0,
95 kFloat32Min = 1u << 1,
96 kFloat64Max = 1u << 2,
97 kFloat64Min = 1u << 3,
98 kFloat32RoundDown = 1u << 4,
99 kFloat64RoundDown = 1u << 5,
100 kFloat32RoundUp = 1u << 6,
101 kFloat64RoundUp = 1u << 7,
102 kFloat32RoundTruncate = 1u << 8,
103 kFloat64RoundTruncate = 1u << 9,
104 kFloat32RoundTiesEven = 1u << 10,
105 kFloat64RoundTiesEven = 1u << 11,
106 kFloat64RoundTiesAway = 1u << 12,
107 kInt32DivIsSafe = 1u << 13,
108 kUint32DivIsSafe = 1u << 14,
109 kWord32ShiftIsSafe = 1u << 15,
110 kWord32Ctz = 1u << 16,
111 kWord64Ctz = 1u << 17,
112 kWord32Popcnt = 1u << 18,
113 kWord64Popcnt = 1u << 19,
Ben Murdoch097c5b22016-05-18 11:27:45 +0100114 kWord32ReverseBits = 1u << 20,
115 kWord64ReverseBits = 1u << 21,
Ben Murdoch61f157c2016-09-16 13:49:30 +0100116 kFloat32Neg = 1u << 22,
117 kFloat64Neg = 1u << 23,
118 kAllOptionalOps =
119 kFloat32Max | kFloat32Min | kFloat64Max | kFloat64Min |
120 kFloat32RoundDown | kFloat64RoundDown | kFloat32RoundUp |
121 kFloat64RoundUp | kFloat32RoundTruncate | kFloat64RoundTruncate |
122 kFloat64RoundTiesAway | kFloat32RoundTiesEven | kFloat64RoundTiesEven |
123 kWord32Ctz | kWord64Ctz | kWord32Popcnt | kWord64Popcnt |
124 kWord32ReverseBits | kWord64ReverseBits | kFloat32Neg | kFloat64Neg
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400125 };
126 typedef base::Flags<Flag, unsigned> Flags;
127
Ben Murdoch61f157c2016-09-16 13:49:30 +0100128 class AlignmentRequirements {
129 public:
130 enum UnalignedAccessSupport { kNoSupport, kSomeSupport, kFullSupport };
131
132 bool IsUnalignedLoadSupported(const MachineType& machineType,
133 uint8_t alignment) const {
134 return IsUnalignedSupported(unalignedLoadSupportedTypes_, machineType,
135 alignment);
136 }
137
138 bool IsUnalignedStoreSupported(const MachineType& machineType,
139 uint8_t alignment) const {
140 return IsUnalignedSupported(unalignedStoreSupportedTypes_, machineType,
141 alignment);
142 }
143
144 static AlignmentRequirements FullUnalignedAccessSupport() {
145 return AlignmentRequirements(kFullSupport);
146 }
147 static AlignmentRequirements NoUnalignedAccessSupport() {
148 return AlignmentRequirements(kNoSupport);
149 }
150 static AlignmentRequirements SomeUnalignedAccessSupport(
151 const Vector<MachineType>& unalignedLoadSupportedTypes,
152 const Vector<MachineType>& unalignedStoreSupportedTypes) {
153 return AlignmentRequirements(kSomeSupport, unalignedLoadSupportedTypes,
154 unalignedStoreSupportedTypes);
155 }
156
157 private:
158 explicit AlignmentRequirements(
159 AlignmentRequirements::UnalignedAccessSupport unalignedAccessSupport,
160 Vector<MachineType> unalignedLoadSupportedTypes =
161 Vector<MachineType>(NULL, 0),
162 Vector<MachineType> unalignedStoreSupportedTypes =
163 Vector<MachineType>(NULL, 0))
164 : unalignedSupport_(unalignedAccessSupport),
165 unalignedLoadSupportedTypes_(unalignedLoadSupportedTypes),
166 unalignedStoreSupportedTypes_(unalignedStoreSupportedTypes) {}
167
168 bool IsUnalignedSupported(const Vector<MachineType>& supported,
169 const MachineType& machineType,
170 uint8_t alignment) const {
171 if (unalignedSupport_ == kFullSupport) {
172 return true;
173 } else if (unalignedSupport_ == kNoSupport) {
174 return false;
175 } else {
176 for (MachineType m : supported) {
177 if (m == machineType) {
178 return true;
179 }
180 }
181 return false;
182 }
183 }
184
185 const AlignmentRequirements::UnalignedAccessSupport unalignedSupport_;
186 const Vector<MachineType> unalignedLoadSupportedTypes_;
187 const Vector<MachineType> unalignedStoreSupportedTypes_;
188 };
189
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000190 explicit MachineOperatorBuilder(
191 Zone* zone,
192 MachineRepresentation word = MachineType::PointerRepresentation(),
Ben Murdoch61f157c2016-09-16 13:49:30 +0100193 Flags supportedOperators = kNoFlags,
194 AlignmentRequirements alignmentRequirements =
195 AlignmentRequirements::NoUnalignedAccessSupport());
196
197 const Operator* Comment(const char* msg);
198 const Operator* DebugBreak();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000199
200 const Operator* Word32And();
201 const Operator* Word32Or();
202 const Operator* Word32Xor();
203 const Operator* Word32Shl();
204 const Operator* Word32Shr();
205 const Operator* Word32Sar();
206 const Operator* Word32Ror();
207 const Operator* Word32Equal();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000208 const Operator* Word32Clz();
209 const OptionalOperator Word32Ctz();
210 const OptionalOperator Word32Popcnt();
211 const OptionalOperator Word64Popcnt();
Ben Murdochda12d292016-06-02 14:46:10 +0100212 const Operator* Word64PopcntPlaceholder();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100213 const OptionalOperator Word32ReverseBits();
214 const OptionalOperator Word64ReverseBits();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400215 bool Word32ShiftIsSafe() const { return flags_ & kWord32ShiftIsSafe; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000216
217 const Operator* Word64And();
218 const Operator* Word64Or();
219 const Operator* Word64Xor();
220 const Operator* Word64Shl();
221 const Operator* Word64Shr();
222 const Operator* Word64Sar();
223 const Operator* Word64Ror();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000224 const Operator* Word64Clz();
225 const OptionalOperator Word64Ctz();
Ben Murdochda12d292016-06-02 14:46:10 +0100226 const Operator* Word64CtzPlaceholder();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000227 const Operator* Word64Equal();
228
Ben Murdochda12d292016-06-02 14:46:10 +0100229 const Operator* Int32PairAdd();
230 const Operator* Int32PairSub();
231 const Operator* Int32PairMul();
232 const Operator* Word32PairShl();
233 const Operator* Word32PairShr();
234 const Operator* Word32PairSar();
235
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000236 const Operator* Int32Add();
237 const Operator* Int32AddWithOverflow();
238 const Operator* Int32Sub();
239 const Operator* Int32SubWithOverflow();
240 const Operator* Int32Mul();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400241 const Operator* Int32MulHigh();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000242 const Operator* Int32Div();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000243 const Operator* Int32Mod();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000244 const Operator* Int32LessThan();
245 const Operator* Int32LessThanOrEqual();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400246 const Operator* Uint32Div();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000247 const Operator* Uint32LessThan();
248 const Operator* Uint32LessThanOrEqual();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400249 const Operator* Uint32Mod();
250 const Operator* Uint32MulHigh();
251 bool Int32DivIsSafe() const { return flags_ & kInt32DivIsSafe; }
252 bool Uint32DivIsSafe() const { return flags_ & kUint32DivIsSafe; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000253
254 const Operator* Int64Add();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000255 const Operator* Int64AddWithOverflow();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000256 const Operator* Int64Sub();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000257 const Operator* Int64SubWithOverflow();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000258 const Operator* Int64Mul();
259 const Operator* Int64Div();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000260 const Operator* Int64Mod();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000261 const Operator* Int64LessThan();
262 const Operator* Int64LessThanOrEqual();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400263 const Operator* Uint64Div();
264 const Operator* Uint64LessThan();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000265 const Operator* Uint64LessThanOrEqual();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400266 const Operator* Uint64Mod();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000267
Ben Murdochc5610432016-08-08 18:44:38 +0100268 // This operator reinterprets the bits of a word as tagged pointer.
269 const Operator* BitcastWordToTagged();
270
271 // JavaScript float64 to int32/uint32 truncation.
272 const Operator* TruncateFloat64ToWord32();
273
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000274 // These operators change the representation of numbers while preserving the
275 // value of the number. Narrowing operators assume the input is representable
276 // in the target type and are *not* defined for other inputs.
277 // Use narrowing change operators only when there is a static guarantee that
278 // the input value is representable in the target value.
279 const Operator* ChangeFloat32ToFloat64();
280 const Operator* ChangeFloat64ToInt32(); // narrowing
281 const Operator* ChangeFloat64ToUint32(); // narrowing
Ben Murdochda12d292016-06-02 14:46:10 +0100282 const Operator* TruncateFloat64ToUint32();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100283 const Operator* TruncateFloat32ToInt32();
284 const Operator* TruncateFloat32ToUint32();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000285 const Operator* TryTruncateFloat32ToInt64();
286 const Operator* TryTruncateFloat64ToInt64();
287 const Operator* TryTruncateFloat32ToUint64();
288 const Operator* TryTruncateFloat64ToUint64();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000289 const Operator* ChangeInt32ToFloat64();
290 const Operator* ChangeInt32ToInt64();
291 const Operator* ChangeUint32ToFloat64();
292 const Operator* ChangeUint32ToUint64();
293
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000294 // These operators truncate or round numbers, both changing the representation
295 // of the number and mapping multiple input values onto the same output value.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000296 const Operator* TruncateFloat64ToFloat32();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000297 const Operator* TruncateInt64ToInt32();
Ben Murdochc5610432016-08-08 18:44:38 +0100298 const Operator* RoundFloat64ToInt32();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100299 const Operator* RoundInt32ToFloat32();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000300 const Operator* RoundInt64ToFloat32();
301 const Operator* RoundInt64ToFloat64();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100302 const Operator* RoundUint32ToFloat32();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000303 const Operator* RoundUint64ToFloat32();
304 const Operator* RoundUint64ToFloat64();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000305
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000306 // These operators reinterpret the bits of a floating point number as an
307 // integer and vice versa.
308 const Operator* BitcastFloat32ToInt32();
309 const Operator* BitcastFloat64ToInt64();
310 const Operator* BitcastInt32ToFloat32();
311 const Operator* BitcastInt64ToFloat64();
312
313 // Floating point operators always operate with IEEE 754 round-to-nearest
314 // (single-precision).
315 const Operator* Float32Add();
316 const Operator* Float32Sub();
Ben Murdochc5610432016-08-08 18:44:38 +0100317 const Operator* Float32SubPreserveNan();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000318 const Operator* Float32Mul();
319 const Operator* Float32Div();
320 const Operator* Float32Sqrt();
321
322 // Floating point operators always operate with IEEE 754 round-to-nearest
323 // (double-precision).
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000324 const Operator* Float64Add();
325 const Operator* Float64Sub();
Ben Murdochc5610432016-08-08 18:44:38 +0100326 const Operator* Float64SubPreserveNan();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000327 const Operator* Float64Mul();
328 const Operator* Float64Div();
329 const Operator* Float64Mod();
330 const Operator* Float64Sqrt();
331
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000332 // Floating point comparisons complying to IEEE 754 (single-precision).
333 const Operator* Float32Equal();
334 const Operator* Float32LessThan();
335 const Operator* Float32LessThanOrEqual();
336
337 // Floating point comparisons complying to IEEE 754 (double-precision).
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000338 const Operator* Float64Equal();
339 const Operator* Float64LessThan();
340 const Operator* Float64LessThanOrEqual();
341
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000342 // Floating point min/max complying to IEEE 754 (single-precision).
343 const OptionalOperator Float32Max();
344 const OptionalOperator Float32Min();
345
346 // Floating point min/max complying to IEEE 754 (double-precision).
347 const OptionalOperator Float64Max();
348 const OptionalOperator Float64Min();
349
350 // Floating point abs complying to IEEE 754 (single-precision).
351 const Operator* Float32Abs();
352
353 // Floating point abs complying to IEEE 754 (double-precision).
354 const Operator* Float64Abs();
355
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400356 // Floating point rounding.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000357 const OptionalOperator Float32RoundDown();
358 const OptionalOperator Float64RoundDown();
359 const OptionalOperator Float32RoundUp();
360 const OptionalOperator Float64RoundUp();
361 const OptionalOperator Float32RoundTruncate();
362 const OptionalOperator Float64RoundTruncate();
363 const OptionalOperator Float64RoundTiesAway();
364 const OptionalOperator Float32RoundTiesEven();
365 const OptionalOperator Float64RoundTiesEven();
366
Ben Murdoch61f157c2016-09-16 13:49:30 +0100367 // Floating point neg.
368 const OptionalOperator Float32Neg();
369 const OptionalOperator Float64Neg();
370
371 // Floating point trigonometric functions (double-precision).
372 const Operator* Float64Atan();
373 const Operator* Float64Atan2();
374 const Operator* Float64Atanh();
375
376 // Floating point trigonometric functions (double-precision).
377 const Operator* Float64Cos();
378 const Operator* Float64Sin();
379 const Operator* Float64Tan();
380
381 // Floating point exponential functions (double-precision).
382 const Operator* Float64Exp();
383
384 // Floating point logarithm (double-precision).
385 const Operator* Float64Log();
386 const Operator* Float64Log1p();
387 const Operator* Float64Log2();
388 const Operator* Float64Log10();
389
390 const Operator* Float64Cbrt();
391 const Operator* Float64Expm1();
392
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000393 // Floating point bit representation.
394 const Operator* Float64ExtractLowWord32();
395 const Operator* Float64ExtractHighWord32();
396 const Operator* Float64InsertLowWord32();
397 const Operator* Float64InsertHighWord32();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400398
Ben Murdoch61f157c2016-09-16 13:49:30 +0100399 // Change signalling NaN to quiet NaN.
400 // Identity for any input that is not signalling NaN.
401 const Operator* Float64SilenceNaN();
402
Ben Murdochc5610432016-08-08 18:44:38 +0100403 // SIMD operators.
404 const Operator* CreateFloat32x4();
405 const Operator* Float32x4ExtractLane();
406 const Operator* Float32x4ReplaceLane();
407 const Operator* Float32x4Abs();
408 const Operator* Float32x4Neg();
409 const Operator* Float32x4Sqrt();
410 const Operator* Float32x4RecipApprox();
411 const Operator* Float32x4RecipSqrtApprox();
412 const Operator* Float32x4Add();
413 const Operator* Float32x4Sub();
414 const Operator* Float32x4Mul();
415 const Operator* Float32x4Div();
416 const Operator* Float32x4Min();
417 const Operator* Float32x4Max();
418 const Operator* Float32x4MinNum();
419 const Operator* Float32x4MaxNum();
420 const Operator* Float32x4Equal();
421 const Operator* Float32x4NotEqual();
422 const Operator* Float32x4LessThan();
423 const Operator* Float32x4LessThanOrEqual();
424 const Operator* Float32x4GreaterThan();
425 const Operator* Float32x4GreaterThanOrEqual();
426 const Operator* Float32x4Select();
427 const Operator* Float32x4Swizzle();
428 const Operator* Float32x4Shuffle();
429 const Operator* Float32x4FromInt32x4();
430 const Operator* Float32x4FromUint32x4();
431
432 const Operator* CreateInt32x4();
433 const Operator* Int32x4ExtractLane();
434 const Operator* Int32x4ReplaceLane();
435 const Operator* Int32x4Neg();
436 const Operator* Int32x4Add();
437 const Operator* Int32x4Sub();
438 const Operator* Int32x4Mul();
439 const Operator* Int32x4Min();
440 const Operator* Int32x4Max();
441 const Operator* Int32x4ShiftLeftByScalar();
442 const Operator* Int32x4ShiftRightByScalar();
443 const Operator* Int32x4Equal();
444 const Operator* Int32x4NotEqual();
445 const Operator* Int32x4LessThan();
446 const Operator* Int32x4LessThanOrEqual();
447 const Operator* Int32x4GreaterThan();
448 const Operator* Int32x4GreaterThanOrEqual();
449 const Operator* Int32x4Select();
450 const Operator* Int32x4Swizzle();
451 const Operator* Int32x4Shuffle();
452 const Operator* Int32x4FromFloat32x4();
453
454 const Operator* Uint32x4Min();
455 const Operator* Uint32x4Max();
456 const Operator* Uint32x4ShiftLeftByScalar();
457 const Operator* Uint32x4ShiftRightByScalar();
458 const Operator* Uint32x4LessThan();
459 const Operator* Uint32x4LessThanOrEqual();
460 const Operator* Uint32x4GreaterThan();
461 const Operator* Uint32x4GreaterThanOrEqual();
462 const Operator* Uint32x4FromFloat32x4();
463
464 const Operator* CreateBool32x4();
465 const Operator* Bool32x4ExtractLane();
466 const Operator* Bool32x4ReplaceLane();
467 const Operator* Bool32x4And();
468 const Operator* Bool32x4Or();
469 const Operator* Bool32x4Xor();
470 const Operator* Bool32x4Not();
471 const Operator* Bool32x4AnyTrue();
472 const Operator* Bool32x4AllTrue();
473 const Operator* Bool32x4Swizzle();
474 const Operator* Bool32x4Shuffle();
475 const Operator* Bool32x4Equal();
476 const Operator* Bool32x4NotEqual();
477
478 const Operator* CreateInt16x8();
479 const Operator* Int16x8ExtractLane();
480 const Operator* Int16x8ReplaceLane();
481 const Operator* Int16x8Neg();
482 const Operator* Int16x8Add();
483 const Operator* Int16x8AddSaturate();
484 const Operator* Int16x8Sub();
485 const Operator* Int16x8SubSaturate();
486 const Operator* Int16x8Mul();
487 const Operator* Int16x8Min();
488 const Operator* Int16x8Max();
489 const Operator* Int16x8ShiftLeftByScalar();
490 const Operator* Int16x8ShiftRightByScalar();
491 const Operator* Int16x8Equal();
492 const Operator* Int16x8NotEqual();
493 const Operator* Int16x8LessThan();
494 const Operator* Int16x8LessThanOrEqual();
495 const Operator* Int16x8GreaterThan();
496 const Operator* Int16x8GreaterThanOrEqual();
497 const Operator* Int16x8Select();
498 const Operator* Int16x8Swizzle();
499 const Operator* Int16x8Shuffle();
500
501 const Operator* Uint16x8AddSaturate();
502 const Operator* Uint16x8SubSaturate();
503 const Operator* Uint16x8Min();
504 const Operator* Uint16x8Max();
505 const Operator* Uint16x8ShiftLeftByScalar();
506 const Operator* Uint16x8ShiftRightByScalar();
507 const Operator* Uint16x8LessThan();
508 const Operator* Uint16x8LessThanOrEqual();
509 const Operator* Uint16x8GreaterThan();
510 const Operator* Uint16x8GreaterThanOrEqual();
511
512 const Operator* CreateBool16x8();
513 const Operator* Bool16x8ExtractLane();
514 const Operator* Bool16x8ReplaceLane();
515 const Operator* Bool16x8And();
516 const Operator* Bool16x8Or();
517 const Operator* Bool16x8Xor();
518 const Operator* Bool16x8Not();
519 const Operator* Bool16x8AnyTrue();
520 const Operator* Bool16x8AllTrue();
521 const Operator* Bool16x8Swizzle();
522 const Operator* Bool16x8Shuffle();
523 const Operator* Bool16x8Equal();
524 const Operator* Bool16x8NotEqual();
525
526 const Operator* CreateInt8x16();
527 const Operator* Int8x16ExtractLane();
528 const Operator* Int8x16ReplaceLane();
529 const Operator* Int8x16Neg();
530 const Operator* Int8x16Add();
531 const Operator* Int8x16AddSaturate();
532 const Operator* Int8x16Sub();
533 const Operator* Int8x16SubSaturate();
534 const Operator* Int8x16Mul();
535 const Operator* Int8x16Min();
536 const Operator* Int8x16Max();
537 const Operator* Int8x16ShiftLeftByScalar();
538 const Operator* Int8x16ShiftRightByScalar();
539 const Operator* Int8x16Equal();
540 const Operator* Int8x16NotEqual();
541 const Operator* Int8x16LessThan();
542 const Operator* Int8x16LessThanOrEqual();
543 const Operator* Int8x16GreaterThan();
544 const Operator* Int8x16GreaterThanOrEqual();
545 const Operator* Int8x16Select();
546 const Operator* Int8x16Swizzle();
547 const Operator* Int8x16Shuffle();
548
549 const Operator* Uint8x16AddSaturate();
550 const Operator* Uint8x16SubSaturate();
551 const Operator* Uint8x16Min();
552 const Operator* Uint8x16Max();
553 const Operator* Uint8x16ShiftLeftByScalar();
554 const Operator* Uint8x16ShiftRightByScalar();
555 const Operator* Uint8x16LessThan();
556 const Operator* Uint8x16LessThanOrEqual();
557 const Operator* Uint8x16GreaterThan();
558 const Operator* Uint8x16GreaterThanOrEqual();
559
560 const Operator* CreateBool8x16();
561 const Operator* Bool8x16ExtractLane();
562 const Operator* Bool8x16ReplaceLane();
563 const Operator* Bool8x16And();
564 const Operator* Bool8x16Or();
565 const Operator* Bool8x16Xor();
566 const Operator* Bool8x16Not();
567 const Operator* Bool8x16AnyTrue();
568 const Operator* Bool8x16AllTrue();
569 const Operator* Bool8x16Swizzle();
570 const Operator* Bool8x16Shuffle();
571 const Operator* Bool8x16Equal();
572 const Operator* Bool8x16NotEqual();
573
574 const Operator* Simd128Load();
575 const Operator* Simd128Load1();
576 const Operator* Simd128Load2();
577 const Operator* Simd128Load3();
578 const Operator* Simd128Store();
579 const Operator* Simd128Store1();
580 const Operator* Simd128Store2();
581 const Operator* Simd128Store3();
582 const Operator* Simd128And();
583 const Operator* Simd128Or();
584 const Operator* Simd128Xor();
585 const Operator* Simd128Not();
586
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000587 // load [base + index]
588 const Operator* Load(LoadRepresentation rep);
589
590 // store [base + index], value
591 const Operator* Store(StoreRepresentation rep);
592
Ben Murdoch097c5b22016-05-18 11:27:45 +0100593 const Operator* StackSlot(MachineRepresentation rep);
594
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400595 // Access to the machine stack.
596 const Operator* LoadStackPointer();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000597 const Operator* LoadFramePointer();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100598 const Operator* LoadParentFramePointer();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400599
600 // checked-load heap, index, length
601 const Operator* CheckedLoad(CheckedLoadRepresentation);
602 // checked-store heap, index, length, value
603 const Operator* CheckedStore(CheckedStoreRepresentation);
604
Ben Murdochc5610432016-08-08 18:44:38 +0100605 // atomic-load [base + index]
606 const Operator* AtomicLoad(LoadRepresentation rep);
607 // atomic-store [base + index], value
608 const Operator* AtomicStore(MachineRepresentation rep);
609
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000610 // Target machine word-size assumed by this builder.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000611 bool Is32() const { return word() == MachineRepresentation::kWord32; }
612 bool Is64() const { return word() == MachineRepresentation::kWord64; }
613 MachineRepresentation word() const { return word_; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000614
Ben Murdoch61f157c2016-09-16 13:49:30 +0100615 bool UnalignedLoadSupported(const MachineType& machineType,
616 uint8_t alignment) {
617 return alignment_requirements_.IsUnalignedLoadSupported(machineType,
618 alignment);
619 }
620
621 bool UnalignedStoreSupported(const MachineType& machineType,
622 uint8_t alignment) {
623 return alignment_requirements_.IsUnalignedStoreSupported(machineType,
624 alignment);
625 }
626
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000627// Pseudo operators that translate to 32/64-bit operators depending on the
628// word-size of the target machine assumed by this builder.
629#define PSEUDO_OP_LIST(V) \
630 V(Word, And) \
631 V(Word, Or) \
632 V(Word, Xor) \
633 V(Word, Shl) \
634 V(Word, Shr) \
635 V(Word, Sar) \
636 V(Word, Ror) \
Ben Murdochda12d292016-06-02 14:46:10 +0100637 V(Word, Clz) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000638 V(Word, Equal) \
639 V(Int, Add) \
640 V(Int, Sub) \
641 V(Int, Mul) \
642 V(Int, Div) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000643 V(Int, Mod) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000644 V(Int, LessThan) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400645 V(Int, LessThanOrEqual) \
646 V(Uint, Div) \
647 V(Uint, LessThan) \
648 V(Uint, Mod)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000649#define PSEUDO_OP(Prefix, Suffix) \
650 const Operator* Prefix##Suffix() { \
651 return Is32() ? Prefix##32##Suffix() : Prefix##64##Suffix(); \
652 }
653 PSEUDO_OP_LIST(PSEUDO_OP)
654#undef PSEUDO_OP
655#undef PSEUDO_OP_LIST
656
657 private:
Ben Murdoch61f157c2016-09-16 13:49:30 +0100658 Zone* zone_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000659 MachineOperatorGlobalCache const& cache_;
660 MachineRepresentation const word_;
661 Flags const flags_;
Ben Murdoch61f157c2016-09-16 13:49:30 +0100662 AlignmentRequirements const alignment_requirements_;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400663
664 DISALLOW_COPY_AND_ASSIGN(MachineOperatorBuilder);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000665};
666
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400667
668DEFINE_OPERATORS_FOR_FLAGS(MachineOperatorBuilder::Flags)
669
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000670} // namespace compiler
671} // namespace internal
672} // namespace v8
673
674#endif // V8_COMPILER_MACHINE_OPERATOR_H_