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/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(OsrNormalEntry) \
34 V(OsrLoopEntry) \
35 V(Throw) \
36 V(End)
37
38// Opcodes for constant operators.
39#define CONSTANT_OP_LIST(V) \
40 V(Int32Constant) \
41 V(Int64Constant) \
42 V(Float32Constant) \
43 V(Float64Constant) \
44 V(ExternalConstant) \
45 V(NumberConstant) \
46 V(PointerConstant) \
47 V(HeapConstant) \
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(CallWithCallerSavedRegisters) \
69 V(Parameter) \
70 V(OsrValue) \
71 V(LoopExit) \
72 V(LoopExitValue) \
73 V(LoopExitEffect) \
74 V(Projection) \
75 V(Retain) \
76 V(MapGuard) \
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
86// Opcodes for JavaScript operators.
87#define JS_COMPARE_BINOP_LIST(V) \
88 V(JSEqual) \
89 V(JSStrictEqual) \
90 V(JSLessThan) \
91 V(JSGreaterThan) \
92 V(JSLessThanOrEqual) \
93 V(JSGreaterThanOrEqual)
94
95#define JS_BITWISE_BINOP_LIST(V) \
96 V(JSBitwiseOr) \
97 V(JSBitwiseXor) \
98 V(JSBitwiseAnd) \
99 V(JSShiftLeft) \
100 V(JSShiftRight) \
101 V(JSShiftRightLogical)
102
103#define JS_ARITH_BINOP_LIST(V) \
104 V(JSAdd) \
105 V(JSSubtract) \
106 V(JSMultiply) \
107 V(JSDivide) \
108 V(JSModulus) \
109 V(JSExponentiate)
110
111#define JS_SIMPLE_BINOP_LIST(V) \
112 JS_COMPARE_BINOP_LIST(V) \
113 JS_BITWISE_BINOP_LIST(V) \
114 JS_ARITH_BINOP_LIST(V) \
115 V(JSHasInPrototypeChain) \
116 V(JSInstanceOf) \
117 V(JSOrdinaryHasInstance)
118
119#define JS_CONVERSION_UNOP_LIST(V) \
120 V(JSToLength) \
121 V(JSToName) \
122 V(JSToNumber) \
123 V(JSToNumberConvertBigInt) \
124 V(JSToNumeric) \
125 V(JSToObject) \
126 V(JSToString) \
127 V(JSParseInt)
128
129#define JS_SIMPLE_UNOP_LIST(V) \
130 JS_CONVERSION_UNOP_LIST(V) \
131 V(JSBitwiseNot) \
132 V(JSDecrement) \
133 V(JSIncrement) \
134 V(JSNegate)
135
136#define JS_CREATE_OP_LIST(V) \
137 V(JSCloneObject) \
138 V(JSCreate) \
139 V(JSCreateArguments) \
140 V(JSCreateArray) \
141 V(JSCreateArrayFromIterable) \
142 V(JSCreateArrayIterator) \
143 V(JSCreateAsyncFunctionObject) \
144 V(JSCreateBoundFunction) \
145 V(JSCreateClosure) \
146 V(JSCreateCollectionIterator) \
147 V(JSCreateEmptyLiteralArray) \
148 V(JSCreateEmptyLiteralObject) \
149 V(JSCreateGeneratorObject) \
150 V(JSCreateIterResultObject) \
151 V(JSCreateKeyValueArray) \
152 V(JSCreateLiteralArray) \
153 V(JSCreateLiteralObject) \
154 V(JSCreateLiteralRegExp) \
155 V(JSCreateObject) \
156 V(JSCreatePromise) \
157 V(JSCreateStringIterator) \
158 V(JSCreateTypedArray)
159
160#define JS_OBJECT_OP_LIST(V) \
161 JS_CREATE_OP_LIST(V) \
162 V(JSLoadProperty) \
163 V(JSLoadNamed) \
164 V(JSLoadGlobal) \
165 V(JSStoreProperty) \
166 V(JSStoreNamed) \
167 V(JSStoreNamedOwn) \
168 V(JSStoreGlobal) \
169 V(JSStoreDataPropertyInLiteral) \
170 V(JSStoreInArrayLiteral) \
171 V(JSDeleteProperty) \
172 V(JSHasProperty) \
173 V(JSGetSuperConstructor)
174
175#define JS_CONTEXT_OP_LIST(V) \
176 V(JSLoadContext) \
177 V(JSStoreContext) \
178 V(JSCreateFunctionContext) \
179 V(JSCreateCatchContext) \
180 V(JSCreateWithContext) \
181 V(JSCreateBlockContext)
182
183#define JS_CALL_OP_LIST(V) \
184 V(JSCall) \
185 V(JSCallForwardVarargs) \
186 V(JSCallWithArrayLike) \
187 V(JSCallWithSpread)
188
189#define JS_CONSTRUCT_OP_LIST(V) \
190 V(JSConstructForwardVarargs) \
191 V(JSConstruct) \
192 V(JSConstructWithArrayLike) \
193 V(JSConstructWithSpread)
194
195#define JS_OTHER_OP_LIST(V) \
196 JS_CALL_OP_LIST(V) \
197 JS_CONSTRUCT_OP_LIST(V) \
198 V(JSAsyncFunctionEnter) \
199 V(JSAsyncFunctionReject) \
200 V(JSAsyncFunctionResolve) \
201 V(JSCallRuntime) \
202 V(JSForInEnumerate) \
203 V(JSForInNext) \
204 V(JSForInPrepare) \
205 V(JSLoadMessage) \
206 V(JSStoreMessage) \
207 V(JSLoadModule) \
208 V(JSStoreModule) \
209 V(JSGeneratorStore) \
210 V(JSGeneratorRestoreContinuation) \
211 V(JSGeneratorRestoreContext) \
212 V(JSGeneratorRestoreRegister) \
213 V(JSGeneratorRestoreInputOrDebugPos) \
214 V(JSFulfillPromise) \
215 V(JSPerformPromiseThen) \
216 V(JSPromiseResolve) \
217 V(JSRejectPromise) \
218 V(JSResolvePromise) \
219 V(JSStackCheck) \
220 V(JSObjectIsArray) \
221 V(JSRegExpTest) \
222 V(JSDebugger)
223
224#define JS_OP_LIST(V) \
225 JS_SIMPLE_BINOP_LIST(V) \
226 JS_SIMPLE_UNOP_LIST(V) \
227 JS_OBJECT_OP_LIST(V) \
228 JS_CONTEXT_OP_LIST(V) \
229 JS_OTHER_OP_LIST(V)
230
231// Opcodes for VirtuaMachine-level operators.
232#define SIMPLIFIED_CHANGE_OP_LIST(V) \
233 V(ChangeTaggedSignedToInt32) \
234 V(ChangeTaggedSignedToInt64) \
235 V(ChangeTaggedToInt32) \
236 V(ChangeTaggedToInt64) \
237 V(ChangeTaggedToUint32) \
238 V(ChangeTaggedToFloat64) \
239 V(ChangeTaggedToTaggedSigned) \
240 V(ChangeCompressedToTaggedSigned) \
241 V(ChangeTaggedToCompressedSigned) \
242 V(ChangeInt31ToTaggedSigned) \
243 V(ChangeInt32ToTagged) \
244 V(ChangeInt64ToTagged) \
245 V(ChangeUint32ToTagged) \
246 V(ChangeUint64ToTagged) \
247 V(ChangeFloat64ToTagged) \
248 V(ChangeFloat64ToTaggedPointer) \
249 V(ChangeTaggedToBit) \
250 V(ChangeBitToTagged) \
251 V(TruncateTaggedToWord32) \
252 V(TruncateTaggedToFloat64) \
253 V(TruncateTaggedToBit) \
254 V(TruncateTaggedPointerToBit)
255
256#define SIMPLIFIED_CHECKED_OP_LIST(V) \
257 V(CheckedInt32Add) \
258 V(CheckedInt32Sub) \
259 V(CheckedInt32Div) \
260 V(CheckedInt32Mod) \
261 V(CheckedUint32Div) \
262 V(CheckedUint32Mod) \
263 V(CheckedInt32Mul) \
264 V(CheckedInt32ToTaggedSigned) \
265 V(CheckedInt64ToInt32) \
266 V(CheckedInt64ToTaggedSigned) \
267 V(CheckedUint32Bounds) \
268 V(CheckedUint32ToInt32) \
269 V(CheckedUint32ToTaggedSigned) \
270 V(CheckedUint64Bounds) \
271 V(CheckedUint64ToInt32) \
272 V(CheckedUint64ToTaggedSigned) \
273 V(CheckedFloat64ToInt32) \
274 V(CheckedFloat64ToInt64) \
275 V(CheckedTaggedSignedToInt32) \
276 V(CheckedTaggedToInt32) \
277 V(CheckedTruncateTaggedToWord32) \
278 V(CheckedTaggedToFloat64) \
279 V(CheckedTaggedToInt64) \
280 V(CheckedTaggedToTaggedSigned) \
281 V(CheckedTaggedToTaggedPointer) \
282 V(CheckedCompressedToTaggedSigned) \
283 V(CheckedCompressedToTaggedPointer) \
284 V(CheckedTaggedToCompressedSigned) \
285 V(CheckedTaggedToCompressedPointer)
286
287#define SIMPLIFIED_COMPARE_BINOP_LIST(V) \
288 V(NumberEqual) \
289 V(NumberLessThan) \
290 V(NumberLessThanOrEqual) \
291 V(SpeculativeNumberEqual) \
292 V(SpeculativeNumberLessThan) \
293 V(SpeculativeNumberLessThanOrEqual) \
294 V(ReferenceEqual) \
295 V(SameValue) \
296 V(NumberSameValue) \
297 V(StringEqual) \
298 V(StringLessThan) \
299 V(StringLessThanOrEqual)
300
301#define SIMPLIFIED_NUMBER_BINOP_LIST(V) \
302 V(NumberAdd) \
303 V(NumberSubtract) \
304 V(NumberMultiply) \
305 V(NumberDivide) \
306 V(NumberModulus) \
307 V(NumberBitwiseOr) \
308 V(NumberBitwiseXor) \
309 V(NumberBitwiseAnd) \
310 V(NumberShiftLeft) \
311 V(NumberShiftRight) \
312 V(NumberShiftRightLogical) \
313 V(NumberAtan2) \
314 V(NumberImul) \
315 V(NumberMax) \
316 V(NumberMin) \
317 V(NumberPow)
318
319#define SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(V) \
320 V(SpeculativeNumberAdd) \
321 V(SpeculativeNumberSubtract) \
322 V(SpeculativeNumberMultiply) \
323 V(SpeculativeNumberDivide) \
324 V(SpeculativeNumberModulus) \
325 V(SpeculativeNumberBitwiseAnd) \
326 V(SpeculativeNumberBitwiseOr) \
327 V(SpeculativeNumberBitwiseXor) \
328 V(SpeculativeNumberShiftLeft) \
329 V(SpeculativeNumberShiftRight) \
330 V(SpeculativeNumberShiftRightLogical) \
331 V(SpeculativeSafeIntegerAdd) \
332 V(SpeculativeSafeIntegerSubtract)
333
334#define SIMPLIFIED_NUMBER_UNOP_LIST(V) \
335 V(NumberAbs) \
336 V(NumberAcos) \
337 V(NumberAcosh) \
338 V(NumberAsin) \
339 V(NumberAsinh) \
340 V(NumberAtan) \
341 V(NumberAtanh) \
342 V(NumberCbrt) \
343 V(NumberCeil) \
344 V(NumberClz32) \
345 V(NumberCos) \
346 V(NumberCosh) \
347 V(NumberExp) \
348 V(NumberExpm1) \
349 V(NumberFloor) \
350 V(NumberFround) \
351 V(NumberLog) \
352 V(NumberLog1p) \
353 V(NumberLog2) \
354 V(NumberLog10) \
355 V(NumberRound) \
356 V(NumberSign) \
357 V(NumberSin) \
358 V(NumberSinh) \
359 V(NumberSqrt) \
360 V(NumberTan) \
361 V(NumberTanh) \
362 V(NumberTrunc) \
363 V(NumberToBoolean) \
364 V(NumberToInt32) \
365 V(NumberToString) \
366 V(NumberToUint32) \
367 V(NumberToUint8Clamped) \
368 V(NumberSilenceNaN)
369
370#define SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(V) V(SpeculativeToNumber)
371
372#define SIMPLIFIED_OTHER_OP_LIST(V) \
373 V(PlainPrimitiveToNumber) \
374 V(PlainPrimitiveToWord32) \
375 V(PlainPrimitiveToFloat64) \
376 V(BooleanNot) \
377 V(StringConcat) \
378 V(StringToNumber) \
379 V(StringCharCodeAt) \
380 V(StringCodePointAt) \
381 V(StringFromSingleCharCode) \
382 V(StringFromSingleCodePoint) \
383 V(StringIndexOf) \
384 V(StringLength) \
385 V(StringToLowerCaseIntl) \
386 V(StringToUpperCaseIntl) \
387 V(StringSubstring) \
388 V(CheckBounds) \
389 V(CheckIf) \
390 V(CheckMaps) \
391 V(CheckNumber) \
392 V(CheckReceiver) \
393 V(CheckReceiverOrNullOrUndefined) \
394 V(CheckInternalizedString) \
395 V(CheckNonEmptyString) \
396 V(CheckNonEmptyOneByteString) \
397 V(CheckNonEmptyTwoByteString) \
398 V(CheckString) \
399 V(CheckSymbol) \
400 V(CheckSmi) \
401 V(CheckHeapObject) \
402 V(CheckFloat64Hole) \
403 V(CheckNotTaggedHole) \
404 V(CheckEqualsInternalizedString) \
405 V(CheckEqualsSymbol) \
406 V(CompareMaps) \
407 V(ConvertReceiver) \
408 V(ConvertTaggedHoleToUndefined) \
409 V(TypeOf) \
410 V(Allocate) \
411 V(AllocateRaw) \
412 V(LoadFieldByIndex) \
413 V(LoadField) \
414 V(LoadElement) \
415 V(LoadMessage) \
416 V(LoadTypedElement) \
417 V(LoadDataViewElement) \
418 V(LoadStackArgument) \
419 V(StoreField) \
420 V(StoreElement) \
421 V(StoreMessage) \
422 V(StoreTypedElement) \
423 V(StoreDataViewElement) \
424 V(StoreSignedSmallElement) \
425 V(TransitionAndStoreElement) \
426 V(TransitionAndStoreNumberElement) \
427 V(TransitionAndStoreNonNumberElement) \
428 V(ToBoolean) \
429 V(NumberIsFloat64Hole) \
430 V(NumberIsFinite) \
431 V(ObjectIsFiniteNumber) \
432 V(NumberIsInteger) \
433 V(ObjectIsSafeInteger) \
434 V(NumberIsSafeInteger) \
435 V(ObjectIsInteger) \
436 V(ObjectIsArrayBufferView) \
437 V(ObjectIsBigInt) \
438 V(ObjectIsCallable) \
439 V(ObjectIsConstructor) \
440 V(ObjectIsDetectableCallable) \
441 V(ObjectIsMinusZero) \
442 V(NumberIsMinusZero) \
443 V(ObjectIsNaN) \
444 V(NumberIsNaN) \
445 V(ObjectIsNonCallable) \
446 V(ObjectIsNumber) \
447 V(ObjectIsReceiver) \
448 V(ObjectIsSmi) \
449 V(ObjectIsString) \
450 V(ObjectIsSymbol) \
451 V(ObjectIsUndetectable) \
452 V(ArgumentsFrame) \
453 V(ArgumentsLength) \
454 V(NewDoubleElements) \
455 V(NewSmiOrObjectElements) \
456 V(NewArgumentsElements) \
457 V(NewConsOneByteString) \
458 V(NewConsTwoByteString) \
459 V(NewConsString) \
460 V(DelayedStringConstant) \
461 V(EnsureWritableFastElements) \
462 V(MaybeGrowFastElements) \
463 V(TransitionElementsKind) \
464 V(FindOrderedHashMapEntry) \
465 V(FindOrderedHashMapEntryForInt32Key) \
466 V(PoisonIndex) \
467 V(RuntimeAbort) \
468 V(DateNow)
469
470#define SIMPLIFIED_OP_LIST(V) \
471 SIMPLIFIED_CHANGE_OP_LIST(V) \
472 SIMPLIFIED_CHECKED_OP_LIST(V) \
473 SIMPLIFIED_COMPARE_BINOP_LIST(V) \
474 SIMPLIFIED_NUMBER_BINOP_LIST(V) \
475 SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(V) \
476 SIMPLIFIED_NUMBER_UNOP_LIST(V) \
477 SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(V) \
478 SIMPLIFIED_OTHER_OP_LIST(V)
479
480// Opcodes for Machine-level operators.
481#define MACHINE_COMPARE_BINOP_LIST(V) \
482 V(Word32Equal) \
483 V(Word64Equal) \
484 V(Int32LessThan) \
485 V(Int32LessThanOrEqual) \
486 V(Uint32LessThan) \
487 V(Uint32LessThanOrEqual) \
488 V(Int64LessThan) \
489 V(Int64LessThanOrEqual) \
490 V(Uint64LessThan) \
491 V(Uint64LessThanOrEqual) \
492 V(Float32Equal) \
493 V(Float32LessThan) \
494 V(Float32LessThanOrEqual) \
495 V(Float64Equal) \
496 V(Float64LessThan) \
497 V(Float64LessThanOrEqual)
498
499#define MACHINE_UNOP_32_LIST(V) \
500 V(Word32Clz) \
501 V(Word32Ctz) \
502 V(Int32AbsWithOverflow) \
503 V(Word32ReverseBits) \
504 V(Word32ReverseBytes)
505
506#define MACHINE_BINOP_32_LIST(V) \
507 V(Word32And) \
508 V(Word32Or) \
509 V(Word32Xor) \
510 V(Word32Shl) \
511 V(Word32Shr) \
512 V(Word32Sar) \
513 V(Word32Ror) \
514 V(Int32Add) \
515 V(Int32AddWithOverflow) \
516 V(Int32Sub) \
517 V(Int32SubWithOverflow) \
518 V(Int32Mul) \
519 V(Int32MulWithOverflow) \
520 V(Int32MulHigh) \
521 V(Int32Div) \
522 V(Int32Mod) \
523 V(Uint32Div) \
524 V(Uint32Mod) \
525 V(Uint32MulHigh)
526
527#define MACHINE_BINOP_64_LIST(V) \
528 V(Word64And) \
529 V(Word64Or) \
530 V(Word64Xor) \
531 V(Word64Shl) \
532 V(Word64Shr) \
533 V(Word64Sar) \
534 V(Word64Ror) \
535 V(Int64Add) \
536 V(Int64AddWithOverflow) \
537 V(Int64Sub) \
538 V(Int64SubWithOverflow) \
539 V(Int64Mul) \
540 V(Int64Div) \
541 V(Int64Mod) \
542 V(Uint64Div) \
543 V(Uint64Mod)
544
545#define MACHINE_FLOAT32_UNOP_LIST(V) \
546 V(Float32Abs) \
547 V(Float32Neg) \
548 V(Float32RoundDown) \
549 V(Float32RoundTiesEven) \
550 V(Float32RoundTruncate) \
551 V(Float32RoundUp) \
552 V(Float32Sqrt)
553
554#define MACHINE_FLOAT32_BINOP_LIST(V) \
555 V(Float32Add) \
556 V(Float32Sub) \
557 V(Float32Mul) \
558 V(Float32Div) \
559 V(Float32Max) \
560 V(Float32Min)
561
562#define MACHINE_FLOAT64_UNOP_LIST(V) \
563 V(Float64Abs) \
564 V(Float64Acos) \
565 V(Float64Acosh) \
566 V(Float64Asin) \
567 V(Float64Asinh) \
568 V(Float64Atan) \
569 V(Float64Atanh) \
570 V(Float64Cbrt) \
571 V(Float64Cos) \
572 V(Float64Cosh) \
573 V(Float64Exp) \
574 V(Float64Expm1) \
575 V(Float64Log) \
576 V(Float64Log1p) \
577 V(Float64Log10) \
578 V(Float64Log2) \
579 V(Float64Neg) \
580 V(Float64RoundDown) \
581 V(Float64RoundTiesAway) \
582 V(Float64RoundTiesEven) \
583 V(Float64RoundTruncate) \
584 V(Float64RoundUp) \
585 V(Float64Sin) \
586 V(Float64Sinh) \
587 V(Float64Sqrt) \
588 V(Float64Tan) \
589 V(Float64Tanh)
590
591#define MACHINE_FLOAT64_BINOP_LIST(V) \
592 V(Float64Atan2) \
593 V(Float64Max) \
594 V(Float64Min) \
595 V(Float64Add) \
596 V(Float64Sub) \
597 V(Float64Mul) \
598 V(Float64Div) \
599 V(Float64Mod) \
600 V(Float64Pow)
601
602#define MACHINE_WORD64_ATOMIC_OP_LIST(V) \
603 V(Word64AtomicLoad) \
604 V(Word64AtomicStore) \
605 V(Word64AtomicAdd) \
606 V(Word64AtomicSub) \
607 V(Word64AtomicAnd) \
608 V(Word64AtomicOr) \
609 V(Word64AtomicXor) \
610 V(Word64AtomicExchange) \
611 V(Word64AtomicCompareExchange)
612
613#define MACHINE_OP_LIST(V) \
614 MACHINE_UNOP_32_LIST(V) \
615 MACHINE_BINOP_32_LIST(V) \
616 MACHINE_BINOP_64_LIST(V) \
617 MACHINE_COMPARE_BINOP_LIST(V) \
618 MACHINE_FLOAT32_BINOP_LIST(V) \
619 MACHINE_FLOAT32_UNOP_LIST(V) \
620 MACHINE_FLOAT64_BINOP_LIST(V) \
621 MACHINE_FLOAT64_UNOP_LIST(V) \
622 MACHINE_WORD64_ATOMIC_OP_LIST(V) \
623 V(DebugAbort) \
624 V(DebugBreak) \
625 V(Comment) \
626 V(Load) \
627 V(PoisonedLoad) \
628 V(Store) \
629 V(StackSlot) \
630 V(Word32Popcnt) \
631 V(Word64Popcnt) \
632 V(Word64Clz) \
633 V(Word64Ctz) \
634 V(Word64ReverseBits) \
635 V(Word64ReverseBytes) \
636 V(Int64AbsWithOverflow) \
637 V(BitcastTaggedToWord) \
638 V(BitcastWordToTagged) \
639 V(BitcastWordToTaggedSigned) \
640 V(TruncateFloat64ToWord32) \
641 V(ChangeFloat32ToFloat64) \
642 V(ChangeFloat64ToInt32) \
643 V(ChangeFloat64ToInt64) \
644 V(ChangeFloat64ToUint32) \
645 V(ChangeFloat64ToUint64) \
646 V(Float64SilenceNaN) \
647 V(TruncateFloat64ToInt64) \
648 V(TruncateFloat64ToUint32) \
649 V(TruncateFloat32ToInt32) \
650 V(TruncateFloat32ToUint32) \
651 V(TryTruncateFloat32ToInt64) \
652 V(TryTruncateFloat64ToInt64) \
653 V(TryTruncateFloat32ToUint64) \
654 V(TryTruncateFloat64ToUint64) \
655 V(ChangeInt32ToFloat64) \
656 V(ChangeInt32ToInt64) \
657 V(ChangeInt64ToFloat64) \
658 V(ChangeUint32ToFloat64) \
659 V(ChangeUint32ToUint64) \
660 V(ChangeTaggedToCompressed) \
661 V(ChangeTaggedPointerToCompressedPointer) \
662 V(ChangeTaggedSignedToCompressedSigned) \
663 V(ChangeCompressedToTagged) \
664 V(ChangeCompressedPointerToTaggedPointer) \
665 V(ChangeCompressedSignedToTaggedSigned) \
666 V(TruncateFloat64ToFloat32) \
667 V(TruncateInt64ToInt32) \
668 V(RoundFloat64ToInt32) \
669 V(RoundInt32ToFloat32) \
670 V(RoundInt64ToFloat32) \
671 V(RoundInt64ToFloat64) \
672 V(RoundUint32ToFloat32) \
673 V(RoundUint64ToFloat32) \
674 V(RoundUint64ToFloat64) \
675 V(BitcastFloat32ToInt32) \
676 V(BitcastFloat64ToInt64) \
677 V(BitcastInt32ToFloat32) \
678 V(BitcastInt64ToFloat64) \
679 V(Float64ExtractLowWord32) \
680 V(Float64ExtractHighWord32) \
681 V(Float64InsertLowWord32) \
682 V(Float64InsertHighWord32) \
683 V(TaggedPoisonOnSpeculation) \
684 V(Word32PoisonOnSpeculation) \
685 V(Word64PoisonOnSpeculation) \
686 V(LoadStackPointer) \
687 V(LoadFramePointer) \
688 V(LoadParentFramePointer) \
689 V(UnalignedLoad) \
690 V(UnalignedStore) \
691 V(Int32PairAdd) \
692 V(Int32PairSub) \
693 V(Int32PairMul) \
694 V(Word32PairShl) \
695 V(Word32PairShr) \
696 V(Word32PairSar) \
697 V(ProtectedLoad) \
698 V(ProtectedStore) \
699 V(Word32AtomicLoad) \
700 V(Word32AtomicStore) \
701 V(Word32AtomicExchange) \
702 V(Word32AtomicCompareExchange) \
703 V(Word32AtomicAdd) \
704 V(Word32AtomicSub) \
705 V(Word32AtomicAnd) \
706 V(Word32AtomicOr) \
707 V(Word32AtomicXor) \
708 V(Word32AtomicPairLoad) \
709 V(Word32AtomicPairStore) \
710 V(Word32AtomicPairAdd) \
711 V(Word32AtomicPairSub) \
712 V(Word32AtomicPairAnd) \
713 V(Word32AtomicPairOr) \
714 V(Word32AtomicPairXor) \
715 V(Word32AtomicPairExchange) \
716 V(Word32AtomicPairCompareExchange) \
717 V(SignExtendWord8ToInt32) \
718 V(SignExtendWord16ToInt32) \
719 V(SignExtendWord8ToInt64) \
720 V(SignExtendWord16ToInt64) \
721 V(SignExtendWord32ToInt64) \
722 V(UnsafePointerAdd)
723
724#define MACHINE_SIMD_OP_LIST(V) \
725 V(F32x4Splat) \
726 V(F32x4ExtractLane) \
727 V(F32x4ReplaceLane) \
728 V(F32x4SConvertI32x4) \
729 V(F32x4UConvertI32x4) \
730 V(F32x4Abs) \
731 V(F32x4Neg) \
732 V(F32x4RecipApprox) \
733 V(F32x4RecipSqrtApprox) \
734 V(F32x4Add) \
735 V(F32x4AddHoriz) \
736 V(F32x4Sub) \
737 V(F32x4Mul) \
738 V(F32x4Min) \
739 V(F32x4Max) \
740 V(F32x4Eq) \
741 V(F32x4Ne) \
742 V(F32x4Lt) \
743 V(F32x4Le) \
744 V(F32x4Gt) \
745 V(F32x4Ge) \
746 V(I32x4Splat) \
747 V(I32x4ExtractLane) \
748 V(I32x4ReplaceLane) \
749 V(I32x4SConvertF32x4) \
750 V(I32x4SConvertI16x8Low) \
751 V(I32x4SConvertI16x8High) \
752 V(I32x4Neg) \
753 V(I32x4Shl) \
754 V(I32x4ShrS) \
755 V(I32x4Add) \
756 V(I32x4AddHoriz) \
757 V(I32x4Sub) \
758 V(I32x4Mul) \
759 V(I32x4MinS) \
760 V(I32x4MaxS) \
761 V(I32x4Eq) \
762 V(I32x4Ne) \
763 V(I32x4LtS) \
764 V(I32x4LeS) \
765 V(I32x4GtS) \
766 V(I32x4GeS) \
767 V(I32x4UConvertF32x4) \
768 V(I32x4UConvertI16x8Low) \
769 V(I32x4UConvertI16x8High) \
770 V(I32x4ShrU) \
771 V(I32x4MinU) \
772 V(I32x4MaxU) \
773 V(I32x4LtU) \
774 V(I32x4LeU) \
775 V(I32x4GtU) \
776 V(I32x4GeU) \
777 V(I16x8Splat) \
778 V(I16x8ExtractLane) \
779 V(I16x8ReplaceLane) \
780 V(I16x8SConvertI8x16Low) \
781 V(I16x8SConvertI8x16High) \
782 V(I16x8Neg) \
783 V(I16x8Shl) \
784 V(I16x8ShrS) \
785 V(I16x8SConvertI32x4) \
786 V(I16x8Add) \
787 V(I16x8AddSaturateS) \
788 V(I16x8AddHoriz) \
789 V(I16x8Sub) \
790 V(I16x8SubSaturateS) \
791 V(I16x8Mul) \
792 V(I16x8MinS) \
793 V(I16x8MaxS) \
794 V(I16x8Eq) \
795 V(I16x8Ne) \
796 V(I16x8LtS) \
797 V(I16x8LeS) \
798 V(I16x8GtS) \
799 V(I16x8GeS) \
800 V(I16x8UConvertI8x16Low) \
801 V(I16x8UConvertI8x16High) \
802 V(I16x8ShrU) \
803 V(I16x8UConvertI32x4) \
804 V(I16x8AddSaturateU) \
805 V(I16x8SubSaturateU) \
806 V(I16x8MinU) \
807 V(I16x8MaxU) \
808 V(I16x8LtU) \
809 V(I16x8LeU) \
810 V(I16x8GtU) \
811 V(I16x8GeU) \
812 V(I8x16Splat) \
813 V(I8x16ExtractLane) \
814 V(I8x16ReplaceLane) \
815 V(I8x16SConvertI16x8) \
816 V(I8x16Neg) \
817 V(I8x16Shl) \
818 V(I8x16ShrS) \
819 V(I8x16Add) \
820 V(I8x16AddSaturateS) \
821 V(I8x16Sub) \
822 V(I8x16SubSaturateS) \
823 V(I8x16Mul) \
824 V(I8x16MinS) \
825 V(I8x16MaxS) \
826 V(I8x16Eq) \
827 V(I8x16Ne) \
828 V(I8x16LtS) \
829 V(I8x16LeS) \
830 V(I8x16GtS) \
831 V(I8x16GeS) \
832 V(I8x16UConvertI16x8) \
833 V(I8x16AddSaturateU) \
834 V(I8x16SubSaturateU) \
835 V(I8x16ShrU) \
836 V(I8x16MinU) \
837 V(I8x16MaxU) \
838 V(I8x16LtU) \
839 V(I8x16LeU) \
840 V(I8x16GtU) \
841 V(I8x16GeU) \
842 V(S128Load) \
843 V(S128Store) \
844 V(S128Zero) \
845 V(S128Not) \
846 V(S128And) \
847 V(S128Or) \
848 V(S128Xor) \
849 V(S128Select) \
850 V(S8x16Shuffle) \
851 V(S1x4AnyTrue) \
852 V(S1x4AllTrue) \
853 V(S1x8AnyTrue) \
854 V(S1x8AllTrue) \
855 V(S1x16AnyTrue) \
856 V(S1x16AllTrue)
857
858#define VALUE_OP_LIST(V) \
859 COMMON_OP_LIST(V) \
860 SIMPLIFIED_OP_LIST(V) \
861 MACHINE_OP_LIST(V) \
862 MACHINE_SIMD_OP_LIST(V) \
863 JS_OP_LIST(V)
864
865// The combination of all operators at all levels and the common operators.
866#define ALL_OP_LIST(V) \
867 CONTROL_OP_LIST(V) \
868 VALUE_OP_LIST(V)
869
870namespace v8 {
871namespace internal {
872namespace compiler {
873
874// Declare an enumeration with all the opcodes at all levels so that they
875// can be globally, uniquely numbered.
876class V8_EXPORT_PRIVATE IrOpcode {
877 public:
878 enum Value {
879#define DECLARE_OPCODE(x) k##x,
880 ALL_OP_LIST(DECLARE_OPCODE)
881#undef DECLARE_OPCODE
882 kLast = -1
883#define COUNT_OPCODE(x) +1
884 ALL_OP_LIST(COUNT_OPCODE)
885#undef COUNT_OPCODE
886 };
887
888 // Returns the mnemonic name of an opcode.
889 static char const* Mnemonic(Value value);
890
891 // Returns true if opcode for common operator.
892 static bool IsCommonOpcode(Value value) {
893 return kStart <= value && value <= kDead;
894 }
895
896 // Returns true if opcode for control operator.
897 static bool IsControlOpcode(Value value) {
898 return kStart <= value && value <= kEnd;
899 }
900
901 // Returns true if opcode for JavaScript operator.
902 static bool IsJsOpcode(Value value) {
903 return kJSEqual <= value && value <= kJSDebugger;
904 }
905
906 // Returns true if opcode for constant operator.
907 static bool IsConstantOpcode(Value value) {
908 return kInt32Constant <= value && value <= kRelocatableInt64Constant;
909 }
910
911 static bool IsPhiOpcode(Value value) {
912 return value == kPhi || value == kEffectPhi;
913 }
914
915 static bool IsMergeOpcode(Value value) {
916 return value == kMerge || value == kLoop;
917 }
918
919 static bool IsIfProjectionOpcode(Value value) {
920 return kIfTrue <= value && value <= kIfDefault;
921 }
922
923 // Returns true if opcode terminates control flow in a graph (i.e. respective
924 // nodes are expected to have control uses by the graphs {End} node only).
925 static bool IsGraphTerminator(Value value) {
926 return value == kDeoptimize || value == kReturn || value == kTailCall ||
927 value == kTerminate || value == kThrow;
928 }
929
930 // Returns true if opcode can be inlined.
931 static bool IsInlineeOpcode(Value value) {
932 return value == kJSConstruct || value == kJSCall;
933 }
934
935 // Returns true if opcode for comparison operator.
936 static bool IsComparisonOpcode(Value value) {
937 return (kJSEqual <= value && value <= kJSGreaterThanOrEqual) ||
938 (kNumberEqual <= value && value <= kStringLessThanOrEqual) ||
939 (kWord32Equal <= value && value <= kFloat64LessThanOrEqual);
940 }
941
942 static bool IsContextChainExtendingOpcode(Value value) {
943 return kJSCreateFunctionContext <= value && value <= kJSCreateBlockContext;
944 }
945};
946
947V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&, IrOpcode::Value);
948
949} // namespace compiler
950} // namespace internal
951} // namespace v8
952
953#endif // V8_COMPILER_OPCODES_H_
954