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
3 // found in the LICENSE file.
4
5 #include "src/compiler/machine-operator.h"
6
7 #include "src/base/lazy-instance.h"
8 #include "src/compiler/opcodes.h"
9 #include "src/compiler/operator.h"
10
11 namespace v8 {
12 namespace internal {
13 namespace compiler {
14
operator ==(StoreRepresentation lhs,StoreRepresentation rhs)15 bool operator==(StoreRepresentation lhs, StoreRepresentation rhs) {
16 return lhs.representation() == rhs.representation() &&
17 lhs.write_barrier_kind() == rhs.write_barrier_kind();
18 }
19
20
operator !=(StoreRepresentation lhs,StoreRepresentation rhs)21 bool operator!=(StoreRepresentation lhs, StoreRepresentation rhs) {
22 return !(lhs == rhs);
23 }
24
25
hash_value(StoreRepresentation rep)26 size_t hash_value(StoreRepresentation rep) {
27 return base::hash_combine(rep.representation(), rep.write_barrier_kind());
28 }
29
30
operator <<(std::ostream & os,StoreRepresentation rep)31 std::ostream& operator<<(std::ostream& os, StoreRepresentation rep) {
32 return os << "(" << rep.representation() << " : " << rep.write_barrier_kind()
33 << ")";
34 }
35
36
LoadRepresentationOf(Operator const * op)37 LoadRepresentation LoadRepresentationOf(Operator const* op) {
38 DCHECK(IrOpcode::kLoad == op->opcode() ||
39 IrOpcode::kProtectedLoad == op->opcode() ||
40 IrOpcode::kWord32AtomicLoad == op->opcode() ||
41 IrOpcode::kWord64AtomicLoad == op->opcode() ||
42 IrOpcode::kWord32AtomicPairLoad == op->opcode() ||
43 IrOpcode::kPoisonedLoad == op->opcode() ||
44 IrOpcode::kUnalignedLoad == op->opcode());
45 return OpParameter<LoadRepresentation>(op);
46 }
47
48
StoreRepresentationOf(Operator const * op)49 StoreRepresentation const& StoreRepresentationOf(Operator const* op) {
50 DCHECK(IrOpcode::kStore == op->opcode() ||
51 IrOpcode::kProtectedStore == op->opcode());
52 return OpParameter<StoreRepresentation>(op);
53 }
54
UnalignedStoreRepresentationOf(Operator const * op)55 UnalignedStoreRepresentation const& UnalignedStoreRepresentationOf(
56 Operator const* op) {
57 DCHECK_EQ(IrOpcode::kUnalignedStore, op->opcode());
58 return OpParameter<UnalignedStoreRepresentation>(op);
59 }
60
operator ==(StackSlotRepresentation lhs,StackSlotRepresentation rhs)61 bool operator==(StackSlotRepresentation lhs, StackSlotRepresentation rhs) {
62 return lhs.size() == rhs.size() && lhs.alignment() == rhs.alignment();
63 }
64
operator !=(StackSlotRepresentation lhs,StackSlotRepresentation rhs)65 bool operator!=(StackSlotRepresentation lhs, StackSlotRepresentation rhs) {
66 return !(lhs == rhs);
67 }
68
hash_value(StackSlotRepresentation rep)69 size_t hash_value(StackSlotRepresentation rep) {
70 return base::hash_combine(rep.size(), rep.alignment());
71 }
72
operator <<(std::ostream & os,StackSlotRepresentation rep)73 std::ostream& operator<<(std::ostream& os, StackSlotRepresentation rep) {
74 return os << "(" << rep.size() << " : " << rep.alignment() << ")";
75 }
76
StackSlotRepresentationOf(Operator const * op)77 StackSlotRepresentation const& StackSlotRepresentationOf(Operator const* op) {
78 DCHECK_EQ(IrOpcode::kStackSlot, op->opcode());
79 return OpParameter<StackSlotRepresentation>(op);
80 }
81
AtomicStoreRepresentationOf(Operator const * op)82 MachineRepresentation AtomicStoreRepresentationOf(Operator const* op) {
83 DCHECK(IrOpcode::kWord32AtomicStore == op->opcode() ||
84 IrOpcode::kWord64AtomicStore == op->opcode() ||
85 IrOpcode::kWord32AtomicPairStore == op->opcode());
86 return OpParameter<MachineRepresentation>(op);
87 }
88
AtomicOpType(Operator const * op)89 MachineType AtomicOpType(Operator const* op) {
90 return OpParameter<MachineType>(op);
91 }
92
93 #define PURE_BINARY_OP_LIST_32(V) \
94 V(Word32And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
95 V(Word32Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
96 V(Word32Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
97 V(Word32Shl, Operator::kNoProperties, 2, 0, 1) \
98 V(Word32Shr, Operator::kNoProperties, 2, 0, 1) \
99 V(Word32Sar, Operator::kNoProperties, 2, 0, 1) \
100 V(Word32Ror, Operator::kNoProperties, 2, 0, 1) \
101 V(Word32Equal, Operator::kCommutative, 2, 0, 1) \
102 V(Int32Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
103 V(Int32Sub, Operator::kNoProperties, 2, 0, 1) \
104 V(Int32Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
105 V(Int32MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
106 V(Int32Div, Operator::kNoProperties, 2, 1, 1) \
107 V(Int32Mod, Operator::kNoProperties, 2, 1, 1) \
108 V(Int32LessThan, Operator::kNoProperties, 2, 0, 1) \
109 V(Int32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
110 V(Uint32Div, Operator::kNoProperties, 2, 1, 1) \
111 V(Uint32LessThan, Operator::kNoProperties, 2, 0, 1) \
112 V(Uint32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
113 V(Uint32Mod, Operator::kNoProperties, 2, 1, 1) \
114 V(Uint32MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 0, 1)
115
116 #define PURE_BINARY_OP_LIST_64(V) \
117 V(Word64And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
118 V(Word64Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
119 V(Word64Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
120 V(Word64Shl, Operator::kNoProperties, 2, 0, 1) \
121 V(Word64Shr, Operator::kNoProperties, 2, 0, 1) \
122 V(Word64Sar, Operator::kNoProperties, 2, 0, 1) \
123 V(Word64Ror, Operator::kNoProperties, 2, 0, 1) \
124 V(Word64Equal, Operator::kCommutative, 2, 0, 1) \
125 V(Int64Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
126 V(Int64Sub, Operator::kNoProperties, 2, 0, 1) \
127 V(Int64Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
128 V(Int64Div, Operator::kNoProperties, 2, 1, 1) \
129 V(Int64Mod, Operator::kNoProperties, 2, 1, 1) \
130 V(Int64LessThan, Operator::kNoProperties, 2, 0, 1) \
131 V(Int64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
132 V(Uint64Div, Operator::kNoProperties, 2, 1, 1) \
133 V(Uint64Mod, Operator::kNoProperties, 2, 1, 1) \
134 V(Uint64LessThan, Operator::kNoProperties, 2, 0, 1) \
135 V(Uint64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1)
136
137 #define MACHINE_PURE_OP_LIST(V) \
138 PURE_BINARY_OP_LIST_32(V) \
139 PURE_BINARY_OP_LIST_64(V) \
140 V(Word32Clz, Operator::kNoProperties, 1, 0, 1) \
141 V(Word64Clz, Operator::kNoProperties, 1, 0, 1) \
142 V(Word32ReverseBytes, Operator::kNoProperties, 1, 0, 1) \
143 V(Word64ReverseBytes, Operator::kNoProperties, 1, 0, 1) \
144 V(BitcastWordToTaggedSigned, Operator::kNoProperties, 1, 0, 1) \
145 V(TruncateFloat64ToWord32, Operator::kNoProperties, 1, 0, 1) \
146 V(ChangeFloat32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
147 V(ChangeFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \
148 V(ChangeFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \
149 V(ChangeFloat64ToUint64, Operator::kNoProperties, 1, 0, 1) \
150 V(TruncateFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \
151 V(TruncateFloat32ToInt32, Operator::kNoProperties, 1, 0, 1) \
152 V(TruncateFloat32ToUint32, Operator::kNoProperties, 1, 0, 1) \
153 V(TryTruncateFloat32ToInt64, Operator::kNoProperties, 1, 0, 2) \
154 V(TryTruncateFloat64ToInt64, Operator::kNoProperties, 1, 0, 2) \
155 V(TryTruncateFloat32ToUint64, Operator::kNoProperties, 1, 0, 2) \
156 V(TryTruncateFloat64ToUint64, Operator::kNoProperties, 1, 0, 2) \
157 V(ChangeInt32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
158 V(Float64SilenceNaN, Operator::kNoProperties, 1, 0, 1) \
159 V(RoundFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \
160 V(RoundInt32ToFloat32, Operator::kNoProperties, 1, 0, 1) \
161 V(RoundInt64ToFloat32, Operator::kNoProperties, 1, 0, 1) \
162 V(RoundInt64ToFloat64, Operator::kNoProperties, 1, 0, 1) \
163 V(RoundUint32ToFloat32, Operator::kNoProperties, 1, 0, 1) \
164 V(RoundUint64ToFloat32, Operator::kNoProperties, 1, 0, 1) \
165 V(RoundUint64ToFloat64, Operator::kNoProperties, 1, 0, 1) \
166 V(ChangeInt32ToInt64, Operator::kNoProperties, 1, 0, 1) \
167 V(ChangeUint32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
168 V(ChangeUint32ToUint64, Operator::kNoProperties, 1, 0, 1) \
169 V(TruncateFloat64ToFloat32, Operator::kNoProperties, 1, 0, 1) \
170 V(TruncateInt64ToInt32, Operator::kNoProperties, 1, 0, 1) \
171 V(BitcastFloat32ToInt32, Operator::kNoProperties, 1, 0, 1) \
172 V(BitcastFloat64ToInt64, Operator::kNoProperties, 1, 0, 1) \
173 V(BitcastInt32ToFloat32, Operator::kNoProperties, 1, 0, 1) \
174 V(BitcastInt64ToFloat64, Operator::kNoProperties, 1, 0, 1) \
175 V(SignExtendWord8ToInt32, Operator::kNoProperties, 1, 0, 1) \
176 V(SignExtendWord16ToInt32, Operator::kNoProperties, 1, 0, 1) \
177 V(SignExtendWord8ToInt64, Operator::kNoProperties, 1, 0, 1) \
178 V(SignExtendWord16ToInt64, Operator::kNoProperties, 1, 0, 1) \
179 V(SignExtendWord32ToInt64, Operator::kNoProperties, 1, 0, 1) \
180 V(Float32Abs, Operator::kNoProperties, 1, 0, 1) \
181 V(Float32Add, Operator::kCommutative, 2, 0, 1) \
182 V(Float32Sub, Operator::kNoProperties, 2, 0, 1) \
183 V(Float32Mul, Operator::kCommutative, 2, 0, 1) \
184 V(Float32Div, Operator::kNoProperties, 2, 0, 1) \
185 V(Float32Neg, Operator::kNoProperties, 1, 0, 1) \
186 V(Float32Sqrt, Operator::kNoProperties, 1, 0, 1) \
187 V(Float32Max, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
188 V(Float32Min, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
189 V(Float64Abs, Operator::kNoProperties, 1, 0, 1) \
190 V(Float64Acos, Operator::kNoProperties, 1, 0, 1) \
191 V(Float64Acosh, Operator::kNoProperties, 1, 0, 1) \
192 V(Float64Asin, Operator::kNoProperties, 1, 0, 1) \
193 V(Float64Asinh, Operator::kNoProperties, 1, 0, 1) \
194 V(Float64Atan, Operator::kNoProperties, 1, 0, 1) \
195 V(Float64Atan2, Operator::kNoProperties, 2, 0, 1) \
196 V(Float64Atanh, Operator::kNoProperties, 1, 0, 1) \
197 V(Float64Cbrt, Operator::kNoProperties, 1, 0, 1) \
198 V(Float64Cos, Operator::kNoProperties, 1, 0, 1) \
199 V(Float64Cosh, Operator::kNoProperties, 1, 0, 1) \
200 V(Float64Exp, Operator::kNoProperties, 1, 0, 1) \
201 V(Float64Expm1, Operator::kNoProperties, 1, 0, 1) \
202 V(Float64Log, Operator::kNoProperties, 1, 0, 1) \
203 V(Float64Log1p, Operator::kNoProperties, 1, 0, 1) \
204 V(Float64Log2, Operator::kNoProperties, 1, 0, 1) \
205 V(Float64Log10, Operator::kNoProperties, 1, 0, 1) \
206 V(Float64Max, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
207 V(Float64Min, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
208 V(Float64Neg, Operator::kNoProperties, 1, 0, 1) \
209 V(Float64Add, Operator::kCommutative, 2, 0, 1) \
210 V(Float64Sub, Operator::kNoProperties, 2, 0, 1) \
211 V(Float64Mul, Operator::kCommutative, 2, 0, 1) \
212 V(Float64Div, Operator::kNoProperties, 2, 0, 1) \
213 V(Float64Mod, Operator::kNoProperties, 2, 0, 1) \
214 V(Float64Pow, Operator::kNoProperties, 2, 0, 1) \
215 V(Float64Sin, Operator::kNoProperties, 1, 0, 1) \
216 V(Float64Sinh, Operator::kNoProperties, 1, 0, 1) \
217 V(Float64Sqrt, Operator::kNoProperties, 1, 0, 1) \
218 V(Float64Tan, Operator::kNoProperties, 1, 0, 1) \
219 V(Float64Tanh, Operator::kNoProperties, 1, 0, 1) \
220 V(Float32Equal, Operator::kCommutative, 2, 0, 1) \
221 V(Float32LessThan, Operator::kNoProperties, 2, 0, 1) \
222 V(Float32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
223 V(Float64Equal, Operator::kCommutative, 2, 0, 1) \
224 V(Float64LessThan, Operator::kNoProperties, 2, 0, 1) \
225 V(Float64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
226 V(Float64ExtractLowWord32, Operator::kNoProperties, 1, 0, 1) \
227 V(Float64ExtractHighWord32, Operator::kNoProperties, 1, 0, 1) \
228 V(Float64InsertLowWord32, Operator::kNoProperties, 2, 0, 1) \
229 V(Float64InsertHighWord32, Operator::kNoProperties, 2, 0, 1) \
230 V(LoadStackPointer, Operator::kNoProperties, 0, 0, 1) \
231 V(LoadFramePointer, Operator::kNoProperties, 0, 0, 1) \
232 V(LoadParentFramePointer, Operator::kNoProperties, 0, 0, 1) \
233 V(Int32PairAdd, Operator::kNoProperties, 4, 0, 2) \
234 V(Int32PairSub, Operator::kNoProperties, 4, 0, 2) \
235 V(Int32PairMul, Operator::kNoProperties, 4, 0, 2) \
236 V(Word32PairShl, Operator::kNoProperties, 3, 0, 2) \
237 V(Word32PairShr, Operator::kNoProperties, 3, 0, 2) \
238 V(Word32PairSar, Operator::kNoProperties, 3, 0, 2) \
239 V(F32x4Splat, Operator::kNoProperties, 1, 0, 1) \
240 V(F32x4SConvertI32x4, Operator::kNoProperties, 1, 0, 1) \
241 V(F32x4UConvertI32x4, Operator::kNoProperties, 1, 0, 1) \
242 V(F32x4Abs, Operator::kNoProperties, 1, 0, 1) \
243 V(F32x4Neg, Operator::kNoProperties, 1, 0, 1) \
244 V(F32x4RecipApprox, Operator::kNoProperties, 1, 0, 1) \
245 V(F32x4RecipSqrtApprox, Operator::kNoProperties, 1, 0, 1) \
246 V(F32x4Add, Operator::kCommutative, 2, 0, 1) \
247 V(F32x4AddHoriz, Operator::kNoProperties, 2, 0, 1) \
248 V(F32x4Sub, Operator::kNoProperties, 2, 0, 1) \
249 V(F32x4Mul, Operator::kCommutative, 2, 0, 1) \
250 V(F32x4Min, Operator::kCommutative, 2, 0, 1) \
251 V(F32x4Max, Operator::kCommutative, 2, 0, 1) \
252 V(F32x4Eq, Operator::kCommutative, 2, 0, 1) \
253 V(F32x4Ne, Operator::kCommutative, 2, 0, 1) \
254 V(F32x4Lt, Operator::kNoProperties, 2, 0, 1) \
255 V(F32x4Le, Operator::kNoProperties, 2, 0, 1) \
256 V(I32x4Splat, Operator::kNoProperties, 1, 0, 1) \
257 V(I32x4SConvertF32x4, Operator::kNoProperties, 1, 0, 1) \
258 V(I32x4SConvertI16x8Low, Operator::kNoProperties, 1, 0, 1) \
259 V(I32x4SConvertI16x8High, Operator::kNoProperties, 1, 0, 1) \
260 V(I32x4Neg, Operator::kNoProperties, 1, 0, 1) \
261 V(I32x4Add, Operator::kCommutative, 2, 0, 1) \
262 V(I32x4AddHoriz, Operator::kNoProperties, 2, 0, 1) \
263 V(I32x4Sub, Operator::kNoProperties, 2, 0, 1) \
264 V(I32x4Mul, Operator::kCommutative, 2, 0, 1) \
265 V(I32x4MinS, Operator::kCommutative, 2, 0, 1) \
266 V(I32x4MaxS, Operator::kCommutative, 2, 0, 1) \
267 V(I32x4Eq, Operator::kCommutative, 2, 0, 1) \
268 V(I32x4Ne, Operator::kCommutative, 2, 0, 1) \
269 V(I32x4GtS, Operator::kNoProperties, 2, 0, 1) \
270 V(I32x4GeS, Operator::kNoProperties, 2, 0, 1) \
271 V(I32x4UConvertF32x4, Operator::kNoProperties, 1, 0, 1) \
272 V(I32x4UConvertI16x8Low, Operator::kNoProperties, 1, 0, 1) \
273 V(I32x4UConvertI16x8High, Operator::kNoProperties, 1, 0, 1) \
274 V(I32x4MinU, Operator::kCommutative, 2, 0, 1) \
275 V(I32x4MaxU, Operator::kCommutative, 2, 0, 1) \
276 V(I32x4GtU, Operator::kNoProperties, 2, 0, 1) \
277 V(I32x4GeU, Operator::kNoProperties, 2, 0, 1) \
278 V(I16x8Splat, Operator::kNoProperties, 1, 0, 1) \
279 V(I16x8SConvertI8x16Low, Operator::kNoProperties, 1, 0, 1) \
280 V(I16x8SConvertI8x16High, Operator::kNoProperties, 1, 0, 1) \
281 V(I16x8Neg, Operator::kNoProperties, 1, 0, 1) \
282 V(I16x8SConvertI32x4, Operator::kNoProperties, 2, 0, 1) \
283 V(I16x8Add, Operator::kCommutative, 2, 0, 1) \
284 V(I16x8AddSaturateS, Operator::kCommutative, 2, 0, 1) \
285 V(I16x8AddHoriz, Operator::kNoProperties, 2, 0, 1) \
286 V(I16x8Sub, Operator::kNoProperties, 2, 0, 1) \
287 V(I16x8SubSaturateS, Operator::kNoProperties, 2, 0, 1) \
288 V(I16x8Mul, Operator::kCommutative, 2, 0, 1) \
289 V(I16x8MinS, Operator::kCommutative, 2, 0, 1) \
290 V(I16x8MaxS, Operator::kCommutative, 2, 0, 1) \
291 V(I16x8Eq, Operator::kCommutative, 2, 0, 1) \
292 V(I16x8Ne, Operator::kCommutative, 2, 0, 1) \
293 V(I16x8GtS, Operator::kNoProperties, 2, 0, 1) \
294 V(I16x8GeS, Operator::kNoProperties, 2, 0, 1) \
295 V(I16x8UConvertI8x16Low, Operator::kNoProperties, 1, 0, 1) \
296 V(I16x8UConvertI8x16High, Operator::kNoProperties, 1, 0, 1) \
297 V(I16x8UConvertI32x4, Operator::kNoProperties, 2, 0, 1) \
298 V(I16x8AddSaturateU, Operator::kCommutative, 2, 0, 1) \
299 V(I16x8SubSaturateU, Operator::kNoProperties, 2, 0, 1) \
300 V(I16x8MinU, Operator::kCommutative, 2, 0, 1) \
301 V(I16x8MaxU, Operator::kCommutative, 2, 0, 1) \
302 V(I16x8GtU, Operator::kNoProperties, 2, 0, 1) \
303 V(I16x8GeU, Operator::kNoProperties, 2, 0, 1) \
304 V(I8x16Splat, Operator::kNoProperties, 1, 0, 1) \
305 V(I8x16Neg, Operator::kNoProperties, 1, 0, 1) \
306 V(I8x16SConvertI16x8, Operator::kNoProperties, 2, 0, 1) \
307 V(I8x16Add, Operator::kCommutative, 2, 0, 1) \
308 V(I8x16AddSaturateS, Operator::kCommutative, 2, 0, 1) \
309 V(I8x16Sub, Operator::kNoProperties, 2, 0, 1) \
310 V(I8x16SubSaturateS, Operator::kNoProperties, 2, 0, 1) \
311 V(I8x16Mul, Operator::kCommutative, 2, 0, 1) \
312 V(I8x16MinS, Operator::kCommutative, 2, 0, 1) \
313 V(I8x16MaxS, Operator::kCommutative, 2, 0, 1) \
314 V(I8x16Eq, Operator::kCommutative, 2, 0, 1) \
315 V(I8x16Ne, Operator::kCommutative, 2, 0, 1) \
316 V(I8x16GtS, Operator::kNoProperties, 2, 0, 1) \
317 V(I8x16GeS, Operator::kNoProperties, 2, 0, 1) \
318 V(I8x16UConvertI16x8, Operator::kNoProperties, 2, 0, 1) \
319 V(I8x16AddSaturateU, Operator::kCommutative, 2, 0, 1) \
320 V(I8x16SubSaturateU, Operator::kNoProperties, 2, 0, 1) \
321 V(I8x16MinU, Operator::kCommutative, 2, 0, 1) \
322 V(I8x16MaxU, Operator::kCommutative, 2, 0, 1) \
323 V(I8x16GtU, Operator::kNoProperties, 2, 0, 1) \
324 V(I8x16GeU, Operator::kNoProperties, 2, 0, 1) \
325 V(S128Load, Operator::kNoProperties, 2, 0, 1) \
326 V(S128Store, Operator::kNoProperties, 3, 0, 1) \
327 V(S128Zero, Operator::kNoProperties, 0, 0, 1) \
328 V(S128And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
329 V(S128Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
330 V(S128Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
331 V(S128Not, Operator::kNoProperties, 1, 0, 1) \
332 V(S128Select, Operator::kNoProperties, 3, 0, 1) \
333 V(S1x4AnyTrue, Operator::kNoProperties, 1, 0, 1) \
334 V(S1x4AllTrue, Operator::kNoProperties, 1, 0, 1) \
335 V(S1x8AnyTrue, Operator::kNoProperties, 1, 0, 1) \
336 V(S1x8AllTrue, Operator::kNoProperties, 1, 0, 1) \
337 V(S1x16AnyTrue, Operator::kNoProperties, 1, 0, 1) \
338 V(S1x16AllTrue, Operator::kNoProperties, 1, 0, 1)
339
340 #define PURE_OPTIONAL_OP_LIST(V) \
341 V(Word32Ctz, Operator::kNoProperties, 1, 0, 1) \
342 V(Word64Ctz, Operator::kNoProperties, 1, 0, 1) \
343 V(Word32ReverseBits, Operator::kNoProperties, 1, 0, 1) \
344 V(Word64ReverseBits, Operator::kNoProperties, 1, 0, 1) \
345 V(Int32AbsWithOverflow, Operator::kNoProperties, 1, 0, 1) \
346 V(Int64AbsWithOverflow, Operator::kNoProperties, 1, 0, 1) \
347 V(Word32Popcnt, Operator::kNoProperties, 1, 0, 1) \
348 V(Word64Popcnt, Operator::kNoProperties, 1, 0, 1) \
349 V(Float32RoundDown, Operator::kNoProperties, 1, 0, 1) \
350 V(Float64RoundDown, Operator::kNoProperties, 1, 0, 1) \
351 V(Float32RoundUp, Operator::kNoProperties, 1, 0, 1) \
352 V(Float64RoundUp, Operator::kNoProperties, 1, 0, 1) \
353 V(Float32RoundTruncate, Operator::kNoProperties, 1, 0, 1) \
354 V(Float64RoundTruncate, Operator::kNoProperties, 1, 0, 1) \
355 V(Float64RoundTiesAway, Operator::kNoProperties, 1, 0, 1) \
356 V(Float32RoundTiesEven, Operator::kNoProperties, 1, 0, 1) \
357 V(Float64RoundTiesEven, Operator::kNoProperties, 1, 0, 1)
358
359 #define OVERFLOW_OP_LIST(V) \
360 V(Int32AddWithOverflow, Operator::kAssociative | Operator::kCommutative) \
361 V(Int32SubWithOverflow, Operator::kNoProperties) \
362 V(Int32MulWithOverflow, Operator::kAssociative | Operator::kCommutative) \
363 V(Int64AddWithOverflow, Operator::kAssociative | Operator::kCommutative) \
364 V(Int64SubWithOverflow, Operator::kNoProperties)
365
366 #define MACHINE_TYPE_LIST(V) \
367 V(Float32) \
368 V(Float64) \
369 V(Simd128) \
370 V(Int8) \
371 V(Uint8) \
372 V(Int16) \
373 V(Uint16) \
374 V(Int32) \
375 V(Uint32) \
376 V(Int64) \
377 V(Uint64) \
378 V(Pointer) \
379 V(TaggedSigned) \
380 V(TaggedPointer) \
381 V(AnyTagged)
382
383 #define MACHINE_REPRESENTATION_LIST(V) \
384 V(kFloat32) \
385 V(kFloat64) \
386 V(kSimd128) \
387 V(kWord8) \
388 V(kWord16) \
389 V(kWord32) \
390 V(kWord64) \
391 V(kTaggedSigned) \
392 V(kTaggedPointer) \
393 V(kTagged)
394
395 #define ATOMIC_U32_TYPE_LIST(V) \
396 V(Uint8) \
397 V(Uint16) \
398 V(Uint32)
399
400 #define ATOMIC_TYPE_LIST(V) \
401 ATOMIC_U32_TYPE_LIST(V) \
402 V(Int8) \
403 V(Int16) \
404 V(Int32)
405
406 #define ATOMIC_U64_TYPE_LIST(V) \
407 ATOMIC_U32_TYPE_LIST(V) \
408 V(Uint64)
409
410 #define ATOMIC_REPRESENTATION_LIST(V) \
411 V(kWord8) \
412 V(kWord16) \
413 V(kWord32)
414
415 #define ATOMIC64_REPRESENTATION_LIST(V) \
416 ATOMIC_REPRESENTATION_LIST(V) \
417 V(kWord64)
418
419 #define ATOMIC_PAIR_BINOP_LIST(V) \
420 V(Add) \
421 V(Sub) \
422 V(And) \
423 V(Or) \
424 V(Xor) \
425 V(Exchange)
426
427 #define SIMD_LANE_OP_LIST(V) \
428 V(F32x4, 4) \
429 V(I32x4, 4) \
430 V(I16x8, 8) \
431 V(I8x16, 16)
432
433 #define SIMD_FORMAT_LIST(V) \
434 V(32x4, 32) \
435 V(16x8, 16) \
436 V(8x16, 8)
437
438 #define STACK_SLOT_CACHED_SIZES_ALIGNMENTS_LIST(V) \
439 V(4, 0) V(8, 0) V(16, 0) V(4, 4) V(8, 8) V(16, 16)
440
441 struct StackSlotOperator : public Operator1<StackSlotRepresentation> {
StackSlotOperatorv8::internal::compiler::StackSlotOperator442 explicit StackSlotOperator(int size, int alignment)
443 : Operator1<StackSlotRepresentation>(
444 IrOpcode::kStackSlot, Operator::kNoDeopt | Operator::kNoThrow,
445 "StackSlot", 0, 0, 0, 1, 0, 0,
446 StackSlotRepresentation(size, alignment)) {}
447 };
448
449 struct MachineOperatorGlobalCache {
450 #define PURE(Name, properties, value_input_count, control_input_count, \
451 output_count) \
452 struct Name##Operator final : public Operator { \
453 Name##Operator() \
454 : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \
455 value_input_count, 0, control_input_count, output_count, 0, \
456 0) {} \
457 }; \
458 Name##Operator k##Name;
459 MACHINE_PURE_OP_LIST(PURE)
460 PURE_OPTIONAL_OP_LIST(PURE)
461 #undef PURE
462
463 #define OVERFLOW_OP(Name, properties) \
464 struct Name##Operator final : public Operator { \
465 Name##Operator() \
466 : Operator(IrOpcode::k##Name, \
467 Operator::kEliminatable | Operator::kNoRead | properties, \
468 #Name, 2, 0, 1, 2, 0, 0) {} \
469 }; \
470 Name##Operator k##Name;
471 OVERFLOW_OP_LIST(OVERFLOW_OP)
472 #undef OVERFLOW_OP
473
474 #define LOAD(Type) \
475 struct Load##Type##Operator final : public Operator1<LoadRepresentation> { \
476 Load##Type##Operator() \
477 : Operator1<LoadRepresentation>( \
478 IrOpcode::kLoad, \
479 Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite, \
480 "Load", 2, 1, 1, 1, 1, 0, MachineType::Type()) {} \
481 }; \
482 struct PoisonedLoad##Type##Operator final \
483 : public Operator1<LoadRepresentation> { \
484 PoisonedLoad##Type##Operator() \
485 : Operator1<LoadRepresentation>( \
486 IrOpcode::kPoisonedLoad, \
487 Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite, \
488 "PoisonedLoad", 2, 1, 1, 1, 1, 0, MachineType::Type()) {} \
489 }; \
490 struct UnalignedLoad##Type##Operator final \
491 : public Operator1<LoadRepresentation> { \
492 UnalignedLoad##Type##Operator() \
493 : Operator1<LoadRepresentation>( \
494 IrOpcode::kUnalignedLoad, \
495 Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite, \
496 "UnalignedLoad", 2, 1, 1, 1, 1, 0, MachineType::Type()) {} \
497 }; \
498 struct ProtectedLoad##Type##Operator final \
499 : public Operator1<LoadRepresentation> { \
500 ProtectedLoad##Type##Operator() \
501 : Operator1<LoadRepresentation>( \
502 IrOpcode::kProtectedLoad, \
503 Operator::kNoDeopt | Operator::kNoThrow, "ProtectedLoad", 2, 1, \
504 1, 1, 1, 0, MachineType::Type()) {} \
505 }; \
506 Load##Type##Operator kLoad##Type; \
507 PoisonedLoad##Type##Operator kPoisonedLoad##Type; \
508 UnalignedLoad##Type##Operator kUnalignedLoad##Type; \
509 ProtectedLoad##Type##Operator kProtectedLoad##Type;
510 MACHINE_TYPE_LIST(LOAD)
511 #undef LOAD
512
513 #define STACKSLOT(Size, Alignment) \
514 struct StackSlotOfSize##Size##OfAlignment##Alignment##Operator final \
515 : public StackSlotOperator { \
516 StackSlotOfSize##Size##OfAlignment##Alignment##Operator() \
517 : StackSlotOperator(Size, Alignment) {} \
518 }; \
519 StackSlotOfSize##Size##OfAlignment##Alignment##Operator \
520 kStackSlotOfSize##Size##OfAlignment##Alignment;
521 STACK_SLOT_CACHED_SIZES_ALIGNMENTS_LIST(STACKSLOT)
522 #undef STACKSLOT
523
524 #define STORE(Type) \
525 struct Store##Type##Operator : public Operator1<StoreRepresentation> { \
526 explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind) \
527 : Operator1<StoreRepresentation>( \
528 IrOpcode::kStore, \
529 Operator::kNoDeopt | Operator::kNoRead | Operator::kNoThrow, \
530 "Store", 3, 1, 1, 0, 1, 0, \
531 StoreRepresentation(MachineRepresentation::Type, \
532 write_barrier_kind)) {} \
533 }; \
534 struct Store##Type##NoWriteBarrier##Operator final \
535 : public Store##Type##Operator { \
536 Store##Type##NoWriteBarrier##Operator() \
537 : Store##Type##Operator(kNoWriteBarrier) {} \
538 }; \
539 struct Store##Type##MapWriteBarrier##Operator final \
540 : public Store##Type##Operator { \
541 Store##Type##MapWriteBarrier##Operator() \
542 : Store##Type##Operator(kMapWriteBarrier) {} \
543 }; \
544 struct Store##Type##PointerWriteBarrier##Operator final \
545 : public Store##Type##Operator { \
546 Store##Type##PointerWriteBarrier##Operator() \
547 : Store##Type##Operator(kPointerWriteBarrier) {} \
548 }; \
549 struct Store##Type##FullWriteBarrier##Operator final \
550 : public Store##Type##Operator { \
551 Store##Type##FullWriteBarrier##Operator() \
552 : Store##Type##Operator(kFullWriteBarrier) {} \
553 }; \
554 struct UnalignedStore##Type##Operator final \
555 : public Operator1<UnalignedStoreRepresentation> { \
556 UnalignedStore##Type##Operator() \
557 : Operator1<UnalignedStoreRepresentation>( \
558 IrOpcode::kUnalignedStore, \
559 Operator::kNoDeopt | Operator::kNoRead | Operator::kNoThrow, \
560 "UnalignedStore", 3, 1, 1, 0, 1, 0, \
561 MachineRepresentation::Type) {} \
562 }; \
563 struct ProtectedStore##Type##Operator \
564 : public Operator1<StoreRepresentation> { \
565 explicit ProtectedStore##Type##Operator() \
566 : Operator1<StoreRepresentation>( \
567 IrOpcode::kProtectedStore, \
568 Operator::kNoDeopt | Operator::kNoRead | Operator::kNoThrow, \
569 "Store", 3, 1, 1, 0, 1, 0, \
570 StoreRepresentation(MachineRepresentation::Type, \
571 kNoWriteBarrier)) {} \
572 }; \
573 Store##Type##NoWriteBarrier##Operator kStore##Type##NoWriteBarrier; \
574 Store##Type##MapWriteBarrier##Operator kStore##Type##MapWriteBarrier; \
575 Store##Type##PointerWriteBarrier##Operator \
576 kStore##Type##PointerWriteBarrier; \
577 Store##Type##FullWriteBarrier##Operator kStore##Type##FullWriteBarrier; \
578 UnalignedStore##Type##Operator kUnalignedStore##Type; \
579 ProtectedStore##Type##Operator kProtectedStore##Type;
580 MACHINE_REPRESENTATION_LIST(STORE)
581 #undef STORE
582
583 #define ATOMIC_LOAD(Type) \
584 struct Word32AtomicLoad##Type##Operator final \
585 : public Operator1<LoadRepresentation> { \
586 Word32AtomicLoad##Type##Operator() \
587 : Operator1<LoadRepresentation>( \
588 IrOpcode::kWord32AtomicLoad, \
589 Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite, \
590 "Word32AtomicLoad", 2, 1, 1, 1, 1, 0, MachineType::Type()) {} \
591 }; \
592 Word32AtomicLoad##Type##Operator kWord32AtomicLoad##Type;
593 ATOMIC_TYPE_LIST(ATOMIC_LOAD)
594 #undef ATOMIC_LOAD
595
596 #define ATOMIC_LOAD(Type) \
597 struct Word64AtomicLoad##Type##Operator final \
598 : public Operator1<LoadRepresentation> { \
599 Word64AtomicLoad##Type##Operator() \
600 : Operator1<LoadRepresentation>( \
601 IrOpcode::kWord64AtomicLoad, \
602 Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite, \
603 "Word64AtomicLoad", 2, 1, 1, 1, 1, 0, MachineType::Type()) {} \
604 }; \
605 Word64AtomicLoad##Type##Operator kWord64AtomicLoad##Type;
606 ATOMIC_U64_TYPE_LIST(ATOMIC_LOAD)
607 #undef ATOMIC_LOAD
608
609 #define ATOMIC_STORE(Type) \
610 struct Word32AtomicStore##Type##Operator \
611 : public Operator1<MachineRepresentation> { \
612 Word32AtomicStore##Type##Operator() \
613 : Operator1<MachineRepresentation>( \
614 IrOpcode::kWord32AtomicStore, \
615 Operator::kNoDeopt | Operator::kNoRead | Operator::kNoThrow, \
616 "Word32AtomicStore", 3, 1, 1, 0, 1, 0, \
617 MachineRepresentation::Type) {} \
618 }; \
619 Word32AtomicStore##Type##Operator kWord32AtomicStore##Type;
620 ATOMIC_REPRESENTATION_LIST(ATOMIC_STORE)
621 #undef ATOMIC_STORE
622
623 #define ATOMIC_STORE(Type) \
624 struct Word64AtomicStore##Type##Operator \
625 : public Operator1<MachineRepresentation> { \
626 Word64AtomicStore##Type##Operator() \
627 : Operator1<MachineRepresentation>( \
628 IrOpcode::kWord64AtomicStore, \
629 Operator::kNoDeopt | Operator::kNoRead | Operator::kNoThrow, \
630 "Word64AtomicStore", 3, 1, 1, 0, 1, 0, \
631 MachineRepresentation::Type) {} \
632 }; \
633 Word64AtomicStore##Type##Operator kWord64AtomicStore##Type;
634 ATOMIC64_REPRESENTATION_LIST(ATOMIC_STORE)
635 #undef ATOMIC_STORE
636
637 #define ATOMIC_OP(op, type) \
638 struct op##type##Operator : public Operator1<MachineType> { \
639 op##type##Operator() \
640 : Operator1<MachineType>(IrOpcode::k##op, \
641 Operator::kNoDeopt | Operator::kNoThrow, #op, \
642 3, 1, 1, 1, 1, 0, MachineType::type()) {} \
643 }; \
644 op##type##Operator k##op##type;
645 #define ATOMIC_OP_LIST(type) \
646 ATOMIC_OP(Word32AtomicAdd, type) \
647 ATOMIC_OP(Word32AtomicSub, type) \
648 ATOMIC_OP(Word32AtomicAnd, type) \
649 ATOMIC_OP(Word32AtomicOr, type) \
650 ATOMIC_OP(Word32AtomicXor, type) \
651 ATOMIC_OP(Word32AtomicExchange, type)
652 ATOMIC_TYPE_LIST(ATOMIC_OP_LIST)
653 #undef ATOMIC_OP_LIST
654 #define ATOMIC64_OP_LIST(type) \
655 ATOMIC_OP(Word64AtomicAdd, type) \
656 ATOMIC_OP(Word64AtomicSub, type) \
657 ATOMIC_OP(Word64AtomicAnd, type) \
658 ATOMIC_OP(Word64AtomicOr, type) \
659 ATOMIC_OP(Word64AtomicXor, type) \
660 ATOMIC_OP(Word64AtomicExchange, type)
661 ATOMIC_U64_TYPE_LIST(ATOMIC64_OP_LIST)
662 #undef ATOMIC64_OP_LIST
663 #undef ATOMIC_OP
664
665 #define ATOMIC_COMPARE_EXCHANGE(Type) \
666 struct Word32AtomicCompareExchange##Type##Operator \
667 : public Operator1<MachineType> { \
668 Word32AtomicCompareExchange##Type##Operator() \
669 : Operator1<MachineType>(IrOpcode::kWord32AtomicCompareExchange, \
670 Operator::kNoDeopt | Operator::kNoThrow, \
671 "Word32AtomicCompareExchange", 4, 1, 1, 1, 1, \
672 0, MachineType::Type()) {} \
673 }; \
674 Word32AtomicCompareExchange##Type##Operator \
675 kWord32AtomicCompareExchange##Type;
676 ATOMIC_TYPE_LIST(ATOMIC_COMPARE_EXCHANGE)
677 #undef ATOMIC_COMPARE_EXCHANGE
678
679 #define ATOMIC_COMPARE_EXCHANGE(Type) \
680 struct Word64AtomicCompareExchange##Type##Operator \
681 : public Operator1<MachineType> { \
682 Word64AtomicCompareExchange##Type##Operator() \
683 : Operator1<MachineType>(IrOpcode::kWord64AtomicCompareExchange, \
684 Operator::kNoDeopt | Operator::kNoThrow, \
685 "Word64AtomicCompareExchange", 4, 1, 1, 1, 1, \
686 0, MachineType::Type()) {} \
687 }; \
688 Word64AtomicCompareExchange##Type##Operator \
689 kWord64AtomicCompareExchange##Type;
690 ATOMIC_U64_TYPE_LIST(ATOMIC_COMPARE_EXCHANGE)
691 #undef ATOMIC_COMPARE_EXCHANGE
692
693 struct Word32AtomicPairLoadOperator : public Operator {
Word32AtomicPairLoadOperatorv8::internal::compiler::MachineOperatorGlobalCache::Word32AtomicPairLoadOperator694 Word32AtomicPairLoadOperator()
695 : Operator(IrOpcode::kWord32AtomicPairLoad,
696 Operator::kNoDeopt | Operator::kNoThrow,
697 "Word32AtomicPairLoad", 2, 1, 1, 2, 1, 0) {}
698 };
699 Word32AtomicPairLoadOperator kWord32AtomicPairLoad;
700
701 struct Word32AtomicPairStoreOperator : public Operator {
Word32AtomicPairStoreOperatorv8::internal::compiler::MachineOperatorGlobalCache::Word32AtomicPairStoreOperator702 Word32AtomicPairStoreOperator()
703 : Operator(IrOpcode::kWord32AtomicPairStore,
704 Operator::kNoDeopt | Operator::kNoThrow,
705 "Word32AtomicPairStore", 4, 1, 1, 0, 1, 0) {}
706 };
707 Word32AtomicPairStoreOperator kWord32AtomicPairStore;
708
709 #define ATOMIC_PAIR_OP(op) \
710 struct Word32AtomicPair##op##Operator : public Operator { \
711 Word32AtomicPair##op##Operator() \
712 : Operator(IrOpcode::kWord32AtomicPair##op, \
713 Operator::kNoDeopt | Operator::kNoThrow, \
714 "Word32AtomicPair##op", 4, 1, 1, 2, 1, 0) {} \
715 }; \
716 Word32AtomicPair##op##Operator kWord32AtomicPair##op;
717 ATOMIC_PAIR_BINOP_LIST(ATOMIC_PAIR_OP)
718 #undef ATOMIC_PAIR_OP
719 #undef ATOMIC_PAIR_BINOP_LIST
720
721 #define ATOMIC64_NARROW_OP(op, type) \
722 struct op##type##Operator : public Operator1<MachineType> { \
723 op##type##Operator() \
724 : Operator1<MachineType>( \
725 IrOpcode::k##op, Operator::kNoDeopt | Operator::kNoThrow, "#op", \
726 3, 1, 1, 2, 1, 0, MachineType::type()) {} \
727 }; \
728 op##type##Operator k##op##type;
729 #define ATOMIC_OP_LIST(type) \
730 ATOMIC64_NARROW_OP(Word64AtomicNarrowAdd, type) \
731 ATOMIC64_NARROW_OP(Word64AtomicNarrowSub, type) \
732 ATOMIC64_NARROW_OP(Word64AtomicNarrowAnd, type) \
733 ATOMIC64_NARROW_OP(Word64AtomicNarrowOr, type) \
734 ATOMIC64_NARROW_OP(Word64AtomicNarrowXor, type) \
735 ATOMIC64_NARROW_OP(Word64AtomicNarrowExchange, type)
736 ATOMIC_U32_TYPE_LIST(ATOMIC_OP_LIST)
737 #undef ATOMIC_OP_LIST
738 #undef ATOMIC64_NARROW_OP
739
740 struct Word32AtomicPairCompareExchangeOperator : public Operator {
Word32AtomicPairCompareExchangeOperatorv8::internal::compiler::MachineOperatorGlobalCache::Word32AtomicPairCompareExchangeOperator741 Word32AtomicPairCompareExchangeOperator()
742 : Operator(IrOpcode::kWord32AtomicPairCompareExchange,
743 Operator::kNoDeopt | Operator::kNoThrow,
744 "Word32AtomicPairCompareExchange", 6, 1, 1, 2, 1, 0) {}
745 };
746 Word32AtomicPairCompareExchangeOperator kWord32AtomicPairCompareExchange;
747
748 #define ATOMIC_COMPARE_EXCHANGE(Type) \
749 struct Word64AtomicNarrowCompareExchange##Type##Operator \
750 : public Operator1<MachineType> { \
751 Word64AtomicNarrowCompareExchange##Type##Operator() \
752 : Operator1<MachineType>(IrOpcode::kWord64AtomicNarrowCompareExchange, \
753 Operator::kNoDeopt | Operator::kNoThrow, \
754 "Word64AtomicNarrowCompareExchange", 4, 1, 1, \
755 2, 1, 0, MachineType::Type()) {} \
756 }; \
757 Word64AtomicNarrowCompareExchange##Type##Operator \
758 kWord64AtomicNarrowCompareExchange##Type;
759 ATOMIC_TYPE_LIST(ATOMIC_COMPARE_EXCHANGE)
760 #undef ATOMIC_COMPARE_EXCHANGE
761
762 // The {BitcastWordToTagged} operator must not be marked as pure (especially
763 // not idempotent), because otherwise the splitting logic in the Scheduler
764 // might decide to split these operators, thus potentially creating live
765 // ranges of allocation top across calls or other things that might allocate.
766 // See https://bugs.chromium.org/p/v8/issues/detail?id=6059 for more details.
767 struct BitcastWordToTaggedOperator : public Operator {
BitcastWordToTaggedOperatorv8::internal::compiler::MachineOperatorGlobalCache::BitcastWordToTaggedOperator768 BitcastWordToTaggedOperator()
769 : Operator(IrOpcode::kBitcastWordToTagged,
770 Operator::kEliminatable | Operator::kNoWrite,
771 "BitcastWordToTagged", 1, 1, 1, 1, 1, 0) {}
772 };
773 BitcastWordToTaggedOperator kBitcastWordToTagged;
774
775 struct BitcastTaggedToWordOperator : public Operator {
BitcastTaggedToWordOperatorv8::internal::compiler::MachineOperatorGlobalCache::BitcastTaggedToWordOperator776 BitcastTaggedToWordOperator()
777 : Operator(IrOpcode::kBitcastTaggedToWord,
778 Operator::kEliminatable | Operator::kNoWrite,
779 "BitcastTaggedToWord", 1, 1, 1, 1, 1, 0) {}
780 };
781 BitcastTaggedToWordOperator kBitcastTaggedToWord;
782
783 struct BitcastMaybeObjectToWordOperator : public Operator {
BitcastMaybeObjectToWordOperatorv8::internal::compiler::MachineOperatorGlobalCache::BitcastMaybeObjectToWordOperator784 BitcastMaybeObjectToWordOperator()
785 : Operator(IrOpcode::kBitcastTaggedToWord,
786 Operator::kEliminatable | Operator::kNoWrite,
787 "BitcastMaybeObjectToWord", 1, 1, 1, 1, 1, 0) {}
788 };
789 BitcastMaybeObjectToWordOperator kBitcastMaybeObjectToWord;
790
791 struct TaggedPoisonOnSpeculation : public Operator {
TaggedPoisonOnSpeculationv8::internal::compiler::MachineOperatorGlobalCache::TaggedPoisonOnSpeculation792 TaggedPoisonOnSpeculation()
793 : Operator(IrOpcode::kTaggedPoisonOnSpeculation,
794 Operator::kEliminatable | Operator::kNoWrite,
795 "TaggedPoisonOnSpeculation", 1, 1, 1, 1, 1, 0) {}
796 };
797 TaggedPoisonOnSpeculation kTaggedPoisonOnSpeculation;
798
799 struct Word32PoisonOnSpeculation : public Operator {
Word32PoisonOnSpeculationv8::internal::compiler::MachineOperatorGlobalCache::Word32PoisonOnSpeculation800 Word32PoisonOnSpeculation()
801 : Operator(IrOpcode::kWord32PoisonOnSpeculation,
802 Operator::kEliminatable | Operator::kNoWrite,
803 "Word32PoisonOnSpeculation", 1, 1, 1, 1, 1, 0) {}
804 };
805 Word32PoisonOnSpeculation kWord32PoisonOnSpeculation;
806
807 struct Word64PoisonOnSpeculation : public Operator {
Word64PoisonOnSpeculationv8::internal::compiler::MachineOperatorGlobalCache::Word64PoisonOnSpeculation808 Word64PoisonOnSpeculation()
809 : Operator(IrOpcode::kWord64PoisonOnSpeculation,
810 Operator::kEliminatable | Operator::kNoWrite,
811 "Word64PoisonOnSpeculation", 1, 1, 1, 1, 1, 0) {}
812 };
813 Word64PoisonOnSpeculation kWord64PoisonOnSpeculation;
814
815 struct SpeculationFenceOperator : public Operator {
SpeculationFenceOperatorv8::internal::compiler::MachineOperatorGlobalCache::SpeculationFenceOperator816 SpeculationFenceOperator()
817 : Operator(IrOpcode::kSpeculationFence, Operator::kNoThrow,
818 "SpeculationFence", 0, 1, 1, 0, 1, 0) {}
819 };
820 SpeculationFenceOperator kSpeculationFence;
821
822 struct DebugAbortOperator : public Operator {
DebugAbortOperatorv8::internal::compiler::MachineOperatorGlobalCache::DebugAbortOperator823 DebugAbortOperator()
824 : Operator(IrOpcode::kDebugAbort, Operator::kNoThrow, "DebugAbort", 1,
825 1, 1, 0, 1, 0) {}
826 };
827 DebugAbortOperator kDebugAbort;
828
829 struct DebugBreakOperator : public Operator {
DebugBreakOperatorv8::internal::compiler::MachineOperatorGlobalCache::DebugBreakOperator830 DebugBreakOperator()
831 : Operator(IrOpcode::kDebugBreak, Operator::kNoThrow, "DebugBreak", 0,
832 1, 1, 0, 1, 0) {}
833 };
834 DebugBreakOperator kDebugBreak;
835
836 struct UnsafePointerAddOperator final : public Operator {
UnsafePointerAddOperatorv8::internal::compiler::MachineOperatorGlobalCache::UnsafePointerAddOperator837 UnsafePointerAddOperator()
838 : Operator(IrOpcode::kUnsafePointerAdd, Operator::kKontrol,
839 "UnsafePointerAdd", 2, 1, 1, 1, 1, 0) {}
840 };
841 UnsafePointerAddOperator kUnsafePointerAdd;
842 };
843
844 struct CommentOperator : public Operator1<const char*> {
CommentOperatorv8::internal::compiler::CommentOperator845 explicit CommentOperator(const char* msg)
846 : Operator1<const char*>(IrOpcode::kComment, Operator::kNoThrow,
847 "Comment", 0, 0, 0, 0, 0, 0, msg) {}
848 };
849
850 static base::LazyInstance<MachineOperatorGlobalCache>::type
851 kMachineOperatorGlobalCache = LAZY_INSTANCE_INITIALIZER;
852
MachineOperatorBuilder(Zone * zone,MachineRepresentation word,Flags flags,AlignmentRequirements alignmentRequirements)853 MachineOperatorBuilder::MachineOperatorBuilder(
854 Zone* zone, MachineRepresentation word, Flags flags,
855 AlignmentRequirements alignmentRequirements)
856 : zone_(zone),
857 cache_(kMachineOperatorGlobalCache.Get()),
858 word_(word),
859 flags_(flags),
860 alignment_requirements_(alignmentRequirements) {
861 DCHECK(word == MachineRepresentation::kWord32 ||
862 word == MachineRepresentation::kWord64);
863 }
864
UnalignedLoad(LoadRepresentation rep)865 const Operator* MachineOperatorBuilder::UnalignedLoad(LoadRepresentation rep) {
866 #define LOAD(Type) \
867 if (rep == MachineType::Type()) { \
868 return &cache_.kUnalignedLoad##Type; \
869 }
870 MACHINE_TYPE_LIST(LOAD)
871 #undef LOAD
872 UNREACHABLE();
873 }
874
UnalignedStore(UnalignedStoreRepresentation rep)875 const Operator* MachineOperatorBuilder::UnalignedStore(
876 UnalignedStoreRepresentation rep) {
877 switch (rep) {
878 #define STORE(kRep) \
879 case MachineRepresentation::kRep: \
880 return &cache_.kUnalignedStore##kRep;
881 MACHINE_REPRESENTATION_LIST(STORE)
882 #undef STORE
883 case MachineRepresentation::kBit:
884 case MachineRepresentation::kNone:
885 break;
886 }
887 UNREACHABLE();
888 }
889
890 #define PURE(Name, properties, value_input_count, control_input_count, \
891 output_count) \
892 const Operator* MachineOperatorBuilder::Name() { return &cache_.k##Name; }
893 MACHINE_PURE_OP_LIST(PURE)
894 #undef PURE
895
896 #define PURE(Name, properties, value_input_count, control_input_count, \
897 output_count) \
898 const OptionalOperator MachineOperatorBuilder::Name() { \
899 return OptionalOperator(flags_ & k##Name, &cache_.k##Name); \
900 }
PURE_OPTIONAL_OP_LIST(PURE)901 PURE_OPTIONAL_OP_LIST(PURE)
902 #undef PURE
903
904 #define OVERFLOW_OP(Name, properties) \
905 const Operator* MachineOperatorBuilder::Name() { return &cache_.k##Name; }
906 OVERFLOW_OP_LIST(OVERFLOW_OP)
907 #undef OVERFLOW_OP
908
909 const Operator* MachineOperatorBuilder::Load(LoadRepresentation rep) {
910 #define LOAD(Type) \
911 if (rep == MachineType::Type()) { \
912 return &cache_.kLoad##Type; \
913 }
914 MACHINE_TYPE_LIST(LOAD)
915 #undef LOAD
916 UNREACHABLE();
917 }
918
PoisonedLoad(LoadRepresentation rep)919 const Operator* MachineOperatorBuilder::PoisonedLoad(LoadRepresentation rep) {
920 #define LOAD(Type) \
921 if (rep == MachineType::Type()) { \
922 return &cache_.kPoisonedLoad##Type; \
923 }
924 MACHINE_TYPE_LIST(LOAD)
925 #undef LOAD
926 UNREACHABLE();
927 }
928
ProtectedLoad(LoadRepresentation rep)929 const Operator* MachineOperatorBuilder::ProtectedLoad(LoadRepresentation rep) {
930 #define LOAD(Type) \
931 if (rep == MachineType::Type()) { \
932 return &cache_.kProtectedLoad##Type; \
933 }
934 MACHINE_TYPE_LIST(LOAD)
935 #undef LOAD
936 UNREACHABLE();
937 }
938
StackSlot(int size,int alignment)939 const Operator* MachineOperatorBuilder::StackSlot(int size, int alignment) {
940 DCHECK_LE(0, size);
941 DCHECK(alignment == 0 || alignment == 4 || alignment == 8 || alignment == 16);
942 #define CASE_CACHED_SIZE(Size, Alignment) \
943 if (size == Size && alignment == Alignment) { \
944 return &cache_.kStackSlotOfSize##Size##OfAlignment##Alignment; \
945 }
946
947 STACK_SLOT_CACHED_SIZES_ALIGNMENTS_LIST(CASE_CACHED_SIZE)
948
949 #undef CASE_CACHED_SIZE
950 return new (zone_) StackSlotOperator(size, alignment);
951 }
952
StackSlot(MachineRepresentation rep,int alignment)953 const Operator* MachineOperatorBuilder::StackSlot(MachineRepresentation rep,
954 int alignment) {
955 return StackSlot(1 << ElementSizeLog2Of(rep), alignment);
956 }
957
Store(StoreRepresentation store_rep)958 const Operator* MachineOperatorBuilder::Store(StoreRepresentation store_rep) {
959 switch (store_rep.representation()) {
960 #define STORE(kRep) \
961 case MachineRepresentation::kRep: \
962 switch (store_rep.write_barrier_kind()) { \
963 case kNoWriteBarrier: \
964 return &cache_.k##Store##kRep##NoWriteBarrier; \
965 case kMapWriteBarrier: \
966 return &cache_.k##Store##kRep##MapWriteBarrier; \
967 case kPointerWriteBarrier: \
968 return &cache_.k##Store##kRep##PointerWriteBarrier; \
969 case kFullWriteBarrier: \
970 return &cache_.k##Store##kRep##FullWriteBarrier; \
971 } \
972 break;
973 MACHINE_REPRESENTATION_LIST(STORE)
974 #undef STORE
975 case MachineRepresentation::kBit:
976 case MachineRepresentation::kNone:
977 break;
978 }
979 UNREACHABLE();
980 }
981
ProtectedStore(MachineRepresentation rep)982 const Operator* MachineOperatorBuilder::ProtectedStore(
983 MachineRepresentation rep) {
984 switch (rep) {
985 #define STORE(kRep) \
986 case MachineRepresentation::kRep: \
987 return &cache_.kProtectedStore##kRep; \
988 break;
989 MACHINE_REPRESENTATION_LIST(STORE)
990 #undef STORE
991 case MachineRepresentation::kBit:
992 case MachineRepresentation::kNone:
993 break;
994 }
995 UNREACHABLE();
996 }
997
UnsafePointerAdd()998 const Operator* MachineOperatorBuilder::UnsafePointerAdd() {
999 return &cache_.kUnsafePointerAdd;
1000 }
1001
BitcastWordToTagged()1002 const Operator* MachineOperatorBuilder::BitcastWordToTagged() {
1003 return &cache_.kBitcastWordToTagged;
1004 }
1005
BitcastTaggedToWord()1006 const Operator* MachineOperatorBuilder::BitcastTaggedToWord() {
1007 return &cache_.kBitcastTaggedToWord;
1008 }
1009
BitcastMaybeObjectToWord()1010 const Operator* MachineOperatorBuilder::BitcastMaybeObjectToWord() {
1011 return &cache_.kBitcastMaybeObjectToWord;
1012 }
1013
DebugAbort()1014 const Operator* MachineOperatorBuilder::DebugAbort() {
1015 return &cache_.kDebugAbort;
1016 }
1017
DebugBreak()1018 const Operator* MachineOperatorBuilder::DebugBreak() {
1019 return &cache_.kDebugBreak;
1020 }
1021
Comment(const char * msg)1022 const Operator* MachineOperatorBuilder::Comment(const char* msg) {
1023 return new (zone_) CommentOperator(msg);
1024 }
1025
Word32AtomicLoad(LoadRepresentation rep)1026 const Operator* MachineOperatorBuilder::Word32AtomicLoad(
1027 LoadRepresentation rep) {
1028 #define LOAD(Type) \
1029 if (rep == MachineType::Type()) { \
1030 return &cache_.kWord32AtomicLoad##Type; \
1031 }
1032 ATOMIC_TYPE_LIST(LOAD)
1033 #undef LOAD
1034 UNREACHABLE();
1035 }
1036
Word32AtomicStore(MachineRepresentation rep)1037 const Operator* MachineOperatorBuilder::Word32AtomicStore(
1038 MachineRepresentation rep) {
1039 #define STORE(kRep) \
1040 if (rep == MachineRepresentation::kRep) { \
1041 return &cache_.kWord32AtomicStore##kRep; \
1042 }
1043 ATOMIC_REPRESENTATION_LIST(STORE)
1044 #undef STORE
1045 UNREACHABLE();
1046 }
1047
Word32AtomicExchange(MachineType type)1048 const Operator* MachineOperatorBuilder::Word32AtomicExchange(MachineType type) {
1049 #define EXCHANGE(kType) \
1050 if (type == MachineType::kType()) { \
1051 return &cache_.kWord32AtomicExchange##kType; \
1052 }
1053 ATOMIC_TYPE_LIST(EXCHANGE)
1054 #undef EXCHANGE
1055 UNREACHABLE();
1056 }
1057
Word32AtomicCompareExchange(MachineType type)1058 const Operator* MachineOperatorBuilder::Word32AtomicCompareExchange(
1059 MachineType type) {
1060 #define COMPARE_EXCHANGE(kType) \
1061 if (type == MachineType::kType()) { \
1062 return &cache_.kWord32AtomicCompareExchange##kType; \
1063 }
1064 ATOMIC_TYPE_LIST(COMPARE_EXCHANGE)
1065 #undef COMPARE_EXCHANGE
1066 UNREACHABLE();
1067 }
1068
Word32AtomicAdd(MachineType type)1069 const Operator* MachineOperatorBuilder::Word32AtomicAdd(MachineType type) {
1070 #define ADD(kType) \
1071 if (type == MachineType::kType()) { \
1072 return &cache_.kWord32AtomicAdd##kType; \
1073 }
1074 ATOMIC_TYPE_LIST(ADD)
1075 #undef ADD
1076 UNREACHABLE();
1077 }
1078
Word32AtomicSub(MachineType type)1079 const Operator* MachineOperatorBuilder::Word32AtomicSub(MachineType type) {
1080 #define SUB(kType) \
1081 if (type == MachineType::kType()) { \
1082 return &cache_.kWord32AtomicSub##kType; \
1083 }
1084 ATOMIC_TYPE_LIST(SUB)
1085 #undef SUB
1086 UNREACHABLE();
1087 }
1088
Word32AtomicAnd(MachineType type)1089 const Operator* MachineOperatorBuilder::Word32AtomicAnd(MachineType type) {
1090 #define AND(kType) \
1091 if (type == MachineType::kType()) { \
1092 return &cache_.kWord32AtomicAnd##kType; \
1093 }
1094 ATOMIC_TYPE_LIST(AND)
1095 #undef AND
1096 UNREACHABLE();
1097 }
1098
Word32AtomicOr(MachineType type)1099 const Operator* MachineOperatorBuilder::Word32AtomicOr(MachineType type) {
1100 #define OR(kType) \
1101 if (type == MachineType::kType()) { \
1102 return &cache_.kWord32AtomicOr##kType; \
1103 }
1104 ATOMIC_TYPE_LIST(OR)
1105 #undef OR
1106 UNREACHABLE();
1107 }
1108
Word32AtomicXor(MachineType type)1109 const Operator* MachineOperatorBuilder::Word32AtomicXor(MachineType type) {
1110 #define XOR(kType) \
1111 if (type == MachineType::kType()) { \
1112 return &cache_.kWord32AtomicXor##kType; \
1113 }
1114 ATOMIC_TYPE_LIST(XOR)
1115 #undef XOR
1116 UNREACHABLE();
1117 }
1118
Word64AtomicLoad(LoadRepresentation rep)1119 const Operator* MachineOperatorBuilder::Word64AtomicLoad(
1120 LoadRepresentation rep) {
1121 #define LOAD(Type) \
1122 if (rep == MachineType::Type()) { \
1123 return &cache_.kWord64AtomicLoad##Type; \
1124 }
1125 ATOMIC_U64_TYPE_LIST(LOAD)
1126 #undef LOAD
1127 UNREACHABLE();
1128 }
1129
Word64AtomicStore(MachineRepresentation rep)1130 const Operator* MachineOperatorBuilder::Word64AtomicStore(
1131 MachineRepresentation rep) {
1132 #define STORE(kRep) \
1133 if (rep == MachineRepresentation::kRep) { \
1134 return &cache_.kWord64AtomicStore##kRep; \
1135 }
1136 ATOMIC64_REPRESENTATION_LIST(STORE)
1137 #undef STORE
1138 UNREACHABLE();
1139 }
1140
Word64AtomicAdd(MachineType type)1141 const Operator* MachineOperatorBuilder::Word64AtomicAdd(MachineType type) {
1142 #define ADD(kType) \
1143 if (type == MachineType::kType()) { \
1144 return &cache_.kWord64AtomicAdd##kType; \
1145 }
1146 ATOMIC_U64_TYPE_LIST(ADD)
1147 #undef ADD
1148 UNREACHABLE();
1149 }
1150
Word64AtomicSub(MachineType type)1151 const Operator* MachineOperatorBuilder::Word64AtomicSub(MachineType type) {
1152 #define SUB(kType) \
1153 if (type == MachineType::kType()) { \
1154 return &cache_.kWord64AtomicSub##kType; \
1155 }
1156 ATOMIC_U64_TYPE_LIST(SUB)
1157 #undef SUB
1158 UNREACHABLE();
1159 }
1160
Word64AtomicAnd(MachineType type)1161 const Operator* MachineOperatorBuilder::Word64AtomicAnd(MachineType type) {
1162 #define AND(kType) \
1163 if (type == MachineType::kType()) { \
1164 return &cache_.kWord64AtomicAnd##kType; \
1165 }
1166 ATOMIC_U64_TYPE_LIST(AND)
1167 #undef AND
1168 UNREACHABLE();
1169 }
1170
Word64AtomicOr(MachineType type)1171 const Operator* MachineOperatorBuilder::Word64AtomicOr(MachineType type) {
1172 #define OR(kType) \
1173 if (type == MachineType::kType()) { \
1174 return &cache_.kWord64AtomicOr##kType; \
1175 }
1176 ATOMIC_U64_TYPE_LIST(OR)
1177 #undef OR
1178 UNREACHABLE();
1179 }
1180
Word64AtomicXor(MachineType type)1181 const Operator* MachineOperatorBuilder::Word64AtomicXor(MachineType type) {
1182 #define XOR(kType) \
1183 if (type == MachineType::kType()) { \
1184 return &cache_.kWord64AtomicXor##kType; \
1185 }
1186 ATOMIC_U64_TYPE_LIST(XOR)
1187 #undef XOR
1188 UNREACHABLE();
1189 }
1190
Word64AtomicExchange(MachineType type)1191 const Operator* MachineOperatorBuilder::Word64AtomicExchange(MachineType type) {
1192 #define EXCHANGE(kType) \
1193 if (type == MachineType::kType()) { \
1194 return &cache_.kWord64AtomicExchange##kType; \
1195 }
1196 ATOMIC_U64_TYPE_LIST(EXCHANGE)
1197 #undef EXCHANGE
1198 UNREACHABLE();
1199 }
1200
Word64AtomicCompareExchange(MachineType type)1201 const Operator* MachineOperatorBuilder::Word64AtomicCompareExchange(
1202 MachineType type) {
1203 #define COMPARE_EXCHANGE(kType) \
1204 if (type == MachineType::kType()) { \
1205 return &cache_.kWord64AtomicCompareExchange##kType; \
1206 }
1207 ATOMIC_U64_TYPE_LIST(COMPARE_EXCHANGE)
1208 #undef COMPARE_EXCHANGE
1209 UNREACHABLE();
1210 }
1211
Word32AtomicPairLoad()1212 const Operator* MachineOperatorBuilder::Word32AtomicPairLoad() {
1213 return &cache_.kWord32AtomicPairLoad;
1214 }
1215
Word32AtomicPairStore()1216 const Operator* MachineOperatorBuilder::Word32AtomicPairStore() {
1217 return &cache_.kWord32AtomicPairStore;
1218 }
1219
Word32AtomicPairAdd()1220 const Operator* MachineOperatorBuilder::Word32AtomicPairAdd() {
1221 return &cache_.kWord32AtomicPairAdd;
1222 }
1223
Word32AtomicPairSub()1224 const Operator* MachineOperatorBuilder::Word32AtomicPairSub() {
1225 return &cache_.kWord32AtomicPairSub;
1226 }
1227
Word32AtomicPairAnd()1228 const Operator* MachineOperatorBuilder::Word32AtomicPairAnd() {
1229 return &cache_.kWord32AtomicPairAnd;
1230 }
1231
Word32AtomicPairOr()1232 const Operator* MachineOperatorBuilder::Word32AtomicPairOr() {
1233 return &cache_.kWord32AtomicPairOr;
1234 }
1235
Word32AtomicPairXor()1236 const Operator* MachineOperatorBuilder::Word32AtomicPairXor() {
1237 return &cache_.kWord32AtomicPairXor;
1238 }
1239
Word32AtomicPairExchange()1240 const Operator* MachineOperatorBuilder::Word32AtomicPairExchange() {
1241 return &cache_.kWord32AtomicPairExchange;
1242 }
1243
Word32AtomicPairCompareExchange()1244 const Operator* MachineOperatorBuilder::Word32AtomicPairCompareExchange() {
1245 return &cache_.kWord32AtomicPairCompareExchange;
1246 }
1247
Word64AtomicNarrowAdd(MachineType type)1248 const Operator* MachineOperatorBuilder::Word64AtomicNarrowAdd(
1249 MachineType type) {
1250 #define ADD(kType) \
1251 if (type == MachineType::kType()) { \
1252 return &cache_.kWord64AtomicNarrowAdd##kType; \
1253 }
1254 ATOMIC_U32_TYPE_LIST(ADD)
1255 #undef ADD
1256 UNREACHABLE();
1257 }
1258
Word64AtomicNarrowSub(MachineType type)1259 const Operator* MachineOperatorBuilder::Word64AtomicNarrowSub(
1260 MachineType type) {
1261 #define SUB(kType) \
1262 if (type == MachineType::kType()) { \
1263 return &cache_.kWord64AtomicNarrowSub##kType; \
1264 }
1265 ATOMIC_U32_TYPE_LIST(SUB)
1266 #undef SUB
1267 UNREACHABLE();
1268 }
1269
Word64AtomicNarrowAnd(MachineType type)1270 const Operator* MachineOperatorBuilder::Word64AtomicNarrowAnd(
1271 MachineType type) {
1272 #define AND(kType) \
1273 if (type == MachineType::kType()) { \
1274 return &cache_.kWord64AtomicNarrowAnd##kType; \
1275 }
1276 ATOMIC_U32_TYPE_LIST(AND)
1277 #undef AND
1278 UNREACHABLE();
1279 }
1280
Word64AtomicNarrowOr(MachineType type)1281 const Operator* MachineOperatorBuilder::Word64AtomicNarrowOr(MachineType type) {
1282 #define OR(kType) \
1283 if (type == MachineType::kType()) { \
1284 return &cache_.kWord64AtomicNarrowOr##kType; \
1285 }
1286 ATOMIC_U32_TYPE_LIST(OR)
1287 #undef OR
1288 UNREACHABLE();
1289 }
1290
Word64AtomicNarrowXor(MachineType type)1291 const Operator* MachineOperatorBuilder::Word64AtomicNarrowXor(
1292 MachineType type) {
1293 #define XOR(kType) \
1294 if (type == MachineType::kType()) { \
1295 return &cache_.kWord64AtomicNarrowXor##kType; \
1296 }
1297 ATOMIC_U32_TYPE_LIST(XOR)
1298 #undef XOR
1299 UNREACHABLE();
1300 }
1301
Word64AtomicNarrowExchange(MachineType type)1302 const Operator* MachineOperatorBuilder::Word64AtomicNarrowExchange(
1303 MachineType type) {
1304 #define EXCHANGE(kType) \
1305 if (type == MachineType::kType()) { \
1306 return &cache_.kWord64AtomicNarrowExchange##kType; \
1307 }
1308 ATOMIC_U32_TYPE_LIST(EXCHANGE)
1309 #undef EXCHANGE
1310 UNREACHABLE();
1311 }
1312
Word64AtomicNarrowCompareExchange(MachineType type)1313 const Operator* MachineOperatorBuilder::Word64AtomicNarrowCompareExchange(
1314 MachineType type) {
1315 #define CMP_EXCHANGE(kType) \
1316 if (type == MachineType::kType()) { \
1317 return &cache_.kWord64AtomicNarrowCompareExchange##kType; \
1318 }
1319 ATOMIC_U32_TYPE_LIST(CMP_EXCHANGE)
1320 #undef CMP_EXCHANGE
1321 UNREACHABLE();
1322 }
1323
TaggedPoisonOnSpeculation()1324 const Operator* MachineOperatorBuilder::TaggedPoisonOnSpeculation() {
1325 return &cache_.kTaggedPoisonOnSpeculation;
1326 }
1327
Word32PoisonOnSpeculation()1328 const Operator* MachineOperatorBuilder::Word32PoisonOnSpeculation() {
1329 return &cache_.kWord32PoisonOnSpeculation;
1330 }
1331
Word64PoisonOnSpeculation()1332 const Operator* MachineOperatorBuilder::Word64PoisonOnSpeculation() {
1333 return &cache_.kWord64PoisonOnSpeculation;
1334 }
1335
SpeculationFence()1336 const OptionalOperator MachineOperatorBuilder::SpeculationFence() {
1337 return OptionalOperator(flags_ & kSpeculationFence,
1338 &cache_.kSpeculationFence);
1339 }
1340
1341 #define SIMD_LANE_OPS(Type, lane_count) \
1342 const Operator* MachineOperatorBuilder::Type##ExtractLane( \
1343 int32_t lane_index) { \
1344 DCHECK(0 <= lane_index && lane_index < lane_count); \
1345 return new (zone_) \
1346 Operator1<int32_t>(IrOpcode::k##Type##ExtractLane, Operator::kPure, \
1347 "Extract lane", 1, 0, 0, 1, 0, 0, lane_index); \
1348 } \
1349 const Operator* MachineOperatorBuilder::Type##ReplaceLane( \
1350 int32_t lane_index) { \
1351 DCHECK(0 <= lane_index && lane_index < lane_count); \
1352 return new (zone_) \
1353 Operator1<int32_t>(IrOpcode::k##Type##ReplaceLane, Operator::kPure, \
1354 "Replace lane", 2, 0, 0, 1, 0, 0, lane_index); \
1355 }
1356 SIMD_LANE_OP_LIST(SIMD_LANE_OPS)
1357 #undef SIMD_LANE_OPS
1358
1359 #define SIMD_SHIFT_OPS(format, bits) \
1360 const Operator* MachineOperatorBuilder::I##format##Shl(int32_t shift) { \
1361 DCHECK(0 <= shift && shift < bits); \
1362 return new (zone_) \
1363 Operator1<int32_t>(IrOpcode::kI##format##Shl, Operator::kPure, \
1364 "Shift left", 1, 0, 0, 1, 0, 0, shift); \
1365 } \
1366 const Operator* MachineOperatorBuilder::I##format##ShrS(int32_t shift) { \
1367 DCHECK(0 < shift && shift <= bits); \
1368 return new (zone_) \
1369 Operator1<int32_t>(IrOpcode::kI##format##ShrS, Operator::kPure, \
1370 "Arithmetic shift right", 1, 0, 0, 1, 0, 0, shift); \
1371 } \
1372 const Operator* MachineOperatorBuilder::I##format##ShrU(int32_t shift) { \
1373 DCHECK(0 <= shift && shift < bits); \
1374 return new (zone_) \
1375 Operator1<int32_t>(IrOpcode::kI##format##ShrU, Operator::kPure, \
1376 "Shift right", 1, 0, 0, 1, 0, 0, shift); \
1377 }
SIMD_FORMAT_LIST(SIMD_SHIFT_OPS) const1378 SIMD_FORMAT_LIST(SIMD_SHIFT_OPS)
1379 #undef SIMD_SHIFT_OPS
1380
1381 const Operator* MachineOperatorBuilder::S8x16Shuffle(
1382 const uint8_t shuffle[16]) {
1383 uint8_t* array = zone_->NewArray<uint8_t>(16);
1384 memcpy(array, shuffle, 16);
1385 return new (zone_)
1386 Operator1<uint8_t*>(IrOpcode::kS8x16Shuffle, Operator::kPure, "Shuffle",
1387 2, 0, 0, 1, 0, 0, array);
1388 }
1389
1390 #undef PURE_BINARY_OP_LIST_32
1391 #undef PURE_BINARY_OP_LIST_64
1392 #undef MACHINE_PURE_OP_LIST
1393 #undef PURE_OPTIONAL_OP_LIST
1394 #undef OVERFLOW_OP_LIST
1395 #undef MACHINE_TYPE_LIST
1396 #undef MACHINE_REPRESENTATION_LIST
1397 #undef ATOMIC_TYPE_LIST
1398 #undef ATOMIC_U64_TYPE_LIST
1399 #undef ATOMIC_U32_TYPE_LIST
1400 #undef ATOMIC_REPRESENTATION_LIST
1401 #undef ATOMIC64_REPRESENTATION_LIST
1402 #undef SIMD_LANE_OP_LIST
1403 #undef SIMD_FORMAT_LIST
1404 #undef STACK_SLOT_CACHED_SIZES_ALIGNMENTS_LIST
1405
1406 } // namespace compiler
1407 } // namespace internal
1408 } // namespace v8
1409