xref: /aosp_15_r20/external/llvm/lib/Target/NVPTX/NVPTXVector.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===- NVPTXVector.td - NVPTX Vector Specific Instruction defs -*- tblgen-*-==//
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//-----------------------------------
11*9880d681SAndroid Build Coastguard Worker// Vector Specific
12*9880d681SAndroid Build Coastguard Worker//-----------------------------------
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker//
15*9880d681SAndroid Build Coastguard Worker// All vector instructions derive from NVPTXVecInst
16*9880d681SAndroid Build Coastguard Worker//
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerclass NVPTXVecInst<dag outs, dag ins, string asmstr, list<dag> pattern,
19*9880d681SAndroid Build Coastguard Worker  NVPTXInst sInst=NOP>
20*9880d681SAndroid Build Coastguard Worker  : NVPTXInst<outs, ins, asmstr, pattern> {
21*9880d681SAndroid Build Coastguard Worker  NVPTXInst scalarInst=sInst;
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerlet isAsCheapAsAMove=1, VecInstType=isVecExtract.Value in {
25*9880d681SAndroid Build Coastguard Worker// Extract v2i16
26*9880d681SAndroid Build Coastguard Workerdef V2i16Extract : NVPTXVecInst<(outs Int16Regs:$dst),
27*9880d681SAndroid Build Coastguard Worker  (ins V2I16Regs:$src, i8imm:$c),
28*9880d681SAndroid Build Coastguard Worker                         "mov.u16 \t$dst, $src${c:vecelem};",
29*9880d681SAndroid Build Coastguard Worker                         [(set Int16Regs:$dst, (extractelt
30*9880d681SAndroid Build Coastguard Worker                           (v2i16 V2I16Regs:$src), imm:$c))],
31*9880d681SAndroid Build Coastguard Worker                         IMOV16rr>;
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker// Extract v4i16
34*9880d681SAndroid Build Coastguard Workerdef V4i16Extract : NVPTXVecInst<(outs Int16Regs:$dst),
35*9880d681SAndroid Build Coastguard Worker  (ins V4I16Regs:$src, i8imm:$c),
36*9880d681SAndroid Build Coastguard Worker                         "mov.u16 \t$dst, $src${c:vecelem};",
37*9880d681SAndroid Build Coastguard Worker                         [(set Int16Regs:$dst, (extractelt
38*9880d681SAndroid Build Coastguard Worker                           (v4i16 V4I16Regs:$src), imm:$c))],
39*9880d681SAndroid Build Coastguard Worker                         IMOV16rr>;
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker// Extract v2i8
42*9880d681SAndroid Build Coastguard Workerdef V2i8Extract : NVPTXVecInst<(outs Int8Regs:$dst),
43*9880d681SAndroid Build Coastguard Worker  (ins V2I8Regs:$src, i8imm:$c),
44*9880d681SAndroid Build Coastguard Worker                         "mov.u16 \t$dst, $src${c:vecelem};",
45*9880d681SAndroid Build Coastguard Worker                         [(set Int8Regs:$dst, (extractelt
46*9880d681SAndroid Build Coastguard Worker                           (v2i8 V2I8Regs:$src), imm:$c))],
47*9880d681SAndroid Build Coastguard Worker                         IMOV8rr>;
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker// Extract v4i8
50*9880d681SAndroid Build Coastguard Workerdef V4i8Extract : NVPTXVecInst<(outs Int8Regs:$dst),
51*9880d681SAndroid Build Coastguard Worker  (ins V4I8Regs:$src, i8imm:$c),
52*9880d681SAndroid Build Coastguard Worker                         "mov.u16 \t$dst, $src${c:vecelem};",
53*9880d681SAndroid Build Coastguard Worker                         [(set Int8Regs:$dst, (extractelt
54*9880d681SAndroid Build Coastguard Worker                           (v4i8 V4I8Regs:$src), imm:$c))],
55*9880d681SAndroid Build Coastguard Worker                         IMOV8rr>;
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker// Extract v2i32
58*9880d681SAndroid Build Coastguard Workerdef V2i32Extract : NVPTXVecInst<(outs Int32Regs:$dst),
59*9880d681SAndroid Build Coastguard Worker  (ins V2I32Regs:$src, i8imm:$c),
60*9880d681SAndroid Build Coastguard Worker                         "mov.u32 \t$dst, $src${c:vecelem};",
61*9880d681SAndroid Build Coastguard Worker                         [(set Int32Regs:$dst, (extractelt
62*9880d681SAndroid Build Coastguard Worker                           (v2i32 V2I32Regs:$src), imm:$c))],
63*9880d681SAndroid Build Coastguard Worker                         IMOV32rr>;
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker// Extract v2f32
66*9880d681SAndroid Build Coastguard Workerdef V2f32Extract : NVPTXVecInst<(outs Float32Regs:$dst),
67*9880d681SAndroid Build Coastguard Worker  (ins V2F32Regs:$src, i8imm:$c),
68*9880d681SAndroid Build Coastguard Worker                         "mov.f32 \t$dst, $src${c:vecelem};",
69*9880d681SAndroid Build Coastguard Worker                         [(set Float32Regs:$dst, (extractelt
70*9880d681SAndroid Build Coastguard Worker                           (v2f32 V2F32Regs:$src), imm:$c))],
71*9880d681SAndroid Build Coastguard Worker                         FMOV32rr>;
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker// Extract v2i64
74*9880d681SAndroid Build Coastguard Workerdef V2i64Extract : NVPTXVecInst<(outs Int64Regs:$dst),
75*9880d681SAndroid Build Coastguard Worker  (ins V2I64Regs:$src, i8imm:$c),
76*9880d681SAndroid Build Coastguard Worker                         "mov.u64 \t$dst, $src${c:vecelem};",
77*9880d681SAndroid Build Coastguard Worker                         [(set Int64Regs:$dst, (extractelt
78*9880d681SAndroid Build Coastguard Worker                           (v2i64 V2I64Regs:$src), imm:$c))],
79*9880d681SAndroid Build Coastguard Worker                         IMOV64rr>;
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker// Extract v2f64
82*9880d681SAndroid Build Coastguard Workerdef V2f64Extract : NVPTXVecInst<(outs Float64Regs:$dst),
83*9880d681SAndroid Build Coastguard Worker  (ins V2F64Regs:$src, i8imm:$c),
84*9880d681SAndroid Build Coastguard Worker                         "mov.f64 \t$dst, $src${c:vecelem};",
85*9880d681SAndroid Build Coastguard Worker                         [(set Float64Regs:$dst, (extractelt
86*9880d681SAndroid Build Coastguard Worker                           (v2f64 V2F64Regs:$src), imm:$c))],
87*9880d681SAndroid Build Coastguard Worker                         FMOV64rr>;
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker// Extract v4i32
90*9880d681SAndroid Build Coastguard Workerdef V4i32Extract : NVPTXVecInst<(outs Int32Regs:$dst),
91*9880d681SAndroid Build Coastguard Worker  (ins V4I32Regs:$src, i8imm:$c),
92*9880d681SAndroid Build Coastguard Worker                         "mov.u32 \t$dst, $src${c:vecelem};",
93*9880d681SAndroid Build Coastguard Worker                         [(set Int32Regs:$dst, (extractelt
94*9880d681SAndroid Build Coastguard Worker                           (v4i32 V4I32Regs:$src), imm:$c))],
95*9880d681SAndroid Build Coastguard Worker                         IMOV32rr>;
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker// Extract v4f32
98*9880d681SAndroid Build Coastguard Workerdef V4f32Extract : NVPTXVecInst<(outs Float32Regs:$dst),
99*9880d681SAndroid Build Coastguard Worker  (ins V4F32Regs:$src, i8imm:$c),
100*9880d681SAndroid Build Coastguard Worker                         "mov.f32 \t$dst, $src${c:vecelem};",
101*9880d681SAndroid Build Coastguard Worker                         [(set Float32Regs:$dst, (extractelt
102*9880d681SAndroid Build Coastguard Worker                           (v4f32 V4F32Regs:$src), imm:$c))],
103*9880d681SAndroid Build Coastguard Worker                         FMOV32rr>;
104*9880d681SAndroid Build Coastguard Worker}
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerlet isAsCheapAsAMove=1, VecInstType=isVecInsert.Value in {
107*9880d681SAndroid Build Coastguard Worker// Insert v2i8
108*9880d681SAndroid Build Coastguard Workerdef V2i8Insert : NVPTXVecInst<(outs V2I8Regs:$dst),
109*9880d681SAndroid Build Coastguard Worker  (ins V2I8Regs:$src, Int8Regs:$val, i8imm:$c),
110*9880d681SAndroid Build Coastguard Worker        "mov.v2.u16 \t${dst:vecfull}, ${src:vecfull};"
111*9880d681SAndroid Build Coastguard Worker        "\n\tmov.u16 \t$dst${c:vecelem}, $val;",
112*9880d681SAndroid Build Coastguard Worker       [(set V2I8Regs:$dst,
113*9880d681SAndroid Build Coastguard Worker         (insertelt V2I8Regs:$src, Int8Regs:$val, imm:$c))], IMOV8rr>;
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker// Insert v4i8
116*9880d681SAndroid Build Coastguard Workerdef V4i8Insert : NVPTXVecInst<(outs V4I8Regs:$dst),
117*9880d681SAndroid Build Coastguard Worker  (ins V4I8Regs:$src, Int8Regs:$val, i8imm:$c),
118*9880d681SAndroid Build Coastguard Worker                       "mov.v4.u16 \t${dst:vecfull}, ${src:vecfull};"
119*9880d681SAndroid Build Coastguard Worker                       "\n\tmov.u16 \t$dst${c:vecelem}, $val;",
120*9880d681SAndroid Build Coastguard Worker       [(set V4I8Regs:$dst,
121*9880d681SAndroid Build Coastguard Worker         (insertelt V4I8Regs:$src, Int8Regs:$val, imm:$c))], IMOV8rr>;
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker// Insert v2i16
124*9880d681SAndroid Build Coastguard Workerdef V2i16Insert : NVPTXVecInst<(outs V2I16Regs:$dst),
125*9880d681SAndroid Build Coastguard Worker  (ins V2I16Regs:$src, Int16Regs:$val, i8imm:$c),
126*9880d681SAndroid Build Coastguard Worker                       "mov.v2.u16 \t${dst:vecfull}, ${src:vecfull};"
127*9880d681SAndroid Build Coastguard Worker                       "\n\tmov.u16 \t$dst${c:vecelem}, $val;",
128*9880d681SAndroid Build Coastguard Worker       [(set V2I16Regs:$dst,
129*9880d681SAndroid Build Coastguard Worker         (insertelt V2I16Regs:$src, Int16Regs:$val, imm:$c))],
130*9880d681SAndroid Build Coastguard Worker                    IMOV16rr>;
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker// Insert v4i16
133*9880d681SAndroid Build Coastguard Workerdef V4i16Insert : NVPTXVecInst<(outs V4I16Regs:$dst),
134*9880d681SAndroid Build Coastguard Worker  (ins V4I16Regs:$src, Int16Regs:$val, i8imm:$c),
135*9880d681SAndroid Build Coastguard Worker                       "mov.v4.u16 \t${dst:vecfull}, ${src:vecfull};"
136*9880d681SAndroid Build Coastguard Worker                       "\n\tmov.u16 \t$dst${c:vecelem}, $val;",
137*9880d681SAndroid Build Coastguard Worker       [(set V4I16Regs:$dst,
138*9880d681SAndroid Build Coastguard Worker         (insertelt V4I16Regs:$src, Int16Regs:$val, imm:$c))],
139*9880d681SAndroid Build Coastguard Worker                    IMOV16rr>;
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker// Insert v2i32
142*9880d681SAndroid Build Coastguard Workerdef V2i32Insert : NVPTXVecInst<(outs V2I32Regs:$dst),
143*9880d681SAndroid Build Coastguard Worker  (ins V2I32Regs:$src, Int32Regs:$val, i8imm:$c),
144*9880d681SAndroid Build Coastguard Worker                       "mov.v2.u32 \t${dst:vecfull}, ${src:vecfull};"
145*9880d681SAndroid Build Coastguard Worker                       "\n\tmov.u32 \t$dst${c:vecelem}, $val;",
146*9880d681SAndroid Build Coastguard Worker       [(set V2I32Regs:$dst,
147*9880d681SAndroid Build Coastguard Worker         (insertelt V2I32Regs:$src, Int32Regs:$val, imm:$c))],
148*9880d681SAndroid Build Coastguard Worker                    IMOV32rr>;
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker// Insert v2f32
151*9880d681SAndroid Build Coastguard Workerdef V2f32Insert : NVPTXVecInst<(outs V2F32Regs:$dst),
152*9880d681SAndroid Build Coastguard Worker  (ins V2F32Regs:$src, Float32Regs:$val, i8imm:$c),
153*9880d681SAndroid Build Coastguard Worker                       "mov.v2.f32 \t${dst:vecfull}, ${src:vecfull};"
154*9880d681SAndroid Build Coastguard Worker                       "\n\tmov.f32 \t$dst${c:vecelem}, $val;",
155*9880d681SAndroid Build Coastguard Worker       [(set V2F32Regs:$dst,
156*9880d681SAndroid Build Coastguard Worker         (insertelt V2F32Regs:$src, Float32Regs:$val, imm:$c))],
157*9880d681SAndroid Build Coastguard Worker                    FMOV32rr>;
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker// Insert v2i64
160*9880d681SAndroid Build Coastguard Workerdef V2i64Insert : NVPTXVecInst<(outs V2I64Regs:$dst),
161*9880d681SAndroid Build Coastguard Worker  (ins V2I64Regs:$src, Int64Regs:$val, i8imm:$c),
162*9880d681SAndroid Build Coastguard Worker                       "mov.v2.u64 \t${dst:vecfull}, ${src:vecfull};"
163*9880d681SAndroid Build Coastguard Worker                       "\n\tmov.u64 \t$dst${c:vecelem}, $val;",
164*9880d681SAndroid Build Coastguard Worker       [(set V2I64Regs:$dst,
165*9880d681SAndroid Build Coastguard Worker         (insertelt V2I64Regs:$src, Int64Regs:$val, imm:$c))],
166*9880d681SAndroid Build Coastguard Worker                    IMOV64rr>;
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker// Insert v2f64
169*9880d681SAndroid Build Coastguard Workerdef V2f64Insert : NVPTXVecInst<(outs V2F64Regs:$dst),
170*9880d681SAndroid Build Coastguard Worker  (ins V2F64Regs:$src, Float64Regs:$val, i8imm:$c),
171*9880d681SAndroid Build Coastguard Worker                       "mov.v2.f64 \t${dst:vecfull}, ${src:vecfull};"
172*9880d681SAndroid Build Coastguard Worker                       "\n\tmov.f64 \t$dst${c:vecelem}, $val;",
173*9880d681SAndroid Build Coastguard Worker       [(set V2F64Regs:$dst,
174*9880d681SAndroid Build Coastguard Worker         (insertelt V2F64Regs:$src, Float64Regs:$val, imm:$c))],
175*9880d681SAndroid Build Coastguard Worker                    FMOV64rr>;
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker// Insert v4i32
178*9880d681SAndroid Build Coastguard Workerdef V4i32Insert : NVPTXVecInst<(outs V4I32Regs:$dst),
179*9880d681SAndroid Build Coastguard Worker  (ins V4I32Regs:$src, Int32Regs:$val, i8imm:$c),
180*9880d681SAndroid Build Coastguard Worker                       "mov.v4.u32 \t${dst:vecfull}, ${src:vecfull};"
181*9880d681SAndroid Build Coastguard Worker                       "\n\tmov.u32 \t$dst${c:vecelem}, $val;",
182*9880d681SAndroid Build Coastguard Worker       [(set V4I32Regs:$dst,
183*9880d681SAndroid Build Coastguard Worker         (insertelt V4I32Regs:$src, Int32Regs:$val, imm:$c))],
184*9880d681SAndroid Build Coastguard Worker                    IMOV32rr>;
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker// Insert v4f32
187*9880d681SAndroid Build Coastguard Workerdef V4f32Insert : NVPTXVecInst<(outs V4F32Regs:$dst),
188*9880d681SAndroid Build Coastguard Worker  (ins V4F32Regs:$src, Float32Regs:$val, i8imm:$c),
189*9880d681SAndroid Build Coastguard Worker                       "mov.v4.f32 \t${dst:vecfull}, ${src:vecfull};"
190*9880d681SAndroid Build Coastguard Worker                       "\n\tmov.f32 \t$dst${c:vecelem}, $val;",
191*9880d681SAndroid Build Coastguard Worker       [(set V4F32Regs:$dst,
192*9880d681SAndroid Build Coastguard Worker         (insertelt V4F32Regs:$src, Float32Regs:$val, imm:$c))],
193*9880d681SAndroid Build Coastguard Worker                    FMOV32rr>;
194*9880d681SAndroid Build Coastguard Worker}
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Workerclass BinOpAsmString<string c> {
197*9880d681SAndroid Build Coastguard Worker  string s = c;
198*9880d681SAndroid Build Coastguard Worker}
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Workerclass V4AsmStr<string opcode> : BinOpAsmString<
201*9880d681SAndroid Build Coastguard Worker                          !strconcat(!strconcat(!strconcat(!strconcat(
202*9880d681SAndroid Build Coastguard Worker                            !strconcat(!strconcat(!strconcat(
203*9880d681SAndroid Build Coastguard Worker                          opcode,  " \t${dst}_0, ${a}_0, ${b}_0;\n\t"),
204*9880d681SAndroid Build Coastguard Worker                          opcode), " \t${dst}_1, ${a}_1, ${b}_1;\n\t"),
205*9880d681SAndroid Build Coastguard Worker                          opcode), " \t${dst}_2, ${a}_2, ${b}_2;\n\t"),
206*9880d681SAndroid Build Coastguard Worker                          opcode), " \t${dst}_3, ${a}_3, ${b}_3;")>;
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Workerclass V2AsmStr<string opcode> : BinOpAsmString<
209*9880d681SAndroid Build Coastguard Worker                           !strconcat(!strconcat(!strconcat(
210*9880d681SAndroid Build Coastguard Worker                           opcode,  " \t${dst}_0, ${a}_0, ${b}_0;\n\t"),
211*9880d681SAndroid Build Coastguard Worker                           opcode), " \t${dst}_1, ${a}_1, ${b}_1;")>;
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerclass V4MADStr<string opcode> : BinOpAsmString<
214*9880d681SAndroid Build Coastguard Worker                          !strconcat(!strconcat(!strconcat(!strconcat(
215*9880d681SAndroid Build Coastguard Worker                            !strconcat(!strconcat(!strconcat(
216*9880d681SAndroid Build Coastguard Worker                          opcode,  " \t${dst}_0, ${a}_0, ${b}_0, ${c}_0;\n\t"),
217*9880d681SAndroid Build Coastguard Worker                          opcode), " \t${dst}_1, ${a}_1, ${b}_1, ${c}_1;\n\t"),
218*9880d681SAndroid Build Coastguard Worker                          opcode), " \t${dst}_2, ${a}_2, ${b}_2, ${c}_2;\n\t"),
219*9880d681SAndroid Build Coastguard Worker                          opcode), " \t${dst}_3, ${a}_3, ${b}_3, ${c}_3;")>;
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerclass V2MADStr<string opcode> : BinOpAsmString<
222*9880d681SAndroid Build Coastguard Worker                           !strconcat(!strconcat(!strconcat(
223*9880d681SAndroid Build Coastguard Worker                           opcode,  " \t${dst}_0, ${a}_0, ${b}_0, ${c}_0;\n\t"),
224*9880d681SAndroid Build Coastguard Worker                           opcode), " \t${dst}_1, ${a}_1, ${b}_1, ${c}_1;")>;
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Workerclass V4UnaryStr<string opcode> : BinOpAsmString<
227*9880d681SAndroid Build Coastguard Worker                          !strconcat(!strconcat(!strconcat(!strconcat(
228*9880d681SAndroid Build Coastguard Worker                            !strconcat(!strconcat(!strconcat(
229*9880d681SAndroid Build Coastguard Worker                          opcode,  " \t${dst}_0, ${a}_0;\n\t"),
230*9880d681SAndroid Build Coastguard Worker                          opcode), " \t${dst}_1, ${a}_1;\n\t"),
231*9880d681SAndroid Build Coastguard Worker                          opcode), " \t${dst}_2, ${a}_2;\n\t"),
232*9880d681SAndroid Build Coastguard Worker                          opcode), " \t${dst}_3, ${a}_3;")>;
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Workerclass V2UnaryStr<string opcode> : BinOpAsmString<
235*9880d681SAndroid Build Coastguard Worker                           !strconcat(!strconcat(!strconcat(
236*9880d681SAndroid Build Coastguard Worker                           opcode,  " \t${dst}_0, ${a}_0;\n\t"),
237*9880d681SAndroid Build Coastguard Worker                           opcode), " \t${dst}_1, ${a}_1;")>;
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerclass VecBinaryOp<BinOpAsmString asmstr, SDNode OpNode, NVPTXRegClass regclass,
240*9880d681SAndroid Build Coastguard Worker  NVPTXInst sInst=NOP> :
241*9880d681SAndroid Build Coastguard Worker      NVPTXVecInst<(outs regclass:$dst), (ins regclass:$a, regclass:$b),
242*9880d681SAndroid Build Coastguard Worker                 asmstr.s,
243*9880d681SAndroid Build Coastguard Worker                 [(set regclass:$dst, (OpNode regclass:$a, regclass:$b))],
244*9880d681SAndroid Build Coastguard Worker                 sInst>;
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Workerclass VecShiftOp<BinOpAsmString asmstr, SDNode OpNode, NVPTXRegClass regclass1,
247*9880d681SAndroid Build Coastguard Worker                 NVPTXRegClass regclass2, NVPTXInst sInst=NOP> :
248*9880d681SAndroid Build Coastguard Worker      NVPTXVecInst<(outs regclass1:$dst), (ins regclass1:$a, regclass2:$b),
249*9880d681SAndroid Build Coastguard Worker                 asmstr.s,
250*9880d681SAndroid Build Coastguard Worker                 [(set regclass1:$dst, (OpNode regclass1:$a, regclass2:$b))],
251*9880d681SAndroid Build Coastguard Worker                 sInst>;
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerclass VecUnaryOp<BinOpAsmString asmstr, PatFrag OpNode, NVPTXRegClass regclass,
254*9880d681SAndroid Build Coastguard Worker  NVPTXInst sInst=NOP> :
255*9880d681SAndroid Build Coastguard Worker      NVPTXVecInst<(outs regclass:$dst), (ins regclass:$a),
256*9880d681SAndroid Build Coastguard Worker                 asmstr.s,
257*9880d681SAndroid Build Coastguard Worker                 [(set regclass:$dst, (OpNode regclass:$a))], sInst>;
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workermulticlass IntBinVOp<string asmstr, SDNode OpNode,
260*9880d681SAndroid Build Coastguard Worker                     NVPTXInst i64op=NOP, NVPTXInst i32op=NOP, NVPTXInst
261*9880d681SAndroid Build Coastguard Worker                     i16op=NOP, NVPTXInst i8op=NOP> {
262*9880d681SAndroid Build Coastguard Worker  def V2I64 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "64")>, OpNode, V2I64Regs,
263*9880d681SAndroid Build Coastguard Worker    i64op>;
264*9880d681SAndroid Build Coastguard Worker  def V4I32 : VecBinaryOp<V4AsmStr<!strconcat(asmstr, "32")>, OpNode, V4I32Regs,
265*9880d681SAndroid Build Coastguard Worker    i32op>;
266*9880d681SAndroid Build Coastguard Worker  def V2I32 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "32")>, OpNode, V2I32Regs,
267*9880d681SAndroid Build Coastguard Worker    i32op>;
268*9880d681SAndroid Build Coastguard Worker  def V4I16 : VecBinaryOp<V4AsmStr<!strconcat(asmstr, "16")>, OpNode, V4I16Regs,
269*9880d681SAndroid Build Coastguard Worker    i16op>;
270*9880d681SAndroid Build Coastguard Worker  def V2I16 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "16")>, OpNode, V2I16Regs,
271*9880d681SAndroid Build Coastguard Worker    i16op>;
272*9880d681SAndroid Build Coastguard Worker  def V4I8 : VecBinaryOp<V4AsmStr<!strconcat(asmstr, "16")>, OpNode, V4I8Regs,
273*9880d681SAndroid Build Coastguard Worker    i8op>;
274*9880d681SAndroid Build Coastguard Worker  def V2I8 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "16")>, OpNode, V2I8Regs,
275*9880d681SAndroid Build Coastguard Worker    i8op>;
276*9880d681SAndroid Build Coastguard Worker}
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Workermulticlass FloatBinVOp<string asmstr, SDNode OpNode,
279*9880d681SAndroid Build Coastguard Worker                       NVPTXInst f64=NOP, NVPTXInst f32=NOP,
280*9880d681SAndroid Build Coastguard Worker                       NVPTXInst f32_ftz=NOP> {
281*9880d681SAndroid Build Coastguard Worker  def V2F64 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "f64")>, OpNode,
282*9880d681SAndroid Build Coastguard Worker    V2F64Regs, f64>;
283*9880d681SAndroid Build Coastguard Worker  def V4F32_ftz : VecBinaryOp<V4AsmStr<!strconcat(asmstr, "ftz.f32")>, OpNode,
284*9880d681SAndroid Build Coastguard Worker    V4F32Regs, f32_ftz>, Requires<[doF32FTZ]>;
285*9880d681SAndroid Build Coastguard Worker  def V2F32_ftz : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "ftz.f32")>, OpNode,
286*9880d681SAndroid Build Coastguard Worker    V2F32Regs, f32_ftz>, Requires<[doF32FTZ]>;
287*9880d681SAndroid Build Coastguard Worker  def V4F32 : VecBinaryOp<V4AsmStr<!strconcat(asmstr, "f32")>, OpNode,
288*9880d681SAndroid Build Coastguard Worker    V4F32Regs, f32>;
289*9880d681SAndroid Build Coastguard Worker  def V2F32 : VecBinaryOp<V2AsmStr<!strconcat(asmstr, "f32")>, OpNode,
290*9880d681SAndroid Build Coastguard Worker    V2F32Regs, f32>;
291*9880d681SAndroid Build Coastguard Worker}
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Workermulticlass IntUnaryVOp<string asmstr, PatFrag OpNode,
294*9880d681SAndroid Build Coastguard Worker                       NVPTXInst i64op=NOP, NVPTXInst i32op=NOP,
295*9880d681SAndroid Build Coastguard Worker                       NVPTXInst i16op=NOP, NVPTXInst i8op=NOP> {
296*9880d681SAndroid Build Coastguard Worker  def V2I64 : VecUnaryOp<V2UnaryStr<!strconcat(asmstr, "64")>, OpNode,
297*9880d681SAndroid Build Coastguard Worker    V2I64Regs, i64op>;
298*9880d681SAndroid Build Coastguard Worker  def V4I32 : VecUnaryOp<V4UnaryStr<!strconcat(asmstr, "32")>, OpNode,
299*9880d681SAndroid Build Coastguard Worker    V4I32Regs, i32op>;
300*9880d681SAndroid Build Coastguard Worker  def V2I32 : VecUnaryOp<V2UnaryStr<!strconcat(asmstr, "32")>, OpNode,
301*9880d681SAndroid Build Coastguard Worker    V2I32Regs, i32op>;
302*9880d681SAndroid Build Coastguard Worker  def V4I16 : VecUnaryOp<V4UnaryStr<!strconcat(asmstr, "16")>, OpNode,
303*9880d681SAndroid Build Coastguard Worker    V4I16Regs, i16op>;
304*9880d681SAndroid Build Coastguard Worker  def V2I16 : VecUnaryOp<V2UnaryStr<!strconcat(asmstr, "16")>, OpNode,
305*9880d681SAndroid Build Coastguard Worker    V2I16Regs, i16op>;
306*9880d681SAndroid Build Coastguard Worker  def V4I8  : VecUnaryOp<V4UnaryStr<!strconcat(asmstr, "16")>, OpNode,
307*9880d681SAndroid Build Coastguard Worker    V4I8Regs,   i8op>;
308*9880d681SAndroid Build Coastguard Worker  def V2I8  : VecUnaryOp<V2UnaryStr<!strconcat(asmstr, "16")>, OpNode,
309*9880d681SAndroid Build Coastguard Worker    V2I8Regs,   i8op>;
310*9880d681SAndroid Build Coastguard Worker}
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker// Integer Arithmetic
314*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in {
315*9880d681SAndroid Build Coastguard Workerdefm VAdd : IntBinVOp<"add.s", add, ADDi64rr, ADDi32rr, ADDi16rr, ADDi8rr>;
316*9880d681SAndroid Build Coastguard Workerdefm VSub : IntBinVOp<"sub.s", sub, SUBi64rr, SUBi32rr, SUBi16rr, SUBi8rr>;
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Workerdef AddCCV4I32 : VecBinaryOp<V4AsmStr<"add.cc.s32">, addc, V4I32Regs,
319*9880d681SAndroid Build Coastguard Worker  ADDCCi32rr>;
320*9880d681SAndroid Build Coastguard Workerdef AddCCV2I32 : VecBinaryOp<V2AsmStr<"add.cc.s32">, addc, V2I32Regs,
321*9880d681SAndroid Build Coastguard Worker  ADDCCi32rr>;
322*9880d681SAndroid Build Coastguard Workerdef SubCCV4I32 : VecBinaryOp<V4AsmStr<"sub.cc.s32">, subc, V4I32Regs,
323*9880d681SAndroid Build Coastguard Worker  SUBCCi32rr>;
324*9880d681SAndroid Build Coastguard Workerdef SubCCV2I32 : VecBinaryOp<V2AsmStr<"sub.cc.s32">, subc, V2I32Regs,
325*9880d681SAndroid Build Coastguard Worker  SUBCCi32rr>;
326*9880d681SAndroid Build Coastguard Workerdef AddCCCV4I32 : VecBinaryOp<V4AsmStr<"addc.cc.s32">, adde, V4I32Regs,
327*9880d681SAndroid Build Coastguard Worker  ADDCCCi32rr>;
328*9880d681SAndroid Build Coastguard Workerdef AddCCCV2I32 : VecBinaryOp<V2AsmStr<"addc.cc.s32">, adde, V2I32Regs,
329*9880d681SAndroid Build Coastguard Worker  ADDCCCi32rr>;
330*9880d681SAndroid Build Coastguard Workerdef SubCCCV4I32 : VecBinaryOp<V4AsmStr<"subc.cc.s32">, sube, V4I32Regs,
331*9880d681SAndroid Build Coastguard Worker  SUBCCCi32rr>;
332*9880d681SAndroid Build Coastguard Workerdef SubCCCV2I32 : VecBinaryOp<V2AsmStr<"subc.cc.s32">, sube, V2I32Regs,
333*9880d681SAndroid Build Coastguard Worker  SUBCCCi32rr>;
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Workerdef ShiftLV2I64 : VecShiftOp<V2AsmStr<"shl.b64">, shl, V2I64Regs, V2I32Regs,
336*9880d681SAndroid Build Coastguard Worker  SHLi64rr>;
337*9880d681SAndroid Build Coastguard Workerdef ShiftLV2I32 : VecShiftOp<V2AsmStr<"shl.b32">, shl, V2I32Regs, V2I32Regs,
338*9880d681SAndroid Build Coastguard Worker  SHLi32rr>;
339*9880d681SAndroid Build Coastguard Workerdef ShiftLV4I32 : VecShiftOp<V4AsmStr<"shl.b32">, shl, V4I32Regs, V4I32Regs,
340*9880d681SAndroid Build Coastguard Worker  SHLi32rr>;
341*9880d681SAndroid Build Coastguard Workerdef ShiftLV2I16 : VecShiftOp<V2AsmStr<"shl.b16">, shl, V2I16Regs, V2I32Regs,
342*9880d681SAndroid Build Coastguard Worker  SHLi16rr>;
343*9880d681SAndroid Build Coastguard Workerdef ShiftLV4I16 : VecShiftOp<V4AsmStr<"shl.b16">, shl, V4I16Regs, V4I32Regs,
344*9880d681SAndroid Build Coastguard Worker  SHLi16rr>;
345*9880d681SAndroid Build Coastguard Workerdef ShiftLV2I8  : VecShiftOp<V2AsmStr<"shl.b16">, shl, V2I8Regs,  V2I32Regs,
346*9880d681SAndroid Build Coastguard Worker  SHLi8rr>;
347*9880d681SAndroid Build Coastguard Workerdef ShiftLV4I8  : VecShiftOp<V4AsmStr<"shl.b16">, shl, V4I8Regs,  V4I32Regs,
348*9880d681SAndroid Build Coastguard Worker  SHLi8rr>;
349*9880d681SAndroid Build Coastguard Worker}
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Worker// cvt to v*i32, helpers for shift
352*9880d681SAndroid Build Coastguard Workerclass CVTtoVeci32<NVPTXRegClass inclass, NVPTXRegClass outclass, string asmstr,
353*9880d681SAndroid Build Coastguard Worker  NVPTXInst sInst=NOP> :
354*9880d681SAndroid Build Coastguard Worker      NVPTXVecInst<(outs outclass:$d), (ins inclass:$s), asmstr, [], sInst>;
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Workerclass VecCVTStrHelper<string op, string dest, string src> {
357*9880d681SAndroid Build Coastguard Worker  string s=!strconcat(op, !strconcat("\t",
358*9880d681SAndroid Build Coastguard Worker           !strconcat(dest, !strconcat(", ", !strconcat(src, ";")))));
359*9880d681SAndroid Build Coastguard Worker}
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Workerclass Vec2CVTStr<string op> {
362*9880d681SAndroid Build Coastguard Worker  string s=!strconcat(VecCVTStrHelper<op, "${d}_0", "${s}_0">.s,
363*9880d681SAndroid Build Coastguard Worker           !strconcat("\n\t", VecCVTStrHelper<op, "${d}_1", "${s}_1">.s));
364*9880d681SAndroid Build Coastguard Worker}
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Workerclass Vec4CVTStr<string op> {
367*9880d681SAndroid Build Coastguard Worker  string s=!strconcat(VecCVTStrHelper<op, "${d}_0", "${s}_0">.s,
368*9880d681SAndroid Build Coastguard Worker           !strconcat("\n\t",
369*9880d681SAndroid Build Coastguard Worker           !strconcat(VecCVTStrHelper<op, "${d}_1", "${s}_1">.s,
370*9880d681SAndroid Build Coastguard Worker           !strconcat("\n\t",
371*9880d681SAndroid Build Coastguard Worker           !strconcat(VecCVTStrHelper<op, "${d}_2", "${s}_2">.s,
372*9880d681SAndroid Build Coastguard Worker           !strconcat("\n\t", VecCVTStrHelper<op, "${d}_3", "${s}_3">.s))))));
373*9880d681SAndroid Build Coastguard Worker}
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in {
376*9880d681SAndroid Build Coastguard Workerdef CVTv2i8tov2i32 : CVTtoVeci32<V2I8Regs, V2I32Regs,
377*9880d681SAndroid Build Coastguard Worker  Vec2CVTStr<"cvt.u32.u16">.s, Zint_extendext8to32>;
378*9880d681SAndroid Build Coastguard Workerdef CVTv2i16tov2i32 : CVTtoVeci32<V2I16Regs, V2I32Regs,
379*9880d681SAndroid Build Coastguard Worker  Vec2CVTStr<"cvt.u32.u16">.s, Zint_extendext16to32>;
380*9880d681SAndroid Build Coastguard Workerdef CVTv4i8tov4i32 : CVTtoVeci32<V4I8Regs, V4I32Regs,
381*9880d681SAndroid Build Coastguard Worker  Vec4CVTStr<"cvt.u32.u16">.s, Zint_extendext8to32>;
382*9880d681SAndroid Build Coastguard Workerdef CVTv4i16tov4i32 : CVTtoVeci32<V4I16Regs, V4I32Regs,
383*9880d681SAndroid Build Coastguard Worker  Vec4CVTStr<"cvt.u32.u16">.s, Zint_extendext16to32>;
384*9880d681SAndroid Build Coastguard Workerdef CVTv2i64tov2i32 : CVTtoVeci32<V2I64Regs, V2I32Regs,
385*9880d681SAndroid Build Coastguard Worker  Vec2CVTStr<"cvt.u32.u64">.s, TRUNC_64to32>;
386*9880d681SAndroid Build Coastguard Worker}
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl V2I16Regs:$src1, V2I16Regs:$src2),
389*9880d681SAndroid Build Coastguard Worker          (ShiftLV2I16 V2I16Regs:$src1, (CVTv2i16tov2i32 V2I16Regs:$src2))>;
390*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl V2I8Regs:$src1, V2I8Regs:$src2),
391*9880d681SAndroid Build Coastguard Worker          (ShiftLV2I8 V2I8Regs:$src1, (CVTv2i8tov2i32 V2I8Regs:$src2))>;
392*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl V2I64Regs:$src1, V2I64Regs:$src2),
393*9880d681SAndroid Build Coastguard Worker          (ShiftLV2I64 V2I64Regs:$src1, (CVTv2i64tov2i32 V2I64Regs:$src2))>;
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl V4I16Regs:$src1, V4I16Regs:$src2),
396*9880d681SAndroid Build Coastguard Worker          (ShiftLV4I16 V4I16Regs:$src1, (CVTv4i16tov4i32 V4I16Regs:$src2))>;
397*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl V4I8Regs:$src1, V4I8Regs:$src2),
398*9880d681SAndroid Build Coastguard Worker          (ShiftLV4I8 V4I8Regs:$src1, (CVTv4i8tov4i32 V4I8Regs:$src2))>;
399*9880d681SAndroid Build Coastguard Worker
400*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in {
401*9880d681SAndroid Build Coastguard Workerdef ShiftRAV2I64 : VecShiftOp<V2AsmStr<"shr.s64">, sra, V2I64Regs, V2I32Regs,
402*9880d681SAndroid Build Coastguard Worker  SRAi64rr>;
403*9880d681SAndroid Build Coastguard Workerdef ShiftRAV2I32 : VecShiftOp<V2AsmStr<"shr.s32">, sra, V2I32Regs, V2I32Regs,
404*9880d681SAndroid Build Coastguard Worker  SRAi32rr>;
405*9880d681SAndroid Build Coastguard Workerdef ShiftRAV4I32 : VecShiftOp<V4AsmStr<"shr.s32">, sra, V4I32Regs, V4I32Regs,
406*9880d681SAndroid Build Coastguard Worker  SRAi32rr>;
407*9880d681SAndroid Build Coastguard Workerdef ShiftRAV2I16 : VecShiftOp<V2AsmStr<"shr.s16">, sra, V2I16Regs, V2I32Regs,
408*9880d681SAndroid Build Coastguard Worker  SRAi16rr>;
409*9880d681SAndroid Build Coastguard Workerdef ShiftRAV4I16 : VecShiftOp<V4AsmStr<"shr.s16">, sra, V4I16Regs, V4I32Regs,
410*9880d681SAndroid Build Coastguard Worker  SRAi16rr>;
411*9880d681SAndroid Build Coastguard Workerdef ShiftRAV2I8  : VecShiftOp<V2AsmStr<"shr.s16">, sra, V2I8Regs,  V2I32Regs,
412*9880d681SAndroid Build Coastguard Worker  SRAi8rr>;
413*9880d681SAndroid Build Coastguard Workerdef ShiftRAV4I8  : VecShiftOp<V4AsmStr<"shr.s16">, sra, V4I8Regs,  V4I32Regs,
414*9880d681SAndroid Build Coastguard Worker  SRAi8rr>;
415*9880d681SAndroid Build Coastguard Worker
416*9880d681SAndroid Build Coastguard Workerdef ShiftRLV2I64 : VecShiftOp<V2AsmStr<"shr.u64">, srl, V2I64Regs, V2I32Regs,
417*9880d681SAndroid Build Coastguard Worker  SRLi64rr>;
418*9880d681SAndroid Build Coastguard Workerdef ShiftRLV2I32 : VecShiftOp<V2AsmStr<"shr.u32">, srl, V2I32Regs, V2I32Regs,
419*9880d681SAndroid Build Coastguard Worker  SRLi32rr>;
420*9880d681SAndroid Build Coastguard Workerdef ShiftRLV4I32 : VecShiftOp<V4AsmStr<"shr.u32">, srl, V4I32Regs, V4I32Regs,
421*9880d681SAndroid Build Coastguard Worker  SRLi32rr>;
422*9880d681SAndroid Build Coastguard Workerdef ShiftRLV2I16 : VecShiftOp<V2AsmStr<"shr.u16">, srl, V2I16Regs, V2I32Regs,
423*9880d681SAndroid Build Coastguard Worker  SRLi16rr>;
424*9880d681SAndroid Build Coastguard Workerdef ShiftRLV4I16 : VecShiftOp<V4AsmStr<"shr.u16">, srl, V4I16Regs, V4I32Regs,
425*9880d681SAndroid Build Coastguard Worker  SRLi16rr>;
426*9880d681SAndroid Build Coastguard Workerdef ShiftRLV2I8  : VecShiftOp<V2AsmStr<"shr.u16">, srl, V2I8Regs,  V2I32Regs,
427*9880d681SAndroid Build Coastguard Worker  SRLi8rr>;
428*9880d681SAndroid Build Coastguard Workerdef ShiftRLV4I8  : VecShiftOp<V4AsmStr<"shr.u16">, srl, V4I8Regs,  V4I32Regs,
429*9880d681SAndroid Build Coastguard Worker  SRLi8rr>;
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Workerdefm VMult   : IntBinVOp<"mul.lo.s", mul, MULTi64rr, MULTi32rr, MULTi16rr,
432*9880d681SAndroid Build Coastguard Worker  MULTi8rr>;
433*9880d681SAndroid Build Coastguard Workerdefm VMultHS : IntBinVOp<"mul.hi.s", mulhs, MULTHSi64rr, MULTHSi32rr,
434*9880d681SAndroid Build Coastguard Worker  MULTHSi16rr,
435*9880d681SAndroid Build Coastguard Worker  MULTHSi8rr>;
436*9880d681SAndroid Build Coastguard Workerdefm VMultHU : IntBinVOp<"mul.hi.u", mulhu, MULTHUi64rr, MULTHUi32rr,
437*9880d681SAndroid Build Coastguard Worker  MULTHUi16rr,
438*9880d681SAndroid Build Coastguard Worker  MULTHUi8rr>;
439*9880d681SAndroid Build Coastguard Workerdefm VSDiv   : IntBinVOp<"div.s", sdiv, SDIVi64rr, SDIVi32rr, SDIVi16rr,
440*9880d681SAndroid Build Coastguard Worker  SDIVi8rr>;
441*9880d681SAndroid Build Coastguard Workerdefm VUDiv   : IntBinVOp<"div.u", udiv, UDIVi64rr, UDIVi32rr, UDIVi16rr,
442*9880d681SAndroid Build Coastguard Worker  UDIVi8rr>;
443*9880d681SAndroid Build Coastguard Workerdefm VSRem   : IntBinVOp<"rem.s", srem, SREMi64rr, SREMi32rr, SREMi16rr,
444*9880d681SAndroid Build Coastguard Worker  SREMi8rr>;
445*9880d681SAndroid Build Coastguard Workerdefm VURem   : IntBinVOp<"rem.u", urem, UREMi64rr, UREMi32rr, UREMi16rr,
446*9880d681SAndroid Build Coastguard Worker  UREMi8rr>;
447*9880d681SAndroid Build Coastguard Worker}
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra V2I16Regs:$src1, V2I16Regs:$src2),
450*9880d681SAndroid Build Coastguard Worker          (ShiftRAV2I16 V2I16Regs:$src1, (CVTv2i16tov2i32 V2I16Regs:$src2))>;
451*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra V2I8Regs:$src1, V2I8Regs:$src2),
452*9880d681SAndroid Build Coastguard Worker          (ShiftRAV2I8 V2I8Regs:$src1, (CVTv2i8tov2i32 V2I8Regs:$src2))>;
453*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra V2I64Regs:$src1, V2I64Regs:$src2),
454*9880d681SAndroid Build Coastguard Worker          (ShiftRAV2I64 V2I64Regs:$src1, (CVTv2i64tov2i32 V2I64Regs:$src2))>;
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra V4I16Regs:$src1, V4I16Regs:$src2),
457*9880d681SAndroid Build Coastguard Worker          (ShiftRAV4I16 V4I16Regs:$src1, (CVTv4i16tov4i32 V4I16Regs:$src2))>;
458*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra V4I8Regs:$src1, V4I8Regs:$src2),
459*9880d681SAndroid Build Coastguard Worker          (ShiftRAV4I8 V4I8Regs:$src1, (CVTv4i8tov4i32 V4I8Regs:$src2))>;
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl V2I16Regs:$src1, V2I16Regs:$src2),
462*9880d681SAndroid Build Coastguard Worker          (ShiftRLV2I16 V2I16Regs:$src1, (CVTv2i16tov2i32 V2I16Regs:$src2))>;
463*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl V2I8Regs:$src1, V2I8Regs:$src2),
464*9880d681SAndroid Build Coastguard Worker          (ShiftRLV2I8 V2I8Regs:$src1, (CVTv2i8tov2i32 V2I8Regs:$src2))>;
465*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl V2I64Regs:$src1, V2I64Regs:$src2),
466*9880d681SAndroid Build Coastguard Worker          (ShiftRLV2I64 V2I64Regs:$src1, (CVTv2i64tov2i32 V2I64Regs:$src2))>;
467*9880d681SAndroid Build Coastguard Worker
468*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl V4I16Regs:$src1, V4I16Regs:$src2),
469*9880d681SAndroid Build Coastguard Worker          (ShiftRLV4I16 V4I16Regs:$src1, (CVTv4i16tov4i32 V4I16Regs:$src2))>;
470*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl V4I8Regs:$src1, V4I8Regs:$src2),
471*9880d681SAndroid Build Coastguard Worker          (ShiftRLV4I8 V4I8Regs:$src1, (CVTv4i8tov4i32 V4I8Regs:$src2))>;
472*9880d681SAndroid Build Coastguard Worker
473*9880d681SAndroid Build Coastguard Workermulticlass VMAD<string asmstr, NVPTXRegClass regclassv4,
474*9880d681SAndroid Build Coastguard Worker  NVPTXRegClass regclassv2,
475*9880d681SAndroid Build Coastguard Worker                SDNode an=add, SDNode mn=mul, NVPTXInst sop=NOP,
476*9880d681SAndroid Build Coastguard Worker                Predicate Pred> {
477*9880d681SAndroid Build Coastguard Worker  def V4 : NVPTXVecInst<(outs regclassv4:$dst),
478*9880d681SAndroid Build Coastguard Worker    (ins regclassv4:$a, regclassv4:$b, regclassv4:$c),
479*9880d681SAndroid Build Coastguard Worker                      V4MADStr<asmstr>.s,
480*9880d681SAndroid Build Coastguard Worker                      [(set regclassv4:$dst,
481*9880d681SAndroid Build Coastguard Worker                        (an (mn regclassv4:$a, regclassv4:$b), regclassv4:$c))],
482*9880d681SAndroid Build Coastguard Worker                      sop>,
483*9880d681SAndroid Build Coastguard Worker           Requires<[Pred]>;
484*9880d681SAndroid Build Coastguard Worker  def V2 : NVPTXVecInst<(outs regclassv2:$dst),
485*9880d681SAndroid Build Coastguard Worker    (ins regclassv2:$a, regclassv2:$b, regclassv2:$c),
486*9880d681SAndroid Build Coastguard Worker                      V2MADStr<asmstr>.s,
487*9880d681SAndroid Build Coastguard Worker                      [(set regclassv2:$dst,
488*9880d681SAndroid Build Coastguard Worker                        (an (mn regclassv2:$a, regclassv2:$b), regclassv2:$c))],
489*9880d681SAndroid Build Coastguard Worker                      sop>,
490*9880d681SAndroid Build Coastguard Worker           Requires<[Pred]>;
491*9880d681SAndroid Build Coastguard Worker}
492*9880d681SAndroid Build Coastguard Worker
493*9880d681SAndroid Build Coastguard Workermulticlass VMADV2Only<string asmstr, NVPTXRegClass regclass, NVPTXInst sop=NOP,
494*9880d681SAndroid Build Coastguard Worker  Predicate Pred> {
495*9880d681SAndroid Build Coastguard Worker  def V2 : NVPTXVecInst<(outs regclass:$dst),
496*9880d681SAndroid Build Coastguard Worker    (ins regclass:$a, regclass:$b, regclass:$c),
497*9880d681SAndroid Build Coastguard Worker                      V2MADStr<asmstr>.s,
498*9880d681SAndroid Build Coastguard Worker                      [(set regclass:$dst, (add
499*9880d681SAndroid Build Coastguard Worker                        (mul regclass:$a, regclass:$b), regclass:$c))], sop>,
500*9880d681SAndroid Build Coastguard Worker           Requires<[Pred]>;
501*9880d681SAndroid Build Coastguard Worker}
502*9880d681SAndroid Build Coastguard Workermulticlass VFMADV2Only<string asmstr, NVPTXRegClass regclass, NVPTXInst sop=NOP,
503*9880d681SAndroid Build Coastguard Worker  Predicate Pred> {
504*9880d681SAndroid Build Coastguard Worker  def V2 : NVPTXVecInst<(outs regclass:$dst),
505*9880d681SAndroid Build Coastguard Worker    (ins regclass:$a, regclass:$b, regclass:$c),
506*9880d681SAndroid Build Coastguard Worker                      V2MADStr<asmstr>.s,
507*9880d681SAndroid Build Coastguard Worker                      [(set regclass:$dst, (fadd
508*9880d681SAndroid Build Coastguard Worker                        (fmul regclass:$a, regclass:$b), regclass:$c))], sop>,
509*9880d681SAndroid Build Coastguard Worker           Requires<[Pred]>;
510*9880d681SAndroid Build Coastguard Worker}
511*9880d681SAndroid Build Coastguard Worker
512*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in {
513*9880d681SAndroid Build Coastguard Workerdefm I8MAD  : VMAD<"mad.lo.s16", V4I8Regs, V2I8Regs, add, mul, MAD8rrr, true>;
514*9880d681SAndroid Build Coastguard Workerdefm I16MAD : VMAD<"mad.lo.s16", V4I16Regs, V2I16Regs, add, mul, MAD16rrr,
515*9880d681SAndroid Build Coastguard Worker  true>;
516*9880d681SAndroid Build Coastguard Workerdefm I32MAD : VMAD<"mad.lo.s32", V4I32Regs, V2I32Regs, add, mul, MAD32rrr,
517*9880d681SAndroid Build Coastguard Worker  true>;
518*9880d681SAndroid Build Coastguard Workerdefm I64MAD : VMADV2Only<"mad.lo.s64", V2I64Regs, MAD64rrr, true>;
519*9880d681SAndroid Build Coastguard Worker
520*9880d681SAndroid Build Coastguard Workerdefm VNeg : IntUnaryVOp<"neg.s", ineg, INEG64, INEG32, INEG16, INEG8>;
521*9880d681SAndroid Build Coastguard Worker
522*9880d681SAndroid Build Coastguard Workerdefm VAddf : FloatBinVOp<"add.", fadd, FADDf64rr, FADDf32rr, FADDf32rr_ftz>;
523*9880d681SAndroid Build Coastguard Workerdefm VSubf : FloatBinVOp<"sub.", fsub, FSUBf64rr, FSUBf32rr, FSUBf32rr_ftz>;
524*9880d681SAndroid Build Coastguard Workerdefm VMulf : FloatBinVOp<"mul.", fmul, FMULf64rr, FMULf32rr, FMULf32rr_ftz>;
525*9880d681SAndroid Build Coastguard Worker
526*9880d681SAndroid Build Coastguard Workerdefm F32MAD_ftz : VMAD<"mad.ftz.f32", V4F32Regs, V2F32Regs, fadd, fmul,
527*9880d681SAndroid Build Coastguard Worker  FMAD32_ftzrrr, doFMADF32_ftz>;
528*9880d681SAndroid Build Coastguard Workerdefm F32FMA_ftz : VMAD<"fma.rn.ftz.f32", V4F32Regs, V2F32Regs, fadd, fmul,
529*9880d681SAndroid Build Coastguard Worker  FMA32_ftzrrr, doFMAF32_ftz>;
530*9880d681SAndroid Build Coastguard Workerdefm F32MAD : VMAD<"mad.f32", V4F32Regs, V2F32Regs, fadd, fmul, FMAD32rrr,
531*9880d681SAndroid Build Coastguard Worker  doFMADF32>;
532*9880d681SAndroid Build Coastguard Workerdefm F32FMA : VMAD<"fma.rn.f32", V4F32Regs, V2F32Regs, fadd, fmul, FMA32rrr,
533*9880d681SAndroid Build Coastguard Worker  doFMAF32>;
534*9880d681SAndroid Build Coastguard Workerdefm F64FMA : VFMADV2Only<"fma.rn.f64", V2F64Regs, FMA64rrr, doFMAF64>;
535*9880d681SAndroid Build Coastguard Worker}
536*9880d681SAndroid Build Coastguard Worker
537*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in {
538*9880d681SAndroid Build Coastguard Workerdef V4F32Div_prec_ftz : VecBinaryOp<V4AsmStr<"div.rn.ftz.f32">, fdiv, V4F32Regs,
539*9880d681SAndroid Build Coastguard Worker  FDIV32rr_prec_ftz>, Requires<[doF32FTZ, reqPTX20]>;
540*9880d681SAndroid Build Coastguard Workerdef V2F32Div_prec_ftz : VecBinaryOp<V2AsmStr<"div.rn.ftz.f32">, fdiv, V2F32Regs,
541*9880d681SAndroid Build Coastguard Worker  FDIV32rr_prec_ftz>, Requires<[doF32FTZ, reqPTX20]>;
542*9880d681SAndroid Build Coastguard Workerdef V4F32Div_prec : VecBinaryOp<V4AsmStr<"div.rn.f32">, fdiv, V4F32Regs,
543*9880d681SAndroid Build Coastguard Worker  FDIV32rr_prec>, Requires<[reqPTX20]>;
544*9880d681SAndroid Build Coastguard Workerdef V2F32Div_prec : VecBinaryOp<V2AsmStr<"div.rn.f32">, fdiv, V2F32Regs,
545*9880d681SAndroid Build Coastguard Worker  FDIV32rr_prec>, Requires<[reqPTX20]>;
546*9880d681SAndroid Build Coastguard Workerdef V2F32Div_ftz : VecBinaryOp<V2AsmStr<"div.full.ftz.f32">, fdiv, V2F32Regs,
547*9880d681SAndroid Build Coastguard Worker  FDIV32rr_ftz>, Requires<[doF32FTZ]>;
548*9880d681SAndroid Build Coastguard Workerdef V4F32Div_ftz : VecBinaryOp<V4AsmStr<"div.full.ftz.f32">, fdiv, V4F32Regs,
549*9880d681SAndroid Build Coastguard Worker  FDIV32rr_ftz>, Requires<[doF32FTZ]>;
550*9880d681SAndroid Build Coastguard Workerdef V2F32Div : VecBinaryOp<V2AsmStr<"div.full.f32">, fdiv, V2F32Regs, FDIV32rr>;
551*9880d681SAndroid Build Coastguard Workerdef V4F32Div : VecBinaryOp<V4AsmStr<"div.full.f32">, fdiv, V4F32Regs, FDIV32rr>;
552*9880d681SAndroid Build Coastguard Workerdef V2F64Div : VecBinaryOp<V2AsmStr<"div.rn.f64">, fdiv, V2F64Regs, FDIV64rr>;
553*9880d681SAndroid Build Coastguard Worker}
554*9880d681SAndroid Build Coastguard Worker
555*9880d681SAndroid Build Coastguard Workerdef fnegpat : PatFrag<(ops node:$in), (fneg node:$in)>;
556*9880d681SAndroid Build Coastguard Worker
557*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in {
558*9880d681SAndroid Build Coastguard Workerdef VNegv2f32_ftz : VecUnaryOp<V2UnaryStr<"neg.ftz.f32">, fnegpat, V2F32Regs,
559*9880d681SAndroid Build Coastguard Worker  FNEGf32_ftz>, Requires<[doF32FTZ]>;
560*9880d681SAndroid Build Coastguard Workerdef VNegv4f32_ftz : VecUnaryOp<V4UnaryStr<"neg.ftz.f32">, fnegpat, V4F32Regs,
561*9880d681SAndroid Build Coastguard Worker  FNEGf32_ftz>, Requires<[doF32FTZ]>;
562*9880d681SAndroid Build Coastguard Workerdef VNegv2f32 : VecUnaryOp<V2UnaryStr<"neg.f32">, fnegpat, V2F32Regs, FNEGf32>;
563*9880d681SAndroid Build Coastguard Workerdef VNegv4f32 : VecUnaryOp<V4UnaryStr<"neg.f32">, fnegpat, V4F32Regs, FNEGf32>;
564*9880d681SAndroid Build Coastguard Workerdef VNegv2f64 : VecUnaryOp<V2UnaryStr<"neg.f64">, fnegpat, V2F64Regs, FNEGf64>;
565*9880d681SAndroid Build Coastguard Worker
566*9880d681SAndroid Build Coastguard Worker// Logical Arithmetic
567*9880d681SAndroid Build Coastguard Workerdefm VAnd : IntBinVOp<"and.b", and, ANDb64rr, ANDb32rr, ANDb16rr, ANDb8rr>;
568*9880d681SAndroid Build Coastguard Workerdefm VOr  : IntBinVOp<"or.b", or, ORb64rr, ORb32rr, ORb16rr, ORb8rr>;
569*9880d681SAndroid Build Coastguard Workerdefm VXor : IntBinVOp<"xor.b", xor, XORb64rr, XORb32rr, XORb16rr, XORb8rr>;
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Workerdefm VNot : IntUnaryVOp<"not.b", not, NOT64, NOT32, NOT16, NOT8>;
572*9880d681SAndroid Build Coastguard Worker}
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Worker
575*9880d681SAndroid Build Coastguard Workermulticlass V2FPCONTRACT32_SUB_PAT<NVPTXInst Inst, Predicate Pred> {
576*9880d681SAndroid Build Coastguard Worker  def : Pat<(fsub V2F32Regs:$a, (fmul V2F32Regs:$b, V2F32Regs:$c)),
577*9880d681SAndroid Build Coastguard Worker          (Inst (VNegv2f32 V2F32Regs:$b), V2F32Regs:$c,  V2F32Regs:$a)>,
578*9880d681SAndroid Build Coastguard Worker          Requires<[Pred]>;
579*9880d681SAndroid Build Coastguard Worker
580*9880d681SAndroid Build Coastguard Worker  def : Pat<(fsub (fmul V2F32Regs:$a, V2F32Regs:$b), V2F32Regs:$c),
581*9880d681SAndroid Build Coastguard Worker          (Inst V2F32Regs:$a, V2F32Regs:$b, (VNegv2f32 V2F32Regs:$c))>,
582*9880d681SAndroid Build Coastguard Worker          Requires<[Pred]>;
583*9880d681SAndroid Build Coastguard Worker}
584*9880d681SAndroid Build Coastguard Worker
585*9880d681SAndroid Build Coastguard Workerdefm V2FMAF32ext_ftz  : V2FPCONTRACT32_SUB_PAT<F32FMA_ftzV2, doFMAF32AGG_ftz>;
586*9880d681SAndroid Build Coastguard Workerdefm V2FMADF32ext_ftz : V2FPCONTRACT32_SUB_PAT<F32MAD_ftzV2, doFMADF32_ftz>;
587*9880d681SAndroid Build Coastguard Workerdefm V2FMAF32ext  : V2FPCONTRACT32_SUB_PAT<F32FMAV2, doFMAF32AGG>;
588*9880d681SAndroid Build Coastguard Workerdefm V2FMADF32ext : V2FPCONTRACT32_SUB_PAT<F32MADV2, doFMADF32>;
589*9880d681SAndroid Build Coastguard Worker
590*9880d681SAndroid Build Coastguard Workermulticlass V4FPCONTRACT32_SUB_PAT<NVPTXInst Inst, Predicate Pred> {
591*9880d681SAndroid Build Coastguard Worker  def : Pat<(fsub V4F32Regs:$a, (fmul V4F32Regs:$b, V4F32Regs:$c)),
592*9880d681SAndroid Build Coastguard Worker          (Inst (VNegv4f32 V4F32Regs:$b), V4F32Regs:$c,  V4F32Regs:$a)>,
593*9880d681SAndroid Build Coastguard Worker          Requires<[Pred]>;
594*9880d681SAndroid Build Coastguard Worker
595*9880d681SAndroid Build Coastguard Worker  def : Pat<(fsub (fmul V4F32Regs:$a, V4F32Regs:$b), V4F32Regs:$c),
596*9880d681SAndroid Build Coastguard Worker          (Inst V4F32Regs:$a, V4F32Regs:$b, (VNegv4f32 V4F32Regs:$c))>,
597*9880d681SAndroid Build Coastguard Worker          Requires<[Pred]>;
598*9880d681SAndroid Build Coastguard Worker}
599*9880d681SAndroid Build Coastguard Worker
600*9880d681SAndroid Build Coastguard Workerdefm V4FMAF32ext_ftz  : V4FPCONTRACT32_SUB_PAT<F32FMA_ftzV4, doFMAF32AGG_ftz>;
601*9880d681SAndroid Build Coastguard Workerdefm V4FMADF32ext_ftz : V4FPCONTRACT32_SUB_PAT<F32MAD_ftzV4, doFMADF32_ftz>;
602*9880d681SAndroid Build Coastguard Workerdefm V4FMAF32ext  : V4FPCONTRACT32_SUB_PAT<F32FMAV4, doFMAF32AGG>;
603*9880d681SAndroid Build Coastguard Workerdefm V4FMADF32ext : V4FPCONTRACT32_SUB_PAT<F32MADV4, doFMADF32>;
604*9880d681SAndroid Build Coastguard Worker
605*9880d681SAndroid Build Coastguard Workermulticlass V2FPCONTRACT64_SUB_PAT<NVPTXInst Inst, Predicate Pred> {
606*9880d681SAndroid Build Coastguard Worker  def : Pat<(fsub V2F64Regs:$a, (fmul V2F64Regs:$b, V2F64Regs:$c)),
607*9880d681SAndroid Build Coastguard Worker          (Inst (VNegv2f64 V2F64Regs:$b), V2F64Regs:$c, V2F64Regs:$a)>,
608*9880d681SAndroid Build Coastguard Worker          Requires<[Pred]>;
609*9880d681SAndroid Build Coastguard Worker
610*9880d681SAndroid Build Coastguard Worker  def : Pat<(fsub (fmul V2F64Regs:$a, V2F64Regs:$b), V2F64Regs:$c),
611*9880d681SAndroid Build Coastguard Worker          (Inst V2F64Regs:$a, V2F64Regs:$b, (VNegv2f64 V2F64Regs:$c))>,
612*9880d681SAndroid Build Coastguard Worker          Requires<[Pred]>;
613*9880d681SAndroid Build Coastguard Worker}
614*9880d681SAndroid Build Coastguard Worker
615*9880d681SAndroid Build Coastguard Workerdefm V2FMAF64ext : V2FPCONTRACT64_SUB_PAT<F64FMAV2, doFMAF64AGG>;
616*9880d681SAndroid Build Coastguard Worker
617*9880d681SAndroid Build Coastguard Workerclass VecModStr<string vecsize, string elem, string extra, string l="">
618*9880d681SAndroid Build Coastguard Worker{
619*9880d681SAndroid Build Coastguard Worker  string t1 = !strconcat("${c", elem);
620*9880d681SAndroid Build Coastguard Worker  string t2 = !strconcat(t1, ":vecv");
621*9880d681SAndroid Build Coastguard Worker  string t3 = !strconcat(t2, vecsize);
622*9880d681SAndroid Build Coastguard Worker  string t4 = !strconcat(t3, extra);
623*9880d681SAndroid Build Coastguard Worker  string t5 = !strconcat(t4, l);
624*9880d681SAndroid Build Coastguard Worker  string s =  !strconcat(t5, "}");
625*9880d681SAndroid Build Coastguard Worker}
626*9880d681SAndroid Build Coastguard Workerclass ShuffleOneLine<string vecsize, string elem, string type>
627*9880d681SAndroid Build Coastguard Worker{
628*9880d681SAndroid Build Coastguard Worker  string t1 = VecModStr<vecsize, elem, "comm", "1">.s;
629*9880d681SAndroid Build Coastguard Worker  string t2 = !strconcat(t1, "mov.");
630*9880d681SAndroid Build Coastguard Worker  string t3 = !strconcat(t2, type);
631*9880d681SAndroid Build Coastguard Worker  string t4 = !strconcat(t3, " \t${dst}_");
632*9880d681SAndroid Build Coastguard Worker  string t5 = !strconcat(t4, elem);
633*9880d681SAndroid Build Coastguard Worker  string t6 = !strconcat(t5, ", $src1");
634*9880d681SAndroid Build Coastguard Worker  string t7 = !strconcat(t6, VecModStr<vecsize, elem, "pos">.s);
635*9880d681SAndroid Build Coastguard Worker  string t8 = !strconcat(t7, ";\n\t");
636*9880d681SAndroid Build Coastguard Worker  string t9 = !strconcat(t8, VecModStr<vecsize, elem, "comm", "2">.s);
637*9880d681SAndroid Build Coastguard Worker  string t10 = !strconcat(t9, "mov.");
638*9880d681SAndroid Build Coastguard Worker  string t11 = !strconcat(t10, type);
639*9880d681SAndroid Build Coastguard Worker  string t12 = !strconcat(t11, " \t${dst}_");
640*9880d681SAndroid Build Coastguard Worker  string t13 = !strconcat(t12, elem);
641*9880d681SAndroid Build Coastguard Worker  string t14 = !strconcat(t13, ", $src2");
642*9880d681SAndroid Build Coastguard Worker  string t15 = !strconcat(t14, VecModStr<vecsize, elem, "pos">.s);
643*9880d681SAndroid Build Coastguard Worker  string s =   !strconcat(t15, ";");
644*9880d681SAndroid Build Coastguard Worker}
645*9880d681SAndroid Build Coastguard Workerclass ShuffleAsmStr2<string type>
646*9880d681SAndroid Build Coastguard Worker{
647*9880d681SAndroid Build Coastguard Worker  string t1 = ShuffleOneLine<"2", "0", type>.s;
648*9880d681SAndroid Build Coastguard Worker  string t2 = !strconcat(t1, "\n\t");
649*9880d681SAndroid Build Coastguard Worker  string s  = !strconcat(t2, ShuffleOneLine<"2", "1", type>.s);
650*9880d681SAndroid Build Coastguard Worker}
651*9880d681SAndroid Build Coastguard Workerclass ShuffleAsmStr4<string type>
652*9880d681SAndroid Build Coastguard Worker{
653*9880d681SAndroid Build Coastguard Worker  string t1 = ShuffleOneLine<"4", "0", type>.s;
654*9880d681SAndroid Build Coastguard Worker  string t2 = !strconcat(t1, "\n\t");
655*9880d681SAndroid Build Coastguard Worker  string t3 = !strconcat(t2, ShuffleOneLine<"4", "1", type>.s);
656*9880d681SAndroid Build Coastguard Worker  string t4 = !strconcat(t3, "\n\t");
657*9880d681SAndroid Build Coastguard Worker  string t5 = !strconcat(t4, ShuffleOneLine<"4", "2", type>.s);
658*9880d681SAndroid Build Coastguard Worker  string t6 = !strconcat(t5, "\n\t");
659*9880d681SAndroid Build Coastguard Worker  string s  = !strconcat(t6, ShuffleOneLine<"4", "3", type>.s);
660*9880d681SAndroid Build Coastguard Worker}
661*9880d681SAndroid Build Coastguard Worker
662*9880d681SAndroid Build Coastguard Workerlet hasSideEffects=0, VecInstType=isVecShuffle.Value in {
663*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v4f32 : NVPTXVecInst<(outs V4F32Regs:$dst),
664*9880d681SAndroid Build Coastguard Worker                       (ins  V4F32Regs:$src1, V4F32Regs:$src2,
665*9880d681SAndroid Build Coastguard Worker                             i8imm:$c0, i8imm:$c1, i8imm:$c2, i8imm:$c3),
666*9880d681SAndroid Build Coastguard Worker                 !strconcat("//Mov $dst, $src1, $src2, $c0, $c1, $c2, $c3;\n\t",
667*9880d681SAndroid Build Coastguard Worker                                 ShuffleAsmStr4<"f32">.s),
668*9880d681SAndroid Build Coastguard Worker                       [], FMOV32rr>;
669*9880d681SAndroid Build Coastguard Worker
670*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v4i32 : NVPTXVecInst<(outs V4I32Regs:$dst),
671*9880d681SAndroid Build Coastguard Worker                       (ins  V4I32Regs:$src1, V4I32Regs:$src2,
672*9880d681SAndroid Build Coastguard Worker                             i8imm:$c0, i8imm:$c1, i8imm:$c2, i8imm:$c3),
673*9880d681SAndroid Build Coastguard Worker                 !strconcat("//Mov $dst, $src1, $src2, $c0, $c1, $c2, $c3;\n\t",
674*9880d681SAndroid Build Coastguard Worker                                 ShuffleAsmStr4<"u32">.s),
675*9880d681SAndroid Build Coastguard Worker                       [], IMOV32rr>;
676*9880d681SAndroid Build Coastguard Worker
677*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v4i16 : NVPTXVecInst<(outs V4I16Regs:$dst),
678*9880d681SAndroid Build Coastguard Worker                       (ins  V4I16Regs:$src1, V4I16Regs:$src2,
679*9880d681SAndroid Build Coastguard Worker                             i8imm:$c0, i8imm:$c1, i8imm:$c2, i8imm:$c3),
680*9880d681SAndroid Build Coastguard Worker                 !strconcat("//Mov $dst, $src1, $src2, $c0, $c1, $c2, $c3;\n\t",
681*9880d681SAndroid Build Coastguard Worker                                 ShuffleAsmStr4<"u16">.s),
682*9880d681SAndroid Build Coastguard Worker                       [], IMOV16rr>;
683*9880d681SAndroid Build Coastguard Worker
684*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v4i8 : NVPTXVecInst<(outs V4I8Regs:$dst),
685*9880d681SAndroid Build Coastguard Worker                       (ins  V4I8Regs:$src1, V4I8Regs:$src2,
686*9880d681SAndroid Build Coastguard Worker                             i8imm:$c0, i8imm:$c1, i8imm:$c2, i8imm:$c3),
687*9880d681SAndroid Build Coastguard Worker                 !strconcat("//Mov $dst, $src1, $src2, $c0, $c1, $c2, $c3;\n\t",
688*9880d681SAndroid Build Coastguard Worker                                 ShuffleAsmStr4<"u16">.s),
689*9880d681SAndroid Build Coastguard Worker                       [], IMOV8rr>;
690*9880d681SAndroid Build Coastguard Worker
691*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2f32 : NVPTXVecInst<(outs V2F32Regs:$dst),
692*9880d681SAndroid Build Coastguard Worker                       (ins  V2F32Regs:$src1, V2F32Regs:$src2,
693*9880d681SAndroid Build Coastguard Worker                             i8imm:$c0, i8imm:$c1),
694*9880d681SAndroid Build Coastguard Worker                       !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t",
695*9880d681SAndroid Build Coastguard Worker                                 ShuffleAsmStr2<"f32">.s),
696*9880d681SAndroid Build Coastguard Worker                       [], FMOV32rr>;
697*9880d681SAndroid Build Coastguard Worker
698*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2i32 : NVPTXVecInst<(outs V2I32Regs:$dst),
699*9880d681SAndroid Build Coastguard Worker                       (ins  V2I32Regs:$src1, V2I32Regs:$src2,
700*9880d681SAndroid Build Coastguard Worker                             i8imm:$c0, i8imm:$c1),
701*9880d681SAndroid Build Coastguard Worker                       !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t",
702*9880d681SAndroid Build Coastguard Worker                                 ShuffleAsmStr2<"u32">.s),
703*9880d681SAndroid Build Coastguard Worker                       [], IMOV32rr>;
704*9880d681SAndroid Build Coastguard Worker
705*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2i8 : NVPTXVecInst<(outs V2I8Regs:$dst),
706*9880d681SAndroid Build Coastguard Worker                       (ins  V2I8Regs:$src1, V2I8Regs:$src2,
707*9880d681SAndroid Build Coastguard Worker                             i8imm:$c0, i8imm:$c1),
708*9880d681SAndroid Build Coastguard Worker                       !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t",
709*9880d681SAndroid Build Coastguard Worker                                 ShuffleAsmStr2<"u16">.s),
710*9880d681SAndroid Build Coastguard Worker                       [], IMOV8rr>;
711*9880d681SAndroid Build Coastguard Worker
712*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2i16 : NVPTXVecInst<(outs V2I16Regs:$dst),
713*9880d681SAndroid Build Coastguard Worker                       (ins  V2I16Regs:$src1, V2I16Regs:$src2,
714*9880d681SAndroid Build Coastguard Worker                             i8imm:$c0, i8imm:$c1),
715*9880d681SAndroid Build Coastguard Worker                       !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t",
716*9880d681SAndroid Build Coastguard Worker                                 ShuffleAsmStr2<"u16">.s),
717*9880d681SAndroid Build Coastguard Worker                       [], IMOV16rr>;
718*9880d681SAndroid Build Coastguard Worker
719*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2f64 : NVPTXVecInst<(outs V2F64Regs:$dst),
720*9880d681SAndroid Build Coastguard Worker                       (ins  V2F64Regs:$src1, V2F64Regs:$src2,
721*9880d681SAndroid Build Coastguard Worker                             i8imm:$c0, i8imm:$c1),
722*9880d681SAndroid Build Coastguard Worker                       !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t",
723*9880d681SAndroid Build Coastguard Worker                                 ShuffleAsmStr2<"f64">.s),
724*9880d681SAndroid Build Coastguard Worker                       [], FMOV64rr>;
725*9880d681SAndroid Build Coastguard Worker
726*9880d681SAndroid Build Coastguard Workerdef VecShuffle_v2i64 : NVPTXVecInst<(outs V2I64Regs:$dst),
727*9880d681SAndroid Build Coastguard Worker                       (ins  V2I64Regs:$src1, V2I64Regs:$src2,
728*9880d681SAndroid Build Coastguard Worker                             i8imm:$c0, i8imm:$c1),
729*9880d681SAndroid Build Coastguard Worker                       !strconcat("//Mov $dst, $src1, $src2, $c0, $c1;\n\t",
730*9880d681SAndroid Build Coastguard Worker                                 ShuffleAsmStr2<"u64">.s),
731*9880d681SAndroid Build Coastguard Worker                       [], IMOV64rr>;
732*9880d681SAndroid Build Coastguard Worker}
733*9880d681SAndroid Build Coastguard Worker
734*9880d681SAndroid Build Coastguard Workerdef ShuffleMask0 : SDNodeXForm<vector_shuffle, [{
735*9880d681SAndroid Build Coastguard Worker  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N);
736*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(SVOp->getMaskElt(0), SDLoc(N), MVT::i32);
737*9880d681SAndroid Build Coastguard Worker}]>;
738*9880d681SAndroid Build Coastguard Workerdef ShuffleMask1 : SDNodeXForm<vector_shuffle, [{
739*9880d681SAndroid Build Coastguard Worker  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N);
740*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(SVOp->getMaskElt(1), SDLoc(N), MVT::i32);
741*9880d681SAndroid Build Coastguard Worker}]>;
742*9880d681SAndroid Build Coastguard Workerdef ShuffleMask2 : SDNodeXForm<vector_shuffle, [{
743*9880d681SAndroid Build Coastguard Worker  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N);
744*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(SVOp->getMaskElt(2), SDLoc(N), MVT::i32);
745*9880d681SAndroid Build Coastguard Worker}]>;
746*9880d681SAndroid Build Coastguard Workerdef ShuffleMask3 : SDNodeXForm<vector_shuffle, [{
747*9880d681SAndroid Build Coastguard Worker  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N);
748*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(SVOp->getMaskElt(3), SDLoc(N), MVT::i32);
749*9880d681SAndroid Build Coastguard Worker}]>;
750*9880d681SAndroid Build Coastguard Worker
751*9880d681SAndroid Build Coastguard Worker// The spurious call is here to silence a compiler warning about N being
752*9880d681SAndroid Build Coastguard Worker// unused.
753*9880d681SAndroid Build Coastguard Workerdef vec_shuf : PatFrag<(ops node:$lhs, node:$rhs),
754*9880d681SAndroid Build Coastguard Worker                       (vector_shuffle node:$lhs, node:$rhs),
755*9880d681SAndroid Build Coastguard Worker                       [{ N->getGluedNode(); return true; }]>;
756*9880d681SAndroid Build Coastguard Worker
757*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (vec_shuf:$op V2F64Regs:$src1, V2F64Regs:$src2)),
758*9880d681SAndroid Build Coastguard Worker          (VecShuffle_v2f64 V2F64Regs:$src1, V2F64Regs:$src2,
759*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>;
760*9880d681SAndroid Build Coastguard Worker
761*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (vec_shuf:$op V4F32Regs:$src1, V4F32Regs:$src2)),
762*9880d681SAndroid Build Coastguard Worker          (VecShuffle_v4f32 V4F32Regs:$src1, V4F32Regs:$src2,
763*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask0 node:$op), (ShuffleMask1 node:$op),
764*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask2 node:$op), (ShuffleMask3 node:$op))>;
765*9880d681SAndroid Build Coastguard Worker
766*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (vec_shuf:$op V2F32Regs:$src1, V2F32Regs:$src2)),
767*9880d681SAndroid Build Coastguard Worker          (VecShuffle_v2f32 V2F32Regs:$src1, V2F32Regs:$src2,
768*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>;
769*9880d681SAndroid Build Coastguard Worker
770*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (vec_shuf:$op V2I64Regs:$src1, V2I64Regs:$src2)),
771*9880d681SAndroid Build Coastguard Worker          (VecShuffle_v2i64 V2I64Regs:$src1, V2I64Regs:$src2,
772*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>;
773*9880d681SAndroid Build Coastguard Worker
774*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (vec_shuf:$op V4I32Regs:$src1, V4I32Regs:$src2)),
775*9880d681SAndroid Build Coastguard Worker          (VecShuffle_v4i32 V4I32Regs:$src1, V4I32Regs:$src2,
776*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask0 node:$op), (ShuffleMask1 node:$op),
777*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask2 node:$op), (ShuffleMask3 node:$op))>;
778*9880d681SAndroid Build Coastguard Worker
779*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (vec_shuf:$op V2I32Regs:$src1, V2I32Regs:$src2)),
780*9880d681SAndroid Build Coastguard Worker          (VecShuffle_v2i32 V2I32Regs:$src1, V2I32Regs:$src2,
781*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>;
782*9880d681SAndroid Build Coastguard Worker
783*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (vec_shuf:$op V4I16Regs:$src1, V4I16Regs:$src2)),
784*9880d681SAndroid Build Coastguard Worker          (VecShuffle_v4i16 V4I16Regs:$src1, V4I16Regs:$src2,
785*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask0 node:$op), (ShuffleMask1 node:$op),
786*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask2 node:$op), (ShuffleMask3 node:$op))>;
787*9880d681SAndroid Build Coastguard Worker
788*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (vec_shuf:$op V2I16Regs:$src1, V2I16Regs:$src2)),
789*9880d681SAndroid Build Coastguard Worker          (VecShuffle_v2i16 V2I16Regs:$src1, V2I16Regs:$src2,
790*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>;
791*9880d681SAndroid Build Coastguard Worker
792*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i8 (vec_shuf:$op V4I8Regs:$src1, V4I8Regs:$src2)),
793*9880d681SAndroid Build Coastguard Worker          (VecShuffle_v4i8 V4I8Regs:$src1, V4I8Regs:$src2,
794*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask0 node:$op), (ShuffleMask1 node:$op),
795*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask2 node:$op), (ShuffleMask3 node:$op))>;
796*9880d681SAndroid Build Coastguard Worker
797*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i8 (vec_shuf:$op V2I8Regs:$src1, V2I8Regs:$src2)),
798*9880d681SAndroid Build Coastguard Worker          (VecShuffle_v2i8 V2I8Regs:$src1, V2I8Regs:$src2,
799*9880d681SAndroid Build Coastguard Worker                            (ShuffleMask0 node:$op), (ShuffleMask1 node:$op))>;
800*9880d681SAndroid Build Coastguard Worker
801*9880d681SAndroid Build Coastguard Workerclass Build_Vector2<string asmstr, NVPTXRegClass vclass, NVPTXRegClass sclass,
802*9880d681SAndroid Build Coastguard Worker  NVPTXInst si>
803*9880d681SAndroid Build Coastguard Worker                   : NVPTXVecInst<(outs vclass:$dst),
804*9880d681SAndroid Build Coastguard Worker                   (ins  sclass:$a1, sclass:$a2),
805*9880d681SAndroid Build Coastguard Worker                   !strconcat(asmstr, "\t${dst:vecfull}, {{$a1, $a2}};"),
806*9880d681SAndroid Build Coastguard Worker                   [(set vclass:$dst, (build_vector sclass:$a1, sclass:$a2))],
807*9880d681SAndroid Build Coastguard Worker                   si>;
808*9880d681SAndroid Build Coastguard Workerclass Build_Vector4<string asmstr, NVPTXRegClass vclass, NVPTXRegClass sclass,
809*9880d681SAndroid Build Coastguard Worker  NVPTXInst si>
810*9880d681SAndroid Build Coastguard Worker                   : NVPTXVecInst<(outs vclass:$dst),
811*9880d681SAndroid Build Coastguard Worker                   (ins  sclass:$a1, sclass:$a2, sclass:$a3, sclass:$a4),
812*9880d681SAndroid Build Coastguard Worker               !strconcat(asmstr, "\t${dst:vecfull}, {{$a1, $a2, $a3, $a4}};"),
813*9880d681SAndroid Build Coastguard Worker                   [(set vclass:$dst,
814*9880d681SAndroid Build Coastguard Worker                     (build_vector sclass:$a1, sclass:$a2,
815*9880d681SAndroid Build Coastguard Worker                       sclass:$a3, sclass:$a4))], si>;
816*9880d681SAndroid Build Coastguard Worker
817*9880d681SAndroid Build Coastguard Workerlet isAsCheapAsAMove=1, VecInstType=isVecBuild.Value in {
818*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_f32 : Build_Vector2<"mov.v2.f32", V2F32Regs, Float32Regs,
819*9880d681SAndroid Build Coastguard Worker  FMOV32rr>;
820*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_f64 : Build_Vector2<"mov.v2.f64", V2F64Regs, Float64Regs,
821*9880d681SAndroid Build Coastguard Worker  FMOV64rr>;
822*9880d681SAndroid Build Coastguard Worker
823*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_i32 : Build_Vector2<"mov.v2.u32", V2I32Regs, Int32Regs,
824*9880d681SAndroid Build Coastguard Worker  IMOV32rr>;
825*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_i64 : Build_Vector2<"mov.v2.u64", V2I64Regs, Int64Regs,
826*9880d681SAndroid Build Coastguard Worker  IMOV64rr>;
827*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_i16 : Build_Vector2<"mov.v2.u16", V2I16Regs, Int16Regs,
828*9880d681SAndroid Build Coastguard Worker  IMOV16rr>;
829*9880d681SAndroid Build Coastguard Workerdef Build_Vector2_i8  : Build_Vector2<"mov.v2.u16",  V2I8Regs,  Int8Regs,
830*9880d681SAndroid Build Coastguard Worker  IMOV8rr>;
831*9880d681SAndroid Build Coastguard Worker
832*9880d681SAndroid Build Coastguard Workerdef Build_Vector4_f32 : Build_Vector4<"mov.v4.f32", V4F32Regs, Float32Regs,
833*9880d681SAndroid Build Coastguard Worker  FMOV32rr>;
834*9880d681SAndroid Build Coastguard Worker
835*9880d681SAndroid Build Coastguard Workerdef Build_Vector4_i32 : Build_Vector4<"mov.v4.u32", V4I32Regs, Int32Regs,
836*9880d681SAndroid Build Coastguard Worker  IMOV32rr>;
837*9880d681SAndroid Build Coastguard Workerdef Build_Vector4_i16 : Build_Vector4<"mov.v4.u16", V4I16Regs, Int16Regs,
838*9880d681SAndroid Build Coastguard Worker  IMOV16rr>;
839*9880d681SAndroid Build Coastguard Workerdef Build_Vector4_i8  : Build_Vector4<"mov.v4.u16", V4I8Regs, Int8Regs,
840*9880d681SAndroid Build Coastguard Worker  IMOV8rr>;
841*9880d681SAndroid Build Coastguard Worker}
842*9880d681SAndroid Build Coastguard Worker
843*9880d681SAndroid Build Coastguard Workerclass Vec_Move<string asmstr, NVPTXRegClass vclass, NVPTXInst sop=NOP>
844*9880d681SAndroid Build Coastguard Worker                 : NVPTXVecInst<(outs vclass:$dst), (ins vclass:$src),
845*9880d681SAndroid Build Coastguard Worker                   !strconcat(asmstr, "\t${dst:vecfull}, ${src:vecfull};"),
846*9880d681SAndroid Build Coastguard Worker                   [], sop>;
847*9880d681SAndroid Build Coastguard Worker
848*9880d681SAndroid Build Coastguard Workerlet isAsCheapAsAMove=1, hasSideEffects=0, IsSimpleMove=1,
849*9880d681SAndroid Build Coastguard Worker  VecInstType=isVecOther.Value in {
850*9880d681SAndroid Build Coastguard Workerdef V4f32Mov : Vec_Move<"mov.v4.f32", V4F32Regs, FMOV32rr>;
851*9880d681SAndroid Build Coastguard Workerdef V2f32Mov : Vec_Move<"mov.v2.f32", V2F32Regs, FMOV32rr>;
852*9880d681SAndroid Build Coastguard Worker
853*9880d681SAndroid Build Coastguard Workerdef V4i32Mov : Vec_Move<"mov.v4.u32", V4I32Regs, IMOV32rr>;
854*9880d681SAndroid Build Coastguard Workerdef V2i32Mov : Vec_Move<"mov.v2.u32", V2I32Regs, IMOV32rr>;
855*9880d681SAndroid Build Coastguard Worker
856*9880d681SAndroid Build Coastguard Workerdef V4i16Mov : Vec_Move<"mov.v4.u16", V4I16Regs, IMOV16rr>;
857*9880d681SAndroid Build Coastguard Workerdef V2i16Mov : Vec_Move<"mov.v2.u16", V2I16Regs, IMOV16rr>;
858*9880d681SAndroid Build Coastguard Worker
859*9880d681SAndroid Build Coastguard Workerdef V4i8Mov : Vec_Move<"mov.v4.u16", V4I8Regs, IMOV8rr>;
860*9880d681SAndroid Build Coastguard Workerdef V2i8Mov : Vec_Move<"mov.v2.u16", V2I8Regs, IMOV8rr>;
861*9880d681SAndroid Build Coastguard Worker
862*9880d681SAndroid Build Coastguard Workerdef V2f64Mov : Vec_Move<"mov.v2.f64", V2F64Regs, FMOV64rr>;
863*9880d681SAndroid Build Coastguard Workerdef V2i64Mov : Vec_Move<"mov.v2.u64", V2I64Regs, IMOV64rr>;
864*9880d681SAndroid Build Coastguard Worker}
865*9880d681SAndroid Build Coastguard Worker
866*9880d681SAndroid Build Coastguard Worker// extract subvector patterns
867*9880d681SAndroid Build Coastguard Workerdef extract_subvec : SDNode<"ISD::EXTRACT_SUBVECTOR",
868*9880d681SAndroid Build Coastguard Worker                        SDTypeProfile<1, 2, [SDTCisPtrTy<2>]>>;
869*9880d681SAndroid Build Coastguard Worker
870*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (extract_subvec V4F32Regs:$src, 0)),
871*9880d681SAndroid Build Coastguard Worker                 (Build_Vector2_f32 (V4f32Extract V4F32Regs:$src, 0),
872*9880d681SAndroid Build Coastguard Worker                                    (V4f32Extract V4F32Regs:$src, 1))>;
873*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (extract_subvec V4F32Regs:$src, 2)),
874*9880d681SAndroid Build Coastguard Worker                 (Build_Vector2_f32 (V4f32Extract V4F32Regs:$src, 2),
875*9880d681SAndroid Build Coastguard Worker                                    (V4f32Extract V4F32Regs:$src, 3))>;
876*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (extract_subvec V4I32Regs:$src, 0)),
877*9880d681SAndroid Build Coastguard Worker                 (Build_Vector2_i32 (V4i32Extract V4I32Regs:$src, 0),
878*9880d681SAndroid Build Coastguard Worker                                    (V4i32Extract V4I32Regs:$src, 1))>;
879*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (extract_subvec V4I32Regs:$src, 2)),
880*9880d681SAndroid Build Coastguard Worker                 (Build_Vector2_i32 (V4i32Extract V4I32Regs:$src, 2),
881*9880d681SAndroid Build Coastguard Worker                                    (V4i32Extract V4I32Regs:$src, 3))>;
882*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (extract_subvec V4I16Regs:$src, 0)),
883*9880d681SAndroid Build Coastguard Worker                 (Build_Vector2_i16 (V4i16Extract V4I16Regs:$src, 0),
884*9880d681SAndroid Build Coastguard Worker                                    (V4i16Extract V4I16Regs:$src, 1))>;
885*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (extract_subvec V4I16Regs:$src, 2)),
886*9880d681SAndroid Build Coastguard Worker                 (Build_Vector2_i16 (V4i16Extract V4I16Regs:$src, 2),
887*9880d681SAndroid Build Coastguard Worker                                    (V4i16Extract V4I16Regs:$src, 3))>;
888*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i8 (extract_subvec V4I8Regs:$src, 0)),
889*9880d681SAndroid Build Coastguard Worker                 (Build_Vector2_i8 (V4i8Extract V4I8Regs:$src, 0),
890*9880d681SAndroid Build Coastguard Worker                                    (V4i8Extract V4I8Regs:$src, 1))>;
891*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i8 (extract_subvec V4I8Regs:$src, 2)),
892*9880d681SAndroid Build Coastguard Worker                 (Build_Vector2_i8 (V4i8Extract V4I8Regs:$src, 2),
893*9880d681SAndroid Build Coastguard Worker                                    (V4i8Extract V4I8Regs:$src, 3))>;
894*9880d681SAndroid Build Coastguard Worker
895*9880d681SAndroid Build Coastguard Worker// Select instructions
896*9880d681SAndroid Build Coastguard Workerclass Select_OneLine<string type, string pos> {
897*9880d681SAndroid Build Coastguard Worker  string t1 = !strconcat("selp.", type);
898*9880d681SAndroid Build Coastguard Worker  string t2 = !strconcat(t1, " \t${dst}_");
899*9880d681SAndroid Build Coastguard Worker  string t3 = !strconcat(t2, pos);
900*9880d681SAndroid Build Coastguard Worker  string t4 = !strconcat(t3, ", ${src1}_");
901*9880d681SAndroid Build Coastguard Worker  string t5 = !strconcat(t4, pos);
902*9880d681SAndroid Build Coastguard Worker  string t6 = !strconcat(t5, ", ${src2}_");
903*9880d681SAndroid Build Coastguard Worker  string t7 = !strconcat(t6, pos);
904*9880d681SAndroid Build Coastguard Worker  string s  = !strconcat(t7, ", $p;");
905*9880d681SAndroid Build Coastguard Worker}
906*9880d681SAndroid Build Coastguard Worker
907*9880d681SAndroid Build Coastguard Workerclass Select_Str2<string type> {
908*9880d681SAndroid Build Coastguard Worker  string t1 = Select_OneLine<type, "0">.s;
909*9880d681SAndroid Build Coastguard Worker  string t2 = !strconcat(t1, "\n\t");
910*9880d681SAndroid Build Coastguard Worker  string s  = !strconcat(t2, Select_OneLine<type, "1">.s);
911*9880d681SAndroid Build Coastguard Worker}
912*9880d681SAndroid Build Coastguard Worker
913*9880d681SAndroid Build Coastguard Workerclass Select_Str4<string type> {
914*9880d681SAndroid Build Coastguard Worker  string t1 = Select_OneLine<type, "0">.s;
915*9880d681SAndroid Build Coastguard Worker  string t2 = !strconcat(t1, "\n\t");
916*9880d681SAndroid Build Coastguard Worker  string t3 = !strconcat(t2, Select_OneLine<type, "1">.s);
917*9880d681SAndroid Build Coastguard Worker  string t4 = !strconcat(t3, "\n\t");
918*9880d681SAndroid Build Coastguard Worker  string t5 = !strconcat(t4, Select_OneLine<type, "2">.s);
919*9880d681SAndroid Build Coastguard Worker  string t6 = !strconcat(t5, "\n\t");
920*9880d681SAndroid Build Coastguard Worker  string s  = !strconcat(t6, Select_OneLine<type, "3">.s);
921*9880d681SAndroid Build Coastguard Worker
922*9880d681SAndroid Build Coastguard Worker}
923*9880d681SAndroid Build Coastguard Worker
924*9880d681SAndroid Build Coastguard Workerclass Vec_Select<NVPTXRegClass vclass, string asmstr, NVPTXInst sop>
925*9880d681SAndroid Build Coastguard Worker      : NVPTXVecInst<(outs vclass:$dst),
926*9880d681SAndroid Build Coastguard Worker                     (ins  vclass:$src1, vclass:$src2, Int1Regs:$p),
927*9880d681SAndroid Build Coastguard Worker                     asmstr,
928*9880d681SAndroid Build Coastguard Worker                     [(set vclass:$dst, (select Int1Regs:$p, vclass:$src1,
929*9880d681SAndroid Build Coastguard Worker                       vclass:$src2))],
930*9880d681SAndroid Build Coastguard Worker                     sop>;
931*9880d681SAndroid Build Coastguard Worker
932*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in {
933*9880d681SAndroid Build Coastguard Workerdef V2I64_Select : Vec_Select<V2I64Regs, Select_Str2<"b64">.s, SELECTi64rr>;
934*9880d681SAndroid Build Coastguard Workerdef V4I32_Select : Vec_Select<V4I32Regs, Select_Str4<"b32">.s, SELECTi32rr>;
935*9880d681SAndroid Build Coastguard Workerdef V2I32_Select : Vec_Select<V2I32Regs, Select_Str2<"b32">.s, SELECTi32rr>;
936*9880d681SAndroid Build Coastguard Workerdef V4I16_Select : Vec_Select<V4I16Regs, Select_Str4<"b16">.s, SELECTi16rr>;
937*9880d681SAndroid Build Coastguard Workerdef V2I16_Select : Vec_Select<V2I16Regs, Select_Str2<"b16">.s, SELECTi16rr>;
938*9880d681SAndroid Build Coastguard Workerdef V4I8_Select  : Vec_Select<V4I8Regs,  Select_Str4<"b16">.s, SELECTi8rr>;
939*9880d681SAndroid Build Coastguard Workerdef V2I8_Select  : Vec_Select<V2I8Regs,  Select_Str2<"b16">.s, SELECTi8rr>;
940*9880d681SAndroid Build Coastguard Worker
941*9880d681SAndroid Build Coastguard Workerdef V2F64_Select : Vec_Select<V2F64Regs, Select_Str2<"f64">.s, SELECTf64rr>;
942*9880d681SAndroid Build Coastguard Workerdef V4F32_Select : Vec_Select<V4F32Regs, Select_Str4<"f32">.s, SELECTf32rr>;
943*9880d681SAndroid Build Coastguard Workerdef V2F32_Select : Vec_Select<V2F32Regs, Select_Str2<"f32">.s, SELECTf32rr>;
944*9880d681SAndroid Build Coastguard Worker}
945*9880d681SAndroid Build Coastguard Worker
946*9880d681SAndroid Build Coastguard Worker// Comparison instructions
947*9880d681SAndroid Build Coastguard Worker
948*9880d681SAndroid Build Coastguard Worker// setcc convenience fragments.
949*9880d681SAndroid Build Coastguard Workerdef vsetoeq : PatFrag<(ops node:$lhs, node:$rhs),
950*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETOEQ)>;
951*9880d681SAndroid Build Coastguard Workerdef vsetogt : PatFrag<(ops node:$lhs, node:$rhs),
952*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETOGT)>;
953*9880d681SAndroid Build Coastguard Workerdef vsetoge : PatFrag<(ops node:$lhs, node:$rhs),
954*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETOGE)>;
955*9880d681SAndroid Build Coastguard Workerdef vsetolt : PatFrag<(ops node:$lhs, node:$rhs),
956*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETOLT)>;
957*9880d681SAndroid Build Coastguard Workerdef vsetole : PatFrag<(ops node:$lhs, node:$rhs),
958*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETOLE)>;
959*9880d681SAndroid Build Coastguard Workerdef vsetone : PatFrag<(ops node:$lhs, node:$rhs),
960*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETONE)>;
961*9880d681SAndroid Build Coastguard Workerdef vseto   : PatFrag<(ops node:$lhs, node:$rhs),
962*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETO)>;
963*9880d681SAndroid Build Coastguard Workerdef vsetuo  : PatFrag<(ops node:$lhs, node:$rhs),
964*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETUO)>;
965*9880d681SAndroid Build Coastguard Workerdef vsetueq : PatFrag<(ops node:$lhs, node:$rhs),
966*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETUEQ)>;
967*9880d681SAndroid Build Coastguard Workerdef vsetugt : PatFrag<(ops node:$lhs, node:$rhs),
968*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETUGT)>;
969*9880d681SAndroid Build Coastguard Workerdef vsetuge : PatFrag<(ops node:$lhs, node:$rhs),
970*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETUGE)>;
971*9880d681SAndroid Build Coastguard Workerdef vsetult : PatFrag<(ops node:$lhs, node:$rhs),
972*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETULT)>;
973*9880d681SAndroid Build Coastguard Workerdef vsetule : PatFrag<(ops node:$lhs, node:$rhs),
974*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETULE)>;
975*9880d681SAndroid Build Coastguard Workerdef vsetune : PatFrag<(ops node:$lhs, node:$rhs),
976*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETUNE)>;
977*9880d681SAndroid Build Coastguard Workerdef vseteq  : PatFrag<(ops node:$lhs, node:$rhs),
978*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETEQ)>;
979*9880d681SAndroid Build Coastguard Workerdef vsetgt  : PatFrag<(ops node:$lhs, node:$rhs),
980*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETGT)>;
981*9880d681SAndroid Build Coastguard Workerdef vsetge  : PatFrag<(ops node:$lhs, node:$rhs),
982*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETGE)>;
983*9880d681SAndroid Build Coastguard Workerdef vsetlt  : PatFrag<(ops node:$lhs, node:$rhs),
984*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETLT)>;
985*9880d681SAndroid Build Coastguard Workerdef vsetle  : PatFrag<(ops node:$lhs, node:$rhs),
986*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETLE)>;
987*9880d681SAndroid Build Coastguard Workerdef vsetne  : PatFrag<(ops node:$lhs, node:$rhs),
988*9880d681SAndroid Build Coastguard Worker                      (setcc node:$lhs, node:$rhs, SETNE)>;
989*9880d681SAndroid Build Coastguard Worker
990*9880d681SAndroid Build Coastguard Workerclass Vec_Compare<PatFrag op, NVPTXRegClass outrclass, NVPTXRegClass inrclass,
991*9880d681SAndroid Build Coastguard Worker  NVPTXInst sop>
992*9880d681SAndroid Build Coastguard Worker    : NVPTXVecInst<(outs outrclass:$dst),
993*9880d681SAndroid Build Coastguard Worker                   (ins  inrclass:$a, inrclass:$b),
994*9880d681SAndroid Build Coastguard Worker                   "Unsupported",
995*9880d681SAndroid Build Coastguard Worker                   [(set outrclass:$dst, (op inrclass:$a, inrclass:$b))],
996*9880d681SAndroid Build Coastguard Worker                   sop>;
997*9880d681SAndroid Build Coastguard Worker
998*9880d681SAndroid Build Coastguard Workermulticlass Vec_Compare_All<PatFrag op,
999*9880d681SAndroid Build Coastguard Worker                           NVPTXInst inst8,
1000*9880d681SAndroid Build Coastguard Worker                           NVPTXInst inst16,
1001*9880d681SAndroid Build Coastguard Worker                           NVPTXInst inst32,
1002*9880d681SAndroid Build Coastguard Worker                           NVPTXInst inst64>
1003*9880d681SAndroid Build Coastguard Worker{
1004*9880d681SAndroid Build Coastguard Worker  def  V2I8 : Vec_Compare<op, V2I8Regs,  V2I8Regs,  inst8>;
1005*9880d681SAndroid Build Coastguard Worker  def  V4I8 : Vec_Compare<op, V4I8Regs,  V4I8Regs,  inst8>;
1006*9880d681SAndroid Build Coastguard Worker  def V2I16 : Vec_Compare<op, V2I16Regs, V2I16Regs, inst16>;
1007*9880d681SAndroid Build Coastguard Worker  def V4I16 : Vec_Compare<op, V4I16Regs, V4I16Regs, inst16>;
1008*9880d681SAndroid Build Coastguard Worker  def V2I32 : Vec_Compare<op, V2I32Regs, V2I32Regs, inst32>;
1009*9880d681SAndroid Build Coastguard Worker  def V4I32 : Vec_Compare<op, V4I32Regs, V4I32Regs, inst32>;
1010*9880d681SAndroid Build Coastguard Worker  def V2I64 : Vec_Compare<op, V2I64Regs, V2I64Regs, inst64>;
1011*9880d681SAndroid Build Coastguard Worker}
1012*9880d681SAndroid Build Coastguard Worker
1013*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in {
1014*9880d681SAndroid Build Coastguard Worker  defm VecSGT : Vec_Compare_All<vsetgt,  ISetSGTi8rr_toi8, ISetSGTi16rr_toi16,
1015*9880d681SAndroid Build Coastguard Worker    ISetSGTi32rr_toi32, ISetSGTi64rr_toi64>;
1016*9880d681SAndroid Build Coastguard Worker  defm VecUGT : Vec_Compare_All<vsetugt, ISetUGTi8rr_toi8, ISetUGTi16rr_toi16,
1017*9880d681SAndroid Build Coastguard Worker    ISetUGTi32rr_toi32, ISetUGTi64rr_toi64>;
1018*9880d681SAndroid Build Coastguard Worker  defm VecSLT : Vec_Compare_All<vsetlt,  ISetSLTi8rr_toi8, ISetSLTi16rr_toi16,
1019*9880d681SAndroid Build Coastguard Worker    ISetSLTi32rr_toi32, ISetSLTi64rr_toi64>;
1020*9880d681SAndroid Build Coastguard Worker  defm VecULT : Vec_Compare_All<vsetult, ISetULTi8rr_toi8, ISetULTi16rr_toi16,
1021*9880d681SAndroid Build Coastguard Worker    ISetULTi32rr_toi32, ISetULTi64rr_toi64>;
1022*9880d681SAndroid Build Coastguard Worker  defm VecSGE : Vec_Compare_All<vsetge,  ISetSGEi8rr_toi8, ISetSGEi16rr_toi16,
1023*9880d681SAndroid Build Coastguard Worker    ISetSGEi32rr_toi32, ISetSGEi64rr_toi64>;
1024*9880d681SAndroid Build Coastguard Worker  defm VecUGE : Vec_Compare_All<vsetuge, ISetUGEi8rr_toi8, ISetUGEi16rr_toi16,
1025*9880d681SAndroid Build Coastguard Worker    ISetUGEi32rr_toi32, ISetUGEi64rr_toi64>;
1026*9880d681SAndroid Build Coastguard Worker  defm VecSLE : Vec_Compare_All<vsetle,  ISetSLEi8rr_toi8, ISetSLEi16rr_toi16,
1027*9880d681SAndroid Build Coastguard Worker    ISetSLEi32rr_toi32, ISetSLEi64rr_toi64>;
1028*9880d681SAndroid Build Coastguard Worker  defm VecULE : Vec_Compare_All<vsetule, ISetULEi8rr_toi8, ISetULEi16rr_toi16,
1029*9880d681SAndroid Build Coastguard Worker    ISetULEi32rr_toi32, ISetULEi64rr_toi64>;
1030*9880d681SAndroid Build Coastguard Worker  defm VecSEQ : Vec_Compare_All<vseteq,  ISetSEQi8rr_toi8, ISetSEQi16rr_toi16,
1031*9880d681SAndroid Build Coastguard Worker    ISetSEQi32rr_toi32, ISetSEQi64rr_toi64>;
1032*9880d681SAndroid Build Coastguard Worker  defm VecUEQ : Vec_Compare_All<vsetueq, ISetUEQi8rr_toi8, ISetUEQi16rr_toi16,
1033*9880d681SAndroid Build Coastguard Worker    ISetUEQi32rr_toi32, ISetUEQi64rr_toi64>;
1034*9880d681SAndroid Build Coastguard Worker  defm VecSNE : Vec_Compare_All<vsetne,  ISetSNEi8rr_toi8, ISetSNEi16rr_toi16,
1035*9880d681SAndroid Build Coastguard Worker    ISetSNEi32rr_toi32, ISetSNEi64rr_toi64>;
1036*9880d681SAndroid Build Coastguard Worker  defm VecUNE : Vec_Compare_All<vsetune, ISetUNEi8rr_toi8, ISetUNEi16rr_toi16,
1037*9880d681SAndroid Build Coastguard Worker    ISetUNEi32rr_toi32, ISetUNEi64rr_toi64>;
1038*9880d681SAndroid Build Coastguard Worker}
1039*9880d681SAndroid Build Coastguard Worker
1040*9880d681SAndroid Build Coastguard Workermulticlass FVec_Compare_All<PatFrag op,
1041*9880d681SAndroid Build Coastguard Worker                            NVPTXInst instf32,
1042*9880d681SAndroid Build Coastguard Worker                            NVPTXInst instf64>
1043*9880d681SAndroid Build Coastguard Worker{
1044*9880d681SAndroid Build Coastguard Worker  def V2F32 : Vec_Compare<op, V2I32Regs, V2F32Regs, instf32>;
1045*9880d681SAndroid Build Coastguard Worker  def V4F32 : Vec_Compare<op, V4I32Regs, V4F32Regs, instf32>;
1046*9880d681SAndroid Build Coastguard Worker  def V2F64 : Vec_Compare<op, V2I64Regs, V2F64Regs, instf64>;
1047*9880d681SAndroid Build Coastguard Worker}
1048*9880d681SAndroid Build Coastguard Worker
1049*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecOther.Value in {
1050*9880d681SAndroid Build Coastguard Worker  defm FVecGT :  FVec_Compare_All<vsetogt, FSetGTf32rr_toi32,
1051*9880d681SAndroid Build Coastguard Worker    FSetGTf64rr_toi64>;
1052*9880d681SAndroid Build Coastguard Worker  defm FVecLT :  FVec_Compare_All<vsetolt, FSetLTf32rr_toi32,
1053*9880d681SAndroid Build Coastguard Worker    FSetLTf64rr_toi64>;
1054*9880d681SAndroid Build Coastguard Worker  defm FVecGE :  FVec_Compare_All<vsetoge, FSetGEf32rr_toi32,
1055*9880d681SAndroid Build Coastguard Worker    FSetGEf64rr_toi64>;
1056*9880d681SAndroid Build Coastguard Worker  defm FVecLE :  FVec_Compare_All<vsetole, FSetLEf32rr_toi32,
1057*9880d681SAndroid Build Coastguard Worker    FSetLEf64rr_toi64>;
1058*9880d681SAndroid Build Coastguard Worker  defm FVecEQ :  FVec_Compare_All<vsetoeq, FSetEQf32rr_toi32,
1059*9880d681SAndroid Build Coastguard Worker    FSetEQf64rr_toi64>;
1060*9880d681SAndroid Build Coastguard Worker  defm FVecNE :  FVec_Compare_All<vsetone, FSetNEf32rr_toi32,
1061*9880d681SAndroid Build Coastguard Worker    FSetNEf64rr_toi64>;
1062*9880d681SAndroid Build Coastguard Worker
1063*9880d681SAndroid Build Coastguard Worker  defm FVecUGT :  FVec_Compare_All<vsetugt, FSetUGTf32rr_toi32,
1064*9880d681SAndroid Build Coastguard Worker    FSetUGTf64rr_toi64>;
1065*9880d681SAndroid Build Coastguard Worker  defm FVecULT :  FVec_Compare_All<vsetult, FSetULTf32rr_toi32,
1066*9880d681SAndroid Build Coastguard Worker    FSetULTf64rr_toi64>;
1067*9880d681SAndroid Build Coastguard Worker  defm FVecUGE :  FVec_Compare_All<vsetuge, FSetUGEf32rr_toi32,
1068*9880d681SAndroid Build Coastguard Worker    FSetUGEf64rr_toi64>;
1069*9880d681SAndroid Build Coastguard Worker  defm FVecULE :  FVec_Compare_All<vsetule, FSetULEf32rr_toi32,
1070*9880d681SAndroid Build Coastguard Worker    FSetULEf64rr_toi64>;
1071*9880d681SAndroid Build Coastguard Worker  defm FVecUEQ :  FVec_Compare_All<vsetueq, FSetUEQf32rr_toi32,
1072*9880d681SAndroid Build Coastguard Worker    FSetUEQf64rr_toi64>;
1073*9880d681SAndroid Build Coastguard Worker  defm FVecUNE :  FVec_Compare_All<vsetune, FSetUNEf32rr_toi32,
1074*9880d681SAndroid Build Coastguard Worker    FSetUNEf64rr_toi64>;
1075*9880d681SAndroid Build Coastguard Worker
1076*9880d681SAndroid Build Coastguard Worker  defm FVecNUM :  FVec_Compare_All<vseto,  FSetNUMf32rr_toi32,
1077*9880d681SAndroid Build Coastguard Worker    FSetNUMf64rr_toi64>;
1078*9880d681SAndroid Build Coastguard Worker  defm FVecNAN :  FVec_Compare_All<vsetuo, FSetNANf32rr_toi32,
1079*9880d681SAndroid Build Coastguard Worker    FSetNANf64rr_toi64>;
1080*9880d681SAndroid Build Coastguard Worker}
1081*9880d681SAndroid Build Coastguard Worker
1082*9880d681SAndroid Build Coastguard Workerclass LoadParamScalar4Inst<NVPTXRegClass regclass, string opstr> :
1083*9880d681SAndroid Build Coastguard Worker      NVPTXInst<(outs regclass:$d1, regclass:$d2, regclass:$d3, regclass:$d4),
1084*9880d681SAndroid Build Coastguard Worker                (ins i32imm:$a, i32imm:$b),
1085*9880d681SAndroid Build Coastguard Worker                !strconcat(!strconcat("ld.param", opstr),
1086*9880d681SAndroid Build Coastguard Worker                  "\t{{$d1, $d2, $d3, $d4}}, [retval0+$b];"), []>;
1087*9880d681SAndroid Build Coastguard Worker
1088*9880d681SAndroid Build Coastguard Workerclass LoadParamScalar2Inst<NVPTXRegClass regclass, string opstr> :
1089*9880d681SAndroid Build Coastguard Worker      NVPTXInst<(outs regclass:$d1, regclass:$d2),
1090*9880d681SAndroid Build Coastguard Worker                (ins i32imm:$a, i32imm:$b),
1091*9880d681SAndroid Build Coastguard Worker                !strconcat(!strconcat("ld.param", opstr),
1092*9880d681SAndroid Build Coastguard Worker                  "\t{{$d1, $d2}}, [retval0+$b];"), []>;
1093*9880d681SAndroid Build Coastguard Worker
1094*9880d681SAndroid Build Coastguard Worker
1095*9880d681SAndroid Build Coastguard Workerclass StoreParamScalar4Inst<NVPTXRegClass regclass, string opstr> :
1096*9880d681SAndroid Build Coastguard Worker      NVPTXInst<(outs),
1097*9880d681SAndroid Build Coastguard Worker                (ins regclass:$s1, regclass:$s2, regclass:$s3, regclass:$s4,
1098*9880d681SAndroid Build Coastguard Worker                  i32imm:$a, i32imm:$b),
1099*9880d681SAndroid Build Coastguard Worker                !strconcat(!strconcat("st.param", opstr),
1100*9880d681SAndroid Build Coastguard Worker                  "\t[param$a+$b], {{$s1, $s2, $s3, $s4}};"), []>;
1101*9880d681SAndroid Build Coastguard Worker
1102*9880d681SAndroid Build Coastguard Workerclass StoreParamScalar2Inst<NVPTXRegClass regclass, string opstr> :
1103*9880d681SAndroid Build Coastguard Worker      NVPTXInst<(outs),
1104*9880d681SAndroid Build Coastguard Worker                (ins regclass:$s1, regclass:$s2, i32imm:$a, i32imm:$b),
1105*9880d681SAndroid Build Coastguard Worker                !strconcat(!strconcat("st.param", opstr),
1106*9880d681SAndroid Build Coastguard Worker                  "\t[param$a+$b], {{$s1, $s2}};"), []>;
1107*9880d681SAndroid Build Coastguard Worker
1108*9880d681SAndroid Build Coastguard Workerclass StoreRetvalScalar4Inst<NVPTXRegClass regclass, string opstr> :
1109*9880d681SAndroid Build Coastguard Worker      NVPTXInst<(outs),
1110*9880d681SAndroid Build Coastguard Worker                (ins regclass:$s1, regclass:$s2, regclass:$s3, regclass:$s4,
1111*9880d681SAndroid Build Coastguard Worker                  i32imm:$a),
1112*9880d681SAndroid Build Coastguard Worker                !strconcat(!strconcat("st.param", opstr),
1113*9880d681SAndroid Build Coastguard Worker                  "\t[func_retval+$a], {{$s1, $s2, $s3, $s4}};"), []>;
1114*9880d681SAndroid Build Coastguard Worker
1115*9880d681SAndroid Build Coastguard Workerclass StoreRetvalScalar2Inst<NVPTXRegClass regclass, string opstr> :
1116*9880d681SAndroid Build Coastguard Worker      NVPTXInst<(outs),
1117*9880d681SAndroid Build Coastguard Worker                (ins regclass:$s1, regclass:$s2, i32imm:$a),
1118*9880d681SAndroid Build Coastguard Worker                !strconcat(!strconcat("st.param", opstr),
1119*9880d681SAndroid Build Coastguard Worker                  "\t[func_retval+$a], {{$s1, $s2}};"), []>;
1120*9880d681SAndroid Build Coastguard Worker
1121*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar4I32 : LoadParamScalar4Inst<Int32Regs, ".v4.b32">;
1122*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar4I16 : LoadParamScalar4Inst<Int16Regs, ".v4.b16">;
1123*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar4I8  : LoadParamScalar4Inst<Int8Regs, ".v4.b8">;
1124*9880d681SAndroid Build Coastguard Worker
1125*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2I64 : LoadParamScalar2Inst<Int32Regs, ".v2.b64">;
1126*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2I32 : LoadParamScalar2Inst<Int32Regs, ".v2.b32">;
1127*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2I16 : LoadParamScalar2Inst<Int32Regs, ".v2.b16">;
1128*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2I8  : LoadParamScalar2Inst<Int32Regs, ".v2.b8">;
1129*9880d681SAndroid Build Coastguard Worker
1130*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar4F32 : LoadParamScalar4Inst<Float32Regs, ".v4.f32">;
1131*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2F32 : LoadParamScalar2Inst<Float32Regs, ".v2.f32">;
1132*9880d681SAndroid Build Coastguard Workerdef LoadParamScalar2F64 : LoadParamScalar2Inst<Float64Regs, ".v2.f64">;
1133*9880d681SAndroid Build Coastguard Worker
1134*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar4I32 : StoreParamScalar4Inst<Int32Regs, ".v4.b32">;
1135*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar4I16 : StoreParamScalar4Inst<Int16Regs, ".v4.b16">;
1136*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar4I8  : StoreParamScalar4Inst<Int8Regs, ".v4.b8">;
1137*9880d681SAndroid Build Coastguard Worker
1138*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2I64 : StoreParamScalar2Inst<Int64Regs, ".v2.b64">;
1139*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2I32 : StoreParamScalar2Inst<Int32Regs, ".v2.b32">;
1140*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2I16 : StoreParamScalar2Inst<Int16Regs, ".v2.b16">;
1141*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2I8  : StoreParamScalar2Inst<Int8Regs, ".v2.b8">;
1142*9880d681SAndroid Build Coastguard Worker
1143*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar4F32 : StoreParamScalar4Inst<Float32Regs, ".v4.f32">;
1144*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2F32 : StoreParamScalar2Inst<Float32Regs, ".v2.f32">;
1145*9880d681SAndroid Build Coastguard Workerdef StoreParamScalar2F64 : StoreParamScalar2Inst<Float64Regs, ".v2.f64">;
1146*9880d681SAndroid Build Coastguard Worker
1147*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar4I32 : StoreRetvalScalar4Inst<Int32Regs, ".v4.b32">;
1148*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar4I16 : StoreRetvalScalar4Inst<Int16Regs, ".v4.b16">;
1149*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar4I8  : StoreRetvalScalar4Inst<Int8Regs, ".v4.b8">;
1150*9880d681SAndroid Build Coastguard Worker
1151*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2I64 : StoreRetvalScalar2Inst<Int64Regs, ".v2.b64">;
1152*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2I32 : StoreRetvalScalar2Inst<Int32Regs, ".v2.b32">;
1153*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2I16 : StoreRetvalScalar2Inst<Int16Regs, ".v2.b16">;
1154*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2I8  : StoreRetvalScalar2Inst<Int8Regs, ".v2.b8">;
1155*9880d681SAndroid Build Coastguard Worker
1156*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar4F32 : StoreRetvalScalar4Inst<Float32Regs, ".v4.f32">;
1157*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2F32 : StoreRetvalScalar2Inst<Float32Regs, ".v2.f32">;
1158*9880d681SAndroid Build Coastguard Workerdef StoreRetvalScalar2F64 : StoreRetvalScalar2Inst<Float64Regs, ".v2.f64">;
1159*9880d681SAndroid Build Coastguard Worker
1160*9880d681SAndroid Build Coastguard Workerclass LoadParamVecInst<NVPTXRegClass regclass, string opstr, NVPTXInst sop=NOP>:
1161*9880d681SAndroid Build Coastguard Worker      NVPTXVecInst<(outs regclass:$dst), (ins i32imm:$a, i32imm:$b),
1162*9880d681SAndroid Build Coastguard Worker                "loadparam : $dst <- [$a, $b]",
1163*9880d681SAndroid Build Coastguard Worker                [(set regclass:$dst, (LoadParam (i32 imm:$a), (i32 imm:$b)))],
1164*9880d681SAndroid Build Coastguard Worker                sop>;
1165*9880d681SAndroid Build Coastguard Worker
1166*9880d681SAndroid Build Coastguard Workerclass StoreParamVecInst<NVPTXRegClass regclass, string opstr, NVPTXInst sop=NOP>
1167*9880d681SAndroid Build Coastguard Worker      : NVPTXVecInst<(outs), (ins regclass:$val, i32imm:$a, i32imm:$b),
1168*9880d681SAndroid Build Coastguard Worker                "storeparam : [$a, $b] <- $val",
1169*9880d681SAndroid Build Coastguard Worker                [(StoreParam (i32 imm:$a), (i32 imm:$b), regclass:$val)], sop>;
1170*9880d681SAndroid Build Coastguard Worker
1171*9880d681SAndroid Build Coastguard Workerclass StoreRetvalVecInst<NVPTXRegClass regclass, string opstr,
1172*9880d681SAndroid Build Coastguard Worker  NVPTXInst sop=NOP>
1173*9880d681SAndroid Build Coastguard Worker      : NVPTXVecInst<(outs), (ins regclass:$val, i32imm:$a),
1174*9880d681SAndroid Build Coastguard Worker                "storeretval : retval[$a] <- $val",
1175*9880d681SAndroid Build Coastguard Worker                [(StoreRetval (i32 imm:$a), regclass:$val)], sop>;
1176*9880d681SAndroid Build Coastguard Worker
1177*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecLD.Value in {
1178*9880d681SAndroid Build Coastguard Workerdef LoadParamV4I32  : LoadParamVecInst<V4I32Regs, ".v4.b32",
1179*9880d681SAndroid Build Coastguard Worker  LoadParamScalar4I32>;
1180*9880d681SAndroid Build Coastguard Workerdef LoadParamV4I16  : LoadParamVecInst<V4I16Regs, ".v4.b16",
1181*9880d681SAndroid Build Coastguard Worker  LoadParamScalar4I16>;
1182*9880d681SAndroid Build Coastguard Workerdef LoadParamV4I8   : LoadParamVecInst<V4I8Regs, ".v4.b8",
1183*9880d681SAndroid Build Coastguard Worker  LoadParamScalar4I8>;
1184*9880d681SAndroid Build Coastguard Worker
1185*9880d681SAndroid Build Coastguard Workerdef LoadParamV2I64  : LoadParamVecInst<V2I64Regs, ".v2.b64",
1186*9880d681SAndroid Build Coastguard Worker  LoadParamScalar2I64>;
1187*9880d681SAndroid Build Coastguard Workerdef LoadParamV2I32  : LoadParamVecInst<V2I32Regs, ".v2.b32",
1188*9880d681SAndroid Build Coastguard Worker  LoadParamScalar2I32>;
1189*9880d681SAndroid Build Coastguard Workerdef LoadParamV2I16  : LoadParamVecInst<V2I16Regs, ".v2.b16",
1190*9880d681SAndroid Build Coastguard Worker  LoadParamScalar2I16>;
1191*9880d681SAndroid Build Coastguard Workerdef LoadParamV2I8   : LoadParamVecInst<V2I8Regs, ".v2.b8",
1192*9880d681SAndroid Build Coastguard Worker  LoadParamScalar2I8>;
1193*9880d681SAndroid Build Coastguard Worker
1194*9880d681SAndroid Build Coastguard Workerdef LoadParamV4F32  : LoadParamVecInst<V4F32Regs, ".v4.f32",
1195*9880d681SAndroid Build Coastguard Worker  LoadParamScalar4F32>;
1196*9880d681SAndroid Build Coastguard Workerdef LoadParamV2F32  : LoadParamVecInst<V2F32Regs, ".v2.f32",
1197*9880d681SAndroid Build Coastguard Worker  LoadParamScalar2F32>;
1198*9880d681SAndroid Build Coastguard Workerdef LoadParamV2F64  : LoadParamVecInst<V2F64Regs, ".v2.f64",
1199*9880d681SAndroid Build Coastguard Worker  LoadParamScalar2F64>;
1200*9880d681SAndroid Build Coastguard Worker}
1201*9880d681SAndroid Build Coastguard Worker
1202*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecST.Value in {
1203*9880d681SAndroid Build Coastguard Workerdef StoreParamV4I32  : StoreParamVecInst<V4I32Regs, ".v4.b32",
1204*9880d681SAndroid Build Coastguard Worker  StoreParamScalar4I32>;
1205*9880d681SAndroid Build Coastguard Workerdef StoreParamV4I16  : StoreParamVecInst<V4I16Regs, ".v4.b16",
1206*9880d681SAndroid Build Coastguard Worker  StoreParamScalar4I16>;
1207*9880d681SAndroid Build Coastguard Workerdef StoreParamV4I8   : StoreParamVecInst<V4I8Regs, ".v4.b8",
1208*9880d681SAndroid Build Coastguard Worker  StoreParamScalar4I8>;
1209*9880d681SAndroid Build Coastguard Worker
1210*9880d681SAndroid Build Coastguard Workerdef StoreParamV2I64  : StoreParamVecInst<V2I64Regs, ".v2.b64",
1211*9880d681SAndroid Build Coastguard Worker  StoreParamScalar2I64>;
1212*9880d681SAndroid Build Coastguard Workerdef StoreParamV2I32  : StoreParamVecInst<V2I32Regs, ".v2.b32",
1213*9880d681SAndroid Build Coastguard Worker  StoreParamScalar2I32>;
1214*9880d681SAndroid Build Coastguard Workerdef StoreParamV2I16  : StoreParamVecInst<V2I16Regs, ".v2.b16",
1215*9880d681SAndroid Build Coastguard Worker  StoreParamScalar2I16>;
1216*9880d681SAndroid Build Coastguard Workerdef StoreParamV2I8   : StoreParamVecInst<V2I8Regs, ".v2.b8",
1217*9880d681SAndroid Build Coastguard Worker  StoreParamScalar2I8>;
1218*9880d681SAndroid Build Coastguard Worker
1219*9880d681SAndroid Build Coastguard Workerdef StoreParamV4F32  : StoreParamVecInst<V4F32Regs, ".v4.f32",
1220*9880d681SAndroid Build Coastguard Worker  StoreParamScalar4F32>;
1221*9880d681SAndroid Build Coastguard Workerdef StoreParamV2F32  : StoreParamVecInst<V2F32Regs, ".v2.f32",
1222*9880d681SAndroid Build Coastguard Worker  StoreParamScalar2F32>;
1223*9880d681SAndroid Build Coastguard Workerdef StoreParamV2F64  : StoreParamVecInst<V2F64Regs, ".v2.f64",
1224*9880d681SAndroid Build Coastguard Worker  StoreParamScalar2F64>;
1225*9880d681SAndroid Build Coastguard Worker
1226*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV4I32  : StoreRetvalVecInst<V4I32Regs, ".v4.b32",
1227*9880d681SAndroid Build Coastguard Worker  StoreRetvalScalar4I32>;
1228*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV4I16  : StoreRetvalVecInst<V4I16Regs, ".v4.b16",
1229*9880d681SAndroid Build Coastguard Worker  StoreRetvalScalar4I16>;
1230*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV4I8   : StoreRetvalVecInst<V4I8Regs,  ".v4.b8",
1231*9880d681SAndroid Build Coastguard Worker  StoreRetvalScalar4I8>;
1232*9880d681SAndroid Build Coastguard Worker
1233*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2I64  : StoreRetvalVecInst<V2I64Regs, ".v2.b64",
1234*9880d681SAndroid Build Coastguard Worker  StoreRetvalScalar2I64>;
1235*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2I32  : StoreRetvalVecInst<V2I32Regs, ".v2.b32",
1236*9880d681SAndroid Build Coastguard Worker  StoreRetvalScalar2I32>;
1237*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2I16  : StoreRetvalVecInst<V2I16Regs, ".v2.b16",
1238*9880d681SAndroid Build Coastguard Worker  StoreRetvalScalar2I16>;
1239*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2I8   : StoreRetvalVecInst<V2I8Regs,  ".v2.b8",
1240*9880d681SAndroid Build Coastguard Worker  StoreRetvalScalar2I8>;
1241*9880d681SAndroid Build Coastguard Worker
1242*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV4F32  : StoreRetvalVecInst<V4F32Regs, ".v4.f32",
1243*9880d681SAndroid Build Coastguard Worker  StoreRetvalScalar4F32>;
1244*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2F32  : StoreRetvalVecInst<V2F32Regs, ".v2.f32",
1245*9880d681SAndroid Build Coastguard Worker  StoreRetvalScalar2F32>;
1246*9880d681SAndroid Build Coastguard Workerdef StoreRetvalV2F64  : StoreRetvalVecInst<V2F64Regs, ".v2.f64",
1247*9880d681SAndroid Build Coastguard Worker  StoreRetvalScalar2F64>;
1248*9880d681SAndroid Build Coastguard Worker
1249*9880d681SAndroid Build Coastguard Worker}
1250*9880d681SAndroid Build Coastguard Worker
1251*9880d681SAndroid Build Coastguard Worker
1252*9880d681SAndroid Build Coastguard Worker// Int vector to int scalar bit convert
1253*9880d681SAndroid Build Coastguard Worker// v4i8 -> i32
1254*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (bitconvert V4I8Regs:$s)),
1255*9880d681SAndroid Build Coastguard Worker          (V4I8toI32 (V4i8Extract V4I8Regs:$s,0), (V4i8Extract V4I8Regs:$s,1),
1256*9880d681SAndroid Build Coastguard Worker                     (V4i8Extract V4I8Regs:$s,2), (V4i8Extract V4I8Regs:$s,3))>;
1257*9880d681SAndroid Build Coastguard Worker// v4i16 -> i64
1258*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert V4I16Regs:$s)),
1259*9880d681SAndroid Build Coastguard Worker          (V4I16toI64 (V4i16Extract V4I16Regs:$s,0),
1260*9880d681SAndroid Build Coastguard Worker            (V4i16Extract V4I16Regs:$s,1),
1261*9880d681SAndroid Build Coastguard Worker                     (V4i16Extract V4I16Regs:$s,2),
1262*9880d681SAndroid Build Coastguard Worker                     (V4i16Extract V4I16Regs:$s,3))>;
1263*9880d681SAndroid Build Coastguard Worker// v2i8 -> i16
1264*9880d681SAndroid Build Coastguard Workerdef : Pat<(i16 (bitconvert V2I8Regs:$s)),
1265*9880d681SAndroid Build Coastguard Worker          (V2I8toI16 (V2i8Extract V2I8Regs:$s,0), (V2i8Extract V2I8Regs:$s,1))>;
1266*9880d681SAndroid Build Coastguard Worker// v2i16 -> i32
1267*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (bitconvert V2I16Regs:$s)),
1268*9880d681SAndroid Build Coastguard Worker          (V2I16toI32 (V2i16Extract V2I16Regs:$s,0),
1269*9880d681SAndroid Build Coastguard Worker            (V2i16Extract V2I16Regs:$s,1))>;
1270*9880d681SAndroid Build Coastguard Worker// v2i32 -> i64
1271*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert V2I32Regs:$s)),
1272*9880d681SAndroid Build Coastguard Worker          (V2I32toI64 (V2i32Extract V2I32Regs:$s,0),
1273*9880d681SAndroid Build Coastguard Worker            (V2i32Extract V2I32Regs:$s,1))>;
1274*9880d681SAndroid Build Coastguard Worker
1275*9880d681SAndroid Build Coastguard Worker// Int scalar to int vector bit convert
1276*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecDest.Value in {
1277*9880d681SAndroid Build Coastguard Worker// i32 -> v4i8
1278*9880d681SAndroid Build Coastguard Workerdef VecI32toV4I8 : NVPTXVecInst<(outs V4I8Regs:$d), (ins Int32Regs:$s),
1279*9880d681SAndroid Build Coastguard Worker                                "Error!",
1280*9880d681SAndroid Build Coastguard Worker                                [(set V4I8Regs:$d, (bitconvert Int32Regs:$s))],
1281*9880d681SAndroid Build Coastguard Worker                                I32toV4I8>;
1282*9880d681SAndroid Build Coastguard Worker// i64 -> v4i16
1283*9880d681SAndroid Build Coastguard Workerdef VecI64toV4I16 : NVPTXVecInst<(outs V4I16Regs:$d), (ins Int64Regs:$s),
1284*9880d681SAndroid Build Coastguard Worker                                 "Error!",
1285*9880d681SAndroid Build Coastguard Worker                                [(set V4I16Regs:$d, (bitconvert Int64Regs:$s))],
1286*9880d681SAndroid Build Coastguard Worker                                 I64toV4I16>;
1287*9880d681SAndroid Build Coastguard Worker// i16 -> v2i8
1288*9880d681SAndroid Build Coastguard Workerdef VecI16toV2I8 : NVPTXVecInst<(outs V2I8Regs:$d), (ins Int16Regs:$s),
1289*9880d681SAndroid Build Coastguard Worker                                "Error!",
1290*9880d681SAndroid Build Coastguard Worker                               [(set V2I8Regs:$d, (bitconvert Int16Regs:$s))],
1291*9880d681SAndroid Build Coastguard Worker                                I16toV2I8>;
1292*9880d681SAndroid Build Coastguard Worker// i32 -> v2i16
1293*9880d681SAndroid Build Coastguard Workerdef VecI32toV2I16 : NVPTXVecInst<(outs V2I16Regs:$d), (ins Int32Regs:$s),
1294*9880d681SAndroid Build Coastguard Worker                                 "Error!",
1295*9880d681SAndroid Build Coastguard Worker                                [(set V2I16Regs:$d, (bitconvert Int32Regs:$s))],
1296*9880d681SAndroid Build Coastguard Worker                                 I32toV2I16>;
1297*9880d681SAndroid Build Coastguard Worker// i64 -> v2i32
1298*9880d681SAndroid Build Coastguard Workerdef VecI64toV2I32 : NVPTXVecInst<(outs V2I32Regs:$d), (ins Int64Regs:$s),
1299*9880d681SAndroid Build Coastguard Worker                                  "Error!",
1300*9880d681SAndroid Build Coastguard Worker                                [(set V2I32Regs:$d, (bitconvert Int64Regs:$s))],
1301*9880d681SAndroid Build Coastguard Worker                                  I64toV2I32>;
1302*9880d681SAndroid Build Coastguard Worker}
1303*9880d681SAndroid Build Coastguard Worker
1304*9880d681SAndroid Build Coastguard Worker// Int vector to int vector bit convert
1305*9880d681SAndroid Build Coastguard Worker// v4i8 -> v2i16
1306*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (bitconvert V4I8Regs:$s)),
1307*9880d681SAndroid Build Coastguard Worker          (VecI32toV2I16
1308*9880d681SAndroid Build Coastguard Worker          (V4I8toI32 (V4i8Extract V4I8Regs:$s,0), (V4i8Extract V4I8Regs:$s,1),
1309*9880d681SAndroid Build Coastguard Worker                    (V4i8Extract V4I8Regs:$s,2), (V4i8Extract V4I8Regs:$s,3)))>;
1310*9880d681SAndroid Build Coastguard Worker// v4i16 -> v2i32
1311*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert V4I16Regs:$s)),
1312*9880d681SAndroid Build Coastguard Worker          (VecI64toV2I32
1313*9880d681SAndroid Build Coastguard Worker       (V4I16toI64 (V4i16Extract V4I16Regs:$s,0), (V4i16Extract V4I16Regs:$s,1),
1314*9880d681SAndroid Build Coastguard Worker                (V4i16Extract V4I16Regs:$s,2), (V4i16Extract V4I16Regs:$s,3)))>;
1315*9880d681SAndroid Build Coastguard Worker// v2i16 -> v4i8
1316*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i8 (bitconvert V2I16Regs:$s)),
1317*9880d681SAndroid Build Coastguard Worker          (VecI32toV4I8
1318*9880d681SAndroid Build Coastguard Worker    (V2I16toI32 (V2i16Extract V2I16Regs:$s,0), (V2i16Extract V2I16Regs:$s,1)))>;
1319*9880d681SAndroid Build Coastguard Worker// v2i32 -> v4i16
1320*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert V2I32Regs:$s)),
1321*9880d681SAndroid Build Coastguard Worker          (VecI64toV4I16
1322*9880d681SAndroid Build Coastguard Worker    (V2I32toI64 (V2i32Extract V2I32Regs:$s,0), (V2i32Extract V2I32Regs:$s,1)))>;
1323*9880d681SAndroid Build Coastguard Worker// v2i64 -> v4i32
1324*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert V2I64Regs:$s)),
1325*9880d681SAndroid Build Coastguard Worker          (Build_Vector4_i32
1326*9880d681SAndroid Build Coastguard Worker            (V2i32Extract (VecI64toV2I32 (V2i64Extract V2I64Regs:$s, 0)), 0),
1327*9880d681SAndroid Build Coastguard Worker            (V2i32Extract (VecI64toV2I32 (V2i64Extract V2I64Regs:$s, 0)), 1),
1328*9880d681SAndroid Build Coastguard Worker            (V2i32Extract (VecI64toV2I32 (V2i64Extract V2I64Regs:$s, 1)), 0),
1329*9880d681SAndroid Build Coastguard Worker            (V2i32Extract (VecI64toV2I32 (V2i64Extract V2I64Regs:$s, 1)), 1))>;
1330*9880d681SAndroid Build Coastguard Worker// v4i32 -> v2i64
1331*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert V4I32Regs:$s)),
1332*9880d681SAndroid Build Coastguard Worker          (Build_Vector2_i64
1333*9880d681SAndroid Build Coastguard Worker      (V2I32toI64 (V4i32Extract V4I32Regs:$s,0), (V4i32Extract V4I32Regs:$s,1)),
1334*9880d681SAndroid Build Coastguard Worker    (V2I32toI64 (V4i32Extract V4I32Regs:$s,2), (V4i32Extract V4I32Regs:$s,3)))>;
1335*9880d681SAndroid Build Coastguard Worker
1336*9880d681SAndroid Build Coastguard Worker// Fp scalar to fp vector convert
1337*9880d681SAndroid Build Coastguard Worker// f64 -> v2f32
1338*9880d681SAndroid Build Coastguard Workerlet VecInstType=isVecDest.Value in {
1339*9880d681SAndroid Build Coastguard Workerdef VecF64toV2F32 : NVPTXVecInst<(outs V2F32Regs:$d), (ins Float64Regs:$s),
1340*9880d681SAndroid Build Coastguard Worker                                  "Error!",
1341*9880d681SAndroid Build Coastguard Worker                              [(set V2F32Regs:$d, (bitconvert Float64Regs:$s))],
1342*9880d681SAndroid Build Coastguard Worker                                  F64toV2F32>;
1343*9880d681SAndroid Build Coastguard Worker}
1344*9880d681SAndroid Build Coastguard Worker
1345*9880d681SAndroid Build Coastguard Worker// Fp vector to fp scalar convert
1346*9880d681SAndroid Build Coastguard Worker// v2f32 -> f64
1347*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert V2F32Regs:$s)),
1348*9880d681SAndroid Build Coastguard Worker     (V2F32toF64 (V2f32Extract V2F32Regs:$s,0), (V2f32Extract V2F32Regs:$s,1))>;
1349*9880d681SAndroid Build Coastguard Worker
1350*9880d681SAndroid Build Coastguard Worker// Fp scalar to int vector convert
1351*9880d681SAndroid Build Coastguard Worker// f32 -> v4i8
1352*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i8 (bitconvert Float32Regs:$s)),
1353*9880d681SAndroid Build Coastguard Worker          (VecI32toV4I8 (BITCONVERT_32_F2I Float32Regs:$s))>;
1354*9880d681SAndroid Build Coastguard Worker// f32 -> v2i16
1355*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (bitconvert Float32Regs:$s)),
1356*9880d681SAndroid Build Coastguard Worker          (VecI32toV2I16 (BITCONVERT_32_F2I Float32Regs:$s))>;
1357*9880d681SAndroid Build Coastguard Worker// f64 -> v4i16
1358*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert Float64Regs:$s)),
1359*9880d681SAndroid Build Coastguard Worker          (VecI64toV4I16 (BITCONVERT_64_F2I Float64Regs:$s))>;
1360*9880d681SAndroid Build Coastguard Worker// f64 -> v2i32
1361*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert Float64Regs:$s)),
1362*9880d681SAndroid Build Coastguard Worker          (VecI64toV2I32 (BITCONVERT_64_F2I Float64Regs:$s))>;
1363*9880d681SAndroid Build Coastguard Worker
1364*9880d681SAndroid Build Coastguard Worker// Int vector to fp scalar convert
1365*9880d681SAndroid Build Coastguard Worker// v4i8 -> f32
1366*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (bitconvert V4I8Regs:$s)),
1367*9880d681SAndroid Build Coastguard Worker          (BITCONVERT_32_I2F
1368*9880d681SAndroid Build Coastguard Worker          (V4I8toI32 (V4i8Extract V4I8Regs:$s,0), (V4i8Extract V4I8Regs:$s,1),
1369*9880d681SAndroid Build Coastguard Worker                    (V4i8Extract V4I8Regs:$s,2), (V4i8Extract V4I8Regs:$s,3)))>;
1370*9880d681SAndroid Build Coastguard Worker// v4i16 -> f64
1371*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert V4I16Regs:$s)),
1372*9880d681SAndroid Build Coastguard Worker          (BITCONVERT_64_I2F
1373*9880d681SAndroid Build Coastguard Worker       (V4I16toI64 (V4i16Extract V4I16Regs:$s,0), (V4i16Extract V4I16Regs:$s,1),
1374*9880d681SAndroid Build Coastguard Worker                (V4i16Extract V4I16Regs:$s,2), (V4i16Extract V4I16Regs:$s,3)))>;
1375*9880d681SAndroid Build Coastguard Worker// v2i16 -> f32
1376*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (bitconvert V2I16Regs:$s)),
1377*9880d681SAndroid Build Coastguard Worker          (BITCONVERT_32_I2F
1378*9880d681SAndroid Build Coastguard Worker    (V2I16toI32 (V2i16Extract V2I16Regs:$s,0), (V2i16Extract V2I16Regs:$s,1)))>;
1379*9880d681SAndroid Build Coastguard Worker// v2i32 -> f64
1380*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert V2I32Regs:$s)),
1381*9880d681SAndroid Build Coastguard Worker          (BITCONVERT_64_I2F
1382*9880d681SAndroid Build Coastguard Worker    (V2I32toI64 (V2i32Extract V2I32Regs:$s,0), (V2i32Extract V2I32Regs:$s,1)))>;
1383*9880d681SAndroid Build Coastguard Worker
1384*9880d681SAndroid Build Coastguard Worker// Int scalar to fp vector convert
1385*9880d681SAndroid Build Coastguard Worker// i64 -> v2f32
1386*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert Int64Regs:$s)),
1387*9880d681SAndroid Build Coastguard Worker          (VecF64toV2F32 (BITCONVERT_64_I2F Int64Regs:$s))>;
1388*9880d681SAndroid Build Coastguard Worker
1389*9880d681SAndroid Build Coastguard Worker// Fp vector to int scalar convert
1390*9880d681SAndroid Build Coastguard Worker// v2f32 -> i64
1391*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert V2F32Regs:$s)),
1392*9880d681SAndroid Build Coastguard Worker          (BITCONVERT_64_F2I
1393*9880d681SAndroid Build Coastguard Worker    (V2F32toF64 (V2f32Extract V2F32Regs:$s,0), (V2f32Extract V2F32Regs:$s,1)))>;
1394*9880d681SAndroid Build Coastguard Worker
1395*9880d681SAndroid Build Coastguard Worker// Int vector to fp vector convert
1396*9880d681SAndroid Build Coastguard Worker// v2i64 -> v4f32
1397*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert V2I64Regs:$s)),
1398*9880d681SAndroid Build Coastguard Worker          (Build_Vector4_f32
1399*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_I2F (V2i32Extract (VecI64toV2I32
1400*9880d681SAndroid Build Coastguard Worker              (V2i64Extract V2I64Regs:$s, 0)), 0)),
1401*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_I2F (V2i32Extract (VecI64toV2I32
1402*9880d681SAndroid Build Coastguard Worker              (V2i64Extract V2I64Regs:$s, 0)), 1)),
1403*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_I2F (V2i32Extract (VecI64toV2I32
1404*9880d681SAndroid Build Coastguard Worker              (V2i64Extract V2I64Regs:$s, 1)), 0)),
1405*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_I2F (V2i32Extract (VecI64toV2I32
1406*9880d681SAndroid Build Coastguard Worker              (V2i64Extract V2I64Regs:$s, 1)), 1)))>;
1407*9880d681SAndroid Build Coastguard Worker// v2i64 -> v2f64
1408*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert V2I64Regs:$s)),
1409*9880d681SAndroid Build Coastguard Worker    (Build_Vector2_f64
1410*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_64_I2F (V2i64Extract V2I64Regs:$s,0)),
1411*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_64_I2F (V2i64Extract V2I64Regs:$s,1)))>;
1412*9880d681SAndroid Build Coastguard Worker// v2i32 -> v2f32
1413*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert V2I32Regs:$s)),
1414*9880d681SAndroid Build Coastguard Worker    (Build_Vector2_f32
1415*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_I2F (V2i32Extract V2I32Regs:$s,0)),
1416*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_I2F (V2i32Extract V2I32Regs:$s,1)))>;
1417*9880d681SAndroid Build Coastguard Worker// v4i32 -> v2f64
1418*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert V4I32Regs:$s)),
1419*9880d681SAndroid Build Coastguard Worker          (Build_Vector2_f64
1420*9880d681SAndroid Build Coastguard Worker           (BITCONVERT_64_I2F (V2I32toI64 (V4i32Extract V4I32Regs:$s,0),
1421*9880d681SAndroid Build Coastguard Worker             (V4i32Extract V4I32Regs:$s,1))),
1422*9880d681SAndroid Build Coastguard Worker           (BITCONVERT_64_I2F (V2I32toI64 (V4i32Extract V4I32Regs:$s,2),
1423*9880d681SAndroid Build Coastguard Worker             (V4i32Extract V4I32Regs:$s,3))))>;
1424*9880d681SAndroid Build Coastguard Worker// v4i32 -> v4f32
1425*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert V4I32Regs:$s)),
1426*9880d681SAndroid Build Coastguard Worker    (Build_Vector4_f32
1427*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_I2F (V4i32Extract V4I32Regs:$s,0)),
1428*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_I2F (V4i32Extract V4I32Regs:$s,1)),
1429*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_I2F (V4i32Extract V4I32Regs:$s,2)),
1430*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_I2F (V4i32Extract V4I32Regs:$s,3)))>;
1431*9880d681SAndroid Build Coastguard Worker// v4i16 -> v2f32
1432*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert V4I16Regs:$s)),
1433*9880d681SAndroid Build Coastguard Worker          (VecF64toV2F32 (BITCONVERT_64_I2F
1434*9880d681SAndroid Build Coastguard Worker          (V4I16toI64 (V4i16Extract V4I16Regs:$s,0),
1435*9880d681SAndroid Build Coastguard Worker            (V4i16Extract V4I16Regs:$s,1),
1436*9880d681SAndroid Build Coastguard Worker                      (V4i16Extract V4I16Regs:$s,2),
1437*9880d681SAndroid Build Coastguard Worker                      (V4i16Extract V4I16Regs:$s,3))))>;
1438*9880d681SAndroid Build Coastguard Worker
1439*9880d681SAndroid Build Coastguard Worker// Fp vector to int vector convert
1440*9880d681SAndroid Build Coastguard Worker// v2i64 <- v4f32
1441*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert V4F32Regs:$s)),
1442*9880d681SAndroid Build Coastguard Worker          (Build_Vector2_i64
1443*9880d681SAndroid Build Coastguard Worker           (BITCONVERT_64_F2I (V2F32toF64 (V4f32Extract V4F32Regs:$s,0),
1444*9880d681SAndroid Build Coastguard Worker             (V4f32Extract V4F32Regs:$s,1))),
1445*9880d681SAndroid Build Coastguard Worker           (BITCONVERT_64_F2I (V2F32toF64 (V4f32Extract V4F32Regs:$s,2),
1446*9880d681SAndroid Build Coastguard Worker             (V4f32Extract V4F32Regs:$s,3))))>;
1447*9880d681SAndroid Build Coastguard Worker// v2i64 <- v2f64
1448*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert V2F64Regs:$s)),
1449*9880d681SAndroid Build Coastguard Worker    (Build_Vector2_i64
1450*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_64_F2I (V2f64Extract V2F64Regs:$s,0)),
1451*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_64_F2I (V2f64Extract V2F64Regs:$s,1)))>;
1452*9880d681SAndroid Build Coastguard Worker// v2i32 <- v2f32
1453*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert V2F32Regs:$s)),
1454*9880d681SAndroid Build Coastguard Worker    (Build_Vector2_i32
1455*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_F2I (V2f32Extract V2F32Regs:$s,0)),
1456*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_F2I (V2f32Extract V2F32Regs:$s,1)))>;
1457*9880d681SAndroid Build Coastguard Worker// v4i32 <- v2f64
1458*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert V2F64Regs:$s)),
1459*9880d681SAndroid Build Coastguard Worker          (Build_Vector4_i32
1460*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_F2I (V2f32Extract (VecF64toV2F32
1461*9880d681SAndroid Build Coastguard Worker              (V2f64Extract V2F64Regs:$s, 0)), 0)),
1462*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_F2I (V2f32Extract (VecF64toV2F32
1463*9880d681SAndroid Build Coastguard Worker              (V2f64Extract V2F64Regs:$s, 0)), 1)),
1464*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_F2I (V2f32Extract (VecF64toV2F32
1465*9880d681SAndroid Build Coastguard Worker              (V2f64Extract V2F64Regs:$s, 1)), 0)),
1466*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_F2I (V2f32Extract (VecF64toV2F32
1467*9880d681SAndroid Build Coastguard Worker              (V2f64Extract V2F64Regs:$s, 1)), 1)))>;
1468*9880d681SAndroid Build Coastguard Worker// v4i32 <- v4f32
1469*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert V4F32Regs:$s)),
1470*9880d681SAndroid Build Coastguard Worker          (Build_Vector4_i32
1471*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_F2I (V4f32Extract V4F32Regs:$s,0)),
1472*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_F2I (V4f32Extract V4F32Regs:$s,1)),
1473*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_F2I (V4f32Extract V4F32Regs:$s,2)),
1474*9880d681SAndroid Build Coastguard Worker            (BITCONVERT_32_F2I (V4f32Extract V4F32Regs:$s,3)))>;
1475*9880d681SAndroid Build Coastguard Worker// v4i16 <- v2f32
1476*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert V2F32Regs:$s)),
1477*9880d681SAndroid Build Coastguard Worker          (VecI64toV4I16 (BITCONVERT_64_F2I
1478*9880d681SAndroid Build Coastguard Worker          (V2F32toF64 (V2f32Extract V2F32Regs:$s,0),
1479*9880d681SAndroid Build Coastguard Worker            (V2f32Extract V2F32Regs:$s,1))))>;
1480