1*0b57cec5SDimitry Andric//===-- X86InstrFragmentsSIMD.td - x86 SIMD ISA ------------*- tablegen -*-===// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric// 9*0b57cec5SDimitry Andric// This file provides pattern fragments useful for SIMD instructions. 10*0b57cec5SDimitry Andric// 11*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 14*0b57cec5SDimitry Andric// MMX specific DAG Nodes. 15*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 16*0b57cec5SDimitry Andric 17*0b57cec5SDimitry Andric// Low word of MMX to GPR. 18*0b57cec5SDimitry Andricdef MMX_X86movd2w : SDNode<"X86ISD::MMX_MOVD2W", SDTypeProfile<1, 1, 19*0b57cec5SDimitry Andric [SDTCisVT<0, i32>, SDTCisVT<1, x86mmx>]>>; 20*0b57cec5SDimitry Andric// GPR to low word of MMX. 21*0b57cec5SDimitry Andricdef MMX_X86movw2d : SDNode<"X86ISD::MMX_MOVW2D", SDTypeProfile<1, 1, 22*0b57cec5SDimitry Andric [SDTCisVT<0, x86mmx>, SDTCisVT<1, i32>]>>; 23*0b57cec5SDimitry Andric 24*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 25*0b57cec5SDimitry Andric// MMX Pattern Fragments 26*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 27*0b57cec5SDimitry Andric 28*0b57cec5SDimitry Andricdef load_mmx : PatFrag<(ops node:$ptr), (x86mmx (load node:$ptr))>; 29*0b57cec5SDimitry Andric 30*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 31*0b57cec5SDimitry Andric// SSE specific DAG Nodes. 32*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 33*0b57cec5SDimitry Andric 34*0b57cec5SDimitry Andricdef SDTX86VFCMP : SDTypeProfile<1, 3, [SDTCisFP<0>, SDTCisVec<0>, 35*0b57cec5SDimitry Andric SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, 36*0b57cec5SDimitry Andric SDTCisVT<3, i8>]>; 37*0b57cec5SDimitry Andric 38*0b57cec5SDimitry Andricdef X86fmin : SDNode<"X86ISD::FMIN", SDTFPBinOp>; 39*0b57cec5SDimitry Andricdef X86fmax : SDNode<"X86ISD::FMAX", SDTFPBinOp>; 40*0b57cec5SDimitry Andricdef X86fmins : SDNode<"X86ISD::FMINS", SDTFPBinOp>; 41*0b57cec5SDimitry Andricdef X86fmaxs : SDNode<"X86ISD::FMAXS", SDTFPBinOp>; 42*0b57cec5SDimitry Andric 43*0b57cec5SDimitry Andric// Commutative and Associative FMIN and FMAX. 44*0b57cec5SDimitry Andricdef X86fminc : SDNode<"X86ISD::FMINC", SDTFPBinOp, 45*0b57cec5SDimitry Andric [SDNPCommutative, SDNPAssociative]>; 46*0b57cec5SDimitry Andricdef X86fmaxc : SDNode<"X86ISD::FMAXC", SDTFPBinOp, 47*0b57cec5SDimitry Andric [SDNPCommutative, SDNPAssociative]>; 48*0b57cec5SDimitry Andric 49*0b57cec5SDimitry Andricdef X86fand : SDNode<"X86ISD::FAND", SDTFPBinOp, 50*0b57cec5SDimitry Andric [SDNPCommutative, SDNPAssociative]>; 51*0b57cec5SDimitry Andricdef X86for : SDNode<"X86ISD::FOR", SDTFPBinOp, 52*0b57cec5SDimitry Andric [SDNPCommutative, SDNPAssociative]>; 53*0b57cec5SDimitry Andricdef X86fxor : SDNode<"X86ISD::FXOR", SDTFPBinOp, 54*0b57cec5SDimitry Andric [SDNPCommutative, SDNPAssociative]>; 55*0b57cec5SDimitry Andricdef X86fandn : SDNode<"X86ISD::FANDN", SDTFPBinOp>; 56*0b57cec5SDimitry Andricdef X86frsqrt : SDNode<"X86ISD::FRSQRT", SDTFPUnaryOp>; 57*0b57cec5SDimitry Andricdef X86frcp : SDNode<"X86ISD::FRCP", SDTFPUnaryOp>; 58*0b57cec5SDimitry Andricdef X86fhadd : SDNode<"X86ISD::FHADD", SDTFPBinOp>; 59*0b57cec5SDimitry Andricdef X86fhsub : SDNode<"X86ISD::FHSUB", SDTFPBinOp>; 60*0b57cec5SDimitry Andricdef X86hadd : SDNode<"X86ISD::HADD", SDTIntBinOp>; 61*0b57cec5SDimitry Andricdef X86hsub : SDNode<"X86ISD::HSUB", SDTIntBinOp>; 62*0b57cec5SDimitry Andricdef X86comi : SDNode<"X86ISD::COMI", SDTX86CmpTest>; 63*0b57cec5SDimitry Andricdef X86ucomi : SDNode<"X86ISD::UCOMI", SDTX86CmpTest>; 64*0b57cec5SDimitry Andricdef X86cmps : SDNode<"X86ISD::FSETCC", SDTX86Cmps>; 65*0b57cec5SDimitry Andricdef X86pshufb : SDNode<"X86ISD::PSHUFB", 66*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i8>, SDTCisSameAs<0,1>, 67*0b57cec5SDimitry Andric SDTCisSameAs<0,2>]>>; 68*0b57cec5SDimitry Andricdef X86psadbw : SDNode<"X86ISD::PSADBW", 69*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, 70*0b57cec5SDimitry Andric SDTCVecEltisVT<1, i8>, 71*0b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 72*0b57cec5SDimitry Andric SDTCisSameAs<1,2>]>, [SDNPCommutative]>; 73*0b57cec5SDimitry Andricdef X86dbpsadbw : SDNode<"X86ISD::DBPSADBW", 74*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCVecEltisVT<0, i16>, 75*0b57cec5SDimitry Andric SDTCVecEltisVT<1, i8>, 76*0b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 77*0b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisVT<3, i8>]>>; 78*0b57cec5SDimitry Andricdef X86andnp : SDNode<"X86ISD::ANDNP", 79*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 80*0b57cec5SDimitry Andric SDTCisSameAs<0,2>]>>; 81*0b57cec5SDimitry Andricdef X86multishift : SDNode<"X86ISD::MULTISHIFT", 82*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 83*0b57cec5SDimitry Andric SDTCisSameAs<1,2>]>>; 84*0b57cec5SDimitry Andricdef X86pextrb : SDNode<"X86ISD::PEXTRB", 85*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisVT<1, v16i8>, 86*0b57cec5SDimitry Andric SDTCisPtrTy<2>]>>; 87*0b57cec5SDimitry Andricdef X86pextrw : SDNode<"X86ISD::PEXTRW", 88*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisVT<1, v8i16>, 89*0b57cec5SDimitry Andric SDTCisPtrTy<2>]>>; 90*0b57cec5SDimitry Andricdef X86pinsrb : SDNode<"X86ISD::PINSRB", 91*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, v16i8>, SDTCisSameAs<0,1>, 92*0b57cec5SDimitry Andric SDTCisVT<2, i32>, SDTCisPtrTy<3>]>>; 93*0b57cec5SDimitry Andricdef X86pinsrw : SDNode<"X86ISD::PINSRW", 94*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, v8i16>, SDTCisSameAs<0,1>, 95*0b57cec5SDimitry Andric SDTCisVT<2, i32>, SDTCisPtrTy<3>]>>; 96*0b57cec5SDimitry Andricdef X86insertps : SDNode<"X86ISD::INSERTPS", 97*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, v4f32>, SDTCisSameAs<0,1>, 98*0b57cec5SDimitry Andric SDTCisVT<2, v4f32>, SDTCisVT<3, i8>]>>; 99*0b57cec5SDimitry Andricdef X86vzmovl : SDNode<"X86ISD::VZEXT_MOVL", 100*0b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCisSameAs<0,1>]>>; 101*0b57cec5SDimitry Andric 102*0b57cec5SDimitry Andricdef X86vzld : SDNode<"X86ISD::VZEXT_LOAD", SDTLoad, 103*0b57cec5SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 104*0b57cec5SDimitry Andricdef X86vextractst : SDNode<"X86ISD::VEXTRACT_STORE", SDTStore, 105*0b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 106*0b57cec5SDimitry Andric 107*0b57cec5SDimitry Andricdef SDTVtrunc : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 108*0b57cec5SDimitry Andric SDTCisInt<0>, SDTCisInt<1>, 109*0b57cec5SDimitry Andric SDTCisOpSmallerThanOp<0, 1>]>; 110*0b57cec5SDimitry Andricdef SDTVmtrunc : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisVec<1>, 111*0b57cec5SDimitry Andric SDTCisInt<0>, SDTCisInt<1>, 112*0b57cec5SDimitry Andric SDTCisOpSmallerThanOp<0, 1>, 113*0b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 114*0b57cec5SDimitry Andric SDTCVecEltisVT<3, i1>, 115*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<1, 3>]>; 116*0b57cec5SDimitry Andric 117*0b57cec5SDimitry Andricdef X86vtrunc : SDNode<"X86ISD::VTRUNC", SDTVtrunc>; 118*0b57cec5SDimitry Andricdef X86vtruncs : SDNode<"X86ISD::VTRUNCS", SDTVtrunc>; 119*0b57cec5SDimitry Andricdef X86vtruncus : SDNode<"X86ISD::VTRUNCUS", SDTVtrunc>; 120*0b57cec5SDimitry Andricdef X86vmtrunc : SDNode<"X86ISD::VMTRUNC", SDTVmtrunc>; 121*0b57cec5SDimitry Andricdef X86vmtruncs : SDNode<"X86ISD::VMTRUNCS", SDTVmtrunc>; 122*0b57cec5SDimitry Andricdef X86vmtruncus : SDNode<"X86ISD::VMTRUNCUS", SDTVmtrunc>; 123*0b57cec5SDimitry Andric 124*0b57cec5SDimitry Andricdef X86vfpext : SDNode<"X86ISD::VFPEXT", 125*0b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCVecEltisVT<0, f64>, 126*0b57cec5SDimitry Andric SDTCVecEltisVT<1, f32>, 127*0b57cec5SDimitry Andric SDTCisSameSizeAs<0, 1>]>>; 128*0b57cec5SDimitry Andricdef X86vfpround: SDNode<"X86ISD::VFPROUND", 129*0b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCVecEltisVT<0, f32>, 130*0b57cec5SDimitry Andric SDTCVecEltisVT<1, f64>, 131*0b57cec5SDimitry Andric SDTCisOpSmallerThanOp<0, 1>]>>; 132*0b57cec5SDimitry Andric 133*0b57cec5SDimitry Andricdef X86frounds : SDNode<"X86ISD::VFPROUNDS", 134*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f32>, 135*0b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 136*0b57cec5SDimitry Andric SDTCVecEltisVT<2, f64>, 137*0b57cec5SDimitry Andric SDTCisSameSizeAs<0, 2>]>>; 138*0b57cec5SDimitry Andric 139*0b57cec5SDimitry Andricdef X86froundsRnd: SDNode<"X86ISD::VFPROUNDS_RND", 140*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCVecEltisVT<0, f32>, 141*0b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 142*0b57cec5SDimitry Andric SDTCVecEltisVT<2, f64>, 143*0b57cec5SDimitry Andric SDTCisSameSizeAs<0, 2>, 144*0b57cec5SDimitry Andric SDTCisVT<3, i32>]>>; 145*0b57cec5SDimitry Andric 146*0b57cec5SDimitry Andricdef X86fpexts : SDNode<"X86ISD::VFPEXTS", 147*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f64>, 148*0b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 149*0b57cec5SDimitry Andric SDTCVecEltisVT<2, f32>, 150*0b57cec5SDimitry Andric SDTCisSameSizeAs<0, 2>]>>; 151*0b57cec5SDimitry Andricdef X86fpextsSAE : SDNode<"X86ISD::VFPEXTS_SAE", 152*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f64>, 153*0b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 154*0b57cec5SDimitry Andric SDTCVecEltisVT<2, f32>, 155*0b57cec5SDimitry Andric SDTCisSameSizeAs<0, 2>]>>; 156*0b57cec5SDimitry Andric 157*0b57cec5SDimitry Andricdef X86vmfpround: SDNode<"X86ISD::VMFPROUND", 158*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCVecEltisVT<0, f32>, 159*0b57cec5SDimitry Andric SDTCVecEltisVT<1, f64>, 160*0b57cec5SDimitry Andric SDTCisSameSizeAs<0, 1>, 161*0b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 162*0b57cec5SDimitry Andric SDTCVecEltisVT<3, i1>, 163*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<1, 3>]>>; 164*0b57cec5SDimitry Andric 165*0b57cec5SDimitry Andricdef X86vshiftimm : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 166*0b57cec5SDimitry Andric SDTCisVT<2, i8>, SDTCisInt<0>]>; 167*0b57cec5SDimitry Andric 168*0b57cec5SDimitry Andricdef X86vshldq : SDNode<"X86ISD::VSHLDQ", X86vshiftimm>; 169*0b57cec5SDimitry Andricdef X86vshrdq : SDNode<"X86ISD::VSRLDQ", X86vshiftimm>; 170*0b57cec5SDimitry Andricdef X86cmpp : SDNode<"X86ISD::CMPP", SDTX86VFCMP>; 171*0b57cec5SDimitry Andricdef X86pcmpeq : SDNode<"X86ISD::PCMPEQ", SDTIntBinOp, [SDNPCommutative]>; 172*0b57cec5SDimitry Andricdef X86pcmpgt : SDNode<"X86ISD::PCMPGT", SDTIntBinOp>; 173*0b57cec5SDimitry Andric 174*0b57cec5SDimitry Andricdef X86CmpMaskCC : 175*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCVecEltisVT<0, i1>, 176*0b57cec5SDimitry Andric SDTCisVec<1>, SDTCisSameAs<2, 1>, 177*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 1>, SDTCisVT<3, i8>]>; 178*0b57cec5SDimitry Andricdef X86CmpMaskCCScalar : 179*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisFP<1>, SDTCisSameAs<1, 2>, 180*0b57cec5SDimitry Andric SDTCisVT<3, i8>]>; 181*0b57cec5SDimitry Andric 182*0b57cec5SDimitry Andricdef X86cmpm : SDNode<"X86ISD::CMPM", X86CmpMaskCC>; 183*0b57cec5SDimitry Andricdef X86cmpmSAE : SDNode<"X86ISD::CMPM_SAE", X86CmpMaskCC>; 184*0b57cec5SDimitry Andricdef X86cmpms : SDNode<"X86ISD::FSETCCM", X86CmpMaskCCScalar>; 185*0b57cec5SDimitry Andricdef X86cmpmsSAE : SDNode<"X86ISD::FSETCCM_SAE", X86CmpMaskCCScalar>; 186*0b57cec5SDimitry Andric 187*0b57cec5SDimitry Andricdef X86phminpos: SDNode<"X86ISD::PHMINPOS", 188*0b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCisVT<0, v8i16>, SDTCisVT<1, v8i16>]>>; 189*0b57cec5SDimitry Andric 190*0b57cec5SDimitry Andricdef X86vshiftuniform : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 191*0b57cec5SDimitry Andric SDTCisVec<2>, SDTCisInt<0>, 192*0b57cec5SDimitry Andric SDTCisInt<2>]>; 193*0b57cec5SDimitry Andric 194*0b57cec5SDimitry Andricdef X86vshl : SDNode<"X86ISD::VSHL", X86vshiftuniform>; 195*0b57cec5SDimitry Andricdef X86vsrl : SDNode<"X86ISD::VSRL", X86vshiftuniform>; 196*0b57cec5SDimitry Andricdef X86vsra : SDNode<"X86ISD::VSRA", X86vshiftuniform>; 197*0b57cec5SDimitry Andric 198*0b57cec5SDimitry Andricdef X86vshiftvariable : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 199*0b57cec5SDimitry Andric SDTCisSameAs<0,2>, SDTCisInt<0>]>; 200*0b57cec5SDimitry Andric 201*0b57cec5SDimitry Andricdef X86vshlv : SDNode<"X86ISD::VSHLV", X86vshiftvariable>; 202*0b57cec5SDimitry Andricdef X86vsrlv : SDNode<"X86ISD::VSRLV", X86vshiftvariable>; 203*0b57cec5SDimitry Andricdef X86vsrav : SDNode<"X86ISD::VSRAV", X86vshiftvariable>; 204*0b57cec5SDimitry Andric 205*0b57cec5SDimitry Andricdef X86vshli : SDNode<"X86ISD::VSHLI", X86vshiftimm>; 206*0b57cec5SDimitry Andricdef X86vsrli : SDNode<"X86ISD::VSRLI", X86vshiftimm>; 207*0b57cec5SDimitry Andricdef X86vsrai : SDNode<"X86ISD::VSRAI", X86vshiftimm>; 208*0b57cec5SDimitry Andric 209*0b57cec5SDimitry Andricdef X86kshiftl : SDNode<"X86ISD::KSHIFTL", 210*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i1>, 211*0b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 212*0b57cec5SDimitry Andric SDTCisVT<2, i8>]>>; 213*0b57cec5SDimitry Andricdef X86kshiftr : SDNode<"X86ISD::KSHIFTR", 214*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i1>, 215*0b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 216*0b57cec5SDimitry Andric SDTCisVT<2, i8>]>>; 217*0b57cec5SDimitry Andric 218*0b57cec5SDimitry Andricdef X86kadd : SDNode<"X86ISD::KADD", SDTIntBinOp, [SDNPCommutative]>; 219*0b57cec5SDimitry Andric 220*0b57cec5SDimitry Andricdef X86vrotli : SDNode<"X86ISD::VROTLI", X86vshiftimm>; 221*0b57cec5SDimitry Andricdef X86vrotri : SDNode<"X86ISD::VROTRI", X86vshiftimm>; 222*0b57cec5SDimitry Andric 223*0b57cec5SDimitry Andricdef X86vpshl : SDNode<"X86ISD::VPSHL", X86vshiftvariable>; 224*0b57cec5SDimitry Andricdef X86vpsha : SDNode<"X86ISD::VPSHA", X86vshiftvariable>; 225*0b57cec5SDimitry Andric 226*0b57cec5SDimitry Andricdef X86vpcom : SDNode<"X86ISD::VPCOM", 227*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 228*0b57cec5SDimitry Andric SDTCisSameAs<0,2>, 229*0b57cec5SDimitry Andric SDTCisVT<3, i8>, SDTCisInt<0>]>>; 230*0b57cec5SDimitry Andricdef X86vpcomu : SDNode<"X86ISD::VPCOMU", 231*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 232*0b57cec5SDimitry Andric SDTCisSameAs<0,2>, 233*0b57cec5SDimitry Andric SDTCisVT<3, i8>, SDTCisInt<0>]>>; 234*0b57cec5SDimitry Andricdef X86vpermil2 : SDNode<"X86ISD::VPERMIL2", 235*0b57cec5SDimitry Andric SDTypeProfile<1, 4, [SDTCisVec<0>, SDTCisSameAs<0,1>, 236*0b57cec5SDimitry Andric SDTCisSameAs<0,2>, 237*0b57cec5SDimitry Andric SDTCisFP<0>, SDTCisInt<3>, 238*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 3>, 239*0b57cec5SDimitry Andric SDTCisSameSizeAs<0,3>, 240*0b57cec5SDimitry Andric SDTCisVT<4, i8>]>>; 241*0b57cec5SDimitry Andricdef X86vpperm : SDNode<"X86ISD::VPPERM", 242*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, v16i8>, SDTCisSameAs<0,1>, 243*0b57cec5SDimitry Andric SDTCisSameAs<0,2>, SDTCisSameAs<0, 3>]>>; 244*0b57cec5SDimitry Andric 245*0b57cec5SDimitry Andricdef SDTX86CmpPTest : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, 246*0b57cec5SDimitry Andric SDTCisVec<1>, 247*0b57cec5SDimitry Andric SDTCisSameAs<2, 1>]>; 248*0b57cec5SDimitry Andric 249*0b57cec5SDimitry Andricdef X86mulhrs : SDNode<"X86ISD::MULHRS", SDTIntBinOp, [SDNPCommutative]>; 250*0b57cec5SDimitry Andricdef X86avg : SDNode<"X86ISD::AVG" , SDTIntBinOp, [SDNPCommutative]>; 251*0b57cec5SDimitry Andricdef X86ptest : SDNode<"X86ISD::PTEST", SDTX86CmpPTest>; 252*0b57cec5SDimitry Andricdef X86testp : SDNode<"X86ISD::TESTP", SDTX86CmpPTest>; 253*0b57cec5SDimitry Andricdef X86kortest : SDNode<"X86ISD::KORTEST", SDTX86CmpPTest>; 254*0b57cec5SDimitry Andricdef X86ktest : SDNode<"X86ISD::KTEST", SDTX86CmpPTest>; 255*0b57cec5SDimitry Andric 256*0b57cec5SDimitry Andricdef X86movmsk : SDNode<"X86ISD::MOVMSK", 257*0b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVec<1>]>>; 258*0b57cec5SDimitry Andric 259*0b57cec5SDimitry Andricdef X86selects : SDNode<"X86ISD::SELECTS", 260*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<1, v1i1>, 261*0b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 262*0b57cec5SDimitry Andric SDTCisSameAs<2, 3>]>>; 263*0b57cec5SDimitry Andric 264*0b57cec5SDimitry Andricdef X86pmuludq : SDNode<"X86ISD::PMULUDQ", 265*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, 266*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, 267*0b57cec5SDimitry Andric SDTCisSameAs<1,2>]>, 268*0b57cec5SDimitry Andric [SDNPCommutative]>; 269*0b57cec5SDimitry Andricdef X86pmuldq : SDNode<"X86ISD::PMULDQ", 270*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, 271*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, 272*0b57cec5SDimitry Andric SDTCisSameAs<1,2>]>, 273*0b57cec5SDimitry Andric [SDNPCommutative]>; 274*0b57cec5SDimitry Andric 275*0b57cec5SDimitry Andricdef X86extrqi : SDNode<"X86ISD::EXTRQI", 276*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, v2i64>, SDTCisSameAs<0,1>, 277*0b57cec5SDimitry Andric SDTCisVT<2, i8>, SDTCisVT<3, i8>]>>; 278*0b57cec5SDimitry Andricdef X86insertqi : SDNode<"X86ISD::INSERTQI", 279*0b57cec5SDimitry Andric SDTypeProfile<1, 4, [SDTCisVT<0, v2i64>, SDTCisSameAs<0,1>, 280*0b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisVT<3, i8>, 281*0b57cec5SDimitry Andric SDTCisVT<4, i8>]>>; 282*0b57cec5SDimitry Andric 283*0b57cec5SDimitry Andric// Specific shuffle nodes - At some point ISD::VECTOR_SHUFFLE will always get 284*0b57cec5SDimitry Andric// translated into one of the target nodes below during lowering. 285*0b57cec5SDimitry Andric// Note: this is a work in progress... 286*0b57cec5SDimitry Andricdef SDTShuff1Op : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisSameAs<0,1>]>; 287*0b57cec5SDimitry Andricdef SDTShuff2Op : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 288*0b57cec5SDimitry Andric SDTCisSameAs<0,2>]>; 289*0b57cec5SDimitry Andricdef SDTShuff2OpFP : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisFP<0>, 290*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisSameAs<0,2>]>; 291*0b57cec5SDimitry Andric 292*0b57cec5SDimitry Andricdef SDTShuff2OpM : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 293*0b57cec5SDimitry Andric SDTCisFP<0>, SDTCisInt<2>, 294*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<0,2>, 295*0b57cec5SDimitry Andric SDTCisSameSizeAs<0,2>]>; 296*0b57cec5SDimitry Andricdef SDTShuff2OpI : SDTypeProfile<1, 2, [SDTCisVec<0>, 297*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisVT<2, i8>]>; 298*0b57cec5SDimitry Andricdef SDTShuff3OpI : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 299*0b57cec5SDimitry Andric SDTCisSameAs<0,2>, SDTCisVT<3, i8>]>; 300*0b57cec5SDimitry Andricdef SDTFPBinOpImm: SDTypeProfile<1, 3, [SDTCisFP<0>, SDTCisVec<0>, 301*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, 302*0b57cec5SDimitry Andric SDTCisSameAs<0,2>, 303*0b57cec5SDimitry Andric SDTCisVT<3, i32>]>; 304*0b57cec5SDimitry Andricdef SDTFPTernaryOpImm: SDTypeProfile<1, 4, [SDTCisFP<0>, SDTCisSameAs<0,1>, 305*0b57cec5SDimitry Andric SDTCisSameAs<0,2>, 306*0b57cec5SDimitry Andric SDTCisInt<3>, 307*0b57cec5SDimitry Andric SDTCisSameSizeAs<0, 3>, 308*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 3>, 309*0b57cec5SDimitry Andric SDTCisVT<4, i32>]>; 310*0b57cec5SDimitry Andricdef SDTFPUnaryOpImm: SDTypeProfile<1, 2, [SDTCisFP<0>, 311*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, 312*0b57cec5SDimitry Andric SDTCisVT<2, i32>]>; 313*0b57cec5SDimitry Andric 314*0b57cec5SDimitry Andricdef SDTVBroadcast : SDTypeProfile<1, 1, [SDTCisVec<0>]>; 315*0b57cec5SDimitry Andricdef SDTVBroadcastm : SDTypeProfile<1, 1, [SDTCisVec<0>, 316*0b57cec5SDimitry Andric SDTCisInt<0>, SDTCisInt<1>]>; 317*0b57cec5SDimitry Andric 318*0b57cec5SDimitry Andricdef SDTBlend : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 319*0b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisVT<3, i8>]>; 320*0b57cec5SDimitry Andric 321*0b57cec5SDimitry Andricdef SDTTernlog : SDTypeProfile<1, 4, [SDTCisInt<0>, SDTCisVec<0>, 322*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisSameAs<0,2>, 323*0b57cec5SDimitry Andric SDTCisSameAs<0,3>, SDTCisVT<4, i8>]>; 324*0b57cec5SDimitry Andric 325*0b57cec5SDimitry Andricdef SDTFPBinOpRound : SDTypeProfile<1, 3, [ // fadd_round, fmul_round, etc. 326*0b57cec5SDimitry Andric SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisFP<0>, SDTCisVT<3, i32>]>; 327*0b57cec5SDimitry Andric 328*0b57cec5SDimitry Andricdef SDTFPUnaryOpRound : SDTypeProfile<1, 2, [ // fsqrt_round, fgetexp_round, etc. 329*0b57cec5SDimitry Andric SDTCisSameAs<0, 1>, SDTCisFP<0>, SDTCisVT<2, i32>]>; 330*0b57cec5SDimitry Andric 331*0b57cec5SDimitry Andricdef SDTFmaRound : SDTypeProfile<1, 4, [SDTCisSameAs<0,1>, 332*0b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisSameAs<1,3>, 333*0b57cec5SDimitry Andric SDTCisFP<0>, SDTCisVT<4, i32>]>; 334*0b57cec5SDimitry Andric 335*0b57cec5SDimitry Andricdef X86PAlignr : SDNode<"X86ISD::PALIGNR", 336*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCVecEltisVT<0, i8>, 337*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, 338*0b57cec5SDimitry Andric SDTCisSameAs<0,2>, 339*0b57cec5SDimitry Andric SDTCisVT<3, i8>]>>; 340*0b57cec5SDimitry Andricdef X86VAlign : SDNode<"X86ISD::VALIGN", SDTShuff3OpI>; 341*0b57cec5SDimitry Andric 342*0b57cec5SDimitry Andricdef X86VShld : SDNode<"X86ISD::VSHLD", SDTShuff3OpI>; 343*0b57cec5SDimitry Andricdef X86VShrd : SDNode<"X86ISD::VSHRD", SDTShuff3OpI>; 344*0b57cec5SDimitry Andricdef X86VShldv : SDNode<"X86ISD::VSHLDV", 345*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, 346*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, 347*0b57cec5SDimitry Andric SDTCisSameAs<0,2>, 348*0b57cec5SDimitry Andric SDTCisSameAs<0,3>]>>; 349*0b57cec5SDimitry Andricdef X86VShrdv : SDNode<"X86ISD::VSHRDV", 350*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, 351*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, 352*0b57cec5SDimitry Andric SDTCisSameAs<0,2>, 353*0b57cec5SDimitry Andric SDTCisSameAs<0,3>]>>; 354*0b57cec5SDimitry Andric 355*0b57cec5SDimitry Andricdef X86Conflict : SDNode<"X86ISD::CONFLICT", SDTIntUnaryOp>; 356*0b57cec5SDimitry Andric 357*0b57cec5SDimitry Andricdef X86PShufd : SDNode<"X86ISD::PSHUFD", SDTShuff2OpI>; 358*0b57cec5SDimitry Andricdef X86PShufhw : SDNode<"X86ISD::PSHUFHW", SDTShuff2OpI>; 359*0b57cec5SDimitry Andricdef X86PShuflw : SDNode<"X86ISD::PSHUFLW", SDTShuff2OpI>; 360*0b57cec5SDimitry Andric 361*0b57cec5SDimitry Andricdef X86Shufp : SDNode<"X86ISD::SHUFP", SDTShuff3OpI>; 362*0b57cec5SDimitry Andricdef X86Shuf128 : SDNode<"X86ISD::SHUF128", SDTShuff3OpI>; 363*0b57cec5SDimitry Andric 364*0b57cec5SDimitry Andricdef X86Movddup : SDNode<"X86ISD::MOVDDUP", SDTShuff1Op>; 365*0b57cec5SDimitry Andricdef X86Movshdup : SDNode<"X86ISD::MOVSHDUP", SDTShuff1Op>; 366*0b57cec5SDimitry Andricdef X86Movsldup : SDNode<"X86ISD::MOVSLDUP", SDTShuff1Op>; 367*0b57cec5SDimitry Andric 368*0b57cec5SDimitry Andricdef X86Movsd : SDNode<"X86ISD::MOVSD", 369*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, v2f64>, 370*0b57cec5SDimitry Andric SDTCisVT<1, v2f64>, 371*0b57cec5SDimitry Andric SDTCisVT<2, v2f64>]>>; 372*0b57cec5SDimitry Andricdef X86Movss : SDNode<"X86ISD::MOVSS", 373*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, v4f32>, 374*0b57cec5SDimitry Andric SDTCisVT<1, v4f32>, 375*0b57cec5SDimitry Andric SDTCisVT<2, v4f32>]>>; 376*0b57cec5SDimitry Andric 377*0b57cec5SDimitry Andricdef X86Movlhps : SDNode<"X86ISD::MOVLHPS", 378*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, v4f32>, 379*0b57cec5SDimitry Andric SDTCisVT<1, v4f32>, 380*0b57cec5SDimitry Andric SDTCisVT<2, v4f32>]>>; 381*0b57cec5SDimitry Andricdef X86Movhlps : SDNode<"X86ISD::MOVHLPS", 382*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, v4f32>, 383*0b57cec5SDimitry Andric SDTCisVT<1, v4f32>, 384*0b57cec5SDimitry Andric SDTCisVT<2, v4f32>]>>; 385*0b57cec5SDimitry Andric 386*0b57cec5SDimitry Andricdef SDTPack : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisInt<0>, 387*0b57cec5SDimitry Andric SDTCisVec<1>, SDTCisInt<1>, 388*0b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 389*0b57cec5SDimitry Andric SDTCisSameAs<1,2>, 390*0b57cec5SDimitry Andric SDTCisOpSmallerThanOp<0, 1>]>; 391*0b57cec5SDimitry Andricdef X86Packss : SDNode<"X86ISD::PACKSS", SDTPack>; 392*0b57cec5SDimitry Andricdef X86Packus : SDNode<"X86ISD::PACKUS", SDTPack>; 393*0b57cec5SDimitry Andric 394*0b57cec5SDimitry Andricdef X86Unpckl : SDNode<"X86ISD::UNPCKL", SDTShuff2Op>; 395*0b57cec5SDimitry Andricdef X86Unpckh : SDNode<"X86ISD::UNPCKH", SDTShuff2Op>; 396*0b57cec5SDimitry Andric 397*0b57cec5SDimitry Andricdef X86vpmaddubsw : SDNode<"X86ISD::VPMADDUBSW", 398*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i16>, 399*0b57cec5SDimitry Andric SDTCVecEltisVT<1, i8>, 400*0b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 401*0b57cec5SDimitry Andric SDTCisSameAs<1,2>]>>; 402*0b57cec5SDimitry Andricdef X86vpmaddwd : SDNode<"X86ISD::VPMADDWD", 403*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i32>, 404*0b57cec5SDimitry Andric SDTCVecEltisVT<1, i16>, 405*0b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 406*0b57cec5SDimitry Andric SDTCisSameAs<1,2>]>, 407*0b57cec5SDimitry Andric [SDNPCommutative]>; 408*0b57cec5SDimitry Andric 409*0b57cec5SDimitry Andricdef X86VPermilpv : SDNode<"X86ISD::VPERMILPV", SDTShuff2OpM>; 410*0b57cec5SDimitry Andricdef X86VPermilpi : SDNode<"X86ISD::VPERMILPI", SDTShuff2OpI>; 411*0b57cec5SDimitry Andricdef X86VPermv : SDNode<"X86ISD::VPERMV", 412*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisInt<1>, 413*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<0,1>, 414*0b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 415*0b57cec5SDimitry Andric SDTCisSameAs<0,2>]>>; 416*0b57cec5SDimitry Andricdef X86VPermi : SDNode<"X86ISD::VPERMI", SDTShuff2OpI>; 417*0b57cec5SDimitry Andricdef X86VPermt2 : SDNode<"X86ISD::VPERMV3", 418*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, 419*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisInt<2>, 420*0b57cec5SDimitry Andric SDTCisVec<2>, SDTCisSameNumEltsAs<0, 2>, 421*0b57cec5SDimitry Andric SDTCisSameSizeAs<0,2>, 422*0b57cec5SDimitry Andric SDTCisSameAs<0,3>]>, []>; 423*0b57cec5SDimitry Andric 424*0b57cec5SDimitry Andricdef X86vpternlog : SDNode<"X86ISD::VPTERNLOG", SDTTernlog>; 425*0b57cec5SDimitry Andric 426*0b57cec5SDimitry Andricdef X86VPerm2x128 : SDNode<"X86ISD::VPERM2X128", SDTShuff3OpI>; 427*0b57cec5SDimitry Andric 428*0b57cec5SDimitry Andricdef X86VFixupimm : SDNode<"X86ISD::VFIXUPIMM", SDTFPTernaryOpImm>; 429*0b57cec5SDimitry Andricdef X86VFixupimmSAE : SDNode<"X86ISD::VFIXUPIMM_SAE", SDTFPTernaryOpImm>; 430*0b57cec5SDimitry Andricdef X86VFixupimms : SDNode<"X86ISD::VFIXUPIMMS", SDTFPTernaryOpImm>; 431*0b57cec5SDimitry Andricdef X86VFixupimmSAEs : SDNode<"X86ISD::VFIXUPIMMS_SAE", SDTFPTernaryOpImm>; 432*0b57cec5SDimitry Andricdef X86VRange : SDNode<"X86ISD::VRANGE", SDTFPBinOpImm>; 433*0b57cec5SDimitry Andricdef X86VRangeSAE : SDNode<"X86ISD::VRANGE_SAE", SDTFPBinOpImm>; 434*0b57cec5SDimitry Andricdef X86VReduce : SDNode<"X86ISD::VREDUCE", SDTFPUnaryOpImm>; 435*0b57cec5SDimitry Andricdef X86VReduceSAE : SDNode<"X86ISD::VREDUCE_SAE", SDTFPUnaryOpImm>; 436*0b57cec5SDimitry Andricdef X86VRndScale : SDNode<"X86ISD::VRNDSCALE", SDTFPUnaryOpImm>; 437*0b57cec5SDimitry Andricdef X86VRndScaleSAE: SDNode<"X86ISD::VRNDSCALE_SAE", SDTFPUnaryOpImm>; 438*0b57cec5SDimitry Andricdef X86VGetMant : SDNode<"X86ISD::VGETMANT", SDTFPUnaryOpImm>; 439*0b57cec5SDimitry Andricdef X86VGetMantSAE : SDNode<"X86ISD::VGETMANT_SAE", SDTFPUnaryOpImm>; 440*0b57cec5SDimitry Andricdef X86Vfpclass : SDNode<"X86ISD::VFPCLASS", 441*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i1>, 442*0b57cec5SDimitry Andric SDTCisFP<1>, 443*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<0,1>, 444*0b57cec5SDimitry Andric SDTCisVT<2, i32>]>, []>; 445*0b57cec5SDimitry Andricdef X86Vfpclasss : SDNode<"X86ISD::VFPCLASSS", 446*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, v1i1>, 447*0b57cec5SDimitry Andric SDTCisFP<1>, SDTCisVT<2, i32>]>,[]>; 448*0b57cec5SDimitry Andric 449*0b57cec5SDimitry Andricdef X86SubVBroadcast : SDNode<"X86ISD::SUBV_BROADCAST", 450*0b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 451*0b57cec5SDimitry Andric SDTCisSubVecOfVec<1, 0>]>, []>; 452*0b57cec5SDimitry Andric 453*0b57cec5SDimitry Andricdef X86VBroadcast : SDNode<"X86ISD::VBROADCAST", SDTVBroadcast>; 454*0b57cec5SDimitry Andricdef X86VBroadcastm : SDNode<"X86ISD::VBROADCASTM", SDTVBroadcastm>; 455*0b57cec5SDimitry Andric 456*0b57cec5SDimitry Andricdef X86Blendi : SDNode<"X86ISD::BLENDI", SDTBlend>; 457*0b57cec5SDimitry Andricdef X86Blendv : SDNode<"X86ISD::BLENDV", 458*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisInt<1>, 459*0b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 460*0b57cec5SDimitry Andric SDTCisSameAs<2, 3>, 461*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 1>, 462*0b57cec5SDimitry Andric SDTCisSameSizeAs<0, 1>]>>; 463*0b57cec5SDimitry Andric 464*0b57cec5SDimitry Andricdef X86Addsub : SDNode<"X86ISD::ADDSUB", SDTFPBinOp>; 465*0b57cec5SDimitry Andric 466*0b57cec5SDimitry Andricdef X86faddRnd : SDNode<"X86ISD::FADD_RND", SDTFPBinOpRound>; 467*0b57cec5SDimitry Andricdef X86fadds : SDNode<"X86ISD::FADDS", SDTFPBinOp>; 468*0b57cec5SDimitry Andricdef X86faddRnds : SDNode<"X86ISD::FADDS_RND", SDTFPBinOpRound>; 469*0b57cec5SDimitry Andricdef X86fsubRnd : SDNode<"X86ISD::FSUB_RND", SDTFPBinOpRound>; 470*0b57cec5SDimitry Andricdef X86fsubs : SDNode<"X86ISD::FSUBS", SDTFPBinOp>; 471*0b57cec5SDimitry Andricdef X86fsubRnds : SDNode<"X86ISD::FSUBS_RND", SDTFPBinOpRound>; 472*0b57cec5SDimitry Andricdef X86fmulRnd : SDNode<"X86ISD::FMUL_RND", SDTFPBinOpRound>; 473*0b57cec5SDimitry Andricdef X86fmuls : SDNode<"X86ISD::FMULS", SDTFPBinOp>; 474*0b57cec5SDimitry Andricdef X86fmulRnds : SDNode<"X86ISD::FMULS_RND", SDTFPBinOpRound>; 475*0b57cec5SDimitry Andricdef X86fdivRnd : SDNode<"X86ISD::FDIV_RND", SDTFPBinOpRound>; 476*0b57cec5SDimitry Andricdef X86fdivs : SDNode<"X86ISD::FDIVS", SDTFPBinOp>; 477*0b57cec5SDimitry Andricdef X86fdivRnds : SDNode<"X86ISD::FDIVS_RND", SDTFPBinOpRound>; 478*0b57cec5SDimitry Andricdef X86fmaxSAE : SDNode<"X86ISD::FMAX_SAE", SDTFPBinOp>; 479*0b57cec5SDimitry Andricdef X86fmaxSAEs : SDNode<"X86ISD::FMAXS_SAE", SDTFPBinOp>; 480*0b57cec5SDimitry Andricdef X86fminSAE : SDNode<"X86ISD::FMIN_SAE", SDTFPBinOp>; 481*0b57cec5SDimitry Andricdef X86fminSAEs : SDNode<"X86ISD::FMINS_SAE", SDTFPBinOp>; 482*0b57cec5SDimitry Andricdef X86scalef : SDNode<"X86ISD::SCALEF", SDTFPBinOp>; 483*0b57cec5SDimitry Andricdef X86scalefRnd : SDNode<"X86ISD::SCALEF_RND", SDTFPBinOpRound>; 484*0b57cec5SDimitry Andricdef X86scalefs : SDNode<"X86ISD::SCALEFS", SDTFPBinOp>; 485*0b57cec5SDimitry Andricdef X86scalefsRnd: SDNode<"X86ISD::SCALEFS_RND", SDTFPBinOpRound>; 486*0b57cec5SDimitry Andricdef X86fsqrtRnd : SDNode<"X86ISD::FSQRT_RND", SDTFPUnaryOpRound>; 487*0b57cec5SDimitry Andricdef X86fsqrts : SDNode<"X86ISD::FSQRTS", SDTFPBinOp>; 488*0b57cec5SDimitry Andricdef X86fsqrtRnds : SDNode<"X86ISD::FSQRTS_RND", SDTFPBinOpRound>; 489*0b57cec5SDimitry Andricdef X86fgetexp : SDNode<"X86ISD::FGETEXP", SDTFPUnaryOp>; 490*0b57cec5SDimitry Andricdef X86fgetexpSAE : SDNode<"X86ISD::FGETEXP_SAE", SDTFPUnaryOp>; 491*0b57cec5SDimitry Andricdef X86fgetexps : SDNode<"X86ISD::FGETEXPS", SDTFPBinOp>; 492*0b57cec5SDimitry Andricdef X86fgetexpSAEs : SDNode<"X86ISD::FGETEXPS_SAE", SDTFPBinOp>; 493*0b57cec5SDimitry Andric 494*0b57cec5SDimitry Andricdef X86Fmadd : SDNode<"ISD::FMA", SDTFPTernaryOp, [SDNPCommutative]>; 495*0b57cec5SDimitry Andricdef X86Fnmadd : SDNode<"X86ISD::FNMADD", SDTFPTernaryOp, [SDNPCommutative]>; 496*0b57cec5SDimitry Andricdef X86Fmsub : SDNode<"X86ISD::FMSUB", SDTFPTernaryOp, [SDNPCommutative]>; 497*0b57cec5SDimitry Andricdef X86Fnmsub : SDNode<"X86ISD::FNMSUB", SDTFPTernaryOp, [SDNPCommutative]>; 498*0b57cec5SDimitry Andricdef X86Fmaddsub : SDNode<"X86ISD::FMADDSUB", SDTFPTernaryOp, [SDNPCommutative]>; 499*0b57cec5SDimitry Andricdef X86Fmsubadd : SDNode<"X86ISD::FMSUBADD", SDTFPTernaryOp, [SDNPCommutative]>; 500*0b57cec5SDimitry Andric 501*0b57cec5SDimitry Andricdef X86FmaddRnd : SDNode<"X86ISD::FMADD_RND", SDTFmaRound, [SDNPCommutative]>; 502*0b57cec5SDimitry Andricdef X86FnmaddRnd : SDNode<"X86ISD::FNMADD_RND", SDTFmaRound, [SDNPCommutative]>; 503*0b57cec5SDimitry Andricdef X86FmsubRnd : SDNode<"X86ISD::FMSUB_RND", SDTFmaRound, [SDNPCommutative]>; 504*0b57cec5SDimitry Andricdef X86FnmsubRnd : SDNode<"X86ISD::FNMSUB_RND", SDTFmaRound, [SDNPCommutative]>; 505*0b57cec5SDimitry Andricdef X86FmaddsubRnd : SDNode<"X86ISD::FMADDSUB_RND", SDTFmaRound, [SDNPCommutative]>; 506*0b57cec5SDimitry Andricdef X86FmsubaddRnd : SDNode<"X86ISD::FMSUBADD_RND", SDTFmaRound, [SDNPCommutative]>; 507*0b57cec5SDimitry Andric 508*0b57cec5SDimitry Andricdef X86vp2intersect : SDNode<"X86ISD::VP2INTERSECT", 509*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, untyped>, 510*0b57cec5SDimitry Andric SDTCisVec<1>, SDTCisSameAs<1, 2>]>>; 511*0b57cec5SDimitry Andric 512*0b57cec5SDimitry Andricdef SDTIFma : SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisSameAs<0,1>, 513*0b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisSameAs<1,3>]>; 514*0b57cec5SDimitry Andricdef x86vpmadd52l : SDNode<"X86ISD::VPMADD52L", SDTIFma, [SDNPCommutative]>; 515*0b57cec5SDimitry Andricdef x86vpmadd52h : SDNode<"X86ISD::VPMADD52H", SDTIFma, [SDNPCommutative]>; 516*0b57cec5SDimitry Andric 517*0b57cec5SDimitry Andricdef X86rsqrt14 : SDNode<"X86ISD::RSQRT14", SDTFPUnaryOp>; 518*0b57cec5SDimitry Andricdef X86rcp14 : SDNode<"X86ISD::RCP14", SDTFPUnaryOp>; 519*0b57cec5SDimitry Andric 520*0b57cec5SDimitry Andric// VNNI 521*0b57cec5SDimitry Andricdef SDTVnni : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 522*0b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisSameAs<1,3>]>; 523*0b57cec5SDimitry Andricdef X86Vpdpbusd : SDNode<"X86ISD::VPDPBUSD", SDTVnni>; 524*0b57cec5SDimitry Andricdef X86Vpdpbusds : SDNode<"X86ISD::VPDPBUSDS", SDTVnni>; 525*0b57cec5SDimitry Andricdef X86Vpdpwssd : SDNode<"X86ISD::VPDPWSSD", SDTVnni>; 526*0b57cec5SDimitry Andricdef X86Vpdpwssds : SDNode<"X86ISD::VPDPWSSDS", SDTVnni>; 527*0b57cec5SDimitry Andric 528*0b57cec5SDimitry Andricdef X86rsqrt28 : SDNode<"X86ISD::RSQRT28", SDTFPUnaryOp>; 529*0b57cec5SDimitry Andricdef X86rsqrt28SAE: SDNode<"X86ISD::RSQRT28_SAE", SDTFPUnaryOp>; 530*0b57cec5SDimitry Andricdef X86rcp28 : SDNode<"X86ISD::RCP28", SDTFPUnaryOp>; 531*0b57cec5SDimitry Andricdef X86rcp28SAE : SDNode<"X86ISD::RCP28_SAE", SDTFPUnaryOp>; 532*0b57cec5SDimitry Andricdef X86exp2 : SDNode<"X86ISD::EXP2", SDTFPUnaryOp>; 533*0b57cec5SDimitry Andricdef X86exp2SAE : SDNode<"X86ISD::EXP2_SAE", SDTFPUnaryOp>; 534*0b57cec5SDimitry Andric 535*0b57cec5SDimitry Andricdef X86rsqrt14s : SDNode<"X86ISD::RSQRT14S", SDTFPBinOp>; 536*0b57cec5SDimitry Andricdef X86rcp14s : SDNode<"X86ISD::RCP14S", SDTFPBinOp>; 537*0b57cec5SDimitry Andricdef X86rsqrt28s : SDNode<"X86ISD::RSQRT28S", SDTFPBinOp>; 538*0b57cec5SDimitry Andricdef X86rsqrt28SAEs : SDNode<"X86ISD::RSQRT28S_SAE", SDTFPBinOp>; 539*0b57cec5SDimitry Andricdef X86rcp28s : SDNode<"X86ISD::RCP28S", SDTFPBinOp>; 540*0b57cec5SDimitry Andricdef X86rcp28SAEs : SDNode<"X86ISD::RCP28S_SAE", SDTFPBinOp>; 541*0b57cec5SDimitry Andricdef X86Ranges : SDNode<"X86ISD::VRANGES", SDTFPBinOpImm>; 542*0b57cec5SDimitry Andricdef X86RndScales : SDNode<"X86ISD::VRNDSCALES", SDTFPBinOpImm>; 543*0b57cec5SDimitry Andricdef X86Reduces : SDNode<"X86ISD::VREDUCES", SDTFPBinOpImm>; 544*0b57cec5SDimitry Andricdef X86GetMants : SDNode<"X86ISD::VGETMANTS", SDTFPBinOpImm>; 545*0b57cec5SDimitry Andricdef X86RangesSAE : SDNode<"X86ISD::VRANGES_SAE", SDTFPBinOpImm>; 546*0b57cec5SDimitry Andricdef X86RndScalesSAE : SDNode<"X86ISD::VRNDSCALES_SAE", SDTFPBinOpImm>; 547*0b57cec5SDimitry Andricdef X86ReducesSAE : SDNode<"X86ISD::VREDUCES_SAE", SDTFPBinOpImm>; 548*0b57cec5SDimitry Andricdef X86GetMantsSAE : SDNode<"X86ISD::VGETMANTS_SAE", SDTFPBinOpImm>; 549*0b57cec5SDimitry Andric 550*0b57cec5SDimitry Andricdef X86compress: SDNode<"X86ISD::COMPRESS", SDTypeProfile<1, 3, 551*0b57cec5SDimitry Andric [SDTCisSameAs<0, 1>, SDTCisVec<1>, 552*0b57cec5SDimitry Andric SDTCisSameAs<0, 2>, SDTCVecEltisVT<3, i1>, 553*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 3>]>, []>; 554*0b57cec5SDimitry Andricdef X86expand : SDNode<"X86ISD::EXPAND", SDTypeProfile<1, 3, 555*0b57cec5SDimitry Andric [SDTCisSameAs<0, 1>, SDTCisVec<1>, 556*0b57cec5SDimitry Andric SDTCisSameAs<0, 2>, SDTCVecEltisVT<3, i1>, 557*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 3>]>, []>; 558*0b57cec5SDimitry Andric 559*0b57cec5SDimitry Andric// vpshufbitqmb 560*0b57cec5SDimitry Andricdef X86Vpshufbitqmb : SDNode<"X86ISD::VPSHUFBITQMB", 561*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 562*0b57cec5SDimitry Andric SDTCisSameAs<1,2>, 563*0b57cec5SDimitry Andric SDTCVecEltisVT<0,i1>, 564*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<0,1>]>>; 565*0b57cec5SDimitry Andric 566*0b57cec5SDimitry Andricdef SDTintToFP: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisFP<0>, 567*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisInt<2>]>; 568*0b57cec5SDimitry Andricdef SDTintToFPRound: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisFP<0>, 569*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisInt<2>, 570*0b57cec5SDimitry Andric SDTCisVT<3, i32>]>; 571*0b57cec5SDimitry Andric 572*0b57cec5SDimitry Andricdef SDTFloatToInt: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 573*0b57cec5SDimitry Andric SDTCisInt<0>, SDTCisFP<1>]>; 574*0b57cec5SDimitry Andricdef SDTFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 575*0b57cec5SDimitry Andric SDTCisInt<0>, SDTCisFP<1>, 576*0b57cec5SDimitry Andric SDTCisVT<2, i32>]>; 577*0b57cec5SDimitry Andricdef SDTSFloatToInt: SDTypeProfile<1, 1, [SDTCisInt<0>, SDTCisFP<1>, 578*0b57cec5SDimitry Andric SDTCisVec<1>]>; 579*0b57cec5SDimitry Andricdef SDTSFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisFP<1>, 580*0b57cec5SDimitry Andric SDTCisVec<1>, SDTCisVT<2, i32>]>; 581*0b57cec5SDimitry Andric 582*0b57cec5SDimitry Andricdef SDTVintToFP: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 583*0b57cec5SDimitry Andric SDTCisFP<0>, SDTCisInt<1>]>; 584*0b57cec5SDimitry Andricdef SDTVintToFPRound: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 585*0b57cec5SDimitry Andric SDTCisFP<0>, SDTCisInt<1>, 586*0b57cec5SDimitry Andric SDTCisVT<2, i32>]>; 587*0b57cec5SDimitry Andric 588*0b57cec5SDimitry Andric// Scalar 589*0b57cec5SDimitry Andricdef X86SintToFp : SDNode<"X86ISD::SCALAR_SINT_TO_FP", SDTintToFP>; 590*0b57cec5SDimitry Andricdef X86SintToFpRnd : SDNode<"X86ISD::SCALAR_SINT_TO_FP_RND", SDTintToFPRound>; 591*0b57cec5SDimitry Andricdef X86UintToFp : SDNode<"X86ISD::SCALAR_UINT_TO_FP", SDTintToFP>; 592*0b57cec5SDimitry Andricdef X86UintToFpRnd : SDNode<"X86ISD::SCALAR_UINT_TO_FP_RND", SDTintToFPRound>; 593*0b57cec5SDimitry Andric 594*0b57cec5SDimitry Andricdef X86cvtts2Int : SDNode<"X86ISD::CVTTS2SI", SDTSFloatToInt>; 595*0b57cec5SDimitry Andricdef X86cvtts2UInt : SDNode<"X86ISD::CVTTS2UI", SDTSFloatToInt>; 596*0b57cec5SDimitry Andricdef X86cvtts2IntSAE : SDNode<"X86ISD::CVTTS2SI_SAE", SDTSFloatToInt>; 597*0b57cec5SDimitry Andricdef X86cvtts2UIntSAE : SDNode<"X86ISD::CVTTS2UI_SAE", SDTSFloatToInt>; 598*0b57cec5SDimitry Andric 599*0b57cec5SDimitry Andricdef X86cvts2si : SDNode<"X86ISD::CVTS2SI", SDTSFloatToInt>; 600*0b57cec5SDimitry Andricdef X86cvts2usi : SDNode<"X86ISD::CVTS2UI", SDTSFloatToInt>; 601*0b57cec5SDimitry Andricdef X86cvts2siRnd : SDNode<"X86ISD::CVTS2SI_RND", SDTSFloatToIntRnd>; 602*0b57cec5SDimitry Andricdef X86cvts2usiRnd : SDNode<"X86ISD::CVTS2UI_RND", SDTSFloatToIntRnd>; 603*0b57cec5SDimitry Andric 604*0b57cec5SDimitry Andric// Vector with rounding mode 605*0b57cec5SDimitry Andric 606*0b57cec5SDimitry Andric// cvtt fp-to-int staff 607*0b57cec5SDimitry Andricdef X86cvttp2siSAE : SDNode<"X86ISD::CVTTP2SI_SAE", SDTFloatToInt>; 608*0b57cec5SDimitry Andricdef X86cvttp2uiSAE : SDNode<"X86ISD::CVTTP2UI_SAE", SDTFloatToInt>; 609*0b57cec5SDimitry Andric 610*0b57cec5SDimitry Andricdef X86VSintToFpRnd : SDNode<"X86ISD::SINT_TO_FP_RND", SDTVintToFPRound>; 611*0b57cec5SDimitry Andricdef X86VUintToFpRnd : SDNode<"X86ISD::UINT_TO_FP_RND", SDTVintToFPRound>; 612*0b57cec5SDimitry Andric 613*0b57cec5SDimitry Andric// cvt fp-to-int staff 614*0b57cec5SDimitry Andricdef X86cvtp2IntRnd : SDNode<"X86ISD::CVTP2SI_RND", SDTFloatToIntRnd>; 615*0b57cec5SDimitry Andricdef X86cvtp2UIntRnd : SDNode<"X86ISD::CVTP2UI_RND", SDTFloatToIntRnd>; 616*0b57cec5SDimitry Andric 617*0b57cec5SDimitry Andric// Vector without rounding mode 618*0b57cec5SDimitry Andric 619*0b57cec5SDimitry Andric// cvtt fp-to-int staff 620*0b57cec5SDimitry Andricdef X86cvttp2si : SDNode<"X86ISD::CVTTP2SI", SDTFloatToInt>; 621*0b57cec5SDimitry Andricdef X86cvttp2ui : SDNode<"X86ISD::CVTTP2UI", SDTFloatToInt>; 622*0b57cec5SDimitry Andric 623*0b57cec5SDimitry Andricdef X86VSintToFP : SDNode<"X86ISD::CVTSI2P", SDTVintToFP>; 624*0b57cec5SDimitry Andricdef X86VUintToFP : SDNode<"X86ISD::CVTUI2P", SDTVintToFP>; 625*0b57cec5SDimitry Andric 626*0b57cec5SDimitry Andric// cvt int-to-fp staff 627*0b57cec5SDimitry Andricdef X86cvtp2Int : SDNode<"X86ISD::CVTP2SI", SDTFloatToInt>; 628*0b57cec5SDimitry Andricdef X86cvtp2UInt : SDNode<"X86ISD::CVTP2UI", SDTFloatToInt>; 629*0b57cec5SDimitry Andric 630*0b57cec5SDimitry Andric 631*0b57cec5SDimitry Andric// Masked versions of above 632*0b57cec5SDimitry Andricdef SDTMVintToFP: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisVec<1>, 633*0b57cec5SDimitry Andric SDTCisFP<0>, SDTCisInt<1>, 634*0b57cec5SDimitry Andric SDTCisSameSizeAs<0, 1>, 635*0b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 636*0b57cec5SDimitry Andric SDTCVecEltisVT<3, i1>, 637*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<1, 3>]>; 638*0b57cec5SDimitry Andricdef SDTMFloatToInt: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisVec<1>, 639*0b57cec5SDimitry Andric SDTCisInt<0>, SDTCisFP<1>, 640*0b57cec5SDimitry Andric SDTCisSameSizeAs<0, 1>, 641*0b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 642*0b57cec5SDimitry Andric SDTCVecEltisVT<3, i1>, 643*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<1, 3>]>; 644*0b57cec5SDimitry Andric 645*0b57cec5SDimitry Andricdef X86VMSintToFP : SDNode<"X86ISD::MCVTSI2P", SDTMVintToFP>; 646*0b57cec5SDimitry Andricdef X86VMUintToFP : SDNode<"X86ISD::MCVTUI2P", SDTMVintToFP>; 647*0b57cec5SDimitry Andric 648*0b57cec5SDimitry Andricdef X86mcvtp2Int : SDNode<"X86ISD::MCVTP2SI", SDTMFloatToInt>; 649*0b57cec5SDimitry Andricdef X86mcvtp2UInt : SDNode<"X86ISD::MCVTP2UI", SDTMFloatToInt>; 650*0b57cec5SDimitry Andricdef X86mcvttp2si : SDNode<"X86ISD::MCVTTP2SI", SDTMFloatToInt>; 651*0b57cec5SDimitry Andricdef X86mcvttp2ui : SDNode<"X86ISD::MCVTTP2UI", SDTMFloatToInt>; 652*0b57cec5SDimitry Andric 653*0b57cec5SDimitry Andric 654*0b57cec5SDimitry Andricdef X86cvtph2ps : SDNode<"X86ISD::CVTPH2PS", 655*0b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCVecEltisVT<0, f32>, 656*0b57cec5SDimitry Andric SDTCVecEltisVT<1, i16>]> >; 657*0b57cec5SDimitry Andric 658*0b57cec5SDimitry Andricdef X86cvtph2psSAE : SDNode<"X86ISD::CVTPH2PS_SAE", 659*0b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCVecEltisVT<0, f32>, 660*0b57cec5SDimitry Andric SDTCVecEltisVT<1, i16>]> >; 661*0b57cec5SDimitry Andric 662*0b57cec5SDimitry Andricdef X86cvtps2ph : SDNode<"X86ISD::CVTPS2PH", 663*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i16>, 664*0b57cec5SDimitry Andric SDTCVecEltisVT<1, f32>, 665*0b57cec5SDimitry Andric SDTCisVT<2, i32>]> >; 666*0b57cec5SDimitry Andricdef X86mcvtps2ph : SDNode<"X86ISD::MCVTPS2PH", 667*0b57cec5SDimitry Andric SDTypeProfile<1, 4, [SDTCVecEltisVT<0, i16>, 668*0b57cec5SDimitry Andric SDTCVecEltisVT<1, f32>, 669*0b57cec5SDimitry Andric SDTCisVT<2, i32>, 670*0b57cec5SDimitry Andric SDTCisSameAs<0, 3>, 671*0b57cec5SDimitry Andric SDTCVecEltisVT<4, i1>, 672*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<1, 4>]> >; 673*0b57cec5SDimitry Andricdef X86vfpextSAE : SDNode<"X86ISD::VFPEXT_SAE", 674*0b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCVecEltisVT<0, f64>, 675*0b57cec5SDimitry Andric SDTCVecEltisVT<1, f32>, 676*0b57cec5SDimitry Andric SDTCisOpSmallerThanOp<1, 0>]>>; 677*0b57cec5SDimitry Andricdef X86vfproundRnd: SDNode<"X86ISD::VFPROUND_RND", 678*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f32>, 679*0b57cec5SDimitry Andric SDTCVecEltisVT<1, f64>, 680*0b57cec5SDimitry Andric SDTCisOpSmallerThanOp<0, 1>, 681*0b57cec5SDimitry Andric SDTCisVT<2, i32>]>>; 682*0b57cec5SDimitry Andric 683*0b57cec5SDimitry Andric// cvt fp to bfloat16 684*0b57cec5SDimitry Andricdef X86cvtne2ps2bf16 : SDNode<"X86ISD::CVTNE2PS2BF16", 685*0b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 686*0b57cec5SDimitry Andric SDTCisSameAs<1,2>]>>; 687*0b57cec5SDimitry Andricdef X86mcvtneps2bf16 : SDNode<"X86ISD::MCVTNEPS2BF16", 688*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCVecEltisVT<0, i16>, 689*0b57cec5SDimitry Andric SDTCVecEltisVT<1, f32>, 690*0b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 691*0b57cec5SDimitry Andric SDTCVecEltisVT<3, i1>, 692*0b57cec5SDimitry Andric SDTCisSameNumEltsAs<1, 3>]>>; 693*0b57cec5SDimitry Andricdef X86cvtneps2bf16 : SDNode<"X86ISD::CVTNEPS2BF16", 694*0b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCVecEltisVT<0, i16>, 695*0b57cec5SDimitry Andric SDTCVecEltisVT<1, f32>]>>; 696*0b57cec5SDimitry Andricdef X86dpbf16ps : SDNode<"X86ISD::DPBF16PS", 697*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCVecEltisVT<0, f32>, 698*0b57cec5SDimitry Andric SDTCisSameAs<0,1>, 699*0b57cec5SDimitry Andric SDTCVecEltisVT<2, i32>, 700*0b57cec5SDimitry Andric SDTCisSameAs<2,3>]>>; 701*0b57cec5SDimitry Andric 702*0b57cec5SDimitry Andric// galois field arithmetic 703*0b57cec5SDimitry Andricdef X86GF2P8affineinvqb : SDNode<"X86ISD::GF2P8AFFINEINVQB", SDTBlend>; 704*0b57cec5SDimitry Andricdef X86GF2P8affineqb : SDNode<"X86ISD::GF2P8AFFINEQB", SDTBlend>; 705*0b57cec5SDimitry Andricdef X86GF2P8mulb : SDNode<"X86ISD::GF2P8MULB", SDTIntBinOp>; 706*0b57cec5SDimitry Andric 707*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 708*0b57cec5SDimitry Andric// SSE Complex Patterns 709*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 710*0b57cec5SDimitry Andric 711*0b57cec5SDimitry Andric// These are 'extloads' from a scalar to the low element of a vector, zeroing 712*0b57cec5SDimitry Andric// the top elements. These are used for the SSE 'ss' and 'sd' instruction 713*0b57cec5SDimitry Andric// forms. 714*0b57cec5SDimitry Andricdef sse_load_f32 : ComplexPattern<v4f32, 5, "selectScalarSSELoad", [], 715*0b57cec5SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand, 716*0b57cec5SDimitry Andric SDNPWantRoot, SDNPWantParent]>; 717*0b57cec5SDimitry Andricdef sse_load_f64 : ComplexPattern<v2f64, 5, "selectScalarSSELoad", [], 718*0b57cec5SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand, 719*0b57cec5SDimitry Andric SDNPWantRoot, SDNPWantParent]>; 720*0b57cec5SDimitry Andric 721*0b57cec5SDimitry Andricdef ssmem : X86MemOperand<"printdwordmem", X86Mem32AsmOperand>; 722*0b57cec5SDimitry Andricdef sdmem : X86MemOperand<"printqwordmem", X86Mem64AsmOperand>; 723*0b57cec5SDimitry Andric 724*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 725*0b57cec5SDimitry Andric// SSE pattern fragments 726*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 727*0b57cec5SDimitry Andric 728*0b57cec5SDimitry Andric// 128-bit load pattern fragments 729*0b57cec5SDimitry Andricdef loadv4f32 : PatFrag<(ops node:$ptr), (v4f32 (load node:$ptr))>; 730*0b57cec5SDimitry Andricdef loadv2f64 : PatFrag<(ops node:$ptr), (v2f64 (load node:$ptr))>; 731*0b57cec5SDimitry Andricdef loadv2i64 : PatFrag<(ops node:$ptr), (v2i64 (load node:$ptr))>; 732*0b57cec5SDimitry Andricdef loadv4i32 : PatFrag<(ops node:$ptr), (v4i32 (load node:$ptr))>; 733*0b57cec5SDimitry Andricdef loadv8i16 : PatFrag<(ops node:$ptr), (v8i16 (load node:$ptr))>; 734*0b57cec5SDimitry Andricdef loadv16i8 : PatFrag<(ops node:$ptr), (v16i8 (load node:$ptr))>; 735*0b57cec5SDimitry Andric 736*0b57cec5SDimitry Andric// 256-bit load pattern fragments 737*0b57cec5SDimitry Andricdef loadv8f32 : PatFrag<(ops node:$ptr), (v8f32 (load node:$ptr))>; 738*0b57cec5SDimitry Andricdef loadv4f64 : PatFrag<(ops node:$ptr), (v4f64 (load node:$ptr))>; 739*0b57cec5SDimitry Andricdef loadv4i64 : PatFrag<(ops node:$ptr), (v4i64 (load node:$ptr))>; 740*0b57cec5SDimitry Andricdef loadv8i32 : PatFrag<(ops node:$ptr), (v8i32 (load node:$ptr))>; 741*0b57cec5SDimitry Andricdef loadv16i16 : PatFrag<(ops node:$ptr), (v16i16 (load node:$ptr))>; 742*0b57cec5SDimitry Andricdef loadv32i8 : PatFrag<(ops node:$ptr), (v32i8 (load node:$ptr))>; 743*0b57cec5SDimitry Andric 744*0b57cec5SDimitry Andric// 512-bit load pattern fragments 745*0b57cec5SDimitry Andricdef loadv16f32 : PatFrag<(ops node:$ptr), (v16f32 (load node:$ptr))>; 746*0b57cec5SDimitry Andricdef loadv8f64 : PatFrag<(ops node:$ptr), (v8f64 (load node:$ptr))>; 747*0b57cec5SDimitry Andricdef loadv8i64 : PatFrag<(ops node:$ptr), (v8i64 (load node:$ptr))>; 748*0b57cec5SDimitry Andricdef loadv16i32 : PatFrag<(ops node:$ptr), (v16i32 (load node:$ptr))>; 749*0b57cec5SDimitry Andricdef loadv32i16 : PatFrag<(ops node:$ptr), (v32i16 (load node:$ptr))>; 750*0b57cec5SDimitry Andricdef loadv64i8 : PatFrag<(ops node:$ptr), (v64i8 (load node:$ptr))>; 751*0b57cec5SDimitry Andric 752*0b57cec5SDimitry Andric// 128-/256-/512-bit extload pattern fragments 753*0b57cec5SDimitry Andricdef extloadv2f32 : PatFrag<(ops node:$ptr), (extloadvf32 node:$ptr)>; 754*0b57cec5SDimitry Andricdef extloadv4f32 : PatFrag<(ops node:$ptr), (extloadvf32 node:$ptr)>; 755*0b57cec5SDimitry Andricdef extloadv8f32 : PatFrag<(ops node:$ptr), (extloadvf32 node:$ptr)>; 756*0b57cec5SDimitry Andric 757*0b57cec5SDimitry Andric// Like 'store', but always requires vector size alignment. 758*0b57cec5SDimitry Andricdef alignedstore : PatFrag<(ops node:$val, node:$ptr), 759*0b57cec5SDimitry Andric (store node:$val, node:$ptr), [{ 760*0b57cec5SDimitry Andric auto *St = cast<StoreSDNode>(N); 761*0b57cec5SDimitry Andric return St->getAlignment() >= St->getMemoryVT().getStoreSize(); 762*0b57cec5SDimitry Andric}]>; 763*0b57cec5SDimitry Andric 764*0b57cec5SDimitry Andric// Like 'load', but always requires vector size alignment. 765*0b57cec5SDimitry Andricdef alignedload : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 766*0b57cec5SDimitry Andric auto *Ld = cast<LoadSDNode>(N); 767*0b57cec5SDimitry Andric return Ld->getAlignment() >= Ld->getMemoryVT().getStoreSize(); 768*0b57cec5SDimitry Andric}]>; 769*0b57cec5SDimitry Andric 770*0b57cec5SDimitry Andric// 128-bit aligned load pattern fragments 771*0b57cec5SDimitry Andric// NOTE: all 128-bit integer vector loads are promoted to v2i64 772*0b57cec5SDimitry Andricdef alignedloadv4f32 : PatFrag<(ops node:$ptr), 773*0b57cec5SDimitry Andric (v4f32 (alignedload node:$ptr))>; 774*0b57cec5SDimitry Andricdef alignedloadv2f64 : PatFrag<(ops node:$ptr), 775*0b57cec5SDimitry Andric (v2f64 (alignedload node:$ptr))>; 776*0b57cec5SDimitry Andricdef alignedloadv2i64 : PatFrag<(ops node:$ptr), 777*0b57cec5SDimitry Andric (v2i64 (alignedload node:$ptr))>; 778*0b57cec5SDimitry Andricdef alignedloadv4i32 : PatFrag<(ops node:$ptr), 779*0b57cec5SDimitry Andric (v4i32 (alignedload node:$ptr))>; 780*0b57cec5SDimitry Andricdef alignedloadv8i16 : PatFrag<(ops node:$ptr), 781*0b57cec5SDimitry Andric (v8i16 (alignedload node:$ptr))>; 782*0b57cec5SDimitry Andricdef alignedloadv16i8 : PatFrag<(ops node:$ptr), 783*0b57cec5SDimitry Andric (v16i8 (alignedload node:$ptr))>; 784*0b57cec5SDimitry Andric 785*0b57cec5SDimitry Andric// 256-bit aligned load pattern fragments 786*0b57cec5SDimitry Andric// NOTE: all 256-bit integer vector loads are promoted to v4i64 787*0b57cec5SDimitry Andricdef alignedloadv8f32 : PatFrag<(ops node:$ptr), 788*0b57cec5SDimitry Andric (v8f32 (alignedload node:$ptr))>; 789*0b57cec5SDimitry Andricdef alignedloadv4f64 : PatFrag<(ops node:$ptr), 790*0b57cec5SDimitry Andric (v4f64 (alignedload node:$ptr))>; 791*0b57cec5SDimitry Andricdef alignedloadv4i64 : PatFrag<(ops node:$ptr), 792*0b57cec5SDimitry Andric (v4i64 (alignedload node:$ptr))>; 793*0b57cec5SDimitry Andricdef alignedloadv8i32 : PatFrag<(ops node:$ptr), 794*0b57cec5SDimitry Andric (v8i32 (alignedload node:$ptr))>; 795*0b57cec5SDimitry Andricdef alignedloadv16i16 : PatFrag<(ops node:$ptr), 796*0b57cec5SDimitry Andric (v16i16 (alignedload node:$ptr))>; 797*0b57cec5SDimitry Andricdef alignedloadv32i8 : PatFrag<(ops node:$ptr), 798*0b57cec5SDimitry Andric (v32i8 (alignedload node:$ptr))>; 799*0b57cec5SDimitry Andric 800*0b57cec5SDimitry Andric// 512-bit aligned load pattern fragments 801*0b57cec5SDimitry Andricdef alignedloadv16f32 : PatFrag<(ops node:$ptr), 802*0b57cec5SDimitry Andric (v16f32 (alignedload node:$ptr))>; 803*0b57cec5SDimitry Andricdef alignedloadv8f64 : PatFrag<(ops node:$ptr), 804*0b57cec5SDimitry Andric (v8f64 (alignedload node:$ptr))>; 805*0b57cec5SDimitry Andricdef alignedloadv8i64 : PatFrag<(ops node:$ptr), 806*0b57cec5SDimitry Andric (v8i64 (alignedload node:$ptr))>; 807*0b57cec5SDimitry Andricdef alignedloadv16i32 : PatFrag<(ops node:$ptr), 808*0b57cec5SDimitry Andric (v16i32 (alignedload node:$ptr))>; 809*0b57cec5SDimitry Andricdef alignedloadv32i16 : PatFrag<(ops node:$ptr), 810*0b57cec5SDimitry Andric (v32i16 (alignedload node:$ptr))>; 811*0b57cec5SDimitry Andricdef alignedloadv64i8 : PatFrag<(ops node:$ptr), 812*0b57cec5SDimitry Andric (v64i8 (alignedload node:$ptr))>; 813*0b57cec5SDimitry Andric 814*0b57cec5SDimitry Andric// Like 'load', but uses special alignment checks suitable for use in 815*0b57cec5SDimitry Andric// memory operands in most SSE instructions, which are required to 816*0b57cec5SDimitry Andric// be naturally aligned on some targets but not on others. If the subtarget 817*0b57cec5SDimitry Andric// allows unaligned accesses, match any load, though this may require 818*0b57cec5SDimitry Andric// setting a feature bit in the processor (on startup, for example). 819*0b57cec5SDimitry Andric// Opteron 10h and later implement such a feature. 820*0b57cec5SDimitry Andricdef memop : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 821*0b57cec5SDimitry Andric auto *Ld = cast<LoadSDNode>(N); 822*0b57cec5SDimitry Andric return Subtarget->hasSSEUnalignedMem() || 823*0b57cec5SDimitry Andric Ld->getAlignment() >= Ld->getMemoryVT().getStoreSize(); 824*0b57cec5SDimitry Andric}]>; 825*0b57cec5SDimitry Andric 826*0b57cec5SDimitry Andric// 128-bit memop pattern fragments 827*0b57cec5SDimitry Andric// NOTE: all 128-bit integer vector loads are promoted to v2i64 828*0b57cec5SDimitry Andricdef memopv4f32 : PatFrag<(ops node:$ptr), (v4f32 (memop node:$ptr))>; 829*0b57cec5SDimitry Andricdef memopv2f64 : PatFrag<(ops node:$ptr), (v2f64 (memop node:$ptr))>; 830*0b57cec5SDimitry Andricdef memopv2i64 : PatFrag<(ops node:$ptr), (v2i64 (memop node:$ptr))>; 831*0b57cec5SDimitry Andricdef memopv4i32 : PatFrag<(ops node:$ptr), (v4i32 (memop node:$ptr))>; 832*0b57cec5SDimitry Andricdef memopv8i16 : PatFrag<(ops node:$ptr), (v8i16 (memop node:$ptr))>; 833*0b57cec5SDimitry Andricdef memopv16i8 : PatFrag<(ops node:$ptr), (v16i8 (memop node:$ptr))>; 834*0b57cec5SDimitry Andric 835*0b57cec5SDimitry Andricdef X86masked_gather : SDNode<"X86ISD::MGATHER", 836*0b57cec5SDimitry Andric SDTypeProfile<2, 3, [SDTCisVec<0>, 837*0b57cec5SDimitry Andric SDTCisVec<1>, SDTCisInt<1>, 838*0b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 839*0b57cec5SDimitry Andric SDTCisSameAs<1, 3>, 840*0b57cec5SDimitry Andric SDTCisPtrTy<4>]>, 841*0b57cec5SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 842*0b57cec5SDimitry Andric 843*0b57cec5SDimitry Andricdef X86masked_scatter : SDNode<"X86ISD::MSCATTER", 844*0b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisVec<1>, 845*0b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 846*0b57cec5SDimitry Andric SDTCVecEltisVT<0, i1>, 847*0b57cec5SDimitry Andric SDTCisPtrTy<3>]>, 848*0b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 849*0b57cec5SDimitry Andric 850*0b57cec5SDimitry Andricdef mgatherv4i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 851*0b57cec5SDimitry Andric (X86masked_gather node:$src1, node:$src2, node:$src3) , [{ 852*0b57cec5SDimitry Andric X86MaskedGatherSDNode *Mgt = cast<X86MaskedGatherSDNode>(N); 853*0b57cec5SDimitry Andric return Mgt->getIndex().getValueType() == MVT::v4i32; 854*0b57cec5SDimitry Andric}]>; 855*0b57cec5SDimitry Andric 856*0b57cec5SDimitry Andricdef mgatherv8i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 857*0b57cec5SDimitry Andric (X86masked_gather node:$src1, node:$src2, node:$src3) , [{ 858*0b57cec5SDimitry Andric X86MaskedGatherSDNode *Mgt = cast<X86MaskedGatherSDNode>(N); 859*0b57cec5SDimitry Andric return Mgt->getIndex().getValueType() == MVT::v8i32; 860*0b57cec5SDimitry Andric}]>; 861*0b57cec5SDimitry Andric 862*0b57cec5SDimitry Andricdef mgatherv2i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 863*0b57cec5SDimitry Andric (X86masked_gather node:$src1, node:$src2, node:$src3) , [{ 864*0b57cec5SDimitry Andric X86MaskedGatherSDNode *Mgt = cast<X86MaskedGatherSDNode>(N); 865*0b57cec5SDimitry Andric return Mgt->getIndex().getValueType() == MVT::v2i64; 866*0b57cec5SDimitry Andric}]>; 867*0b57cec5SDimitry Andricdef mgatherv4i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 868*0b57cec5SDimitry Andric (X86masked_gather node:$src1, node:$src2, node:$src3) , [{ 869*0b57cec5SDimitry Andric X86MaskedGatherSDNode *Mgt = cast<X86MaskedGatherSDNode>(N); 870*0b57cec5SDimitry Andric return Mgt->getIndex().getValueType() == MVT::v4i64; 871*0b57cec5SDimitry Andric}]>; 872*0b57cec5SDimitry Andricdef mgatherv8i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 873*0b57cec5SDimitry Andric (X86masked_gather node:$src1, node:$src2, node:$src3) , [{ 874*0b57cec5SDimitry Andric X86MaskedGatherSDNode *Mgt = cast<X86MaskedGatherSDNode>(N); 875*0b57cec5SDimitry Andric return Mgt->getIndex().getValueType() == MVT::v8i64; 876*0b57cec5SDimitry Andric}]>; 877*0b57cec5SDimitry Andricdef mgatherv16i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 878*0b57cec5SDimitry Andric (X86masked_gather node:$src1, node:$src2, node:$src3) , [{ 879*0b57cec5SDimitry Andric X86MaskedGatherSDNode *Mgt = cast<X86MaskedGatherSDNode>(N); 880*0b57cec5SDimitry Andric return Mgt->getIndex().getValueType() == MVT::v16i32; 881*0b57cec5SDimitry Andric}]>; 882*0b57cec5SDimitry Andric 883*0b57cec5SDimitry Andricdef mscatterv2i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 884*0b57cec5SDimitry Andric (X86masked_scatter node:$src1, node:$src2, node:$src3) , [{ 885*0b57cec5SDimitry Andric X86MaskedScatterSDNode *Sc = cast<X86MaskedScatterSDNode>(N); 886*0b57cec5SDimitry Andric return Sc->getIndex().getValueType() == MVT::v2i64; 887*0b57cec5SDimitry Andric}]>; 888*0b57cec5SDimitry Andric 889*0b57cec5SDimitry Andricdef mscatterv4i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 890*0b57cec5SDimitry Andric (X86masked_scatter node:$src1, node:$src2, node:$src3) , [{ 891*0b57cec5SDimitry Andric X86MaskedScatterSDNode *Sc = cast<X86MaskedScatterSDNode>(N); 892*0b57cec5SDimitry Andric return Sc->getIndex().getValueType() == MVT::v4i32; 893*0b57cec5SDimitry Andric}]>; 894*0b57cec5SDimitry Andric 895*0b57cec5SDimitry Andricdef mscatterv4i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 896*0b57cec5SDimitry Andric (X86masked_scatter node:$src1, node:$src2, node:$src3) , [{ 897*0b57cec5SDimitry Andric X86MaskedScatterSDNode *Sc = cast<X86MaskedScatterSDNode>(N); 898*0b57cec5SDimitry Andric return Sc->getIndex().getValueType() == MVT::v4i64; 899*0b57cec5SDimitry Andric}]>; 900*0b57cec5SDimitry Andric 901*0b57cec5SDimitry Andricdef mscatterv8i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 902*0b57cec5SDimitry Andric (X86masked_scatter node:$src1, node:$src2, node:$src3) , [{ 903*0b57cec5SDimitry Andric X86MaskedScatterSDNode *Sc = cast<X86MaskedScatterSDNode>(N); 904*0b57cec5SDimitry Andric return Sc->getIndex().getValueType() == MVT::v8i32; 905*0b57cec5SDimitry Andric}]>; 906*0b57cec5SDimitry Andric 907*0b57cec5SDimitry Andricdef mscatterv8i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 908*0b57cec5SDimitry Andric (X86masked_scatter node:$src1, node:$src2, node:$src3) , [{ 909*0b57cec5SDimitry Andric X86MaskedScatterSDNode *Sc = cast<X86MaskedScatterSDNode>(N); 910*0b57cec5SDimitry Andric return Sc->getIndex().getValueType() == MVT::v8i64; 911*0b57cec5SDimitry Andric}]>; 912*0b57cec5SDimitry Andricdef mscatterv16i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 913*0b57cec5SDimitry Andric (X86masked_scatter node:$src1, node:$src2, node:$src3) , [{ 914*0b57cec5SDimitry Andric X86MaskedScatterSDNode *Sc = cast<X86MaskedScatterSDNode>(N); 915*0b57cec5SDimitry Andric return Sc->getIndex().getValueType() == MVT::v16i32; 916*0b57cec5SDimitry Andric}]>; 917*0b57cec5SDimitry Andric 918*0b57cec5SDimitry Andric// 128-bit bitconvert pattern fragments 919*0b57cec5SDimitry Andricdef bc_v4f32 : PatFrag<(ops node:$in), (v4f32 (bitconvert node:$in))>; 920*0b57cec5SDimitry Andricdef bc_v2f64 : PatFrag<(ops node:$in), (v2f64 (bitconvert node:$in))>; 921*0b57cec5SDimitry Andricdef bc_v16i8 : PatFrag<(ops node:$in), (v16i8 (bitconvert node:$in))>; 922*0b57cec5SDimitry Andricdef bc_v8i16 : PatFrag<(ops node:$in), (v8i16 (bitconvert node:$in))>; 923*0b57cec5SDimitry Andricdef bc_v4i32 : PatFrag<(ops node:$in), (v4i32 (bitconvert node:$in))>; 924*0b57cec5SDimitry Andricdef bc_v2i64 : PatFrag<(ops node:$in), (v2i64 (bitconvert node:$in))>; 925*0b57cec5SDimitry Andric 926*0b57cec5SDimitry Andric// 256-bit bitconvert pattern fragments 927*0b57cec5SDimitry Andricdef bc_v32i8 : PatFrag<(ops node:$in), (v32i8 (bitconvert node:$in))>; 928*0b57cec5SDimitry Andricdef bc_v16i16 : PatFrag<(ops node:$in), (v16i16 (bitconvert node:$in))>; 929*0b57cec5SDimitry Andricdef bc_v8i32 : PatFrag<(ops node:$in), (v8i32 (bitconvert node:$in))>; 930*0b57cec5SDimitry Andricdef bc_v4i64 : PatFrag<(ops node:$in), (v4i64 (bitconvert node:$in))>; 931*0b57cec5SDimitry Andricdef bc_v8f32 : PatFrag<(ops node:$in), (v8f32 (bitconvert node:$in))>; 932*0b57cec5SDimitry Andricdef bc_v4f64 : PatFrag<(ops node:$in), (v4f64 (bitconvert node:$in))>; 933*0b57cec5SDimitry Andric 934*0b57cec5SDimitry Andric// 512-bit bitconvert pattern fragments 935*0b57cec5SDimitry Andricdef bc_v64i8 : PatFrag<(ops node:$in), (v64i8 (bitconvert node:$in))>; 936*0b57cec5SDimitry Andricdef bc_v32i16 : PatFrag<(ops node:$in), (v32i16 (bitconvert node:$in))>; 937*0b57cec5SDimitry Andricdef bc_v16i32 : PatFrag<(ops node:$in), (v16i32 (bitconvert node:$in))>; 938*0b57cec5SDimitry Andricdef bc_v8i64 : PatFrag<(ops node:$in), (v8i64 (bitconvert node:$in))>; 939*0b57cec5SDimitry Andricdef bc_v8f64 : PatFrag<(ops node:$in), (v8f64 (bitconvert node:$in))>; 940*0b57cec5SDimitry Andricdef bc_v16f32 : PatFrag<(ops node:$in), (v16f32 (bitconvert node:$in))>; 941*0b57cec5SDimitry Andric 942*0b57cec5SDimitry Andricdef X86vzload32 : PatFrag<(ops node:$src), 943*0b57cec5SDimitry Andric (X86vzld node:$src), [{ 944*0b57cec5SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 4; 945*0b57cec5SDimitry Andric}]>; 946*0b57cec5SDimitry Andric 947*0b57cec5SDimitry Andricdef X86vzload64 : PatFrag<(ops node:$src), 948*0b57cec5SDimitry Andric (X86vzld node:$src), [{ 949*0b57cec5SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 8; 950*0b57cec5SDimitry Andric}]>; 951*0b57cec5SDimitry Andric 952*0b57cec5SDimitry Andricdef X86vextractstore64 : PatFrag<(ops node:$val, node:$ptr), 953*0b57cec5SDimitry Andric (X86vextractst node:$val, node:$ptr), [{ 954*0b57cec5SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 8; 955*0b57cec5SDimitry Andric}]>; 956*0b57cec5SDimitry Andric 957*0b57cec5SDimitry Andric 958*0b57cec5SDimitry Andricdef fp32imm0 : PatLeaf<(f32 fpimm), [{ 959*0b57cec5SDimitry Andric return N->isExactlyValue(+0.0); 960*0b57cec5SDimitry Andric}]>; 961*0b57cec5SDimitry Andric 962*0b57cec5SDimitry Andricdef fp64imm0 : PatLeaf<(f64 fpimm), [{ 963*0b57cec5SDimitry Andric return N->isExactlyValue(+0.0); 964*0b57cec5SDimitry Andric}]>; 965*0b57cec5SDimitry Andric 966*0b57cec5SDimitry Andric// EXTRACT_get_vextract128_imm xform function: convert extract_subvector index 967*0b57cec5SDimitry Andric// to VEXTRACTF128/VEXTRACTI128 imm. 968*0b57cec5SDimitry Andricdef EXTRACT_get_vextract128_imm : SDNodeXForm<extract_subvector, [{ 969*0b57cec5SDimitry Andric return getExtractVEXTRACTImmediate(N, 128, SDLoc(N)); 970*0b57cec5SDimitry Andric}]>; 971*0b57cec5SDimitry Andric 972*0b57cec5SDimitry Andric// INSERT_get_vinsert128_imm xform function: convert insert_subvector index to 973*0b57cec5SDimitry Andric// VINSERTF128/VINSERTI128 imm. 974*0b57cec5SDimitry Andricdef INSERT_get_vinsert128_imm : SDNodeXForm<insert_subvector, [{ 975*0b57cec5SDimitry Andric return getInsertVINSERTImmediate(N, 128, SDLoc(N)); 976*0b57cec5SDimitry Andric}]>; 977*0b57cec5SDimitry Andric 978*0b57cec5SDimitry Andric// EXTRACT_get_vextract256_imm xform function: convert extract_subvector index 979*0b57cec5SDimitry Andric// to VEXTRACTF64x4 imm. 980*0b57cec5SDimitry Andricdef EXTRACT_get_vextract256_imm : SDNodeXForm<extract_subvector, [{ 981*0b57cec5SDimitry Andric return getExtractVEXTRACTImmediate(N, 256, SDLoc(N)); 982*0b57cec5SDimitry Andric}]>; 983*0b57cec5SDimitry Andric 984*0b57cec5SDimitry Andric// INSERT_get_vinsert256_imm xform function: convert insert_subvector index to 985*0b57cec5SDimitry Andric// VINSERTF64x4 imm. 986*0b57cec5SDimitry Andricdef INSERT_get_vinsert256_imm : SDNodeXForm<insert_subvector, [{ 987*0b57cec5SDimitry Andric return getInsertVINSERTImmediate(N, 256, SDLoc(N)); 988*0b57cec5SDimitry Andric}]>; 989*0b57cec5SDimitry Andric 990*0b57cec5SDimitry Andricdef vextract128_extract : PatFrag<(ops node:$bigvec, node:$index), 991*0b57cec5SDimitry Andric (extract_subvector node:$bigvec, 992*0b57cec5SDimitry Andric node:$index), [{ 993*0b57cec5SDimitry Andric // Index 0 can be handled via extract_subreg. 994*0b57cec5SDimitry Andric return !isNullConstant(N->getOperand(1)); 995*0b57cec5SDimitry Andric}], EXTRACT_get_vextract128_imm>; 996*0b57cec5SDimitry Andric 997*0b57cec5SDimitry Andricdef vinsert128_insert : PatFrag<(ops node:$bigvec, node:$smallvec, 998*0b57cec5SDimitry Andric node:$index), 999*0b57cec5SDimitry Andric (insert_subvector node:$bigvec, node:$smallvec, 1000*0b57cec5SDimitry Andric node:$index), [{}], 1001*0b57cec5SDimitry Andric INSERT_get_vinsert128_imm>; 1002*0b57cec5SDimitry Andric 1003*0b57cec5SDimitry Andricdef vextract256_extract : PatFrag<(ops node:$bigvec, node:$index), 1004*0b57cec5SDimitry Andric (extract_subvector node:$bigvec, 1005*0b57cec5SDimitry Andric node:$index), [{ 1006*0b57cec5SDimitry Andric // Index 0 can be handled via extract_subreg. 1007*0b57cec5SDimitry Andric return !isNullConstant(N->getOperand(1)); 1008*0b57cec5SDimitry Andric}], EXTRACT_get_vextract256_imm>; 1009*0b57cec5SDimitry Andric 1010*0b57cec5SDimitry Andricdef vinsert256_insert : PatFrag<(ops node:$bigvec, node:$smallvec, 1011*0b57cec5SDimitry Andric node:$index), 1012*0b57cec5SDimitry Andric (insert_subvector node:$bigvec, node:$smallvec, 1013*0b57cec5SDimitry Andric node:$index), [{}], 1014*0b57cec5SDimitry Andric INSERT_get_vinsert256_imm>; 1015*0b57cec5SDimitry Andric 1016*0b57cec5SDimitry Andricdef masked_load : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1017*0b57cec5SDimitry Andric (masked_ld node:$src1, node:$src2, node:$src3), [{ 1018*0b57cec5SDimitry Andric return !cast<MaskedLoadSDNode>(N)->isExpandingLoad() && 1019*0b57cec5SDimitry Andric cast<MaskedLoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD; 1020*0b57cec5SDimitry Andric}]>; 1021*0b57cec5SDimitry Andric 1022*0b57cec5SDimitry Andricdef masked_load_aligned : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1023*0b57cec5SDimitry Andric (masked_load node:$src1, node:$src2, node:$src3), [{ 1024*0b57cec5SDimitry Andric // Use the node type to determine the size the alignment needs to match. 1025*0b57cec5SDimitry Andric // We can't use memory VT because type widening changes the node VT, but 1026*0b57cec5SDimitry Andric // not the memory VT. 1027*0b57cec5SDimitry Andric auto *Ld = cast<MaskedLoadSDNode>(N); 1028*0b57cec5SDimitry Andric return Ld->getAlignment() >= Ld->getValueType(0).getStoreSize(); 1029*0b57cec5SDimitry Andric}]>; 1030*0b57cec5SDimitry Andric 1031*0b57cec5SDimitry Andricdef X86mExpandingLoad : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1032*0b57cec5SDimitry Andric (masked_ld node:$src1, node:$src2, node:$src3), [{ 1033*0b57cec5SDimitry Andric return cast<MaskedLoadSDNode>(N)->isExpandingLoad(); 1034*0b57cec5SDimitry Andric}]>; 1035*0b57cec5SDimitry Andric 1036*0b57cec5SDimitry Andric// Masked store fragments. 1037*0b57cec5SDimitry Andric// X86mstore can't be implemented in core DAG files because some targets 1038*0b57cec5SDimitry Andric// do not support vector types (llvm-tblgen will fail). 1039*0b57cec5SDimitry Andricdef masked_store : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1040*0b57cec5SDimitry Andric (masked_st node:$src1, node:$src2, node:$src3), [{ 1041*0b57cec5SDimitry Andric return (!cast<MaskedStoreSDNode>(N)->isTruncatingStore()) && 1042*0b57cec5SDimitry Andric (!cast<MaskedStoreSDNode>(N)->isCompressingStore()); 1043*0b57cec5SDimitry Andric}]>; 1044*0b57cec5SDimitry Andric 1045*0b57cec5SDimitry Andricdef masked_store_aligned : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1046*0b57cec5SDimitry Andric (masked_store node:$src1, node:$src2, node:$src3), [{ 1047*0b57cec5SDimitry Andric // Use the node type to determine the size the alignment needs to match. 1048*0b57cec5SDimitry Andric // We can't use memory VT because type widening changes the node VT, but 1049*0b57cec5SDimitry Andric // not the memory VT. 1050*0b57cec5SDimitry Andric auto *St = cast<MaskedStoreSDNode>(N); 1051*0b57cec5SDimitry Andric return St->getAlignment() >= St->getOperand(1).getValueType().getStoreSize(); 1052*0b57cec5SDimitry Andric}]>; 1053*0b57cec5SDimitry Andric 1054*0b57cec5SDimitry Andricdef X86mCompressingStore : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1055*0b57cec5SDimitry Andric (masked_st node:$src1, node:$src2, node:$src3), [{ 1056*0b57cec5SDimitry Andric return cast<MaskedStoreSDNode>(N)->isCompressingStore(); 1057*0b57cec5SDimitry Andric}]>; 1058*0b57cec5SDimitry Andric 1059*0b57cec5SDimitry Andric// masked truncstore fragments 1060*0b57cec5SDimitry Andric// X86mtruncstore can't be implemented in core DAG files because some targets 1061*0b57cec5SDimitry Andric// doesn't support vector type ( llvm-tblgen will fail) 1062*0b57cec5SDimitry Andricdef X86mtruncstore : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1063*0b57cec5SDimitry Andric (masked_st node:$src1, node:$src2, node:$src3), [{ 1064*0b57cec5SDimitry Andric return cast<MaskedStoreSDNode>(N)->isTruncatingStore(); 1065*0b57cec5SDimitry Andric}]>; 1066*0b57cec5SDimitry Andricdef masked_truncstorevi8 : 1067*0b57cec5SDimitry Andric PatFrag<(ops node:$src1, node:$src2, node:$src3), 1068*0b57cec5SDimitry Andric (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ 1069*0b57cec5SDimitry Andric return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; 1070*0b57cec5SDimitry Andric}]>; 1071*0b57cec5SDimitry Andricdef masked_truncstorevi16 : 1072*0b57cec5SDimitry Andric PatFrag<(ops node:$src1, node:$src2, node:$src3), 1073*0b57cec5SDimitry Andric (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ 1074*0b57cec5SDimitry Andric return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; 1075*0b57cec5SDimitry Andric}]>; 1076*0b57cec5SDimitry Andricdef masked_truncstorevi32 : 1077*0b57cec5SDimitry Andric PatFrag<(ops node:$src1, node:$src2, node:$src3), 1078*0b57cec5SDimitry Andric (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ 1079*0b57cec5SDimitry Andric return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; 1080*0b57cec5SDimitry Andric}]>; 1081*0b57cec5SDimitry Andric 1082*0b57cec5SDimitry Andricdef X86TruncSStore : SDNode<"X86ISD::VTRUNCSTORES", SDTStore, 1083*0b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 1084*0b57cec5SDimitry Andric 1085*0b57cec5SDimitry Andricdef X86TruncUSStore : SDNode<"X86ISD::VTRUNCSTOREUS", SDTStore, 1086*0b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 1087*0b57cec5SDimitry Andric 1088*0b57cec5SDimitry Andricdef X86MTruncSStore : SDNode<"X86ISD::VMTRUNCSTORES", SDTMaskedStore, 1089*0b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 1090*0b57cec5SDimitry Andric 1091*0b57cec5SDimitry Andricdef X86MTruncUSStore : SDNode<"X86ISD::VMTRUNCSTOREUS", SDTMaskedStore, 1092*0b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 1093*0b57cec5SDimitry Andric 1094*0b57cec5SDimitry Andricdef truncstore_s_vi8 : PatFrag<(ops node:$val, node:$ptr), 1095*0b57cec5SDimitry Andric (X86TruncSStore node:$val, node:$ptr), [{ 1096*0b57cec5SDimitry Andric return cast<TruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; 1097*0b57cec5SDimitry Andric}]>; 1098*0b57cec5SDimitry Andric 1099*0b57cec5SDimitry Andricdef truncstore_us_vi8 : PatFrag<(ops node:$val, node:$ptr), 1100*0b57cec5SDimitry Andric (X86TruncUSStore node:$val, node:$ptr), [{ 1101*0b57cec5SDimitry Andric return cast<TruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; 1102*0b57cec5SDimitry Andric}]>; 1103*0b57cec5SDimitry Andric 1104*0b57cec5SDimitry Andricdef truncstore_s_vi16 : PatFrag<(ops node:$val, node:$ptr), 1105*0b57cec5SDimitry Andric (X86TruncSStore node:$val, node:$ptr), [{ 1106*0b57cec5SDimitry Andric return cast<TruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; 1107*0b57cec5SDimitry Andric}]>; 1108*0b57cec5SDimitry Andric 1109*0b57cec5SDimitry Andricdef truncstore_us_vi16 : PatFrag<(ops node:$val, node:$ptr), 1110*0b57cec5SDimitry Andric (X86TruncUSStore node:$val, node:$ptr), [{ 1111*0b57cec5SDimitry Andric return cast<TruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; 1112*0b57cec5SDimitry Andric}]>; 1113*0b57cec5SDimitry Andric 1114*0b57cec5SDimitry Andricdef truncstore_s_vi32 : PatFrag<(ops node:$val, node:$ptr), 1115*0b57cec5SDimitry Andric (X86TruncSStore node:$val, node:$ptr), [{ 1116*0b57cec5SDimitry Andric return cast<TruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; 1117*0b57cec5SDimitry Andric}]>; 1118*0b57cec5SDimitry Andric 1119*0b57cec5SDimitry Andricdef truncstore_us_vi32 : PatFrag<(ops node:$val, node:$ptr), 1120*0b57cec5SDimitry Andric (X86TruncUSStore node:$val, node:$ptr), [{ 1121*0b57cec5SDimitry Andric return cast<TruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; 1122*0b57cec5SDimitry Andric}]>; 1123*0b57cec5SDimitry Andric 1124*0b57cec5SDimitry Andricdef masked_truncstore_s_vi8 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1125*0b57cec5SDimitry Andric (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{ 1126*0b57cec5SDimitry Andric return cast<MaskedTruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; 1127*0b57cec5SDimitry Andric}]>; 1128*0b57cec5SDimitry Andric 1129*0b57cec5SDimitry Andricdef masked_truncstore_us_vi8 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1130*0b57cec5SDimitry Andric (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{ 1131*0b57cec5SDimitry Andric return cast<MaskedTruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; 1132*0b57cec5SDimitry Andric}]>; 1133*0b57cec5SDimitry Andric 1134*0b57cec5SDimitry Andricdef masked_truncstore_s_vi16 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1135*0b57cec5SDimitry Andric (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{ 1136*0b57cec5SDimitry Andric return cast<MaskedTruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; 1137*0b57cec5SDimitry Andric}]>; 1138*0b57cec5SDimitry Andric 1139*0b57cec5SDimitry Andricdef masked_truncstore_us_vi16 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1140*0b57cec5SDimitry Andric (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{ 1141*0b57cec5SDimitry Andric return cast<MaskedTruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; 1142*0b57cec5SDimitry Andric}]>; 1143*0b57cec5SDimitry Andric 1144*0b57cec5SDimitry Andricdef masked_truncstore_s_vi32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1145*0b57cec5SDimitry Andric (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{ 1146*0b57cec5SDimitry Andric return cast<MaskedTruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; 1147*0b57cec5SDimitry Andric}]>; 1148*0b57cec5SDimitry Andric 1149*0b57cec5SDimitry Andricdef masked_truncstore_us_vi32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1150*0b57cec5SDimitry Andric (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{ 1151*0b57cec5SDimitry Andric return cast<MaskedTruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; 1152*0b57cec5SDimitry Andric}]>; 1153