xref: /third_party/node/deps/v8/src/compiler/opcodes.h (revision 1cb0ef41)
1// Copyright 2013 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_COMPILER_OPCODES_H_
6#define V8_COMPILER_OPCODES_H_
7
8#include <iosfwd>
9
10#include "src/common/globals.h"
11
12// Opcodes for control operators.
13#define CONTROL_OP_LIST(V) \
14  V(Start)                 \
15  V(Loop)                  \
16  V(Branch)                \
17  V(Switch)                \
18  V(IfTrue)                \
19  V(IfFalse)               \
20  V(IfSuccess)             \
21  V(IfException)           \
22  V(IfValue)               \
23  V(IfDefault)             \
24  V(Merge)                 \
25  V(Deoptimize)            \
26  V(DeoptimizeIf)          \
27  V(DeoptimizeUnless)      \
28  V(TrapIf)                \
29  V(TrapUnless)            \
30  V(Return)                \
31  V(TailCall)              \
32  V(Terminate)             \
33  V(Throw)                 \
34  V(End)
35
36// Opcodes for constant operators.
37#define CONSTANT_OP_LIST(V)   \
38  V(Int32Constant)            \
39  V(Int64Constant)            \
40  V(TaggedIndexConstant)      \
41  V(Float32Constant)          \
42  V(Float64Constant)          \
43  V(ExternalConstant)         \
44  V(NumberConstant)           \
45  V(PointerConstant)          \
46  V(HeapConstant)             \
47  V(CompressedHeapConstant)   \
48  V(RelocatableInt32Constant) \
49  V(RelocatableInt64Constant)
50
51#define INNER_OP_LIST(V)    \
52  V(Select)                 \
53  V(Phi)                    \
54  V(EffectPhi)              \
55  V(InductionVariablePhi)   \
56  V(Checkpoint)             \
57  V(BeginRegion)            \
58  V(FinishRegion)           \
59  V(FrameState)             \
60  V(StateValues)            \
61  V(TypedStateValues)       \
62  V(ArgumentsElementsState) \
63  V(ArgumentsLengthState)   \
64  V(ObjectState)            \
65  V(ObjectId)               \
66  V(TypedObjectState)       \
67  V(Call)                   \
68  V(Parameter)              \
69  V(OsrValue)               \
70  V(LoopExit)               \
71  V(LoopExitValue)          \
72  V(LoopExitEffect)         \
73  V(Projection)             \
74  V(Retain)                 \
75  V(MapGuard)               \
76  V(FoldConstant)           \
77  V(TypeGuard)
78
79#define COMMON_OP_LIST(V) \
80  CONSTANT_OP_LIST(V)     \
81  INNER_OP_LIST(V)        \
82  V(Unreachable)          \
83  V(DeadValue)            \
84  V(Dead)                 \
85  V(Plug)                 \
86  V(SLVerifierHint)       \
87  V(StaticAssert)
88
89// Opcodes for JavaScript operators.
90// Arguments are JSName (the name with a 'JS' prefix), and Name.
91#define JS_COMPARE_BINOP_LIST(V)        \
92  V(JSEqual, Equal)                     \
93  V(JSStrictEqual, StrictEqual)         \
94  V(JSLessThan, LessThan)               \
95  V(JSGreaterThan, GreaterThan)         \
96  V(JSLessThanOrEqual, LessThanOrEqual) \
97  V(JSGreaterThanOrEqual, GreaterThanOrEqual)
98
99#define JS_BITWISE_BINOP_LIST(V) \
100  V(JSBitwiseOr, BitwiseOr)      \
101  V(JSBitwiseXor, BitwiseXor)    \
102  V(JSBitwiseAnd, BitwiseAnd)    \
103  V(JSShiftLeft, ShiftLeft)      \
104  V(JSShiftRight, ShiftRight)    \
105  V(JSShiftRightLogical, ShiftRightLogical)
106
107#define JS_ARITH_BINOP_LIST(V) \
108  V(JSAdd, Add)                \
109  V(JSSubtract, Subtract)      \
110  V(JSMultiply, Multiply)      \
111  V(JSDivide, Divide)          \
112  V(JSModulus, Modulus)        \
113  V(JSExponentiate, Exponentiate)
114
115#define JS_SIMPLE_BINOP_LIST(V) \
116  JS_COMPARE_BINOP_LIST(V)      \
117  JS_BITWISE_BINOP_LIST(V)      \
118  JS_ARITH_BINOP_LIST(V)        \
119  V(JSHasInPrototypeChain)      \
120  V(JSInstanceOf)               \
121  V(JSOrdinaryHasInstance)
122
123#define JS_CONVERSION_UNOP_LIST(V) \
124  V(JSToLength)                    \
125  V(JSToName)                      \
126  V(JSToNumber)                    \
127  V(JSToNumberConvertBigInt)       \
128  V(JSToNumeric)                   \
129  V(JSToObject)                    \
130  V(JSToString)                    \
131  V(JSParseInt)
132
133#define JS_BITWISE_UNOP_LIST(V) \
134  V(JSBitwiseNot, BitwiseNot)   \
135  V(JSNegate, Negate)
136
137#define JS_ARITH_UNOP_LIST(V) \
138  V(JSDecrement, Decrement)   \
139  V(JSIncrement, Increment)
140
141#define JS_SIMPLE_UNOP_LIST(V) \
142  JS_ARITH_UNOP_LIST(V)        \
143  JS_BITWISE_UNOP_LIST(V)      \
144  JS_CONVERSION_UNOP_LIST(V)
145
146#define JS_CREATE_OP_LIST(V)     \
147  V(JSCloneObject)               \
148  V(JSCreate)                    \
149  V(JSCreateArguments)           \
150  V(JSCreateArray)               \
151  V(JSCreateArrayFromIterable)   \
152  V(JSCreateArrayIterator)       \
153  V(JSCreateAsyncFunctionObject) \
154  V(JSCreateBoundFunction)       \
155  V(JSCreateClosure)             \
156  V(JSCreateCollectionIterator)  \
157  V(JSCreateEmptyLiteralArray)   \
158  V(JSCreateEmptyLiteralObject)  \
159  V(JSCreateGeneratorObject)     \
160  V(JSCreateIterResultObject)    \
161  V(JSCreateKeyValueArray)       \
162  V(JSCreateLiteralArray)        \
163  V(JSCreateLiteralObject)       \
164  V(JSCreateLiteralRegExp)       \
165  V(JSCreateObject)              \
166  V(JSCreatePromise)             \
167  V(JSCreateStringIterator)      \
168  V(JSCreateTypedArray)          \
169  V(JSGetTemplateObject)
170
171#define JS_OBJECT_OP_LIST(V)           \
172  JS_CREATE_OP_LIST(V)                 \
173  V(JSLoadProperty)                    \
174  V(JSLoadNamed)                       \
175  V(JSLoadNamedFromSuper)              \
176  V(JSLoadGlobal)                      \
177  V(JSSetKeyedProperty)                \
178  V(JSDefineKeyedOwnProperty)          \
179  V(JSSetNamedProperty)                \
180  V(JSDefineNamedOwnProperty)          \
181  V(JSStoreGlobal)                     \
182  V(JSDefineKeyedOwnPropertyInLiteral) \
183  V(JSStoreInArrayLiteral)             \
184  V(JSDeleteProperty)                  \
185  V(JSHasProperty)                     \
186  V(JSGetSuperConstructor)
187
188#define JS_CONTEXT_OP_LIST(V) \
189  V(JSHasContextExtension)    \
190  V(JSLoadContext)            \
191  V(JSStoreContext)           \
192  V(JSCreateFunctionContext)  \
193  V(JSCreateCatchContext)     \
194  V(JSCreateWithContext)      \
195  V(JSCreateBlockContext)
196
197#define JS_CALL_OP_LIST(V) \
198  V(JSCall)                \
199  V(JSCallForwardVarargs)  \
200  V(JSCallWithArrayLike)   \
201  V(JSCallWithSpread)      \
202  IF_WASM(V, JSWasmCall)
203
204#define JS_CONSTRUCT_OP_LIST(V) \
205  V(JSConstructForwardVarargs)  \
206  V(JSConstruct)                \
207  V(JSConstructWithArrayLike)   \
208  V(JSConstructWithSpread)
209
210#define JS_OTHER_OP_LIST(V)            \
211  JS_CALL_OP_LIST(V)                   \
212  JS_CONSTRUCT_OP_LIST(V)              \
213  V(JSAsyncFunctionEnter)              \
214  V(JSAsyncFunctionReject)             \
215  V(JSAsyncFunctionResolve)            \
216  V(JSCallRuntime)                     \
217  V(JSForInEnumerate)                  \
218  V(JSForInNext)                       \
219  V(JSForInPrepare)                    \
220  V(JSGetIterator)                     \
221  V(JSLoadMessage)                     \
222  V(JSStoreMessage)                    \
223  V(JSLoadModule)                      \
224  V(JSStoreModule)                     \
225  V(JSGetImportMeta)                   \
226  V(JSGeneratorStore)                  \
227  V(JSGeneratorRestoreContinuation)    \
228  V(JSGeneratorRestoreContext)         \
229  V(JSGeneratorRestoreRegister)        \
230  V(JSGeneratorRestoreInputOrDebugPos) \
231  V(JSFulfillPromise)                  \
232  V(JSPerformPromiseThen)              \
233  V(JSPromiseResolve)                  \
234  V(JSRejectPromise)                   \
235  V(JSResolvePromise)                  \
236  V(JSStackCheck)                      \
237  V(JSObjectIsArray)                   \
238  V(JSRegExpTest)                      \
239  V(JSDebugger)
240
241#define JS_OP_LIST(V)     \
242  JS_SIMPLE_BINOP_LIST(V) \
243  JS_SIMPLE_UNOP_LIST(V)  \
244  JS_OBJECT_OP_LIST(V)    \
245  JS_CONTEXT_OP_LIST(V)   \
246  JS_OTHER_OP_LIST(V)
247
248// Opcodes for VirtuaMachine-level operators.
249#define SIMPLIFIED_CHANGE_OP_LIST(V) \
250  V(ChangeTaggedSignedToInt32)       \
251  V(ChangeTaggedSignedToInt64)       \
252  V(ChangeTaggedToInt32)             \
253  V(ChangeTaggedToInt64)             \
254  V(ChangeTaggedToUint32)            \
255  V(ChangeTaggedToFloat64)           \
256  V(ChangeTaggedToTaggedSigned)      \
257  V(ChangeInt31ToTaggedSigned)       \
258  V(ChangeInt32ToTagged)             \
259  V(ChangeInt64ToTagged)             \
260  V(ChangeUint32ToTagged)            \
261  V(ChangeUint64ToTagged)            \
262  V(ChangeFloat64ToTagged)           \
263  V(ChangeFloat64ToTaggedPointer)    \
264  V(ChangeTaggedToBit)               \
265  V(ChangeBitToTagged)               \
266  V(ChangeInt64ToBigInt)             \
267  V(ChangeUint64ToBigInt)            \
268  V(TruncateBigIntToWord64)          \
269  V(TruncateTaggedToWord32)          \
270  V(TruncateTaggedToFloat64)         \
271  V(TruncateTaggedToBit)             \
272  V(TruncateTaggedPointerToBit)
273
274#define SIMPLIFIED_CHECKED_OP_LIST(V) \
275  V(CheckedInt32Add)                  \
276  V(CheckedInt32Sub)                  \
277  V(CheckedInt32Div)                  \
278  V(CheckedInt32Mod)                  \
279  V(CheckedUint32Div)                 \
280  V(CheckedUint32Mod)                 \
281  V(CheckedInt32Mul)                  \
282  V(CheckedInt32ToTaggedSigned)       \
283  V(CheckedInt64ToInt32)              \
284  V(CheckedInt64ToTaggedSigned)       \
285  V(CheckedUint32Bounds)              \
286  V(CheckedUint32ToInt32)             \
287  V(CheckedUint32ToTaggedSigned)      \
288  V(CheckedUint64Bounds)              \
289  V(CheckedUint64ToInt32)             \
290  V(CheckedUint64ToTaggedSigned)      \
291  V(CheckedFloat64ToInt32)            \
292  V(CheckedFloat64ToInt64)            \
293  V(CheckedTaggedSignedToInt32)       \
294  V(CheckedTaggedToInt32)             \
295  V(CheckedTaggedToArrayIndex)        \
296  V(CheckedTruncateTaggedToWord32)    \
297  V(CheckedTaggedToFloat64)           \
298  V(CheckedTaggedToInt64)             \
299  V(CheckedTaggedToTaggedSigned)      \
300  V(CheckedTaggedToTaggedPointer)
301
302#define SIMPLIFIED_COMPARE_BINOP_LIST(V) \
303  V(NumberEqual)                         \
304  V(NumberLessThan)                      \
305  V(NumberLessThanOrEqual)               \
306  V(SpeculativeNumberEqual)              \
307  V(SpeculativeNumberLessThan)           \
308  V(SpeculativeNumberLessThanOrEqual)    \
309  V(ReferenceEqual)                      \
310  V(SameValue)                           \
311  V(SameValueNumbersOnly)                \
312  V(NumberSameValue)                     \
313  V(StringEqual)                         \
314  V(StringLessThan)                      \
315  V(StringLessThanOrEqual)
316
317#define SIMPLIFIED_NUMBER_BINOP_LIST(V) \
318  V(NumberAdd)                          \
319  V(NumberSubtract)                     \
320  V(NumberMultiply)                     \
321  V(NumberDivide)                       \
322  V(NumberModulus)                      \
323  V(NumberBitwiseOr)                    \
324  V(NumberBitwiseXor)                   \
325  V(NumberBitwiseAnd)                   \
326  V(NumberShiftLeft)                    \
327  V(NumberShiftRight)                   \
328  V(NumberShiftRightLogical)            \
329  V(NumberAtan2)                        \
330  V(NumberImul)                         \
331  V(NumberMax)                          \
332  V(NumberMin)                          \
333  V(NumberPow)
334
335#define SIMPLIFIED_BIGINT_BINOP_LIST(V) \
336  V(BigIntAdd)                          \
337  V(BigIntSubtract)
338
339#define SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(V) \
340  V(SpeculativeNumberAdd)                           \
341  V(SpeculativeNumberSubtract)                      \
342  V(SpeculativeNumberMultiply)                      \
343  V(SpeculativeNumberPow)                           \
344  V(SpeculativeNumberDivide)                        \
345  V(SpeculativeNumberModulus)                       \
346  V(SpeculativeNumberBitwiseAnd)                    \
347  V(SpeculativeNumberBitwiseOr)                     \
348  V(SpeculativeNumberBitwiseXor)                    \
349  V(SpeculativeNumberShiftLeft)                     \
350  V(SpeculativeNumberShiftRight)                    \
351  V(SpeculativeNumberShiftRightLogical)             \
352  V(SpeculativeSafeIntegerAdd)                      \
353  V(SpeculativeSafeIntegerSubtract)
354
355#define SIMPLIFIED_NUMBER_UNOP_LIST(V) \
356  V(NumberAbs)                         \
357  V(NumberAcos)                        \
358  V(NumberAcosh)                       \
359  V(NumberAsin)                        \
360  V(NumberAsinh)                       \
361  V(NumberAtan)                        \
362  V(NumberAtanh)                       \
363  V(NumberCbrt)                        \
364  V(NumberCeil)                        \
365  V(NumberClz32)                       \
366  V(NumberCos)                         \
367  V(NumberCosh)                        \
368  V(NumberExp)                         \
369  V(NumberExpm1)                       \
370  V(NumberFloor)                       \
371  V(NumberFround)                      \
372  V(NumberLog)                         \
373  V(NumberLog1p)                       \
374  V(NumberLog2)                        \
375  V(NumberLog10)                       \
376  V(NumberRound)                       \
377  V(NumberSign)                        \
378  V(NumberSin)                         \
379  V(NumberSinh)                        \
380  V(NumberSqrt)                        \
381  V(NumberTan)                         \
382  V(NumberTanh)                        \
383  V(NumberTrunc)                       \
384  V(NumberToBoolean)                   \
385  V(NumberToInt32)                     \
386  V(NumberToString)                    \
387  V(NumberToUint32)                    \
388  V(NumberToUint8Clamped)              \
389  V(NumberSilenceNaN)
390
391#define SIMPLIFIED_BIGINT_UNOP_LIST(V) \
392  V(BigIntNegate)                      \
393  V(CheckBigInt)
394
395#define SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(V) V(SpeculativeToNumber)
396
397#define SIMPLIFIED_OTHER_OP_LIST(V)     \
398  V(Allocate)                           \
399  V(AllocateRaw)                        \
400  V(ArgumentsLength)                    \
401  V(AssertType)                         \
402  V(BooleanNot)                         \
403  V(CheckBounds)                        \
404  V(CheckClosure)                       \
405  V(CheckEqualsInternalizedString)      \
406  V(CheckEqualsSymbol)                  \
407  V(CheckFloat64Hole)                   \
408  V(CheckHeapObject)                    \
409  V(CheckIf)                            \
410  V(CheckInternalizedString)            \
411  V(CheckMaps)                          \
412  V(CheckNotTaggedHole)                 \
413  V(CheckNumber)                        \
414  V(CheckReceiver)                      \
415  V(CheckReceiverOrNullOrUndefined)     \
416  V(CheckSmi)                           \
417  V(CheckString)                        \
418  V(CheckSymbol)                        \
419  V(CompareMaps)                        \
420  V(ConvertReceiver)                    \
421  V(ConvertTaggedHoleToUndefined)       \
422  V(DateNow)                            \
423  V(DelayedStringConstant)              \
424  V(EnsureWritableFastElements)         \
425  V(FastApiCall)                        \
426  V(FindOrderedHashMapEntry)            \
427  V(FindOrderedHashMapEntryForInt32Key) \
428  V(InitializeImmutableInObject)        \
429  V(LoadDataViewElement)                \
430  V(LoadElement)                        \
431  V(LoadField)                          \
432  V(LoadFieldByIndex)                   \
433  V(LoadFromObject)                     \
434  V(LoadImmutableFromObject)            \
435  V(LoadMessage)                        \
436  V(LoadStackArgument)                  \
437  V(LoadTypedElement)                   \
438  V(MaybeGrowFastElements)              \
439  V(NewArgumentsElements)               \
440  V(NewConsString)                      \
441  V(NewDoubleElements)                  \
442  V(NewSmiOrObjectElements)             \
443  V(NumberIsFinite)                     \
444  V(NumberIsFloat64Hole)                \
445  V(NumberIsInteger)                    \
446  V(NumberIsMinusZero)                  \
447  V(NumberIsNaN)                        \
448  V(NumberIsSafeInteger)                \
449  V(ObjectIsArrayBufferView)            \
450  V(ObjectIsBigInt)                     \
451  V(ObjectIsCallable)                   \
452  V(ObjectIsConstructor)                \
453  V(ObjectIsDetectableCallable)         \
454  V(ObjectIsFiniteNumber)               \
455  V(ObjectIsInteger)                    \
456  V(ObjectIsMinusZero)                  \
457  V(ObjectIsNaN)                        \
458  V(ObjectIsNonCallable)                \
459  V(ObjectIsNumber)                     \
460  V(ObjectIsReceiver)                   \
461  V(ObjectIsSafeInteger)                \
462  V(ObjectIsSmi)                        \
463  V(ObjectIsString)                     \
464  V(ObjectIsSymbol)                     \
465  V(ObjectIsUndetectable)               \
466  V(PlainPrimitiveToFloat64)            \
467  V(PlainPrimitiveToNumber)             \
468  V(PlainPrimitiveToWord32)             \
469  V(RestLength)                         \
470  V(RuntimeAbort)                       \
471  V(StoreDataViewElement)               \
472  V(StoreElement)                       \
473  V(StoreField)                         \
474  V(StoreMessage)                       \
475  V(StoreSignedSmallElement)            \
476  V(StoreToObject)                      \
477  V(StoreTypedElement)                  \
478  V(StringCharCodeAt)                   \
479  V(StringCodePointAt)                  \
480  V(StringConcat)                       \
481  V(StringFromCodePointAt)              \
482  V(StringFromSingleCharCode)           \
483  V(StringFromSingleCodePoint)          \
484  V(StringIndexOf)                      \
485  V(StringLength)                       \
486  V(StringSubstring)                    \
487  V(StringToLowerCaseIntl)              \
488  V(StringToNumber)                     \
489  V(StringToUpperCaseIntl)              \
490  V(ToBoolean)                          \
491  V(TransitionAndStoreElement)          \
492  V(TransitionAndStoreNonNumberElement) \
493  V(TransitionAndStoreNumberElement)    \
494  V(TransitionElementsKind)             \
495  V(TypeOf)                             \
496  V(VerifyType)
497
498#define SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(V) \
499  V(SpeculativeBigIntAdd)                           \
500  V(SpeculativeBigIntSubtract)
501
502#define SIMPLIFIED_SPECULATIVE_BIGINT_UNOP_LIST(V) \
503  V(SpeculativeBigIntAsIntN)                       \
504  V(SpeculativeBigIntAsUintN)                      \
505  V(SpeculativeBigIntNegate)
506
507#define SIMPLIFIED_OP_LIST(V)                 \
508  SIMPLIFIED_CHANGE_OP_LIST(V)                \
509  SIMPLIFIED_CHECKED_OP_LIST(V)               \
510  SIMPLIFIED_COMPARE_BINOP_LIST(V)            \
511  SIMPLIFIED_NUMBER_BINOP_LIST(V)             \
512  SIMPLIFIED_BIGINT_BINOP_LIST(V)             \
513  SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(V) \
514  SIMPLIFIED_NUMBER_UNOP_LIST(V)              \
515  SIMPLIFIED_BIGINT_UNOP_LIST(V)              \
516  SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(V)  \
517  SIMPLIFIED_SPECULATIVE_BIGINT_UNOP_LIST(V)  \
518  SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(V) \
519  SIMPLIFIED_OTHER_OP_LIST(V)
520
521// Opcodes for Machine-level operators.
522#define MACHINE_COMPARE_BINOP_LIST(V) \
523  V(Word32Equal)                      \
524  V(Word64Equal)                      \
525  V(Int32LessThan)                    \
526  V(Int32LessThanOrEqual)             \
527  V(Uint32LessThan)                   \
528  V(Uint32LessThanOrEqual)            \
529  V(Int64LessThan)                    \
530  V(Int64LessThanOrEqual)             \
531  V(Uint64LessThan)                   \
532  V(Uint64LessThanOrEqual)            \
533  V(Float32Equal)                     \
534  V(Float32LessThan)                  \
535  V(Float32LessThanOrEqual)           \
536  V(Float64Equal)                     \
537  V(Float64LessThan)                  \
538  V(Float64LessThanOrEqual)
539
540#define MACHINE_UNOP_32_LIST(V) \
541  V(Word32Clz)                  \
542  V(Word32Ctz)                  \
543  V(Int32AbsWithOverflow)       \
544  V(Word32ReverseBits)          \
545  V(Word32ReverseBytes)
546
547#define MACHINE_BINOP_32_LIST(V) \
548  V(Word32And)                   \
549  V(Word32Or)                    \
550  V(Word32Xor)                   \
551  V(Word32Shl)                   \
552  V(Word32Shr)                   \
553  V(Word32Sar)                   \
554  V(Word32Rol)                   \
555  V(Word32Ror)                   \
556  V(Int32Add)                    \
557  V(Int32AddWithOverflow)        \
558  V(Int32Sub)                    \
559  V(Int32SubWithOverflow)        \
560  V(Int32Mul)                    \
561  V(Int32MulWithOverflow)        \
562  V(Int32MulHigh)                \
563  V(Int32Div)                    \
564  V(Int32Mod)                    \
565  V(Uint32Div)                   \
566  V(Uint32Mod)                   \
567  V(Uint32MulHigh)
568
569#define MACHINE_BINOP_64_LIST(V) \
570  V(Word64And)                   \
571  V(Word64Or)                    \
572  V(Word64Xor)                   \
573  V(Word64Shl)                   \
574  V(Word64Shr)                   \
575  V(Word64Sar)                   \
576  V(Word64Rol)                   \
577  V(Word64Ror)                   \
578  V(Word64RolLowerable)          \
579  V(Word64RorLowerable)          \
580  V(Int64Add)                    \
581  V(Int64AddWithOverflow)        \
582  V(Int64Sub)                    \
583  V(Int64SubWithOverflow)        \
584  V(Int64Mul)                    \
585  V(Int64Div)                    \
586  V(Int64Mod)                    \
587  V(Uint64Div)                   \
588  V(Uint64Mod)
589
590#define MACHINE_FLOAT32_UNOP_LIST(V) \
591  V(Float32Abs)                      \
592  V(Float32Neg)                      \
593  V(Float32RoundDown)                \
594  V(Float32RoundTiesEven)            \
595  V(Float32RoundTruncate)            \
596  V(Float32RoundUp)                  \
597  V(Float32Sqrt)
598
599#define MACHINE_FLOAT32_BINOP_LIST(V) \
600  V(Float32Add)                       \
601  V(Float32Sub)                       \
602  V(Float32Mul)                       \
603  V(Float32Div)                       \
604  V(Float32Max)                       \
605  V(Float32Min)
606
607#define MACHINE_FLOAT64_UNOP_LIST(V) \
608  V(Float64Abs)                      \
609  V(Float64Acos)                     \
610  V(Float64Acosh)                    \
611  V(Float64Asin)                     \
612  V(Float64Asinh)                    \
613  V(Float64Atan)                     \
614  V(Float64Atanh)                    \
615  V(Float64Cbrt)                     \
616  V(Float64Cos)                      \
617  V(Float64Cosh)                     \
618  V(Float64Exp)                      \
619  V(Float64Expm1)                    \
620  V(Float64Log)                      \
621  V(Float64Log1p)                    \
622  V(Float64Log10)                    \
623  V(Float64Log2)                     \
624  V(Float64Neg)                      \
625  V(Float64RoundDown)                \
626  V(Float64RoundTiesAway)            \
627  V(Float64RoundTiesEven)            \
628  V(Float64RoundTruncate)            \
629  V(Float64RoundUp)                  \
630  V(Float64Sin)                      \
631  V(Float64Sinh)                     \
632  V(Float64Sqrt)                     \
633  V(Float64Tan)                      \
634  V(Float64Tanh)
635
636#define MACHINE_FLOAT64_BINOP_LIST(V) \
637  V(Float64Atan2)                     \
638  V(Float64Max)                       \
639  V(Float64Min)                       \
640  V(Float64Add)                       \
641  V(Float64Sub)                       \
642  V(Float64Mul)                       \
643  V(Float64Div)                       \
644  V(Float64Mod)                       \
645  V(Float64Pow)
646
647#define MACHINE_ATOMIC_OP_LIST(V)    \
648  V(Word32AtomicLoad)                \
649  V(Word32AtomicStore)               \
650  V(Word32AtomicExchange)            \
651  V(Word32AtomicCompareExchange)     \
652  V(Word32AtomicAdd)                 \
653  V(Word32AtomicSub)                 \
654  V(Word32AtomicAnd)                 \
655  V(Word32AtomicOr)                  \
656  V(Word32AtomicXor)                 \
657  V(Word32AtomicPairLoad)            \
658  V(Word32AtomicPairStore)           \
659  V(Word32AtomicPairAdd)             \
660  V(Word32AtomicPairSub)             \
661  V(Word32AtomicPairAnd)             \
662  V(Word32AtomicPairOr)              \
663  V(Word32AtomicPairXor)             \
664  V(Word32AtomicPairExchange)        \
665  V(Word32AtomicPairCompareExchange) \
666  V(Word64AtomicLoad)                \
667  V(Word64AtomicStore)               \
668  V(Word64AtomicAdd)                 \
669  V(Word64AtomicSub)                 \
670  V(Word64AtomicAnd)                 \
671  V(Word64AtomicOr)                  \
672  V(Word64AtomicXor)                 \
673  V(Word64AtomicExchange)            \
674  V(Word64AtomicCompareExchange)
675
676#define MACHINE_OP_LIST(V)               \
677  MACHINE_UNOP_32_LIST(V)                \
678  MACHINE_BINOP_32_LIST(V)               \
679  MACHINE_BINOP_64_LIST(V)               \
680  MACHINE_COMPARE_BINOP_LIST(V)          \
681  MACHINE_FLOAT32_BINOP_LIST(V)          \
682  MACHINE_FLOAT32_UNOP_LIST(V)           \
683  MACHINE_FLOAT64_BINOP_LIST(V)          \
684  MACHINE_FLOAT64_UNOP_LIST(V)           \
685  MACHINE_ATOMIC_OP_LIST(V)              \
686  V(AbortCSADcheck)                      \
687  V(DebugBreak)                          \
688  V(Comment)                             \
689  V(Load)                                \
690  V(LoadImmutable)                       \
691  V(Store)                               \
692  V(StackSlot)                           \
693  V(Word32Popcnt)                        \
694  V(Word64Popcnt)                        \
695  V(Word64Clz)                           \
696  V(Word64Ctz)                           \
697  V(Word64ClzLowerable)                  \
698  V(Word64CtzLowerable)                  \
699  V(Word64ReverseBits)                   \
700  V(Word64ReverseBytes)                  \
701  V(Simd128ReverseBytes)                 \
702  V(Int64AbsWithOverflow)                \
703  V(BitcastTaggedToWord)                 \
704  V(BitcastTaggedToWordForTagAndSmiBits) \
705  V(BitcastWordToTagged)                 \
706  V(BitcastWordToTaggedSigned)           \
707  V(TruncateFloat64ToWord32)             \
708  V(ChangeFloat32ToFloat64)              \
709  V(ChangeFloat64ToInt32)                \
710  V(ChangeFloat64ToInt64)                \
711  V(ChangeFloat64ToUint32)               \
712  V(ChangeFloat64ToUint64)               \
713  V(Float64SilenceNaN)                   \
714  V(TruncateFloat64ToInt64)              \
715  V(TruncateFloat64ToUint32)             \
716  V(TruncateFloat32ToInt32)              \
717  V(TruncateFloat32ToUint32)             \
718  V(TryTruncateFloat32ToInt64)           \
719  V(TryTruncateFloat64ToInt64)           \
720  V(TryTruncateFloat32ToUint64)          \
721  V(TryTruncateFloat64ToUint64)          \
722  V(ChangeInt32ToFloat64)                \
723  V(BitcastWord32ToWord64)               \
724  V(ChangeInt32ToInt64)                  \
725  V(ChangeInt64ToFloat64)                \
726  V(ChangeUint32ToFloat64)               \
727  V(ChangeUint32ToUint64)                \
728  V(TruncateFloat64ToFloat32)            \
729  V(TruncateInt64ToInt32)                \
730  V(RoundFloat64ToInt32)                 \
731  V(RoundInt32ToFloat32)                 \
732  V(RoundInt64ToFloat32)                 \
733  V(RoundInt64ToFloat64)                 \
734  V(RoundUint32ToFloat32)                \
735  V(RoundUint64ToFloat32)                \
736  V(RoundUint64ToFloat64)                \
737  V(BitcastFloat32ToInt32)               \
738  V(BitcastFloat64ToInt64)               \
739  V(BitcastInt32ToFloat32)               \
740  V(BitcastInt64ToFloat64)               \
741  V(Float64ExtractLowWord32)             \
742  V(Float64ExtractHighWord32)            \
743  V(Float64InsertLowWord32)              \
744  V(Float64InsertHighWord32)             \
745  V(Word32Select)                        \
746  V(Word64Select)                        \
747  V(Float32Select)                       \
748  V(Float64Select)                       \
749  V(LoadStackCheckOffset)                \
750  V(LoadFramePointer)                    \
751  V(LoadParentFramePointer)              \
752  V(UnalignedLoad)                       \
753  V(UnalignedStore)                      \
754  V(Int32PairAdd)                        \
755  V(Int32PairSub)                        \
756  V(Int32PairMul)                        \
757  V(Word32PairShl)                       \
758  V(Word32PairShr)                       \
759  V(Word32PairSar)                       \
760  V(ProtectedLoad)                       \
761  V(ProtectedStore)                      \
762  V(MemoryBarrier)                       \
763  V(SignExtendWord8ToInt32)              \
764  V(SignExtendWord16ToInt32)             \
765  V(SignExtendWord8ToInt64)              \
766  V(SignExtendWord16ToInt64)             \
767  V(SignExtendWord32ToInt64)             \
768  V(UnsafePointerAdd)                    \
769  V(StackPointerGreaterThan)
770
771#define MACHINE_SIMD_OP_LIST(V)  \
772  V(F64x2Splat)                  \
773  V(F64x2ExtractLane)            \
774  V(F64x2ReplaceLane)            \
775  V(F64x2Abs)                    \
776  V(F64x2Neg)                    \
777  V(F64x2Sqrt)                   \
778  V(F64x2Add)                    \
779  V(F64x2Sub)                    \
780  V(F64x2Mul)                    \
781  V(F64x2Div)                    \
782  V(F64x2Min)                    \
783  V(F64x2Max)                    \
784  V(F64x2Eq)                     \
785  V(F64x2Ne)                     \
786  V(F64x2Lt)                     \
787  V(F64x2Le)                     \
788  V(F64x2Qfma)                   \
789  V(F64x2Qfms)                   \
790  V(F64x2Pmin)                   \
791  V(F64x2Pmax)                   \
792  V(F64x2Ceil)                   \
793  V(F64x2Floor)                  \
794  V(F64x2Trunc)                  \
795  V(F64x2NearestInt)             \
796  V(F64x2ConvertLowI32x4S)       \
797  V(F64x2ConvertLowI32x4U)       \
798  V(F64x2PromoteLowF32x4)        \
799  V(F32x4Splat)                  \
800  V(F32x4ExtractLane)            \
801  V(F32x4ReplaceLane)            \
802  V(F32x4SConvertI32x4)          \
803  V(F32x4UConvertI32x4)          \
804  V(F32x4Abs)                    \
805  V(F32x4Neg)                    \
806  V(F32x4Sqrt)                   \
807  V(F32x4RecipApprox)            \
808  V(F32x4RecipSqrtApprox)        \
809  V(F32x4Add)                    \
810  V(F32x4Sub)                    \
811  V(F32x4Mul)                    \
812  V(F32x4Div)                    \
813  V(F32x4Min)                    \
814  V(F32x4Max)                    \
815  V(F32x4Eq)                     \
816  V(F32x4Ne)                     \
817  V(F32x4Lt)                     \
818  V(F32x4Le)                     \
819  V(F32x4Gt)                     \
820  V(F32x4Ge)                     \
821  V(F32x4Qfma)                   \
822  V(F32x4Qfms)                   \
823  V(F32x4Pmin)                   \
824  V(F32x4Pmax)                   \
825  V(F32x4Ceil)                   \
826  V(F32x4Floor)                  \
827  V(F32x4Trunc)                  \
828  V(F32x4NearestInt)             \
829  V(F32x4DemoteF64x2Zero)        \
830  V(I64x2Splat)                  \
831  V(I64x2SplatI32Pair)           \
832  V(I64x2ExtractLane)            \
833  V(I64x2ReplaceLane)            \
834  V(I64x2ReplaceLaneI32Pair)     \
835  V(I64x2Abs)                    \
836  V(I64x2Neg)                    \
837  V(I64x2SConvertI32x4Low)       \
838  V(I64x2SConvertI32x4High)      \
839  V(I64x2UConvertI32x4Low)       \
840  V(I64x2UConvertI32x4High)      \
841  V(I64x2BitMask)                \
842  V(I64x2Shl)                    \
843  V(I64x2ShrS)                   \
844  V(I64x2Add)                    \
845  V(I64x2Sub)                    \
846  V(I64x2Mul)                    \
847  V(I64x2Eq)                     \
848  V(I64x2Ne)                     \
849  V(I64x2GtS)                    \
850  V(I64x2GeS)                    \
851  V(I64x2ShrU)                   \
852  V(I64x2ExtMulLowI32x4S)        \
853  V(I64x2ExtMulHighI32x4S)       \
854  V(I64x2ExtMulLowI32x4U)        \
855  V(I64x2ExtMulHighI32x4U)       \
856  V(I32x4Splat)                  \
857  V(I32x4ExtractLane)            \
858  V(I32x4ReplaceLane)            \
859  V(I32x4SConvertF32x4)          \
860  V(I32x4SConvertI16x8Low)       \
861  V(I32x4SConvertI16x8High)      \
862  V(I32x4Neg)                    \
863  V(I32x4Shl)                    \
864  V(I32x4ShrS)                   \
865  V(I32x4Add)                    \
866  V(I32x4Sub)                    \
867  V(I32x4Mul)                    \
868  V(I32x4MinS)                   \
869  V(I32x4MaxS)                   \
870  V(I32x4Eq)                     \
871  V(I32x4Ne)                     \
872  V(I32x4LtS)                    \
873  V(I32x4LeS)                    \
874  V(I32x4GtS)                    \
875  V(I32x4GeS)                    \
876  V(I32x4UConvertF32x4)          \
877  V(I32x4UConvertI16x8Low)       \
878  V(I32x4UConvertI16x8High)      \
879  V(I32x4ShrU)                   \
880  V(I32x4MinU)                   \
881  V(I32x4MaxU)                   \
882  V(I32x4LtU)                    \
883  V(I32x4LeU)                    \
884  V(I32x4GtU)                    \
885  V(I32x4GeU)                    \
886  V(I32x4Abs)                    \
887  V(I32x4BitMask)                \
888  V(I32x4DotI16x8S)              \
889  V(I32x4ExtMulLowI16x8S)        \
890  V(I32x4ExtMulHighI16x8S)       \
891  V(I32x4ExtMulLowI16x8U)        \
892  V(I32x4ExtMulHighI16x8U)       \
893  V(I32x4ExtAddPairwiseI16x8S)   \
894  V(I32x4ExtAddPairwiseI16x8U)   \
895  V(I32x4TruncSatF64x2SZero)     \
896  V(I32x4TruncSatF64x2UZero)     \
897  V(I16x8Splat)                  \
898  V(I16x8ExtractLaneU)           \
899  V(I16x8ExtractLaneS)           \
900  V(I16x8ReplaceLane)            \
901  V(I16x8SConvertI8x16Low)       \
902  V(I16x8SConvertI8x16High)      \
903  V(I16x8Neg)                    \
904  V(I16x8Shl)                    \
905  V(I16x8ShrS)                   \
906  V(I16x8SConvertI32x4)          \
907  V(I16x8Add)                    \
908  V(I16x8AddSatS)                \
909  V(I16x8Sub)                    \
910  V(I16x8SubSatS)                \
911  V(I16x8Mul)                    \
912  V(I16x8MinS)                   \
913  V(I16x8MaxS)                   \
914  V(I16x8Eq)                     \
915  V(I16x8Ne)                     \
916  V(I16x8LtS)                    \
917  V(I16x8LeS)                    \
918  V(I16x8GtS)                    \
919  V(I16x8GeS)                    \
920  V(I16x8UConvertI8x16Low)       \
921  V(I16x8UConvertI8x16High)      \
922  V(I16x8ShrU)                   \
923  V(I16x8UConvertI32x4)          \
924  V(I16x8AddSatU)                \
925  V(I16x8SubSatU)                \
926  V(I16x8MinU)                   \
927  V(I16x8MaxU)                   \
928  V(I16x8LtU)                    \
929  V(I16x8LeU)                    \
930  V(I16x8GtU)                    \
931  V(I16x8GeU)                    \
932  V(I16x8RoundingAverageU)       \
933  V(I16x8Q15MulRSatS)            \
934  V(I16x8Abs)                    \
935  V(I16x8BitMask)                \
936  V(I16x8ExtMulLowI8x16S)        \
937  V(I16x8ExtMulHighI8x16S)       \
938  V(I16x8ExtMulLowI8x16U)        \
939  V(I16x8ExtMulHighI8x16U)       \
940  V(I16x8ExtAddPairwiseI8x16S)   \
941  V(I16x8ExtAddPairwiseI8x16U)   \
942  V(I8x16Splat)                  \
943  V(I8x16ExtractLaneU)           \
944  V(I8x16ExtractLaneS)           \
945  V(I8x16ReplaceLane)            \
946  V(I8x16SConvertI16x8)          \
947  V(I8x16Neg)                    \
948  V(I8x16Shl)                    \
949  V(I8x16ShrS)                   \
950  V(I8x16Add)                    \
951  V(I8x16AddSatS)                \
952  V(I8x16Sub)                    \
953  V(I8x16SubSatS)                \
954  V(I8x16MinS)                   \
955  V(I8x16MaxS)                   \
956  V(I8x16Eq)                     \
957  V(I8x16Ne)                     \
958  V(I8x16LtS)                    \
959  V(I8x16LeS)                    \
960  V(I8x16GtS)                    \
961  V(I8x16GeS)                    \
962  V(I8x16UConvertI16x8)          \
963  V(I8x16AddSatU)                \
964  V(I8x16SubSatU)                \
965  V(I8x16ShrU)                   \
966  V(I8x16MinU)                   \
967  V(I8x16MaxU)                   \
968  V(I8x16LtU)                    \
969  V(I8x16LeU)                    \
970  V(I8x16GtU)                    \
971  V(I8x16GeU)                    \
972  V(I8x16RoundingAverageU)       \
973  V(I8x16Popcnt)                 \
974  V(I8x16Abs)                    \
975  V(I8x16BitMask)                \
976  V(S128Zero)                    \
977  V(S128Const)                   \
978  V(S128Not)                     \
979  V(S128And)                     \
980  V(S128Or)                      \
981  V(S128Xor)                     \
982  V(S128Select)                  \
983  V(S128AndNot)                  \
984  V(I8x16Swizzle)                \
985  V(I8x16RelaxedLaneSelect)      \
986  V(I16x8RelaxedLaneSelect)      \
987  V(I32x4RelaxedLaneSelect)      \
988  V(I64x2RelaxedLaneSelect)      \
989  V(F32x4RelaxedMin)             \
990  V(F32x4RelaxedMax)             \
991  V(F64x2RelaxedMin)             \
992  V(F64x2RelaxedMax)             \
993  V(I32x4RelaxedTruncF32x4S)     \
994  V(I32x4RelaxedTruncF32x4U)     \
995  V(I32x4RelaxedTruncF64x2SZero) \
996  V(I32x4RelaxedTruncF64x2UZero) \
997  V(I8x16Shuffle)                \
998  V(V128AnyTrue)                 \
999  V(I64x2AllTrue)                \
1000  V(I32x4AllTrue)                \
1001  V(I16x8AllTrue)                \
1002  V(I8x16AllTrue)                \
1003  V(LoadTransform)               \
1004  V(LoadLane)                    \
1005  V(StoreLane)
1006
1007#define VALUE_OP_LIST(V)  \
1008  COMMON_OP_LIST(V)       \
1009  SIMPLIFIED_OP_LIST(V)   \
1010  MACHINE_OP_LIST(V)      \
1011  MACHINE_SIMD_OP_LIST(V) \
1012  JS_OP_LIST(V)
1013
1014// The combination of all operators at all levels and the common operators.
1015#define ALL_OP_LIST(V) \
1016  CONTROL_OP_LIST(V)   \
1017  VALUE_OP_LIST(V)
1018
1019namespace v8 {
1020namespace internal {
1021namespace compiler {
1022
1023// Declare an enumeration with all the opcodes at all levels so that they
1024// can be globally, uniquely numbered.
1025class V8_EXPORT_PRIVATE IrOpcode {
1026 public:
1027  enum Value {
1028#define DECLARE_OPCODE(x, ...) k##x,
1029    ALL_OP_LIST(DECLARE_OPCODE)
1030#undef DECLARE_OPCODE
1031        kLast = -1
1032#define COUNT_OPCODE(...) +1
1033                ALL_OP_LIST(COUNT_OPCODE)
1034#undef COUNT_OPCODE
1035  };
1036
1037  // Returns the mnemonic name of an opcode.
1038  static char const* Mnemonic(Value value);
1039
1040  // Returns true if opcode for common operator.
1041  static bool IsCommonOpcode(Value value) {
1042    return kStart <= value && value <= kStaticAssert;
1043  }
1044
1045  // Returns true if opcode for control operator.
1046  static bool IsControlOpcode(Value value) {
1047    return kStart <= value && value <= kEnd;
1048  }
1049
1050  // Returns true if opcode for JavaScript operator.
1051  static bool IsJsOpcode(Value value) {
1052    return kJSEqual <= value && value <= kJSDebugger;
1053  }
1054
1055  // Returns true if opcode for constant operator.
1056  static bool IsConstantOpcode(Value value) {
1057#define CASE(Name) \
1058  case k##Name:    \
1059    return true;
1060    switch (value) {
1061      CONSTANT_OP_LIST(CASE);
1062      default:
1063        return false;
1064    }
1065#undef CASE
1066    UNREACHABLE();
1067  }
1068
1069  static bool IsPhiOpcode(Value value) {
1070    return value == kPhi || value == kEffectPhi;
1071  }
1072
1073  static bool IsMergeOpcode(Value value) {
1074    return value == kMerge || value == kLoop;
1075  }
1076
1077  static bool IsIfProjectionOpcode(Value value) {
1078    return kIfTrue <= value && value <= kIfDefault;
1079  }
1080
1081  // Returns true if opcode terminates control flow in a graph (i.e.
1082  // respective nodes are expected to have control uses by the graphs {End}
1083  // node only).
1084  static bool IsGraphTerminator(Value value) {
1085    return value == kDeoptimize || value == kReturn || value == kTailCall ||
1086           value == kTerminate || value == kThrow;
1087  }
1088
1089  // Returns true if opcode can be inlined.
1090  static bool IsInlineeOpcode(Value value) {
1091    return value == kJSConstruct || value == kJSCall;
1092  }
1093
1094  // Returns true if opcode for comparison operator.
1095  static bool IsComparisonOpcode(Value value) {
1096#define CASE(Name, ...) \
1097  case k##Name:         \
1098    return true;
1099    switch (value) {
1100      JS_COMPARE_BINOP_LIST(CASE);
1101      SIMPLIFIED_COMPARE_BINOP_LIST(CASE);
1102      MACHINE_COMPARE_BINOP_LIST(CASE);
1103      default:
1104        return false;
1105    }
1106#undef CASE
1107    UNREACHABLE();
1108  }
1109
1110  static bool IsContextChainExtendingOpcode(Value value) {
1111    return kJSCreateFunctionContext <= value && value <= kJSCreateBlockContext;
1112  }
1113
1114  // These opcode take the feedback vector as an input, and implement
1115  // feedback-collecting logic in generic lowering.
1116  static bool IsFeedbackCollectingOpcode(Value value) {
1117#define CASE(Name, ...) \
1118  case k##Name:         \
1119    return true;
1120    switch (value) {
1121      JS_ARITH_BINOP_LIST(CASE)
1122      JS_ARITH_UNOP_LIST(CASE)
1123      JS_BITWISE_BINOP_LIST(CASE)
1124      JS_BITWISE_UNOP_LIST(CASE)
1125      JS_COMPARE_BINOP_LIST(CASE)
1126      case kJSCall:
1127      case kJSCallWithArrayLike:
1128      case kJSCallWithSpread:
1129      case kJSCloneObject:
1130      case kJSConstruct:
1131      case kJSConstructWithArrayLike:
1132      case kJSConstructWithSpread:
1133      case kJSCreateEmptyLiteralArray:
1134      case kJSCreateLiteralArray:
1135      case kJSCreateLiteralObject:
1136      case kJSCreateLiteralRegExp:
1137      case kJSDefineKeyedOwnProperty:
1138      case kJSForInNext:
1139      case kJSForInPrepare:
1140      case kJSGetIterator:
1141      case kJSGetTemplateObject:
1142      case kJSHasProperty:
1143      case kJSInstanceOf:
1144      case kJSLoadGlobal:
1145      case kJSLoadNamed:
1146      case kJSLoadNamedFromSuper:
1147      case kJSLoadProperty:
1148      case kJSDefineKeyedOwnPropertyInLiteral:
1149      case kJSStoreGlobal:
1150      case kJSStoreInArrayLiteral:
1151      case kJSSetNamedProperty:
1152      case kJSDefineNamedOwnProperty:
1153      case kJSSetKeyedProperty:
1154        return true;
1155      default:
1156        return false;
1157    }
1158#undef CASE
1159    UNREACHABLE();
1160  }
1161
1162  static bool IsFeedbackCollectingOpcode(int16_t value) {
1163    DCHECK(0 <= value && value <= kLast);
1164    return IsFeedbackCollectingOpcode(static_cast<IrOpcode::Value>(value));
1165  }
1166};
1167
1168V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&, IrOpcode::Value);
1169
1170}  // namespace compiler
1171}  // namespace internal
1172}  // namespace v8
1173
1174#endif  // V8_COMPILER_OPCODES_H_
1175