5 #ifndef V8_COMPILER_OPCODES_H_ 6 #define V8_COMPILER_OPCODES_H_ 10 #include "src/globals.h" 13 #define CONTROL_OP_LIST(V) \ 39 #define CONSTANT_OP_LIST(V) \ 48 V(RelocatableInt32Constant) \ 49 V(RelocatableInt64Constant) 51 #define INNER_OP_LIST(V) \ 55 V(InductionVariablePhi) \ 62 V(ArgumentsElementsState) \ 63 V(ArgumentsLengthState) \ 68 V(CallWithCallerSavedRegisters) \ 79 #define COMMON_OP_LIST(V) \ 87 #define JS_COMPARE_BINOP_LIST(V) \ 92 V(JSLessThanOrEqual) \ 93 V(JSGreaterThanOrEqual) 95 #define JS_BITWISE_BINOP_LIST(V) \ 101 V(JSShiftRightLogical) 103 #define JS_ARITH_BINOP_LIST(V) \ 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) \ 117 V(JSOrdinaryHasInstance) 119 #define JS_CONVERSION_UNOP_LIST(V) \ 123 V(JSToNumberConvertBigInt) \ 129 #define JS_SIMPLE_UNOP_LIST(V) \ 130 JS_CONVERSION_UNOP_LIST(V) \ 136 #define JS_CREATE_OP_LIST(V) \ 138 V(JSCreateArguments) \ 140 V(JSCreateArrayIterator) \ 141 V(JSCreateAsyncFunctionObject) \ 142 V(JSCreateBoundFunction) \ 144 V(JSCreateCollectionIterator) \ 145 V(JSCreateGeneratorObject) \ 146 V(JSCreateIterResultObject) \ 147 V(JSCreateStringIterator) \ 148 V(JSCreateKeyValueArray) \ 151 V(JSCreateTypedArray) \ 152 V(JSCreateLiteralArray) \ 153 V(JSCreateEmptyLiteralArray) \ 154 V(JSCreateArrayFromIterable) \ 155 V(JSCreateLiteralObject) \ 156 V(JSCreateEmptyLiteralObject) \ 158 V(JSCreateLiteralRegExp) 160 #define JS_OBJECT_OP_LIST(V) \ 161 JS_CREATE_OP_LIST(V) \ 169 V(JSStoreDataPropertyInLiteral) \ 170 V(JSStoreInArrayLiteral) \ 171 V(JSDeleteProperty) \ 173 V(JSGetSuperConstructor) 175 #define JS_CONTEXT_OP_LIST(V) \ 178 V(JSCreateFunctionContext) \ 179 V(JSCreateCatchContext) \ 180 V(JSCreateWithContext) \ 181 V(JSCreateBlockContext) 183 #define JS_CALL_OP_LIST(V) \ 185 V(JSCallForwardVarargs) \ 186 V(JSCallWithArrayLike) \ 189 #define JS_CONSTRUCT_OP_LIST(V) \ 190 V(JSConstructForwardVarargs) \ 192 V(JSConstructWithArrayLike) \ 193 V(JSConstructWithSpread) 195 #define JS_OTHER_OP_LIST(V) \ 197 JS_CONSTRUCT_OP_LIST(V) \ 198 V(JSAsyncFunctionEnter) \ 199 V(JSAsyncFunctionReject) \ 200 V(JSAsyncFunctionResolve) \ 202 V(JSForInEnumerate) \ 209 V(JSGeneratorStore) \ 210 V(JSGeneratorRestoreContinuation) \ 211 V(JSGeneratorRestoreContext) \ 212 V(JSGeneratorRestoreRegister) \ 213 V(JSGeneratorRestoreInputOrDebugPos) \ 214 V(JSFulfillPromise) \ 215 V(JSPerformPromiseThen) \ 216 V(JSPromiseResolve) \ 218 V(JSResolvePromise) \ 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) \ 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(ChangeInt31ToTaggedSigned) \ 241 V(ChangeInt32ToTagged) \ 242 V(ChangeInt64ToTagged) \ 243 V(ChangeUint32ToTagged) \ 244 V(ChangeUint64ToTagged) \ 245 V(ChangeFloat64ToTagged) \ 246 V(ChangeFloat64ToTaggedPointer) \ 247 V(ChangeTaggedToBit) \ 248 V(ChangeBitToTagged) \ 249 V(TruncateTaggedToWord32) \ 250 V(TruncateTaggedToFloat64) \ 251 V(TruncateTaggedToBit) \ 252 V(TruncateTaggedPointerToBit) 254 #define SIMPLIFIED_CHECKED_OP_LIST(V) \ 259 V(CheckedUint32Div) \ 260 V(CheckedUint32Mod) \ 262 V(CheckedInt32ToTaggedSigned) \ 263 V(CheckedInt64ToInt32) \ 264 V(CheckedInt64ToTaggedSigned) \ 265 V(CheckedUint32Bounds) \ 266 V(CheckedUint32ToInt32) \ 267 V(CheckedUint32ToTaggedSigned) \ 268 V(CheckedUint64Bounds) \ 269 V(CheckedUint64ToInt32) \ 270 V(CheckedUint64ToTaggedSigned) \ 271 V(CheckedFloat64ToInt32) \ 272 V(CheckedFloat64ToInt64) \ 273 V(CheckedTaggedSignedToInt32) \ 274 V(CheckedTaggedToInt32) \ 275 V(CheckedTruncateTaggedToWord32) \ 276 V(CheckedTaggedToFloat64) \ 277 V(CheckedTaggedToInt64) \ 278 V(CheckedTaggedToTaggedSigned) \ 279 V(CheckedTaggedToTaggedPointer) 281 #define SIMPLIFIED_COMPARE_BINOP_LIST(V) \ 284 V(NumberLessThanOrEqual) \ 285 V(SpeculativeNumberEqual) \ 286 V(SpeculativeNumberLessThan) \ 287 V(SpeculativeNumberLessThanOrEqual) \ 292 V(StringLessThanOrEqual) 294 #define SIMPLIFIED_NUMBER_BINOP_LIST(V) \ 301 V(NumberBitwiseXor) \ 302 V(NumberBitwiseAnd) \ 304 V(NumberShiftRight) \ 305 V(NumberShiftRightLogical) \ 312 #define SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(V) \ 313 V(SpeculativeNumberAdd) \ 314 V(SpeculativeNumberSubtract) \ 315 V(SpeculativeNumberMultiply) \ 316 V(SpeculativeNumberDivide) \ 317 V(SpeculativeNumberModulus) \ 318 V(SpeculativeNumberBitwiseAnd) \ 319 V(SpeculativeNumberBitwiseOr) \ 320 V(SpeculativeNumberBitwiseXor) \ 321 V(SpeculativeNumberShiftLeft) \ 322 V(SpeculativeNumberShiftRight) \ 323 V(SpeculativeNumberShiftRightLogical) \ 324 V(SpeculativeSafeIntegerAdd) \ 325 V(SpeculativeSafeIntegerSubtract) 327 #define SIMPLIFIED_NUMBER_UNOP_LIST(V) \ 360 V(NumberToUint8Clamped) \ 363 #define SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(V) V(SpeculativeToNumber) 365 #define SIMPLIFIED_OTHER_OP_LIST(V) \ 366 V(PlainPrimitiveToNumber) \ 367 V(PlainPrimitiveToWord32) \ 368 V(PlainPrimitiveToFloat64) \ 372 V(StringCharCodeAt) \ 373 V(StringCodePointAt) \ 374 V(StringFromSingleCharCode) \ 375 V(StringFromSingleCodePoint) \ 378 V(StringToLowerCaseIntl) \ 379 V(StringToUpperCaseIntl) \ 385 V(CheckInternalizedString) \ 387 V(CheckReceiverOrNullOrUndefined) \ 392 V(CheckFloat64Hole) \ 393 V(CheckNotTaggedHole) \ 394 V(CheckEqualsInternalizedString) \ 395 V(CheckEqualsSymbol) \ 398 V(ConvertTaggedHoleToUndefined) \ 402 V(LoadFieldByIndex) \ 405 V(LoadTypedElement) \ 406 V(LoadDataViewElement) \ 409 V(StoreTypedElement) \ 410 V(StoreDataViewElement) \ 411 V(StoreSignedSmallElement) \ 412 V(TransitionAndStoreElement) \ 413 V(TransitionAndStoreNumberElement) \ 414 V(TransitionAndStoreNonNumberElement) \ 416 V(NumberIsFloat64Hole) \ 418 V(ObjectIsFiniteNumber) \ 420 V(ObjectIsSafeInteger) \ 421 V(NumberIsSafeInteger) \ 423 V(ObjectIsArrayBufferView) \ 425 V(ObjectIsCallable) \ 426 V(ObjectIsConstructor) \ 427 V(ObjectIsDetectableCallable) \ 428 V(ObjectIsMinusZero) \ 429 V(NumberIsMinusZero) \ 432 V(ObjectIsNonCallable) \ 434 V(ObjectIsReceiver) \ 438 V(ObjectIsUndetectable) \ 441 V(NewDoubleElements) \ 442 V(NewSmiOrObjectElements) \ 443 V(NewArgumentsElements) \ 445 V(DelayedStringConstant) \ 446 V(EnsureWritableFastElements) \ 447 V(MaybeGrowFastElements) \ 448 V(TransitionElementsKind) \ 449 V(FindOrderedHashMapEntry) \ 450 V(FindOrderedHashMapEntryForInt32Key) \ 455 #define SIMPLIFIED_OP_LIST(V) \ 456 SIMPLIFIED_CHANGE_OP_LIST(V) \ 457 SIMPLIFIED_CHECKED_OP_LIST(V) \ 458 SIMPLIFIED_COMPARE_BINOP_LIST(V) \ 459 SIMPLIFIED_NUMBER_BINOP_LIST(V) \ 460 SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(V) \ 461 SIMPLIFIED_NUMBER_UNOP_LIST(V) \ 462 SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(V) \ 463 SIMPLIFIED_OTHER_OP_LIST(V) 466 #define MACHINE_COMPARE_BINOP_LIST(V) \ 470 V(Int32LessThanOrEqual) \ 472 V(Uint32LessThanOrEqual) \ 474 V(Int64LessThanOrEqual) \ 476 V(Uint64LessThanOrEqual) \ 479 V(Float32LessThanOrEqual) \ 482 V(Float64LessThanOrEqual) 484 #define MACHINE_UNOP_32_LIST(V) \ 487 V(Int32AbsWithOverflow) \ 488 V(Word32ReverseBits) \ 489 V(Word32ReverseBytes) 491 #define MACHINE_BINOP_32_LIST(V) \ 500 V(Int32AddWithOverflow) \ 502 V(Int32SubWithOverflow) \ 504 V(Int32MulWithOverflow) \ 512 #define MACHINE_BINOP_64_LIST(V) \ 521 V(Int64AddWithOverflow) \ 523 V(Int64SubWithOverflow) \ 530 #define MACHINE_FLOAT32_UNOP_LIST(V) \ 533 V(Float32RoundDown) \ 534 V(Float32RoundTiesEven) \ 535 V(Float32RoundTruncate) \ 539 #define MACHINE_FLOAT32_BINOP_LIST(V) \ 547 #define MACHINE_FLOAT64_UNOP_LIST(V) \ 565 V(Float64RoundDown) \ 566 V(Float64RoundTiesAway) \ 567 V(Float64RoundTiesEven) \ 568 V(Float64RoundTruncate) \ 576 #define MACHINE_FLOAT64_BINOP_LIST(V) \ 587 #define MACHINE_WORD64_ATOMIC_OP_LIST(V) \ 588 V(Word64AtomicLoad) \ 589 V(Word64AtomicStore) \ 595 V(Word64AtomicExchange) \ 596 V(Word64AtomicCompareExchange) 598 #define MACHINE_OP_LIST(V) \ 599 MACHINE_UNOP_32_LIST(V) \ 600 MACHINE_BINOP_32_LIST(V) \ 601 MACHINE_BINOP_64_LIST(V) \ 602 MACHINE_COMPARE_BINOP_LIST(V) \ 603 MACHINE_FLOAT32_BINOP_LIST(V) \ 604 MACHINE_FLOAT32_UNOP_LIST(V) \ 605 MACHINE_FLOAT64_BINOP_LIST(V) \ 606 MACHINE_FLOAT64_UNOP_LIST(V) \ 607 MACHINE_WORD64_ATOMIC_OP_LIST(V) \ 619 V(Word64ReverseBits) \ 620 V(Word64ReverseBytes) \ 621 V(Int64AbsWithOverflow) \ 622 V(BitcastTaggedToWord) \ 623 V(BitcastWordToTagged) \ 624 V(BitcastWordToTaggedSigned) \ 625 V(TruncateFloat64ToWord32) \ 626 V(ChangeFloat32ToFloat64) \ 627 V(ChangeFloat64ToInt32) \ 628 V(ChangeFloat64ToInt64) \ 629 V(ChangeFloat64ToUint32) \ 630 V(ChangeFloat64ToUint64) \ 631 V(Float64SilenceNaN) \ 632 V(TruncateFloat64ToInt64) \ 633 V(TruncateFloat64ToUint32) \ 634 V(TruncateFloat32ToInt32) \ 635 V(TruncateFloat32ToUint32) \ 636 V(TryTruncateFloat32ToInt64) \ 637 V(TryTruncateFloat64ToInt64) \ 638 V(TryTruncateFloat32ToUint64) \ 639 V(TryTruncateFloat64ToUint64) \ 640 V(ChangeInt32ToFloat64) \ 641 V(ChangeInt32ToInt64) \ 642 V(ChangeInt64ToFloat64) \ 643 V(ChangeUint32ToFloat64) \ 644 V(ChangeUint32ToUint64) \ 645 V(TruncateFloat64ToFloat32) \ 646 V(TruncateInt64ToInt32) \ 647 V(RoundFloat64ToInt32) \ 648 V(RoundInt32ToFloat32) \ 649 V(RoundInt64ToFloat32) \ 650 V(RoundInt64ToFloat64) \ 651 V(RoundUint32ToFloat32) \ 652 V(RoundUint64ToFloat32) \ 653 V(RoundUint64ToFloat64) \ 654 V(BitcastFloat32ToInt32) \ 655 V(BitcastFloat64ToInt64) \ 656 V(BitcastInt32ToFloat32) \ 657 V(BitcastInt64ToFloat64) \ 658 V(Float64ExtractLowWord32) \ 659 V(Float64ExtractHighWord32) \ 660 V(Float64InsertLowWord32) \ 661 V(Float64InsertHighWord32) \ 662 V(TaggedPoisonOnSpeculation) \ 663 V(Word32PoisonOnSpeculation) \ 664 V(Word64PoisonOnSpeculation) \ 665 V(LoadStackPointer) \ 666 V(LoadFramePointer) \ 667 V(LoadParentFramePointer) \ 678 V(Word32AtomicLoad) \ 679 V(Word32AtomicStore) \ 680 V(Word32AtomicExchange) \ 681 V(Word32AtomicCompareExchange) \ 687 V(Word32AtomicPairLoad) \ 688 V(Word32AtomicPairStore) \ 689 V(Word32AtomicPairAdd) \ 690 V(Word32AtomicPairSub) \ 691 V(Word32AtomicPairAnd) \ 692 V(Word32AtomicPairOr) \ 693 V(Word32AtomicPairXor) \ 694 V(Word32AtomicPairExchange) \ 695 V(Word32AtomicPairCompareExchange) \ 696 V(SpeculationFence) \ 697 V(SignExtendWord8ToInt32) \ 698 V(SignExtendWord16ToInt32) \ 699 V(SignExtendWord8ToInt64) \ 700 V(SignExtendWord16ToInt64) \ 701 V(SignExtendWord32ToInt64) \ 704 #define MACHINE_SIMD_OP_LIST(V) \ 706 V(F32x4ExtractLane) \ 707 V(F32x4ReplaceLane) \ 708 V(F32x4SConvertI32x4) \ 709 V(F32x4UConvertI32x4) \ 712 V(F32x4RecipApprox) \ 713 V(F32x4RecipSqrtApprox) \ 727 V(I32x4ExtractLane) \ 728 V(I32x4ReplaceLane) \ 729 V(I32x4SConvertF32x4) \ 730 V(I32x4SConvertI16x8Low) \ 731 V(I32x4SConvertI16x8High) \ 747 V(I32x4UConvertF32x4) \ 748 V(I32x4UConvertI16x8Low) \ 749 V(I32x4UConvertI16x8High) \ 758 V(I16x8ExtractLane) \ 759 V(I16x8ReplaceLane) \ 760 V(I16x8SConvertI8x16Low) \ 761 V(I16x8SConvertI8x16High) \ 765 V(I16x8SConvertI32x4) \ 767 V(I16x8AddSaturateS) \ 770 V(I16x8SubSaturateS) \ 780 V(I16x8UConvertI8x16Low) \ 781 V(I16x8UConvertI8x16High) \ 783 V(I16x8UConvertI32x4) \ 784 V(I16x8AddSaturateU) \ 785 V(I16x8SubSaturateU) \ 793 V(I8x16ExtractLane) \ 794 V(I8x16ReplaceLane) \ 795 V(I8x16SConvertI16x8) \ 800 V(I8x16AddSaturateS) \ 802 V(I8x16SubSaturateS) \ 812 V(I8x16UConvertI16x8) \ 813 V(I8x16AddSaturateU) \ 814 V(I8x16SubSaturateU) \ 838 #define VALUE_OP_LIST(V) \ 840 SIMPLIFIED_OP_LIST(V) \ 842 MACHINE_SIMD_OP_LIST(V) \ 846 #define ALL_OP_LIST(V) \ 859 #define DECLARE_OPCODE(x) k##x, 860 ALL_OP_LIST(DECLARE_OPCODE)
861 #undef DECLARE_OPCODE 863 #define COUNT_OPCODE(x) +1 864 ALL_OP_LIST(COUNT_OPCODE)
869 static char const* Mnemonic(Value value);
872 static bool IsCommonOpcode(Value value) {
873 return kStart <= value && value <= kDead;
877 static bool IsControlOpcode(Value value) {
878 return kStart <= value && value <= kEnd;
882 static bool IsJsOpcode(Value value) {
883 return kJSEqual <= value && value <= kJSDebugger;
887 static bool IsConstantOpcode(Value value) {
888 return kInt32Constant <= value && value <= kRelocatableInt64Constant;
891 static bool IsPhiOpcode(Value value) {
892 return value == kPhi || value == kEffectPhi;
895 static bool IsMergeOpcode(Value value) {
896 return value == kMerge || value == kLoop;
899 static bool IsIfProjectionOpcode(Value value) {
900 return kIfTrue <= value && value <= kIfDefault;
905 static bool IsGraphTerminator(Value value) {
906 return value == kDeoptimize || value == kReturn || value == kTailCall ||
907 value == kTerminate || value == kThrow;
911 static bool IsInlineeOpcode(Value value) {
912 return value == kJSConstruct || value == kJSCall;
916 static bool IsComparisonOpcode(Value value) {
917 return (kJSEqual <= value && value <= kJSGreaterThanOrEqual) ||
918 (kNumberEqual <= value && value <= kStringLessThanOrEqual) ||
919 (kWord32Equal <= value && value <= kFloat64LessThanOrEqual);
922 static bool IsContextChainExtendingOpcode(Value value) {
923 return kJSCreateFunctionContext <= value && value <= kJSCreateBlockContext;
927 V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&, IrOpcode::Value);
933 #endif // V8_COMPILER_OPCODES_H_