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