xref: /freebsd/contrib/llvm-project/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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 X86rsqrt28   : SDNode<"X86ISD::RSQRT28",     SDTFPUnaryOp>;
6040b57cec5SDimitry Andricdef X86rsqrt28SAE: SDNode<"X86ISD::RSQRT28_SAE", SDTFPUnaryOp>;
6050b57cec5SDimitry Andricdef X86rcp28     : SDNode<"X86ISD::RCP28",       SDTFPUnaryOp>;
6060b57cec5SDimitry Andricdef X86rcp28SAE  : SDNode<"X86ISD::RCP28_SAE",   SDTFPUnaryOp>;
6070b57cec5SDimitry Andricdef X86exp2      : SDNode<"X86ISD::EXP2",        SDTFPUnaryOp>;
6080b57cec5SDimitry Andricdef X86exp2SAE   : SDNode<"X86ISD::EXP2_SAE",    SDTFPUnaryOp>;
6090b57cec5SDimitry Andric
6100b57cec5SDimitry Andricdef X86rsqrt14s  : SDNode<"X86ISD::RSQRT14S",   SDTFPBinOp>;
6110b57cec5SDimitry Andricdef X86rcp14s    : SDNode<"X86ISD::RCP14S",     SDTFPBinOp>;
6120b57cec5SDimitry Andricdef X86rsqrt28s  : SDNode<"X86ISD::RSQRT28S",   SDTFPBinOp>;
6130b57cec5SDimitry Andricdef X86rsqrt28SAEs : SDNode<"X86ISD::RSQRT28S_SAE", SDTFPBinOp>;
6140b57cec5SDimitry Andricdef X86rcp28s    : SDNode<"X86ISD::RCP28S",     SDTFPBinOp>;
6150b57cec5SDimitry Andricdef X86rcp28SAEs : SDNode<"X86ISD::RCP28S_SAE", SDTFPBinOp>;
6160b57cec5SDimitry Andricdef X86Ranges    : SDNode<"X86ISD::VRANGES",    SDTFPBinOpImm>;
6170b57cec5SDimitry Andricdef X86RndScales : SDNode<"X86ISD::VRNDSCALES", SDTFPBinOpImm>;
6180b57cec5SDimitry Andricdef X86Reduces   : SDNode<"X86ISD::VREDUCES",   SDTFPBinOpImm>;
6190b57cec5SDimitry Andricdef X86GetMants  : SDNode<"X86ISD::VGETMANTS",  SDTFPBinOpImm>;
6200b57cec5SDimitry Andricdef X86RangesSAE    : SDNode<"X86ISD::VRANGES_SAE",    SDTFPBinOpImm>;
6210b57cec5SDimitry Andricdef X86RndScalesSAE : SDNode<"X86ISD::VRNDSCALES_SAE", SDTFPBinOpImm>;
6220b57cec5SDimitry Andricdef X86ReducesSAE   : SDNode<"X86ISD::VREDUCES_SAE",   SDTFPBinOpImm>;
6230b57cec5SDimitry Andricdef X86GetMantsSAE  : SDNode<"X86ISD::VGETMANTS_SAE",  SDTFPBinOpImm>;
6240b57cec5SDimitry Andric
6250b57cec5SDimitry Andricdef X86compress: SDNode<"X86ISD::COMPRESS", SDTypeProfile<1, 3,
6260b57cec5SDimitry Andric                              [SDTCisSameAs<0, 1>, SDTCisVec<1>,
6270b57cec5SDimitry Andric                               SDTCisSameAs<0, 2>, SDTCVecEltisVT<3, i1>,
6280b57cec5SDimitry Andric                               SDTCisSameNumEltsAs<0, 3>]>, []>;
6290b57cec5SDimitry Andricdef X86expand  : SDNode<"X86ISD::EXPAND", SDTypeProfile<1, 3,
6300b57cec5SDimitry Andric                              [SDTCisSameAs<0, 1>, SDTCisVec<1>,
6310b57cec5SDimitry Andric                               SDTCisSameAs<0, 2>, SDTCVecEltisVT<3, i1>,
6320b57cec5SDimitry Andric                               SDTCisSameNumEltsAs<0, 3>]>, []>;
6330b57cec5SDimitry Andric
6340b57cec5SDimitry Andric// vpshufbitqmb
6350b57cec5SDimitry Andricdef X86Vpshufbitqmb : SDNode<"X86ISD::VPSHUFBITQMB",
6360b57cec5SDimitry Andric                             SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>,
6370b57cec5SDimitry Andric                                                  SDTCisSameAs<1,2>,
6380b57cec5SDimitry Andric                                                  SDTCVecEltisVT<0,i1>,
6390b57cec5SDimitry Andric                                                  SDTCisSameNumEltsAs<0,1>]>>;
6400b57cec5SDimitry Andric
6410b57cec5SDimitry Andricdef SDTintToFP: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisFP<0>,
6420b57cec5SDimitry Andric                                     SDTCisSameAs<0,1>, SDTCisInt<2>]>;
6430b57cec5SDimitry Andricdef SDTintToFPRound: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisFP<0>,
6440b57cec5SDimitry Andric                                          SDTCisSameAs<0,1>, SDTCisInt<2>,
6450b57cec5SDimitry Andric                                          SDTCisVT<3, i32>]>;
6460b57cec5SDimitry Andric
6470b57cec5SDimitry Andricdef SDTFloatToInt: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>,
6480b57cec5SDimitry Andric                                        SDTCisInt<0>, SDTCisFP<1>]>;
6490b57cec5SDimitry Andricdef SDTFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>,
6500b57cec5SDimitry Andric                                           SDTCisInt<0>, SDTCisFP<1>,
6510b57cec5SDimitry Andric                                           SDTCisVT<2, i32>]>;
6520b57cec5SDimitry Andricdef SDTSFloatToInt: SDTypeProfile<1, 1, [SDTCisInt<0>, SDTCisFP<1>,
6530b57cec5SDimitry Andric                                         SDTCisVec<1>]>;
6540b57cec5SDimitry Andricdef SDTSFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisFP<1>,
6550b57cec5SDimitry Andric                                            SDTCisVec<1>, SDTCisVT<2, i32>]>;
6560b57cec5SDimitry Andric
6570b57cec5SDimitry Andricdef SDTVintToFP: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>,
6580b57cec5SDimitry Andric                                      SDTCisFP<0>, SDTCisInt<1>]>;
6590b57cec5SDimitry Andricdef SDTVintToFPRound: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>,
6600b57cec5SDimitry Andric                                           SDTCisFP<0>, SDTCisInt<1>,
6610b57cec5SDimitry Andric                                           SDTCisVT<2, i32>]>;
6620b57cec5SDimitry Andric
6630b57cec5SDimitry Andric// Scalar
6640b57cec5SDimitry Andricdef X86SintToFp     : SDNode<"X86ISD::SCALAR_SINT_TO_FP",      SDTintToFP>;
6650b57cec5SDimitry Andricdef X86SintToFpRnd  : SDNode<"X86ISD::SCALAR_SINT_TO_FP_RND",  SDTintToFPRound>;
6660b57cec5SDimitry Andricdef X86UintToFp     : SDNode<"X86ISD::SCALAR_UINT_TO_FP",      SDTintToFP>;
6670b57cec5SDimitry Andricdef X86UintToFpRnd  : SDNode<"X86ISD::SCALAR_UINT_TO_FP_RND",  SDTintToFPRound>;
6680b57cec5SDimitry Andric
6690b57cec5SDimitry Andricdef X86cvtts2Int  : SDNode<"X86ISD::CVTTS2SI",  SDTSFloatToInt>;
6700b57cec5SDimitry Andricdef X86cvtts2UInt : SDNode<"X86ISD::CVTTS2UI",  SDTSFloatToInt>;
6710b57cec5SDimitry Andricdef X86cvtts2IntSAE  : SDNode<"X86ISD::CVTTS2SI_SAE",  SDTSFloatToInt>;
6720b57cec5SDimitry Andricdef X86cvtts2UIntSAE : SDNode<"X86ISD::CVTTS2UI_SAE",  SDTSFloatToInt>;
6730b57cec5SDimitry Andric
6740b57cec5SDimitry Andricdef X86cvts2si  : SDNode<"X86ISD::CVTS2SI", SDTSFloatToInt>;
6750b57cec5SDimitry Andricdef X86cvts2usi : SDNode<"X86ISD::CVTS2UI", SDTSFloatToInt>;
6760b57cec5SDimitry Andricdef X86cvts2siRnd  : SDNode<"X86ISD::CVTS2SI_RND", SDTSFloatToIntRnd>;
6770b57cec5SDimitry Andricdef X86cvts2usiRnd : SDNode<"X86ISD::CVTS2UI_RND", SDTSFloatToIntRnd>;
6780b57cec5SDimitry Andric
6790b57cec5SDimitry Andric// Vector with rounding mode
6800b57cec5SDimitry Andric
6810b57cec5SDimitry Andric// cvtt fp-to-int staff
6820b57cec5SDimitry Andricdef X86cvttp2siSAE    : SDNode<"X86ISD::CVTTP2SI_SAE", SDTFloatToInt>;
6830b57cec5SDimitry Andricdef X86cvttp2uiSAE    : SDNode<"X86ISD::CVTTP2UI_SAE", SDTFloatToInt>;
6840b57cec5SDimitry Andric
6850b57cec5SDimitry Andricdef X86VSintToFpRnd   : SDNode<"X86ISD::SINT_TO_FP_RND",  SDTVintToFPRound>;
6860b57cec5SDimitry Andricdef X86VUintToFpRnd   : SDNode<"X86ISD::UINT_TO_FP_RND",  SDTVintToFPRound>;
6870b57cec5SDimitry Andric
6880b57cec5SDimitry Andric// cvt fp-to-int staff
6890b57cec5SDimitry Andricdef X86cvtp2IntRnd      : SDNode<"X86ISD::CVTP2SI_RND",  SDTFloatToIntRnd>;
6900b57cec5SDimitry Andricdef X86cvtp2UIntRnd     : SDNode<"X86ISD::CVTP2UI_RND",  SDTFloatToIntRnd>;
6910b57cec5SDimitry Andric
6920b57cec5SDimitry Andric// Vector without rounding mode
6930b57cec5SDimitry Andric
6940b57cec5SDimitry Andric// cvtt fp-to-int staff
6950b57cec5SDimitry Andricdef X86cvttp2si      : SDNode<"X86ISD::CVTTP2SI",  SDTFloatToInt>;
6960b57cec5SDimitry Andricdef X86cvttp2ui      : SDNode<"X86ISD::CVTTP2UI",  SDTFloatToInt>;
697480093f4SDimitry Andricdef X86strict_cvttp2si : SDNode<"X86ISD::STRICT_CVTTP2SI",  SDTFloatToInt, [SDNPHasChain]>;
698480093f4SDimitry Andricdef X86strict_cvttp2ui : SDNode<"X86ISD::STRICT_CVTTP2UI",  SDTFloatToInt, [SDNPHasChain]>;
699480093f4SDimitry Andricdef X86any_cvttp2si : PatFrags<(ops node:$src),
700480093f4SDimitry Andric                               [(X86strict_cvttp2si node:$src),
701480093f4SDimitry Andric                                (X86cvttp2si node:$src)]>;
702480093f4SDimitry Andricdef X86any_cvttp2ui : PatFrags<(ops node:$src),
703480093f4SDimitry Andric                               [(X86strict_cvttp2ui node:$src),
704480093f4SDimitry Andric                                (X86cvttp2ui node:$src)]>;
7050b57cec5SDimitry Andric
7060b57cec5SDimitry Andricdef X86VSintToFP      : SDNode<"X86ISD::CVTSI2P",  SDTVintToFP>;
7070b57cec5SDimitry Andricdef X86VUintToFP      : SDNode<"X86ISD::CVTUI2P",  SDTVintToFP>;
708480093f4SDimitry Andricdef X86strict_VSintToFP : SDNode<"X86ISD::STRICT_CVTSI2P",  SDTVintToFP, [SDNPHasChain]>;
709480093f4SDimitry Andricdef X86strict_VUintToFP : SDNode<"X86ISD::STRICT_CVTUI2P",  SDTVintToFP, [SDNPHasChain]>;
710480093f4SDimitry Andricdef X86any_VSintToFP : PatFrags<(ops node:$src),
711480093f4SDimitry Andric                                [(X86strict_VSintToFP node:$src),
712480093f4SDimitry Andric                                 (X86VSintToFP node:$src)]>;
713480093f4SDimitry Andricdef X86any_VUintToFP : PatFrags<(ops node:$src),
714480093f4SDimitry Andric                                [(X86strict_VUintToFP node:$src),
715480093f4SDimitry Andric                                 (X86VUintToFP node:$src)]>;
716480093f4SDimitry Andric
7170b57cec5SDimitry Andric
7180b57cec5SDimitry Andric// cvt int-to-fp staff
7190b57cec5SDimitry Andricdef X86cvtp2Int      : SDNode<"X86ISD::CVTP2SI",  SDTFloatToInt>;
7200b57cec5SDimitry Andricdef X86cvtp2UInt     : SDNode<"X86ISD::CVTP2UI",  SDTFloatToInt>;
7210b57cec5SDimitry Andric
7220b57cec5SDimitry Andric
7230b57cec5SDimitry Andric// Masked versions of above
7240b57cec5SDimitry Andricdef SDTMVintToFP: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisVec<1>,
7250b57cec5SDimitry Andric                                       SDTCisFP<0>, SDTCisInt<1>,
7260b57cec5SDimitry Andric                                       SDTCisSameAs<0, 2>,
7270b57cec5SDimitry Andric                                       SDTCVecEltisVT<3, i1>,
7280b57cec5SDimitry Andric                                       SDTCisSameNumEltsAs<1, 3>]>;
7290b57cec5SDimitry Andricdef SDTMFloatToInt: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisVec<1>,
7300b57cec5SDimitry Andric                                         SDTCisInt<0>, SDTCisFP<1>,
7310b57cec5SDimitry Andric                                         SDTCisSameSizeAs<0, 1>,
7320b57cec5SDimitry Andric                                         SDTCisSameAs<0, 2>,
7330b57cec5SDimitry Andric                                         SDTCVecEltisVT<3, i1>,
7340b57cec5SDimitry Andric                                         SDTCisSameNumEltsAs<1, 3>]>;
7350b57cec5SDimitry Andric
7360b57cec5SDimitry Andricdef X86VMSintToFP    : SDNode<"X86ISD::MCVTSI2P",  SDTMVintToFP>;
7370b57cec5SDimitry Andricdef X86VMUintToFP    : SDNode<"X86ISD::MCVTUI2P",  SDTMVintToFP>;
7380b57cec5SDimitry Andric
7390b57cec5SDimitry Andricdef X86mcvtp2Int     : SDNode<"X86ISD::MCVTP2SI",  SDTMFloatToInt>;
7400b57cec5SDimitry Andricdef X86mcvtp2UInt    : SDNode<"X86ISD::MCVTP2UI",  SDTMFloatToInt>;
7410b57cec5SDimitry Andricdef X86mcvttp2si     : SDNode<"X86ISD::MCVTTP2SI", SDTMFloatToInt>;
7420b57cec5SDimitry Andricdef X86mcvttp2ui     : SDNode<"X86ISD::MCVTTP2UI", SDTMFloatToInt>;
7430b57cec5SDimitry Andric
7445ffd83dbSDimitry Andricdef SDTcvtph2ps : SDTypeProfile<1, 1, [SDTCVecEltisVT<0, f32>,
7455ffd83dbSDimitry Andric                                       SDTCVecEltisVT<1, i16>]>;
7465ffd83dbSDimitry Andricdef X86cvtph2ps        : SDNode<"X86ISD::CVTPH2PS", SDTcvtph2ps>;
7475ffd83dbSDimitry Andricdef X86strict_cvtph2ps : SDNode<"X86ISD::STRICT_CVTPH2PS", SDTcvtph2ps,
7485ffd83dbSDimitry Andric                                [SDNPHasChain]>;
7495ffd83dbSDimitry Andricdef X86any_cvtph2ps : PatFrags<(ops node:$src),
7505ffd83dbSDimitry Andric                               [(X86strict_cvtph2ps node:$src),
7515ffd83dbSDimitry Andric                                (X86cvtph2ps node:$src)]>;
7520b57cec5SDimitry Andric
7535ffd83dbSDimitry Andricdef X86cvtph2psSAE     : SDNode<"X86ISD::CVTPH2PS_SAE", SDTcvtph2ps>;
7540b57cec5SDimitry Andric
7555ffd83dbSDimitry Andricdef SDTcvtps2ph : SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i16>,
7560b57cec5SDimitry Andric                                       SDTCVecEltisVT<1, f32>,
7575ffd83dbSDimitry Andric                                       SDTCisVT<2, i32>]>;
7585ffd83dbSDimitry Andricdef X86cvtps2ph        : SDNode<"X86ISD::CVTPS2PH", SDTcvtps2ph>;
7595ffd83dbSDimitry Andricdef X86strict_cvtps2ph : SDNode<"X86ISD::STRICT_CVTPS2PH", SDTcvtps2ph,
7605ffd83dbSDimitry Andric                                [SDNPHasChain]>;
7615ffd83dbSDimitry Andricdef X86any_cvtps2ph : PatFrags<(ops node:$src1, node:$src2),
7625ffd83dbSDimitry Andric                               [(X86strict_cvtps2ph node:$src1, node:$src2),
7635ffd83dbSDimitry Andric                                (X86cvtps2ph node:$src1, node:$src2)]>;
7645ffd83dbSDimitry Andric
765bdd1243dSDimitry Andricdef X86cvtps2phSAE : SDNode<"X86ISD::CVTPS2PH_SAE", SDTcvtps2ph>;
766bdd1243dSDimitry Andric
767bdd1243dSDimitry Andricdef SDTmcvtps2ph : SDTypeProfile<1, 4, [SDTCVecEltisVT<0, i16>,
7680b57cec5SDimitry Andric                                        SDTCVecEltisVT<1, f32>,
7690b57cec5SDimitry Andric                                        SDTCisVT<2, i32>,
7700b57cec5SDimitry Andric                                        SDTCisSameAs<0, 3>,
7710b57cec5SDimitry Andric                                        SDTCVecEltisVT<4, i1>,
772bdd1243dSDimitry Andric                                        SDTCisSameNumEltsAs<1, 4>]>;
773bdd1243dSDimitry Andricdef X86mcvtps2ph : SDNode<"X86ISD::MCVTPS2PH", SDTmcvtps2ph>;
774bdd1243dSDimitry Andricdef X86mcvtps2phSAE : SDNode<"X86ISD::MCVTPS2PH_SAE", SDTmcvtps2ph>;
775bdd1243dSDimitry Andric
7760b57cec5SDimitry Andricdef X86vfpextSAE  : SDNode<"X86ISD::VFPEXT_SAE",
777349cc55cSDimitry Andric                        SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVec<0>,
778349cc55cSDimitry Andric                                             SDTCisFP<1>, SDTCisVec<1>,
7790b57cec5SDimitry Andric                                             SDTCisOpSmallerThanOp<1, 0>]>>;
7800b57cec5SDimitry Andricdef X86vfproundRnd: SDNode<"X86ISD::VFPROUND_RND",
781349cc55cSDimitry Andric                        SDTypeProfile<1, 2, [SDTCisFP<0>, SDTCisVec<0>,
782349cc55cSDimitry Andric                                             SDTCisFP<1>, SDTCisVec<1>,
7830b57cec5SDimitry Andric                                             SDTCisOpSmallerThanOp<0, 1>,
7840b57cec5SDimitry Andric                                             SDTCisVT<2, i32>]>>;
7850b57cec5SDimitry Andric
7860b57cec5SDimitry Andric// cvt fp to bfloat16
7870b57cec5SDimitry Andricdef X86cvtne2ps2bf16 : SDNode<"X86ISD::CVTNE2PS2BF16",
788bdd1243dSDimitry Andric                       SDTypeProfile<1, 2, [SDTCVecEltisVT<0, bf16>,
7895ffd83dbSDimitry Andric                                            SDTCVecEltisVT<1, f32>,
7905ffd83dbSDimitry Andric                                            SDTCisSameSizeAs<0,1>,
7910b57cec5SDimitry Andric                                            SDTCisSameAs<1,2>]>>;
7920b57cec5SDimitry Andricdef X86mcvtneps2bf16 : SDNode<"X86ISD::MCVTNEPS2BF16",
793bdd1243dSDimitry Andric                       SDTypeProfile<1, 3, [SDTCVecEltisVT<0, bf16>,
7940b57cec5SDimitry Andric                                            SDTCVecEltisVT<1, f32>,
7950b57cec5SDimitry Andric                                            SDTCisSameAs<0, 2>,
7960b57cec5SDimitry Andric                                            SDTCVecEltisVT<3, i1>,
7970b57cec5SDimitry Andric                                            SDTCisSameNumEltsAs<1, 3>]>>;
7980b57cec5SDimitry Andricdef X86cvtneps2bf16 :  SDNode<"X86ISD::CVTNEPS2BF16",
799bdd1243dSDimitry Andric                       SDTypeProfile<1, 1, [SDTCVecEltisVT<0, bf16>,
8000b57cec5SDimitry Andric                                            SDTCVecEltisVT<1, f32>]>>;
8010b57cec5SDimitry Andricdef X86dpbf16ps :      SDNode<"X86ISD::DPBF16PS",
8020b57cec5SDimitry Andric                       SDTypeProfile<1, 3, [SDTCVecEltisVT<0, f32>,
8030b57cec5SDimitry Andric                                            SDTCisSameAs<0,1>,
804bdd1243dSDimitry Andric                                            SDTCVecEltisVT<2, bf16>,
8050b57cec5SDimitry Andric                                            SDTCisSameAs<2,3>]>>;
8060b57cec5SDimitry Andric
8070b57cec5SDimitry Andric// galois field arithmetic
8080b57cec5SDimitry Andricdef X86GF2P8affineinvqb : SDNode<"X86ISD::GF2P8AFFINEINVQB", SDTBlend>;
8090b57cec5SDimitry Andricdef X86GF2P8affineqb    : SDNode<"X86ISD::GF2P8AFFINEQB", SDTBlend>;
8100b57cec5SDimitry Andricdef X86GF2P8mulb        : SDNode<"X86ISD::GF2P8MULB", SDTIntBinOp>;
8110b57cec5SDimitry Andric
812480093f4SDimitry Andricdef SDTX86MaskedStore: SDTypeProfile<0, 3, [       // masked store
813480093f4SDimitry Andric  SDTCisVec<0>, SDTCisPtrTy<1>, SDTCisVec<2>, SDTCisSameNumEltsAs<0, 2>
814480093f4SDimitry Andric]>;
815480093f4SDimitry Andric
816bdd1243dSDimitry Andricdef X86vpdpbssd  : SDNode<"X86ISD::VPDPBSSD",  SDTVnni>;
817bdd1243dSDimitry Andricdef X86vpdpbssds : SDNode<"X86ISD::VPDPBSSDS", SDTVnni>;
818bdd1243dSDimitry Andricdef X86vpdpbsud  : SDNode<"X86ISD::VPDPBSUD",  SDTVnni>;
819bdd1243dSDimitry Andricdef X86vpdpbsuds : SDNode<"X86ISD::VPDPBSUDS", SDTVnni>;
820bdd1243dSDimitry Andricdef X86vpdpbuud  : SDNode<"X86ISD::VPDPBUUD",  SDTVnni>;
821bdd1243dSDimitry Andricdef X86vpdpbuuds : SDNode<"X86ISD::VPDPBUUDS", SDTVnni>;
822bdd1243dSDimitry Andric
8230b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
8240b57cec5SDimitry Andric// SSE pattern fragments
8250b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
8260b57cec5SDimitry Andric
8270b57cec5SDimitry Andric// 128-bit load pattern fragments
828349cc55cSDimitry Andricdef loadv8f16    : PatFrag<(ops node:$ptr), (v8f16 (load node:$ptr))>;
829bdd1243dSDimitry Andricdef loadv8bf16   : PatFrag<(ops node:$ptr), (v8bf16 (load node:$ptr))>;
8300b57cec5SDimitry Andricdef loadv4f32    : PatFrag<(ops node:$ptr), (v4f32 (load node:$ptr))>;
8310b57cec5SDimitry Andricdef loadv2f64    : PatFrag<(ops node:$ptr), (v2f64 (load node:$ptr))>;
8320b57cec5SDimitry Andricdef loadv2i64    : PatFrag<(ops node:$ptr), (v2i64 (load node:$ptr))>;
8330b57cec5SDimitry Andricdef loadv4i32    : PatFrag<(ops node:$ptr), (v4i32 (load node:$ptr))>;
8340b57cec5SDimitry Andricdef loadv8i16    : PatFrag<(ops node:$ptr), (v8i16 (load node:$ptr))>;
8350b57cec5SDimitry Andricdef loadv16i8    : PatFrag<(ops node:$ptr), (v16i8 (load node:$ptr))>;
8360b57cec5SDimitry Andric
8370b57cec5SDimitry Andric// 256-bit load pattern fragments
838349cc55cSDimitry Andricdef loadv16f16   : PatFrag<(ops node:$ptr), (v16f16 (load node:$ptr))>;
839bdd1243dSDimitry Andricdef loadv16bf16  : PatFrag<(ops node:$ptr), (v16bf16 (load node:$ptr))>;
8400b57cec5SDimitry Andricdef loadv8f32    : PatFrag<(ops node:$ptr), (v8f32  (load node:$ptr))>;
8410b57cec5SDimitry Andricdef loadv4f64    : PatFrag<(ops node:$ptr), (v4f64  (load node:$ptr))>;
8420b57cec5SDimitry Andricdef loadv4i64    : PatFrag<(ops node:$ptr), (v4i64  (load node:$ptr))>;
8430b57cec5SDimitry Andricdef loadv8i32    : PatFrag<(ops node:$ptr), (v8i32  (load node:$ptr))>;
8440b57cec5SDimitry Andricdef loadv16i16   : PatFrag<(ops node:$ptr), (v16i16 (load node:$ptr))>;
8450b57cec5SDimitry Andricdef loadv32i8    : PatFrag<(ops node:$ptr), (v32i8  (load node:$ptr))>;
8460b57cec5SDimitry Andric
8470b57cec5SDimitry Andric// 512-bit load pattern fragments
848349cc55cSDimitry Andricdef loadv32f16   : PatFrag<(ops node:$ptr), (v32f16 (load node:$ptr))>;
849bdd1243dSDimitry Andricdef loadv32bf16  : PatFrag<(ops node:$ptr), (v32bf16 (load node:$ptr))>;
8500b57cec5SDimitry Andricdef loadv16f32   : PatFrag<(ops node:$ptr), (v16f32 (load node:$ptr))>;
8510b57cec5SDimitry Andricdef loadv8f64    : PatFrag<(ops node:$ptr), (v8f64  (load node:$ptr))>;
8520b57cec5SDimitry Andricdef loadv8i64    : PatFrag<(ops node:$ptr), (v8i64  (load node:$ptr))>;
8530b57cec5SDimitry Andricdef loadv16i32   : PatFrag<(ops node:$ptr), (v16i32 (load node:$ptr))>;
8540b57cec5SDimitry Andricdef loadv32i16   : PatFrag<(ops node:$ptr), (v32i16 (load node:$ptr))>;
8550b57cec5SDimitry Andricdef loadv64i8    : PatFrag<(ops node:$ptr), (v64i8  (load node:$ptr))>;
8560b57cec5SDimitry Andric
8570b57cec5SDimitry Andric// 128-/256-/512-bit extload pattern fragments
8580b57cec5SDimitry Andricdef extloadv2f32 : PatFrag<(ops node:$ptr), (extloadvf32 node:$ptr)>;
8590b57cec5SDimitry Andricdef extloadv4f32 : PatFrag<(ops node:$ptr), (extloadvf32 node:$ptr)>;
8600b57cec5SDimitry Andricdef extloadv8f32 : PatFrag<(ops node:$ptr), (extloadvf32 node:$ptr)>;
861349cc55cSDimitry Andricdef extloadv2f16 : PatFrag<(ops node:$ptr), (extloadvf16 node:$ptr)>;
862349cc55cSDimitry Andricdef extloadv4f16 : PatFrag<(ops node:$ptr), (extloadvf16 node:$ptr)>;
863349cc55cSDimitry Andricdef extloadv8f16 : PatFrag<(ops node:$ptr), (extloadvf16 node:$ptr)>;
864349cc55cSDimitry Andricdef extloadv16f16 : PatFrag<(ops node:$ptr), (extloadvf16 node:$ptr)>;
8650b57cec5SDimitry Andric
8660b57cec5SDimitry Andric// Like 'store', but always requires vector size alignment.
8670b57cec5SDimitry Andricdef alignedstore : PatFrag<(ops node:$val, node:$ptr),
8680b57cec5SDimitry Andric                           (store node:$val, node:$ptr), [{
8690b57cec5SDimitry Andric  auto *St = cast<StoreSDNode>(N);
870bdd1243dSDimitry Andric  return St->getAlign() >= St->getMemoryVT().getStoreSize();
8710b57cec5SDimitry Andric}]>;
8720b57cec5SDimitry Andric
8730b57cec5SDimitry Andric// Like 'load', but always requires vector size alignment.
8740b57cec5SDimitry Andricdef alignedload : PatFrag<(ops node:$ptr), (load node:$ptr), [{
8750b57cec5SDimitry Andric  auto *Ld = cast<LoadSDNode>(N);
876bdd1243dSDimitry Andric  return Ld->getAlign() >= Ld->getMemoryVT().getStoreSize();
8770b57cec5SDimitry Andric}]>;
8780b57cec5SDimitry Andric
8790b57cec5SDimitry Andric// 128-bit aligned load pattern fragments
8800b57cec5SDimitry Andric// NOTE: all 128-bit integer vector loads are promoted to v2i64
881349cc55cSDimitry Andricdef alignedloadv8f16 : PatFrag<(ops node:$ptr),
882349cc55cSDimitry Andric                               (v8f16 (alignedload node:$ptr))>;
883bdd1243dSDimitry Andricdef alignedloadv8bf16 : PatFrag<(ops node:$ptr),
884bdd1243dSDimitry Andric                                (v8bf16 (alignedload node:$ptr))>;
8850b57cec5SDimitry Andricdef alignedloadv4f32 : PatFrag<(ops node:$ptr),
8860b57cec5SDimitry Andric                               (v4f32 (alignedload node:$ptr))>;
8870b57cec5SDimitry Andricdef alignedloadv2f64 : PatFrag<(ops node:$ptr),
8880b57cec5SDimitry Andric                               (v2f64 (alignedload node:$ptr))>;
8890b57cec5SDimitry Andricdef alignedloadv2i64 : PatFrag<(ops node:$ptr),
8900b57cec5SDimitry Andric                               (v2i64 (alignedload node:$ptr))>;
8910b57cec5SDimitry Andricdef alignedloadv4i32 : PatFrag<(ops node:$ptr),
8920b57cec5SDimitry Andric                               (v4i32 (alignedload node:$ptr))>;
8930b57cec5SDimitry Andricdef alignedloadv8i16 : PatFrag<(ops node:$ptr),
8940b57cec5SDimitry Andric                               (v8i16 (alignedload node:$ptr))>;
8950b57cec5SDimitry Andricdef alignedloadv16i8 : PatFrag<(ops node:$ptr),
8960b57cec5SDimitry Andric                               (v16i8 (alignedload node:$ptr))>;
8970b57cec5SDimitry Andric
8980b57cec5SDimitry Andric// 256-bit aligned load pattern fragments
8990b57cec5SDimitry Andric// NOTE: all 256-bit integer vector loads are promoted to v4i64
900349cc55cSDimitry Andricdef alignedloadv16f16 : PatFrag<(ops node:$ptr),
901349cc55cSDimitry Andric                                (v16f16 (alignedload node:$ptr))>;
902bdd1243dSDimitry Andricdef alignedloadv16bf16 : PatFrag<(ops node:$ptr),
903bdd1243dSDimitry Andric                                 (v16bf16 (alignedload node:$ptr))>;
9040b57cec5SDimitry Andricdef alignedloadv8f32  : PatFrag<(ops node:$ptr),
9050b57cec5SDimitry Andric                                (v8f32  (alignedload node:$ptr))>;
9060b57cec5SDimitry Andricdef alignedloadv4f64  : PatFrag<(ops node:$ptr),
9070b57cec5SDimitry Andric                                (v4f64  (alignedload node:$ptr))>;
9080b57cec5SDimitry Andricdef alignedloadv4i64  : PatFrag<(ops node:$ptr),
9090b57cec5SDimitry Andric                                (v4i64  (alignedload node:$ptr))>;
9100b57cec5SDimitry Andricdef alignedloadv8i32  : PatFrag<(ops node:$ptr),
9110b57cec5SDimitry Andric                                (v8i32  (alignedload node:$ptr))>;
9120b57cec5SDimitry Andricdef alignedloadv16i16 : PatFrag<(ops node:$ptr),
9130b57cec5SDimitry Andric                                (v16i16 (alignedload node:$ptr))>;
9140b57cec5SDimitry Andricdef alignedloadv32i8  : PatFrag<(ops node:$ptr),
9150b57cec5SDimitry Andric                                (v32i8  (alignedload node:$ptr))>;
9160b57cec5SDimitry Andric
9170b57cec5SDimitry Andric// 512-bit aligned load pattern fragments
918349cc55cSDimitry Andricdef alignedloadv32f16 : PatFrag<(ops node:$ptr),
919349cc55cSDimitry Andric                                (v32f16 (alignedload node:$ptr))>;
920bdd1243dSDimitry Andricdef alignedloadv32bf16 : PatFrag<(ops node:$ptr),
921bdd1243dSDimitry Andric                                 (v32bf16 (alignedload node:$ptr))>;
9220b57cec5SDimitry Andricdef alignedloadv16f32 : PatFrag<(ops node:$ptr),
9230b57cec5SDimitry Andric                                (v16f32 (alignedload node:$ptr))>;
9240b57cec5SDimitry Andricdef alignedloadv8f64  : PatFrag<(ops node:$ptr),
9250b57cec5SDimitry Andric                                (v8f64  (alignedload node:$ptr))>;
9260b57cec5SDimitry Andricdef alignedloadv8i64  : PatFrag<(ops node:$ptr),
9270b57cec5SDimitry Andric                                (v8i64  (alignedload node:$ptr))>;
9280b57cec5SDimitry Andricdef alignedloadv16i32 : PatFrag<(ops node:$ptr),
9290b57cec5SDimitry Andric                                (v16i32 (alignedload node:$ptr))>;
9300b57cec5SDimitry Andricdef alignedloadv32i16 : PatFrag<(ops node:$ptr),
9310b57cec5SDimitry Andric                                (v32i16 (alignedload node:$ptr))>;
9320b57cec5SDimitry Andricdef alignedloadv64i8  : PatFrag<(ops node:$ptr),
9330b57cec5SDimitry Andric                                (v64i8  (alignedload node:$ptr))>;
9340b57cec5SDimitry Andric
9350b57cec5SDimitry Andric// Like 'load', but uses special alignment checks suitable for use in
9360b57cec5SDimitry Andric// memory operands in most SSE instructions, which are required to
9370b57cec5SDimitry Andric// be naturally aligned on some targets but not on others.  If the subtarget
9380b57cec5SDimitry Andric// allows unaligned accesses, match any load, though this may require
9390b57cec5SDimitry Andric// setting a feature bit in the processor (on startup, for example).
9400b57cec5SDimitry Andric// Opteron 10h and later implement such a feature.
9410b57cec5SDimitry Andricdef memop : PatFrag<(ops node:$ptr), (load node:$ptr), [{
9420b57cec5SDimitry Andric  auto *Ld = cast<LoadSDNode>(N);
9430b57cec5SDimitry Andric  return Subtarget->hasSSEUnalignedMem() ||
944bdd1243dSDimitry Andric         Ld->getAlign() >= Ld->getMemoryVT().getStoreSize();
9450b57cec5SDimitry Andric}]>;
9460b57cec5SDimitry Andric
9470b57cec5SDimitry Andric// 128-bit memop pattern fragments
9480b57cec5SDimitry Andric// NOTE: all 128-bit integer vector loads are promoted to v2i64
9490b57cec5SDimitry Andricdef memopv4f32 : PatFrag<(ops node:$ptr), (v4f32 (memop node:$ptr))>;
9500b57cec5SDimitry Andricdef memopv2f64 : PatFrag<(ops node:$ptr), (v2f64 (memop node:$ptr))>;
9510b57cec5SDimitry Andricdef memopv2i64 : PatFrag<(ops node:$ptr), (v2i64 (memop node:$ptr))>;
9520b57cec5SDimitry Andricdef memopv4i32 : PatFrag<(ops node:$ptr), (v4i32 (memop node:$ptr))>;
9530b57cec5SDimitry Andricdef memopv8i16 : PatFrag<(ops node:$ptr), (v8i16 (memop node:$ptr))>;
9540b57cec5SDimitry Andricdef memopv16i8 : PatFrag<(ops node:$ptr), (v16i8 (memop node:$ptr))>;
9550b57cec5SDimitry Andric
9560b57cec5SDimitry Andric// 128-bit bitconvert pattern fragments
9570b57cec5SDimitry Andricdef bc_v4f32 : PatFrag<(ops node:$in), (v4f32 (bitconvert node:$in))>;
9580b57cec5SDimitry Andricdef bc_v2f64 : PatFrag<(ops node:$in), (v2f64 (bitconvert node:$in))>;
9590b57cec5SDimitry Andricdef bc_v16i8 : PatFrag<(ops node:$in), (v16i8 (bitconvert node:$in))>;
9600b57cec5SDimitry Andricdef bc_v8i16 : PatFrag<(ops node:$in), (v8i16 (bitconvert node:$in))>;
9610b57cec5SDimitry Andricdef bc_v4i32 : PatFrag<(ops node:$in), (v4i32 (bitconvert node:$in))>;
9620b57cec5SDimitry Andricdef bc_v2i64 : PatFrag<(ops node:$in), (v2i64 (bitconvert node:$in))>;
9630b57cec5SDimitry Andric
9640b57cec5SDimitry Andric// 256-bit bitconvert pattern fragments
9650b57cec5SDimitry Andricdef bc_v32i8 : PatFrag<(ops node:$in), (v32i8 (bitconvert node:$in))>;
9660b57cec5SDimitry Andricdef bc_v16i16 : PatFrag<(ops node:$in), (v16i16 (bitconvert node:$in))>;
9670b57cec5SDimitry Andricdef bc_v8i32 : PatFrag<(ops node:$in), (v8i32 (bitconvert node:$in))>;
9680b57cec5SDimitry Andricdef bc_v4i64 : PatFrag<(ops node:$in), (v4i64 (bitconvert node:$in))>;
9690b57cec5SDimitry Andricdef bc_v8f32 : PatFrag<(ops node:$in), (v8f32 (bitconvert node:$in))>;
9700b57cec5SDimitry Andricdef bc_v4f64 : PatFrag<(ops node:$in), (v4f64 (bitconvert node:$in))>;
9710b57cec5SDimitry Andric
9720b57cec5SDimitry Andric// 512-bit bitconvert pattern fragments
9730b57cec5SDimitry Andricdef bc_v64i8 : PatFrag<(ops node:$in), (v64i8 (bitconvert node:$in))>;
9740b57cec5SDimitry Andricdef bc_v32i16 : PatFrag<(ops node:$in), (v32i16 (bitconvert node:$in))>;
9750b57cec5SDimitry Andricdef bc_v16i32 : PatFrag<(ops node:$in), (v16i32 (bitconvert node:$in))>;
9760b57cec5SDimitry Andricdef bc_v8i64 : PatFrag<(ops node:$in), (v8i64 (bitconvert node:$in))>;
9770b57cec5SDimitry Andricdef bc_v8f64 : PatFrag<(ops node:$in), (v8f64 (bitconvert node:$in))>;
9780b57cec5SDimitry Andricdef bc_v16f32 : PatFrag<(ops node:$in), (v16f32 (bitconvert node:$in))>;
9790b57cec5SDimitry Andric
980349cc55cSDimitry Andricdef X86vzload16 : PatFrag<(ops node:$src),
981349cc55cSDimitry Andric                          (X86vzld node:$src), [{
982349cc55cSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 2;
983349cc55cSDimitry Andric}]>;
984349cc55cSDimitry Andric
9850b57cec5SDimitry Andricdef X86vzload32 : PatFrag<(ops node:$src),
9860b57cec5SDimitry Andric                          (X86vzld node:$src), [{
9870b57cec5SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 4;
9880b57cec5SDimitry Andric}]>;
9890b57cec5SDimitry Andric
9900b57cec5SDimitry Andricdef X86vzload64 : PatFrag<(ops node:$src),
9910b57cec5SDimitry Andric                          (X86vzld node:$src), [{
9920b57cec5SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 8;
9930b57cec5SDimitry Andric}]>;
9940b57cec5SDimitry Andric
9950b57cec5SDimitry Andricdef X86vextractstore64 : PatFrag<(ops node:$val, node:$ptr),
9960b57cec5SDimitry Andric                                 (X86vextractst node:$val, node:$ptr), [{
9970b57cec5SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 8;
9980b57cec5SDimitry Andric}]>;
9990b57cec5SDimitry Andric
10008bcb0991SDimitry Andricdef X86VBroadcastld8 : PatFrag<(ops node:$src),
10018bcb0991SDimitry Andric                               (X86VBroadcastld node:$src), [{
10028bcb0991SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 1;
10038bcb0991SDimitry Andric}]>;
10048bcb0991SDimitry Andric
10058bcb0991SDimitry Andricdef X86VBroadcastld16 : PatFrag<(ops node:$src),
10068bcb0991SDimitry Andric                                (X86VBroadcastld node:$src), [{
10078bcb0991SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 2;
10088bcb0991SDimitry Andric}]>;
10098bcb0991SDimitry Andric
10108bcb0991SDimitry Andricdef X86VBroadcastld32 : PatFrag<(ops node:$src),
10118bcb0991SDimitry Andric                                (X86VBroadcastld node:$src), [{
10128bcb0991SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 4;
10138bcb0991SDimitry Andric}]>;
10148bcb0991SDimitry Andric
10158bcb0991SDimitry Andricdef X86VBroadcastld64 : PatFrag<(ops node:$src),
10168bcb0991SDimitry Andric                                (X86VBroadcastld node:$src), [{
10178bcb0991SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 8;
10188bcb0991SDimitry Andric}]>;
10198bcb0991SDimitry Andric
1020e8d8bef9SDimitry Andricdef X86SubVBroadcastld128 : PatFrag<(ops node:$src),
1021e8d8bef9SDimitry Andric                                    (X86SubVBroadcastld node:$src), [{
1022e8d8bef9SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 16;
1023e8d8bef9SDimitry Andric}]>;
1024e8d8bef9SDimitry Andric
1025e8d8bef9SDimitry Andricdef X86SubVBroadcastld256 : PatFrag<(ops node:$src),
1026e8d8bef9SDimitry Andric                                    (X86SubVBroadcastld node:$src), [{
1027e8d8bef9SDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getStoreSize() == 32;
1028e8d8bef9SDimitry Andric}]>;
1029e8d8bef9SDimitry Andric
10305ffd83dbSDimitry Andric// Scalar SSE intrinsic fragments to match several different types of loads.
10315ffd83dbSDimitry Andric// Used by scalar SSE intrinsic instructions which have 128 bit types, but
10325ffd83dbSDimitry Andric// only load a single element.
10335ffd83dbSDimitry Andric// FIXME: We should add more canolicalizing in DAGCombine. Particulary removing
10345ffd83dbSDimitry Andric// the simple_load case.
1035349cc55cSDimitry Andricdef sse_load_f16 : PatFrags<(ops node:$ptr),
1036349cc55cSDimitry Andric                            [(v8f16 (simple_load node:$ptr)),
1037349cc55cSDimitry Andric                             (v8f16 (X86vzload16 node:$ptr)),
1038349cc55cSDimitry Andric                             (v8f16 (scalar_to_vector (loadf16 node:$ptr)))]>;
10395ffd83dbSDimitry Andricdef sse_load_f32 : PatFrags<(ops node:$ptr),
10405ffd83dbSDimitry Andric                            [(v4f32 (simple_load node:$ptr)),
10415ffd83dbSDimitry Andric                             (v4f32 (X86vzload32 node:$ptr)),
10425ffd83dbSDimitry Andric                             (v4f32 (scalar_to_vector (loadf32 node:$ptr)))]>;
10435ffd83dbSDimitry Andricdef sse_load_f64 : PatFrags<(ops node:$ptr),
10445ffd83dbSDimitry Andric                            [(v2f64 (simple_load node:$ptr)),
10455ffd83dbSDimitry Andric                             (v2f64 (X86vzload64 node:$ptr)),
10465ffd83dbSDimitry Andric                             (v2f64 (scalar_to_vector (loadf64 node:$ptr)))]>;
10475ffd83dbSDimitry Andric
1048349cc55cSDimitry Andricdef fp16imm0 : PatLeaf<(f16 fpimm), [{
1049349cc55cSDimitry Andric  return N->isExactlyValue(+0.0);
1050349cc55cSDimitry Andric}]>;
10510b57cec5SDimitry Andric
10520b57cec5SDimitry Andricdef fp32imm0 : PatLeaf<(f32 fpimm), [{
10530b57cec5SDimitry Andric  return N->isExactlyValue(+0.0);
10540b57cec5SDimitry Andric}]>;
10550b57cec5SDimitry Andric
10560b57cec5SDimitry Andricdef fp64imm0 : PatLeaf<(f64 fpimm), [{
10570b57cec5SDimitry Andric  return N->isExactlyValue(+0.0);
10580b57cec5SDimitry Andric}]>;
10590b57cec5SDimitry Andric
10608bcb0991SDimitry Andricdef fp128imm0 : PatLeaf<(f128 fpimm), [{
10618bcb0991SDimitry Andric  return N->isExactlyValue(+0.0);
10628bcb0991SDimitry Andric}]>;
10638bcb0991SDimitry Andric
10640b57cec5SDimitry Andric// EXTRACT_get_vextract128_imm xform function: convert extract_subvector index
10650b57cec5SDimitry Andric// to VEXTRACTF128/VEXTRACTI128 imm.
10660b57cec5SDimitry Andricdef EXTRACT_get_vextract128_imm : SDNodeXForm<extract_subvector, [{
10670b57cec5SDimitry Andric  return getExtractVEXTRACTImmediate(N, 128, SDLoc(N));
10680b57cec5SDimitry Andric}]>;
10690b57cec5SDimitry Andric
10700b57cec5SDimitry Andric// INSERT_get_vinsert128_imm xform function: convert insert_subvector index to
10710b57cec5SDimitry Andric// VINSERTF128/VINSERTI128 imm.
10720b57cec5SDimitry Andricdef INSERT_get_vinsert128_imm : SDNodeXForm<insert_subvector, [{
10730b57cec5SDimitry Andric  return getInsertVINSERTImmediate(N, 128, SDLoc(N));
10740b57cec5SDimitry Andric}]>;
10750b57cec5SDimitry Andric
1076349cc55cSDimitry Andric// INSERT_get_vperm2x128_imm xform function: convert insert_subvector index to
1077349cc55cSDimitry Andric// commuted VPERM2F128/VPERM2I128 imm.
1078349cc55cSDimitry Andricdef INSERT_get_vperm2x128_commutedimm : SDNodeXForm<insert_subvector, [{
1079349cc55cSDimitry Andric  return getPermuteVINSERTCommutedImmediate(N, 128, SDLoc(N));
1080349cc55cSDimitry Andric}]>;
1081349cc55cSDimitry Andric
10820b57cec5SDimitry Andric// EXTRACT_get_vextract256_imm xform function: convert extract_subvector index
10830b57cec5SDimitry Andric// to VEXTRACTF64x4 imm.
10840b57cec5SDimitry Andricdef EXTRACT_get_vextract256_imm : SDNodeXForm<extract_subvector, [{
10850b57cec5SDimitry Andric  return getExtractVEXTRACTImmediate(N, 256, SDLoc(N));
10860b57cec5SDimitry Andric}]>;
10870b57cec5SDimitry Andric
10880b57cec5SDimitry Andric// INSERT_get_vinsert256_imm xform function: convert insert_subvector index to
10890b57cec5SDimitry Andric// VINSERTF64x4 imm.
10900b57cec5SDimitry Andricdef INSERT_get_vinsert256_imm : SDNodeXForm<insert_subvector, [{
10910b57cec5SDimitry Andric  return getInsertVINSERTImmediate(N, 256, SDLoc(N));
10920b57cec5SDimitry Andric}]>;
10930b57cec5SDimitry Andric
10940b57cec5SDimitry Andricdef vextract128_extract : PatFrag<(ops node:$bigvec, node:$index),
10950b57cec5SDimitry Andric                                   (extract_subvector node:$bigvec,
10960b57cec5SDimitry Andric                                                      node:$index), [{
10970b57cec5SDimitry Andric  // Index 0 can be handled via extract_subreg.
10980b57cec5SDimitry Andric  return !isNullConstant(N->getOperand(1));
10990b57cec5SDimitry Andric}], EXTRACT_get_vextract128_imm>;
11000b57cec5SDimitry Andric
11010b57cec5SDimitry Andricdef vinsert128_insert : PatFrag<(ops node:$bigvec, node:$smallvec,
11020b57cec5SDimitry Andric                                      node:$index),
11030b57cec5SDimitry Andric                                 (insert_subvector node:$bigvec, node:$smallvec,
11040b57cec5SDimitry Andric                                                   node:$index), [{}],
11050b57cec5SDimitry Andric                                INSERT_get_vinsert128_imm>;
11060b57cec5SDimitry Andric
11070b57cec5SDimitry Andricdef vextract256_extract : PatFrag<(ops node:$bigvec, node:$index),
11080b57cec5SDimitry Andric                                   (extract_subvector node:$bigvec,
11090b57cec5SDimitry Andric                                                      node:$index), [{
11100b57cec5SDimitry Andric  // Index 0 can be handled via extract_subreg.
11110b57cec5SDimitry Andric  return !isNullConstant(N->getOperand(1));
11120b57cec5SDimitry Andric}], EXTRACT_get_vextract256_imm>;
11130b57cec5SDimitry Andric
11140b57cec5SDimitry Andricdef vinsert256_insert : PatFrag<(ops node:$bigvec, node:$smallvec,
11150b57cec5SDimitry Andric                                      node:$index),
11160b57cec5SDimitry Andric                                 (insert_subvector node:$bigvec, node:$smallvec,
11170b57cec5SDimitry Andric                                                   node:$index), [{}],
11180b57cec5SDimitry Andric                                INSERT_get_vinsert256_imm>;
11190b57cec5SDimitry Andric
11200b57cec5SDimitry Andricdef masked_load : PatFrag<(ops node:$src1, node:$src2, node:$src3),
1121480093f4SDimitry Andric                          (masked_ld node:$src1, undef, node:$src2, node:$src3), [{
11220b57cec5SDimitry Andric  return !cast<MaskedLoadSDNode>(N)->isExpandingLoad() &&
1123480093f4SDimitry Andric    cast<MaskedLoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD &&
1124480093f4SDimitry Andric    cast<MaskedLoadSDNode>(N)->isUnindexed();
11250b57cec5SDimitry Andric}]>;
11260b57cec5SDimitry Andric
11270b57cec5SDimitry Andricdef masked_load_aligned : PatFrag<(ops node:$src1, node:$src2, node:$src3),
11280b57cec5SDimitry Andric                         (masked_load node:$src1, node:$src2, node:$src3), [{
11290b57cec5SDimitry Andric  // Use the node type to determine the size the alignment needs to match.
11300b57cec5SDimitry Andric  // We can't use memory VT because type widening changes the node VT, but
11310b57cec5SDimitry Andric  // not the memory VT.
11320b57cec5SDimitry Andric  auto *Ld = cast<MaskedLoadSDNode>(N);
1133bdd1243dSDimitry Andric  return Ld->getAlign() >= Ld->getValueType(0).getStoreSize();
11340b57cec5SDimitry Andric}]>;
11350b57cec5SDimitry Andric
11360b57cec5SDimitry Andricdef X86mExpandingLoad : PatFrag<(ops node:$src1, node:$src2, node:$src3),
1137480093f4SDimitry Andric                         (masked_ld node:$src1, undef, node:$src2, node:$src3), [{
1138480093f4SDimitry Andric  return cast<MaskedLoadSDNode>(N)->isExpandingLoad() &&
1139480093f4SDimitry Andric         cast<MaskedLoadSDNode>(N)->isUnindexed();
11400b57cec5SDimitry Andric}]>;
11410b57cec5SDimitry Andric
11420b57cec5SDimitry Andric// Masked store fragments.
11430b57cec5SDimitry Andric// X86mstore can't be implemented in core DAG files because some targets
11440b57cec5SDimitry Andric// do not support vector types (llvm-tblgen will fail).
11450b57cec5SDimitry Andricdef masked_store : PatFrag<(ops node:$src1, node:$src2, node:$src3),
1146480093f4SDimitry Andric                        (masked_st node:$src1, node:$src2, undef, node:$src3), [{
1147480093f4SDimitry Andric  return !cast<MaskedStoreSDNode>(N)->isTruncatingStore() &&
1148480093f4SDimitry Andric         !cast<MaskedStoreSDNode>(N)->isCompressingStore() &&
1149480093f4SDimitry Andric         cast<MaskedStoreSDNode>(N)->isUnindexed();
11500b57cec5SDimitry Andric}]>;
11510b57cec5SDimitry Andric
11520b57cec5SDimitry Andricdef masked_store_aligned : PatFrag<(ops node:$src1, node:$src2, node:$src3),
11530b57cec5SDimitry Andric                         (masked_store node:$src1, node:$src2, node:$src3), [{
11540b57cec5SDimitry Andric  // Use the node type to determine the size the alignment needs to match.
11550b57cec5SDimitry Andric  // We can't use memory VT because type widening changes the node VT, but
11560b57cec5SDimitry Andric  // not the memory VT.
11570b57cec5SDimitry Andric  auto *St = cast<MaskedStoreSDNode>(N);
1158bdd1243dSDimitry Andric  return St->getAlign() >= St->getOperand(1).getValueType().getStoreSize();
11590b57cec5SDimitry Andric}]>;
11600b57cec5SDimitry Andric
11610b57cec5SDimitry Andricdef X86mCompressingStore : PatFrag<(ops node:$src1, node:$src2, node:$src3),
1162480093f4SDimitry Andric                             (masked_st node:$src1, node:$src2, undef, node:$src3), [{
1163480093f4SDimitry Andric    return cast<MaskedStoreSDNode>(N)->isCompressingStore() &&
1164480093f4SDimitry Andric           cast<MaskedStoreSDNode>(N)->isUnindexed();
11650b57cec5SDimitry Andric}]>;
11660b57cec5SDimitry Andric
11670b57cec5SDimitry Andric// masked truncstore fragments
11680b57cec5SDimitry Andric// X86mtruncstore can't be implemented in core DAG files because some targets
11690b57cec5SDimitry Andric// doesn't support vector type ( llvm-tblgen will fail)
11700b57cec5SDimitry Andricdef X86mtruncstore : PatFrag<(ops node:$src1, node:$src2, node:$src3),
1171480093f4SDimitry Andric                             (masked_st node:$src1, node:$src2, undef, node:$src3), [{
1172480093f4SDimitry Andric    return cast<MaskedStoreSDNode>(N)->isTruncatingStore() &&
1173480093f4SDimitry Andric           cast<MaskedStoreSDNode>(N)->isUnindexed();
11740b57cec5SDimitry Andric}]>;
11750b57cec5SDimitry Andricdef masked_truncstorevi8 :
11760b57cec5SDimitry Andric  PatFrag<(ops node:$src1, node:$src2, node:$src3),
11770b57cec5SDimitry Andric          (X86mtruncstore node:$src1, node:$src2, node:$src3), [{
11780b57cec5SDimitry Andric  return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8;
11790b57cec5SDimitry Andric}]>;
11800b57cec5SDimitry Andricdef masked_truncstorevi16 :
11810b57cec5SDimitry Andric  PatFrag<(ops node:$src1, node:$src2, node:$src3),
11820b57cec5SDimitry Andric          (X86mtruncstore node:$src1, node:$src2, node:$src3), [{
11830b57cec5SDimitry Andric  return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16;
11840b57cec5SDimitry Andric}]>;
11850b57cec5SDimitry Andricdef masked_truncstorevi32 :
11860b57cec5SDimitry Andric  PatFrag<(ops node:$src1, node:$src2, node:$src3),
11870b57cec5SDimitry Andric          (X86mtruncstore node:$src1, node:$src2, node:$src3), [{
11880b57cec5SDimitry Andric  return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32;
11890b57cec5SDimitry Andric}]>;
11900b57cec5SDimitry Andric
11910b57cec5SDimitry Andricdef X86TruncSStore : SDNode<"X86ISD::VTRUNCSTORES",  SDTStore,
11920b57cec5SDimitry Andric                       [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
11930b57cec5SDimitry Andric
11940b57cec5SDimitry Andricdef X86TruncUSStore : SDNode<"X86ISD::VTRUNCSTOREUS",  SDTStore,
11950b57cec5SDimitry Andric                       [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
11960b57cec5SDimitry Andric
1197480093f4SDimitry Andricdef X86MTruncSStore : SDNode<"X86ISD::VMTRUNCSTORES",  SDTX86MaskedStore,
11980b57cec5SDimitry Andric                       [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
11990b57cec5SDimitry Andric
1200480093f4SDimitry Andricdef X86MTruncUSStore : SDNode<"X86ISD::VMTRUNCSTOREUS",  SDTX86MaskedStore,
12010b57cec5SDimitry Andric                       [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
12020b57cec5SDimitry Andric
12030b57cec5SDimitry Andricdef truncstore_s_vi8 : PatFrag<(ops node:$val, node:$ptr),
12040b57cec5SDimitry Andric                               (X86TruncSStore node:$val, node:$ptr), [{
12055ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8;
12060b57cec5SDimitry Andric}]>;
12070b57cec5SDimitry Andric
12080b57cec5SDimitry Andricdef truncstore_us_vi8 : PatFrag<(ops node:$val, node:$ptr),
12090b57cec5SDimitry Andric                               (X86TruncUSStore node:$val, node:$ptr), [{
12105ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8;
12110b57cec5SDimitry Andric}]>;
12120b57cec5SDimitry Andric
12130b57cec5SDimitry Andricdef truncstore_s_vi16 : PatFrag<(ops node:$val, node:$ptr),
12140b57cec5SDimitry Andric                               (X86TruncSStore node:$val, node:$ptr), [{
12155ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16;
12160b57cec5SDimitry Andric}]>;
12170b57cec5SDimitry Andric
12180b57cec5SDimitry Andricdef truncstore_us_vi16 : PatFrag<(ops node:$val, node:$ptr),
12190b57cec5SDimitry Andric                               (X86TruncUSStore node:$val, node:$ptr), [{
12205ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16;
12210b57cec5SDimitry Andric}]>;
12220b57cec5SDimitry Andric
12230b57cec5SDimitry Andricdef truncstore_s_vi32 : PatFrag<(ops node:$val, node:$ptr),
12240b57cec5SDimitry Andric                               (X86TruncSStore node:$val, node:$ptr), [{
12255ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32;
12260b57cec5SDimitry Andric}]>;
12270b57cec5SDimitry Andric
12280b57cec5SDimitry Andricdef truncstore_us_vi32 : PatFrag<(ops node:$val, node:$ptr),
12290b57cec5SDimitry Andric                               (X86TruncUSStore node:$val, node:$ptr), [{
12305ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32;
12310b57cec5SDimitry Andric}]>;
12320b57cec5SDimitry Andric
12330b57cec5SDimitry Andricdef masked_truncstore_s_vi8 : PatFrag<(ops node:$src1, node:$src2, node:$src3),
12340b57cec5SDimitry Andric                     (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{
12355ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8;
12360b57cec5SDimitry Andric}]>;
12370b57cec5SDimitry Andric
12380b57cec5SDimitry Andricdef masked_truncstore_us_vi8 : PatFrag<(ops node:$src1, node:$src2, node:$src3),
12390b57cec5SDimitry Andric                               (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{
12405ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8;
12410b57cec5SDimitry Andric}]>;
12420b57cec5SDimitry Andric
12430b57cec5SDimitry Andricdef masked_truncstore_s_vi16 : PatFrag<(ops node:$src1, node:$src2, node:$src3),
12440b57cec5SDimitry Andric                               (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{
12455ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16;
12460b57cec5SDimitry Andric}]>;
12470b57cec5SDimitry Andric
12480b57cec5SDimitry Andricdef masked_truncstore_us_vi16 : PatFrag<(ops node:$src1, node:$src2, node:$src3),
12490b57cec5SDimitry Andric                               (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{
12505ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16;
12510b57cec5SDimitry Andric}]>;
12520b57cec5SDimitry Andric
12530b57cec5SDimitry Andricdef masked_truncstore_s_vi32 : PatFrag<(ops node:$src1, node:$src2, node:$src3),
12540b57cec5SDimitry Andric                               (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{
12555ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32;
12560b57cec5SDimitry Andric}]>;
12570b57cec5SDimitry Andric
12580b57cec5SDimitry Andricdef masked_truncstore_us_vi32 : PatFrag<(ops node:$src1, node:$src2, node:$src3),
12590b57cec5SDimitry Andric                               (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{
12605ffd83dbSDimitry Andric  return cast<MemIntrinsicSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32;
12610b57cec5SDimitry Andric}]>;
1262*5f757f3fSDimitry Andric
1263*5f757f3fSDimitry Andricdef X86Vfpclasss_su : PatFrag<(ops node:$src1, node:$src2),
1264*5f757f3fSDimitry Andric                              (X86Vfpclasss node:$src1, node:$src2), [{
1265*5f757f3fSDimitry Andric  return N->hasOneUse();
1266*5f757f3fSDimitry Andric}]>;
1267*5f757f3fSDimitry Andric
1268*5f757f3fSDimitry Andricdef X86Vfpclass_su : PatFrag<(ops node:$src1, node:$src2),
1269*5f757f3fSDimitry Andric                             (X86Vfpclass node:$src1, node:$src2), [{
1270*5f757f3fSDimitry Andric  return N->hasOneUse();
1271*5f757f3fSDimitry Andric}]>;
1272*5f757f3fSDimitry Andric
1273*5f757f3fSDimitry Andric// These nodes use 'vnot' instead of 'not' to support vectors.
1274*5f757f3fSDimitry Andricdef vandn : PatFrag<(ops node:$i0, node:$i1), (and (vnot node:$i0), node:$i1)>;
1275*5f757f3fSDimitry Andricdef vxnor : PatFrag<(ops node:$i0, node:$i1), (vnot (xor node:$i0, node:$i1))>;
1276*5f757f3fSDimitry Andric
1277*5f757f3fSDimitry Andric// Used for matching masked operations. Ensures the operation part only has a
1278*5f757f3fSDimitry Andric// single use.
1279*5f757f3fSDimitry Andricdef vselect_mask : PatFrag<(ops node:$mask, node:$src1, node:$src2),
1280*5f757f3fSDimitry Andric                           (vselect node:$mask, node:$src1, node:$src2), [{
1281*5f757f3fSDimitry Andric  return isProfitableToFormMaskedOp(N);
1282*5f757f3fSDimitry Andric}]>;
1283*5f757f3fSDimitry Andric
1284*5f757f3fSDimitry Andricdef X86selects_mask : PatFrag<(ops node:$mask, node:$src1, node:$src2),
1285*5f757f3fSDimitry Andric                              (X86selects node:$mask, node:$src1, node:$src2), [{
1286*5f757f3fSDimitry Andric  return isProfitableToFormMaskedOp(N);
1287*5f757f3fSDimitry Andric}]>;
1288*5f757f3fSDimitry Andric
1289*5f757f3fSDimitry Andricdef X86cmpms_su : PatFrag<(ops node:$src1, node:$src2, node:$cc),
1290*5f757f3fSDimitry Andric                          (X86cmpms node:$src1, node:$src2, node:$cc), [{
1291*5f757f3fSDimitry Andric  return N->hasOneUse();
1292*5f757f3fSDimitry Andric}]>;
1293*5f757f3fSDimitry Andricdef X86cmpmsSAE_su : PatFrag<(ops node:$src1, node:$src2, node:$cc),
1294*5f757f3fSDimitry Andric                          (X86cmpmsSAE node:$src1, node:$src2, node:$cc), [{
1295*5f757f3fSDimitry Andric  return N->hasOneUse();
1296*5f757f3fSDimitry Andric}]>;
1297*5f757f3fSDimitry Andric
1298*5f757f3fSDimitry Andric// PatFrags that contain a select and a truncate op. The take operands in the
1299*5f757f3fSDimitry Andric// same order as X86vmtrunc, X86vmtruncs, X86vmtruncus. This allows us to pass
1300*5f757f3fSDimitry Andric// either to the multiclasses.
1301*5f757f3fSDimitry Andricdef select_trunc : PatFrag<(ops node:$src, node:$src0, node:$mask),
1302*5f757f3fSDimitry Andric                           (vselect_mask node:$mask,
1303*5f757f3fSDimitry Andric                                         (trunc node:$src), node:$src0)>;
1304*5f757f3fSDimitry Andricdef select_truncs : PatFrag<(ops node:$src, node:$src0, node:$mask),
1305*5f757f3fSDimitry Andric                            (vselect_mask node:$mask,
1306*5f757f3fSDimitry Andric                                          (X86vtruncs node:$src), node:$src0)>;
1307*5f757f3fSDimitry Andricdef select_truncus : PatFrag<(ops node:$src, node:$src0, node:$mask),
1308*5f757f3fSDimitry Andric                             (vselect_mask node:$mask,
1309*5f757f3fSDimitry Andric                                           (X86vtruncus node:$src), node:$src0)>;
1310*5f757f3fSDimitry Andric
1311*5f757f3fSDimitry Andricdef X86Vpshufbitqmb_su : PatFrag<(ops node:$src1, node:$src2),
1312*5f757f3fSDimitry Andric                                 (X86Vpshufbitqmb node:$src1, node:$src2), [{
1313*5f757f3fSDimitry Andric  return N->hasOneUse();
1314*5f757f3fSDimitry Andric}]>;
1315*5f757f3fSDimitry Andric
1316*5f757f3fSDimitry Andric// This fragment treats X86cmpm as commutable to help match loads in both
1317*5f757f3fSDimitry Andric// operands for PCMPEQ.
1318*5f757f3fSDimitry Andricdef X86setcc_commute : SDNode<"ISD::SETCC", SDTSetCC, [SDNPCommutative]>;
1319*5f757f3fSDimitry Andricdef X86pcmpgtm : PatFrag<(ops node:$src1, node:$src2),
1320*5f757f3fSDimitry Andric                         (setcc node:$src1, node:$src2, SETGT)>;
1321*5f757f3fSDimitry Andric
1322*5f757f3fSDimitry Andricdef X86pcmpm_imm : SDNodeXForm<setcc, [{
1323*5f757f3fSDimitry Andric  ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
1324*5f757f3fSDimitry Andric  uint8_t SSECC = X86::getVPCMPImmForCond(CC);
1325*5f757f3fSDimitry Andric  return getI8Imm(SSECC, SDLoc(N));
1326*5f757f3fSDimitry Andric}]>;
1327*5f757f3fSDimitry Andric
1328*5f757f3fSDimitry Andric// Swapped operand version of the above.
1329*5f757f3fSDimitry Andricdef X86pcmpm_imm_commute : SDNodeXForm<setcc, [{
1330*5f757f3fSDimitry Andric  ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
1331*5f757f3fSDimitry Andric  uint8_t SSECC = X86::getVPCMPImmForCond(CC);
1332*5f757f3fSDimitry Andric  SSECC = X86::getSwappedVPCMPImm(SSECC);
1333*5f757f3fSDimitry Andric  return getI8Imm(SSECC, SDLoc(N));
1334*5f757f3fSDimitry Andric}]>;
1335*5f757f3fSDimitry Andric
1336*5f757f3fSDimitry Andricdef X86pcmpm : PatFrag<(ops node:$src1, node:$src2, node:$cc),
1337*5f757f3fSDimitry Andric                       (setcc node:$src1, node:$src2, node:$cc), [{
1338*5f757f3fSDimitry Andric  ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
1339*5f757f3fSDimitry Andric  return !ISD::isUnsignedIntSetCC(CC);
1340*5f757f3fSDimitry Andric}], X86pcmpm_imm>;
1341*5f757f3fSDimitry Andric
1342*5f757f3fSDimitry Andricdef X86pcmpm_su : PatFrag<(ops node:$src1, node:$src2, node:$cc),
1343*5f757f3fSDimitry Andric                          (setcc node:$src1, node:$src2, node:$cc), [{
1344*5f757f3fSDimitry Andric  ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
1345*5f757f3fSDimitry Andric  return N->hasOneUse() && !ISD::isUnsignedIntSetCC(CC);
1346*5f757f3fSDimitry Andric}], X86pcmpm_imm>;
1347*5f757f3fSDimitry Andric
1348*5f757f3fSDimitry Andricdef X86pcmpum : PatFrag<(ops node:$src1, node:$src2, node:$cc),
1349*5f757f3fSDimitry Andric                        (setcc node:$src1, node:$src2, node:$cc), [{
1350*5f757f3fSDimitry Andric  ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
1351*5f757f3fSDimitry Andric  return ISD::isUnsignedIntSetCC(CC);
1352*5f757f3fSDimitry Andric}], X86pcmpm_imm>;
1353*5f757f3fSDimitry Andric
1354*5f757f3fSDimitry Andricdef X86pcmpum_su : PatFrag<(ops node:$src1, node:$src2, node:$cc),
1355*5f757f3fSDimitry Andric                           (setcc node:$src1, node:$src2, node:$cc), [{
1356*5f757f3fSDimitry Andric  ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
1357*5f757f3fSDimitry Andric  return N->hasOneUse() && ISD::isUnsignedIntSetCC(CC);
1358*5f757f3fSDimitry Andric}], X86pcmpm_imm>;
1359*5f757f3fSDimitry Andric
1360*5f757f3fSDimitry Andricdef X86cmpm_su : PatFrag<(ops node:$src1, node:$src2, node:$cc),
1361*5f757f3fSDimitry Andric                         (X86cmpm node:$src1, node:$src2, node:$cc), [{
1362*5f757f3fSDimitry Andric  return N->hasOneUse();
1363*5f757f3fSDimitry Andric}]>;
1364*5f757f3fSDimitry Andric
1365*5f757f3fSDimitry Andricdef X86cmpm_imm_commute : SDNodeXForm<timm, [{
1366*5f757f3fSDimitry Andric  uint8_t Imm = X86::getSwappedVCMPImm(N->getZExtValue() & 0x1f);
1367*5f757f3fSDimitry Andric  return getI8Imm(Imm, SDLoc(N));
1368*5f757f3fSDimitry Andric}]>;
1369*5f757f3fSDimitry Andric
1370*5f757f3fSDimitry Andricdef X86vpmaddwd_su : PatFrag<(ops node:$lhs, node:$rhs),
1371*5f757f3fSDimitry Andric                             (X86vpmaddwd node:$lhs, node:$rhs), [{
1372*5f757f3fSDimitry Andric  return N->hasOneUse();
1373*5f757f3fSDimitry Andric}]>;
1374*5f757f3fSDimitry Andric
1375