blob: 055827918354ac9b3f79105eecbd99f2f5b594f7 [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
Ben Murdochc8c1d9e2017-03-08 14:04:23 +00008#include "src/base/compiler-specific.h"
Emily Bernier958fae72015-03-24 16:35:39 -04009#include "src/base/flags.h"
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000010#include "src/globals.h"
Ben Murdoch014dc512016-03-22 12:00:34 +000011#include "src/machine-type.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000012
13namespace v8 {
14namespace internal {
15namespace compiler {
16
17// Forward declarations.
Emily Bernier958fae72015-03-24 16:35:39 -040018struct MachineOperatorGlobalCache;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000019class Operator;
20
21
Ben Murdoch014dc512016-03-22 12:00:34 +000022// For operators that are not supported on all platforms.
23class OptionalOperator final {
24 public:
Ben Murdochf91f0612016-11-29 16:50:11 +000025 OptionalOperator(bool supported, const Operator* op)
26 : supported_(supported), op_(op) {}
Ben Murdoch014dc512016-03-22 12:00:34 +000027
Ben Murdochf91f0612016-11-29 16:50:11 +000028 bool IsSupported() const { return supported_; }
29 // Gets the operator only if it is supported.
Ben Murdoch014dc512016-03-22 12:00:34 +000030 const Operator* op() const {
Ben Murdochf91f0612016-11-29 16:50:11 +000031 DCHECK(supported_);
Ben Murdoch014dc512016-03-22 12:00:34 +000032 return op_;
33 }
Ben Murdochf91f0612016-11-29 16:50:11 +000034 // Always gets the operator, even for unsupported operators. This is useful to
35 // use the operator as a placeholder in a graph, for instance.
36 const Operator* placeholder() const { return op_; }
Ben Murdoch014dc512016-03-22 12:00:34 +000037
38 private:
Ben Murdochf91f0612016-11-29 16:50:11 +000039 bool supported_;
Ben Murdoch014dc512016-03-22 12:00:34 +000040 const Operator* const op_;
41};
42
43
Emily Bernier958fae72015-03-24 16:35:39 -040044// A Load needs a MachineType.
Ben Murdochb8a8cc12014-11-26 15:28:44 +000045typedef MachineType LoadRepresentation;
46
Ben Murdoch014dc512016-03-22 12:00:34 +000047LoadRepresentation LoadRepresentationOf(Operator const*);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000048
Emily Bernier958fae72015-03-24 16:35:39 -040049// A Store needs a MachineType and a WriteBarrierKind in order to emit the
50// correct write barrier.
Ben Murdoch014dc512016-03-22 12:00:34 +000051class StoreRepresentation final {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000052 public:
Ben Murdoch014dc512016-03-22 12:00:34 +000053 StoreRepresentation(MachineRepresentation representation,
Ben Murdochb8a8cc12014-11-26 15:28:44 +000054 WriteBarrierKind write_barrier_kind)
Ben Murdoch014dc512016-03-22 12:00:34 +000055 : representation_(representation),
56 write_barrier_kind_(write_barrier_kind) {}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057
Ben Murdoch014dc512016-03-22 12:00:34 +000058 MachineRepresentation representation() const { return representation_; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000059 WriteBarrierKind write_barrier_kind() const { return write_barrier_kind_; }
60
61 private:
Ben Murdoch014dc512016-03-22 12:00:34 +000062 MachineRepresentation representation_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000063 WriteBarrierKind write_barrier_kind_;
64};
65
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000066V8_EXPORT_PRIVATE bool operator==(StoreRepresentation, StoreRepresentation);
Emily Bernier958fae72015-03-24 16:35:39 -040067bool operator!=(StoreRepresentation, StoreRepresentation);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000068
Emily Bernier958fae72015-03-24 16:35:39 -040069size_t hash_value(StoreRepresentation);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000070
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000071V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&, StoreRepresentation);
Emily Bernier958fae72015-03-24 16:35:39 -040072
73StoreRepresentation const& StoreRepresentationOf(Operator const*);
74
Ben Murdochf91f0612016-11-29 16:50:11 +000075typedef MachineType UnalignedLoadRepresentation;
76
77UnalignedLoadRepresentation UnalignedLoadRepresentationOf(Operator const*);
78
79// An UnalignedStore needs a MachineType.
80typedef MachineRepresentation UnalignedStoreRepresentation;
81
82UnalignedStoreRepresentation const& UnalignedStoreRepresentationOf(
83 Operator const*);
Emily Bernier958fae72015-03-24 16:35:39 -040084
85// A CheckedLoad needs a MachineType.
86typedef MachineType CheckedLoadRepresentation;
87
88CheckedLoadRepresentation CheckedLoadRepresentationOf(Operator const*);
89
90
91// A CheckedStore needs a MachineType.
Ben Murdoch014dc512016-03-22 12:00:34 +000092typedef MachineRepresentation CheckedStoreRepresentation;
Emily Bernier958fae72015-03-24 16:35:39 -040093
94CheckedStoreRepresentation CheckedStoreRepresentationOf(Operator const*);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000095
Ben Murdoch62ed6312017-06-06 11:06:27 +010096int StackSlotSizeOf(Operator const* op);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000097
Ben Murdochbcf72ee2016-08-08 18:44:38 +010098MachineRepresentation AtomicStoreRepresentationOf(Operator const* op);
99
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000100// Interface for building machine-level operators. These operators are
101// machine-level but machine-independent and thus define a language suitable
102// for generating code to run on architectures such as ia32, x64, arm, etc.
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000103class V8_EXPORT_PRIVATE MachineOperatorBuilder final
104 : public NON_EXPORTED_BASE(ZoneObject) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000105 public:
Emily Bernier958fae72015-03-24 16:35:39 -0400106 // Flags that specify which operations are available. This is useful
107 // for operations that are unsupported by some back-ends.
Ben Murdochf91f0612016-11-29 16:50:11 +0000108 enum Flag : unsigned {
Emily Bernier958fae72015-03-24 16:35:39 -0400109 kNoFlags = 0u,
Ben Murdochf91f0612016-11-29 16:50:11 +0000110 kFloat32RoundDown = 1u << 0,
111 kFloat64RoundDown = 1u << 1,
112 kFloat32RoundUp = 1u << 2,
113 kFloat64RoundUp = 1u << 3,
114 kFloat32RoundTruncate = 1u << 4,
115 kFloat64RoundTruncate = 1u << 5,
116 kFloat32RoundTiesEven = 1u << 6,
117 kFloat64RoundTiesEven = 1u << 7,
118 kFloat64RoundTiesAway = 1u << 8,
119 kInt32DivIsSafe = 1u << 9,
120 kUint32DivIsSafe = 1u << 10,
121 kWord32ShiftIsSafe = 1u << 11,
122 kWord32Ctz = 1u << 12,
123 kWord64Ctz = 1u << 13,
124 kWord32Popcnt = 1u << 14,
125 kWord64Popcnt = 1u << 15,
126 kWord32ReverseBits = 1u << 16,
127 kWord64ReverseBits = 1u << 17,
128 kWord32ReverseBytes = 1u << 18,
129 kWord64ReverseBytes = 1u << 19,
130 kAllOptionalOps = kFloat32RoundDown | kFloat64RoundDown | kFloat32RoundUp |
131 kFloat64RoundUp | kFloat32RoundTruncate |
132 kFloat64RoundTruncate | kFloat64RoundTiesAway |
133 kFloat32RoundTiesEven | kFloat64RoundTiesEven |
134 kWord32Ctz | kWord64Ctz | kWord32Popcnt | kWord64Popcnt |
135 kWord32ReverseBits | kWord64ReverseBits |
136 kWord32ReverseBytes | kWord64ReverseBytes
Emily Bernier958fae72015-03-24 16:35:39 -0400137 };
138 typedef base::Flags<Flag, unsigned> Flags;
139
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100140 class AlignmentRequirements {
141 public:
142 enum UnalignedAccessSupport { kNoSupport, kSomeSupport, kFullSupport };
143
144 bool IsUnalignedLoadSupported(const MachineType& machineType,
145 uint8_t alignment) const {
Ben Murdochf91f0612016-11-29 16:50:11 +0000146 return IsUnalignedSupported(unalignedLoadUnsupportedTypes_, machineType,
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100147 alignment);
148 }
149
150 bool IsUnalignedStoreSupported(const MachineType& machineType,
151 uint8_t alignment) const {
Ben Murdochf91f0612016-11-29 16:50:11 +0000152 return IsUnalignedSupported(unalignedStoreUnsupportedTypes_, machineType,
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100153 alignment);
154 }
155
156 static AlignmentRequirements FullUnalignedAccessSupport() {
157 return AlignmentRequirements(kFullSupport);
158 }
159 static AlignmentRequirements NoUnalignedAccessSupport() {
160 return AlignmentRequirements(kNoSupport);
161 }
Ben Murdochf91f0612016-11-29 16:50:11 +0000162 static AlignmentRequirements SomeUnalignedAccessUnsupported(
163 const Vector<MachineType>& unalignedLoadUnsupportedTypes,
164 const Vector<MachineType>& unalignedStoreUnsupportedTypes) {
165 return AlignmentRequirements(kSomeSupport, unalignedLoadUnsupportedTypes,
166 unalignedStoreUnsupportedTypes);
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100167 }
168
169 private:
170 explicit AlignmentRequirements(
171 AlignmentRequirements::UnalignedAccessSupport unalignedAccessSupport,
Ben Murdochf91f0612016-11-29 16:50:11 +0000172 Vector<MachineType> unalignedLoadUnsupportedTypes =
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100173 Vector<MachineType>(NULL, 0),
Ben Murdochf91f0612016-11-29 16:50:11 +0000174 Vector<MachineType> unalignedStoreUnsupportedTypes =
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100175 Vector<MachineType>(NULL, 0))
176 : unalignedSupport_(unalignedAccessSupport),
Ben Murdochf91f0612016-11-29 16:50:11 +0000177 unalignedLoadUnsupportedTypes_(unalignedLoadUnsupportedTypes),
178 unalignedStoreUnsupportedTypes_(unalignedStoreUnsupportedTypes) {}
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100179
Ben Murdochf91f0612016-11-29 16:50:11 +0000180 bool IsUnalignedSupported(const Vector<MachineType>& unsupported,
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100181 const MachineType& machineType,
182 uint8_t alignment) const {
183 if (unalignedSupport_ == kFullSupport) {
184 return true;
185 } else if (unalignedSupport_ == kNoSupport) {
186 return false;
187 } else {
Ben Murdochf91f0612016-11-29 16:50:11 +0000188 for (MachineType m : unsupported) {
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100189 if (m == machineType) {
Ben Murdochf91f0612016-11-29 16:50:11 +0000190 return false;
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100191 }
192 }
Ben Murdochf91f0612016-11-29 16:50:11 +0000193 return true;
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100194 }
195 }
196
197 const AlignmentRequirements::UnalignedAccessSupport unalignedSupport_;
Ben Murdochf91f0612016-11-29 16:50:11 +0000198 const Vector<MachineType> unalignedLoadUnsupportedTypes_;
199 const Vector<MachineType> unalignedStoreUnsupportedTypes_;
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100200 };
201
Ben Murdoch014dc512016-03-22 12:00:34 +0000202 explicit MachineOperatorBuilder(
203 Zone* zone,
204 MachineRepresentation word = MachineType::PointerRepresentation(),
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100205 Flags supportedOperators = kNoFlags,
206 AlignmentRequirements alignmentRequirements =
Ben Murdochf91f0612016-11-29 16:50:11 +0000207 AlignmentRequirements::FullUnalignedAccessSupport());
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100208
209 const Operator* Comment(const char* msg);
210 const Operator* DebugBreak();
Ben Murdochf91f0612016-11-29 16:50:11 +0000211 const Operator* UnsafePointerAdd();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000212
213 const Operator* Word32And();
214 const Operator* Word32Or();
215 const Operator* Word32Xor();
216 const Operator* Word32Shl();
217 const Operator* Word32Shr();
218 const Operator* Word32Sar();
219 const Operator* Word32Ror();
220 const Operator* Word32Equal();
Ben Murdoch014dc512016-03-22 12:00:34 +0000221 const Operator* Word32Clz();
222 const OptionalOperator Word32Ctz();
223 const OptionalOperator Word32Popcnt();
224 const OptionalOperator Word64Popcnt();
Ben Murdoch109988c2016-05-18 11:27:45 +0100225 const OptionalOperator Word32ReverseBits();
226 const OptionalOperator Word64ReverseBits();
Ben Murdochf91f0612016-11-29 16:50:11 +0000227 const OptionalOperator Word32ReverseBytes();
228 const OptionalOperator Word64ReverseBytes();
Emily Bernier958fae72015-03-24 16:35:39 -0400229 bool Word32ShiftIsSafe() const { return flags_ & kWord32ShiftIsSafe; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000230
231 const Operator* Word64And();
232 const Operator* Word64Or();
233 const Operator* Word64Xor();
234 const Operator* Word64Shl();
235 const Operator* Word64Shr();
236 const Operator* Word64Sar();
237 const Operator* Word64Ror();
Ben Murdoch014dc512016-03-22 12:00:34 +0000238 const Operator* Word64Clz();
239 const OptionalOperator Word64Ctz();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000240 const Operator* Word64Equal();
241
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100242 const Operator* Int32PairAdd();
243 const Operator* Int32PairSub();
244 const Operator* Int32PairMul();
245 const Operator* Word32PairShl();
246 const Operator* Word32PairShr();
247 const Operator* Word32PairSar();
248
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000249 const Operator* Int32Add();
250 const Operator* Int32AddWithOverflow();
251 const Operator* Int32Sub();
252 const Operator* Int32SubWithOverflow();
253 const Operator* Int32Mul();
Ben Murdochf91f0612016-11-29 16:50:11 +0000254 const Operator* Int32MulWithOverflow();
Emily Bernier958fae72015-03-24 16:35:39 -0400255 const Operator* Int32MulHigh();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000256 const Operator* Int32Div();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000257 const Operator* Int32Mod();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000258 const Operator* Int32LessThan();
259 const Operator* Int32LessThanOrEqual();
Emily Bernier958fae72015-03-24 16:35:39 -0400260 const Operator* Uint32Div();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000261 const Operator* Uint32LessThan();
262 const Operator* Uint32LessThanOrEqual();
Emily Bernier958fae72015-03-24 16:35:39 -0400263 const Operator* Uint32Mod();
264 const Operator* Uint32MulHigh();
265 bool Int32DivIsSafe() const { return flags_ & kInt32DivIsSafe; }
266 bool Uint32DivIsSafe() const { return flags_ & kUint32DivIsSafe; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000267
268 const Operator* Int64Add();
Ben Murdoch014dc512016-03-22 12:00:34 +0000269 const Operator* Int64AddWithOverflow();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000270 const Operator* Int64Sub();
Ben Murdoch014dc512016-03-22 12:00:34 +0000271 const Operator* Int64SubWithOverflow();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000272 const Operator* Int64Mul();
273 const Operator* Int64Div();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000274 const Operator* Int64Mod();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000275 const Operator* Int64LessThan();
276 const Operator* Int64LessThanOrEqual();
Emily Bernier958fae72015-03-24 16:35:39 -0400277 const Operator* Uint64Div();
278 const Operator* Uint64LessThan();
Ben Murdoch014dc512016-03-22 12:00:34 +0000279 const Operator* Uint64LessThanOrEqual();
Emily Bernier958fae72015-03-24 16:35:39 -0400280 const Operator* Uint64Mod();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000281
Ben Murdochf3b273f2017-01-17 12:11:28 +0000282 // This operator reinterprets the bits of a tagged pointer as word.
283 const Operator* BitcastTaggedToWord();
284
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100285 // This operator reinterprets the bits of a word as tagged pointer.
286 const Operator* BitcastWordToTagged();
287
Ben Murdochf3b273f2017-01-17 12:11:28 +0000288 // This operator reinterprets the bits of a word as a Smi.
289 const Operator* BitcastWordToTaggedSigned();
290
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100291 // JavaScript float64 to int32/uint32 truncation.
292 const Operator* TruncateFloat64ToWord32();
293
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000294 // These operators change the representation of numbers while preserving the
295 // value of the number. Narrowing operators assume the input is representable
296 // in the target type and are *not* defined for other inputs.
297 // Use narrowing change operators only when there is a static guarantee that
298 // the input value is representable in the target value.
299 const Operator* ChangeFloat32ToFloat64();
300 const Operator* ChangeFloat64ToInt32(); // narrowing
301 const Operator* ChangeFloat64ToUint32(); // narrowing
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100302 const Operator* TruncateFloat64ToUint32();
Ben Murdoch109988c2016-05-18 11:27:45 +0100303 const Operator* TruncateFloat32ToInt32();
304 const Operator* TruncateFloat32ToUint32();
Ben Murdoch014dc512016-03-22 12:00:34 +0000305 const Operator* TryTruncateFloat32ToInt64();
306 const Operator* TryTruncateFloat64ToInt64();
307 const Operator* TryTruncateFloat32ToUint64();
308 const Operator* TryTruncateFloat64ToUint64();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000309 const Operator* ChangeInt32ToFloat64();
310 const Operator* ChangeInt32ToInt64();
311 const Operator* ChangeUint32ToFloat64();
312 const Operator* ChangeUint32ToUint64();
313
Ben Murdoch014dc512016-03-22 12:00:34 +0000314 // These operators truncate or round numbers, both changing the representation
315 // of the number and mapping multiple input values onto the same output value.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000316 const Operator* TruncateFloat64ToFloat32();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000317 const Operator* TruncateInt64ToInt32();
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100318 const Operator* RoundFloat64ToInt32();
Ben Murdoch109988c2016-05-18 11:27:45 +0100319 const Operator* RoundInt32ToFloat32();
Ben Murdoch014dc512016-03-22 12:00:34 +0000320 const Operator* RoundInt64ToFloat32();
321 const Operator* RoundInt64ToFloat64();
Ben Murdoch109988c2016-05-18 11:27:45 +0100322 const Operator* RoundUint32ToFloat32();
Ben Murdoch014dc512016-03-22 12:00:34 +0000323 const Operator* RoundUint64ToFloat32();
324 const Operator* RoundUint64ToFloat64();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000325
Ben Murdoch014dc512016-03-22 12:00:34 +0000326 // These operators reinterpret the bits of a floating point number as an
327 // integer and vice versa.
328 const Operator* BitcastFloat32ToInt32();
329 const Operator* BitcastFloat64ToInt64();
330 const Operator* BitcastInt32ToFloat32();
331 const Operator* BitcastInt64ToFloat64();
332
333 // Floating point operators always operate with IEEE 754 round-to-nearest
334 // (single-precision).
335 const Operator* Float32Add();
336 const Operator* Float32Sub();
337 const Operator* Float32Mul();
338 const Operator* Float32Div();
339 const Operator* Float32Sqrt();
340
341 // Floating point operators always operate with IEEE 754 round-to-nearest
342 // (double-precision).
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000343 const Operator* Float64Add();
344 const Operator* Float64Sub();
345 const Operator* Float64Mul();
346 const Operator* Float64Div();
347 const Operator* Float64Mod();
348 const Operator* Float64Sqrt();
349
Ben Murdoch014dc512016-03-22 12:00:34 +0000350 // Floating point comparisons complying to IEEE 754 (single-precision).
351 const Operator* Float32Equal();
352 const Operator* Float32LessThan();
353 const Operator* Float32LessThanOrEqual();
354
355 // Floating point comparisons complying to IEEE 754 (double-precision).
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000356 const Operator* Float64Equal();
357 const Operator* Float64LessThan();
358 const Operator* Float64LessThanOrEqual();
359
Ben Murdochf91f0612016-11-29 16:50:11 +0000360 // Floating point min/max complying to EcmaScript 6 (double-precision).
361 const Operator* Float64Max();
362 const Operator* Float64Min();
363 // Floating point min/max complying to WebAssembly (single-precision).
364 const Operator* Float32Max();
365 const Operator* Float32Min();
Ben Murdoch014dc512016-03-22 12:00:34 +0000366
367 // Floating point abs complying to IEEE 754 (single-precision).
368 const Operator* Float32Abs();
369
370 // Floating point abs complying to IEEE 754 (double-precision).
371 const Operator* Float64Abs();
372
Emily Bernier958fae72015-03-24 16:35:39 -0400373 // Floating point rounding.
Ben Murdoch014dc512016-03-22 12:00:34 +0000374 const OptionalOperator Float32RoundDown();
375 const OptionalOperator Float64RoundDown();
376 const OptionalOperator Float32RoundUp();
377 const OptionalOperator Float64RoundUp();
378 const OptionalOperator Float32RoundTruncate();
379 const OptionalOperator Float64RoundTruncate();
380 const OptionalOperator Float64RoundTiesAway();
381 const OptionalOperator Float32RoundTiesEven();
382 const OptionalOperator Float64RoundTiesEven();
383
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100384 // Floating point neg.
Ben Murdochf91f0612016-11-29 16:50:11 +0000385 const Operator* Float32Neg();
386 const Operator* Float64Neg();
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100387
388 // Floating point trigonometric functions (double-precision).
Ben Murdochf91f0612016-11-29 16:50:11 +0000389 const Operator* Float64Acos();
390 const Operator* Float64Acosh();
391 const Operator* Float64Asin();
392 const Operator* Float64Asinh();
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100393 const Operator* Float64Atan();
394 const Operator* Float64Atan2();
395 const Operator* Float64Atanh();
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100396 const Operator* Float64Cos();
Ben Murdochf91f0612016-11-29 16:50:11 +0000397 const Operator* Float64Cosh();
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100398 const Operator* Float64Sin();
Ben Murdochf91f0612016-11-29 16:50:11 +0000399 const Operator* Float64Sinh();
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100400 const Operator* Float64Tan();
Ben Murdochf91f0612016-11-29 16:50:11 +0000401 const Operator* Float64Tanh();
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100402
403 // Floating point exponential functions (double-precision).
404 const Operator* Float64Exp();
Ben Murdochf91f0612016-11-29 16:50:11 +0000405 const Operator* Float64Expm1();
406 const Operator* Float64Pow();
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100407
408 // Floating point logarithm (double-precision).
409 const Operator* Float64Log();
410 const Operator* Float64Log1p();
411 const Operator* Float64Log2();
412 const Operator* Float64Log10();
413
Ben Murdochf91f0612016-11-29 16:50:11 +0000414 // Floating point cube root (double-precision).
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100415 const Operator* Float64Cbrt();
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100416
Ben Murdoch014dc512016-03-22 12:00:34 +0000417 // Floating point bit representation.
418 const Operator* Float64ExtractLowWord32();
419 const Operator* Float64ExtractHighWord32();
420 const Operator* Float64InsertLowWord32();
421 const Operator* Float64InsertHighWord32();
Emily Bernier958fae72015-03-24 16:35:39 -0400422
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100423 // Change signalling NaN to quiet NaN.
424 // Identity for any input that is not signalling NaN.
425 const Operator* Float64SilenceNaN();
426
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100427 // SIMD operators.
428 const Operator* CreateFloat32x4();
Ben Murdoch62ed6312017-06-06 11:06:27 +0100429 const Operator* Float32x4ExtractLane(int32_t);
430 const Operator* Float32x4ReplaceLane(int32_t);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100431 const Operator* Float32x4Abs();
432 const Operator* Float32x4Neg();
433 const Operator* Float32x4Sqrt();
434 const Operator* Float32x4RecipApprox();
435 const Operator* Float32x4RecipSqrtApprox();
436 const Operator* Float32x4Add();
437 const Operator* Float32x4Sub();
438 const Operator* Float32x4Mul();
439 const Operator* Float32x4Div();
440 const Operator* Float32x4Min();
441 const Operator* Float32x4Max();
442 const Operator* Float32x4MinNum();
443 const Operator* Float32x4MaxNum();
444 const Operator* Float32x4Equal();
445 const Operator* Float32x4NotEqual();
446 const Operator* Float32x4LessThan();
447 const Operator* Float32x4LessThanOrEqual();
448 const Operator* Float32x4GreaterThan();
449 const Operator* Float32x4GreaterThanOrEqual();
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100450 const Operator* Float32x4FromInt32x4();
451 const Operator* Float32x4FromUint32x4();
452
453 const Operator* CreateInt32x4();
Ben Murdoch62ed6312017-06-06 11:06:27 +0100454 const Operator* Int32x4ExtractLane(int32_t);
455 const Operator* Int32x4ReplaceLane(int32_t);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100456 const Operator* Int32x4Neg();
457 const Operator* Int32x4Add();
458 const Operator* Int32x4Sub();
459 const Operator* Int32x4Mul();
460 const Operator* Int32x4Min();
461 const Operator* Int32x4Max();
Ben Murdoch62ed6312017-06-06 11:06:27 +0100462 const Operator* Int32x4ShiftLeftByScalar(int32_t);
463 const Operator* Int32x4ShiftRightByScalar(int32_t);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100464 const Operator* Int32x4Equal();
465 const Operator* Int32x4NotEqual();
466 const Operator* Int32x4LessThan();
467 const Operator* Int32x4LessThanOrEqual();
468 const Operator* Int32x4GreaterThan();
469 const Operator* Int32x4GreaterThanOrEqual();
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100470 const Operator* Int32x4FromFloat32x4();
471
472 const Operator* Uint32x4Min();
473 const Operator* Uint32x4Max();
Ben Murdoch62ed6312017-06-06 11:06:27 +0100474 const Operator* Uint32x4ShiftRightByScalar(int32_t);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100475 const Operator* Uint32x4LessThan();
476 const Operator* Uint32x4LessThanOrEqual();
477 const Operator* Uint32x4GreaterThan();
478 const Operator* Uint32x4GreaterThanOrEqual();
479 const Operator* Uint32x4FromFloat32x4();
480
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100481 const Operator* Bool32x4And();
482 const Operator* Bool32x4Or();
483 const Operator* Bool32x4Xor();
484 const Operator* Bool32x4Not();
485 const Operator* Bool32x4AnyTrue();
486 const Operator* Bool32x4AllTrue();
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100487
488 const Operator* CreateInt16x8();
Ben Murdoch62ed6312017-06-06 11:06:27 +0100489 const Operator* Int16x8ExtractLane(int32_t);
490 const Operator* Int16x8ReplaceLane(int32_t);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100491 const Operator* Int16x8Neg();
492 const Operator* Int16x8Add();
493 const Operator* Int16x8AddSaturate();
494 const Operator* Int16x8Sub();
495 const Operator* Int16x8SubSaturate();
496 const Operator* Int16x8Mul();
497 const Operator* Int16x8Min();
498 const Operator* Int16x8Max();
Ben Murdoch62ed6312017-06-06 11:06:27 +0100499 const Operator* Int16x8ShiftLeftByScalar(int32_t);
500 const Operator* Int16x8ShiftRightByScalar(int32_t);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100501 const Operator* Int16x8Equal();
502 const Operator* Int16x8NotEqual();
503 const Operator* Int16x8LessThan();
504 const Operator* Int16x8LessThanOrEqual();
505 const Operator* Int16x8GreaterThan();
506 const Operator* Int16x8GreaterThanOrEqual();
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100507
508 const Operator* Uint16x8AddSaturate();
509 const Operator* Uint16x8SubSaturate();
510 const Operator* Uint16x8Min();
511 const Operator* Uint16x8Max();
Ben Murdoch62ed6312017-06-06 11:06:27 +0100512 const Operator* Uint16x8ShiftRightByScalar(int32_t);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100513 const Operator* Uint16x8LessThan();
514 const Operator* Uint16x8LessThanOrEqual();
515 const Operator* Uint16x8GreaterThan();
516 const Operator* Uint16x8GreaterThanOrEqual();
517
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100518 const Operator* Bool16x8And();
519 const Operator* Bool16x8Or();
520 const Operator* Bool16x8Xor();
521 const Operator* Bool16x8Not();
522 const Operator* Bool16x8AnyTrue();
523 const Operator* Bool16x8AllTrue();
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100524
525 const Operator* CreateInt8x16();
Ben Murdoch62ed6312017-06-06 11:06:27 +0100526 const Operator* Int8x16ExtractLane(int32_t);
527 const Operator* Int8x16ReplaceLane(int32_t);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100528 const Operator* Int8x16Neg();
529 const Operator* Int8x16Add();
530 const Operator* Int8x16AddSaturate();
531 const Operator* Int8x16Sub();
532 const Operator* Int8x16SubSaturate();
533 const Operator* Int8x16Mul();
534 const Operator* Int8x16Min();
535 const Operator* Int8x16Max();
Ben Murdoch62ed6312017-06-06 11:06:27 +0100536 const Operator* Int8x16ShiftLeftByScalar(int32_t);
537 const Operator* Int8x16ShiftRightByScalar(int32_t);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100538 const Operator* Int8x16Equal();
539 const Operator* Int8x16NotEqual();
540 const Operator* Int8x16LessThan();
541 const Operator* Int8x16LessThanOrEqual();
542 const Operator* Int8x16GreaterThan();
543 const Operator* Int8x16GreaterThanOrEqual();
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100544
545 const Operator* Uint8x16AddSaturate();
546 const Operator* Uint8x16SubSaturate();
547 const Operator* Uint8x16Min();
548 const Operator* Uint8x16Max();
Ben Murdoch62ed6312017-06-06 11:06:27 +0100549 const Operator* Uint8x16ShiftRightByScalar(int32_t);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100550 const Operator* Uint8x16LessThan();
551 const Operator* Uint8x16LessThanOrEqual();
552 const Operator* Uint8x16GreaterThan();
553 const Operator* Uint8x16GreaterThanOrEqual();
554
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100555 const Operator* Bool8x16And();
556 const Operator* Bool8x16Or();
557 const Operator* Bool8x16Xor();
558 const Operator* Bool8x16Not();
559 const Operator* Bool8x16AnyTrue();
560 const Operator* Bool8x16AllTrue();
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100561
562 const Operator* Simd128Load();
563 const Operator* Simd128Load1();
564 const Operator* Simd128Load2();
565 const Operator* Simd128Load3();
566 const Operator* Simd128Store();
567 const Operator* Simd128Store1();
568 const Operator* Simd128Store2();
569 const Operator* Simd128Store3();
570 const Operator* Simd128And();
571 const Operator* Simd128Or();
572 const Operator* Simd128Xor();
573 const Operator* Simd128Not();
Ben Murdoch62ed6312017-06-06 11:06:27 +0100574 const Operator* Simd32x4Select();
575 const Operator* Simd32x4Swizzle(uint32_t);
576 const Operator* Simd32x4Shuffle();
577 const Operator* Simd16x8Select();
578 const Operator* Simd16x8Swizzle(uint32_t);
579 const Operator* Simd16x8Shuffle();
580 const Operator* Simd8x16Select();
581 const Operator* Simd8x16Swizzle(uint32_t);
582 const Operator* Simd8x16Shuffle();
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100583
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000584 // load [base + index]
585 const Operator* Load(LoadRepresentation rep);
Ben Murdochf3b273f2017-01-17 12:11:28 +0000586 const Operator* ProtectedLoad(LoadRepresentation rep);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000587
588 // store [base + index], value
589 const Operator* Store(StoreRepresentation rep);
Ben Murdoch62ed6312017-06-06 11:06:27 +0100590 const Operator* ProtectedStore(MachineRepresentation rep);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000591
Ben Murdochf91f0612016-11-29 16:50:11 +0000592 // unaligned load [base + index]
593 const Operator* UnalignedLoad(UnalignedLoadRepresentation rep);
594
595 // unaligned store [base + index], value
596 const Operator* UnalignedStore(UnalignedStoreRepresentation rep);
597
Ben Murdoch62ed6312017-06-06 11:06:27 +0100598 const Operator* StackSlot(int size);
Ben Murdoch109988c2016-05-18 11:27:45 +0100599 const Operator* StackSlot(MachineRepresentation rep);
600
Emily Bernier958fae72015-03-24 16:35:39 -0400601 // Access to the machine stack.
602 const Operator* LoadStackPointer();
Ben Murdoch014dc512016-03-22 12:00:34 +0000603 const Operator* LoadFramePointer();
Ben Murdoch109988c2016-05-18 11:27:45 +0100604 const Operator* LoadParentFramePointer();
Emily Bernier958fae72015-03-24 16:35:39 -0400605
606 // checked-load heap, index, length
607 const Operator* CheckedLoad(CheckedLoadRepresentation);
608 // checked-store heap, index, length, value
609 const Operator* CheckedStore(CheckedStoreRepresentation);
610
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100611 // atomic-load [base + index]
612 const Operator* AtomicLoad(LoadRepresentation rep);
613 // atomic-store [base + index], value
614 const Operator* AtomicStore(MachineRepresentation rep);
615
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000616 // Target machine word-size assumed by this builder.
Ben Murdoch014dc512016-03-22 12:00:34 +0000617 bool Is32() const { return word() == MachineRepresentation::kWord32; }
618 bool Is64() const { return word() == MachineRepresentation::kWord64; }
619 MachineRepresentation word() const { return word_; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000620
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100621 bool UnalignedLoadSupported(const MachineType& machineType,
622 uint8_t alignment) {
623 return alignment_requirements_.IsUnalignedLoadSupported(machineType,
624 alignment);
625 }
626
627 bool UnalignedStoreSupported(const MachineType& machineType,
628 uint8_t alignment) {
629 return alignment_requirements_.IsUnalignedStoreSupported(machineType,
630 alignment);
631 }
632
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000633// Pseudo operators that translate to 32/64-bit operators depending on the
634// word-size of the target machine assumed by this builder.
635#define PSEUDO_OP_LIST(V) \
636 V(Word, And) \
637 V(Word, Or) \
638 V(Word, Xor) \
639 V(Word, Shl) \
640 V(Word, Shr) \
641 V(Word, Sar) \
642 V(Word, Ror) \
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100643 V(Word, Clz) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000644 V(Word, Equal) \
645 V(Int, Add) \
646 V(Int, Sub) \
647 V(Int, Mul) \
648 V(Int, Div) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000649 V(Int, Mod) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000650 V(Int, LessThan) \
Emily Bernier958fae72015-03-24 16:35:39 -0400651 V(Int, LessThanOrEqual) \
652 V(Uint, Div) \
653 V(Uint, LessThan) \
654 V(Uint, Mod)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000655#define PSEUDO_OP(Prefix, Suffix) \
656 const Operator* Prefix##Suffix() { \
657 return Is32() ? Prefix##32##Suffix() : Prefix##64##Suffix(); \
658 }
659 PSEUDO_OP_LIST(PSEUDO_OP)
660#undef PSEUDO_OP
661#undef PSEUDO_OP_LIST
662
663 private:
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100664 Zone* zone_;
Ben Murdoch014dc512016-03-22 12:00:34 +0000665 MachineOperatorGlobalCache const& cache_;
666 MachineRepresentation const word_;
667 Flags const flags_;
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100668 AlignmentRequirements const alignment_requirements_;
Emily Bernier958fae72015-03-24 16:35:39 -0400669
670 DISALLOW_COPY_AND_ASSIGN(MachineOperatorBuilder);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000671};
672
Emily Bernier958fae72015-03-24 16:35:39 -0400673
674DEFINE_OPERATORS_FOR_FLAGS(MachineOperatorBuilder::Flags)
675
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000676} // namespace compiler
677} // namespace internal
678} // namespace v8
679
680#endif // V8_COMPILER_MACHINE_OPERATOR_H_