10b57cec5SDimitry Andric//===-- X86InstrFragmentsSIMD.td - x86 SIMD ISA ------------*- tablegen -*-===// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric// 90b57cec5SDimitry Andric// This file provides pattern fragments useful for SIMD instructions. 100b57cec5SDimitry Andric// 110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 140b57cec5SDimitry Andric// MMX specific DAG Nodes. 150b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric// Low word of MMX to GPR. 180b57cec5SDimitry Andricdef MMX_X86movd2w : SDNode<"X86ISD::MMX_MOVD2W", SDTypeProfile<1, 1, 190b57cec5SDimitry Andric [SDTCisVT<0, i32>, SDTCisVT<1, x86mmx>]>>; 200b57cec5SDimitry Andric// GPR to low word of MMX. 210b57cec5SDimitry Andricdef MMX_X86movw2d : SDNode<"X86ISD::MMX_MOVW2D", SDTypeProfile<1, 1, 220b57cec5SDimitry Andric [SDTCisVT<0, x86mmx>, SDTCisVT<1, i32>]>>; 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 250b57cec5SDimitry Andric// MMX Pattern Fragments 260b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 270b57cec5SDimitry Andric 280b57cec5SDimitry Andricdef load_mmx : PatFrag<(ops node:$ptr), (x86mmx (load node:$ptr))>; 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 310b57cec5SDimitry Andric// SSE specific DAG Nodes. 320b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 330b57cec5SDimitry Andric 340b57cec5SDimitry Andricdef SDTX86VFCMP : SDTypeProfile<1, 3, [SDTCisFP<0>, SDTCisVec<0>, 350b57cec5SDimitry Andric SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, 360b57cec5SDimitry Andric SDTCisVT<3, i8>]>; 370b57cec5SDimitry Andric 380b57cec5SDimitry Andricdef X86fmin : SDNode<"X86ISD::FMIN", SDTFPBinOp>; 390b57cec5SDimitry Andricdef X86fmax : SDNode<"X86ISD::FMAX", SDTFPBinOp>; 400b57cec5SDimitry Andricdef X86fmins : SDNode<"X86ISD::FMINS", SDTFPBinOp>; 410b57cec5SDimitry Andricdef X86fmaxs : SDNode<"X86ISD::FMAXS", SDTFPBinOp>; 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric// Commutative and Associative FMIN and FMAX. 440b57cec5SDimitry Andricdef X86fminc : SDNode<"X86ISD::FMINC", SDTFPBinOp, 450b57cec5SDimitry Andric [SDNPCommutative, SDNPAssociative]>; 460b57cec5SDimitry Andricdef X86fmaxc : SDNode<"X86ISD::FMAXC", SDTFPBinOp, 470b57cec5SDimitry Andric [SDNPCommutative, SDNPAssociative]>; 480b57cec5SDimitry Andric 490b57cec5SDimitry Andricdef X86fand : SDNode<"X86ISD::FAND", SDTFPBinOp, 500b57cec5SDimitry Andric [SDNPCommutative, SDNPAssociative]>; 510b57cec5SDimitry Andricdef X86for : SDNode<"X86ISD::FOR", SDTFPBinOp, 520b57cec5SDimitry Andric [SDNPCommutative, SDNPAssociative]>; 530b57cec5SDimitry Andricdef X86fxor : SDNode<"X86ISD::FXOR", SDTFPBinOp, 540b57cec5SDimitry Andric [SDNPCommutative, SDNPAssociative]>; 550b57cec5SDimitry Andricdef X86fandn : SDNode<"X86ISD::FANDN", SDTFPBinOp>; 560b57cec5SDimitry Andricdef X86frsqrt : SDNode<"X86ISD::FRSQRT", SDTFPUnaryOp>; 570b57cec5SDimitry Andricdef X86frcp : SDNode<"X86ISD::FRCP", SDTFPUnaryOp>; 580b57cec5SDimitry Andricdef X86fhadd : SDNode<"X86ISD::FHADD", SDTFPBinOp>; 590b57cec5SDimitry Andricdef X86fhsub : SDNode<"X86ISD::FHSUB", SDTFPBinOp>; 600b57cec5SDimitry Andricdef X86hadd : SDNode<"X86ISD::HADD", SDTIntBinOp>; 610b57cec5SDimitry Andricdef X86hsub : SDNode<"X86ISD::HSUB", SDTIntBinOp>; 625ffd83dbSDimitry Andricdef X86comi : SDNode<"X86ISD::COMI", SDTX86FCmp>; 635ffd83dbSDimitry Andricdef X86ucomi : SDNode<"X86ISD::UCOMI", SDTX86FCmp>; 645ffd83dbSDimitry Andric 655ffd83dbSDimitry Andricdef SDTX86Cmps : SDTypeProfile<1, 3, [SDTCisFP<0>, SDTCisSameAs<0, 1>, 665ffd83dbSDimitry Andric SDTCisSameAs<1, 2>, SDTCisVT<3, i8>]>; 670b57cec5SDimitry Andricdef X86cmps : SDNode<"X86ISD::FSETCC", SDTX86Cmps>; 685ffd83dbSDimitry Andric 690b57cec5SDimitry Andricdef X86pshufb : SDNode<"X86ISD::PSHUFB", 700b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i8>, SDTCisSameAs<0,1>, 710b57cec5SDimitry Andric SDTCisSameAs<0,2>]>>; 720b57cec5SDimitry Andricdef X86psadbw : SDNode<"X86ISD::PSADBW", 730b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, 740b57cec5SDimitry Andric SDTCVecEltisVT<1, i8>, 750b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 760b57cec5SDimitry Andric SDTCisSameAs<1,2>]>, [SDNPCommutative]>; 770b57cec5SDimitry Andricdef X86dbpsadbw : SDNode<"X86ISD::DBPSADBW", 780b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCVecEltisVT<0, i16>, 790b57cec5SDimitry Andric SDTCVecEltisVT<1, i8>, 800b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 810b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisVT<3, i8>]>>; 820b57cec5SDimitry Andricdef X86andnp : SDNode<"X86ISD::ANDNP", 830b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 840b57cec5SDimitry Andric SDTCisSameAs<0,2>]>>; 850b57cec5SDimitry Andricdef X86multishift : SDNode<"X86ISD::MULTISHIFT", 860b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 870b57cec5SDimitry Andric SDTCisSameAs<1,2>]>>; 880b57cec5SDimitry Andricdef X86pextrb : SDNode<"X86ISD::PEXTRB", 890b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisVT<1, v16i8>, 90e8d8bef9SDimitry Andric SDTCisVT<2, i8>]>>; 910b57cec5SDimitry Andricdef X86pextrw : SDNode<"X86ISD::PEXTRW", 920b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisVT<1, v8i16>, 93e8d8bef9SDimitry Andric SDTCisVT<2, i8>]>>; 940b57cec5SDimitry Andricdef X86pinsrb : SDNode<"X86ISD::PINSRB", 950b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, v16i8>, SDTCisSameAs<0,1>, 96e8d8bef9SDimitry Andric SDTCisVT<2, i32>, SDTCisVT<3, i8>]>>; 970b57cec5SDimitry Andricdef X86pinsrw : SDNode<"X86ISD::PINSRW", 980b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, v8i16>, SDTCisSameAs<0,1>, 99e8d8bef9SDimitry Andric SDTCisVT<2, i32>, SDTCisVT<3, i8>]>>; 1000b57cec5SDimitry Andricdef X86insertps : SDNode<"X86ISD::INSERTPS", 1010b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, v4f32>, SDTCisSameAs<0,1>, 1020b57cec5SDimitry Andric SDTCisVT<2, v4f32>, SDTCisVT<3, i8>]>>; 1030b57cec5SDimitry Andricdef X86vzmovl : SDNode<"X86ISD::VZEXT_MOVL", 1040b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCisSameAs<0,1>]>>; 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andricdef X86vzld : SDNode<"X86ISD::VZEXT_LOAD", SDTLoad, 1070b57cec5SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 1080b57cec5SDimitry Andricdef X86vextractst : SDNode<"X86ISD::VEXTRACT_STORE", SDTStore, 1090b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 1108bcb0991SDimitry Andricdef X86VBroadcastld : SDNode<"X86ISD::VBROADCAST_LOAD", SDTLoad, 1118bcb0991SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 112e8d8bef9SDimitry Andricdef X86SubVBroadcastld : SDNode<"X86ISD::SUBV_BROADCAST_LOAD", SDTLoad, 113e8d8bef9SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 1140b57cec5SDimitry Andric 1150b57cec5SDimitry Andricdef SDTVtrunc : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 1160b57cec5SDimitry Andric SDTCisInt<0>, SDTCisInt<1>, 1170b57cec5SDimitry Andric SDTCisOpSmallerThanOp<0, 1>]>; 1180b57cec5SDimitry Andricdef SDTVmtrunc : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisVec<1>, 1190b57cec5SDimitry Andric SDTCisInt<0>, SDTCisInt<1>, 1200b57cec5SDimitry Andric SDTCisOpSmallerThanOp<0, 1>, 1210b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 1220b57cec5SDimitry Andric SDTCVecEltisVT<3, i1>, 1230b57cec5SDimitry Andric SDTCisSameNumEltsAs<1, 3>]>; 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andricdef X86vtrunc : SDNode<"X86ISD::VTRUNC", SDTVtrunc>; 1260b57cec5SDimitry Andricdef X86vtruncs : SDNode<"X86ISD::VTRUNCS", SDTVtrunc>; 1270b57cec5SDimitry Andricdef X86vtruncus : SDNode<"X86ISD::VTRUNCUS", SDTVtrunc>; 1280b57cec5SDimitry Andricdef X86vmtrunc : SDNode<"X86ISD::VMTRUNC", SDTVmtrunc>; 1290b57cec5SDimitry Andricdef X86vmtruncs : SDNode<"X86ISD::VMTRUNCS", SDTVmtrunc>; 1300b57cec5SDimitry Andricdef X86vmtruncus : SDNode<"X86ISD::VMTRUNCUS", SDTVmtrunc>; 1310b57cec5SDimitry Andric 1320b57cec5SDimitry Andricdef X86vfpext : SDNode<"X86ISD::VFPEXT", 133349cc55cSDimitry Andric SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVec<0>, 134349cc55cSDimitry Andric SDTCisFP<1>, SDTCisVec<1>]>>; 135480093f4SDimitry Andric 136480093f4SDimitry Andricdef X86strict_vfpext : SDNode<"X86ISD::STRICT_VFPEXT", 137349cc55cSDimitry Andric SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVec<0>, 138349cc55cSDimitry Andric SDTCisFP<1>, SDTCisVec<1>]>, 139480093f4SDimitry Andric [SDNPHasChain]>; 140480093f4SDimitry Andric 141480093f4SDimitry Andricdef X86any_vfpext : PatFrags<(ops node:$src), 142480093f4SDimitry Andric [(X86strict_vfpext node:$src), 143480093f4SDimitry Andric (X86vfpext node:$src)]>; 144480093f4SDimitry Andric 1450b57cec5SDimitry Andricdef X86vfpround: SDNode<"X86ISD::VFPROUND", 146349cc55cSDimitry Andric SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVec<0>, 147349cc55cSDimitry Andric SDTCisFP<1>, SDTCisVec<1>, 1480b57cec5SDimitry Andric SDTCisOpSmallerThanOp<0, 1>]>>; 1490b57cec5SDimitry Andric 150480093f4SDimitry Andricdef X86strict_vfpround: SDNode<"X86ISD::STRICT_VFPROUND", 151349cc55cSDimitry Andric SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVec<0>, 152349cc55cSDimitry Andric SDTCisFP<1>, SDTCisVec<1>, 153480093f4SDimitry Andric SDTCisOpSmallerThanOp<0, 1>]>, 154480093f4SDimitry Andric [SDNPHasChain]>; 155480093f4SDimitry Andric 156480093f4SDimitry Andricdef X86any_vfpround : PatFrags<(ops node:$src), 157480093f4SDimitry Andric [(X86strict_vfpround node:$src), 158480093f4SDimitry Andric (X86vfpround node:$src)]>; 159480093f4SDimitry Andric 1600b57cec5SDimitry Andricdef X86frounds : SDNode<"X86ISD::VFPROUNDS", 161349cc55cSDimitry Andric SDTypeProfile<1, 2, [SDTCisFP<0>, SDTCisVec<0>, 1620b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 163349cc55cSDimitry Andric SDTCisFP<2>, SDTCisVec<2>, 1640b57cec5SDimitry Andric SDTCisSameSizeAs<0, 2>]>>; 1650b57cec5SDimitry Andric 1660b57cec5SDimitry Andricdef X86froundsRnd: SDNode<"X86ISD::VFPROUNDS_RND", 167349cc55cSDimitry Andric SDTypeProfile<1, 3, [SDTCisFP<0>, SDTCisVec<0>, 1680b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 169349cc55cSDimitry Andric SDTCisFP<2>, SDTCisVec<2>, 1700b57cec5SDimitry Andric SDTCisSameSizeAs<0, 2>, 1710b57cec5SDimitry Andric SDTCisVT<3, i32>]>>; 1720b57cec5SDimitry Andric 1730b57cec5SDimitry Andricdef X86fpexts : SDNode<"X86ISD::VFPEXTS", 174349cc55cSDimitry Andric SDTypeProfile<1, 2, [SDTCisFP<0>, SDTCisVec<0>, 1750b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 176349cc55cSDimitry Andric SDTCisFP<2>, SDTCisVec<2>, 1770b57cec5SDimitry Andric SDTCisSameSizeAs<0, 2>]>>; 1780b57cec5SDimitry Andricdef X86fpextsSAE : SDNode<"X86ISD::VFPEXTS_SAE", 179349cc55cSDimitry Andric SDTypeProfile<1, 2, [SDTCisFP<0>, SDTCisVec<0>, 1800b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 181349cc55cSDimitry Andric SDTCisFP<2>, SDTCisVec<2>, 1820b57cec5SDimitry Andric SDTCisSameSizeAs<0, 2>]>>; 1830b57cec5SDimitry Andric 1840b57cec5SDimitry Andricdef X86vmfpround: SDNode<"X86ISD::VMFPROUND", 185349cc55cSDimitry Andric SDTypeProfile<1, 3, [SDTCisFP<0>, SDTCisVec<0>, 186349cc55cSDimitry Andric SDTCisFP<1>, SDTCisVec<1>, 1870b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 1880b57cec5SDimitry Andric SDTCVecEltisVT<3, i1>, 1890b57cec5SDimitry Andric SDTCisSameNumEltsAs<1, 3>]>>; 1900b57cec5SDimitry Andric 1910b57cec5SDimitry Andricdef X86vshiftimm : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 1920b57cec5SDimitry Andric SDTCisVT<2, i8>, SDTCisInt<0>]>; 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andricdef X86vshldq : SDNode<"X86ISD::VSHLDQ", X86vshiftimm>; 1950b57cec5SDimitry Andricdef X86vshrdq : SDNode<"X86ISD::VSRLDQ", X86vshiftimm>; 1960b57cec5SDimitry Andricdef X86pcmpeq : SDNode<"X86ISD::PCMPEQ", SDTIntBinOp, [SDNPCommutative]>; 1970b57cec5SDimitry Andricdef X86pcmpgt : SDNode<"X86ISD::PCMPGT", SDTIntBinOp>; 1980b57cec5SDimitry Andric 199480093f4SDimitry Andricdef X86cmpp : SDNode<"X86ISD::CMPP", SDTX86VFCMP>; 200480093f4SDimitry Andricdef X86strict_cmpp : SDNode<"X86ISD::STRICT_CMPP", SDTX86VFCMP, [SDNPHasChain]>; 201480093f4SDimitry Andricdef X86any_cmpp : PatFrags<(ops node:$src1, node:$src2, node:$src3), 202480093f4SDimitry Andric [(X86strict_cmpp node:$src1, node:$src2, node:$src3), 203480093f4SDimitry Andric (X86cmpp node:$src1, node:$src2, node:$src3)]>; 204480093f4SDimitry Andric 2050b57cec5SDimitry Andricdef X86CmpMaskCC : 2060b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCVecEltisVT<0, i1>, 2070b57cec5SDimitry Andric SDTCisVec<1>, SDTCisSameAs<2, 1>, 2080b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 1>, SDTCisVT<3, i8>]>; 209e8d8bef9SDimitry Andricdef X86MaskCmpMaskCC : 210e8d8bef9SDimitry Andric SDTypeProfile<1, 4, [SDTCisVec<0>, SDTCVecEltisVT<0, i1>, 211e8d8bef9SDimitry Andric SDTCisVec<1>, SDTCisSameAs<2, 1>, 212e8d8bef9SDimitry Andric SDTCisSameNumEltsAs<0, 1>, SDTCisVT<3, i8>, SDTCisSameAs<4, 0>]>; 2130b57cec5SDimitry Andricdef X86CmpMaskCCScalar : 2140b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisFP<1>, SDTCisSameAs<1, 2>, 2150b57cec5SDimitry Andric SDTCisVT<3, i8>]>; 2160b57cec5SDimitry Andric 2170b57cec5SDimitry Andricdef X86cmpm : SDNode<"X86ISD::CMPM", X86CmpMaskCC>; 218e8d8bef9SDimitry Andricdef X86cmpmm : SDNode<"X86ISD::CMPMM", X86MaskCmpMaskCC>; 219480093f4SDimitry Andricdef X86strict_cmpm : SDNode<"X86ISD::STRICT_CMPM", X86CmpMaskCC, [SDNPHasChain]>; 220480093f4SDimitry Andricdef X86any_cmpm : PatFrags<(ops node:$src1, node:$src2, node:$src3), 221480093f4SDimitry Andric [(X86strict_cmpm node:$src1, node:$src2, node:$src3), 222480093f4SDimitry Andric (X86cmpm node:$src1, node:$src2, node:$src3)]>; 223e8d8bef9SDimitry Andricdef X86cmpmmSAE : SDNode<"X86ISD::CMPMM_SAE", X86MaskCmpMaskCC>; 2240b57cec5SDimitry Andricdef X86cmpms : SDNode<"X86ISD::FSETCCM", X86CmpMaskCCScalar>; 2250b57cec5SDimitry Andricdef X86cmpmsSAE : SDNode<"X86ISD::FSETCCM_SAE", X86CmpMaskCCScalar>; 2260b57cec5SDimitry Andric 2270b57cec5SDimitry Andricdef X86phminpos: SDNode<"X86ISD::PHMINPOS", 2280b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCisVT<0, v8i16>, SDTCisVT<1, v8i16>]>>; 2290b57cec5SDimitry Andric 2300b57cec5SDimitry Andricdef X86vshiftuniform : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 2310b57cec5SDimitry Andric SDTCisVec<2>, SDTCisInt<0>, 2320b57cec5SDimitry Andric SDTCisInt<2>]>; 2330b57cec5SDimitry Andric 2340b57cec5SDimitry Andricdef X86vshl : SDNode<"X86ISD::VSHL", X86vshiftuniform>; 2350b57cec5SDimitry Andricdef X86vsrl : SDNode<"X86ISD::VSRL", X86vshiftuniform>; 2360b57cec5SDimitry Andricdef X86vsra : SDNode<"X86ISD::VSRA", X86vshiftuniform>; 2370b57cec5SDimitry Andric 2380b57cec5SDimitry Andricdef X86vshiftvariable : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 2390b57cec5SDimitry Andric SDTCisSameAs<0,2>, SDTCisInt<0>]>; 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andricdef X86vshlv : SDNode<"X86ISD::VSHLV", X86vshiftvariable>; 2420b57cec5SDimitry Andricdef X86vsrlv : SDNode<"X86ISD::VSRLV", X86vshiftvariable>; 2430b57cec5SDimitry Andricdef X86vsrav : SDNode<"X86ISD::VSRAV", X86vshiftvariable>; 2440b57cec5SDimitry Andric 2450b57cec5SDimitry Andricdef X86vshli : SDNode<"X86ISD::VSHLI", X86vshiftimm>; 2460b57cec5SDimitry Andricdef X86vsrli : SDNode<"X86ISD::VSRLI", X86vshiftimm>; 2470b57cec5SDimitry Andricdef X86vsrai : SDNode<"X86ISD::VSRAI", X86vshiftimm>; 2480b57cec5SDimitry Andric 2490b57cec5SDimitry Andricdef X86kshiftl : SDNode<"X86ISD::KSHIFTL", 2500b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i1>, 2510b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 2520b57cec5SDimitry Andric SDTCisVT<2, i8>]>>; 2530b57cec5SDimitry Andricdef X86kshiftr : SDNode<"X86ISD::KSHIFTR", 2540b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i1>, 2550b57cec5SDimitry Andric SDTCisSameAs<0, 1>, 2560b57cec5SDimitry Andric SDTCisVT<2, i8>]>>; 2570b57cec5SDimitry Andric 2580b57cec5SDimitry Andricdef X86kadd : SDNode<"X86ISD::KADD", SDTIntBinOp, [SDNPCommutative]>; 2590b57cec5SDimitry Andric 2600b57cec5SDimitry Andricdef X86vrotli : SDNode<"X86ISD::VROTLI", X86vshiftimm>; 2610b57cec5SDimitry Andricdef X86vrotri : SDNode<"X86ISD::VROTRI", X86vshiftimm>; 2620b57cec5SDimitry Andric 2630b57cec5SDimitry Andricdef X86vpshl : SDNode<"X86ISD::VPSHL", X86vshiftvariable>; 2640b57cec5SDimitry Andricdef X86vpsha : SDNode<"X86ISD::VPSHA", X86vshiftvariable>; 2650b57cec5SDimitry Andric 2660b57cec5SDimitry Andricdef X86vpcom : SDNode<"X86ISD::VPCOM", 2670b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 2680b57cec5SDimitry Andric SDTCisSameAs<0,2>, 2690b57cec5SDimitry Andric SDTCisVT<3, i8>, SDTCisInt<0>]>>; 2700b57cec5SDimitry Andricdef X86vpcomu : SDNode<"X86ISD::VPCOMU", 2710b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 2720b57cec5SDimitry Andric SDTCisSameAs<0,2>, 2730b57cec5SDimitry Andric SDTCisVT<3, i8>, SDTCisInt<0>]>>; 2740b57cec5SDimitry Andricdef X86vpermil2 : SDNode<"X86ISD::VPERMIL2", 2750b57cec5SDimitry Andric SDTypeProfile<1, 4, [SDTCisVec<0>, SDTCisSameAs<0,1>, 2760b57cec5SDimitry Andric SDTCisSameAs<0,2>, 2770b57cec5SDimitry Andric SDTCisFP<0>, SDTCisInt<3>, 2780b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 3>, 2790b57cec5SDimitry Andric SDTCisSameSizeAs<0,3>, 2800b57cec5SDimitry Andric SDTCisVT<4, i8>]>>; 2810b57cec5SDimitry Andricdef X86vpperm : SDNode<"X86ISD::VPPERM", 2820b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, v16i8>, SDTCisSameAs<0,1>, 2830b57cec5SDimitry Andric SDTCisSameAs<0,2>, SDTCisSameAs<0, 3>]>>; 2840b57cec5SDimitry Andric 2850b57cec5SDimitry Andricdef SDTX86CmpPTest : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, 2860b57cec5SDimitry Andric SDTCisVec<1>, 2870b57cec5SDimitry Andric SDTCisSameAs<2, 1>]>; 2880b57cec5SDimitry Andric 2890b57cec5SDimitry Andricdef X86mulhrs : SDNode<"X86ISD::MULHRS", SDTIntBinOp, [SDNPCommutative]>; 2900b57cec5SDimitry Andricdef X86ptest : SDNode<"X86ISD::PTEST", SDTX86CmpPTest>; 2910b57cec5SDimitry Andricdef X86testp : SDNode<"X86ISD::TESTP", SDTX86CmpPTest>; 2920b57cec5SDimitry Andricdef X86kortest : SDNode<"X86ISD::KORTEST", SDTX86CmpPTest>; 2930b57cec5SDimitry Andricdef X86ktest : SDNode<"X86ISD::KTEST", SDTX86CmpPTest>; 2940b57cec5SDimitry Andric 2950b57cec5SDimitry Andricdef X86movmsk : SDNode<"X86ISD::MOVMSK", 2960b57cec5SDimitry Andric SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVec<1>]>>; 2970b57cec5SDimitry Andric 2980b57cec5SDimitry Andricdef X86selects : SDNode<"X86ISD::SELECTS", 2990b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<1, v1i1>, 3000b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 3010b57cec5SDimitry Andric SDTCisSameAs<2, 3>]>>; 3020b57cec5SDimitry Andric 3030b57cec5SDimitry Andricdef X86pmuludq : SDNode<"X86ISD::PMULUDQ", 3040b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, 3050b57cec5SDimitry Andric SDTCisSameAs<0,1>, 3060b57cec5SDimitry Andric SDTCisSameAs<1,2>]>, 3070b57cec5SDimitry Andric [SDNPCommutative]>; 3080b57cec5SDimitry Andricdef X86pmuldq : SDNode<"X86ISD::PMULDQ", 3090b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, 3100b57cec5SDimitry Andric SDTCisSameAs<0,1>, 3110b57cec5SDimitry Andric SDTCisSameAs<1,2>]>, 3120b57cec5SDimitry Andric [SDNPCommutative]>; 3130b57cec5SDimitry Andric 3140b57cec5SDimitry Andricdef X86extrqi : SDNode<"X86ISD::EXTRQI", 3150b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVT<0, v2i64>, SDTCisSameAs<0,1>, 3160b57cec5SDimitry Andric SDTCisVT<2, i8>, SDTCisVT<3, i8>]>>; 3170b57cec5SDimitry Andricdef X86insertqi : SDNode<"X86ISD::INSERTQI", 3180b57cec5SDimitry Andric SDTypeProfile<1, 4, [SDTCisVT<0, v2i64>, SDTCisSameAs<0,1>, 3190b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisVT<3, i8>, 3200b57cec5SDimitry Andric SDTCisVT<4, i8>]>>; 3210b57cec5SDimitry Andric 3220b57cec5SDimitry Andric// Specific shuffle nodes - At some point ISD::VECTOR_SHUFFLE will always get 3230b57cec5SDimitry Andric// translated into one of the target nodes below during lowering. 3240b57cec5SDimitry Andric// Note: this is a work in progress... 3250b57cec5SDimitry Andricdef SDTShuff1Op : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisSameAs<0,1>]>; 3260b57cec5SDimitry Andricdef SDTShuff2Op : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 3270b57cec5SDimitry Andric SDTCisSameAs<0,2>]>; 3280b57cec5SDimitry Andricdef SDTShuff2OpFP : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisFP<0>, 3290b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisSameAs<0,2>]>; 3300b57cec5SDimitry Andric 3310b57cec5SDimitry Andricdef SDTShuff2OpM : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 3320b57cec5SDimitry Andric SDTCisFP<0>, SDTCisInt<2>, 3330b57cec5SDimitry Andric SDTCisSameNumEltsAs<0,2>, 3340b57cec5SDimitry Andric SDTCisSameSizeAs<0,2>]>; 3350b57cec5SDimitry Andricdef SDTShuff2OpI : SDTypeProfile<1, 2, [SDTCisVec<0>, 3360b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisVT<2, i8>]>; 3370b57cec5SDimitry Andricdef SDTShuff3OpI : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 3380b57cec5SDimitry Andric SDTCisSameAs<0,2>, SDTCisVT<3, i8>]>; 3390b57cec5SDimitry Andricdef SDTFPBinOpImm: SDTypeProfile<1, 3, [SDTCisFP<0>, SDTCisVec<0>, 3400b57cec5SDimitry Andric SDTCisSameAs<0,1>, 3410b57cec5SDimitry Andric SDTCisSameAs<0,2>, 3420b57cec5SDimitry Andric SDTCisVT<3, i32>]>; 3430b57cec5SDimitry Andricdef SDTFPTernaryOpImm: SDTypeProfile<1, 4, [SDTCisFP<0>, SDTCisSameAs<0,1>, 3440b57cec5SDimitry Andric SDTCisSameAs<0,2>, 3450b57cec5SDimitry Andric SDTCisInt<3>, 3460b57cec5SDimitry Andric SDTCisSameSizeAs<0, 3>, 3470b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 3>, 3480b57cec5SDimitry Andric SDTCisVT<4, i32>]>; 3490b57cec5SDimitry Andricdef SDTFPUnaryOpImm: SDTypeProfile<1, 2, [SDTCisFP<0>, 3500b57cec5SDimitry Andric SDTCisSameAs<0,1>, 3510b57cec5SDimitry Andric SDTCisVT<2, i32>]>; 3520b57cec5SDimitry Andric 3530b57cec5SDimitry Andricdef SDTVBroadcast : SDTypeProfile<1, 1, [SDTCisVec<0>]>; 3540b57cec5SDimitry Andricdef SDTVBroadcastm : SDTypeProfile<1, 1, [SDTCisVec<0>, 3550b57cec5SDimitry Andric SDTCisInt<0>, SDTCisInt<1>]>; 3560b57cec5SDimitry Andric 3570b57cec5SDimitry Andricdef SDTBlend : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 3580b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisVT<3, i8>]>; 3590b57cec5SDimitry Andric 3600b57cec5SDimitry Andricdef SDTTernlog : SDTypeProfile<1, 4, [SDTCisInt<0>, SDTCisVec<0>, 3610b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisSameAs<0,2>, 3620b57cec5SDimitry Andric SDTCisSameAs<0,3>, SDTCisVT<4, i8>]>; 3630b57cec5SDimitry Andric 3640b57cec5SDimitry Andricdef SDTFPBinOpRound : SDTypeProfile<1, 3, [ // fadd_round, fmul_round, etc. 3650b57cec5SDimitry Andric SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisFP<0>, SDTCisVT<3, i32>]>; 3660b57cec5SDimitry Andric 3670b57cec5SDimitry Andricdef SDTFPUnaryOpRound : SDTypeProfile<1, 2, [ // fsqrt_round, fgetexp_round, etc. 3680b57cec5SDimitry Andric SDTCisSameAs<0, 1>, SDTCisFP<0>, SDTCisVT<2, i32>]>; 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andricdef SDTFmaRound : SDTypeProfile<1, 4, [SDTCisSameAs<0,1>, 3710b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisSameAs<1,3>, 3720b57cec5SDimitry Andric SDTCisFP<0>, SDTCisVT<4, i32>]>; 3730b57cec5SDimitry Andric 3740b57cec5SDimitry Andricdef X86PAlignr : SDNode<"X86ISD::PALIGNR", 3750b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCVecEltisVT<0, i8>, 3760b57cec5SDimitry Andric SDTCisSameAs<0,1>, 3770b57cec5SDimitry Andric SDTCisSameAs<0,2>, 3780b57cec5SDimitry Andric SDTCisVT<3, i8>]>>; 3790b57cec5SDimitry Andricdef X86VAlign : SDNode<"X86ISD::VALIGN", SDTShuff3OpI>; 3800b57cec5SDimitry Andric 3810b57cec5SDimitry Andricdef X86VShld : SDNode<"X86ISD::VSHLD", SDTShuff3OpI>; 3820b57cec5SDimitry Andricdef X86VShrd : SDNode<"X86ISD::VSHRD", SDTShuff3OpI>; 3830b57cec5SDimitry Andricdef X86VShldv : SDNode<"X86ISD::VSHLDV", 3840b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, 3850b57cec5SDimitry Andric SDTCisSameAs<0,1>, 3860b57cec5SDimitry Andric SDTCisSameAs<0,2>, 3870b57cec5SDimitry Andric SDTCisSameAs<0,3>]>>; 3880b57cec5SDimitry Andricdef X86VShrdv : SDNode<"X86ISD::VSHRDV", 3890b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, 3900b57cec5SDimitry Andric SDTCisSameAs<0,1>, 3910b57cec5SDimitry Andric SDTCisSameAs<0,2>, 3920b57cec5SDimitry Andric SDTCisSameAs<0,3>]>>; 3930b57cec5SDimitry Andric 3940b57cec5SDimitry Andricdef X86Conflict : SDNode<"X86ISD::CONFLICT", SDTIntUnaryOp>; 3950b57cec5SDimitry Andric 3960b57cec5SDimitry Andricdef X86PShufd : SDNode<"X86ISD::PSHUFD", SDTShuff2OpI>; 3970b57cec5SDimitry Andricdef X86PShufhw : SDNode<"X86ISD::PSHUFHW", SDTShuff2OpI>; 3980b57cec5SDimitry Andricdef X86PShuflw : SDNode<"X86ISD::PSHUFLW", SDTShuff2OpI>; 3990b57cec5SDimitry Andric 4000b57cec5SDimitry Andricdef X86Shufp : SDNode<"X86ISD::SHUFP", SDTShuff3OpI>; 4010b57cec5SDimitry Andricdef X86Shuf128 : SDNode<"X86ISD::SHUF128", SDTShuff3OpI>; 4020b57cec5SDimitry Andric 4030b57cec5SDimitry Andricdef X86Movddup : SDNode<"X86ISD::MOVDDUP", SDTShuff1Op>; 4040b57cec5SDimitry Andricdef X86Movshdup : SDNode<"X86ISD::MOVSHDUP", SDTShuff1Op>; 4050b57cec5SDimitry Andricdef X86Movsldup : SDNode<"X86ISD::MOVSLDUP", SDTShuff1Op>; 4060b57cec5SDimitry Andric 4070b57cec5SDimitry Andricdef X86Movsd : SDNode<"X86ISD::MOVSD", 4080b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, v2f64>, 4090b57cec5SDimitry Andric SDTCisVT<1, v2f64>, 4100b57cec5SDimitry Andric SDTCisVT<2, v2f64>]>>; 4110b57cec5SDimitry Andricdef X86Movss : SDNode<"X86ISD::MOVSS", 4120b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, v4f32>, 4130b57cec5SDimitry Andric SDTCisVT<1, v4f32>, 4140b57cec5SDimitry Andric SDTCisVT<2, v4f32>]>>; 4150b57cec5SDimitry Andric 416349cc55cSDimitry Andricdef X86Movsh : SDNode<"X86ISD::MOVSH", 417349cc55cSDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, v8f16>, 418349cc55cSDimitry Andric SDTCisVT<1, v8f16>, 419349cc55cSDimitry Andric SDTCisVT<2, v8f16>]>>; 420349cc55cSDimitry Andric 4210b57cec5SDimitry Andricdef X86Movlhps : SDNode<"X86ISD::MOVLHPS", 4220b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, v4f32>, 4230b57cec5SDimitry Andric SDTCisVT<1, v4f32>, 4240b57cec5SDimitry Andric SDTCisVT<2, v4f32>]>>; 4250b57cec5SDimitry Andricdef X86Movhlps : SDNode<"X86ISD::MOVHLPS", 4260b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, v4f32>, 4270b57cec5SDimitry Andric SDTCisVT<1, v4f32>, 4280b57cec5SDimitry Andric SDTCisVT<2, v4f32>]>>; 4290b57cec5SDimitry Andric 4300b57cec5SDimitry Andricdef SDTPack : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisInt<0>, 4310b57cec5SDimitry Andric SDTCisVec<1>, SDTCisInt<1>, 4320b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 4330b57cec5SDimitry Andric SDTCisSameAs<1,2>, 4340b57cec5SDimitry Andric SDTCisOpSmallerThanOp<0, 1>]>; 4350b57cec5SDimitry Andricdef X86Packss : SDNode<"X86ISD::PACKSS", SDTPack>; 4360b57cec5SDimitry Andricdef X86Packus : SDNode<"X86ISD::PACKUS", SDTPack>; 4370b57cec5SDimitry Andric 4380b57cec5SDimitry Andricdef X86Unpckl : SDNode<"X86ISD::UNPCKL", SDTShuff2Op>; 4390b57cec5SDimitry Andricdef X86Unpckh : SDNode<"X86ISD::UNPCKH", SDTShuff2Op>; 4400b57cec5SDimitry Andric 4410b57cec5SDimitry Andricdef X86vpmaddubsw : SDNode<"X86ISD::VPMADDUBSW", 4420b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i16>, 4430b57cec5SDimitry Andric SDTCVecEltisVT<1, i8>, 4440b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 4450b57cec5SDimitry Andric SDTCisSameAs<1,2>]>>; 4460b57cec5SDimitry Andricdef X86vpmaddwd : SDNode<"X86ISD::VPMADDWD", 4470b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i32>, 4480b57cec5SDimitry Andric SDTCVecEltisVT<1, i16>, 4490b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 4500b57cec5SDimitry Andric SDTCisSameAs<1,2>]>, 4510b57cec5SDimitry Andric [SDNPCommutative]>; 4520b57cec5SDimitry Andric 4530b57cec5SDimitry Andricdef X86VPermilpv : SDNode<"X86ISD::VPERMILPV", SDTShuff2OpM>; 4540b57cec5SDimitry Andricdef X86VPermilpi : SDNode<"X86ISD::VPERMILPI", SDTShuff2OpI>; 4550b57cec5SDimitry Andricdef X86VPermv : SDNode<"X86ISD::VPERMV", 4560b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisInt<1>, 4570b57cec5SDimitry Andric SDTCisSameNumEltsAs<0,1>, 4580b57cec5SDimitry Andric SDTCisSameSizeAs<0,1>, 4590b57cec5SDimitry Andric SDTCisSameAs<0,2>]>>; 4600b57cec5SDimitry Andricdef X86VPermi : SDNode<"X86ISD::VPERMI", SDTShuff2OpI>; 4610b57cec5SDimitry Andricdef X86VPermt2 : SDNode<"X86ISD::VPERMV3", 4620b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, 4630b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisInt<2>, 4640b57cec5SDimitry Andric SDTCisVec<2>, SDTCisSameNumEltsAs<0, 2>, 4650b57cec5SDimitry Andric SDTCisSameSizeAs<0,2>, 4660b57cec5SDimitry Andric SDTCisSameAs<0,3>]>, []>; 4670b57cec5SDimitry Andric 4680b57cec5SDimitry Andricdef X86vpternlog : SDNode<"X86ISD::VPTERNLOG", SDTTernlog>; 4690b57cec5SDimitry Andric 4700b57cec5SDimitry Andricdef X86VPerm2x128 : SDNode<"X86ISD::VPERM2X128", SDTShuff3OpI>; 4710b57cec5SDimitry Andric 4720b57cec5SDimitry Andricdef X86VFixupimm : SDNode<"X86ISD::VFIXUPIMM", SDTFPTernaryOpImm>; 4730b57cec5SDimitry Andricdef X86VFixupimmSAE : SDNode<"X86ISD::VFIXUPIMM_SAE", SDTFPTernaryOpImm>; 4740b57cec5SDimitry Andricdef X86VFixupimms : SDNode<"X86ISD::VFIXUPIMMS", SDTFPTernaryOpImm>; 4750b57cec5SDimitry Andricdef X86VFixupimmSAEs : SDNode<"X86ISD::VFIXUPIMMS_SAE", SDTFPTernaryOpImm>; 4760b57cec5SDimitry Andricdef X86VRange : SDNode<"X86ISD::VRANGE", SDTFPBinOpImm>; 4770b57cec5SDimitry Andricdef X86VRangeSAE : SDNode<"X86ISD::VRANGE_SAE", SDTFPBinOpImm>; 4780b57cec5SDimitry Andricdef X86VReduce : SDNode<"X86ISD::VREDUCE", SDTFPUnaryOpImm>; 4790b57cec5SDimitry Andricdef X86VReduceSAE : SDNode<"X86ISD::VREDUCE_SAE", SDTFPUnaryOpImm>; 4800b57cec5SDimitry Andricdef X86VRndScale : SDNode<"X86ISD::VRNDSCALE", SDTFPUnaryOpImm>; 481480093f4SDimitry Andricdef X86strict_VRndScale : SDNode<"X86ISD::STRICT_VRNDSCALE", SDTFPUnaryOpImm, 482480093f4SDimitry Andric [SDNPHasChain]>; 483480093f4SDimitry Andricdef X86any_VRndScale : PatFrags<(ops node:$src1, node:$src2), 484480093f4SDimitry Andric [(X86strict_VRndScale node:$src1, node:$src2), 485480093f4SDimitry Andric (X86VRndScale node:$src1, node:$src2)]>; 486480093f4SDimitry Andric 4870b57cec5SDimitry Andricdef X86VRndScaleSAE: SDNode<"X86ISD::VRNDSCALE_SAE", SDTFPUnaryOpImm>; 4880b57cec5SDimitry Andricdef X86VGetMant : SDNode<"X86ISD::VGETMANT", SDTFPUnaryOpImm>; 4890b57cec5SDimitry Andricdef X86VGetMantSAE : SDNode<"X86ISD::VGETMANT_SAE", SDTFPUnaryOpImm>; 4900b57cec5SDimitry Andricdef X86Vfpclass : SDNode<"X86ISD::VFPCLASS", 4910b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i1>, 4920b57cec5SDimitry Andric SDTCisFP<1>, 4930b57cec5SDimitry Andric SDTCisSameNumEltsAs<0,1>, 4940b57cec5SDimitry Andric SDTCisVT<2, i32>]>, []>; 4950b57cec5SDimitry Andricdef X86Vfpclasss : SDNode<"X86ISD::VFPCLASSS", 4960b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, v1i1>, 4970b57cec5SDimitry Andric SDTCisFP<1>, SDTCisVT<2, i32>]>,[]>; 4980b57cec5SDimitry Andric 4990b57cec5SDimitry Andricdef X86VBroadcast : SDNode<"X86ISD::VBROADCAST", SDTVBroadcast>; 5000b57cec5SDimitry Andricdef X86VBroadcastm : SDNode<"X86ISD::VBROADCASTM", SDTVBroadcastm>; 5010b57cec5SDimitry Andric 5020b57cec5SDimitry Andricdef X86Blendi : SDNode<"X86ISD::BLENDI", SDTBlend>; 5030b57cec5SDimitry Andricdef X86Blendv : SDNode<"X86ISD::BLENDV", 5040b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisInt<1>, 5050b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 5060b57cec5SDimitry Andric SDTCisSameAs<2, 3>, 5070b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 1>, 5080b57cec5SDimitry Andric SDTCisSameSizeAs<0, 1>]>>; 5090b57cec5SDimitry Andric 5100b57cec5SDimitry Andricdef X86Addsub : SDNode<"X86ISD::ADDSUB", SDTFPBinOp>; 5110b57cec5SDimitry Andric 5120b57cec5SDimitry Andricdef X86faddRnd : SDNode<"X86ISD::FADD_RND", SDTFPBinOpRound>; 5130b57cec5SDimitry Andricdef X86fadds : SDNode<"X86ISD::FADDS", SDTFPBinOp>; 5140b57cec5SDimitry Andricdef X86faddRnds : SDNode<"X86ISD::FADDS_RND", SDTFPBinOpRound>; 5150b57cec5SDimitry Andricdef X86fsubRnd : SDNode<"X86ISD::FSUB_RND", SDTFPBinOpRound>; 5160b57cec5SDimitry Andricdef X86fsubs : SDNode<"X86ISD::FSUBS", SDTFPBinOp>; 5170b57cec5SDimitry Andricdef X86fsubRnds : SDNode<"X86ISD::FSUBS_RND", SDTFPBinOpRound>; 5180b57cec5SDimitry Andricdef X86fmulRnd : SDNode<"X86ISD::FMUL_RND", SDTFPBinOpRound>; 5190b57cec5SDimitry Andricdef X86fmuls : SDNode<"X86ISD::FMULS", SDTFPBinOp>; 5200b57cec5SDimitry Andricdef X86fmulRnds : SDNode<"X86ISD::FMULS_RND", SDTFPBinOpRound>; 5210b57cec5SDimitry Andricdef X86fdivRnd : SDNode<"X86ISD::FDIV_RND", SDTFPBinOpRound>; 5220b57cec5SDimitry Andricdef X86fdivs : SDNode<"X86ISD::FDIVS", SDTFPBinOp>; 5230b57cec5SDimitry Andricdef X86fdivRnds : SDNode<"X86ISD::FDIVS_RND", SDTFPBinOpRound>; 5240b57cec5SDimitry Andricdef X86fmaxSAE : SDNode<"X86ISD::FMAX_SAE", SDTFPBinOp>; 5250b57cec5SDimitry Andricdef X86fmaxSAEs : SDNode<"X86ISD::FMAXS_SAE", SDTFPBinOp>; 5260b57cec5SDimitry Andricdef X86fminSAE : SDNode<"X86ISD::FMIN_SAE", SDTFPBinOp>; 5270b57cec5SDimitry Andricdef X86fminSAEs : SDNode<"X86ISD::FMINS_SAE", SDTFPBinOp>; 5280b57cec5SDimitry Andricdef X86scalef : SDNode<"X86ISD::SCALEF", SDTFPBinOp>; 5290b57cec5SDimitry Andricdef X86scalefRnd : SDNode<"X86ISD::SCALEF_RND", SDTFPBinOpRound>; 5300b57cec5SDimitry Andricdef X86scalefs : SDNode<"X86ISD::SCALEFS", SDTFPBinOp>; 5310b57cec5SDimitry Andricdef X86scalefsRnd: SDNode<"X86ISD::SCALEFS_RND", SDTFPBinOpRound>; 5320b57cec5SDimitry Andricdef X86fsqrtRnd : SDNode<"X86ISD::FSQRT_RND", SDTFPUnaryOpRound>; 5330b57cec5SDimitry Andricdef X86fsqrts : SDNode<"X86ISD::FSQRTS", SDTFPBinOp>; 5340b57cec5SDimitry Andricdef X86fsqrtRnds : SDNode<"X86ISD::FSQRTS_RND", SDTFPBinOpRound>; 5350b57cec5SDimitry Andricdef X86fgetexp : SDNode<"X86ISD::FGETEXP", SDTFPUnaryOp>; 5360b57cec5SDimitry Andricdef X86fgetexpSAE : SDNode<"X86ISD::FGETEXP_SAE", SDTFPUnaryOp>; 5370b57cec5SDimitry Andricdef X86fgetexps : SDNode<"X86ISD::FGETEXPS", SDTFPBinOp>; 5380b57cec5SDimitry Andricdef X86fgetexpSAEs : SDNode<"X86ISD::FGETEXPS_SAE", SDTFPBinOp>; 5390b57cec5SDimitry Andric 5400b57cec5SDimitry Andricdef X86Fnmadd : SDNode<"X86ISD::FNMADD", SDTFPTernaryOp, [SDNPCommutative]>; 5415ffd83dbSDimitry Andricdef X86strict_Fnmadd : SDNode<"X86ISD::STRICT_FNMADD", SDTFPTernaryOp, [SDNPCommutative, SDNPHasChain]>; 5425ffd83dbSDimitry Andricdef X86any_Fnmadd : PatFrags<(ops node:$src1, node:$src2, node:$src3), 5435ffd83dbSDimitry Andric [(X86strict_Fnmadd node:$src1, node:$src2, node:$src3), 5445ffd83dbSDimitry Andric (X86Fnmadd node:$src1, node:$src2, node:$src3)]>; 5450b57cec5SDimitry Andricdef X86Fmsub : SDNode<"X86ISD::FMSUB", SDTFPTernaryOp, [SDNPCommutative]>; 5465ffd83dbSDimitry Andricdef X86strict_Fmsub : SDNode<"X86ISD::STRICT_FMSUB", SDTFPTernaryOp, [SDNPCommutative, SDNPHasChain]>; 5475ffd83dbSDimitry Andricdef X86any_Fmsub : PatFrags<(ops node:$src1, node:$src2, node:$src3), 5485ffd83dbSDimitry Andric [(X86strict_Fmsub node:$src1, node:$src2, node:$src3), 5495ffd83dbSDimitry Andric (X86Fmsub node:$src1, node:$src2, node:$src3)]>; 5500b57cec5SDimitry Andricdef X86Fnmsub : SDNode<"X86ISD::FNMSUB", SDTFPTernaryOp, [SDNPCommutative]>; 5515ffd83dbSDimitry Andricdef X86strict_Fnmsub : SDNode<"X86ISD::STRICT_FNMSUB", SDTFPTernaryOp, [SDNPCommutative, SDNPHasChain]>; 5525ffd83dbSDimitry Andricdef X86any_Fnmsub : PatFrags<(ops node:$src1, node:$src2, node:$src3), 5535ffd83dbSDimitry Andric [(X86strict_Fnmsub node:$src1, node:$src2, node:$src3), 5545ffd83dbSDimitry Andric (X86Fnmsub node:$src1, node:$src2, node:$src3)]>; 5550b57cec5SDimitry Andricdef X86Fmaddsub : SDNode<"X86ISD::FMADDSUB", SDTFPTernaryOp, [SDNPCommutative]>; 5560b57cec5SDimitry Andricdef X86Fmsubadd : SDNode<"X86ISD::FMSUBADD", SDTFPTernaryOp, [SDNPCommutative]>; 5570b57cec5SDimitry Andric 5580b57cec5SDimitry Andricdef X86FmaddRnd : SDNode<"X86ISD::FMADD_RND", SDTFmaRound, [SDNPCommutative]>; 5590b57cec5SDimitry Andricdef X86FnmaddRnd : SDNode<"X86ISD::FNMADD_RND", SDTFmaRound, [SDNPCommutative]>; 5600b57cec5SDimitry Andricdef X86FmsubRnd : SDNode<"X86ISD::FMSUB_RND", SDTFmaRound, [SDNPCommutative]>; 5610b57cec5SDimitry Andricdef X86FnmsubRnd : SDNode<"X86ISD::FNMSUB_RND", SDTFmaRound, [SDNPCommutative]>; 5620b57cec5SDimitry Andricdef X86FmaddsubRnd : SDNode<"X86ISD::FMADDSUB_RND", SDTFmaRound, [SDNPCommutative]>; 5630b57cec5SDimitry Andricdef X86FmsubaddRnd : SDNode<"X86ISD::FMSUBADD_RND", SDTFmaRound, [SDNPCommutative]>; 5640b57cec5SDimitry Andric 5650b57cec5SDimitry Andricdef X86vp2intersect : SDNode<"X86ISD::VP2INTERSECT", 5660b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVT<0, untyped>, 5670b57cec5SDimitry Andric SDTCisVec<1>, SDTCisSameAs<1, 2>]>>; 5680b57cec5SDimitry Andric 5690b57cec5SDimitry Andricdef SDTIFma : SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisSameAs<0,1>, 5700b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisSameAs<1,3>]>; 5710b57cec5SDimitry Andricdef x86vpmadd52l : SDNode<"X86ISD::VPMADD52L", SDTIFma, [SDNPCommutative]>; 5720b57cec5SDimitry Andricdef x86vpmadd52h : SDNode<"X86ISD::VPMADD52H", SDTIFma, [SDNPCommutative]>; 5730b57cec5SDimitry Andric 574349cc55cSDimitry Andricdef x86vfmaddc : SDNode<"X86ISD::VFMADDC", SDTFPTernaryOp, [SDNPCommutative]>; 575349cc55cSDimitry Andricdef x86vfmaddcRnd : SDNode<"X86ISD::VFMADDC_RND", SDTFmaRound, [SDNPCommutative]>; 576349cc55cSDimitry Andricdef x86vfcmaddc : SDNode<"X86ISD::VFCMADDC", SDTFPTernaryOp>; 577349cc55cSDimitry Andricdef x86vfcmaddcRnd : SDNode<"X86ISD::VFCMADDC_RND", SDTFmaRound>; 578349cc55cSDimitry Andricdef x86vfmulc : SDNode<"X86ISD::VFMULC", SDTFPBinOp, [SDNPCommutative]>; 579349cc55cSDimitry Andricdef x86vfmulcRnd : SDNode<"X86ISD::VFMULC_RND", SDTFPBinOpRound, [SDNPCommutative]>; 580349cc55cSDimitry Andricdef x86vfcmulc : SDNode<"X86ISD::VFCMULC", SDTFPBinOp>; 581349cc55cSDimitry Andricdef x86vfcmulcRnd : SDNode<"X86ISD::VFCMULC_RND", SDTFPBinOpRound>; 582349cc55cSDimitry Andric 583349cc55cSDimitry Andricdef x86vfmaddcSh : SDNode<"X86ISD::VFMADDCSH", SDTFPTernaryOp, [SDNPCommutative]>; 584349cc55cSDimitry Andricdef x86vfcmaddcSh : SDNode<"X86ISD::VFCMADDCSH", SDTFPTernaryOp>; 585349cc55cSDimitry Andricdef x86vfmulcSh : SDNode<"X86ISD::VFMULCSH", SDTFPBinOp, [SDNPCommutative]>; 586349cc55cSDimitry Andricdef x86vfcmulcSh : SDNode<"X86ISD::VFCMULCSH", SDTFPBinOp>; 587349cc55cSDimitry Andricdef x86vfmaddcShRnd : SDNode<"X86ISD::VFMADDCSH_RND", SDTFmaRound, [SDNPCommutative]>; 588349cc55cSDimitry Andricdef x86vfcmaddcShRnd : SDNode<"X86ISD::VFCMADDCSH_RND",SDTFmaRound>; 589349cc55cSDimitry Andricdef x86vfmulcShRnd : SDNode<"X86ISD::VFMULCSH_RND", SDTFPBinOpRound, [SDNPCommutative]>; 590349cc55cSDimitry Andricdef x86vfcmulcShRnd : SDNode<"X86ISD::VFCMULCSH_RND", SDTFPBinOpRound>; 591349cc55cSDimitry Andric 5920b57cec5SDimitry Andricdef X86rsqrt14 : SDNode<"X86ISD::RSQRT14", SDTFPUnaryOp>; 5930b57cec5SDimitry Andricdef X86rcp14 : SDNode<"X86ISD::RCP14", SDTFPUnaryOp>; 5940b57cec5SDimitry Andric 5950b57cec5SDimitry Andric// VNNI 5960b57cec5SDimitry Andricdef SDTVnni : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 5970b57cec5SDimitry Andric SDTCisSameAs<1,2>, SDTCisSameAs<1,3>]>; 5980b57cec5SDimitry Andricdef X86Vpdpbusd : SDNode<"X86ISD::VPDPBUSD", SDTVnni>; 5990b57cec5SDimitry Andricdef X86Vpdpbusds : SDNode<"X86ISD::VPDPBUSDS", SDTVnni>; 6000b57cec5SDimitry Andricdef X86Vpdpwssd : SDNode<"X86ISD::VPDPWSSD", SDTVnni>; 6010b57cec5SDimitry Andricdef X86Vpdpwssds : SDNode<"X86ISD::VPDPWSSDS", SDTVnni>; 6020b57cec5SDimitry Andric 6030b57cec5SDimitry Andricdef X86rsqrt14s : SDNode<"X86ISD::RSQRT14S", SDTFPBinOp>; 6040b57cec5SDimitry Andricdef X86rcp14s : SDNode<"X86ISD::RCP14S", SDTFPBinOp>; 6050b57cec5SDimitry Andricdef X86Ranges : SDNode<"X86ISD::VRANGES", SDTFPBinOpImm>; 6060b57cec5SDimitry Andricdef X86RndScales : SDNode<"X86ISD::VRNDSCALES", SDTFPBinOpImm>; 6070b57cec5SDimitry Andricdef X86Reduces : SDNode<"X86ISD::VREDUCES", SDTFPBinOpImm>; 6080b57cec5SDimitry Andricdef X86GetMants : SDNode<"X86ISD::VGETMANTS", SDTFPBinOpImm>; 6090b57cec5SDimitry Andricdef X86RangesSAE : SDNode<"X86ISD::VRANGES_SAE", SDTFPBinOpImm>; 6100b57cec5SDimitry Andricdef X86RndScalesSAE : SDNode<"X86ISD::VRNDSCALES_SAE", SDTFPBinOpImm>; 6110b57cec5SDimitry Andricdef X86ReducesSAE : SDNode<"X86ISD::VREDUCES_SAE", SDTFPBinOpImm>; 6120b57cec5SDimitry Andricdef X86GetMantsSAE : SDNode<"X86ISD::VGETMANTS_SAE", SDTFPBinOpImm>; 6130b57cec5SDimitry Andric 6140b57cec5SDimitry Andricdef X86compress: SDNode<"X86ISD::COMPRESS", SDTypeProfile<1, 3, 6150b57cec5SDimitry Andric [SDTCisSameAs<0, 1>, SDTCisVec<1>, 6160b57cec5SDimitry Andric SDTCisSameAs<0, 2>, SDTCVecEltisVT<3, i1>, 6170b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 3>]>, []>; 6180b57cec5SDimitry Andricdef X86expand : SDNode<"X86ISD::EXPAND", SDTypeProfile<1, 3, 6190b57cec5SDimitry Andric [SDTCisSameAs<0, 1>, SDTCisVec<1>, 6200b57cec5SDimitry Andric SDTCisSameAs<0, 2>, SDTCVecEltisVT<3, i1>, 6210b57cec5SDimitry Andric SDTCisSameNumEltsAs<0, 3>]>, []>; 6220b57cec5SDimitry Andric 6230b57cec5SDimitry Andric// vpshufbitqmb 6240b57cec5SDimitry Andricdef X86Vpshufbitqmb : SDNode<"X86ISD::VPSHUFBITQMB", 6250b57cec5SDimitry Andric SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 6260b57cec5SDimitry Andric SDTCisSameAs<1,2>, 6270b57cec5SDimitry Andric SDTCVecEltisVT<0,i1>, 6280b57cec5SDimitry Andric SDTCisSameNumEltsAs<0,1>]>>; 6290b57cec5SDimitry Andric 6300b57cec5SDimitry Andricdef SDTintToFP: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisFP<0>, 6310b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisInt<2>]>; 6320b57cec5SDimitry Andricdef SDTintToFPRound: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisFP<0>, 6330b57cec5SDimitry Andric SDTCisSameAs<0,1>, SDTCisInt<2>, 6340b57cec5SDimitry Andric SDTCisVT<3, i32>]>; 6350b57cec5SDimitry Andric 6360b57cec5SDimitry Andricdef SDTFloatToInt: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 6370b57cec5SDimitry Andric SDTCisInt<0>, SDTCisFP<1>]>; 6380b57cec5SDimitry Andricdef SDTFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 6390b57cec5SDimitry Andric SDTCisInt<0>, SDTCisFP<1>, 6400b57cec5SDimitry Andric SDTCisVT<2, i32>]>; 6410b57cec5SDimitry Andricdef SDTSFloatToInt: SDTypeProfile<1, 1, [SDTCisInt<0>, SDTCisFP<1>, 6420b57cec5SDimitry Andric SDTCisVec<1>]>; 6430b57cec5SDimitry Andricdef SDTSFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisFP<1>, 6440b57cec5SDimitry Andric SDTCisVec<1>, SDTCisVT<2, i32>]>; 6450b57cec5SDimitry Andric 6460b57cec5SDimitry Andricdef SDTVintToFP: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, 6470b57cec5SDimitry Andric SDTCisFP<0>, SDTCisInt<1>]>; 6480b57cec5SDimitry Andricdef SDTVintToFPRound: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, 6490b57cec5SDimitry Andric SDTCisFP<0>, SDTCisInt<1>, 6500b57cec5SDimitry Andric SDTCisVT<2, i32>]>; 6510b57cec5SDimitry Andric 6520b57cec5SDimitry Andric// Scalar 6530b57cec5SDimitry Andricdef X86SintToFp : SDNode<"X86ISD::SCALAR_SINT_TO_FP", SDTintToFP>; 6540b57cec5SDimitry Andricdef X86SintToFpRnd : SDNode<"X86ISD::SCALAR_SINT_TO_FP_RND", SDTintToFPRound>; 6550b57cec5SDimitry Andricdef X86UintToFp : SDNode<"X86ISD::SCALAR_UINT_TO_FP", SDTintToFP>; 6560b57cec5SDimitry Andricdef X86UintToFpRnd : SDNode<"X86ISD::SCALAR_UINT_TO_FP_RND", SDTintToFPRound>; 6570b57cec5SDimitry Andric 6580b57cec5SDimitry Andricdef X86cvtts2Int : SDNode<"X86ISD::CVTTS2SI", SDTSFloatToInt>; 6590b57cec5SDimitry Andricdef X86cvtts2UInt : SDNode<"X86ISD::CVTTS2UI", SDTSFloatToInt>; 6600b57cec5SDimitry Andricdef X86cvtts2IntSAE : SDNode<"X86ISD::CVTTS2SI_SAE", SDTSFloatToInt>; 6610b57cec5SDimitry Andricdef X86cvtts2UIntSAE : SDNode<"X86ISD::CVTTS2UI_SAE", SDTSFloatToInt>; 6620b57cec5SDimitry Andric 6630b57cec5SDimitry Andricdef X86cvts2si : SDNode<"X86ISD::CVTS2SI", SDTSFloatToInt>; 6640b57cec5SDimitry Andricdef X86cvts2usi : SDNode<"X86ISD::CVTS2UI", SDTSFloatToInt>; 6650b57cec5SDimitry Andricdef X86cvts2siRnd : SDNode<"X86ISD::CVTS2SI_RND", SDTSFloatToIntRnd>; 6660b57cec5SDimitry Andricdef X86cvts2usiRnd : SDNode<"X86ISD::CVTS2UI_RND", SDTSFloatToIntRnd>; 6670b57cec5SDimitry Andric 6680b57cec5SDimitry Andric// Vector with rounding mode 6690b57cec5SDimitry Andric 6700b57cec5SDimitry Andric// cvtt fp-to-int staff 6710b57cec5SDimitry Andricdef X86cvttp2siSAE : SDNode<"X86ISD::CVTTP2SI_SAE", SDTFloatToInt>; 6720b57cec5SDimitry Andricdef X86cvttp2uiSAE : SDNode<"X86ISD::CVTTP2UI_SAE", SDTFloatToInt>; 6730b57cec5SDimitry Andric 6740b57cec5SDimitry Andricdef X86VSintToFpRnd : SDNode<"X86ISD::SINT_TO_FP_RND", SDTVintToFPRound>; 6750b57cec5SDimitry Andricdef X86VUintToFpRnd : SDNode<"X86ISD::UINT_TO_FP_RND", SDTVintToFPRound>; 6760b57cec5SDimitry Andric 6770b57cec5SDimitry Andric// cvt fp-to-int staff 6780b57cec5SDimitry Andricdef X86cvtp2IntRnd : SDNode<"X86ISD::CVTP2SI_RND", SDTFloatToIntRnd>; 6790b57cec5SDimitry Andricdef X86cvtp2UIntRnd : SDNode<"X86ISD::CVTP2UI_RND", SDTFloatToIntRnd>; 6800b57cec5SDimitry Andric 6810b57cec5SDimitry Andric// Vector without rounding mode 6820b57cec5SDimitry Andric 6830b57cec5SDimitry Andric// cvtt fp-to-int staff 6840b57cec5SDimitry Andricdef X86cvttp2si : SDNode<"X86ISD::CVTTP2SI", SDTFloatToInt>; 6850b57cec5SDimitry Andricdef X86cvttp2ui : SDNode<"X86ISD::CVTTP2UI", SDTFloatToInt>; 686480093f4SDimitry Andricdef X86strict_cvttp2si : SDNode<"X86ISD::STRICT_CVTTP2SI", SDTFloatToInt, [SDNPHasChain]>; 687480093f4SDimitry Andricdef X86strict_cvttp2ui : SDNode<"X86ISD::STRICT_CVTTP2UI", SDTFloatToInt, [SDNPHasChain]>; 688480093f4SDimitry Andricdef X86any_cvttp2si : PatFrags<(ops node:$src), 689480093f4SDimitry Andric [(X86strict_cvttp2si node:$src), 690480093f4SDimitry Andric (X86cvttp2si node:$src)]>; 691480093f4SDimitry Andricdef X86any_cvttp2ui : PatFrags<(ops node:$src), 692480093f4SDimitry Andric [(X86strict_cvttp2ui node:$src), 693480093f4SDimitry Andric (X86cvttp2ui node:$src)]>; 6940b57cec5SDimitry Andric 6950b57cec5SDimitry Andricdef X86VSintToFP : SDNode<"X86ISD::CVTSI2P", SDTVintToFP>; 6960b57cec5SDimitry Andricdef X86VUintToFP : SDNode<"X86ISD::CVTUI2P", SDTVintToFP>; 697480093f4SDimitry Andricdef X86strict_VSintToFP : SDNode<"X86ISD::STRICT_CVTSI2P", SDTVintToFP, [SDNPHasChain]>; 698480093f4SDimitry Andricdef X86strict_VUintToFP : SDNode<"X86ISD::STRICT_CVTUI2P", SDTVintToFP, [SDNPHasChain]>; 699480093f4SDimitry Andricdef X86any_VSintToFP : PatFrags<(ops node:$src), 700480093f4SDimitry Andric [(X86strict_VSintToFP node:$src), 701480093f4SDimitry Andric (X86VSintToFP node:$src)]>; 702480093f4SDimitry Andricdef X86any_VUintToFP : PatFrags<(ops node:$src), 703480093f4SDimitry Andric [(X86strict_VUintToFP node:$src), 704480093f4SDimitry Andric (X86VUintToFP node:$src)]>; 705480093f4SDimitry Andric 7060b57cec5SDimitry Andric 7070b57cec5SDimitry Andric// cvt int-to-fp staff 7080b57cec5SDimitry Andricdef X86cvtp2Int : SDNode<"X86ISD::CVTP2SI", SDTFloatToInt>; 7090b57cec5SDimitry Andricdef X86cvtp2UInt : SDNode<"X86ISD::CVTP2UI", SDTFloatToInt>; 7100b57cec5SDimitry Andric 7110b57cec5SDimitry Andric 7120b57cec5SDimitry Andric// Masked versions of above 7130b57cec5SDimitry Andricdef SDTMVintToFP: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisVec<1>, 7140b57cec5SDimitry Andric SDTCisFP<0>, SDTCisInt<1>, 7150b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 7160b57cec5SDimitry Andric SDTCVecEltisVT<3, i1>, 7170b57cec5SDimitry Andric SDTCisSameNumEltsAs<1, 3>]>; 7180b57cec5SDimitry Andricdef SDTMFloatToInt: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisVec<1>, 7190b57cec5SDimitry Andric SDTCisInt<0>, SDTCisFP<1>, 7200b57cec5SDimitry Andric SDTCisSameSizeAs<0, 1>, 7210b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 7220b57cec5SDimitry Andric SDTCVecEltisVT<3, i1>, 7230b57cec5SDimitry Andric SDTCisSameNumEltsAs<1, 3>]>; 7240b57cec5SDimitry Andric 7250b57cec5SDimitry Andricdef X86VMSintToFP : SDNode<"X86ISD::MCVTSI2P", SDTMVintToFP>; 7260b57cec5SDimitry Andricdef X86VMUintToFP : SDNode<"X86ISD::MCVTUI2P", SDTMVintToFP>; 7270b57cec5SDimitry Andric 7280b57cec5SDimitry Andricdef X86mcvtp2Int : SDNode<"X86ISD::MCVTP2SI", SDTMFloatToInt>; 7290b57cec5SDimitry Andricdef X86mcvtp2UInt : SDNode<"X86ISD::MCVTP2UI", SDTMFloatToInt>; 7300b57cec5SDimitry Andricdef X86mcvttp2si : SDNode<"X86ISD::MCVTTP2SI", SDTMFloatToInt>; 7310b57cec5SDimitry Andricdef X86mcvttp2ui : SDNode<"X86ISD::MCVTTP2UI", SDTMFloatToInt>; 7320b57cec5SDimitry Andric 7335ffd83dbSDimitry Andricdef SDTcvtph2ps : SDTypeProfile<1, 1, [SDTCVecEltisVT<0, f32>, 7345ffd83dbSDimitry Andric SDTCVecEltisVT<1, i16>]>; 7355ffd83dbSDimitry Andricdef X86cvtph2ps : SDNode<"X86ISD::CVTPH2PS", SDTcvtph2ps>; 7365ffd83dbSDimitry Andricdef X86strict_cvtph2ps : SDNode<"X86ISD::STRICT_CVTPH2PS", SDTcvtph2ps, 7375ffd83dbSDimitry Andric [SDNPHasChain]>; 7385ffd83dbSDimitry Andricdef X86any_cvtph2ps : PatFrags<(ops node:$src), 7395ffd83dbSDimitry Andric [(X86strict_cvtph2ps node:$src), 7405ffd83dbSDimitry Andric (X86cvtph2ps node:$src)]>; 7410b57cec5SDimitry Andric 7425ffd83dbSDimitry Andricdef X86cvtph2psSAE : SDNode<"X86ISD::CVTPH2PS_SAE", SDTcvtph2ps>; 7430b57cec5SDimitry Andric 7445ffd83dbSDimitry Andricdef SDTcvtps2ph : SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i16>, 7450b57cec5SDimitry Andric SDTCVecEltisVT<1, f32>, 7465ffd83dbSDimitry Andric SDTCisVT<2, i32>]>; 7475ffd83dbSDimitry Andricdef X86cvtps2ph : SDNode<"X86ISD::CVTPS2PH", SDTcvtps2ph>; 7485ffd83dbSDimitry Andricdef X86strict_cvtps2ph : SDNode<"X86ISD::STRICT_CVTPS2PH", SDTcvtps2ph, 7495ffd83dbSDimitry Andric [SDNPHasChain]>; 7505ffd83dbSDimitry Andricdef X86any_cvtps2ph : PatFrags<(ops node:$src1, node:$src2), 7515ffd83dbSDimitry Andric [(X86strict_cvtps2ph node:$src1, node:$src2), 7525ffd83dbSDimitry Andric (X86cvtps2ph node:$src1, node:$src2)]>; 7535ffd83dbSDimitry Andric 754bdd1243dSDimitry Andricdef X86cvtps2phSAE : SDNode<"X86ISD::CVTPS2PH_SAE", SDTcvtps2ph>; 755bdd1243dSDimitry Andric 756bdd1243dSDimitry Andricdef SDTmcvtps2ph : SDTypeProfile<1, 4, [SDTCVecEltisVT<0, i16>, 7570b57cec5SDimitry Andric SDTCVecEltisVT<1, f32>, 7580b57cec5SDimitry Andric SDTCisVT<2, i32>, 7590b57cec5SDimitry Andric SDTCisSameAs<0, 3>, 7600b57cec5SDimitry Andric SDTCVecEltisVT<4, i1>, 761bdd1243dSDimitry Andric SDTCisSameNumEltsAs<1, 4>]>; 762bdd1243dSDimitry Andricdef X86mcvtps2ph : SDNode<"X86ISD::MCVTPS2PH", SDTmcvtps2ph>; 763bdd1243dSDimitry Andricdef X86mcvtps2phSAE : SDNode<"X86ISD::MCVTPS2PH_SAE", SDTmcvtps2ph>; 764bdd1243dSDimitry Andric 7650b57cec5SDimitry Andricdef X86vfpextSAE : SDNode<"X86ISD::VFPEXT_SAE", 766349cc55cSDimitry Andric SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVec<0>, 767349cc55cSDimitry Andric SDTCisFP<1>, SDTCisVec<1>, 7680b57cec5SDimitry Andric SDTCisOpSmallerThanOp<1, 0>]>>; 7690b57cec5SDimitry Andricdef X86vfproundRnd: SDNode<"X86ISD::VFPROUND_RND", 770349cc55cSDimitry Andric SDTypeProfile<1, 2, [SDTCisFP<0>, SDTCisVec<0>, 771349cc55cSDimitry Andric SDTCisFP<1>, SDTCisVec<1>, 7720b57cec5SDimitry Andric SDTCisOpSmallerThanOp<0, 1>, 7730b57cec5SDimitry Andric SDTCisVT<2, i32>]>>; 7740b57cec5SDimitry Andric 7750b57cec5SDimitry Andric// cvt fp to bfloat16 7760b57cec5SDimitry Andricdef X86cvtne2ps2bf16 : SDNode<"X86ISD::CVTNE2PS2BF16", 777bdd1243dSDimitry Andric SDTypeProfile<1, 2, [SDTCVecEltisVT<0, bf16>, 7785ffd83dbSDimitry Andric SDTCVecEltisVT<1, f32>, 7795ffd83dbSDimitry Andric SDTCisSameSizeAs<0,1>, 7800b57cec5SDimitry Andric SDTCisSameAs<1,2>]>>; 7810b57cec5SDimitry Andricdef X86mcvtneps2bf16 : SDNode<"X86ISD::MCVTNEPS2BF16", 782bdd1243dSDimitry Andric SDTypeProfile<1, 3, [SDTCVecEltisVT<0, bf16>, 7830b57cec5SDimitry Andric SDTCVecEltisVT<1, f32>, 7840b57cec5SDimitry Andric SDTCisSameAs<0, 2>, 7850b57cec5SDimitry Andric SDTCVecEltisVT<3, i1>, 7860b57cec5SDimitry Andric SDTCisSameNumEltsAs<1, 3>]>>; 7870b57cec5SDimitry Andricdef X86cvtneps2bf16 : SDNode<"X86ISD::CVTNEPS2BF16", 788bdd1243dSDimitry Andric SDTypeProfile<1, 1, [SDTCVecEltisVT<0, bf16>, 7890b57cec5SDimitry Andric SDTCVecEltisVT<1, f32>]>>; 7900b57cec5SDimitry Andricdef X86dpbf16ps : SDNode<"X86ISD::DPBF16PS", 7910b57cec5SDimitry Andric SDTypeProfile<1, 3, [SDTCVecEltisVT<0, f32>, 7920b57cec5SDimitry Andric SDTCisSameAs<0,1>, 793bdd1243dSDimitry Andric SDTCVecEltisVT<2, bf16>, 7940b57cec5SDimitry Andric SDTCisSameAs<2,3>]>>; 7950b57cec5SDimitry Andric 7960b57cec5SDimitry Andric// galois field arithmetic 7970b57cec5SDimitry Andricdef X86GF2P8affineinvqb : SDNode<"X86ISD::GF2P8AFFINEINVQB", SDTBlend>; 7980b57cec5SDimitry Andricdef X86GF2P8affineqb : SDNode<"X86ISD::GF2P8AFFINEQB", SDTBlend>; 7990b57cec5SDimitry Andricdef X86GF2P8mulb : SDNode<"X86ISD::GF2P8MULB", SDTIntBinOp>; 8000b57cec5SDimitry Andric 801480093f4SDimitry Andricdef SDTX86MaskedStore: SDTypeProfile<0, 3, [ // masked store 802480093f4SDimitry Andric SDTCisVec<0>, SDTCisPtrTy<1>, SDTCisVec<2>, SDTCisSameNumEltsAs<0, 2> 803480093f4SDimitry Andric]>; 804480093f4SDimitry Andric 805bdd1243dSDimitry Andricdef X86vpdpbssd : SDNode<"X86ISD::VPDPBSSD", SDTVnni>; 806bdd1243dSDimitry Andricdef X86vpdpbssds : SDNode<"X86ISD::VPDPBSSDS", SDTVnni>; 807bdd1243dSDimitry Andricdef X86vpdpbsud : SDNode<"X86ISD::VPDPBSUD", SDTVnni>; 808bdd1243dSDimitry Andricdef X86vpdpbsuds : SDNode<"X86ISD::VPDPBSUDS", SDTVnni>; 809bdd1243dSDimitry Andricdef X86vpdpbuud : SDNode<"X86ISD::VPDPBUUD", SDTVnni>; 810bdd1243dSDimitry Andricdef X86vpdpbuuds : SDNode<"X86ISD::VPDPBUUDS", SDTVnni>; 811bdd1243dSDimitry Andric 8120b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8130b57cec5SDimitry Andric// SSE pattern fragments 8140b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8150b57cec5SDimitry Andric 8160b57cec5SDimitry Andric// 128-bit load pattern fragments 817349cc55cSDimitry Andricdef loadv8f16 : PatFrag<(ops node:$ptr), (v8f16 (load node:$ptr))>; 818bdd1243dSDimitry Andricdef loadv8bf16 : PatFrag<(ops node:$ptr), (v8bf16 (load node:$ptr))>; 8190b57cec5SDimitry Andricdef loadv4f32 : PatFrag<(ops node:$ptr), (v4f32 (load node:$ptr))>; 8200b57cec5SDimitry Andricdef loadv2f64 : PatFrag<(ops node:$ptr), (v2f64 (load node:$ptr))>; 8210b57cec5SDimitry Andricdef loadv2i64 : PatFrag<(ops node:$ptr), (v2i64 (load node:$ptr))>; 8220b57cec5SDimitry Andricdef loadv4i32 : PatFrag<(ops node:$ptr), (v4i32 (load node:$ptr))>; 8230b57cec5SDimitry Andricdef loadv8i16 : PatFrag<(ops node:$ptr), (v8i16 (load node:$ptr))>; 8240b57cec5SDimitry Andricdef loadv16i8 : PatFrag<(ops node:$ptr), (v16i8 (load node:$ptr))>; 8250b57cec5SDimitry Andric 8260b57cec5SDimitry Andric// 256-bit load pattern fragments 827349cc55cSDimitry Andricdef loadv16f16 : PatFrag<(ops node:$ptr), (v16f16 (load node:$ptr))>; 828bdd1243dSDimitry Andricdef loadv16bf16 : PatFrag<(ops node:$ptr), (v16bf16 (load node:$ptr))>; 8290b57cec5SDimitry Andricdef loadv8f32 : PatFrag<(ops node:$ptr), (v8f32 (load node:$ptr))>; 8300b57cec5SDimitry Andricdef loadv4f64 : PatFrag<(ops node:$ptr), (v4f64 (load node:$ptr))>; 8310b57cec5SDimitry Andricdef loadv4i64 : PatFrag<(ops node:$ptr), (v4i64 (load node:$ptr))>; 8320b57cec5SDimitry Andricdef loadv8i32 : PatFrag<(ops node:$ptr), (v8i32 (load node:$ptr))>; 8330b57cec5SDimitry Andricdef loadv16i16 : PatFrag<(ops node:$ptr), (v16i16 (load node:$ptr))>; 8340b57cec5SDimitry Andricdef loadv32i8 : PatFrag<(ops node:$ptr), (v32i8 (load node:$ptr))>; 8350b57cec5SDimitry Andric 8360b57cec5SDimitry Andric// 512-bit load pattern fragments 837349cc55cSDimitry Andricdef loadv32f16 : PatFrag<(ops node:$ptr), (v32f16 (load node:$ptr))>; 838bdd1243dSDimitry Andricdef loadv32bf16 : PatFrag<(ops node:$ptr), (v32bf16 (load node:$ptr))>; 8390b57cec5SDimitry Andricdef loadv16f32 : PatFrag<(ops node:$ptr), (v16f32 (load node:$ptr))>; 8400b57cec5SDimitry Andricdef loadv8f64 : PatFrag<(ops node:$ptr), (v8f64 (load node:$ptr))>; 8410b57cec5SDimitry Andricdef loadv8i64 : PatFrag<(ops node:$ptr), (v8i64 (load node:$ptr))>; 8420b57cec5SDimitry Andricdef loadv16i32 : PatFrag<(ops node:$ptr), (v16i32 (load node:$ptr))>; 8430b57cec5SDimitry Andricdef loadv32i16 : PatFrag<(ops node:$ptr), (v32i16 (load node:$ptr))>; 8440b57cec5SDimitry Andricdef loadv64i8 : PatFrag<(ops node:$ptr), (v64i8 (load node:$ptr))>; 8450b57cec5SDimitry Andric 8460b57cec5SDimitry Andric// 128-/256-/512-bit extload pattern fragments 8470b57cec5SDimitry Andricdef extloadv2f32 : PatFrag<(ops node:$ptr), (extloadvf32 node:$ptr)>; 8480b57cec5SDimitry Andricdef extloadv4f32 : PatFrag<(ops node:$ptr), (extloadvf32 node:$ptr)>; 8490b57cec5SDimitry Andricdef extloadv8f32 : PatFrag<(ops node:$ptr), (extloadvf32 node:$ptr)>; 850349cc55cSDimitry Andricdef extloadv2f16 : PatFrag<(ops node:$ptr), (extloadvf16 node:$ptr)>; 851349cc55cSDimitry Andricdef extloadv4f16 : PatFrag<(ops node:$ptr), (extloadvf16 node:$ptr)>; 852349cc55cSDimitry Andricdef extloadv8f16 : PatFrag<(ops node:$ptr), (extloadvf16 node:$ptr)>; 853349cc55cSDimitry Andricdef extloadv16f16 : PatFrag<(ops node:$ptr), (extloadvf16 node:$ptr)>; 8540b57cec5SDimitry Andric 8550b57cec5SDimitry Andric// Like 'store', but always requires vector size alignment. 8560b57cec5SDimitry Andricdef alignedstore : PatFrag<(ops node:$val, node:$ptr), 8570b57cec5SDimitry Andric (store node:$val, node:$ptr), [{ 8580b57cec5SDimitry Andric auto *St = cast<StoreSDNode>(N); 859bdd1243dSDimitry Andric return St->getAlign() >= St->getMemoryVT().getStoreSize(); 8600b57cec5SDimitry Andric}]>; 8610b57cec5SDimitry Andric 8620b57cec5SDimitry Andric// Like 'load', but always requires vector size alignment. 8630b57cec5SDimitry Andricdef alignedload : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 8640b57cec5SDimitry Andric auto *Ld = cast<LoadSDNode>(N); 865bdd1243dSDimitry Andric return Ld->getAlign() >= Ld->getMemoryVT().getStoreSize(); 8660b57cec5SDimitry Andric}]>; 8670b57cec5SDimitry Andric 8680b57cec5SDimitry Andric// 128-bit aligned load pattern fragments 8690b57cec5SDimitry Andric// NOTE: all 128-bit integer vector loads are promoted to v2i64 870349cc55cSDimitry Andricdef alignedloadv8f16 : PatFrag<(ops node:$ptr), 871349cc55cSDimitry Andric (v8f16 (alignedload node:$ptr))>; 872bdd1243dSDimitry Andricdef alignedloadv8bf16 : PatFrag<(ops node:$ptr), 873bdd1243dSDimitry Andric (v8bf16 (alignedload node:$ptr))>; 8740b57cec5SDimitry Andricdef alignedloadv4f32 : PatFrag<(ops node:$ptr), 8750b57cec5SDimitry Andric (v4f32 (alignedload node:$ptr))>; 8760b57cec5SDimitry Andricdef alignedloadv2f64 : PatFrag<(ops node:$ptr), 8770b57cec5SDimitry Andric (v2f64 (alignedload node:$ptr))>; 8780b57cec5SDimitry Andricdef alignedloadv2i64 : PatFrag<(ops node:$ptr), 8790b57cec5SDimitry Andric (v2i64 (alignedload node:$ptr))>; 8800b57cec5SDimitry Andricdef alignedloadv4i32 : PatFrag<(ops node:$ptr), 8810b57cec5SDimitry Andric (v4i32 (alignedload node:$ptr))>; 8820b57cec5SDimitry Andricdef alignedloadv8i16 : PatFrag<(ops node:$ptr), 8830b57cec5SDimitry Andric (v8i16 (alignedload node:$ptr))>; 8840b57cec5SDimitry Andricdef alignedloadv16i8 : PatFrag<(ops node:$ptr), 8850b57cec5SDimitry Andric (v16i8 (alignedload node:$ptr))>; 8860b57cec5SDimitry Andric 8870b57cec5SDimitry Andric// 256-bit aligned load pattern fragments 8880b57cec5SDimitry Andric// NOTE: all 256-bit integer vector loads are promoted to v4i64 889349cc55cSDimitry Andricdef alignedloadv16f16 : PatFrag<(ops node:$ptr), 890349cc55cSDimitry Andric (v16f16 (alignedload node:$ptr))>; 891bdd1243dSDimitry Andricdef alignedloadv16bf16 : PatFrag<(ops node:$ptr), 892bdd1243dSDimitry Andric (v16bf16 (alignedload node:$ptr))>; 8930b57cec5SDimitry Andricdef alignedloadv8f32 : PatFrag<(ops node:$ptr), 8940b57cec5SDimitry Andric (v8f32 (alignedload node:$ptr))>; 8950b57cec5SDimitry Andricdef alignedloadv4f64 : PatFrag<(ops node:$ptr), 8960b57cec5SDimitry Andric (v4f64 (alignedload node:$ptr))>; 8970b57cec5SDimitry Andricdef alignedloadv4i64 : PatFrag<(ops node:$ptr), 8980b57cec5SDimitry Andric (v4i64 (alignedload node:$ptr))>; 8990b57cec5SDimitry Andricdef alignedloadv8i32 : PatFrag<(ops node:$ptr), 9000b57cec5SDimitry Andric (v8i32 (alignedload node:$ptr))>; 9010b57cec5SDimitry Andricdef alignedloadv16i16 : PatFrag<(ops node:$ptr), 9020b57cec5SDimitry Andric (v16i16 (alignedload node:$ptr))>; 9030b57cec5SDimitry Andricdef alignedloadv32i8 : PatFrag<(ops node:$ptr), 9040b57cec5SDimitry Andric (v32i8 (alignedload node:$ptr))>; 9050b57cec5SDimitry Andric 9060b57cec5SDimitry Andric// 512-bit aligned load pattern fragments 907349cc55cSDimitry Andricdef alignedloadv32f16 : PatFrag<(ops node:$ptr), 908349cc55cSDimitry Andric (v32f16 (alignedload node:$ptr))>; 909bdd1243dSDimitry Andricdef alignedloadv32bf16 : PatFrag<(ops node:$ptr), 910bdd1243dSDimitry Andric (v32bf16 (alignedload node:$ptr))>; 9110b57cec5SDimitry Andricdef alignedloadv16f32 : PatFrag<(ops node:$ptr), 9120b57cec5SDimitry Andric (v16f32 (alignedload node:$ptr))>; 9130b57cec5SDimitry Andricdef alignedloadv8f64 : PatFrag<(ops node:$ptr), 9140b57cec5SDimitry Andric (v8f64 (alignedload node:$ptr))>; 9150b57cec5SDimitry Andricdef alignedloadv8i64 : PatFrag<(ops node:$ptr), 9160b57cec5SDimitry Andric (v8i64 (alignedload node:$ptr))>; 9170b57cec5SDimitry Andricdef alignedloadv16i32 : PatFrag<(ops node:$ptr), 9180b57cec5SDimitry Andric (v16i32 (alignedload node:$ptr))>; 9190b57cec5SDimitry Andricdef alignedloadv32i16 : PatFrag<(ops node:$ptr), 9200b57cec5SDimitry Andric (v32i16 (alignedload node:$ptr))>; 9210b57cec5SDimitry Andricdef alignedloadv64i8 : PatFrag<(ops node:$ptr), 9220b57cec5SDimitry Andric (v64i8 (alignedload node:$ptr))>; 9230b57cec5SDimitry Andric 9240b57cec5SDimitry Andric// Like 'load', but uses special alignment checks suitable for use in 9250b57cec5SDimitry Andric// memory operands in most SSE instructions, which are required to 9260b57cec5SDimitry Andric// be naturally aligned on some targets but not on others. If the subtarget 9270b57cec5SDimitry Andric// allows unaligned accesses, match any load, though this may require 9280b57cec5SDimitry Andric// setting a feature bit in the processor (on startup, for example). 9290b57cec5SDimitry Andric// Opteron 10h and later implement such a feature. 9300b57cec5SDimitry Andricdef memop : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 9310b57cec5SDimitry Andric auto *Ld = cast<LoadSDNode>(N); 9320b57cec5SDimitry Andric return Subtarget->hasSSEUnalignedMem() || 933bdd1243dSDimitry Andric Ld->getAlign() >= Ld->getMemoryVT().getStoreSize(); 9340b57cec5SDimitry Andric}]>; 9350b57cec5SDimitry Andric 9360b57cec5SDimitry Andric// 128-bit memop pattern fragments 9370b57cec5SDimitry Andric// NOTE: all 128-bit integer vector loads are promoted to v2i64 9380b57cec5SDimitry Andricdef memopv4f32 : PatFrag<(ops node:$ptr), (v4f32 (memop node:$ptr))>; 9390b57cec5SDimitry Andricdef memopv2f64 : PatFrag<(ops node:$ptr), (v2f64 (memop node:$ptr))>; 9400b57cec5SDimitry Andricdef memopv2i64 : PatFrag<(ops node:$ptr), (v2i64 (memop node:$ptr))>; 9410b57cec5SDimitry Andricdef memopv4i32 : PatFrag<(ops node:$ptr), (v4i32 (memop node:$ptr))>; 9420b57cec5SDimitry Andricdef memopv8i16 : PatFrag<(ops node:$ptr), (v8i16 (memop node:$ptr))>; 9430b57cec5SDimitry Andricdef memopv16i8 : PatFrag<(ops node:$ptr), (v16i8 (memop node:$ptr))>; 9440b57cec5SDimitry Andric 9450b57cec5SDimitry Andric// 128-bit bitconvert pattern fragments 9460b57cec5SDimitry Andricdef bc_v4f32 : PatFrag<(ops node:$in), (v4f32 (bitconvert node:$in))>; 9470b57cec5SDimitry Andricdef bc_v2f64 : PatFrag<(ops node:$in), (v2f64 (bitconvert node:$in))>; 9480b57cec5SDimitry Andricdef bc_v16i8 : PatFrag<(ops node:$in), (v16i8 (bitconvert node:$in))>; 9490b57cec5SDimitry Andricdef bc_v8i16 : PatFrag<(ops node:$in), (v8i16 (bitconvert node:$in))>; 9500b57cec5SDimitry Andricdef bc_v4i32 : PatFrag<(ops node:$in), (v4i32 (bitconvert node:$in))>; 9510b57cec5SDimitry Andricdef bc_v2i64 : PatFrag<(ops node:$in), (v2i64 (bitconvert node:$in))>; 9520b57cec5SDimitry Andric 9530b57cec5SDimitry Andric// 256-bit bitconvert pattern fragments 9540b57cec5SDimitry Andricdef bc_v32i8 : PatFrag<(ops node:$in), (v32i8 (bitconvert node:$in))>; 9550b57cec5SDimitry Andricdef bc_v16i16 : PatFrag<(ops node:$in), (v16i16 (bitconvert node:$in))>; 9560b57cec5SDimitry Andricdef bc_v8i32 : PatFrag<(ops node:$in), (v8i32 (bitconvert node:$in))>; 9570b57cec5SDimitry Andricdef bc_v4i64 : PatFrag<(ops node:$in), (v4i64 (bitconvert node:$in))>; 9580b57cec5SDimitry Andricdef bc_v8f32 : PatFrag<(ops node:$in), (v8f32 (bitconvert node:$in))>; 9590b57cec5SDimitry Andricdef bc_v4f64 : PatFrag<(ops node:$in), (v4f64 (bitconvert node:$in))>; 9600b57cec5SDimitry Andric 9610b57cec5SDimitry Andric// 512-bit bitconvert pattern fragments 9620b57cec5SDimitry Andricdef bc_v64i8 : PatFrag<(ops node:$in), (v64i8 (bitconvert node:$in))>; 9630b57cec5SDimitry Andricdef bc_v32i16 : PatFrag<(ops node:$in), (v32i16 (bitconvert node:$in))>; 9640b57cec5SDimitry Andricdef bc_v16i32 : PatFrag<(ops node:$in), (v16i32 (bitconvert node:$in))>; 9650b57cec5SDimitry Andricdef bc_v8i64 : PatFrag<(ops node:$in), (v8i64 (bitconvert node:$in))>; 9660b57cec5SDimitry Andricdef bc_v8f64 : PatFrag<(ops node:$in), (v8f64 (bitconvert node:$in))>; 9670b57cec5SDimitry Andricdef bc_v16f32 : PatFrag<(ops node:$in), (v16f32 (bitconvert node:$in))>; 9680b57cec5SDimitry Andric 969349cc55cSDimitry Andricdef X86vzload16 : PatFrag<(ops node:$src), 970349cc55cSDimitry Andric (X86vzld node:$src), [{ 971349cc55cSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 2; 972349cc55cSDimitry Andric}]>; 973349cc55cSDimitry Andric 9740b57cec5SDimitry Andricdef X86vzload32 : PatFrag<(ops node:$src), 9750b57cec5SDimitry Andric (X86vzld node:$src), [{ 9760b57cec5SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 4; 9770b57cec5SDimitry Andric}]>; 9780b57cec5SDimitry Andric 9790b57cec5SDimitry Andricdef X86vzload64 : PatFrag<(ops node:$src), 9800b57cec5SDimitry Andric (X86vzld node:$src), [{ 9810b57cec5SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 8; 9820b57cec5SDimitry Andric}]>; 9830b57cec5SDimitry Andric 9840b57cec5SDimitry Andricdef X86vextractstore64 : PatFrag<(ops node:$val, node:$ptr), 9850b57cec5SDimitry Andric (X86vextractst node:$val, node:$ptr), [{ 9860b57cec5SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 8; 9870b57cec5SDimitry Andric}]>; 9880b57cec5SDimitry Andric 9898bcb0991SDimitry Andricdef X86VBroadcastld8 : PatFrag<(ops node:$src), 9908bcb0991SDimitry Andric (X86VBroadcastld node:$src), [{ 9918bcb0991SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 1; 9928bcb0991SDimitry Andric}]>; 9938bcb0991SDimitry Andric 9948bcb0991SDimitry Andricdef X86VBroadcastld16 : PatFrag<(ops node:$src), 9958bcb0991SDimitry Andric (X86VBroadcastld node:$src), [{ 9968bcb0991SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 2; 9978bcb0991SDimitry Andric}]>; 9988bcb0991SDimitry Andric 9998bcb0991SDimitry Andricdef X86VBroadcastld32 : PatFrag<(ops node:$src), 10008bcb0991SDimitry Andric (X86VBroadcastld node:$src), [{ 10018bcb0991SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 4; 10028bcb0991SDimitry Andric}]>; 10038bcb0991SDimitry Andric 10048bcb0991SDimitry Andricdef X86VBroadcastld64 : PatFrag<(ops node:$src), 10058bcb0991SDimitry Andric (X86VBroadcastld node:$src), [{ 10068bcb0991SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 8; 10078bcb0991SDimitry Andric}]>; 10088bcb0991SDimitry Andric 1009e8d8bef9SDimitry Andricdef X86SubVBroadcastld128 : PatFrag<(ops node:$src), 1010e8d8bef9SDimitry Andric (X86SubVBroadcastld node:$src), [{ 1011e8d8bef9SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 16; 1012e8d8bef9SDimitry Andric}]>; 1013e8d8bef9SDimitry Andric 1014e8d8bef9SDimitry Andricdef X86SubVBroadcastld256 : PatFrag<(ops node:$src), 1015e8d8bef9SDimitry Andric (X86SubVBroadcastld node:$src), [{ 1016e8d8bef9SDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 32; 1017e8d8bef9SDimitry Andric}]>; 1018e8d8bef9SDimitry Andric 10195ffd83dbSDimitry Andric// Scalar SSE intrinsic fragments to match several different types of loads. 10205ffd83dbSDimitry Andric// Used by scalar SSE intrinsic instructions which have 128 bit types, but 10215ffd83dbSDimitry Andric// only load a single element. 10225ffd83dbSDimitry Andric// FIXME: We should add more canolicalizing in DAGCombine. Particulary removing 10235ffd83dbSDimitry Andric// the simple_load case. 1024349cc55cSDimitry Andricdef sse_load_f16 : PatFrags<(ops node:$ptr), 1025349cc55cSDimitry Andric [(v8f16 (simple_load node:$ptr)), 1026349cc55cSDimitry Andric (v8f16 (X86vzload16 node:$ptr)), 1027349cc55cSDimitry Andric (v8f16 (scalar_to_vector (loadf16 node:$ptr)))]>; 10285ffd83dbSDimitry Andricdef sse_load_f32 : PatFrags<(ops node:$ptr), 10295ffd83dbSDimitry Andric [(v4f32 (simple_load node:$ptr)), 10305ffd83dbSDimitry Andric (v4f32 (X86vzload32 node:$ptr)), 10315ffd83dbSDimitry Andric (v4f32 (scalar_to_vector (loadf32 node:$ptr)))]>; 10325ffd83dbSDimitry Andricdef sse_load_f64 : PatFrags<(ops node:$ptr), 10335ffd83dbSDimitry Andric [(v2f64 (simple_load node:$ptr)), 10345ffd83dbSDimitry Andric (v2f64 (X86vzload64 node:$ptr)), 10355ffd83dbSDimitry Andric (v2f64 (scalar_to_vector (loadf64 node:$ptr)))]>; 10365ffd83dbSDimitry Andric 1037349cc55cSDimitry Andricdef fp16imm0 : PatLeaf<(f16 fpimm), [{ 1038349cc55cSDimitry Andric return N->isExactlyValue(+0.0); 1039349cc55cSDimitry Andric}]>; 10400b57cec5SDimitry Andric 10410b57cec5SDimitry Andricdef fp32imm0 : PatLeaf<(f32 fpimm), [{ 10420b57cec5SDimitry Andric return N->isExactlyValue(+0.0); 10430b57cec5SDimitry Andric}]>; 10440b57cec5SDimitry Andric 10450b57cec5SDimitry Andricdef fp64imm0 : PatLeaf<(f64 fpimm), [{ 10460b57cec5SDimitry Andric return N->isExactlyValue(+0.0); 10470b57cec5SDimitry Andric}]>; 10480b57cec5SDimitry Andric 10498bcb0991SDimitry Andricdef fp128imm0 : PatLeaf<(f128 fpimm), [{ 10508bcb0991SDimitry Andric return N->isExactlyValue(+0.0); 10518bcb0991SDimitry Andric}]>; 10528bcb0991SDimitry Andric 10530b57cec5SDimitry Andric// EXTRACT_get_vextract128_imm xform function: convert extract_subvector index 10540b57cec5SDimitry Andric// to VEXTRACTF128/VEXTRACTI128 imm. 10550b57cec5SDimitry Andricdef EXTRACT_get_vextract128_imm : SDNodeXForm<extract_subvector, [{ 10560b57cec5SDimitry Andric return getExtractVEXTRACTImmediate(N, 128, SDLoc(N)); 10570b57cec5SDimitry Andric}]>; 10580b57cec5SDimitry Andric 10590b57cec5SDimitry Andric// INSERT_get_vinsert128_imm xform function: convert insert_subvector index to 10600b57cec5SDimitry Andric// VINSERTF128/VINSERTI128 imm. 10610b57cec5SDimitry Andricdef INSERT_get_vinsert128_imm : SDNodeXForm<insert_subvector, [{ 10620b57cec5SDimitry Andric return getInsertVINSERTImmediate(N, 128, SDLoc(N)); 10630b57cec5SDimitry Andric}]>; 10640b57cec5SDimitry Andric 1065349cc55cSDimitry Andric// INSERT_get_vperm2x128_imm xform function: convert insert_subvector index to 1066349cc55cSDimitry Andric// commuted VPERM2F128/VPERM2I128 imm. 1067349cc55cSDimitry Andricdef INSERT_get_vperm2x128_commutedimm : SDNodeXForm<insert_subvector, [{ 1068349cc55cSDimitry Andric return getPermuteVINSERTCommutedImmediate(N, 128, SDLoc(N)); 1069349cc55cSDimitry Andric}]>; 1070349cc55cSDimitry Andric 10710b57cec5SDimitry Andric// EXTRACT_get_vextract256_imm xform function: convert extract_subvector index 10720b57cec5SDimitry Andric// to VEXTRACTF64x4 imm. 10730b57cec5SDimitry Andricdef EXTRACT_get_vextract256_imm : SDNodeXForm<extract_subvector, [{ 10740b57cec5SDimitry Andric return getExtractVEXTRACTImmediate(N, 256, SDLoc(N)); 10750b57cec5SDimitry Andric}]>; 10760b57cec5SDimitry Andric 10770b57cec5SDimitry Andric// INSERT_get_vinsert256_imm xform function: convert insert_subvector index to 10780b57cec5SDimitry Andric// VINSERTF64x4 imm. 10790b57cec5SDimitry Andricdef INSERT_get_vinsert256_imm : SDNodeXForm<insert_subvector, [{ 10800b57cec5SDimitry Andric return getInsertVINSERTImmediate(N, 256, SDLoc(N)); 10810b57cec5SDimitry Andric}]>; 10820b57cec5SDimitry Andric 10830b57cec5SDimitry Andricdef vextract128_extract : PatFrag<(ops node:$bigvec, node:$index), 10840b57cec5SDimitry Andric (extract_subvector node:$bigvec, 10850b57cec5SDimitry Andric node:$index), [{ 10860b57cec5SDimitry Andric // Index 0 can be handled via extract_subreg. 10870b57cec5SDimitry Andric return !isNullConstant(N->getOperand(1)); 10880b57cec5SDimitry Andric}], EXTRACT_get_vextract128_imm>; 10890b57cec5SDimitry Andric 10900b57cec5SDimitry Andricdef vinsert128_insert : PatFrag<(ops node:$bigvec, node:$smallvec, 10910b57cec5SDimitry Andric node:$index), 10920b57cec5SDimitry Andric (insert_subvector node:$bigvec, node:$smallvec, 10930b57cec5SDimitry Andric node:$index), [{}], 10940b57cec5SDimitry Andric INSERT_get_vinsert128_imm>; 10950b57cec5SDimitry Andric 10960b57cec5SDimitry Andricdef vextract256_extract : PatFrag<(ops node:$bigvec, node:$index), 10970b57cec5SDimitry Andric (extract_subvector node:$bigvec, 10980b57cec5SDimitry Andric node:$index), [{ 10990b57cec5SDimitry Andric // Index 0 can be handled via extract_subreg. 11000b57cec5SDimitry Andric return !isNullConstant(N->getOperand(1)); 11010b57cec5SDimitry Andric}], EXTRACT_get_vextract256_imm>; 11020b57cec5SDimitry Andric 11030b57cec5SDimitry Andricdef vinsert256_insert : PatFrag<(ops node:$bigvec, node:$smallvec, 11040b57cec5SDimitry Andric node:$index), 11050b57cec5SDimitry Andric (insert_subvector node:$bigvec, node:$smallvec, 11060b57cec5SDimitry Andric node:$index), [{}], 11070b57cec5SDimitry Andric INSERT_get_vinsert256_imm>; 11080b57cec5SDimitry Andric 11090b57cec5SDimitry Andricdef masked_load : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1110480093f4SDimitry Andric (masked_ld node:$src1, undef, node:$src2, node:$src3), [{ 11110b57cec5SDimitry Andric return !cast<MaskedLoadSDNode>(N)->isExpandingLoad() && 1112480093f4SDimitry Andric cast<MaskedLoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD && 1113480093f4SDimitry Andric cast<MaskedLoadSDNode>(N)->isUnindexed(); 11140b57cec5SDimitry Andric}]>; 11150b57cec5SDimitry Andric 11160b57cec5SDimitry Andricdef masked_load_aligned : PatFrag<(ops node:$src1, node:$src2, node:$src3), 11170b57cec5SDimitry Andric (masked_load node:$src1, node:$src2, node:$src3), [{ 11180b57cec5SDimitry Andric // Use the node type to determine the size the alignment needs to match. 11190b57cec5SDimitry Andric // We can't use memory VT because type widening changes the node VT, but 11200b57cec5SDimitry Andric // not the memory VT. 11210b57cec5SDimitry Andric auto *Ld = cast<MaskedLoadSDNode>(N); 1122bdd1243dSDimitry Andric return Ld->getAlign() >= Ld->getValueType(0).getStoreSize(); 11230b57cec5SDimitry Andric}]>; 11240b57cec5SDimitry Andric 11250b57cec5SDimitry Andricdef X86mExpandingLoad : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1126480093f4SDimitry Andric (masked_ld node:$src1, undef, node:$src2, node:$src3), [{ 1127480093f4SDimitry Andric return cast<MaskedLoadSDNode>(N)->isExpandingLoad() && 1128480093f4SDimitry Andric cast<MaskedLoadSDNode>(N)->isUnindexed(); 11290b57cec5SDimitry Andric}]>; 11300b57cec5SDimitry Andric 11310b57cec5SDimitry Andric// Masked store fragments. 11320b57cec5SDimitry Andric// X86mstore can't be implemented in core DAG files because some targets 11330b57cec5SDimitry Andric// do not support vector types (llvm-tblgen will fail). 11340b57cec5SDimitry Andricdef masked_store : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1135480093f4SDimitry Andric (masked_st node:$src1, node:$src2, undef, node:$src3), [{ 1136480093f4SDimitry Andric return !cast<MaskedStoreSDNode>(N)->isTruncatingStore() && 1137480093f4SDimitry Andric !cast<MaskedStoreSDNode>(N)->isCompressingStore() && 1138480093f4SDimitry Andric cast<MaskedStoreSDNode>(N)->isUnindexed(); 11390b57cec5SDimitry Andric}]>; 11400b57cec5SDimitry Andric 11410b57cec5SDimitry Andricdef masked_store_aligned : PatFrag<(ops node:$src1, node:$src2, node:$src3), 11420b57cec5SDimitry Andric (masked_store node:$src1, node:$src2, node:$src3), [{ 11430b57cec5SDimitry Andric // Use the node type to determine the size the alignment needs to match. 11440b57cec5SDimitry Andric // We can't use memory VT because type widening changes the node VT, but 11450b57cec5SDimitry Andric // not the memory VT. 11460b57cec5SDimitry Andric auto *St = cast<MaskedStoreSDNode>(N); 1147bdd1243dSDimitry Andric return St->getAlign() >= St->getOperand(1).getValueType().getStoreSize(); 11480b57cec5SDimitry Andric}]>; 11490b57cec5SDimitry Andric 11500b57cec5SDimitry Andricdef X86mCompressingStore : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1151480093f4SDimitry Andric (masked_st node:$src1, node:$src2, undef, node:$src3), [{ 1152480093f4SDimitry Andric return cast<MaskedStoreSDNode>(N)->isCompressingStore() && 1153480093f4SDimitry Andric cast<MaskedStoreSDNode>(N)->isUnindexed(); 11540b57cec5SDimitry Andric}]>; 11550b57cec5SDimitry Andric 11560b57cec5SDimitry Andric// masked truncstore fragments 11570b57cec5SDimitry Andric// X86mtruncstore can't be implemented in core DAG files because some targets 11580b57cec5SDimitry Andric// doesn't support vector type ( llvm-tblgen will fail) 11590b57cec5SDimitry Andricdef X86mtruncstore : PatFrag<(ops node:$src1, node:$src2, node:$src3), 1160480093f4SDimitry Andric (masked_st node:$src1, node:$src2, undef, node:$src3), [{ 1161480093f4SDimitry Andric return cast<MaskedStoreSDNode>(N)->isTruncatingStore() && 1162480093f4SDimitry Andric cast<MaskedStoreSDNode>(N)->isUnindexed(); 11630b57cec5SDimitry Andric}]>; 11640b57cec5SDimitry Andricdef masked_truncstorevi8 : 11650b57cec5SDimitry Andric PatFrag<(ops node:$src1, node:$src2, node:$src3), 11660b57cec5SDimitry Andric (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ 11670b57cec5SDimitry Andric return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; 11680b57cec5SDimitry Andric}]>; 11690b57cec5SDimitry Andricdef masked_truncstorevi16 : 11700b57cec5SDimitry Andric PatFrag<(ops node:$src1, node:$src2, node:$src3), 11710b57cec5SDimitry Andric (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ 11720b57cec5SDimitry Andric return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; 11730b57cec5SDimitry Andric}]>; 11740b57cec5SDimitry Andricdef masked_truncstorevi32 : 11750b57cec5SDimitry Andric PatFrag<(ops node:$src1, node:$src2, node:$src3), 11760b57cec5SDimitry Andric (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ 11770b57cec5SDimitry Andric return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; 11780b57cec5SDimitry Andric}]>; 11790b57cec5SDimitry Andric 11800b57cec5SDimitry Andricdef X86TruncSStore : SDNode<"X86ISD::VTRUNCSTORES", SDTStore, 11810b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 11820b57cec5SDimitry Andric 11830b57cec5SDimitry Andricdef X86TruncUSStore : SDNode<"X86ISD::VTRUNCSTOREUS", SDTStore, 11840b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 11850b57cec5SDimitry Andric 1186480093f4SDimitry Andricdef X86MTruncSStore : SDNode<"X86ISD::VMTRUNCSTORES", SDTX86MaskedStore, 11870b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 11880b57cec5SDimitry Andric 1189480093f4SDimitry Andricdef X86MTruncUSStore : SDNode<"X86ISD::VMTRUNCSTOREUS", SDTX86MaskedStore, 11900b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; 11910b57cec5SDimitry Andric 11920b57cec5SDimitry Andricdef truncstore_s_vi8 : PatFrag<(ops node:$val, node:$ptr), 11930b57cec5SDimitry Andric (X86TruncSStore node:$val, node:$ptr), [{ 11945ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; 11950b57cec5SDimitry Andric}]>; 11960b57cec5SDimitry Andric 11970b57cec5SDimitry Andricdef truncstore_us_vi8 : PatFrag<(ops node:$val, node:$ptr), 11980b57cec5SDimitry Andric (X86TruncUSStore node:$val, node:$ptr), [{ 11995ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; 12000b57cec5SDimitry Andric}]>; 12010b57cec5SDimitry Andric 12020b57cec5SDimitry Andricdef truncstore_s_vi16 : PatFrag<(ops node:$val, node:$ptr), 12030b57cec5SDimitry Andric (X86TruncSStore node:$val, node:$ptr), [{ 12045ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; 12050b57cec5SDimitry Andric}]>; 12060b57cec5SDimitry Andric 12070b57cec5SDimitry Andricdef truncstore_us_vi16 : PatFrag<(ops node:$val, node:$ptr), 12080b57cec5SDimitry Andric (X86TruncUSStore node:$val, node:$ptr), [{ 12095ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; 12100b57cec5SDimitry Andric}]>; 12110b57cec5SDimitry Andric 12120b57cec5SDimitry Andricdef truncstore_s_vi32 : PatFrag<(ops node:$val, node:$ptr), 12130b57cec5SDimitry Andric (X86TruncSStore node:$val, node:$ptr), [{ 12145ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; 12150b57cec5SDimitry Andric}]>; 12160b57cec5SDimitry Andric 12170b57cec5SDimitry Andricdef truncstore_us_vi32 : PatFrag<(ops node:$val, node:$ptr), 12180b57cec5SDimitry Andric (X86TruncUSStore node:$val, node:$ptr), [{ 12195ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; 12200b57cec5SDimitry Andric}]>; 12210b57cec5SDimitry Andric 12220b57cec5SDimitry Andricdef masked_truncstore_s_vi8 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 12230b57cec5SDimitry Andric (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{ 12245ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; 12250b57cec5SDimitry Andric}]>; 12260b57cec5SDimitry Andric 12270b57cec5SDimitry Andricdef masked_truncstore_us_vi8 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 12280b57cec5SDimitry Andric (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{ 12295ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; 12300b57cec5SDimitry Andric}]>; 12310b57cec5SDimitry Andric 12320b57cec5SDimitry Andricdef masked_truncstore_s_vi16 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 12330b57cec5SDimitry Andric (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{ 12345ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; 12350b57cec5SDimitry Andric}]>; 12360b57cec5SDimitry Andric 12370b57cec5SDimitry Andricdef masked_truncstore_us_vi16 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 12380b57cec5SDimitry Andric (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{ 12395ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; 12400b57cec5SDimitry Andric}]>; 12410b57cec5SDimitry Andric 12420b57cec5SDimitry Andricdef masked_truncstore_s_vi32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 12430b57cec5SDimitry Andric (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{ 12445ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; 12450b57cec5SDimitry Andric}]>; 12460b57cec5SDimitry Andric 12470b57cec5SDimitry Andricdef masked_truncstore_us_vi32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), 12480b57cec5SDimitry Andric (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{ 12495ffd83dbSDimitry Andric return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; 12500b57cec5SDimitry Andric}]>; 1251*5f757f3fSDimitry Andric 1252*5f757f3fSDimitry Andricdef X86Vfpclasss_su : PatFrag<(ops node:$src1, node:$src2), 1253*5f757f3fSDimitry Andric (X86Vfpclasss node:$src1, node:$src2), [{ 1254*5f757f3fSDimitry Andric return N->hasOneUse(); 1255*5f757f3fSDimitry Andric}]>; 1256*5f757f3fSDimitry Andric 1257*5f757f3fSDimitry Andricdef X86Vfpclass_su : PatFrag<(ops node:$src1, node:$src2), 1258*5f757f3fSDimitry Andric (X86Vfpclass node:$src1, node:$src2), [{ 1259*5f757f3fSDimitry Andric return N->hasOneUse(); 1260*5f757f3fSDimitry Andric}]>; 1261*5f757f3fSDimitry Andric 1262*5f757f3fSDimitry Andric// These nodes use 'vnot' instead of 'not' to support vectors. 1263*5f757f3fSDimitry Andricdef vandn : PatFrag<(ops node:$i0, node:$i1), (and (vnot node:$i0), node:$i1)>; 1264*5f757f3fSDimitry Andricdef vxnor : PatFrag<(ops node:$i0, node:$i1), (vnot (xor node:$i0, node:$i1))>; 1265*5f757f3fSDimitry Andric 1266*5f757f3fSDimitry Andric// Used for matching masked operations. Ensures the operation part only has a 1267*5f757f3fSDimitry Andric// single use. 1268*5f757f3fSDimitry Andricdef vselect_mask : PatFrag<(ops node:$mask, node:$src1, node:$src2), 1269*5f757f3fSDimitry Andric (vselect node:$mask, node:$src1, node:$src2), [{ 1270*5f757f3fSDimitry Andric return isProfitableToFormMaskedOp(N); 1271*5f757f3fSDimitry Andric}]>; 1272*5f757f3fSDimitry Andric 1273*5f757f3fSDimitry Andricdef X86selects_mask : PatFrag<(ops node:$mask, node:$src1, node:$src2), 1274*5f757f3fSDimitry Andric (X86selects node:$mask, node:$src1, node:$src2), [{ 1275*5f757f3fSDimitry Andric return isProfitableToFormMaskedOp(N); 1276*5f757f3fSDimitry Andric}]>; 1277*5f757f3fSDimitry Andric 1278*5f757f3fSDimitry Andricdef X86cmpms_su : PatFrag<(ops node:$src1, node:$src2, node:$cc), 1279*5f757f3fSDimitry Andric (X86cmpms node:$src1, node:$src2, node:$cc), [{ 1280*5f757f3fSDimitry Andric return N->hasOneUse(); 1281*5f757f3fSDimitry Andric}]>; 1282*5f757f3fSDimitry Andricdef X86cmpmsSAE_su : PatFrag<(ops node:$src1, node:$src2, node:$cc), 1283*5f757f3fSDimitry Andric (X86cmpmsSAE node:$src1, node:$src2, node:$cc), [{ 1284*5f757f3fSDimitry Andric return N->hasOneUse(); 1285*5f757f3fSDimitry Andric}]>; 1286*5f757f3fSDimitry Andric 1287*5f757f3fSDimitry Andric// PatFrags that contain a select and a truncate op. The take operands in the 1288*5f757f3fSDimitry Andric// same order as X86vmtrunc, X86vmtruncs, X86vmtruncus. This allows us to pass 1289*5f757f3fSDimitry Andric// either to the multiclasses. 1290*5f757f3fSDimitry Andricdef select_trunc : PatFrag<(ops node:$src, node:$src0, node:$mask), 1291*5f757f3fSDimitry Andric (vselect_mask node:$mask, 1292*5f757f3fSDimitry Andric (trunc node:$src), node:$src0)>; 1293*5f757f3fSDimitry Andricdef select_truncs : PatFrag<(ops node:$src, node:$src0, node:$mask), 1294*5f757f3fSDimitry Andric (vselect_mask node:$mask, 1295*5f757f3fSDimitry Andric (X86vtruncs node:$src), node:$src0)>; 1296*5f757f3fSDimitry Andricdef select_truncus : PatFrag<(ops node:$src, node:$src0, node:$mask), 1297*5f757f3fSDimitry Andric (vselect_mask node:$mask, 1298*5f757f3fSDimitry Andric (X86vtruncus node:$src), node:$src0)>; 1299*5f757f3fSDimitry Andric 1300*5f757f3fSDimitry Andricdef X86Vpshufbitqmb_su : PatFrag<(ops node:$src1, node:$src2), 1301*5f757f3fSDimitry Andric (X86Vpshufbitqmb node:$src1, node:$src2), [{ 1302*5f757f3fSDimitry Andric return N->hasOneUse(); 1303*5f757f3fSDimitry Andric}]>; 1304*5f757f3fSDimitry Andric 1305*5f757f3fSDimitry Andric// This fragment treats X86cmpm as commutable to help match loads in both 1306*5f757f3fSDimitry Andric// operands for PCMPEQ. 1307*5f757f3fSDimitry Andricdef X86setcc_commute : SDNode<"ISD::SETCC", SDTSetCC, [SDNPCommutative]>; 1308*5f757f3fSDimitry Andricdef X86pcmpgtm : PatFrag<(ops node:$src1, node:$src2), 1309*5f757f3fSDimitry Andric (setcc node:$src1, node:$src2, SETGT)>; 1310*5f757f3fSDimitry Andric 1311*5f757f3fSDimitry Andricdef X86pcmpm_imm : SDNodeXForm<setcc, [{ 1312*5f757f3fSDimitry Andric ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get(); 1313*5f757f3fSDimitry Andric uint8_t SSECC = X86::getVPCMPImmForCond(CC); 1314*5f757f3fSDimitry Andric return getI8Imm(SSECC, SDLoc(N)); 1315*5f757f3fSDimitry Andric}]>; 1316*5f757f3fSDimitry Andric 1317*5f757f3fSDimitry Andric// Swapped operand version of the above. 1318*5f757f3fSDimitry Andricdef X86pcmpm_imm_commute : SDNodeXForm<setcc, [{ 1319*5f757f3fSDimitry Andric ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get(); 1320*5f757f3fSDimitry Andric uint8_t SSECC = X86::getVPCMPImmForCond(CC); 1321*5f757f3fSDimitry Andric SSECC = X86::getSwappedVPCMPImm(SSECC); 1322*5f757f3fSDimitry Andric return getI8Imm(SSECC, SDLoc(N)); 1323*5f757f3fSDimitry Andric}]>; 1324*5f757f3fSDimitry Andric 1325*5f757f3fSDimitry Andricdef X86pcmpm : PatFrag<(ops node:$src1, node:$src2, node:$cc), 1326*5f757f3fSDimitry Andric (setcc node:$src1, node:$src2, node:$cc), [{ 1327*5f757f3fSDimitry Andric ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get(); 1328*5f757f3fSDimitry Andric return !ISD::isUnsignedIntSetCC(CC); 1329*5f757f3fSDimitry Andric}], X86pcmpm_imm>; 1330*5f757f3fSDimitry Andric 1331*5f757f3fSDimitry Andricdef X86pcmpm_su : PatFrag<(ops node:$src1, node:$src2, node:$cc), 1332*5f757f3fSDimitry Andric (setcc node:$src1, node:$src2, node:$cc), [{ 1333*5f757f3fSDimitry Andric ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get(); 1334*5f757f3fSDimitry Andric return N->hasOneUse() && !ISD::isUnsignedIntSetCC(CC); 1335*5f757f3fSDimitry Andric}], X86pcmpm_imm>; 1336*5f757f3fSDimitry Andric 1337*5f757f3fSDimitry Andricdef X86pcmpum : PatFrag<(ops node:$src1, node:$src2, node:$cc), 1338*5f757f3fSDimitry Andric (setcc node:$src1, node:$src2, node:$cc), [{ 1339*5f757f3fSDimitry Andric ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get(); 1340*5f757f3fSDimitry Andric return ISD::isUnsignedIntSetCC(CC); 1341*5f757f3fSDimitry Andric}], X86pcmpm_imm>; 1342*5f757f3fSDimitry Andric 1343*5f757f3fSDimitry Andricdef X86pcmpum_su : PatFrag<(ops node:$src1, node:$src2, node:$cc), 1344*5f757f3fSDimitry Andric (setcc node:$src1, node:$src2, node:$cc), [{ 1345*5f757f3fSDimitry Andric ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get(); 1346*5f757f3fSDimitry Andric return N->hasOneUse() && ISD::isUnsignedIntSetCC(CC); 1347*5f757f3fSDimitry Andric}], X86pcmpm_imm>; 1348*5f757f3fSDimitry Andric 1349*5f757f3fSDimitry Andricdef X86cmpm_su : PatFrag<(ops node:$src1, node:$src2, node:$cc), 1350*5f757f3fSDimitry Andric (X86cmpm node:$src1, node:$src2, node:$cc), [{ 1351*5f757f3fSDimitry Andric return N->hasOneUse(); 1352*5f757f3fSDimitry Andric}]>; 1353*5f757f3fSDimitry Andric 1354*5f757f3fSDimitry Andricdef X86cmpm_imm_commute : SDNodeXForm<timm, [{ 1355*5f757f3fSDimitry Andric uint8_t Imm = X86::getSwappedVCMPImm(N->getZExtValue() & 0x1f); 1356*5f757f3fSDimitry Andric return getI8Imm(Imm, SDLoc(N)); 1357*5f757f3fSDimitry Andric}]>; 1358*5f757f3fSDimitry Andric 1359*5f757f3fSDimitry Andricdef X86vpmaddwd_su : PatFrag<(ops node:$lhs, node:$rhs), 1360*5f757f3fSDimitry Andric (X86vpmaddwd node:$lhs, node:$rhs), [{ 1361*5f757f3fSDimitry Andric return N->hasOneUse(); 1362*5f757f3fSDimitry Andric}]>; 1363*5f757f3fSDimitry Andric 1364