blob: ce5087c7c2040156711b62a59120f840c67c73e3 [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_OPCODES_H_
6#define V8_COMPILER_OPCODES_H_
7
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00008#include <iosfwd>
Ben Murdochb8a8cc12014-11-26 15:28:44 +00009
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000010// Opcodes for control operators.
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011#define CONTROL_OP_LIST(V) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000012 V(Start) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000013 V(Loop) \
14 V(Branch) \
15 V(Switch) \
16 V(IfTrue) \
17 V(IfFalse) \
18 V(IfSuccess) \
19 V(IfException) \
20 V(IfValue) \
21 V(IfDefault) \
22 V(Merge) \
23 V(Deoptimize) \
Ben Murdochda12d292016-06-02 14:46:10 +010024 V(DeoptimizeIf) \
25 V(DeoptimizeUnless) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000026 V(Return) \
27 V(TailCall) \
28 V(Terminate) \
29 V(OsrNormalEntry) \
30 V(OsrLoopEntry) \
31 V(Throw) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000032 V(End)
33
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000034// Opcodes for constant operators.
Ben Murdochc5610432016-08-08 18:44:38 +010035#define CONSTANT_OP_LIST(V) \
36 V(Int32Constant) \
37 V(Int64Constant) \
38 V(Float32Constant) \
39 V(Float64Constant) \
40 V(ExternalConstant) \
41 V(NumberConstant) \
42 V(HeapConstant) \
43 V(RelocatableInt32Constant) \
44 V(RelocatableInt64Constant)
Ben Murdochb8a8cc12014-11-26 15:28:44 +000045
46#define INNER_OP_LIST(V) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -040047 V(Select) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000048 V(Phi) \
49 V(EffectPhi) \
Ben Murdochc5610432016-08-08 18:44:38 +010050 V(CheckPoint) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000051 V(BeginRegion) \
52 V(FinishRegion) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000053 V(FrameState) \
54 V(StateValues) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000055 V(TypedStateValues) \
56 V(ObjectState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057 V(Call) \
58 V(Parameter) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000059 V(OsrValue) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000060 V(Projection)
61
62#define COMMON_OP_LIST(V) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000063 CONSTANT_OP_LIST(V) \
64 INNER_OP_LIST(V) \
65 V(Dead)
Ben Murdochb8a8cc12014-11-26 15:28:44 +000066
67// Opcodes for JavaScript operators.
68#define JS_COMPARE_BINOP_LIST(V) \
69 V(JSEqual) \
70 V(JSNotEqual) \
71 V(JSStrictEqual) \
72 V(JSStrictNotEqual) \
73 V(JSLessThan) \
74 V(JSGreaterThan) \
75 V(JSLessThanOrEqual) \
76 V(JSGreaterThanOrEqual)
77
78#define JS_BITWISE_BINOP_LIST(V) \
79 V(JSBitwiseOr) \
80 V(JSBitwiseXor) \
81 V(JSBitwiseAnd) \
82 V(JSShiftLeft) \
83 V(JSShiftRight) \
84 V(JSShiftRightLogical)
85
86#define JS_ARITH_BINOP_LIST(V) \
87 V(JSAdd) \
88 V(JSSubtract) \
89 V(JSMultiply) \
90 V(JSDivide) \
91 V(JSModulus)
92
93#define JS_SIMPLE_BINOP_LIST(V) \
94 JS_COMPARE_BINOP_LIST(V) \
95 JS_BITWISE_BINOP_LIST(V) \
96 JS_ARITH_BINOP_LIST(V)
97
Ben Murdochb8a8cc12014-11-26 15:28:44 +000098#define JS_CONVERSION_UNOP_LIST(V) \
99 V(JSToBoolean) \
Ben Murdochda12d292016-06-02 14:46:10 +0100100 V(JSToInteger) \
101 V(JSToLength) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000102 V(JSToName) \
Ben Murdochda12d292016-06-02 14:46:10 +0100103 V(JSToNumber) \
104 V(JSToObject) \
105 V(JSToString)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000106
107#define JS_OTHER_UNOP_LIST(V) \
108 V(JSTypeOf)
109
110#define JS_SIMPLE_UNOP_LIST(V) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000111 JS_CONVERSION_UNOP_LIST(V) \
112 JS_OTHER_UNOP_LIST(V)
113
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000114#define JS_OBJECT_OP_LIST(V) \
115 V(JSCreate) \
116 V(JSCreateArguments) \
117 V(JSCreateArray) \
118 V(JSCreateClosure) \
119 V(JSCreateIterResultObject) \
120 V(JSCreateLiteralArray) \
121 V(JSCreateLiteralObject) \
122 V(JSCreateLiteralRegExp) \
123 V(JSLoadProperty) \
124 V(JSLoadNamed) \
125 V(JSLoadGlobal) \
126 V(JSStoreProperty) \
127 V(JSStoreNamed) \
128 V(JSStoreGlobal) \
129 V(JSDeleteProperty) \
130 V(JSHasProperty) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000131 V(JSInstanceOf)
132
133#define JS_CONTEXT_OP_LIST(V) \
134 V(JSLoadContext) \
135 V(JSStoreContext) \
136 V(JSCreateFunctionContext) \
137 V(JSCreateCatchContext) \
138 V(JSCreateWithContext) \
139 V(JSCreateBlockContext) \
140 V(JSCreateModuleContext) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400141 V(JSCreateScriptContext)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000142
143#define JS_OTHER_OP_LIST(V) \
144 V(JSCallConstruct) \
145 V(JSCallFunction) \
146 V(JSCallRuntime) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000147 V(JSConvertReceiver) \
148 V(JSForInDone) \
149 V(JSForInNext) \
150 V(JSForInPrepare) \
151 V(JSForInStep) \
152 V(JSLoadMessage) \
153 V(JSStoreMessage) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000154 V(JSStackCheck)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000155
156#define JS_OP_LIST(V) \
157 JS_SIMPLE_BINOP_LIST(V) \
158 JS_SIMPLE_UNOP_LIST(V) \
159 JS_OBJECT_OP_LIST(V) \
160 JS_CONTEXT_OP_LIST(V) \
161 JS_OTHER_OP_LIST(V)
162
163// Opcodes for VirtuaMachine-level operators.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000164#define SIMPLIFIED_COMPARE_BINOP_LIST(V) \
165 V(NumberEqual) \
166 V(NumberLessThan) \
167 V(NumberLessThanOrEqual) \
168 V(ReferenceEqual) \
169 V(StringEqual) \
170 V(StringLessThan) \
171 V(StringLessThanOrEqual)
172
173#define SIMPLIFIED_OP_LIST(V) \
174 SIMPLIFIED_COMPARE_BINOP_LIST(V) \
175 V(BooleanNot) \
176 V(BooleanToNumber) \
177 V(NumberAdd) \
178 V(NumberSubtract) \
179 V(NumberMultiply) \
180 V(NumberDivide) \
181 V(NumberModulus) \
182 V(NumberBitwiseOr) \
183 V(NumberBitwiseXor) \
184 V(NumberBitwiseAnd) \
185 V(NumberShiftLeft) \
186 V(NumberShiftRight) \
187 V(NumberShiftRightLogical) \
Ben Murdochda12d292016-06-02 14:46:10 +0100188 V(NumberImul) \
189 V(NumberClz32) \
190 V(NumberCeil) \
191 V(NumberFloor) \
192 V(NumberRound) \
193 V(NumberTrunc) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000194 V(NumberToInt32) \
195 V(NumberToUint32) \
196 V(NumberIsHoleNaN) \
Ben Murdochda12d292016-06-02 14:46:10 +0100197 V(StringToNumber) \
Ben Murdochc5610432016-08-08 18:44:38 +0100198 V(ChangeTaggedSignedToInt32) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000199 V(ChangeTaggedToInt32) \
200 V(ChangeTaggedToUint32) \
201 V(ChangeTaggedToFloat64) \
Ben Murdochc5610432016-08-08 18:44:38 +0100202 V(ChangeInt31ToTaggedSigned) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000203 V(ChangeInt32ToTagged) \
204 V(ChangeUint32ToTagged) \
205 V(ChangeFloat64ToTagged) \
Ben Murdochc5610432016-08-08 18:44:38 +0100206 V(ChangeTaggedToBit) \
207 V(ChangeBitToTagged) \
208 V(TruncateTaggedToWord32) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000209 V(Allocate) \
210 V(LoadField) \
211 V(LoadBuffer) \
212 V(LoadElement) \
213 V(StoreField) \
214 V(StoreBuffer) \
215 V(StoreElement) \
Ben Murdochc5610432016-08-08 18:44:38 +0100216 V(ObjectIsCallable) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000217 V(ObjectIsNumber) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100218 V(ObjectIsReceiver) \
Ben Murdochda12d292016-06-02 14:46:10 +0100219 V(ObjectIsSmi) \
Ben Murdochc5610432016-08-08 18:44:38 +0100220 V(ObjectIsString) \
221 V(ObjectIsUndetectable) \
222 V(TypeGuard)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000223
224// Opcodes for Machine-level operators.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000225#define MACHINE_COMPARE_BINOP_LIST(V) \
226 V(Word32Equal) \
227 V(Word64Equal) \
228 V(Int32LessThan) \
229 V(Int32LessThanOrEqual) \
230 V(Uint32LessThan) \
231 V(Uint32LessThanOrEqual) \
232 V(Int64LessThan) \
233 V(Int64LessThanOrEqual) \
234 V(Uint64LessThan) \
235 V(Uint64LessThanOrEqual) \
236 V(Float32Equal) \
237 V(Float32LessThan) \
238 V(Float32LessThanOrEqual) \
239 V(Float64Equal) \
240 V(Float64LessThan) \
241 V(Float64LessThanOrEqual)
242
243#define MACHINE_OP_LIST(V) \
244 MACHINE_COMPARE_BINOP_LIST(V) \
245 V(Load) \
246 V(Store) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100247 V(StackSlot) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000248 V(Word32And) \
249 V(Word32Or) \
250 V(Word32Xor) \
251 V(Word32Shl) \
252 V(Word32Shr) \
253 V(Word32Sar) \
254 V(Word32Ror) \
255 V(Word32Clz) \
256 V(Word32Ctz) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100257 V(Word32ReverseBits) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000258 V(Word32Popcnt) \
259 V(Word64Popcnt) \
260 V(Word64And) \
261 V(Word64Or) \
262 V(Word64Xor) \
263 V(Word64Shl) \
264 V(Word64Shr) \
265 V(Word64Sar) \
266 V(Word64Ror) \
267 V(Word64Clz) \
268 V(Word64Ctz) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100269 V(Word64ReverseBits) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000270 V(Int32Add) \
271 V(Int32AddWithOverflow) \
272 V(Int32Sub) \
273 V(Int32SubWithOverflow) \
274 V(Int32Mul) \
275 V(Int32MulHigh) \
276 V(Int32Div) \
277 V(Int32Mod) \
278 V(Uint32Div) \
279 V(Uint32Mod) \
280 V(Uint32MulHigh) \
281 V(Int64Add) \
282 V(Int64AddWithOverflow) \
283 V(Int64Sub) \
284 V(Int64SubWithOverflow) \
285 V(Int64Mul) \
286 V(Int64Div) \
287 V(Int64Mod) \
288 V(Uint64Div) \
289 V(Uint64Mod) \
Ben Murdochc5610432016-08-08 18:44:38 +0100290 V(BitcastWordToTagged) \
291 V(TruncateFloat64ToWord32) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000292 V(ChangeFloat32ToFloat64) \
293 V(ChangeFloat64ToInt32) \
294 V(ChangeFloat64ToUint32) \
Ben Murdochda12d292016-06-02 14:46:10 +0100295 V(TruncateFloat64ToUint32) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100296 V(TruncateFloat32ToInt32) \
297 V(TruncateFloat32ToUint32) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000298 V(TryTruncateFloat32ToInt64) \
299 V(TryTruncateFloat64ToInt64) \
300 V(TryTruncateFloat32ToUint64) \
301 V(TryTruncateFloat64ToUint64) \
302 V(ChangeInt32ToFloat64) \
303 V(ChangeInt32ToInt64) \
304 V(ChangeUint32ToFloat64) \
305 V(ChangeUint32ToUint64) \
306 V(TruncateFloat64ToFloat32) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000307 V(TruncateInt64ToInt32) \
Ben Murdochc5610432016-08-08 18:44:38 +0100308 V(RoundFloat64ToInt32) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100309 V(RoundInt32ToFloat32) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000310 V(RoundInt64ToFloat32) \
311 V(RoundInt64ToFloat64) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100312 V(RoundUint32ToFloat32) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000313 V(RoundUint64ToFloat32) \
314 V(RoundUint64ToFloat64) \
315 V(BitcastFloat32ToInt32) \
316 V(BitcastFloat64ToInt64) \
317 V(BitcastInt32ToFloat32) \
318 V(BitcastInt64ToFloat64) \
319 V(Float32Add) \
320 V(Float32Sub) \
Ben Murdochc5610432016-08-08 18:44:38 +0100321 V(Float32SubPreserveNan) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000322 V(Float32Mul) \
323 V(Float32Div) \
324 V(Float32Max) \
325 V(Float32Min) \
326 V(Float32Abs) \
327 V(Float32Sqrt) \
328 V(Float32RoundDown) \
329 V(Float64Add) \
330 V(Float64Sub) \
Ben Murdochc5610432016-08-08 18:44:38 +0100331 V(Float64SubPreserveNan) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000332 V(Float64Mul) \
333 V(Float64Div) \
334 V(Float64Mod) \
335 V(Float64Max) \
336 V(Float64Min) \
337 V(Float64Abs) \
338 V(Float64Sqrt) \
339 V(Float64RoundDown) \
340 V(Float32RoundUp) \
341 V(Float64RoundUp) \
342 V(Float32RoundTruncate) \
343 V(Float64RoundTruncate) \
344 V(Float64RoundTiesAway) \
345 V(Float32RoundTiesEven) \
346 V(Float64RoundTiesEven) \
347 V(Float64ExtractLowWord32) \
348 V(Float64ExtractHighWord32) \
349 V(Float64InsertLowWord32) \
350 V(Float64InsertHighWord32) \
351 V(LoadStackPointer) \
352 V(LoadFramePointer) \
Ben Murdoch097c5b22016-05-18 11:27:45 +0100353 V(LoadParentFramePointer) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000354 V(CheckedLoad) \
Ben Murdochda12d292016-06-02 14:46:10 +0100355 V(CheckedStore) \
356 V(Int32PairAdd) \
357 V(Int32PairSub) \
358 V(Int32PairMul) \
359 V(Word32PairShl) \
360 V(Word32PairShr) \
Ben Murdochc5610432016-08-08 18:44:38 +0100361 V(Word32PairSar) \
362 V(AtomicLoad) \
363 V(AtomicStore)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000364
Ben Murdochc5610432016-08-08 18:44:38 +0100365#define MACHINE_SIMD_RETURN_SIMD_OP_LIST(V) \
366 V(CreateFloat32x4) \
367 V(Float32x4ReplaceLane) \
368 V(Float32x4Abs) \
369 V(Float32x4Neg) \
370 V(Float32x4Sqrt) \
371 V(Float32x4RecipApprox) \
372 V(Float32x4RecipSqrtApprox) \
373 V(Float32x4Add) \
374 V(Float32x4Sub) \
375 V(Float32x4Mul) \
376 V(Float32x4Div) \
377 V(Float32x4Min) \
378 V(Float32x4Max) \
379 V(Float32x4MinNum) \
380 V(Float32x4MaxNum) \
381 V(Float32x4Equal) \
382 V(Float32x4NotEqual) \
383 V(Float32x4LessThan) \
384 V(Float32x4LessThanOrEqual) \
385 V(Float32x4GreaterThan) \
386 V(Float32x4GreaterThanOrEqual) \
387 V(Float32x4Select) \
388 V(Float32x4Swizzle) \
389 V(Float32x4Shuffle) \
390 V(Float32x4FromInt32x4) \
391 V(Float32x4FromUint32x4) \
392 V(CreateInt32x4) \
393 V(Int32x4ReplaceLane) \
394 V(Int32x4Neg) \
395 V(Int32x4Add) \
396 V(Int32x4Sub) \
397 V(Int32x4Mul) \
398 V(Int32x4Min) \
399 V(Int32x4Max) \
400 V(Int32x4ShiftLeftByScalar) \
401 V(Int32x4ShiftRightByScalar) \
402 V(Int32x4Equal) \
403 V(Int32x4NotEqual) \
404 V(Int32x4LessThan) \
405 V(Int32x4LessThanOrEqual) \
406 V(Int32x4GreaterThan) \
407 V(Int32x4GreaterThanOrEqual) \
408 V(Int32x4Select) \
409 V(Int32x4Swizzle) \
410 V(Int32x4Shuffle) \
411 V(Int32x4FromFloat32x4) \
412 V(Uint32x4Min) \
413 V(Uint32x4Max) \
414 V(Uint32x4ShiftLeftByScalar) \
415 V(Uint32x4ShiftRightByScalar) \
416 V(Uint32x4LessThan) \
417 V(Uint32x4LessThanOrEqual) \
418 V(Uint32x4GreaterThan) \
419 V(Uint32x4GreaterThanOrEqual) \
420 V(Uint32x4FromFloat32x4) \
421 V(CreateBool32x4) \
422 V(Bool32x4ReplaceLane) \
423 V(Bool32x4And) \
424 V(Bool32x4Or) \
425 V(Bool32x4Xor) \
426 V(Bool32x4Not) \
427 V(Bool32x4Swizzle) \
428 V(Bool32x4Shuffle) \
429 V(Bool32x4Equal) \
430 V(Bool32x4NotEqual) \
431 V(CreateInt16x8) \
432 V(Int16x8ReplaceLane) \
433 V(Int16x8Neg) \
434 V(Int16x8Add) \
435 V(Int16x8AddSaturate) \
436 V(Int16x8Sub) \
437 V(Int16x8SubSaturate) \
438 V(Int16x8Mul) \
439 V(Int16x8Min) \
440 V(Int16x8Max) \
441 V(Int16x8ShiftLeftByScalar) \
442 V(Int16x8ShiftRightByScalar) \
443 V(Int16x8Equal) \
444 V(Int16x8NotEqual) \
445 V(Int16x8LessThan) \
446 V(Int16x8LessThanOrEqual) \
447 V(Int16x8GreaterThan) \
448 V(Int16x8GreaterThanOrEqual) \
449 V(Int16x8Select) \
450 V(Int16x8Swizzle) \
451 V(Int16x8Shuffle) \
452 V(Uint16x8AddSaturate) \
453 V(Uint16x8SubSaturate) \
454 V(Uint16x8Min) \
455 V(Uint16x8Max) \
456 V(Uint16x8ShiftLeftByScalar) \
457 V(Uint16x8ShiftRightByScalar) \
458 V(Uint16x8LessThan) \
459 V(Uint16x8LessThanOrEqual) \
460 V(Uint16x8GreaterThan) \
461 V(Uint16x8GreaterThanOrEqual) \
462 V(CreateBool16x8) \
463 V(Bool16x8ReplaceLane) \
464 V(Bool16x8And) \
465 V(Bool16x8Or) \
466 V(Bool16x8Xor) \
467 V(Bool16x8Not) \
468 V(Bool16x8Swizzle) \
469 V(Bool16x8Shuffle) \
470 V(Bool16x8Equal) \
471 V(Bool16x8NotEqual) \
472 V(CreateInt8x16) \
473 V(Int8x16ReplaceLane) \
474 V(Int8x16Neg) \
475 V(Int8x16Add) \
476 V(Int8x16AddSaturate) \
477 V(Int8x16Sub) \
478 V(Int8x16SubSaturate) \
479 V(Int8x16Mul) \
480 V(Int8x16Min) \
481 V(Int8x16Max) \
482 V(Int8x16ShiftLeftByScalar) \
483 V(Int8x16ShiftRightByScalar) \
484 V(Int8x16Equal) \
485 V(Int8x16NotEqual) \
486 V(Int8x16LessThan) \
487 V(Int8x16LessThanOrEqual) \
488 V(Int8x16GreaterThan) \
489 V(Int8x16GreaterThanOrEqual) \
490 V(Int8x16Select) \
491 V(Int8x16Swizzle) \
492 V(Int8x16Shuffle) \
493 V(Uint8x16AddSaturate) \
494 V(Uint8x16SubSaturate) \
495 V(Uint8x16Min) \
496 V(Uint8x16Max) \
497 V(Uint8x16ShiftLeftByScalar) \
498 V(Uint8x16ShiftRightByScalar) \
499 V(Uint8x16LessThan) \
500 V(Uint8x16LessThanOrEqual) \
501 V(Uint8x16GreaterThan) \
502 V(Uint8x16GreaterThanOrEqual) \
503 V(CreateBool8x16) \
504 V(Bool8x16ReplaceLane) \
505 V(Bool8x16And) \
506 V(Bool8x16Or) \
507 V(Bool8x16Xor) \
508 V(Bool8x16Not) \
509 V(Bool8x16Swizzle) \
510 V(Bool8x16Shuffle) \
511 V(Bool8x16Equal) \
512 V(Bool8x16NotEqual) \
513 V(Simd128Load) \
514 V(Simd128Load1) \
515 V(Simd128Load2) \
516 V(Simd128Load3) \
517 V(Simd128Store) \
518 V(Simd128Store1) \
519 V(Simd128Store2) \
520 V(Simd128Store3) \
521 V(Simd128And) \
522 V(Simd128Or) \
523 V(Simd128Xor) \
524 V(Simd128Not)
525
526#define MACHINE_SIMD_RETURN_NUM_OP_LIST(V) \
527 V(Float32x4ExtractLane) \
528 V(Int32x4ExtractLane) \
529 V(Int16x8ExtractLane) \
530 V(Int8x16ExtractLane)
531
532#define MACHINE_SIMD_RETURN_BOOL_OP_LIST(V) \
533 V(Bool32x4ExtractLane) \
534 V(Bool32x4AnyTrue) \
535 V(Bool32x4AllTrue) \
536 V(Bool16x8ExtractLane) \
537 V(Bool16x8AnyTrue) \
538 V(Bool16x8AllTrue) \
539 V(Bool8x16ExtractLane) \
540 V(Bool8x16AnyTrue) \
541 V(Bool8x16AllTrue)
542
543#define MACHINE_SIMD_OP_LIST(V) \
544 MACHINE_SIMD_RETURN_SIMD_OP_LIST(V) \
545 MACHINE_SIMD_RETURN_NUM_OP_LIST(V) \
546 MACHINE_SIMD_RETURN_BOOL_OP_LIST(V)
547
548#define VALUE_OP_LIST(V) \
549 COMMON_OP_LIST(V) \
550 SIMPLIFIED_OP_LIST(V) \
551 MACHINE_OP_LIST(V) \
552 MACHINE_SIMD_OP_LIST(V) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000553 JS_OP_LIST(V)
554
555// The combination of all operators at all levels and the common operators.
556#define ALL_OP_LIST(V) \
557 CONTROL_OP_LIST(V) \
558 VALUE_OP_LIST(V)
559
560namespace v8 {
561namespace internal {
562namespace compiler {
563
564// Declare an enumeration with all the opcodes at all levels so that they
565// can be globally, uniquely numbered.
566class IrOpcode {
567 public:
568 enum Value {
569#define DECLARE_OPCODE(x) k##x,
570 ALL_OP_LIST(DECLARE_OPCODE)
571#undef DECLARE_OPCODE
572 kLast = -1
573#define COUNT_OPCODE(x) +1
574 ALL_OP_LIST(COUNT_OPCODE)
575#undef COUNT_OPCODE
576 };
577
578 // Returns the mnemonic name of an opcode.
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400579 static char const* Mnemonic(Value value);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000580
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000581 // Returns true if opcode for common operator.
582 static bool IsCommonOpcode(Value value) {
583 return kStart <= value && value <= kDead;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000584 }
585
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000586 // Returns true if opcode for control operator.
587 static bool IsControlOpcode(Value value) {
588 return kStart <= value && value <= kEnd;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000589 }
590
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000591 // Returns true if opcode for JavaScript operator.
592 static bool IsJsOpcode(Value value) {
593 return kJSEqual <= value && value <= kJSStackCheck;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400594 }
595
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000596 // Returns true if opcode for constant operator.
597 static bool IsConstantOpcode(Value value) {
Ben Murdochc5610432016-08-08 18:44:38 +0100598 return kInt32Constant <= value && value <= kRelocatableInt64Constant;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000599 }
600
601 static bool IsPhiOpcode(Value value) {
602 return value == kPhi || value == kEffectPhi;
603 }
604
605 static bool IsMergeOpcode(Value value) {
606 return value == kMerge || value == kLoop;
607 }
608
609 static bool IsIfProjectionOpcode(Value value) {
610 return kIfTrue <= value && value <= kIfDefault;
611 }
612
613 // Returns true if opcode can be inlined.
614 static bool IsInlineeOpcode(Value value) {
615 return value == kJSCallConstruct || value == kJSCallFunction;
616 }
617
618 // Returns true if opcode for comparison operator.
619 static bool IsComparisonOpcode(Value value) {
620 return (kJSEqual <= value && value <= kJSGreaterThanOrEqual) ||
621 (kNumberEqual <= value && value <= kStringLessThanOrEqual) ||
622 (kWord32Equal <= value && value <= kFloat64LessThanOrEqual);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000623 }
624};
625
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000626std::ostream& operator<<(std::ostream&, IrOpcode::Value);
627
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000628} // namespace compiler
629} // namespace internal
630} // namespace v8
631
632#endif // V8_COMPILER_OPCODES_H_