2659 case Opcode::kBranch:
2661 case Opcode::kReturn:
2662 case Opcode::kTailCall:
2663 case Opcode::kUnreachable:
2664 case Opcode::kDeoptimize:
2665 case Opcode::kSwitch:
2666 case Opcode::kCheckException:
2670 case Opcode::kParameter: {
2678 case Opcode::kChange: {
2681 switch (change.
kind) {
2682 case ChangeOp::Kind::kFloatConversion:
2683 if (change.
from == Rep::Float64()) {
2685 return VisitTruncateFloat64ToFloat32(node);
2689 return VisitChangeFloat32ToFloat64(node);
2691 case ChangeOp::Kind::kSignedFloatTruncateOverflowToMin:
2692 case ChangeOp::Kind::kUnsignedFloatTruncateOverflowToMin: {
2695 change.
kind == ChangeOp::Kind::kSignedFloatTruncateOverflowToMin;
2697 case multi(Rep::Float32(), Rep::Word32(),
true, A::kNoOverflow):
2698 case multi(Rep::Float32(), Rep::Word32(),
true, A::kNoAssumption):
2699 return VisitTruncateFloat32ToInt32(node);
2700 case multi(Rep::Float32(), Rep::Word32(),
false, A::kNoOverflow):
2701 case multi(Rep::Float32(), Rep::Word32(),
false, A::kNoAssumption):
2702 return VisitTruncateFloat32ToUint32(node);
2703 case multi(Rep::Float64(), Rep::Word32(),
true, A::kReversible):
2704 return VisitChangeFloat64ToInt32(node);
2705 case multi(Rep::Float64(), Rep::Word32(),
false, A::kReversible):
2706 return VisitChangeFloat64ToUint32(node);
2707 case multi(Rep::Float64(), Rep::Word32(),
true, A::kNoOverflow):
2708 return VisitRoundFloat64ToInt32(node);
2709 case multi(Rep::Float64(), Rep::Word32(),
false, A::kNoAssumption):
2710 case multi(Rep::Float64(), Rep::Word32(),
false, A::kNoOverflow):
2711 return VisitTruncateFloat64ToUint32(node);
2712 case multi(Rep::Float64(), Rep::Word64(),
true, A::kReversible):
2713 return VisitChangeFloat64ToInt64(node);
2714 case multi(Rep::Float64(), Rep::Word64(),
false, A::kReversible):
2715 return VisitChangeFloat64ToUint64(node);
2716 case multi(Rep::Float64(), Rep::Word64(),
true, A::kNoOverflow):
2717 case multi(Rep::Float64(), Rep::Word64(),
true, A::kNoAssumption):
2718 return VisitTruncateFloat64ToInt64(node);
2726 case ChangeOp::Kind::kJSFloatTruncate:
2729 return VisitTruncateFloat64ToWord32(node);
2730 case ChangeOp::Kind::kJSFloat16TruncateWithBitcast:
2733 return VisitTruncateFloat64ToFloat16RawBits(node);
2734 case ChangeOp::Kind::kJSFloat16ChangeWithBitcast:
2737 return VisitChangeFloat16RawBitsToFloat64(node);
2738 case ChangeOp::Kind::kSignedToFloat:
2739 if (change.
from == Rep::Word32()) {
2740 if (change.
to == Rep::Float32()) {
2741 return VisitRoundInt32ToFloat32(node);
2745 return VisitChangeInt32ToFloat64(node);
2749 if (change.
to == Rep::Float32()) {
2750 return VisitRoundInt64ToFloat32(node);
2753 if (change.
assumption == ChangeOp::Assumption::kReversible) {
2754 return VisitChangeInt64ToFloat64(node);
2756 return VisitRoundInt64ToFloat64(node);
2761 case ChangeOp::Kind::kUnsignedToFloat:
2763 case multi(Rep::Word32(), Rep::Float32()):
2764 return VisitRoundUint32ToFloat32(node);
2765 case multi(Rep::Word32(), Rep::Float64()):
2766 return VisitChangeUint32ToFloat64(node);
2767 case multi(Rep::Word64(), Rep::Float32()):
2768 return VisitRoundUint64ToFloat32(node);
2769 case multi(Rep::Word64(), Rep::Float64()):
2770 return VisitRoundUint64ToFloat64(node);
2774 case ChangeOp::Kind::kExtractHighHalf:
2777 return VisitFloat64ExtractHighWord32(node);
2778 case ChangeOp::Kind::kExtractLowHalf:
2781 return VisitFloat64ExtractLowWord32(node);
2782 case ChangeOp::Kind::kZeroExtend:
2785 return VisitChangeUint32ToUint64(node);
2786 case ChangeOp::Kind::kSignExtend:
2789 return VisitChangeInt32ToInt64(node);
2790 case ChangeOp::Kind::kTruncate:
2794 return VisitTruncateInt64ToInt32(node);
2795 case ChangeOp::Kind::kBitcast:
2797 case multi(Rep::Word32(), Rep::Word64()):
2798 return VisitBitcastWord32ToWord64(node);
2799 case multi(Rep::Word32(), Rep::Float32()):
2800 return VisitBitcastInt32ToFloat32(node);
2801 case multi(Rep::Word64(), Rep::Float64()):
2802 return VisitBitcastInt64ToFloat64(node);
2803 case multi(Rep::Float32(), Rep::Word32()):
2804 return VisitBitcastFloat32ToInt32(node);
2805 case multi(Rep::Float64(), Rep::Word64()):
2806 return VisitBitcastFloat64ToInt64(node);
2813 case Opcode::kTryChange: {
2817 TryChangeOp::Kind::kSignedFloatTruncateOverflowUndefined ||
2819 TryChangeOp::Kind::kUnsignedFloatTruncateOverflowUndefined);
2822 TryChangeOp::Kind::kSignedFloatTruncateOverflowUndefined;
2824 case multi(Rep::Float64(), Rep::Word64(),
true):
2825 return VisitTryTruncateFloat64ToInt64(node);
2826 case multi(Rep::Float64(), Rep::Word64(),
false):
2827 return VisitTryTruncateFloat64ToUint64(node);
2828 case multi(Rep::Float64(), Rep::Word32(),
true):
2829 return VisitTryTruncateFloat64ToInt32(node);
2830 case multi(Rep::Float64(), Rep::Word32(),
false):
2831 return VisitTryTruncateFloat64ToUint32(node);
2832 case multi(Rep::Float32(), Rep::Word64(),
true):
2833 return VisitTryTruncateFloat32ToInt64(node);
2834 case multi(Rep::Float32(), Rep::Word64(),
false):
2835 return VisitTryTruncateFloat32ToUint64(node);
2841 case Opcode::kConstant: {
2843 switch (constant.kind) {
2844 case ConstantOp::Kind::kWord32:
2845 case ConstantOp::Kind::kWord64:
2846 case ConstantOp::Kind::kSmi:
2847 case ConstantOp::Kind::kTaggedIndex:
2848 case ConstantOp::Kind::kExternal:
2850 case ConstantOp::Kind::kFloat32:
2853 case ConstantOp::Kind::kFloat64:
2856 case ConstantOp::Kind::kHeapObject:
2857 case ConstantOp::Kind::kTrustedHeapObject:
2860 case ConstantOp::Kind::kCompressedHeapObject:
2863 case ConstantOp::Kind::kNumber:
2866 case ConstantOp::Kind::kRelocatableWasmCall:
2867 case ConstantOp::Kind::kRelocatableWasmStubCall:
2868 case ConstantOp::Kind::kRelocatableWasmCanonicalSignatureId:
2869 case ConstantOp::Kind::kRelocatableWasmIndirectCallTarget:
2875 case Opcode::kWordUnary: {
2879 switch (unop.
kind) {
2880 case WordUnaryOp::Kind::kReverseBytes:
2881 return VisitWord32ReverseBytes(node);
2882 case WordUnaryOp::Kind::kCountLeadingZeros:
2883 return VisitWord32Clz(node);
2884 case WordUnaryOp::Kind::kCountTrailingZeros:
2885 return VisitWord32Ctz(node);
2886 case WordUnaryOp::Kind::kPopCount:
2887 return VisitWord32Popcnt(node);
2888 case WordUnaryOp::Kind::kSignExtend8:
2889 return VisitSignExtendWord8ToInt32(node);
2890 case WordUnaryOp::Kind::kSignExtend16:
2891 return VisitSignExtendWord16ToInt32(node);
2896 switch (unop.
kind) {
2897 case WordUnaryOp::Kind::kReverseBytes:
2898 return VisitWord64ReverseBytes(node);
2899 case WordUnaryOp::Kind::kCountLeadingZeros:
2900 return VisitWord64Clz(node);
2901 case WordUnaryOp::Kind::kCountTrailingZeros:
2902 return VisitWord64Ctz(node);
2903 case WordUnaryOp::Kind::kPopCount:
2904 return VisitWord64Popcnt(node);
2905 case WordUnaryOp::Kind::kSignExtend8:
2906 return VisitSignExtendWord8ToInt64(node);
2907 case WordUnaryOp::Kind::kSignExtend16:
2908 return VisitSignExtendWord16ToInt64(node);
2913 case Opcode::kWordBinop: {
2917 switch (binop.
kind) {
2918 case WordBinopOp::Kind::kAdd:
2919 return VisitInt32Add(node);
2920 case WordBinopOp::Kind::kMul:
2921 return VisitInt32Mul(node);
2922 case WordBinopOp::Kind::kSignedMulOverflownBits:
2923 return VisitInt32MulHigh(node);
2924 case WordBinopOp::Kind::kUnsignedMulOverflownBits:
2925 return VisitUint32MulHigh(node);
2926 case WordBinopOp::Kind::kBitwiseAnd:
2927 return VisitWord32And(node);
2928 case WordBinopOp::Kind::kBitwiseOr:
2929 return VisitWord32Or(node);
2930 case WordBinopOp::Kind::kBitwiseXor:
2931 return VisitWord32Xor(node);
2932 case WordBinopOp::Kind::kSub:
2933 return VisitInt32Sub(node);
2934 case WordBinopOp::Kind::kSignedDiv:
2935 return VisitInt32Div(node);
2936 case WordBinopOp::Kind::kUnsignedDiv:
2937 return VisitUint32Div(node);
2938 case WordBinopOp::Kind::kSignedMod:
2939 return VisitInt32Mod(node);
2940 case WordBinopOp::Kind::kUnsignedMod:
2941 return VisitUint32Mod(node);
2946 switch (binop.
kind) {
2947 case WordBinopOp::Kind::kAdd:
2948 return VisitInt64Add(node);
2949 case WordBinopOp::Kind::kMul:
2950 return VisitInt64Mul(node);
2951 case WordBinopOp::Kind::kSignedMulOverflownBits:
2952 return VisitInt64MulHigh(node);
2953 case WordBinopOp::Kind::kUnsignedMulOverflownBits:
2954 return VisitUint64MulHigh(node);
2955 case WordBinopOp::Kind::kBitwiseAnd:
2956 return VisitWord64And(node);
2957 case WordBinopOp::Kind::kBitwiseOr:
2958 return VisitWord64Or(node);
2959 case WordBinopOp::Kind::kBitwiseXor:
2960 return VisitWord64Xor(node);
2961 case WordBinopOp::Kind::kSub:
2962 return VisitInt64Sub(node);
2963 case WordBinopOp::Kind::kSignedDiv:
2964 return VisitInt64Div(node);
2965 case WordBinopOp::Kind::kUnsignedDiv:
2966 return VisitUint64Div(node);
2967 case WordBinopOp::Kind::kSignedMod:
2968 return VisitInt64Mod(node);
2969 case WordBinopOp::Kind::kUnsignedMod:
2970 return VisitUint64Mod(node);
2975 case Opcode::kFloatUnary: {
2977 if (unop.rep == Rep::Float32()) {
2979 switch (unop.kind) {
2980 case FloatUnaryOp::Kind::kAbs:
2981 return VisitFloat32Abs(node);
2982 case FloatUnaryOp::Kind::kNegate:
2983 return VisitFloat32Neg(node);
2984 case FloatUnaryOp::Kind::kRoundDown:
2985 return VisitFloat32RoundDown(node);
2986 case FloatUnaryOp::Kind::kRoundUp:
2987 return VisitFloat32RoundUp(node);
2988 case FloatUnaryOp::Kind::kRoundToZero:
2989 return VisitFloat32RoundTruncate(node);
2990 case FloatUnaryOp::Kind::kRoundTiesEven:
2991 return VisitFloat32RoundTiesEven(node);
2992 case FloatUnaryOp::Kind::kSqrt:
2993 return VisitFloat32Sqrt(node);
2995 case FloatUnaryOp::Kind::kSilenceNaN:
2996 case FloatUnaryOp::Kind::kLog:
2997 case FloatUnaryOp::Kind::kLog2:
2998 case FloatUnaryOp::Kind::kLog10:
2999 case FloatUnaryOp::Kind::kLog1p:
3000 case FloatUnaryOp::Kind::kCbrt:
3001 case FloatUnaryOp::Kind::kExp:
3002 case FloatUnaryOp::Kind::kExpm1:
3003 case FloatUnaryOp::Kind::kSin:
3004 case FloatUnaryOp::Kind::kCos:
3005 case FloatUnaryOp::Kind::kSinh:
3006 case FloatUnaryOp::Kind::kCosh:
3007 case FloatUnaryOp::Kind::kAcos:
3008 case FloatUnaryOp::Kind::kAsin:
3009 case FloatUnaryOp::Kind::kAsinh:
3010 case FloatUnaryOp::Kind::kAcosh:
3011 case FloatUnaryOp::Kind::kTan:
3012 case FloatUnaryOp::Kind::kTanh:
3013 case FloatUnaryOp::Kind::kAtan:
3014 case FloatUnaryOp::Kind::kAtanh:
3020 switch (unop.kind) {
3021 case FloatUnaryOp::Kind::kAbs:
3022 return VisitFloat64Abs(node);
3023 case FloatUnaryOp::Kind::kNegate:
3024 return VisitFloat64Neg(node);
3025 case FloatUnaryOp::Kind::kSilenceNaN:
3026 return VisitFloat64SilenceNaN(node);
3027 case FloatUnaryOp::Kind::kRoundDown:
3028 return VisitFloat64RoundDown(node);
3029 case FloatUnaryOp::Kind::kRoundUp:
3030 return VisitFloat64RoundUp(node);
3031 case FloatUnaryOp::Kind::kRoundToZero:
3032 return VisitFloat64RoundTruncate(node);
3033 case FloatUnaryOp::Kind::kRoundTiesEven:
3034 return VisitFloat64RoundTiesEven(node);
3035 case FloatUnaryOp::Kind::kLog:
3036 return VisitFloat64Log(node);
3037 case FloatUnaryOp::Kind::kLog2:
3038 return VisitFloat64Log2(node);
3039 case FloatUnaryOp::Kind::kLog10:
3040 return VisitFloat64Log10(node);
3041 case FloatUnaryOp::Kind::kLog1p:
3042 return VisitFloat64Log1p(node);
3043 case FloatUnaryOp::Kind::kSqrt:
3044 return VisitFloat64Sqrt(node);
3045 case FloatUnaryOp::Kind::kCbrt:
3046 return VisitFloat64Cbrt(node);
3047 case FloatUnaryOp::Kind::kExp:
3048 return VisitFloat64Exp(node);
3049 case FloatUnaryOp::Kind::kExpm1:
3050 return VisitFloat64Expm1(node);
3051 case FloatUnaryOp::Kind::kSin:
3052 return VisitFloat64Sin(node);
3053 case FloatUnaryOp::Kind::kCos:
3054 return VisitFloat64Cos(node);
3055 case FloatUnaryOp::Kind::kSinh:
3056 return VisitFloat64Sinh(node);
3057 case FloatUnaryOp::Kind::kCosh:
3058 return VisitFloat64Cosh(node);
3059 case FloatUnaryOp::Kind::kAcos:
3060 return VisitFloat64Acos(node);
3061 case FloatUnaryOp::Kind::kAsin:
3062 return VisitFloat64Asin(node);
3063 case FloatUnaryOp::Kind::kAsinh:
3064 return VisitFloat64Asinh(node);
3065 case FloatUnaryOp::Kind::kAcosh:
3066 return VisitFloat64Acosh(node);
3067 case FloatUnaryOp::Kind::kTan:
3068 return VisitFloat64Tan(node);
3069 case FloatUnaryOp::Kind::kTanh:
3070 return VisitFloat64Tanh(node);
3071 case FloatUnaryOp::Kind::kAtan:
3072 return VisitFloat64Atan(node);
3073 case FloatUnaryOp::Kind::kAtanh:
3074 return VisitFloat64Atanh(node);
3079 case Opcode::kFloatBinop: {
3081 if (binop.rep == Rep::Float32()) {
3083 switch (binop.kind) {
3084 case FloatBinopOp::Kind::kAdd:
3085 return VisitFloat32Add(node);
3086 case FloatBinopOp::Kind::kSub:
3087 return VisitFloat32Sub(node);
3088 case FloatBinopOp::Kind::kMul:
3089 return VisitFloat32Mul(node);
3090 case FloatBinopOp::Kind::kDiv:
3091 return VisitFloat32Div(node);
3092 case FloatBinopOp::Kind::kMin:
3093 return VisitFloat32Min(node);
3094 case FloatBinopOp::Kind::kMax:
3095 return VisitFloat32Max(node);
3096 case FloatBinopOp::Kind::kMod:
3097 case FloatBinopOp::Kind::kPower:
3098 case FloatBinopOp::Kind::kAtan2:
3104 switch (binop.kind) {
3105 case FloatBinopOp::Kind::kAdd:
3106 return VisitFloat64Add(node);
3107 case FloatBinopOp::Kind::kSub:
3108 return VisitFloat64Sub(node);
3109 case FloatBinopOp::Kind::kMul:
3110 return VisitFloat64Mul(node);
3111 case FloatBinopOp::Kind::kDiv:
3112 return VisitFloat64Div(node);
3113 case FloatBinopOp::Kind::kMod:
3114 return VisitFloat64Mod(node);
3115 case FloatBinopOp::Kind::kMin:
3116 return VisitFloat64Min(node);
3117 case FloatBinopOp::Kind::kMax:
3118 return VisitFloat64Max(node);
3119 case FloatBinopOp::Kind::kPower:
3120 return VisitFloat64Pow(node);
3121 case FloatBinopOp::Kind::kAtan2:
3122 return VisitFloat64Atan2(node);
3127 case Opcode::kOverflowCheckedBinop: {
3131 switch (binop.kind) {
3132 case OverflowCheckedBinopOp::Kind::kSignedAdd:
3133 return VisitInt32AddWithOverflow(node);
3134 case OverflowCheckedBinopOp::Kind::kSignedMul:
3135 return VisitInt32MulWithOverflow(node);
3136 case OverflowCheckedBinopOp::Kind::kSignedSub:
3137 return VisitInt32SubWithOverflow(node);
3142 switch (binop.kind) {
3143 case OverflowCheckedBinopOp::Kind::kSignedAdd:
3144 return VisitInt64AddWithOverflow(node);
3145 case OverflowCheckedBinopOp::Kind::kSignedMul:
3146 return VisitInt64MulWithOverflow(node);
3147 case OverflowCheckedBinopOp::Kind::kSignedSub:
3148 return VisitInt64SubWithOverflow(node);
3153 case Opcode::kOverflowCheckedUnary: {
3157 switch (unop.kind) {
3158 case OverflowCheckedUnaryOp::Kind::kAbs:
3159 return VisitInt32AbsWithOverflow(node);
3164 switch (unop.kind) {
3165 case OverflowCheckedUnaryOp::Kind::kAbs:
3166 return VisitInt64AbsWithOverflow(node);
3171 case Opcode::kShift: {
3175 switch (shift.kind) {
3176 case ShiftOp::Kind::kShiftRightArithmeticShiftOutZeros:
3177 case ShiftOp::Kind::kShiftRightArithmetic:
3178 return VisitWord32Sar(node);
3179 case ShiftOp::Kind::kShiftRightLogical:
3180 return VisitWord32Shr(node);
3181 case ShiftOp::Kind::kShiftLeft:
3182 return VisitWord32Shl(node);
3183 case ShiftOp::Kind::kRotateRight:
3184 return VisitWord32Ror(node);
3185 case ShiftOp::Kind::kRotateLeft:
3186 return VisitWord32Rol(node);
3191 switch (shift.kind) {
3192 case ShiftOp::Kind::kShiftRightArithmeticShiftOutZeros:
3193 case ShiftOp::Kind::kShiftRightArithmetic:
3194 return VisitWord64Sar(node);
3195 case ShiftOp::Kind::kShiftRightLogical:
3196 return VisitWord64Shr(node);
3197 case ShiftOp::Kind::kShiftLeft:
3198 return VisitWord64Shl(node);
3199 case ShiftOp::Kind::kRotateRight:
3200 return VisitWord64Ror(node);
3201 case ShiftOp::Kind::kRotateLeft:
3202 return VisitWord64Rol(node);
3211 case Opcode::kDidntThrow:
3215 ->LastOperation(*this->turboshaft_graph())
3224 case Opcode::kFrameConstant: {
3228 switch (constant.kind) {
3229 case Kind::kStackCheckOffset:
3232 case Kind::kFramePointer:
3235 case Kind::kParentFramePointer:
3241 case Opcode::kStackPointerGreaterThan:
3243 case Opcode::kComparison: {
3247 case multi(Kind::kEqual, Rep::Word32()):
3248 return VisitWord32Equal(node);
3249 case multi(Kind::kEqual, Rep::Word64()):
3250 return VisitWord64Equal(node);
3251 case multi(Kind::kEqual, Rep::Float32()):
3252 return VisitFloat32Equal(node);
3253 case multi(Kind::kEqual, Rep::Float64()):
3254 return VisitFloat64Equal(node);
3255 case multi(Kind::kEqual, Rep::Tagged()):
3257 return VisitWord64Equal(node);
3259 return VisitWord32Equal(node);
3260 case multi(Kind::kSignedLessThan, Rep::Word32()):
3261 return VisitInt32LessThan(node);
3262 case multi(Kind::kSignedLessThan, Rep::Word64()):
3263 return VisitInt64LessThan(node);
3264 case multi(Kind::kSignedLessThan, Rep::Float32()):
3265 return VisitFloat32LessThan(node);
3266 case multi(Kind::kSignedLessThan, Rep::Float64()):
3267 return VisitFloat64LessThan(node);
3268 case multi(Kind::kSignedLessThanOrEqual, Rep::Word32()):
3269 return VisitInt32LessThanOrEqual(node);
3270 case multi(Kind::kSignedLessThanOrEqual, Rep::Word64()):
3271 return VisitInt64LessThanOrEqual(node);
3272 case multi(Kind::kSignedLessThanOrEqual, Rep::Float32()):
3273 return VisitFloat32LessThanOrEqual(node);
3274 case multi(Kind::kSignedLessThanOrEqual, Rep::Float64()):
3275 return VisitFloat64LessThanOrEqual(node);
3276 case multi(Kind::kUnsignedLessThan, Rep::Word32()):
3277 return VisitUint32LessThan(node);
3278 case multi(Kind::kUnsignedLessThan, Rep::Word64()):
3279 return VisitUint64LessThan(node);
3280 case multi(Kind::kUnsignedLessThanOrEqual, Rep::Word32()):
3281 return VisitUint32LessThanOrEqual(node);
3282 case multi(Kind::kUnsignedLessThanOrEqual, Rep::Word64()):
3283 return VisitUint64LessThanOrEqual(node);
3289 case Opcode::kLoad: {
3293 if (load.kind.maybe_unaligned) {
3294 DCHECK(!load.kind.with_trap_handler);
3300 return VisitUnalignedLoad(node);
3302 }
else if (load.kind.is_atomic) {
3303 if (load.result_rep == Rep::Word32()) {
3304 return VisitWord32AtomicLoad(node);
3306 DCHECK_EQ(load.result_rep, Rep::Word64());
3307 return VisitWord64AtomicLoad(node);
3309 }
else if (load.kind.with_trap_handler) {
3310 DCHECK(!load.kind.maybe_unaligned);
3311 return VisitProtectedLoad(node);
3317 case Opcode::kStore: {
3321 if (store.kind.maybe_unaligned) {
3322 DCHECK(!store.kind.with_trap_handler);
3326 .IsUnalignedStoreSupported(rep)) {
3327 return VisitStore(node);
3329 return VisitUnalignedStore(node);
3331 }
else if (store.kind.is_atomic) {
3332 if (store.stored_rep.SizeInBytes() == 8) {
3333 return VisitWord64AtomicStore(node);
3335 DCHECK_LE(store.stored_rep.SizeInBytes(), 4);
3336 return VisitWord32AtomicStore(node);
3338 }
else if (store.kind.with_trap_handler) {
3339 DCHECK(!store.kind.maybe_unaligned);
3340 return VisitProtectedStore(node);
3342 return VisitStore(node);
3346 case Opcode::kTaggedBitcast: {
3349 case multi(Rep::Tagged(), Rep::Word32()):
3351 if constexpr (
Is64()) {
3354 return VisitBitcastSmiToWord(node);
3356 return VisitBitcastTaggedToWord(node);
3358 case multi(Rep::Tagged(), Rep::Word64()):
3360 return VisitBitcastTaggedToWord(node);
3361 case multi(Rep::Word32(), Rep::Tagged()):
3362 case multi(Rep::Word64(), Rep::Tagged()):
3363 if (
cast.kind == TaggedBitcastOp::Kind::kSmi) {
3368 return VisitBitcastWordToTagged(node);
3370 case multi(Rep::Compressed(), Rep::Word32()):
3372 if (
cast.kind == TaggedBitcastOp::Kind::kSmi) {
3373 return VisitBitcastSmiToWord(node);
3375 return VisitBitcastTaggedToWord(node);
3384 case Opcode::kProjection:
3386 case Opcode::kDeoptimizeIf:
3388#if V8_ENABLE_WEBASSEMBLY
3389 case Opcode::kTrapIf:
3392 case Opcode::kCatchBlockBegin:
3395 case Opcode::kRetain:
3397 case Opcode::kOsrValue:
3400 case Opcode::kStackSlot:
3401 return VisitStackSlot(node);
3402 case Opcode::kFrameState:
3405 case Opcode::kLoadRootRegister:
3406 return VisitLoadRootRegister(node);
3407 case Opcode::kAssumeMap:
3411 case Opcode::kDebugBreak:
3412 return VisitDebugBreak(node);
3413 case Opcode::kAbortCSADcheck:
3414 return VisitAbortCSADcheck(node);
3415 case Opcode::kSelect: {
3423 case Opcode::kWord32PairBinop: {
3427 switch (binop.
kind) {
3428 case Word32PairBinopOp::Kind::kAdd:
3429 return VisitInt32PairAdd(node);
3430 case Word32PairBinopOp::Kind::kSub:
3431 return VisitInt32PairSub(node);
3432 case Word32PairBinopOp::Kind::kMul:
3433 return VisitInt32PairMul(node);
3434 case Word32PairBinopOp::Kind::kShiftLeft:
3435 return VisitWord32PairShl(node);
3436 case Word32PairBinopOp::Kind::kShiftRightLogical:
3437 return VisitWord32PairShr(node);
3438 case Word32PairBinopOp::Kind::kShiftRightArithmetic:
3439 return VisitWord32PairSar(node);
3443 case Opcode::kAtomicWord32Pair: {
3445 if (atomic_op.
kind != AtomicWord32PairOp::Kind::kStore) {
3449 switch (atomic_op.
kind) {
3450 case AtomicWord32PairOp::Kind::kAdd:
3451 return VisitWord32AtomicPairAdd(node);
3452 case AtomicWord32PairOp::Kind::kAnd:
3453 return VisitWord32AtomicPairAnd(node);
3454 case AtomicWord32PairOp::Kind::kCompareExchange:
3455 return VisitWord32AtomicPairCompareExchange(node);
3456 case AtomicWord32PairOp::Kind::kExchange:
3457 return VisitWord32AtomicPairExchange(node);
3458 case AtomicWord32PairOp::Kind::kLoad:
3459 return VisitWord32AtomicPairLoad(node);
3460 case AtomicWord32PairOp::Kind::kOr:
3461 return VisitWord32AtomicPairOr(node);
3462 case AtomicWord32PairOp::Kind::kSub:
3463 return VisitWord32AtomicPairSub(node);
3464 case AtomicWord32PairOp::Kind::kXor:
3465 return VisitWord32AtomicPairXor(node);
3466 case AtomicWord32PairOp::Kind::kStore:
3467 return VisitWord32AtomicPairStore(node);
3470 case Opcode::kBitcastWord32PairToFloat64:
3472 case Opcode::kAtomicRMW: {
3477 switch (atomic_op.
bin_op) {
3478 case AtomicRMWOp::BinOp::kAdd:
3479 return VisitWord32AtomicAdd(node);
3480 case AtomicRMWOp::BinOp::kSub:
3481 return VisitWord32AtomicSub(node);
3482 case AtomicRMWOp::BinOp::kAnd:
3483 return VisitWord32AtomicAnd(node);
3484 case AtomicRMWOp::BinOp::kOr:
3485 return VisitWord32AtomicOr(node);
3486 case AtomicRMWOp::BinOp::kXor:
3487 return VisitWord32AtomicXor(node);
3488 case AtomicRMWOp::BinOp::kExchange:
3489 return VisitWord32AtomicExchange(node);
3490 case AtomicRMWOp::BinOp::kCompareExchange:
3491 return VisitWord32AtomicCompareExchange(node);
3495 switch (atomic_op.
bin_op) {
3496 case AtomicRMWOp::BinOp::kAdd:
3497 return VisitWord64AtomicAdd(node);
3498 case AtomicRMWOp::BinOp::kSub:
3499 return VisitWord64AtomicSub(node);
3500 case AtomicRMWOp::BinOp::kAnd:
3501 return VisitWord64AtomicAnd(node);
3502 case AtomicRMWOp::BinOp::kOr:
3503 return VisitWord64AtomicOr(node);
3504 case AtomicRMWOp::BinOp::kXor:
3505 return VisitWord64AtomicXor(node);
3506 case AtomicRMWOp::BinOp::kExchange:
3507 return VisitWord64AtomicExchange(node);
3508 case AtomicRMWOp::BinOp::kCompareExchange:
3509 return VisitWord64AtomicCompareExchange(node);
3514 case Opcode::kMemoryBarrier:
3515 return VisitMemoryBarrier(node);
3517 case Opcode::kComment:
3518 return VisitComment(node);
3520#ifdef V8_ENABLE_WEBASSEMBLY
3521 case Opcode::kSimd128Constant: {
3522 const Simd128ConstantOp& constant = op.
Cast<Simd128ConstantOp>();
3524 if (constant.IsZero())
return VisitS128Zero(node);
3525 return VisitS128Const(node);
3527 case Opcode::kSimd128Unary: {
3528 const Simd128UnaryOp& unary = op.
Cast<Simd128UnaryOp>();
3530 switch (unary.kind) {
3531#define VISIT_SIMD_UNARY(kind) \
3532 case Simd128UnaryOp::Kind::k##kind: \
3533 return Visit##kind(node);
3534 FOREACH_SIMD_128_UNARY_OPCODE(VISIT_SIMD_UNARY)
3535#undef VISIT_SIMD_UNARY
3538 case Opcode::kSimd128Reduce: {
3539 const Simd128ReduceOp& reduce = op.
Cast<Simd128ReduceOp>();
3541 switch (reduce.kind) {
3542 case Simd128ReduceOp::Kind::kI8x16AddReduce:
3543 return VisitI8x16AddReduce(node);
3544 case Simd128ReduceOp::Kind::kI16x8AddReduce:
3545 return VisitI16x8AddReduce(node);
3546 case Simd128ReduceOp::Kind::kI32x4AddReduce:
3547 return VisitI32x4AddReduce(node);
3548 case Simd128ReduceOp::Kind::kI64x2AddReduce:
3549 return VisitI64x2AddReduce(node);
3550 case Simd128ReduceOp::Kind::kF32x4AddReduce:
3551 return VisitF32x4AddReduce(node);
3552 case Simd128ReduceOp::Kind::kF64x2AddReduce:
3553 return VisitF64x2AddReduce(node);
3556 case Opcode::kSimd128Binop: {
3557 const Simd128BinopOp& binop = op.
Cast<Simd128BinopOp>();
3559 switch (binop.kind) {
3560#define VISIT_SIMD_BINOP(kind) \
3561 case Simd128BinopOp::Kind::k##kind: \
3562 return Visit##kind(node);
3563 FOREACH_SIMD_128_BINARY_OPCODE(VISIT_SIMD_BINOP)
3564#undef VISIT_SIMD_BINOP
3567 case Opcode::kSimd128Shift: {
3568 const Simd128ShiftOp& shift = op.
Cast<Simd128ShiftOp>();
3570 switch (shift.kind) {
3571#define VISIT_SIMD_SHIFT(kind) \
3572 case Simd128ShiftOp::Kind::k##kind: \
3573 return Visit##kind(node);
3574 FOREACH_SIMD_128_SHIFT_OPCODE(VISIT_SIMD_SHIFT)
3575#undef VISIT_SIMD_SHIFT
3578 case Opcode::kSimd128Test: {
3579 const Simd128TestOp& test = op.
Cast<Simd128TestOp>();
3581 switch (test.kind) {
3582#define VISIT_SIMD_TEST(kind) \
3583 case Simd128TestOp::Kind::k##kind: \
3584 return Visit##kind(node);
3585 FOREACH_SIMD_128_TEST_OPCODE(VISIT_SIMD_TEST)
3586#undef VISIT_SIMD_TEST
3589 case Opcode::kSimd128Splat: {
3590 const Simd128SplatOp& splat = op.
Cast<Simd128SplatOp>();
3592 switch (splat.kind) {
3593#define VISIT_SIMD_SPLAT(kind) \
3594 case Simd128SplatOp::Kind::k##kind: \
3595 return Visit##kind##Splat(node);
3596 FOREACH_SIMD_128_SPLAT_OPCODE(VISIT_SIMD_SPLAT)
3597#undef VISIT_SIMD_SPLAT
3600 case Opcode::kSimd128Shuffle: {
3602 const Simd128ShuffleOp& shuffle = op.
Cast<Simd128ShuffleOp>();
3603 switch (shuffle.kind) {
3604 case Simd128ShuffleOp::Kind::kI8x2:
3605 return VisitI8x2Shuffle(node);
3606 case Simd128ShuffleOp::Kind::kI8x4:
3607 return VisitI8x4Shuffle(node);
3608 case Simd128ShuffleOp::Kind::kI8x8:
3609 return VisitI8x8Shuffle(node);
3610 case Simd128ShuffleOp::Kind::kI8x16:
3611 return VisitI8x16Shuffle(node);
3614 case Opcode::kSimd128ReplaceLane: {
3615 const Simd128ReplaceLaneOp& replace = op.
Cast<Simd128ReplaceLaneOp>();
3617 switch (replace.kind) {
3618 case Simd128ReplaceLaneOp::Kind::kI8x16:
3619 return VisitI8x16ReplaceLane(node);
3620 case Simd128ReplaceLaneOp::Kind::kI16x8:
3621 return VisitI16x8ReplaceLane(node);
3622 case Simd128ReplaceLaneOp::Kind::kI32x4:
3623 return VisitI32x4ReplaceLane(node);
3624 case Simd128ReplaceLaneOp::Kind::kI64x2:
3625 return VisitI64x2ReplaceLane(node);
3626 case Simd128ReplaceLaneOp::Kind::kF16x8:
3627 return VisitF16x8ReplaceLane(node);
3628 case Simd128ReplaceLaneOp::Kind::kF32x4:
3629 return VisitF32x4ReplaceLane(node);
3630 case Simd128ReplaceLaneOp::Kind::kF64x2:
3631 return VisitF64x2ReplaceLane(node);
3634 case Opcode::kSimd128ExtractLane: {
3635 const Simd128ExtractLaneOp& extract = op.
Cast<Simd128ExtractLaneOp>();
3636 switch (extract.kind) {
3637 case Simd128ExtractLaneOp::Kind::kI8x16S:
3639 return VisitI8x16ExtractLaneS(node);
3640 case Simd128ExtractLaneOp::Kind::kI8x16U:
3642 return VisitI8x16ExtractLaneU(node);
3643 case Simd128ExtractLaneOp::Kind::kI16x8S:
3645 return VisitI16x8ExtractLaneS(node);
3646 case Simd128ExtractLaneOp::Kind::kI16x8U:
3648 return VisitI16x8ExtractLaneU(node);
3649 case Simd128ExtractLaneOp::Kind::kI32x4:
3651 return VisitI32x4ExtractLane(node);
3652 case Simd128ExtractLaneOp::Kind::kI64x2:
3654 return VisitI64x2ExtractLane(node);
3655 case Simd128ExtractLaneOp::Kind::kF16x8:
3657 return VisitF16x8ExtractLane(node);
3658 case Simd128ExtractLaneOp::Kind::kF32x4:
3660 return VisitF32x4ExtractLane(node);
3661 case Simd128ExtractLaneOp::Kind::kF64x2:
3663 return VisitF64x2ExtractLane(node);
3666 case Opcode::kSimd128LoadTransform:
3669 case Opcode::kSimd128LaneMemory: {
3670 const Simd128LaneMemoryOp& memory = op.
Cast<Simd128LaneMemoryOp>();
3672 if (memory.mode == Simd128LaneMemoryOp::Mode::kLoad) {
3673 return VisitLoadLane(node);
3675 DCHECK_EQ(memory.mode, Simd128LaneMemoryOp::Mode::kStore);
3676 return VisitStoreLane(node);
3679 case Opcode::kSimd128Ternary: {
3680 const Simd128TernaryOp& ternary = op.
Cast<Simd128TernaryOp>();
3682 switch (ternary.kind) {
3683#define VISIT_SIMD_TERNARY(kind) \
3684 case Simd128TernaryOp::Kind::k##kind: \
3685 return Visit##kind(node);
3686 FOREACH_SIMD_128_TERNARY_OPCODE(VISIT_SIMD_TERNARY)
3687#undef VISIT_SIMD_TERNARY
3691#if V8_ENABLE_WASM_DEINTERLEAVED_MEM_OPS
3692 case Opcode::kSimd128LoadPairDeinterleave: {
3699 return VisitSimd128LoadPairDeinterleave(node);
3704#if V8_ENABLE_WASM_SIMD256_REVEC
3705 case Opcode::kSimd256Constant: {
3706 const Simd256ConstantOp& constant = op.
Cast<Simd256ConstantOp>();
3708 if (constant.IsZero())
return VisitS256Zero(node);
3709 return VisitS256Const(node);
3711 case Opcode::kSimd256Extract128Lane: {
3713 return VisitExtractF128(node);
3715 case Opcode::kSimd256LoadTransform: {
3717 return VisitSimd256LoadTransform(node);
3719 case Opcode::kSimd256Unary: {
3720 const Simd256UnaryOp& unary = op.
Cast<Simd256UnaryOp>();
3722 switch (unary.kind) {
3723#define VISIT_SIMD_256_UNARY(kind) \
3724 case Simd256UnaryOp::Kind::k##kind: \
3725 return Visit##kind(node);
3726 FOREACH_SIMD_256_UNARY_OPCODE(VISIT_SIMD_256_UNARY)
3727#undef VISIT_SIMD_256_UNARY
3730 case Opcode::kSimd256Binop: {
3731 const Simd256BinopOp& binop = op.
Cast<Simd256BinopOp>();
3733 switch (binop.kind) {
3734#define VISIT_SIMD_BINOP(kind) \
3735 case Simd256BinopOp::Kind::k##kind: \
3736 return Visit##kind(node);
3737 FOREACH_SIMD_256_BINARY_OPCODE(VISIT_SIMD_BINOP)
3738#undef VISIT_SIMD_BINOP
3741 case Opcode::kSimd256Shift: {
3742 const Simd256ShiftOp& shift = op.
Cast<Simd256ShiftOp>();
3744 switch (shift.kind) {
3745#define VISIT_SIMD_SHIFT(kind) \
3746 case Simd256ShiftOp::Kind::k##kind: \
3747 return Visit##kind(node);
3748 FOREACH_SIMD_256_SHIFT_OPCODE(VISIT_SIMD_SHIFT)
3749#undef VISIT_SIMD_SHIFT
3752 case Opcode::kSimd256Ternary: {
3753 const Simd256TernaryOp& ternary = op.
Cast<Simd256TernaryOp>();
3755 switch (ternary.kind) {
3756#define VISIT_SIMD_256_TERNARY(kind) \
3757 case Simd256TernaryOp::Kind::k##kind: \
3758 return Visit##kind(node);
3759 FOREACH_SIMD_256_TERNARY_OPCODE(VISIT_SIMD_256_TERNARY)
3760#undef VISIT_SIMD_256_UNARY
3763 case Opcode::kSimd256Splat: {
3764 const Simd256SplatOp& splat = op.
Cast<Simd256SplatOp>();
3766 switch (splat.kind) {
3767#define VISIT_SIMD_SPLAT(kind) \
3768 case Simd256SplatOp::Kind::k##kind: \
3769 return Visit##kind##Splat(node);
3770 FOREACH_SIMD_256_SPLAT_OPCODE(VISIT_SIMD_SPLAT)
3771#undef VISIT_SIMD_SPLAT
3774#ifdef V8_TARGET_ARCH_X64
3775 case Opcode::kSimd256Shufd: {
3777 return VisitSimd256Shufd(node);
3779 case Opcode::kSimd256Shufps: {
3781 return VisitSimd256Shufps(node);
3783 case Opcode::kSimd256Unpack: {
3785 return VisitSimd256Unpack(node);
3787 case Opcode::kSimdPack128To256: {
3789 return VisitSimdPack128To256(node);
3794 case Opcode::kLoadStackPointer:
3795 return VisitLoadStackPointer(node);
3797 case Opcode::kSetStackPointer:
3798 return VisitSetStackPointer(node);
3801#define UNREACHABLE_CASE(op) case Opcode::k##op:
3810#undef UNREACHABLE_CASE