1*9880d681SAndroid Build Coastguard Worker//===-- X86InstrFragmentsSIMD.td - x86 SIMD ISA ------------*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This file provides pattern fragments useful for SIMD instructions. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 15*9880d681SAndroid Build Coastguard Worker// MMX specific DAG Nodes. 16*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker// Low word of MMX to GPR. 19*9880d681SAndroid Build Coastguard Workerdef MMX_X86movd2w : SDNode<"X86ISD::MMX_MOVD2W", SDTypeProfile<1, 1, 20*9880d681SAndroid Build Coastguard Worker [SDTCisVT<0, i32>, SDTCisVT<1, x86mmx>]>>; 21*9880d681SAndroid Build Coastguard Worker// GPR to low word of MMX. 22*9880d681SAndroid Build Coastguard Workerdef MMX_X86movw2d : SDNode<"X86ISD::MMX_MOVW2D", SDTypeProfile<1, 1, 23*9880d681SAndroid Build Coastguard Worker [SDTCisVT<0, x86mmx>, SDTCisVT<1, i32>]>>; 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 26*9880d681SAndroid Build Coastguard Worker// MMX Pattern Fragments 27*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdef load_mmx : PatFrag<(ops node:$ptr), (x86mmx (load node:$ptr))>; 30*9880d681SAndroid Build Coastguard Workerdef load_mvmmx : PatFrag<(ops node:$ptr), 31*9880d681SAndroid Build Coastguard Worker (x86mmx (MMX_X86movw2d (load node:$ptr)))>; 32*9880d681SAndroid Build Coastguard Workerdef bc_mmx : PatFrag<(ops node:$in), (x86mmx (bitconvert node:$in))>; 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 35*9880d681SAndroid Build Coastguard Worker// SSE specific DAG Nodes. 36*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdef SDTX86VFCMP : SDTypeProfile<1, 3, [SDTCisFP<0>, SDTCisSameAs<1, 2>, 39*9880d681SAndroid Build Coastguard Worker SDTCisFP<1>, SDTCisVT<3, i8>, 40*9880d681SAndroid Build Coastguard Worker SDTCisVec<1>]>; 41*9880d681SAndroid Build Coastguard Workerdef SDTX86CmpTestSae : SDTypeProfile<1, 3, [SDTCisVT<0, i32>, 42*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1, 2>, SDTCisInt<3>]>; 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdef X86fmin : SDNode<"X86ISD::FMIN", SDTFPBinOp>; 45*9880d681SAndroid Build Coastguard Workerdef X86fmax : SDNode<"X86ISD::FMAX", SDTFPBinOp>; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker// Commutative and Associative FMIN and FMAX. 48*9880d681SAndroid Build Coastguard Workerdef X86fminc : SDNode<"X86ISD::FMINC", SDTFPBinOp, 49*9880d681SAndroid Build Coastguard Worker [SDNPCommutative, SDNPAssociative]>; 50*9880d681SAndroid Build Coastguard Workerdef X86fmaxc : SDNode<"X86ISD::FMAXC", SDTFPBinOp, 51*9880d681SAndroid Build Coastguard Worker [SDNPCommutative, SDNPAssociative]>; 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdef X86fand : SDNode<"X86ISD::FAND", SDTFPBinOp, 54*9880d681SAndroid Build Coastguard Worker [SDNPCommutative, SDNPAssociative]>; 55*9880d681SAndroid Build Coastguard Workerdef X86for : SDNode<"X86ISD::FOR", SDTFPBinOp, 56*9880d681SAndroid Build Coastguard Worker [SDNPCommutative, SDNPAssociative]>; 57*9880d681SAndroid Build Coastguard Workerdef X86fxor : SDNode<"X86ISD::FXOR", SDTFPBinOp, 58*9880d681SAndroid Build Coastguard Worker [SDNPCommutative, SDNPAssociative]>; 59*9880d681SAndroid Build Coastguard Workerdef X86fandn : SDNode<"X86ISD::FANDN", SDTFPBinOp, 60*9880d681SAndroid Build Coastguard Worker [SDNPCommutative, SDNPAssociative]>; 61*9880d681SAndroid Build Coastguard Workerdef X86frsqrt : SDNode<"X86ISD::FRSQRT", SDTFPUnaryOp>; 62*9880d681SAndroid Build Coastguard Workerdef X86frcp : SDNode<"X86ISD::FRCP", SDTFPUnaryOp>; 63*9880d681SAndroid Build Coastguard Workerdef X86frsqrt14s: SDNode<"X86ISD::FRSQRTS", SDTFPBinOp>; 64*9880d681SAndroid Build Coastguard Workerdef X86frcp14s : SDNode<"X86ISD::FRCPS", SDTFPBinOp>; 65*9880d681SAndroid Build Coastguard Workerdef X86fhadd : SDNode<"X86ISD::FHADD", SDTFPBinOp>; 66*9880d681SAndroid Build Coastguard Workerdef X86fhsub : SDNode<"X86ISD::FHSUB", SDTFPBinOp>; 67*9880d681SAndroid Build Coastguard Workerdef X86hadd : SDNode<"X86ISD::HADD", SDTIntBinOp>; 68*9880d681SAndroid Build Coastguard Workerdef X86hsub : SDNode<"X86ISD::HSUB", SDTIntBinOp>; 69*9880d681SAndroid Build Coastguard Workerdef X86comi : SDNode<"X86ISD::COMI", SDTX86CmpTest>; 70*9880d681SAndroid Build Coastguard Workerdef X86comiSae : SDNode<"X86ISD::COMI", SDTX86CmpTestSae>; 71*9880d681SAndroid Build Coastguard Workerdef X86ucomi : SDNode<"X86ISD::UCOMI", SDTX86CmpTest>; 72*9880d681SAndroid Build Coastguard Workerdef X86ucomiSae: SDNode<"X86ISD::UCOMI", SDTX86CmpTestSae>; 73*9880d681SAndroid Build Coastguard Workerdef X86cmps : SDNode<"X86ISD::FSETCC", SDTX86Cmps>; 74*9880d681SAndroid Build Coastguard Workerdef X86cvtdq2pd: SDNode<"X86ISD::CVTDQ2PD", 75*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 1, [SDTCisVT<0, v2f64>, 76*9880d681SAndroid Build Coastguard Worker SDTCisVT<1, v4i32>]>>; 77*9880d681SAndroid Build Coastguard Workerdef X86cvtudq2pd: SDNode<"X86ISD::CVTUDQ2PD", 78*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 1, [SDTCisVT<0, v2f64>, 79*9880d681SAndroid Build Coastguard Worker SDTCisVT<1, v4i32>]>>; 80*9880d681SAndroid Build Coastguard Workerdef X86pshufb : SDNode<"X86ISD::PSHUFB", 81*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i8>, SDTCisSameAs<0,1>, 82*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>]>>; 83*9880d681SAndroid Build Coastguard Workerdef X86psadbw : SDNode<"X86ISD::PSADBW", 84*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, 85*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<1, i8>, 86*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0,1>, 87*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1,2>]>>; 88*9880d681SAndroid Build Coastguard Workerdef X86dbpsadbw : SDNode<"X86ISD::DBPSADBW", 89*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCVecEltisVT<0, i16>, 90*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<1, i8>, 91*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0,1>, 92*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1,2>, SDTCisInt<3>]>>; 93*9880d681SAndroid Build Coastguard Workerdef X86andnp : SDNode<"X86ISD::ANDNP", 94*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 95*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>]>>; 96*9880d681SAndroid Build Coastguard Workerdef X86multishift : SDNode<"X86ISD::MULTISHIFT", 97*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 98*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1,2>]>>; 99*9880d681SAndroid Build Coastguard Workerdef X86pextrb : SDNode<"X86ISD::PEXTRB", 100*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisVT<1, v16i8>, 101*9880d681SAndroid Build Coastguard Worker SDTCisPtrTy<2>]>>; 102*9880d681SAndroid Build Coastguard Workerdef X86pextrw : SDNode<"X86ISD::PEXTRW", 103*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisVT<1, v8i16>, 104*9880d681SAndroid Build Coastguard Worker SDTCisPtrTy<2>]>>; 105*9880d681SAndroid Build Coastguard Workerdef X86pinsrb : SDNode<"X86ISD::PINSRB", 106*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVT<0, v16i8>, SDTCisSameAs<0,1>, 107*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>, SDTCisPtrTy<3>]>>; 108*9880d681SAndroid Build Coastguard Workerdef X86pinsrw : SDNode<"X86ISD::PINSRW", 109*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVT<0, v8i16>, SDTCisSameAs<0,1>, 110*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>, SDTCisPtrTy<3>]>>; 111*9880d681SAndroid Build Coastguard Workerdef X86insertps : SDNode<"X86ISD::INSERTPS", 112*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVT<0, v4f32>, SDTCisSameAs<0,1>, 113*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, v4f32>, SDTCisVT<3, i8>]>>; 114*9880d681SAndroid Build Coastguard Workerdef X86vzmovl : SDNode<"X86ISD::VZEXT_MOVL", 115*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 1, [SDTCisSameAs<0,1>]>>; 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdef X86vzload : SDNode<"X86ISD::VZEXT_LOAD", SDTLoad, 118*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdef X86vzext : SDNode<"X86ISD::VZEXT", 121*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 122*9880d681SAndroid Build Coastguard Worker SDTCisInt<0>, SDTCisInt<1>, 123*9880d681SAndroid Build Coastguard Worker SDTCisOpSmallerThanOp<1, 0>]>>; 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdef X86vsext : SDNode<"X86ISD::VSEXT", 126*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 127*9880d681SAndroid Build Coastguard Worker SDTCisInt<0>, SDTCisInt<1>, 128*9880d681SAndroid Build Coastguard Worker SDTCisOpSmallerThanOp<1, 0>]>>; 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerdef SDTVtrunc : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 131*9880d681SAndroid Build Coastguard Worker SDTCisInt<0>, SDTCisInt<1>, 132*9880d681SAndroid Build Coastguard Worker SDTCisOpSmallerThanOp<0, 1>]>; 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdef X86vtrunc : SDNode<"X86ISD::VTRUNC", SDTVtrunc>; 135*9880d681SAndroid Build Coastguard Workerdef X86vtruncs : SDNode<"X86ISD::VTRUNCS", SDTVtrunc>; 136*9880d681SAndroid Build Coastguard Workerdef X86vtruncus : SDNode<"X86ISD::VTRUNCUS", SDTVtrunc>; 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdef X86vfpext : SDNode<"X86ISD::VFPEXT", 139*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 1, [SDTCVecEltisVT<0, f64>, 140*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<1, f32>, 141*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0, 1>]>>; 142*9880d681SAndroid Build Coastguard Workerdef X86vfpround: SDNode<"X86ISD::VFPROUND", 143*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 1, [SDTCVecEltisVT<0, f32>, 144*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<1, f64>, 145*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0, 1>]>>; 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Workerdef X86fround: SDNode<"X86ISD::VFPROUND", 148*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f32>, 149*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 1>, 150*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<2, f64>, 151*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0, 2>]>>; 152*9880d681SAndroid Build Coastguard Workerdef X86froundRnd: SDNode<"X86ISD::VFPROUND", 153*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCVecEltisVT<0, f32>, 154*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 1>, 155*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<2, f64>, 156*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0, 2>, 157*9880d681SAndroid Build Coastguard Worker SDTCisVT<3, i32>]>>; 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerdef X86fpext : SDNode<"X86ISD::VFPEXT", 160*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f64>, 161*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 1>, 162*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<2, f32>, 163*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0, 2>]>>; 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerdef X86fpextRnd : SDNode<"X86ISD::VFPEXT", 166*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCVecEltisVT<0, f64>, 167*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 1>, 168*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<2, f32>, 169*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0, 2>, 170*9880d681SAndroid Build Coastguard Worker SDTCisVT<3, i32>]>>; 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerdef X86vshldq : SDNode<"X86ISD::VSHLDQ", SDTIntShiftOp>; 173*9880d681SAndroid Build Coastguard Workerdef X86vshrdq : SDNode<"X86ISD::VSRLDQ", SDTIntShiftOp>; 174*9880d681SAndroid Build Coastguard Workerdef X86cmpp : SDNode<"X86ISD::CMPP", SDTX86VFCMP>; 175*9880d681SAndroid Build Coastguard Workerdef X86pcmpeq : SDNode<"X86ISD::PCMPEQ", SDTIntBinOp, [SDNPCommutative]>; 176*9880d681SAndroid Build Coastguard Workerdef X86pcmpgt : SDNode<"X86ISD::PCMPGT", SDTIntBinOp>; 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerdef X86IntCmpMask : SDTypeProfile<1, 2, 179*9880d681SAndroid Build Coastguard Worker [SDTCisVec<0>, SDTCisSameAs<1, 2>, SDTCisInt<1>]>; 180*9880d681SAndroid Build Coastguard Workerdef X86pcmpeqm : SDNode<"X86ISD::PCMPEQM", X86IntCmpMask, [SDNPCommutative]>; 181*9880d681SAndroid Build Coastguard Workerdef X86pcmpgtm : SDNode<"X86ISD::PCMPGTM", X86IntCmpMask>; 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerdef X86CmpMaskCC : 184*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCVecEltisVT<0, i1>, 185*9880d681SAndroid Build Coastguard Worker SDTCisVec<1>, SDTCisSameAs<2, 1>, 186*9880d681SAndroid Build Coastguard Worker SDTCisSameNumEltsAs<0, 1>, SDTCisVT<3, i8>]>; 187*9880d681SAndroid Build Coastguard Workerdef X86CmpMaskCCRound : 188*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 4, [SDTCisVec<0>,SDTCVecEltisVT<0, i1>, 189*9880d681SAndroid Build Coastguard Worker SDTCisVec<1>, SDTCisSameAs<2, 1>, 190*9880d681SAndroid Build Coastguard Worker SDTCisSameNumEltsAs<0, 1>, SDTCisVT<3, i8>, 191*9880d681SAndroid Build Coastguard Worker SDTCisInt<4>]>; 192*9880d681SAndroid Build Coastguard Workerdef X86CmpMaskCCScalar : 193*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisSameAs<1, 2>, SDTCisVT<3, i8>]>; 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerdef X86CmpMaskCCScalarRound : 196*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 4, [SDTCisInt<0>, SDTCisSameAs<1, 2>, SDTCisVT<3, i8>, 197*9880d681SAndroid Build Coastguard Worker SDTCisInt<4>]>; 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workerdef X86cmpm : SDNode<"X86ISD::CMPM", X86CmpMaskCC>; 200*9880d681SAndroid Build Coastguard Workerdef X86cmpmRnd : SDNode<"X86ISD::CMPM_RND", X86CmpMaskCCRound>; 201*9880d681SAndroid Build Coastguard Workerdef X86cmpmu : SDNode<"X86ISD::CMPMU", X86CmpMaskCC>; 202*9880d681SAndroid Build Coastguard Workerdef X86cmpms : SDNode<"X86ISD::FSETCC", X86CmpMaskCCScalar>; 203*9880d681SAndroid Build Coastguard Workerdef X86cmpmsRnd : SDNode<"X86ISD::FSETCC", X86CmpMaskCCScalarRound>; 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerdef X86vshl : SDNode<"X86ISD::VSHL", 206*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 207*9880d681SAndroid Build Coastguard Worker SDTCisVec<2>]>>; 208*9880d681SAndroid Build Coastguard Workerdef X86vsrl : SDNode<"X86ISD::VSRL", 209*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 210*9880d681SAndroid Build Coastguard Worker SDTCisVec<2>]>>; 211*9880d681SAndroid Build Coastguard Workerdef X86vsra : SDNode<"X86ISD::VSRA", 212*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 213*9880d681SAndroid Build Coastguard Worker SDTCisVec<2>]>>; 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Workerdef X86vsrav : SDNode<"X86ISD::VSRAV" , SDTIntShiftOp>; 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Workerdef X86vshli : SDNode<"X86ISD::VSHLI", SDTIntShiftOp>; 218*9880d681SAndroid Build Coastguard Workerdef X86vsrli : SDNode<"X86ISD::VSRLI", SDTIntShiftOp>; 219*9880d681SAndroid Build Coastguard Workerdef X86vsrai : SDNode<"X86ISD::VSRAI", SDTIntShiftOp>; 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Workerdef X86vrotli : SDNode<"X86ISD::VROTLI", SDTIntShiftOp>; 222*9880d681SAndroid Build Coastguard Workerdef X86vrotri : SDNode<"X86ISD::VROTRI", SDTIntShiftOp>; 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Workerdef X86vprot : SDNode<"X86ISD::VPROT", 225*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 226*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>]>>; 227*9880d681SAndroid Build Coastguard Workerdef X86vproti : SDNode<"X86ISD::VPROTI", 228*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 229*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i8>]>>; 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Workerdef X86vpshl : SDNode<"X86ISD::VPSHL", 232*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 233*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>]>>; 234*9880d681SAndroid Build Coastguard Workerdef X86vpsha : SDNode<"X86ISD::VPSHA", 235*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 236*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>]>>; 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Workerdef X86vpcom : SDNode<"X86ISD::VPCOM", 239*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 240*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>, 241*9880d681SAndroid Build Coastguard Worker SDTCisVT<3, i8>]>>; 242*9880d681SAndroid Build Coastguard Workerdef X86vpcomu : SDNode<"X86ISD::VPCOMU", 243*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 244*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>, 245*9880d681SAndroid Build Coastguard Worker SDTCisVT<3, i8>]>>; 246*9880d681SAndroid Build Coastguard Workerdef X86vpermil2 : SDNode<"X86ISD::VPERMIL2", 247*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 4, [SDTCisVec<0>, SDTCisSameAs<0,1>, 248*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>, 249*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0,3>, 250*9880d681SAndroid Build Coastguard Worker SDTCisSameNumEltsAs<0, 3>, 251*9880d681SAndroid Build Coastguard Worker SDTCisVT<4, i8>]>>; 252*9880d681SAndroid Build Coastguard Workerdef X86vpperm : SDNode<"X86ISD::VPPERM", 253*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVT<0, v16i8>, SDTCisSameAs<0,1>, 254*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>]>>; 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Workerdef SDTX86CmpPTest : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, 257*9880d681SAndroid Build Coastguard Worker SDTCisVec<1>, 258*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<2, 1>]>; 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Workerdef SDTX86Testm : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 261*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<2, 1>, SDTCVecEltisVT<0, i1>, 262*9880d681SAndroid Build Coastguard Worker SDTCisSameNumEltsAs<0, 1>]>; 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Workerdef X86addus : SDNode<"X86ISD::ADDUS", SDTIntBinOp>; 265*9880d681SAndroid Build Coastguard Workerdef X86subus : SDNode<"X86ISD::SUBUS", SDTIntBinOp>; 266*9880d681SAndroid Build Coastguard Workerdef X86adds : SDNode<"X86ISD::ADDS", SDTIntBinOp>; 267*9880d681SAndroid Build Coastguard Workerdef X86subs : SDNode<"X86ISD::SUBS", SDTIntBinOp>; 268*9880d681SAndroid Build Coastguard Workerdef X86mulhrs : SDNode<"X86ISD::MULHRS" , SDTIntBinOp>; 269*9880d681SAndroid Build Coastguard Workerdef X86avg : SDNode<"X86ISD::AVG" , SDTIntBinOp>; 270*9880d681SAndroid Build Coastguard Workerdef X86ptest : SDNode<"X86ISD::PTEST", SDTX86CmpPTest>; 271*9880d681SAndroid Build Coastguard Workerdef X86testp : SDNode<"X86ISD::TESTP", SDTX86CmpPTest>; 272*9880d681SAndroid Build Coastguard Workerdef X86kortest : SDNode<"X86ISD::KORTEST", SDTX86CmpPTest>; 273*9880d681SAndroid Build Coastguard Workerdef X86ktest : SDNode<"X86ISD::KTEST", SDTX86CmpPTest>; 274*9880d681SAndroid Build Coastguard Workerdef X86testm : SDNode<"X86ISD::TESTM", SDTX86Testm, [SDNPCommutative]>; 275*9880d681SAndroid Build Coastguard Workerdef X86testnm : SDNode<"X86ISD::TESTNM", SDTX86Testm, [SDNPCommutative]>; 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Workerdef X86movmsk : SDNode<"X86ISD::MOVMSK", 278*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVec<1>]>>; 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Workerdef X86select : SDNode<"X86ISD::SELECT", 281*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCVecEltisVT<1, i1>, 282*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 2>, 283*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<2, 3>, 284*9880d681SAndroid Build Coastguard Worker SDTCisSameNumEltsAs<0, 1>]>>; 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Workerdef X86selects : SDNode<"X86ISD::SELECT", 287*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVT<1, i1>, 288*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 2>, 289*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<2, 3>]>>; 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Workerdef X86pmuludq : SDNode<"X86ISD::PMULUDQ", 292*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, 293*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<1, i32>, 294*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0,1>, 295*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1,2>]>>; 296*9880d681SAndroid Build Coastguard Workerdef X86pmuldq : SDNode<"X86ISD::PMULDQ", 297*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, 298*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<1, i32>, 299*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0,1>, 300*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1,2>]>>; 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Workerdef X86extrqi : SDNode<"X86ISD::EXTRQI", 303*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVT<0, v2i64>, SDTCisSameAs<0,1>, 304*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i8>, SDTCisVT<3, i8>]>>; 305*9880d681SAndroid Build Coastguard Workerdef X86insertqi : SDNode<"X86ISD::INSERTQI", 306*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 4, [SDTCisVT<0, v2i64>, SDTCisSameAs<0,1>, 307*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1,2>, SDTCisVT<3, i8>, 308*9880d681SAndroid Build Coastguard Worker SDTCisVT<4, i8>]>>; 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Worker// Specific shuffle nodes - At some point ISD::VECTOR_SHUFFLE will always get 311*9880d681SAndroid Build Coastguard Worker// translated into one of the target nodes below during lowering. 312*9880d681SAndroid Build Coastguard Worker// Note: this is a work in progress... 313*9880d681SAndroid Build Coastguard Workerdef SDTShuff1Op : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisSameAs<0,1>]>; 314*9880d681SAndroid Build Coastguard Workerdef SDTShuff2Op : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 315*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>]>; 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Workerdef SDTShuff2OpM : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 318*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0,2>, 319*9880d681SAndroid Build Coastguard Worker SDTCisSameNumEltsAs<0,2>]>; 320*9880d681SAndroid Build Coastguard Workerdef SDTShuff2OpI : SDTypeProfile<1, 2, [SDTCisVec<0>, 321*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,1>, SDTCisVT<2, i8>]>; 322*9880d681SAndroid Build Coastguard Workerdef SDTShuff3OpI : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 323*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>, SDTCisVT<3, i8>]>; 324*9880d681SAndroid Build Coastguard Workerdef SDTFPBinOpImmRound: SDTypeProfile<1, 4, [SDTCisVec<0>, SDTCisSameAs<0,1>, 325*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>, SDTCisVT<3, i32>, SDTCisVT<4, i32>]>; 326*9880d681SAndroid Build Coastguard Workerdef SDTFPTernaryOpImmRound: SDTypeProfile<1, 5, [SDTCisFP<0>, SDTCisSameAs<0,1>, 327*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>, 328*9880d681SAndroid Build Coastguard Worker SDTCisInt<3>, 329*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0, 3>, 330*9880d681SAndroid Build Coastguard Worker SDTCisSameNumEltsAs<0, 3>, 331*9880d681SAndroid Build Coastguard Worker SDTCisVT<4, i32>, 332*9880d681SAndroid Build Coastguard Worker SDTCisVT<5, i32>]>; 333*9880d681SAndroid Build Coastguard Workerdef SDTFPUnaryOpImmRound: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 334*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>, SDTCisVT<3, i32>]>; 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Workerdef SDTVBroadcast : SDTypeProfile<1, 1, [SDTCisVec<0>]>; 337*9880d681SAndroid Build Coastguard Workerdef SDTVBroadcastm : SDTypeProfile<1, 1, [SDTCisVec<0>, 338*9880d681SAndroid Build Coastguard Worker SDTCisInt<0>, SDTCisInt<1>]>; 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Workerdef SDTBlend : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 341*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1,2>, SDTCisVT<3, i8>]>; 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Workerdef SDTTernlog : SDTypeProfile<1, 4, [SDTCisVec<0>, SDTCisSameAs<0,1>, 344*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>, SDTCisSameAs<0,3>, 345*9880d681SAndroid Build Coastguard Worker SDTCisVT<4, i8>]>; 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Workerdef SDTFPBinOpRound : SDTypeProfile<1, 3, [ // fadd_round, fmul_round, etc. 348*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisFP<0>, SDTCisVT<3, i32>]>; 349*9880d681SAndroid Build Coastguard Worker 350*9880d681SAndroid Build Coastguard Workerdef SDTFPUnaryOpRound : SDTypeProfile<1, 2, [ // fsqrt_round, fgetexp_round, etc. 351*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 1>, SDTCisFP<0>, SDTCisVT<2, i32>]>; 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Workerdef SDTFma : SDTypeProfile<1, 3, [SDTCisSameAs<0,1>, 354*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1,2>, SDTCisSameAs<1,3>]>; 355*9880d681SAndroid Build Coastguard Workerdef SDTFmaRound : SDTypeProfile<1, 4, [SDTCisSameAs<0,1>, 356*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1,2>, SDTCisSameAs<1,3>, 357*9880d681SAndroid Build Coastguard Worker SDTCisVT<4, i32>]>; 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Workerdef X86PAlignr : SDNode<"X86ISD::PALIGNR", SDTShuff3OpI>; 360*9880d681SAndroid Build Coastguard Workerdef X86VAlign : SDNode<"X86ISD::VALIGN", SDTShuff3OpI>; 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Workerdef X86Abs : SDNode<"X86ISD::ABS", SDTIntUnaryOp>; 363*9880d681SAndroid Build Coastguard Workerdef X86Conflict : SDNode<"X86ISD::CONFLICT", SDTIntUnaryOp>; 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Workerdef X86PShufd : SDNode<"X86ISD::PSHUFD", SDTShuff2OpI>; 366*9880d681SAndroid Build Coastguard Workerdef X86PShufhw : SDNode<"X86ISD::PSHUFHW", SDTShuff2OpI>; 367*9880d681SAndroid Build Coastguard Workerdef X86PShuflw : SDNode<"X86ISD::PSHUFLW", SDTShuff2OpI>; 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Workerdef X86Shufp : SDNode<"X86ISD::SHUFP", SDTShuff3OpI>; 370*9880d681SAndroid Build Coastguard Workerdef X86Shuf128 : SDNode<"X86ISD::SHUF128", SDTShuff3OpI>; 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Workerdef X86Movddup : SDNode<"X86ISD::MOVDDUP", SDTShuff1Op>; 373*9880d681SAndroid Build Coastguard Workerdef X86Movshdup : SDNode<"X86ISD::MOVSHDUP", SDTShuff1Op>; 374*9880d681SAndroid Build Coastguard Workerdef X86Movsldup : SDNode<"X86ISD::MOVSLDUP", SDTShuff1Op>; 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Workerdef X86Movsd : SDNode<"X86ISD::MOVSD", SDTShuff2Op>; 377*9880d681SAndroid Build Coastguard Workerdef X86Movss : SDNode<"X86ISD::MOVSS", SDTShuff2Op>; 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Workerdef X86Movlhps : SDNode<"X86ISD::MOVLHPS", SDTShuff2Op>; 380*9880d681SAndroid Build Coastguard Workerdef X86Movlhpd : SDNode<"X86ISD::MOVLHPD", SDTShuff2Op>; 381*9880d681SAndroid Build Coastguard Workerdef X86Movhlps : SDNode<"X86ISD::MOVHLPS", SDTShuff2Op>; 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Workerdef X86Movlps : SDNode<"X86ISD::MOVLPS", SDTShuff2Op>; 384*9880d681SAndroid Build Coastguard Workerdef X86Movlpd : SDNode<"X86ISD::MOVLPD", SDTShuff2Op>; 385*9880d681SAndroid Build Coastguard Worker 386*9880d681SAndroid Build Coastguard Workerdef SDTPack : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 387*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0,1>, 388*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1,2>]>; 389*9880d681SAndroid Build Coastguard Workerdef X86Packss : SDNode<"X86ISD::PACKSS", SDTPack>; 390*9880d681SAndroid Build Coastguard Workerdef X86Packus : SDNode<"X86ISD::PACKUS", SDTPack>; 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Workerdef X86Unpckl : SDNode<"X86ISD::UNPCKL", SDTShuff2Op>; 393*9880d681SAndroid Build Coastguard Workerdef X86Unpckh : SDNode<"X86ISD::UNPCKH", SDTShuff2Op>; 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Workerdef X86vpmaddubsw : SDNode<"X86ISD::VPMADDUBSW" , SDTPack>; 396*9880d681SAndroid Build Coastguard Workerdef X86vpmaddwd : SDNode<"X86ISD::VPMADDWD" , SDTPack>; 397*9880d681SAndroid Build Coastguard Worker 398*9880d681SAndroid Build Coastguard Workerdef X86VPermilpv : SDNode<"X86ISD::VPERMILPV", SDTShuff2OpM>; 399*9880d681SAndroid Build Coastguard Workerdef X86VPermilpi : SDNode<"X86ISD::VPERMILPI", SDTShuff2OpI>; 400*9880d681SAndroid Build Coastguard Workerdef X86VPermv : SDNode<"X86ISD::VPERMV", 401*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisInt<1>, 402*9880d681SAndroid Build Coastguard Worker SDTCisSameNumEltsAs<0,1>, 403*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0,1>, 404*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>]>>; 405*9880d681SAndroid Build Coastguard Workerdef X86VPermi : SDNode<"X86ISD::VPERMI", SDTShuff2OpI>; 406*9880d681SAndroid Build Coastguard Workerdef X86VPermt2 : SDNode<"X86ISD::VPERMV3", 407*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVec<0>, 408*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,1>, SDTCisInt<2>, 409*9880d681SAndroid Build Coastguard Worker SDTCisVec<2>, SDTCisSameNumEltsAs<0, 2>, 410*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0,2>, 411*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,3>]>, []>; 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Workerdef X86VPermi2X : SDNode<"X86ISD::VPERMIV3", 414*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisInt<1>, 415*9880d681SAndroid Build Coastguard Worker SDTCisVec<1>, SDTCisSameNumEltsAs<0, 1>, 416*9880d681SAndroid Build Coastguard Worker SDTCisSameSizeAs<0,1>, 417*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>, 418*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,3>]>, []>; 419*9880d681SAndroid Build Coastguard Worker 420*9880d681SAndroid Build Coastguard Workerdef X86vpternlog : SDNode<"X86ISD::VPTERNLOG", SDTTernlog>; 421*9880d681SAndroid Build Coastguard Worker 422*9880d681SAndroid Build Coastguard Workerdef X86VPerm2x128 : SDNode<"X86ISD::VPERM2X128", SDTShuff3OpI>; 423*9880d681SAndroid Build Coastguard Worker 424*9880d681SAndroid Build Coastguard Workerdef X86VFixupimm : SDNode<"X86ISD::VFIXUPIMM", SDTFPTernaryOpImmRound>; 425*9880d681SAndroid Build Coastguard Workerdef X86VFixupimmScalar : SDNode<"X86ISD::VFIXUPIMMS", SDTFPTernaryOpImmRound>; 426*9880d681SAndroid Build Coastguard Workerdef X86VRange : SDNode<"X86ISD::VRANGE", SDTFPBinOpImmRound>; 427*9880d681SAndroid Build Coastguard Workerdef X86VReduce : SDNode<"X86ISD::VREDUCE", SDTFPUnaryOpImmRound>; 428*9880d681SAndroid Build Coastguard Workerdef X86VRndScale : SDNode<"X86ISD::VRNDSCALE", SDTFPUnaryOpImmRound>; 429*9880d681SAndroid Build Coastguard Workerdef X86VGetMant : SDNode<"X86ISD::VGETMANT", SDTFPUnaryOpImmRound>; 430*9880d681SAndroid Build Coastguard Workerdef X86Vfpclass : SDNode<"X86ISD::VFPCLASS", 431*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCVecEltisVT<0, i1>, 432*9880d681SAndroid Build Coastguard Worker SDTCisVec<1>, SDTCisFP<1>, 433*9880d681SAndroid Build Coastguard Worker SDTCisSameNumEltsAs<0,1>, 434*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>]>, []>; 435*9880d681SAndroid Build Coastguard Workerdef X86Vfpclasss : SDNode<"X86ISD::VFPCLASSS", 436*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCisVT<0, i1>, 437*9880d681SAndroid Build Coastguard Worker SDTCisFP<1>, SDTCisVT<2, i32>]>,[]>; 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Workerdef X86SubVBroadcast : SDNode<"X86ISD::SUBV_BROADCAST", 440*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 441*9880d681SAndroid Build Coastguard Worker SDTCisSubVecOfVec<1, 0>]>, []>; 442*9880d681SAndroid Build Coastguard Worker 443*9880d681SAndroid Build Coastguard Workerdef X86VBroadcast : SDNode<"X86ISD::VBROADCAST", SDTVBroadcast>; 444*9880d681SAndroid Build Coastguard Workerdef X86VBroadcastm : SDNode<"X86ISD::VBROADCASTM", SDTVBroadcastm>; 445*9880d681SAndroid Build Coastguard Workerdef X86Vinsert : SDNode<"X86ISD::VINSERT", SDTypeProfile<1, 3, 446*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<0, 1>, SDTCisEltOfVec<2, 1>, 447*9880d681SAndroid Build Coastguard Worker SDTCisPtrTy<3>]>, []>; 448*9880d681SAndroid Build Coastguard Workerdef X86Vextract : SDNode<"X86ISD::VEXTRACT", SDTypeProfile<1, 2, 449*9880d681SAndroid Build Coastguard Worker [SDTCisEltOfVec<0, 1>, SDTCisVec<1>, 450*9880d681SAndroid Build Coastguard Worker SDTCisPtrTy<2>]>, []>; 451*9880d681SAndroid Build Coastguard Worker 452*9880d681SAndroid Build Coastguard Workerdef X86Blendi : SDNode<"X86ISD::BLENDI", SDTBlend>; 453*9880d681SAndroid Build Coastguard Worker 454*9880d681SAndroid Build Coastguard Workerdef X86Addsub : SDNode<"X86ISD::ADDSUB", SDTFPBinOp>; 455*9880d681SAndroid Build Coastguard Worker 456*9880d681SAndroid Build Coastguard Workerdef X86faddRnd : SDNode<"X86ISD::FADD_RND", SDTFPBinOpRound>; 457*9880d681SAndroid Build Coastguard Workerdef X86fsubRnd : SDNode<"X86ISD::FSUB_RND", SDTFPBinOpRound>; 458*9880d681SAndroid Build Coastguard Workerdef X86fmulRnd : SDNode<"X86ISD::FMUL_RND", SDTFPBinOpRound>; 459*9880d681SAndroid Build Coastguard Workerdef X86fdivRnd : SDNode<"X86ISD::FDIV_RND", SDTFPBinOpRound>; 460*9880d681SAndroid Build Coastguard Workerdef X86fmaxRnd : SDNode<"X86ISD::FMAX_RND", SDTFPBinOpRound>; 461*9880d681SAndroid Build Coastguard Workerdef X86scalef : SDNode<"X86ISD::SCALEF", SDTFPBinOpRound>; 462*9880d681SAndroid Build Coastguard Workerdef X86scalefs : SDNode<"X86ISD::SCALEFS", SDTFPBinOpRound>; 463*9880d681SAndroid Build Coastguard Workerdef X86fminRnd : SDNode<"X86ISD::FMIN_RND", SDTFPBinOpRound>; 464*9880d681SAndroid Build Coastguard Workerdef X86fsqrtRnd : SDNode<"X86ISD::FSQRT_RND", SDTFPUnaryOpRound>; 465*9880d681SAndroid Build Coastguard Workerdef X86fsqrtRnds : SDNode<"X86ISD::FSQRT_RND", SDTFPBinOpRound>; 466*9880d681SAndroid Build Coastguard Workerdef X86fgetexpRnd : SDNode<"X86ISD::FGETEXP_RND", SDTFPUnaryOpRound>; 467*9880d681SAndroid Build Coastguard Workerdef X86fgetexpRnds : SDNode<"X86ISD::FGETEXP_RND", SDTFPBinOpRound>; 468*9880d681SAndroid Build Coastguard Worker 469*9880d681SAndroid Build Coastguard Workerdef X86Fmadd : SDNode<"X86ISD::FMADD", SDTFma>; 470*9880d681SAndroid Build Coastguard Workerdef X86Fnmadd : SDNode<"X86ISD::FNMADD", SDTFma>; 471*9880d681SAndroid Build Coastguard Workerdef X86Fmsub : SDNode<"X86ISD::FMSUB", SDTFma>; 472*9880d681SAndroid Build Coastguard Workerdef X86Fnmsub : SDNode<"X86ISD::FNMSUB", SDTFma>; 473*9880d681SAndroid Build Coastguard Workerdef X86Fmaddsub : SDNode<"X86ISD::FMADDSUB", SDTFma>; 474*9880d681SAndroid Build Coastguard Workerdef X86Fmsubadd : SDNode<"X86ISD::FMSUBADD", SDTFma>; 475*9880d681SAndroid Build Coastguard Worker 476*9880d681SAndroid Build Coastguard Workerdef X86FmaddRnd : SDNode<"X86ISD::FMADD_RND", SDTFmaRound>; 477*9880d681SAndroid Build Coastguard Workerdef X86FnmaddRnd : SDNode<"X86ISD::FNMADD_RND", SDTFmaRound>; 478*9880d681SAndroid Build Coastguard Workerdef X86FmsubRnd : SDNode<"X86ISD::FMSUB_RND", SDTFmaRound>; 479*9880d681SAndroid Build Coastguard Workerdef X86FnmsubRnd : SDNode<"X86ISD::FNMSUB_RND", SDTFmaRound>; 480*9880d681SAndroid Build Coastguard Workerdef X86FmaddsubRnd : SDNode<"X86ISD::FMADDSUB_RND", SDTFmaRound>; 481*9880d681SAndroid Build Coastguard Workerdef X86FmsubaddRnd : SDNode<"X86ISD::FMSUBADD_RND", SDTFmaRound>; 482*9880d681SAndroid Build Coastguard Worker 483*9880d681SAndroid Build Coastguard Workerdef x86vpmadd52l : SDNode<"X86ISD::VPMADD52L", SDTFma>; 484*9880d681SAndroid Build Coastguard Workerdef x86vpmadd52h : SDNode<"X86ISD::VPMADD52H", SDTFma>; 485*9880d681SAndroid Build Coastguard Worker 486*9880d681SAndroid Build Coastguard Workerdef X86rsqrt28 : SDNode<"X86ISD::RSQRT28", SDTFPUnaryOpRound>; 487*9880d681SAndroid Build Coastguard Workerdef X86rcp28 : SDNode<"X86ISD::RCP28", SDTFPUnaryOpRound>; 488*9880d681SAndroid Build Coastguard Workerdef X86exp2 : SDNode<"X86ISD::EXP2", SDTFPUnaryOpRound>; 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Workerdef X86rsqrt28s : SDNode<"X86ISD::RSQRT28", SDTFPBinOpRound>; 491*9880d681SAndroid Build Coastguard Workerdef X86rcp28s : SDNode<"X86ISD::RCP28", SDTFPBinOpRound>; 492*9880d681SAndroid Build Coastguard Workerdef X86RndScales : SDNode<"X86ISD::VRNDSCALE", SDTFPBinOpImmRound>; 493*9880d681SAndroid Build Coastguard Workerdef X86Reduces : SDNode<"X86ISD::VREDUCE", SDTFPBinOpImmRound>; 494*9880d681SAndroid Build Coastguard Workerdef X86GetMants : SDNode<"X86ISD::VGETMANT", SDTFPBinOpImmRound>; 495*9880d681SAndroid Build Coastguard Worker 496*9880d681SAndroid Build Coastguard Workerdef SDT_PCMPISTRI : SDTypeProfile<2, 3, [SDTCisVT<0, i32>, SDTCisVT<1, i32>, 497*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, v16i8>, SDTCisVT<3, v16i8>, 498*9880d681SAndroid Build Coastguard Worker SDTCisVT<4, i8>]>; 499*9880d681SAndroid Build Coastguard Workerdef SDT_PCMPESTRI : SDTypeProfile<2, 5, [SDTCisVT<0, i32>, SDTCisVT<1, i32>, 500*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, v16i8>, SDTCisVT<3, i32>, 501*9880d681SAndroid Build Coastguard Worker SDTCisVT<4, v16i8>, SDTCisVT<5, i32>, 502*9880d681SAndroid Build Coastguard Worker SDTCisVT<6, i8>]>; 503*9880d681SAndroid Build Coastguard Worker 504*9880d681SAndroid Build Coastguard Workerdef X86pcmpistri : SDNode<"X86ISD::PCMPISTRI", SDT_PCMPISTRI>; 505*9880d681SAndroid Build Coastguard Workerdef X86pcmpestri : SDNode<"X86ISD::PCMPESTRI", SDT_PCMPESTRI>; 506*9880d681SAndroid Build Coastguard Worker 507*9880d681SAndroid Build Coastguard Workerdef X86compress: SDNode<"X86ISD::COMPRESS", SDTypeProfile<1, 1, 508*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<0, 1>, SDTCisVec<1>]>, []>; 509*9880d681SAndroid Build Coastguard Workerdef X86expand : SDNode<"X86ISD::EXPAND", SDTypeProfile<1, 1, 510*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<0, 1>, SDTCisVec<1>]>, []>; 511*9880d681SAndroid Build Coastguard Worker 512*9880d681SAndroid Build Coastguard Workerdef SDTintToFPRound: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisFP<0>, 513*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,1>, SDTCisInt<2>, 514*9880d681SAndroid Build Coastguard Worker SDTCisVT<3, i32>]>; 515*9880d681SAndroid Build Coastguard Worker 516*9880d681SAndroid Build Coastguard Workerdef SDTFloatToInt: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 517*9880d681SAndroid Build Coastguard Worker SDTCisInt<0>, SDTCisFP<1>]>; 518*9880d681SAndroid Build Coastguard Worker 519*9880d681SAndroid Build Coastguard Workerdef SDTFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 520*9880d681SAndroid Build Coastguard Worker SDTCisInt<0>, SDTCisFP<1>, 521*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>]>; 522*9880d681SAndroid Build Coastguard Workerdef SDTSFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisFP<1>, 523*9880d681SAndroid Build Coastguard Worker SDTCisVec<1>, SDTCisVT<2, i32>]>; 524*9880d681SAndroid Build Coastguard Workerdef SDTVintToFPRound: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 525*9880d681SAndroid Build Coastguard Worker SDTCisFP<0>, SDTCisInt<1>, 526*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>]>; 527*9880d681SAndroid Build Coastguard Worker 528*9880d681SAndroid Build Coastguard Worker// Scalar 529*9880d681SAndroid Build Coastguard Workerdef X86SintToFpRnd : SDNode<"X86ISD::SINT_TO_FP_RND", SDTintToFPRound>; 530*9880d681SAndroid Build Coastguard Workerdef X86UintToFpRnd : SDNode<"X86ISD::UINT_TO_FP_RND", SDTintToFPRound>; 531*9880d681SAndroid Build Coastguard Worker 532*9880d681SAndroid Build Coastguard Workerdef X86cvtts2IntRnd : SDNode<"X86ISD::FP_TO_SINT_RND", SDTSFloatToIntRnd>; 533*9880d681SAndroid Build Coastguard Workerdef X86cvtts2UIntRnd : SDNode<"X86ISD::FP_TO_UINT_RND", SDTSFloatToIntRnd>; 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Workerdef X86cvts2si : SDNode<"X86ISD::SCALAR_FP_TO_SINT_RND", SDTSFloatToIntRnd>; 536*9880d681SAndroid Build Coastguard Workerdef X86cvts2usi : SDNode<"X86ISD::SCALAR_FP_TO_UINT_RND", SDTSFloatToIntRnd>; 537*9880d681SAndroid Build Coastguard Worker 538*9880d681SAndroid Build Coastguard Worker// Vector with rounding mode 539*9880d681SAndroid Build Coastguard Worker 540*9880d681SAndroid Build Coastguard Worker// cvtt fp-to-int staff 541*9880d681SAndroid Build Coastguard Workerdef X86VFpToSintRnd : SDNode<"ISD::FP_TO_SINT", SDTFloatToIntRnd>; 542*9880d681SAndroid Build Coastguard Workerdef X86VFpToUintRnd : SDNode<"ISD::FP_TO_UINT", SDTFloatToIntRnd>; 543*9880d681SAndroid Build Coastguard Worker 544*9880d681SAndroid Build Coastguard Workerdef X86VSintToFpRnd : SDNode<"ISD::SINT_TO_FP", SDTVintToFPRound>; 545*9880d681SAndroid Build Coastguard Workerdef X86VUintToFpRnd : SDNode<"ISD::UINT_TO_FP", SDTVintToFPRound>; 546*9880d681SAndroid Build Coastguard Worker 547*9880d681SAndroid Build Coastguard Worker// cvt fp-to-int staff 548*9880d681SAndroid Build Coastguard Workerdef X86cvtp2IntRnd : SDNode<"X86ISD::FP_TO_SINT_RND", SDTFloatToIntRnd>; 549*9880d681SAndroid Build Coastguard Workerdef X86cvtp2UIntRnd : SDNode<"X86ISD::FP_TO_UINT_RND", SDTFloatToIntRnd>; 550*9880d681SAndroid Build Coastguard Worker 551*9880d681SAndroid Build Coastguard Worker// Vector without rounding mode 552*9880d681SAndroid Build Coastguard Workerdef X86cvtp2Int : SDNode<"X86ISD::FP_TO_SINT_RND", SDTFloatToInt>; 553*9880d681SAndroid Build Coastguard Workerdef X86cvtp2UInt : SDNode<"X86ISD::FP_TO_UINT_RND", SDTFloatToInt>; 554*9880d681SAndroid Build Coastguard Worker 555*9880d681SAndroid Build Coastguard Workerdef X86cvtph2ps : SDNode<"ISD::FP16_TO_FP", 556*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f32>, 557*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<1, i16>, 558*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>]> >; 559*9880d681SAndroid Build Coastguard Worker 560*9880d681SAndroid Build Coastguard Workerdef X86cvtps2ph : SDNode<"ISD::FP_TO_FP16", 561*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 3, [SDTCVecEltisVT<0, i16>, 562*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<1, f32>, 563*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>, 564*9880d681SAndroid Build Coastguard Worker SDTCisVT<3, i32>]> >; 565*9880d681SAndroid Build Coastguard Workerdef X86vfpextRnd : SDNode<"X86ISD::VFPEXT", 566*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f64>, 567*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<1, f32>, 568*9880d681SAndroid Build Coastguard Worker SDTCisOpSmallerThanOp<1, 0>, 569*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>]>>; 570*9880d681SAndroid Build Coastguard Workerdef X86vfproundRnd: SDNode<"X86ISD::VFPROUND", 571*9880d681SAndroid Build Coastguard Worker SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f32>, 572*9880d681SAndroid Build Coastguard Worker SDTCVecEltisVT<1, f64>, 573*9880d681SAndroid Build Coastguard Worker SDTCisOpSmallerThanOp<0, 1>, 574*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>]>>; 575*9880d681SAndroid Build Coastguard Worker 576*9880d681SAndroid Build Coastguard Workerdef X86cvt2mask : SDNode<"X86ISD::CVT2MASK", SDTIntTruncOp>; 577*9880d681SAndroid Build Coastguard Worker 578*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 579*9880d681SAndroid Build Coastguard Worker// SSE Complex Patterns 580*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 581*9880d681SAndroid Build Coastguard Worker 582*9880d681SAndroid Build Coastguard Worker// These are 'extloads' from a scalar to the low element of a vector, zeroing 583*9880d681SAndroid Build Coastguard Worker// the top elements. These are used for the SSE 'ss' and 'sd' instruction 584*9880d681SAndroid Build Coastguard Worker// forms. 585*9880d681SAndroid Build Coastguard Workerdef sse_load_f32 : ComplexPattern<v4f32, 5, "selectScalarSSELoad", [], 586*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPMayLoad, SDNPMemOperand, 587*9880d681SAndroid Build Coastguard Worker SDNPWantRoot]>; 588*9880d681SAndroid Build Coastguard Workerdef sse_load_f64 : ComplexPattern<v2f64, 5, "selectScalarSSELoad", [], 589*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPMayLoad, SDNPMemOperand, 590*9880d681SAndroid Build Coastguard Worker SDNPWantRoot]>; 591*9880d681SAndroid Build Coastguard Worker 592*9880d681SAndroid Build Coastguard Workerdef ssmem : Operand<v4f32> { 593*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printf32mem"; 594*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops ptr_rc, i8imm, ptr_rc_nosp, i32imm, SEGMENT_REG); 595*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = X86Mem32AsmOperand; 596*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_MEMORY"; 597*9880d681SAndroid Build Coastguard Worker} 598*9880d681SAndroid Build Coastguard Workerdef sdmem : Operand<v2f64> { 599*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printf64mem"; 600*9880d681SAndroid Build Coastguard Worker let MIOperandInfo = (ops ptr_rc, i8imm, ptr_rc_nosp, i32imm, SEGMENT_REG); 601*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = X86Mem64AsmOperand; 602*9880d681SAndroid Build Coastguard Worker let OperandType = "OPERAND_MEMORY"; 603*9880d681SAndroid Build Coastguard Worker} 604*9880d681SAndroid Build Coastguard Worker 605*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 606*9880d681SAndroid Build Coastguard Worker// SSE pattern fragments 607*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 608*9880d681SAndroid Build Coastguard Worker 609*9880d681SAndroid Build Coastguard Worker// 128-bit load pattern fragments 610*9880d681SAndroid Build Coastguard Worker// NOTE: all 128-bit integer vector loads are promoted to v2i64 611*9880d681SAndroid Build Coastguard Workerdef loadv4f32 : PatFrag<(ops node:$ptr), (v4f32 (load node:$ptr))>; 612*9880d681SAndroid Build Coastguard Workerdef loadv2f64 : PatFrag<(ops node:$ptr), (v2f64 (load node:$ptr))>; 613*9880d681SAndroid Build Coastguard Workerdef loadv2i64 : PatFrag<(ops node:$ptr), (v2i64 (load node:$ptr))>; 614*9880d681SAndroid Build Coastguard Worker 615*9880d681SAndroid Build Coastguard Worker// 256-bit load pattern fragments 616*9880d681SAndroid Build Coastguard Worker// NOTE: all 256-bit integer vector loads are promoted to v4i64 617*9880d681SAndroid Build Coastguard Workerdef loadv8f32 : PatFrag<(ops node:$ptr), (v8f32 (load node:$ptr))>; 618*9880d681SAndroid Build Coastguard Workerdef loadv4f64 : PatFrag<(ops node:$ptr), (v4f64 (load node:$ptr))>; 619*9880d681SAndroid Build Coastguard Workerdef loadv4i64 : PatFrag<(ops node:$ptr), (v4i64 (load node:$ptr))>; 620*9880d681SAndroid Build Coastguard Worker 621*9880d681SAndroid Build Coastguard Worker// 512-bit load pattern fragments 622*9880d681SAndroid Build Coastguard Workerdef loadv16f32 : PatFrag<(ops node:$ptr), (v16f32 (load node:$ptr))>; 623*9880d681SAndroid Build Coastguard Workerdef loadv8f64 : PatFrag<(ops node:$ptr), (v8f64 (load node:$ptr))>; 624*9880d681SAndroid Build Coastguard Workerdef loadv64i8 : PatFrag<(ops node:$ptr), (v64i8 (load node:$ptr))>; 625*9880d681SAndroid Build Coastguard Workerdef loadv32i16 : PatFrag<(ops node:$ptr), (v32i16 (load node:$ptr))>; 626*9880d681SAndroid Build Coastguard Workerdef loadv16i32 : PatFrag<(ops node:$ptr), (v16i32 (load node:$ptr))>; 627*9880d681SAndroid Build Coastguard Workerdef loadv8i64 : PatFrag<(ops node:$ptr), (v8i64 (load node:$ptr))>; 628*9880d681SAndroid Build Coastguard Worker 629*9880d681SAndroid Build Coastguard Worker// 128-/256-/512-bit extload pattern fragments 630*9880d681SAndroid Build Coastguard Workerdef extloadv2f32 : PatFrag<(ops node:$ptr), (v2f64 (extloadvf32 node:$ptr))>; 631*9880d681SAndroid Build Coastguard Workerdef extloadv4f32 : PatFrag<(ops node:$ptr), (v4f64 (extloadvf32 node:$ptr))>; 632*9880d681SAndroid Build Coastguard Workerdef extloadv8f32 : PatFrag<(ops node:$ptr), (v8f64 (extloadvf32 node:$ptr))>; 633*9880d681SAndroid Build Coastguard Worker 634*9880d681SAndroid Build Coastguard Worker// These are needed to match a scalar load that is used in a vector-only 635*9880d681SAndroid Build Coastguard Worker// math instruction such as the FP logical ops: andps, andnps, orps, xorps. 636*9880d681SAndroid Build Coastguard Worker// The memory operand is required to be a 128-bit load, so it must be converted 637*9880d681SAndroid Build Coastguard Worker// from a vector to a scalar. 638*9880d681SAndroid Build Coastguard Workerdef loadf32_128 : PatFrag<(ops node:$ptr), 639*9880d681SAndroid Build Coastguard Worker (f32 (extractelt (loadv4f32 node:$ptr), (iPTR 0)))>; 640*9880d681SAndroid Build Coastguard Workerdef loadf64_128 : PatFrag<(ops node:$ptr), 641*9880d681SAndroid Build Coastguard Worker (f64 (extractelt (loadv2f64 node:$ptr), (iPTR 0)))>; 642*9880d681SAndroid Build Coastguard Worker 643*9880d681SAndroid Build Coastguard Worker// Like 'store', but always requires 128-bit vector alignment. 644*9880d681SAndroid Build Coastguard Workerdef alignedstore : PatFrag<(ops node:$val, node:$ptr), 645*9880d681SAndroid Build Coastguard Worker (store node:$val, node:$ptr), [{ 646*9880d681SAndroid Build Coastguard Worker return cast<StoreSDNode>(N)->getAlignment() >= 16; 647*9880d681SAndroid Build Coastguard Worker}]>; 648*9880d681SAndroid Build Coastguard Worker 649*9880d681SAndroid Build Coastguard Worker// Like 'store', but always requires 256-bit vector alignment. 650*9880d681SAndroid Build Coastguard Workerdef alignedstore256 : PatFrag<(ops node:$val, node:$ptr), 651*9880d681SAndroid Build Coastguard Worker (store node:$val, node:$ptr), [{ 652*9880d681SAndroid Build Coastguard Worker return cast<StoreSDNode>(N)->getAlignment() >= 32; 653*9880d681SAndroid Build Coastguard Worker}]>; 654*9880d681SAndroid Build Coastguard Worker 655*9880d681SAndroid Build Coastguard Worker// Like 'store', but always requires 512-bit vector alignment. 656*9880d681SAndroid Build Coastguard Workerdef alignedstore512 : PatFrag<(ops node:$val, node:$ptr), 657*9880d681SAndroid Build Coastguard Worker (store node:$val, node:$ptr), [{ 658*9880d681SAndroid Build Coastguard Worker return cast<StoreSDNode>(N)->getAlignment() >= 64; 659*9880d681SAndroid Build Coastguard Worker}]>; 660*9880d681SAndroid Build Coastguard Worker 661*9880d681SAndroid Build Coastguard Worker// Like 'load', but always requires 128-bit vector alignment. 662*9880d681SAndroid Build Coastguard Workerdef alignedload : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 663*9880d681SAndroid Build Coastguard Worker return cast<LoadSDNode>(N)->getAlignment() >= 16; 664*9880d681SAndroid Build Coastguard Worker}]>; 665*9880d681SAndroid Build Coastguard Worker 666*9880d681SAndroid Build Coastguard Worker// Like 'load', but always requires 256-bit vector alignment. 667*9880d681SAndroid Build Coastguard Workerdef alignedload256 : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 668*9880d681SAndroid Build Coastguard Worker return cast<LoadSDNode>(N)->getAlignment() >= 32; 669*9880d681SAndroid Build Coastguard Worker}]>; 670*9880d681SAndroid Build Coastguard Worker 671*9880d681SAndroid Build Coastguard Worker// Like 'load', but always requires 512-bit vector alignment. 672*9880d681SAndroid Build Coastguard Workerdef alignedload512 : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 673*9880d681SAndroid Build Coastguard Worker return cast<LoadSDNode>(N)->getAlignment() >= 64; 674*9880d681SAndroid Build Coastguard Worker}]>; 675*9880d681SAndroid Build Coastguard Worker 676*9880d681SAndroid Build Coastguard Workerdef alignedloadfsf32 : PatFrag<(ops node:$ptr), 677*9880d681SAndroid Build Coastguard Worker (f32 (alignedload node:$ptr))>; 678*9880d681SAndroid Build Coastguard Workerdef alignedloadfsf64 : PatFrag<(ops node:$ptr), 679*9880d681SAndroid Build Coastguard Worker (f64 (alignedload node:$ptr))>; 680*9880d681SAndroid Build Coastguard Worker 681*9880d681SAndroid Build Coastguard Worker// 128-bit aligned load pattern fragments 682*9880d681SAndroid Build Coastguard Worker// NOTE: all 128-bit integer vector loads are promoted to v2i64 683*9880d681SAndroid Build Coastguard Workerdef alignedloadv4f32 : PatFrag<(ops node:$ptr), 684*9880d681SAndroid Build Coastguard Worker (v4f32 (alignedload node:$ptr))>; 685*9880d681SAndroid Build Coastguard Workerdef alignedloadv2f64 : PatFrag<(ops node:$ptr), 686*9880d681SAndroid Build Coastguard Worker (v2f64 (alignedload node:$ptr))>; 687*9880d681SAndroid Build Coastguard Workerdef alignedloadv2i64 : PatFrag<(ops node:$ptr), 688*9880d681SAndroid Build Coastguard Worker (v2i64 (alignedload node:$ptr))>; 689*9880d681SAndroid Build Coastguard Worker 690*9880d681SAndroid Build Coastguard Worker// 256-bit aligned load pattern fragments 691*9880d681SAndroid Build Coastguard Worker// NOTE: all 256-bit integer vector loads are promoted to v4i64 692*9880d681SAndroid Build Coastguard Workerdef alignedloadv8f32 : PatFrag<(ops node:$ptr), 693*9880d681SAndroid Build Coastguard Worker (v8f32 (alignedload256 node:$ptr))>; 694*9880d681SAndroid Build Coastguard Workerdef alignedloadv4f64 : PatFrag<(ops node:$ptr), 695*9880d681SAndroid Build Coastguard Worker (v4f64 (alignedload256 node:$ptr))>; 696*9880d681SAndroid Build Coastguard Workerdef alignedloadv4i64 : PatFrag<(ops node:$ptr), 697*9880d681SAndroid Build Coastguard Worker (v4i64 (alignedload256 node:$ptr))>; 698*9880d681SAndroid Build Coastguard Worker 699*9880d681SAndroid Build Coastguard Worker// 512-bit aligned load pattern fragments 700*9880d681SAndroid Build Coastguard Workerdef alignedloadv16f32 : PatFrag<(ops node:$ptr), 701*9880d681SAndroid Build Coastguard Worker (v16f32 (alignedload512 node:$ptr))>; 702*9880d681SAndroid Build Coastguard Workerdef alignedloadv16i32 : PatFrag<(ops node:$ptr), 703*9880d681SAndroid Build Coastguard Worker (v16i32 (alignedload512 node:$ptr))>; 704*9880d681SAndroid Build Coastguard Workerdef alignedloadv8f64 : PatFrag<(ops node:$ptr), 705*9880d681SAndroid Build Coastguard Worker (v8f64 (alignedload512 node:$ptr))>; 706*9880d681SAndroid Build Coastguard Workerdef alignedloadv8i64 : PatFrag<(ops node:$ptr), 707*9880d681SAndroid Build Coastguard Worker (v8i64 (alignedload512 node:$ptr))>; 708*9880d681SAndroid Build Coastguard Worker 709*9880d681SAndroid Build Coastguard Worker// Like 'load', but uses special alignment checks suitable for use in 710*9880d681SAndroid Build Coastguard Worker// memory operands in most SSE instructions, which are required to 711*9880d681SAndroid Build Coastguard Worker// be naturally aligned on some targets but not on others. If the subtarget 712*9880d681SAndroid Build Coastguard Worker// allows unaligned accesses, match any load, though this may require 713*9880d681SAndroid Build Coastguard Worker// setting a feature bit in the processor (on startup, for example). 714*9880d681SAndroid Build Coastguard Worker// Opteron 10h and later implement such a feature. 715*9880d681SAndroid Build Coastguard Workerdef memop : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 716*9880d681SAndroid Build Coastguard Worker return Subtarget->hasSSEUnalignedMem() 717*9880d681SAndroid Build Coastguard Worker || cast<LoadSDNode>(N)->getAlignment() >= 16; 718*9880d681SAndroid Build Coastguard Worker}]>; 719*9880d681SAndroid Build Coastguard Worker 720*9880d681SAndroid Build Coastguard Workerdef memopfsf32 : PatFrag<(ops node:$ptr), (f32 (memop node:$ptr))>; 721*9880d681SAndroid Build Coastguard Workerdef memopfsf64 : PatFrag<(ops node:$ptr), (f64 (memop node:$ptr))>; 722*9880d681SAndroid Build Coastguard Worker 723*9880d681SAndroid Build Coastguard Worker// 128-bit memop pattern fragments 724*9880d681SAndroid Build Coastguard Worker// NOTE: all 128-bit integer vector loads are promoted to v2i64 725*9880d681SAndroid Build Coastguard Workerdef memopv4f32 : PatFrag<(ops node:$ptr), (v4f32 (memop node:$ptr))>; 726*9880d681SAndroid Build Coastguard Workerdef memopv2f64 : PatFrag<(ops node:$ptr), (v2f64 (memop node:$ptr))>; 727*9880d681SAndroid Build Coastguard Workerdef memopv2i64 : PatFrag<(ops node:$ptr), (v2i64 (memop node:$ptr))>; 728*9880d681SAndroid Build Coastguard Worker 729*9880d681SAndroid Build Coastguard Worker// These are needed to match a scalar memop that is used in a vector-only 730*9880d681SAndroid Build Coastguard Worker// math instruction such as the FP logical ops: andps, andnps, orps, xorps. 731*9880d681SAndroid Build Coastguard Worker// The memory operand is required to be a 128-bit load, so it must be converted 732*9880d681SAndroid Build Coastguard Worker// from a vector to a scalar. 733*9880d681SAndroid Build Coastguard Workerdef memopfsf32_128 : PatFrag<(ops node:$ptr), 734*9880d681SAndroid Build Coastguard Worker (f32 (extractelt (memopv4f32 node:$ptr), (iPTR 0)))>; 735*9880d681SAndroid Build Coastguard Workerdef memopfsf64_128 : PatFrag<(ops node:$ptr), 736*9880d681SAndroid Build Coastguard Worker (f64 (extractelt (memopv2f64 node:$ptr), (iPTR 0)))>; 737*9880d681SAndroid Build Coastguard Worker 738*9880d681SAndroid Build Coastguard Worker 739*9880d681SAndroid Build Coastguard Worker// SSSE3 uses MMX registers for some instructions. They aren't aligned on a 740*9880d681SAndroid Build Coastguard Worker// 16-byte boundary. 741*9880d681SAndroid Build Coastguard Worker// FIXME: 8 byte alignment for mmx reads is not required 742*9880d681SAndroid Build Coastguard Workerdef memop64 : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 743*9880d681SAndroid Build Coastguard Worker return cast<LoadSDNode>(N)->getAlignment() >= 8; 744*9880d681SAndroid Build Coastguard Worker}]>; 745*9880d681SAndroid Build Coastguard Worker 746*9880d681SAndroid Build Coastguard Workerdef memopmmx : PatFrag<(ops node:$ptr), (x86mmx (memop64 node:$ptr))>; 747*9880d681SAndroid Build Coastguard Worker 748*9880d681SAndroid Build Coastguard Workerdef mgatherv4i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 749*9880d681SAndroid Build Coastguard Worker (masked_gather node:$src1, node:$src2, node:$src3) , [{ 750*9880d681SAndroid Build Coastguard Worker if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) 751*9880d681SAndroid Build Coastguard Worker return (Mgt->getIndex().getValueType() == MVT::v4i32 || 752*9880d681SAndroid Build Coastguard Worker Mgt->getBasePtr().getValueType() == MVT::v4i32); 753*9880d681SAndroid Build Coastguard Worker return false; 754*9880d681SAndroid Build Coastguard Worker}]>; 755*9880d681SAndroid Build Coastguard Worker 756*9880d681SAndroid Build Coastguard Workerdef mgatherv8i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 757*9880d681SAndroid Build Coastguard Worker (masked_gather node:$src1, node:$src2, node:$src3) , [{ 758*9880d681SAndroid Build Coastguard Worker if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) 759*9880d681SAndroid Build Coastguard Worker return (Mgt->getIndex().getValueType() == MVT::v8i32 || 760*9880d681SAndroid Build Coastguard Worker Mgt->getBasePtr().getValueType() == MVT::v8i32); 761*9880d681SAndroid Build Coastguard Worker return false; 762*9880d681SAndroid Build Coastguard Worker}]>; 763*9880d681SAndroid Build Coastguard Worker 764*9880d681SAndroid Build Coastguard Workerdef mgatherv2i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 765*9880d681SAndroid Build Coastguard Worker (masked_gather node:$src1, node:$src2, node:$src3) , [{ 766*9880d681SAndroid Build Coastguard Worker if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) 767*9880d681SAndroid Build Coastguard Worker return (Mgt->getIndex().getValueType() == MVT::v2i64 || 768*9880d681SAndroid Build Coastguard Worker Mgt->getBasePtr().getValueType() == MVT::v2i64); 769*9880d681SAndroid Build Coastguard Worker return false; 770*9880d681SAndroid Build Coastguard Worker}]>; 771*9880d681SAndroid Build Coastguard Workerdef mgatherv4i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 772*9880d681SAndroid Build Coastguard Worker (masked_gather node:$src1, node:$src2, node:$src3) , [{ 773*9880d681SAndroid Build Coastguard Worker if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) 774*9880d681SAndroid Build Coastguard Worker return (Mgt->getIndex().getValueType() == MVT::v4i64 || 775*9880d681SAndroid Build Coastguard Worker Mgt->getBasePtr().getValueType() == MVT::v4i64); 776*9880d681SAndroid Build Coastguard Worker return false; 777*9880d681SAndroid Build Coastguard Worker}]>; 778*9880d681SAndroid Build Coastguard Workerdef mgatherv8i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 779*9880d681SAndroid Build Coastguard Worker (masked_gather node:$src1, node:$src2, node:$src3) , [{ 780*9880d681SAndroid Build Coastguard Worker if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) 781*9880d681SAndroid Build Coastguard Worker return (Mgt->getIndex().getValueType() == MVT::v8i64 || 782*9880d681SAndroid Build Coastguard Worker Mgt->getBasePtr().getValueType() == MVT::v8i64); 783*9880d681SAndroid Build Coastguard Worker return false; 784*9880d681SAndroid Build Coastguard Worker}]>; 785*9880d681SAndroid Build Coastguard Workerdef mgatherv16i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 786*9880d681SAndroid Build Coastguard Worker (masked_gather node:$src1, node:$src2, node:$src3) , [{ 787*9880d681SAndroid Build Coastguard Worker if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) 788*9880d681SAndroid Build Coastguard Worker return (Mgt->getIndex().getValueType() == MVT::v16i32 || 789*9880d681SAndroid Build Coastguard Worker Mgt->getBasePtr().getValueType() == MVT::v16i32); 790*9880d681SAndroid Build Coastguard Worker return false; 791*9880d681SAndroid Build Coastguard Worker}]>; 792*9880d681SAndroid Build Coastguard Worker 793*9880d681SAndroid Build Coastguard Workerdef mscatterv2i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 794*9880d681SAndroid Build Coastguard Worker (masked_scatter node:$src1, node:$src2, node:$src3) , [{ 795*9880d681SAndroid Build Coastguard Worker if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) 796*9880d681SAndroid Build Coastguard Worker return (Sc->getIndex().getValueType() == MVT::v2i64 || 797*9880d681SAndroid Build Coastguard Worker Sc->getBasePtr().getValueType() == MVT::v2i64); 798*9880d681SAndroid Build Coastguard Worker return false; 799*9880d681SAndroid Build Coastguard Worker}]>; 800*9880d681SAndroid Build Coastguard Worker 801*9880d681SAndroid Build Coastguard Workerdef mscatterv4i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 802*9880d681SAndroid Build Coastguard Worker (masked_scatter node:$src1, node:$src2, node:$src3) , [{ 803*9880d681SAndroid Build Coastguard Worker if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) 804*9880d681SAndroid Build Coastguard Worker return (Sc->getIndex().getValueType() == MVT::v4i32 || 805*9880d681SAndroid Build Coastguard Worker Sc->getBasePtr().getValueType() == MVT::v4i32); 806*9880d681SAndroid Build Coastguard Worker return false; 807*9880d681SAndroid Build Coastguard Worker}]>; 808*9880d681SAndroid Build Coastguard Worker 809*9880d681SAndroid Build Coastguard Workerdef mscatterv4i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 810*9880d681SAndroid Build Coastguard Worker (masked_scatter node:$src1, node:$src2, node:$src3) , [{ 811*9880d681SAndroid Build Coastguard Worker if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) 812*9880d681SAndroid Build Coastguard Worker return (Sc->getIndex().getValueType() == MVT::v4i64 || 813*9880d681SAndroid Build Coastguard Worker Sc->getBasePtr().getValueType() == MVT::v4i64); 814*9880d681SAndroid Build Coastguard Worker return false; 815*9880d681SAndroid Build Coastguard Worker}]>; 816*9880d681SAndroid Build Coastguard Worker 817*9880d681SAndroid Build Coastguard Workerdef mscatterv8i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 818*9880d681SAndroid Build Coastguard Worker (masked_scatter node:$src1, node:$src2, node:$src3) , [{ 819*9880d681SAndroid Build Coastguard Worker if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) 820*9880d681SAndroid Build Coastguard Worker return (Sc->getIndex().getValueType() == MVT::v8i32 || 821*9880d681SAndroid Build Coastguard Worker Sc->getBasePtr().getValueType() == MVT::v8i32); 822*9880d681SAndroid Build Coastguard Worker return false; 823*9880d681SAndroid Build Coastguard Worker}]>; 824*9880d681SAndroid Build Coastguard Worker 825*9880d681SAndroid Build Coastguard Workerdef mscatterv8i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 826*9880d681SAndroid Build Coastguard Worker (masked_scatter node:$src1, node:$src2, node:$src3) , [{ 827*9880d681SAndroid Build Coastguard Worker if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) 828*9880d681SAndroid Build Coastguard Worker return (Sc->getIndex().getValueType() == MVT::v8i64 || 829*9880d681SAndroid Build Coastguard Worker Sc->getBasePtr().getValueType() == MVT::v8i64); 830*9880d681SAndroid Build Coastguard Worker return false; 831*9880d681SAndroid Build Coastguard Worker}]>; 832*9880d681SAndroid Build Coastguard Workerdef mscatterv16i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 833*9880d681SAndroid Build Coastguard Worker (masked_scatter node:$src1, node:$src2, node:$src3) , [{ 834*9880d681SAndroid Build Coastguard Worker if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) 835*9880d681SAndroid Build Coastguard Worker return (Sc->getIndex().getValueType() == MVT::v16i32 || 836*9880d681SAndroid Build Coastguard Worker Sc->getBasePtr().getValueType() == MVT::v16i32); 837*9880d681SAndroid Build Coastguard Worker return false; 838*9880d681SAndroid Build Coastguard Worker}]>; 839*9880d681SAndroid Build Coastguard Worker 840*9880d681SAndroid Build Coastguard Worker// 128-bit bitconvert pattern fragments 841*9880d681SAndroid Build Coastguard Workerdef bc_v4f32 : PatFrag<(ops node:$in), (v4f32 (bitconvert node:$in))>; 842*9880d681SAndroid Build Coastguard Workerdef bc_v2f64 : PatFrag<(ops node:$in), (v2f64 (bitconvert node:$in))>; 843*9880d681SAndroid Build Coastguard Workerdef bc_v16i8 : PatFrag<(ops node:$in), (v16i8 (bitconvert node:$in))>; 844*9880d681SAndroid Build Coastguard Workerdef bc_v8i16 : PatFrag<(ops node:$in), (v8i16 (bitconvert node:$in))>; 845*9880d681SAndroid Build Coastguard Workerdef bc_v4i32 : PatFrag<(ops node:$in), (v4i32 (bitconvert node:$in))>; 846*9880d681SAndroid Build Coastguard Workerdef bc_v2i64 : PatFrag<(ops node:$in), (v2i64 (bitconvert node:$in))>; 847*9880d681SAndroid Build Coastguard Worker 848*9880d681SAndroid Build Coastguard Worker// 256-bit bitconvert pattern fragments 849*9880d681SAndroid Build Coastguard Workerdef bc_v32i8 : PatFrag<(ops node:$in), (v32i8 (bitconvert node:$in))>; 850*9880d681SAndroid Build Coastguard Workerdef bc_v16i16 : PatFrag<(ops node:$in), (v16i16 (bitconvert node:$in))>; 851*9880d681SAndroid Build Coastguard Workerdef bc_v8i32 : PatFrag<(ops node:$in), (v8i32 (bitconvert node:$in))>; 852*9880d681SAndroid Build Coastguard Workerdef bc_v4i64 : PatFrag<(ops node:$in), (v4i64 (bitconvert node:$in))>; 853*9880d681SAndroid Build Coastguard Workerdef bc_v8f32 : PatFrag<(ops node:$in), (v8f32 (bitconvert node:$in))>; 854*9880d681SAndroid Build Coastguard Worker 855*9880d681SAndroid Build Coastguard Worker// 512-bit bitconvert pattern fragments 856*9880d681SAndroid Build Coastguard Workerdef bc_v16i32 : PatFrag<(ops node:$in), (v16i32 (bitconvert node:$in))>; 857*9880d681SAndroid Build Coastguard Workerdef bc_v8i64 : PatFrag<(ops node:$in), (v8i64 (bitconvert node:$in))>; 858*9880d681SAndroid Build Coastguard Workerdef bc_v8f64 : PatFrag<(ops node:$in), (v8f64 (bitconvert node:$in))>; 859*9880d681SAndroid Build Coastguard Workerdef bc_v16f32 : PatFrag<(ops node:$in), (v16f32 (bitconvert node:$in))>; 860*9880d681SAndroid Build Coastguard Worker 861*9880d681SAndroid Build Coastguard Workerdef vzmovl_v2i64 : PatFrag<(ops node:$src), 862*9880d681SAndroid Build Coastguard Worker (bitconvert (v2i64 (X86vzmovl 863*9880d681SAndroid Build Coastguard Worker (v2i64 (scalar_to_vector (loadi64 node:$src))))))>; 864*9880d681SAndroid Build Coastguard Workerdef vzmovl_v4i32 : PatFrag<(ops node:$src), 865*9880d681SAndroid Build Coastguard Worker (bitconvert (v4i32 (X86vzmovl 866*9880d681SAndroid Build Coastguard Worker (v4i32 (scalar_to_vector (loadi32 node:$src))))))>; 867*9880d681SAndroid Build Coastguard Worker 868*9880d681SAndroid Build Coastguard Workerdef vzload_v2i64 : PatFrag<(ops node:$src), 869*9880d681SAndroid Build Coastguard Worker (bitconvert (v2i64 (X86vzload node:$src)))>; 870*9880d681SAndroid Build Coastguard Worker 871*9880d681SAndroid Build Coastguard Worker 872*9880d681SAndroid Build Coastguard Workerdef fp32imm0 : PatLeaf<(f32 fpimm), [{ 873*9880d681SAndroid Build Coastguard Worker return N->isExactlyValue(+0.0); 874*9880d681SAndroid Build Coastguard Worker}]>; 875*9880d681SAndroid Build Coastguard Worker 876*9880d681SAndroid Build Coastguard Workerdef I8Imm : SDNodeXForm<imm, [{ 877*9880d681SAndroid Build Coastguard Worker // Transformation function: get the low 8 bits. 878*9880d681SAndroid Build Coastguard Worker return getI8Imm((uint8_t)N->getZExtValue(), SDLoc(N)); 879*9880d681SAndroid Build Coastguard Worker}]>; 880*9880d681SAndroid Build Coastguard Worker 881*9880d681SAndroid Build Coastguard Workerdef FROUND_NO_EXC : ImmLeaf<i32, [{ return Imm == 8; }]>; 882*9880d681SAndroid Build Coastguard Workerdef FROUND_CURRENT : ImmLeaf<i32, [{ 883*9880d681SAndroid Build Coastguard Worker return Imm == X86::STATIC_ROUNDING::CUR_DIRECTION; 884*9880d681SAndroid Build Coastguard Worker}]>; 885*9880d681SAndroid Build Coastguard Worker 886*9880d681SAndroid Build Coastguard Worker// BYTE_imm - Transform bit immediates into byte immediates. 887*9880d681SAndroid Build Coastguard Workerdef BYTE_imm : SDNodeXForm<imm, [{ 888*9880d681SAndroid Build Coastguard Worker // Transformation function: imm >> 3 889*9880d681SAndroid Build Coastguard Worker return getI32Imm(N->getZExtValue() >> 3, SDLoc(N)); 890*9880d681SAndroid Build Coastguard Worker}]>; 891*9880d681SAndroid Build Coastguard Worker 892*9880d681SAndroid Build Coastguard Worker// EXTRACT_get_vextract128_imm xform function: convert extract_subvector index 893*9880d681SAndroid Build Coastguard Worker// to VEXTRACTF128/VEXTRACTI128 imm. 894*9880d681SAndroid Build Coastguard Workerdef EXTRACT_get_vextract128_imm : SDNodeXForm<extract_subvector, [{ 895*9880d681SAndroid Build Coastguard Worker return getI8Imm(X86::getExtractVEXTRACT128Immediate(N), SDLoc(N)); 896*9880d681SAndroid Build Coastguard Worker}]>; 897*9880d681SAndroid Build Coastguard Worker 898*9880d681SAndroid Build Coastguard Worker// INSERT_get_vinsert128_imm xform function: convert insert_subvector index to 899*9880d681SAndroid Build Coastguard Worker// VINSERTF128/VINSERTI128 imm. 900*9880d681SAndroid Build Coastguard Workerdef INSERT_get_vinsert128_imm : SDNodeXForm<insert_subvector, [{ 901*9880d681SAndroid Build Coastguard Worker return getI8Imm(X86::getInsertVINSERT128Immediate(N), SDLoc(N)); 902*9880d681SAndroid Build Coastguard Worker}]>; 903*9880d681SAndroid Build Coastguard Worker 904*9880d681SAndroid Build Coastguard Worker// EXTRACT_get_vextract256_imm xform function: convert extract_subvector index 905*9880d681SAndroid Build Coastguard Worker// to VEXTRACTF64x4 imm. 906*9880d681SAndroid Build Coastguard Workerdef EXTRACT_get_vextract256_imm : SDNodeXForm<extract_subvector, [{ 907*9880d681SAndroid Build Coastguard Worker return getI8Imm(X86::getExtractVEXTRACT256Immediate(N), SDLoc(N)); 908*9880d681SAndroid Build Coastguard Worker}]>; 909*9880d681SAndroid Build Coastguard Worker 910*9880d681SAndroid Build Coastguard Worker// INSERT_get_vinsert256_imm xform function: convert insert_subvector index to 911*9880d681SAndroid Build Coastguard Worker// VINSERTF64x4 imm. 912*9880d681SAndroid Build Coastguard Workerdef INSERT_get_vinsert256_imm : SDNodeXForm<insert_subvector, [{ 913*9880d681SAndroid Build Coastguard Worker return getI8Imm(X86::getInsertVINSERT256Immediate(N), SDLoc(N)); 914*9880d681SAndroid Build Coastguard Worker}]>; 915*9880d681SAndroid Build Coastguard Worker 916*9880d681SAndroid Build Coastguard Workerdef vextract128_extract : PatFrag<(ops node:$bigvec, node:$index), 917*9880d681SAndroid Build Coastguard Worker (extract_subvector node:$bigvec, 918*9880d681SAndroid Build Coastguard Worker node:$index), [{ 919*9880d681SAndroid Build Coastguard Worker return X86::isVEXTRACT128Index(N); 920*9880d681SAndroid Build Coastguard Worker}], EXTRACT_get_vextract128_imm>; 921*9880d681SAndroid Build Coastguard Worker 922*9880d681SAndroid Build Coastguard Workerdef vinsert128_insert : PatFrag<(ops node:$bigvec, node:$smallvec, 923*9880d681SAndroid Build Coastguard Worker node:$index), 924*9880d681SAndroid Build Coastguard Worker (insert_subvector node:$bigvec, node:$smallvec, 925*9880d681SAndroid Build Coastguard Worker node:$index), [{ 926*9880d681SAndroid Build Coastguard Worker return X86::isVINSERT128Index(N); 927*9880d681SAndroid Build Coastguard Worker}], INSERT_get_vinsert128_imm>; 928*9880d681SAndroid Build Coastguard Worker 929*9880d681SAndroid Build Coastguard Worker 930*9880d681SAndroid Build Coastguard Workerdef vextract256_extract : PatFrag<(ops node:$bigvec, node:$index), 931*9880d681SAndroid Build Coastguard Worker (extract_subvector node:$bigvec, 932*9880d681SAndroid Build Coastguard Worker node:$index), [{ 933*9880d681SAndroid Build Coastguard Worker return X86::isVEXTRACT256Index(N); 934*9880d681SAndroid Build Coastguard Worker}], EXTRACT_get_vextract256_imm>; 935*9880d681SAndroid Build Coastguard Worker 936*9880d681SAndroid Build Coastguard Workerdef vinsert256_insert : PatFrag<(ops node:$bigvec, node:$smallvec, 937*9880d681SAndroid Build Coastguard Worker node:$index), 938*9880d681SAndroid Build Coastguard Worker (insert_subvector node:$bigvec, node:$smallvec, 939*9880d681SAndroid Build Coastguard Worker node:$index), [{ 940*9880d681SAndroid Build Coastguard Worker return X86::isVINSERT256Index(N); 941*9880d681SAndroid Build Coastguard Worker}], INSERT_get_vinsert256_imm>; 942*9880d681SAndroid Build Coastguard Worker 943*9880d681SAndroid Build Coastguard Workerdef masked_load_aligned128 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 944*9880d681SAndroid Build Coastguard Worker (masked_load node:$src1, node:$src2, node:$src3), [{ 945*9880d681SAndroid Build Coastguard Worker if (auto *Load = dyn_cast<MaskedLoadSDNode>(N)) 946*9880d681SAndroid Build Coastguard Worker return Load->getAlignment() >= 16; 947*9880d681SAndroid Build Coastguard Worker return false; 948*9880d681SAndroid Build Coastguard Worker}]>; 949*9880d681SAndroid Build Coastguard Worker 950*9880d681SAndroid Build Coastguard Workerdef masked_load_aligned256 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 951*9880d681SAndroid Build Coastguard Worker (masked_load node:$src1, node:$src2, node:$src3), [{ 952*9880d681SAndroid Build Coastguard Worker if (auto *Load = dyn_cast<MaskedLoadSDNode>(N)) 953*9880d681SAndroid Build Coastguard Worker return Load->getAlignment() >= 32; 954*9880d681SAndroid Build Coastguard Worker return false; 955*9880d681SAndroid Build Coastguard Worker}]>; 956*9880d681SAndroid Build Coastguard Worker 957*9880d681SAndroid Build Coastguard Workerdef masked_load_aligned512 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 958*9880d681SAndroid Build Coastguard Worker (masked_load node:$src1, node:$src2, node:$src3), [{ 959*9880d681SAndroid Build Coastguard Worker if (auto *Load = dyn_cast<MaskedLoadSDNode>(N)) 960*9880d681SAndroid Build Coastguard Worker return Load->getAlignment() >= 64; 961*9880d681SAndroid Build Coastguard Worker return false; 962*9880d681SAndroid Build Coastguard Worker}]>; 963*9880d681SAndroid Build Coastguard Worker 964*9880d681SAndroid Build Coastguard Workerdef masked_load_unaligned : PatFrag<(ops node:$src1, node:$src2, node:$src3), 965*9880d681SAndroid Build Coastguard Worker (masked_load node:$src1, node:$src2, node:$src3), [{ 966*9880d681SAndroid Build Coastguard Worker return isa<MaskedLoadSDNode>(N); 967*9880d681SAndroid Build Coastguard Worker}]>; 968*9880d681SAndroid Build Coastguard Worker 969*9880d681SAndroid Build Coastguard Worker// Masked store fragments. 970*9880d681SAndroid Build Coastguard Worker// X86mstore can't be implemented in core DAG files because some targets 971*9880d681SAndroid Build Coastguard Worker// do not support vector types (llvm-tblgen will fail). 972*9880d681SAndroid Build Coastguard Workerdef X86mstore : PatFrag<(ops node:$src1, node:$src2, node:$src3), 973*9880d681SAndroid Build Coastguard Worker (masked_store node:$src1, node:$src2, node:$src3), [{ 974*9880d681SAndroid Build Coastguard Worker return !cast<MaskedStoreSDNode>(N)->isTruncatingStore(); 975*9880d681SAndroid Build Coastguard Worker}]>; 976*9880d681SAndroid Build Coastguard Worker 977*9880d681SAndroid Build Coastguard Workerdef masked_store_aligned128 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 978*9880d681SAndroid Build Coastguard Worker (X86mstore node:$src1, node:$src2, node:$src3), [{ 979*9880d681SAndroid Build Coastguard Worker if (auto *Store = dyn_cast<MaskedStoreSDNode>(N)) 980*9880d681SAndroid Build Coastguard Worker return Store->getAlignment() >= 16; 981*9880d681SAndroid Build Coastguard Worker return false; 982*9880d681SAndroid Build Coastguard Worker}]>; 983*9880d681SAndroid Build Coastguard Worker 984*9880d681SAndroid Build Coastguard Workerdef masked_store_aligned256 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 985*9880d681SAndroid Build Coastguard Worker (X86mstore node:$src1, node:$src2, node:$src3), [{ 986*9880d681SAndroid Build Coastguard Worker if (auto *Store = dyn_cast<MaskedStoreSDNode>(N)) 987*9880d681SAndroid Build Coastguard Worker return Store->getAlignment() >= 32; 988*9880d681SAndroid Build Coastguard Worker return false; 989*9880d681SAndroid Build Coastguard Worker}]>; 990*9880d681SAndroid Build Coastguard Worker 991*9880d681SAndroid Build Coastguard Workerdef masked_store_aligned512 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 992*9880d681SAndroid Build Coastguard Worker (X86mstore node:$src1, node:$src2, node:$src3), [{ 993*9880d681SAndroid Build Coastguard Worker if (auto *Store = dyn_cast<MaskedStoreSDNode>(N)) 994*9880d681SAndroid Build Coastguard Worker return Store->getAlignment() >= 64; 995*9880d681SAndroid Build Coastguard Worker return false; 996*9880d681SAndroid Build Coastguard Worker}]>; 997*9880d681SAndroid Build Coastguard Worker 998*9880d681SAndroid Build Coastguard Workerdef masked_store_unaligned : PatFrag<(ops node:$src1, node:$src2, node:$src3), 999*9880d681SAndroid Build Coastguard Worker (X86mstore node:$src1, node:$src2, node:$src3), [{ 1000*9880d681SAndroid Build Coastguard Worker return isa<MaskedStoreSDNode>(N); 1001*9880d681SAndroid Build Coastguard Worker}]>; 1002*9880d681SAndroid Build Coastguard Worker 1003*9880d681SAndroid Build Coastguard Worker// masked truncstore fragments 1004*9880d681SAndroid Build Coastguard Worker// X86mtruncstore can't be implemented in core DAG files because some targets 1005*9880d681SAndroid Build Coastguard Worker// doesn't support vector type ( llvm-tblgen will fail) 1006*9880d681SAndroid Build Coastguard Workerdef X86mtruncstore : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1007*9880d681SAndroid Build Coastguard Worker (masked_store node:$src1, node:$src2, node:$src3), [{ 1008*9880d681SAndroid Build Coastguard Worker return cast<MaskedStoreSDNode>(N)->isTruncatingStore(); 1009*9880d681SAndroid Build Coastguard Worker}]>; 1010*9880d681SAndroid Build Coastguard Workerdef masked_truncstorevi8 : 1011*9880d681SAndroid Build Coastguard Worker PatFrag<(ops node:$src1, node:$src2, node:$src3), 1012*9880d681SAndroid Build Coastguard Worker (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ 1013*9880d681SAndroid Build Coastguard Worker return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; 1014*9880d681SAndroid Build Coastguard Worker}]>; 1015*9880d681SAndroid Build Coastguard Workerdef masked_truncstorevi16 : 1016*9880d681SAndroid Build Coastguard Worker PatFrag<(ops node:$src1, node:$src2, node:$src3), 1017*9880d681SAndroid Build Coastguard Worker (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ 1018*9880d681SAndroid Build Coastguard Worker return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; 1019*9880d681SAndroid Build Coastguard Worker}]>; 1020*9880d681SAndroid Build Coastguard Workerdef masked_truncstorevi32 : 1021*9880d681SAndroid Build Coastguard Worker PatFrag<(ops node:$src1, node:$src2, node:$src3), 1022*9880d681SAndroid Build Coastguard Worker (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ 1023*9880d681SAndroid Build Coastguard Worker return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; 1024*9880d681SAndroid Build Coastguard Worker}]>; 1025