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