blob: 7226f2002c4e82f405a71865edd01d6a33e4b7fd [file] [log] [blame]
Valery Pykhtina34fb492016-08-30 15:20:31 +00001//===-- SOPInstructions.td - SOP Instruction Defintions -------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10//===----------------------------------------------------------------------===//
11// SOP1 Instructions
12//===----------------------------------------------------------------------===//
13
14class SOP1_Pseudo <string opName, dag outs, dag ins,
15 string asmOps, list<dag> pattern=[]> :
16 InstSI <outs, ins, "", pattern>,
17 SIMCInstr<opName, SIEncodingFamily.NONE> {
18 let isPseudo = 1;
19 let isCodeGenOnly = 1;
20 let SubtargetPredicate = isGCN;
21
22 let mayLoad = 0;
23 let mayStore = 0;
24 let hasSideEffects = 0;
25 let SALU = 1;
26 let SOP1 = 1;
27 let SchedRW = [WriteSALU];
Tom Stellard2add8a12016-09-06 20:00:26 +000028 let UseNamedOperandTable = 1;
Valery Pykhtina34fb492016-08-30 15:20:31 +000029
30 string Mnemonic = opName;
31 string AsmOperands = asmOps;
32
33 bits<1> has_src0 = 1;
34 bits<1> has_sdst = 1;
35}
36
37class SOP1_Real<bits<8> op, SOP1_Pseudo ps> :
38 InstSI <ps.OutOperandList, ps.InOperandList,
39 ps.Mnemonic # " " # ps.AsmOperands, []>,
40 Enc32 {
41
42 let isPseudo = 0;
43 let isCodeGenOnly = 0;
44
45 // copy relevant pseudo op flags
46 let SubtargetPredicate = ps.SubtargetPredicate;
47 let AsmMatchConverter = ps.AsmMatchConverter;
48
49 // encoding
50 bits<7> sdst;
51 bits<8> src0;
52
53 let Inst{7-0} = !if(ps.has_src0, src0, ?);
54 let Inst{15-8} = op;
55 let Inst{22-16} = !if(ps.has_sdst, sdst, ?);
56 let Inst{31-23} = 0x17d; //encoding;
57}
58
59class SOP1_32 <string opName, list<dag> pattern=[]> : SOP1_Pseudo <
Sam Kolton1eeb11b2016-09-09 14:44:04 +000060 opName, (outs SReg_32:$sdst), (ins SSrc_b32:$src0),
Valery Pykhtina34fb492016-08-30 15:20:31 +000061 "$sdst, $src0", pattern
62>;
63
64class SOP1_64 <string opName, list<dag> pattern=[]> : SOP1_Pseudo <
Sam Kolton1eeb11b2016-09-09 14:44:04 +000065 opName, (outs SReg_64:$sdst), (ins SSrc_b64:$src0),
Valery Pykhtina34fb492016-08-30 15:20:31 +000066 "$sdst, $src0", pattern
67>;
68
69// 64-bit input, 32-bit output.
70class SOP1_32_64 <string opName, list<dag> pattern=[]> : SOP1_Pseudo <
Sam Kolton1eeb11b2016-09-09 14:44:04 +000071 opName, (outs SReg_32:$sdst), (ins SSrc_b64:$src0),
Valery Pykhtina34fb492016-08-30 15:20:31 +000072 "$sdst, $src0", pattern
73>;
74
75// 32-bit input, 64-bit output.
76class SOP1_64_32 <string opName, list<dag> pattern=[]> : SOP1_Pseudo <
Sam Kolton1eeb11b2016-09-09 14:44:04 +000077 opName, (outs SReg_64:$sdst), (ins SSrc_b32:$src0),
Valery Pykhtina34fb492016-08-30 15:20:31 +000078 "$sdst, $src0", pattern
79>;
80
81// no input, 64-bit output.
82class SOP1_64_0 <string opName, list<dag> pattern=[]> : SOP1_Pseudo <
83 opName, (outs SReg_64:$sdst), (ins), "$sdst", pattern> {
84 let has_src0 = 0;
85}
86
87// 64-bit input, no output
88class SOP1_1 <string opName, list<dag> pattern=[]> : SOP1_Pseudo <
89 opName, (outs), (ins SReg_64:$src0), "$src0", pattern> {
90 let has_sdst = 0;
91}
92
93
94let isMoveImm = 1 in {
95 let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
96 def S_MOV_B32 : SOP1_32 <"s_mov_b32">;
97 def S_MOV_B64 : SOP1_64 <"s_mov_b64">;
98 } // End isRematerializeable = 1
99
100 let Uses = [SCC] in {
101 def S_CMOV_B32 : SOP1_32 <"s_cmov_b32">;
102 def S_CMOV_B64 : SOP1_64 <"s_cmov_b64">;
103 } // End Uses = [SCC]
104} // End isMoveImm = 1
105
106let Defs = [SCC] in {
107 def S_NOT_B32 : SOP1_32 <"s_not_b32",
108 [(set i32:$sdst, (not i32:$src0))]
109 >;
110
111 def S_NOT_B64 : SOP1_64 <"s_not_b64",
112 [(set i64:$sdst, (not i64:$src0))]
113 >;
114 def S_WQM_B32 : SOP1_32 <"s_wqm_b32">;
115 def S_WQM_B64 : SOP1_64 <"s_wqm_b64">;
116} // End Defs = [SCC]
117
118
119def S_BREV_B32 : SOP1_32 <"s_brev_b32",
120 [(set i32:$sdst, (bitreverse i32:$src0))]
121>;
122def S_BREV_B64 : SOP1_64 <"s_brev_b64">;
123
124let Defs = [SCC] in {
125def S_BCNT0_I32_B32 : SOP1_32 <"s_bcnt0_i32_b32">;
126def S_BCNT0_I32_B64 : SOP1_32_64 <"s_bcnt0_i32_b64">;
127def S_BCNT1_I32_B32 : SOP1_32 <"s_bcnt1_i32_b32",
128 [(set i32:$sdst, (ctpop i32:$src0))]
129>;
130def S_BCNT1_I32_B64 : SOP1_32_64 <"s_bcnt1_i32_b64">;
131} // End Defs = [SCC]
132
133def S_FF0_I32_B32 : SOP1_32 <"s_ff0_i32_b32">;
134def S_FF0_I32_B64 : SOP1_32_64 <"s_ff0_i32_b64">;
135def S_FF1_I32_B32 : SOP1_32 <"s_ff1_i32_b32",
136 [(set i32:$sdst, (cttz_zero_undef i32:$src0))]
137>;
138def S_FF1_I32_B64 : SOP1_32_64 <"s_ff1_i32_b64">;
139
140def S_FLBIT_I32_B32 : SOP1_32 <"s_flbit_i32_b32",
141 [(set i32:$sdst, (AMDGPUffbh_u32 i32:$src0))]
142>;
143
144def S_FLBIT_I32_B64 : SOP1_32_64 <"s_flbit_i32_b64">;
145def S_FLBIT_I32 : SOP1_32 <"s_flbit_i32",
146 [(set i32:$sdst, (AMDGPUffbh_i32 i32:$src0))]
147>;
148def S_FLBIT_I32_I64 : SOP1_32_64 <"s_flbit_i32_i64">;
149def S_SEXT_I32_I8 : SOP1_32 <"s_sext_i32_i8",
150 [(set i32:$sdst, (sext_inreg i32:$src0, i8))]
151>;
152def S_SEXT_I32_I16 : SOP1_32 <"s_sext_i32_i16",
153 [(set i32:$sdst, (sext_inreg i32:$src0, i16))]
154>;
155
156def S_BITSET0_B32 : SOP1_32 <"s_bitset0_b32">;
157def S_BITSET0_B64 : SOP1_64_32 <"s_bitset0_b64">;
158def S_BITSET1_B32 : SOP1_32 <"s_bitset1_b32">;
159def S_BITSET1_B64 : SOP1_64_32 <"s_bitset1_b64">;
160def S_GETPC_B64 : SOP1_64_0 <"s_getpc_b64">;
161
162let isTerminator = 1, isBarrier = 1,
163 isBranch = 1, isIndirectBranch = 1 in {
164def S_SETPC_B64 : SOP1_1 <"s_setpc_b64">;
165}
166def S_SWAPPC_B64 : SOP1_64 <"s_swappc_b64">;
167def S_RFE_B64 : SOP1_1 <"s_rfe_b64">;
168
169let hasSideEffects = 1, Uses = [EXEC], Defs = [EXEC, SCC] in {
170
171def S_AND_SAVEEXEC_B64 : SOP1_64 <"s_and_saveexec_b64">;
172def S_OR_SAVEEXEC_B64 : SOP1_64 <"s_or_saveexec_b64">;
173def S_XOR_SAVEEXEC_B64 : SOP1_64 <"s_xor_saveexec_b64">;
174def S_ANDN2_SAVEEXEC_B64 : SOP1_64 <"s_andn2_saveexec_b64">;
175def S_ORN2_SAVEEXEC_B64 : SOP1_64 <"s_orn2_saveexec_b64">;
176def S_NAND_SAVEEXEC_B64 : SOP1_64 <"s_nand_saveexec_b64">;
177def S_NOR_SAVEEXEC_B64 : SOP1_64 <"s_nor_saveexec_b64">;
178def S_XNOR_SAVEEXEC_B64 : SOP1_64 <"s_xnor_saveexec_b64">;
179
180} // End hasSideEffects = 1, Uses = [EXEC], Defs = [EXEC, SCC]
181
182def S_QUADMASK_B32 : SOP1_32 <"s_quadmask_b32">;
183def S_QUADMASK_B64 : SOP1_64 <"s_quadmask_b64">;
184
185let Uses = [M0] in {
186def S_MOVRELS_B32 : SOP1_32 <"s_movrels_b32">;
187def S_MOVRELS_B64 : SOP1_64 <"s_movrels_b64">;
188def S_MOVRELD_B32 : SOP1_32 <"s_movreld_b32">;
189def S_MOVRELD_B64 : SOP1_64 <"s_movreld_b64">;
190} // End Uses = [M0]
191
192def S_CBRANCH_JOIN : SOP1_1 <"s_cbranch_join">;
193def S_MOV_REGRD_B32 : SOP1_32 <"s_mov_regrd_b32">;
194let Defs = [SCC] in {
195def S_ABS_I32 : SOP1_32 <"s_abs_i32">;
196} // End Defs = [SCC]
197def S_MOV_FED_B32 : SOP1_32 <"s_mov_fed_b32">;
198
199
200//===----------------------------------------------------------------------===//
201// SOP2 Instructions
202//===----------------------------------------------------------------------===//
203
204class SOP2_Pseudo<string opName, dag outs, dag ins,
205 string asmOps, list<dag> pattern=[]> :
206 InstSI<outs, ins, "", pattern>,
207 SIMCInstr<opName, SIEncodingFamily.NONE> {
208 let isPseudo = 1;
209 let isCodeGenOnly = 1;
210 let SubtargetPredicate = isGCN;
211 let mayLoad = 0;
212 let mayStore = 0;
213 let hasSideEffects = 0;
214 let SALU = 1;
215 let SOP2 = 1;
216 let SchedRW = [WriteSALU];
217 let UseNamedOperandTable = 1;
218
219 string Mnemonic = opName;
220 string AsmOperands = asmOps;
221
222 bits<1> has_sdst = 1;
223
224 // Pseudo instructions have no encodings, but adding this field here allows
225 // us to do:
226 // let sdst = xxx in {
227 // for multiclasses that include both real and pseudo instructions.
228 // field bits<7> sdst = 0;
229 // let Size = 4; // Do we need size here?
230}
231
232class SOP2_Real<bits<7> op, SOP2_Pseudo ps> :
233 InstSI <ps.OutOperandList, ps.InOperandList,
234 ps.Mnemonic # " " # ps.AsmOperands, []>,
235 Enc32 {
236 let isPseudo = 0;
237 let isCodeGenOnly = 0;
238
239 // copy relevant pseudo op flags
240 let SubtargetPredicate = ps.SubtargetPredicate;
241 let AsmMatchConverter = ps.AsmMatchConverter;
242
243 // encoding
244 bits<7> sdst;
245 bits<8> src0;
246 bits<8> src1;
247
248 let Inst{7-0} = src0;
249 let Inst{15-8} = src1;
250 let Inst{22-16} = !if(ps.has_sdst, sdst, ?);
251 let Inst{29-23} = op;
252 let Inst{31-30} = 0x2; // encoding
253}
254
255
256class SOP2_32 <string opName, list<dag> pattern=[]> : SOP2_Pseudo <
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000257 opName, (outs SReg_32:$sdst), (ins SSrc_b32:$src0, SSrc_b32:$src1),
Valery Pykhtina34fb492016-08-30 15:20:31 +0000258 "$sdst, $src0, $src1", pattern
259>;
260
261class SOP2_64 <string opName, list<dag> pattern=[]> : SOP2_Pseudo <
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000262 opName, (outs SReg_64:$sdst), (ins SSrc_b64:$src0, SSrc_b64:$src1),
Valery Pykhtina34fb492016-08-30 15:20:31 +0000263 "$sdst, $src0, $src1", pattern
264>;
265
266class SOP2_64_32 <string opName, list<dag> pattern=[]> : SOP2_Pseudo <
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000267 opName, (outs SReg_64:$sdst), (ins SSrc_b64:$src0, SSrc_b32:$src1),
Valery Pykhtina34fb492016-08-30 15:20:31 +0000268 "$sdst, $src0, $src1", pattern
269>;
270
271class SOP2_64_32_32 <string opName, list<dag> pattern=[]> : SOP2_Pseudo <
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000272 opName, (outs SReg_64:$sdst), (ins SSrc_b32:$src0, SSrc_b32:$src1),
Valery Pykhtina34fb492016-08-30 15:20:31 +0000273 "$sdst, $src0, $src1", pattern
274>;
275
276let Defs = [SCC] in { // Carry out goes to SCC
277let isCommutable = 1 in {
278def S_ADD_U32 : SOP2_32 <"s_add_u32">;
279def S_ADD_I32 : SOP2_32 <"s_add_i32",
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000280 [(set i32:$sdst, (add SSrc_b32:$src0, SSrc_b32:$src1))]
Valery Pykhtina34fb492016-08-30 15:20:31 +0000281>;
282} // End isCommutable = 1
283
284def S_SUB_U32 : SOP2_32 <"s_sub_u32">;
285def S_SUB_I32 : SOP2_32 <"s_sub_i32",
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000286 [(set i32:$sdst, (sub SSrc_b32:$src0, SSrc_b32:$src1))]
Valery Pykhtina34fb492016-08-30 15:20:31 +0000287>;
288
289let Uses = [SCC] in { // Carry in comes from SCC
290let isCommutable = 1 in {
291def S_ADDC_U32 : SOP2_32 <"s_addc_u32",
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000292 [(set i32:$sdst, (adde (i32 SSrc_b32:$src0), (i32 SSrc_b32:$src1)))]>;
Valery Pykhtina34fb492016-08-30 15:20:31 +0000293} // End isCommutable = 1
294
295def S_SUBB_U32 : SOP2_32 <"s_subb_u32",
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000296 [(set i32:$sdst, (sube (i32 SSrc_b32:$src0), (i32 SSrc_b32:$src1)))]>;
Valery Pykhtina34fb492016-08-30 15:20:31 +0000297} // End Uses = [SCC]
298
Matt Arsenault479ba3a2016-09-07 06:25:55 +0000299
300let isCommutable = 1 in {
Valery Pykhtina34fb492016-08-30 15:20:31 +0000301def S_MIN_I32 : SOP2_32 <"s_min_i32",
302 [(set i32:$sdst, (smin i32:$src0, i32:$src1))]
303>;
304def S_MIN_U32 : SOP2_32 <"s_min_u32",
305 [(set i32:$sdst, (umin i32:$src0, i32:$src1))]
306>;
307def S_MAX_I32 : SOP2_32 <"s_max_i32",
308 [(set i32:$sdst, (smax i32:$src0, i32:$src1))]
309>;
310def S_MAX_U32 : SOP2_32 <"s_max_u32",
311 [(set i32:$sdst, (umax i32:$src0, i32:$src1))]
312>;
Matt Arsenault479ba3a2016-09-07 06:25:55 +0000313} // End isCommutable = 1
Valery Pykhtina34fb492016-08-30 15:20:31 +0000314} // End Defs = [SCC]
315
316
317let Uses = [SCC] in {
318 def S_CSELECT_B32 : SOP2_32 <"s_cselect_b32">;
319 def S_CSELECT_B64 : SOP2_64 <"s_cselect_b64">;
320} // End Uses = [SCC]
321
322let Defs = [SCC] in {
Matt Arsenault479ba3a2016-09-07 06:25:55 +0000323let isCommutable = 1 in {
Valery Pykhtina34fb492016-08-30 15:20:31 +0000324def S_AND_B32 : SOP2_32 <"s_and_b32",
325 [(set i32:$sdst, (and i32:$src0, i32:$src1))]
326>;
327
328def S_AND_B64 : SOP2_64 <"s_and_b64",
329 [(set i64:$sdst, (and i64:$src0, i64:$src1))]
330>;
331
332def S_OR_B32 : SOP2_32 <"s_or_b32",
333 [(set i32:$sdst, (or i32:$src0, i32:$src1))]
334>;
335
336def S_OR_B64 : SOP2_64 <"s_or_b64",
337 [(set i64:$sdst, (or i64:$src0, i64:$src1))]
338>;
339
340def S_XOR_B32 : SOP2_32 <"s_xor_b32",
341 [(set i32:$sdst, (xor i32:$src0, i32:$src1))]
342>;
343
344def S_XOR_B64 : SOP2_64 <"s_xor_b64",
345 [(set i64:$sdst, (xor i64:$src0, i64:$src1))]
346>;
Matt Arsenault479ba3a2016-09-07 06:25:55 +0000347} // End isCommutable = 1
348
Valery Pykhtina34fb492016-08-30 15:20:31 +0000349def S_ANDN2_B32 : SOP2_32 <"s_andn2_b32">;
350def S_ANDN2_B64 : SOP2_64 <"s_andn2_b64">;
351def S_ORN2_B32 : SOP2_32 <"s_orn2_b32">;
352def S_ORN2_B64 : SOP2_64 <"s_orn2_b64">;
353def S_NAND_B32 : SOP2_32 <"s_nand_b32">;
354def S_NAND_B64 : SOP2_64 <"s_nand_b64">;
355def S_NOR_B32 : SOP2_32 <"s_nor_b32">;
356def S_NOR_B64 : SOP2_64 <"s_nor_b64">;
357def S_XNOR_B32 : SOP2_32 <"s_xnor_b32">;
358def S_XNOR_B64 : SOP2_64 <"s_xnor_b64">;
359} // End Defs = [SCC]
360
361// Use added complexity so these patterns are preferred to the VALU patterns.
362let AddedComplexity = 1 in {
363
364let Defs = [SCC] in {
365def S_LSHL_B32 : SOP2_32 <"s_lshl_b32",
366 [(set i32:$sdst, (shl i32:$src0, i32:$src1))]
367>;
368def S_LSHL_B64 : SOP2_64_32 <"s_lshl_b64",
369 [(set i64:$sdst, (shl i64:$src0, i32:$src1))]
370>;
371def S_LSHR_B32 : SOP2_32 <"s_lshr_b32",
372 [(set i32:$sdst, (srl i32:$src0, i32:$src1))]
373>;
374def S_LSHR_B64 : SOP2_64_32 <"s_lshr_b64",
375 [(set i64:$sdst, (srl i64:$src0, i32:$src1))]
376>;
377def S_ASHR_I32 : SOP2_32 <"s_ashr_i32",
378 [(set i32:$sdst, (sra i32:$src0, i32:$src1))]
379>;
380def S_ASHR_I64 : SOP2_64_32 <"s_ashr_i64",
381 [(set i64:$sdst, (sra i64:$src0, i32:$src1))]
382>;
383} // End Defs = [SCC]
384
385def S_BFM_B32 : SOP2_32 <"s_bfm_b32",
386 [(set i32:$sdst, (AMDGPUbfm i32:$src0, i32:$src1))]>;
387def S_BFM_B64 : SOP2_64_32_32 <"s_bfm_b64">;
388def S_MUL_I32 : SOP2_32 <"s_mul_i32",
Matt Arsenault479ba3a2016-09-07 06:25:55 +0000389 [(set i32:$sdst, (mul i32:$src0, i32:$src1))]> {
390 let isCommutable = 1;
391}
Valery Pykhtina34fb492016-08-30 15:20:31 +0000392
393} // End AddedComplexity = 1
394
395let Defs = [SCC] in {
396def S_BFE_U32 : SOP2_32 <"s_bfe_u32">;
397def S_BFE_I32 : SOP2_32 <"s_bfe_i32">;
398def S_BFE_U64 : SOP2_64_32 <"s_bfe_u64">;
399def S_BFE_I64 : SOP2_64_32 <"s_bfe_i64">;
400} // End Defs = [SCC]
401
402def S_CBRANCH_G_FORK : SOP2_Pseudo <
403 "s_cbranch_g_fork", (outs),
404 (ins SReg_64:$src0, SReg_64:$src1),
405 "$src0, $src1"
406> {
407 let has_sdst = 0;
408}
409
410let Defs = [SCC] in {
411def S_ABSDIFF_I32 : SOP2_32 <"s_absdiff_i32">;
412} // End Defs = [SCC]
413
414
415//===----------------------------------------------------------------------===//
416// SOPK Instructions
417//===----------------------------------------------------------------------===//
418
419class SOPK_Pseudo <string opName, dag outs, dag ins,
420 string asmOps, list<dag> pattern=[]> :
421 InstSI <outs, ins, "", pattern>,
422 SIMCInstr<opName, SIEncodingFamily.NONE> {
423 let isPseudo = 1;
424 let isCodeGenOnly = 1;
425 let SubtargetPredicate = isGCN;
426 let mayLoad = 0;
427 let mayStore = 0;
428 let hasSideEffects = 0;
429 let SALU = 1;
430 let SOPK = 1;
431 let SchedRW = [WriteSALU];
432 let UseNamedOperandTable = 1;
433 string Mnemonic = opName;
434 string AsmOperands = asmOps;
435
436 bits<1> has_sdst = 1;
437}
438
439class SOPK_Real<bits<5> op, SOPK_Pseudo ps> :
440 InstSI <ps.OutOperandList, ps.InOperandList,
441 ps.Mnemonic # " " # ps.AsmOperands, []> {
442 let isPseudo = 0;
443 let isCodeGenOnly = 0;
444
445 // copy relevant pseudo op flags
446 let SubtargetPredicate = ps.SubtargetPredicate;
447 let AsmMatchConverter = ps.AsmMatchConverter;
448 let DisableEncoding = ps.DisableEncoding;
449 let Constraints = ps.Constraints;
450
451 // encoding
452 bits<7> sdst;
453 bits<16> simm16;
454 bits<32> imm;
455}
456
457class SOPK_Real32<bits<5> op, SOPK_Pseudo ps> :
458 SOPK_Real <op, ps>,
459 Enc32 {
460 let Inst{15-0} = simm16;
461 let Inst{22-16} = !if(ps.has_sdst, sdst, ?);
462 let Inst{27-23} = op;
463 let Inst{31-28} = 0xb; //encoding
464}
465
466class SOPK_Real64<bits<5> op, SOPK_Pseudo ps> :
467 SOPK_Real<op, ps>,
468 Enc64 {
469 let Inst{15-0} = simm16;
470 let Inst{22-16} = !if(ps.has_sdst, sdst, ?);
471 let Inst{27-23} = op;
472 let Inst{31-28} = 0xb; //encoding
473 let Inst{63-32} = imm;
474}
475
476class SOPK_32 <string opName, list<dag> pattern=[]> : SOPK_Pseudo <
477 opName,
478 (outs SReg_32:$sdst),
479 (ins u16imm:$simm16),
480 "$sdst, $simm16",
481 pattern>;
482
483class SOPK_SCC <string opName, list<dag> pattern=[]> : SOPK_Pseudo <
484 opName,
485 (outs),
486 (ins SReg_32:$sdst, u16imm:$simm16),
487 "$sdst, $simm16",
488 pattern> {
489 let Defs = [SCC];
490}
491
492class SOPK_32TIE <string opName, list<dag> pattern=[]> : SOPK_Pseudo <
493 opName,
494 (outs SReg_32:$sdst),
495 (ins SReg_32:$src0, u16imm:$simm16),
496 "$sdst, $simm16",
497 pattern
498>;
499
500let isReMaterializable = 1, isMoveImm = 1 in {
501def S_MOVK_I32 : SOPK_32 <"s_movk_i32">;
502} // End isReMaterializable = 1
503let Uses = [SCC] in {
504def S_CMOVK_I32 : SOPK_32 <"s_cmovk_i32">;
505}
506
507let isCompare = 1 in {
508
509// This instruction is disabled for now until we can figure out how to teach
510// the instruction selector to correctly use the S_CMP* vs V_CMP*
511// instructions.
512//
513// When this instruction is enabled the code generator sometimes produces this
514// invalid sequence:
515//
516// SCC = S_CMPK_EQ_I32 SGPR0, imm
517// VCC = COPY SCC
518// VGPR0 = V_CNDMASK VCC, VGPR0, VGPR1
519//
520// def S_CMPK_EQ_I32 : SOPK_SCC <"s_cmpk_eq_i32",
521// [(set i1:$dst, (setcc i32:$src0, imm:$src1, SETEQ))]
522// >;
523
524def S_CMPK_EQ_I32 : SOPK_SCC <"s_cmpk_eq_i32">;
525def S_CMPK_LG_I32 : SOPK_SCC <"s_cmpk_lg_i32">;
526def S_CMPK_GT_I32 : SOPK_SCC <"s_cmpk_gt_i32">;
527def S_CMPK_GE_I32 : SOPK_SCC <"s_cmpk_ge_i32">;
528def S_CMPK_LT_I32 : SOPK_SCC <"s_cmpk_lt_i32">;
529def S_CMPK_LE_I32 : SOPK_SCC <"s_cmpk_le_i32">;
530def S_CMPK_EQ_U32 : SOPK_SCC <"s_cmpk_eq_u32">;
531def S_CMPK_LG_U32 : SOPK_SCC <"s_cmpk_lg_u32">;
532def S_CMPK_GT_U32 : SOPK_SCC <"s_cmpk_gt_u32">;
533def S_CMPK_GE_U32 : SOPK_SCC <"s_cmpk_ge_u32">;
534def S_CMPK_LT_U32 : SOPK_SCC <"s_cmpk_lt_u32">;
535def S_CMPK_LE_U32 : SOPK_SCC <"s_cmpk_le_u32">;
536} // End isCompare = 1
537
538let Defs = [SCC], isCommutable = 1, DisableEncoding = "$src0",
539 Constraints = "$sdst = $src0" in {
540 def S_ADDK_I32 : SOPK_32TIE <"s_addk_i32">;
541 def S_MULK_I32 : SOPK_32TIE <"s_mulk_i32">;
542}
543
544def S_CBRANCH_I_FORK : SOPK_Pseudo <
545 "s_cbranch_i_fork",
546 (outs), (ins SReg_64:$sdst, u16imm:$simm16),
547 "$sdst, $simm16"
548>;
549
550let mayLoad = 1 in {
551def S_GETREG_B32 : SOPK_Pseudo <
552 "s_getreg_b32",
553 (outs SReg_32:$sdst), (ins hwreg:$simm16),
554 "$sdst, $simm16"
555>;
556}
557
558def S_SETREG_B32 : SOPK_Pseudo <
559 "s_setreg_b32",
560 (outs), (ins SReg_32:$sdst, hwreg:$simm16),
561 "$simm16, $sdst"
562>;
563
564// FIXME: Not on SI?
565//def S_GETREG_REGRD_B32 : SOPK_32 <sopk<0x14, 0x13>, "s_getreg_regrd_b32">;
566
567def S_SETREG_IMM32_B32 : SOPK_Pseudo <
568 "s_setreg_imm32_b32",
569 (outs), (ins i32imm:$imm, hwreg:$simm16),
570 "$simm16, $imm"
571> {
572 let has_sdst = 0;
573}
574
575
576//===----------------------------------------------------------------------===//
577// SOPC Instructions
578//===----------------------------------------------------------------------===//
579
580class SOPCe <bits<7> op> : Enc32 {
581 bits<8> src0;
582 bits<8> src1;
583
584 let Inst{7-0} = src0;
585 let Inst{15-8} = src1;
586 let Inst{22-16} = op;
587 let Inst{31-23} = 0x17e;
588}
589
590class SOPC <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
591 InstSI<outs, ins, asm, pattern>, SOPCe <op> {
592 let mayLoad = 0;
593 let mayStore = 0;
594 let hasSideEffects = 0;
595 let SALU = 1;
596 let SOPC = 1;
597 let isCodeGenOnly = 0;
598 let Defs = [SCC];
599 let SchedRW = [WriteSALU];
600 let UseNamedOperandTable = 1;
601 let SubtargetPredicate = isGCN;
602}
603
604class SOPC_Base <bits<7> op, RegisterOperand rc0, RegisterOperand rc1,
605 string opName, list<dag> pattern = []> : SOPC <
606 op, (outs), (ins rc0:$src0, rc1:$src1),
607 opName#" $src0, $src1", pattern > {
608 let Defs = [SCC];
609}
610class SOPC_Helper <bits<7> op, RegisterOperand rc, ValueType vt,
611 string opName, PatLeaf cond> : SOPC_Base <
612 op, rc, rc, opName,
613 [(set SCC, (si_setcc_uniform vt:$src0, vt:$src1, cond))] > {
614}
615
616class SOPC_CMP_32<bits<7> op, string opName, PatLeaf cond = COND_NULL>
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000617 : SOPC_Helper<op, SSrc_b32, i32, opName, cond>;
Valery Pykhtina34fb492016-08-30 15:20:31 +0000618
619class SOPC_32<bits<7> op, string opName, list<dag> pattern = []>
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000620 : SOPC_Base<op, SSrc_b32, SSrc_b32, opName, pattern>;
Valery Pykhtina34fb492016-08-30 15:20:31 +0000621
622class SOPC_64_32<bits<7> op, string opName, list<dag> pattern = []>
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000623 : SOPC_Base<op, SSrc_b64, SSrc_b32, opName, pattern>;
Valery Pykhtina34fb492016-08-30 15:20:31 +0000624
625
626def S_CMP_EQ_I32 : SOPC_CMP_32 <0x00, "s_cmp_eq_i32", COND_EQ>;
627def S_CMP_LG_I32 : SOPC_CMP_32 <0x01, "s_cmp_lg_i32", COND_NE>;
628def S_CMP_GT_I32 : SOPC_CMP_32 <0x02, "s_cmp_gt_i32", COND_SGT>;
629def S_CMP_GE_I32 : SOPC_CMP_32 <0x03, "s_cmp_ge_i32", COND_SGE>;
630def S_CMP_LT_I32 : SOPC_CMP_32 <0x04, "s_cmp_lt_i32", COND_SLT>;
631def S_CMP_LE_I32 : SOPC_CMP_32 <0x05, "s_cmp_le_i32", COND_SLE>;
632def S_CMP_EQ_U32 : SOPC_CMP_32 <0x06, "s_cmp_eq_u32", COND_EQ>;
633def S_CMP_LG_U32 : SOPC_CMP_32 <0x07, "s_cmp_lg_u32", COND_NE >;
634def S_CMP_GT_U32 : SOPC_CMP_32 <0x08, "s_cmp_gt_u32", COND_UGT>;
635def S_CMP_GE_U32 : SOPC_CMP_32 <0x09, "s_cmp_ge_u32", COND_UGE>;
636def S_CMP_LT_U32 : SOPC_CMP_32 <0x0a, "s_cmp_lt_u32", COND_ULT>;
637def S_CMP_LE_U32 : SOPC_CMP_32 <0x0b, "s_cmp_le_u32", COND_ULE>;
638def S_BITCMP0_B32 : SOPC_32 <0x0c, "s_bitcmp0_b32">;
639def S_BITCMP1_B32 : SOPC_32 <0x0d, "s_bitcmp1_b32">;
640def S_BITCMP0_B64 : SOPC_64_32 <0x0e, "s_bitcmp0_b64">;
641def S_BITCMP1_B64 : SOPC_64_32 <0x0f, "s_bitcmp1_b64">;
642def S_SETVSKIP : SOPC_32 <0x10, "s_setvskip">;
643
644
645//===----------------------------------------------------------------------===//
646// SOPP Instructions
647//===----------------------------------------------------------------------===//
648
649class SOPPe <bits<7> op> : Enc32 {
650 bits <16> simm16;
651
652 let Inst{15-0} = simm16;
653 let Inst{22-16} = op;
654 let Inst{31-23} = 0x17f; // encoding
655}
656
657class SOPP <bits<7> op, dag ins, string asm, list<dag> pattern = []> :
658 InstSI <(outs), ins, asm, pattern >, SOPPe <op> {
659
660 let mayLoad = 0;
661 let mayStore = 0;
662 let hasSideEffects = 0;
663 let SALU = 1;
664 let SOPP = 1;
665 let SchedRW = [WriteSALU];
666
667 let UseNamedOperandTable = 1;
668 let SubtargetPredicate = isGCN;
669}
670
671
672def S_NOP : SOPP <0x00000000, (ins i16imm:$simm16), "s_nop $simm16">;
673
674let isTerminator = 1 in {
675
676def S_ENDPGM : SOPP <0x00000001, (ins), "s_endpgm",
677 [(AMDGPUendpgm)]> {
678 let simm16 = 0;
679 let isBarrier = 1;
680 let hasCtrlDep = 1;
681 let hasSideEffects = 1;
682}
683
684let isBranch = 1, SchedRW = [WriteBranch] in {
685def S_BRANCH : SOPP <
686 0x00000002, (ins sopp_brtarget:$simm16), "s_branch $simm16",
687 [(br bb:$simm16)]> {
688 let isBarrier = 1;
689}
690
691let Uses = [SCC] in {
692def S_CBRANCH_SCC0 : SOPP <
693 0x00000004, (ins sopp_brtarget:$simm16),
694 "s_cbranch_scc0 $simm16"
695>;
696def S_CBRANCH_SCC1 : SOPP <
697 0x00000005, (ins sopp_brtarget:$simm16),
698 "s_cbranch_scc1 $simm16",
699 [(si_uniform_br_scc SCC, bb:$simm16)]
700>;
701} // End Uses = [SCC]
702
703let Uses = [VCC] in {
704def S_CBRANCH_VCCZ : SOPP <
705 0x00000006, (ins sopp_brtarget:$simm16),
706 "s_cbranch_vccz $simm16"
707>;
708def S_CBRANCH_VCCNZ : SOPP <
709 0x00000007, (ins sopp_brtarget:$simm16),
710 "s_cbranch_vccnz $simm16"
711>;
712} // End Uses = [VCC]
713
714let Uses = [EXEC] in {
715def S_CBRANCH_EXECZ : SOPP <
716 0x00000008, (ins sopp_brtarget:$simm16),
717 "s_cbranch_execz $simm16"
718>;
719def S_CBRANCH_EXECNZ : SOPP <
720 0x00000009, (ins sopp_brtarget:$simm16),
721 "s_cbranch_execnz $simm16"
722>;
723} // End Uses = [EXEC]
724
725
726} // End isBranch = 1
727} // End isTerminator = 1
728
729let hasSideEffects = 1 in {
730def S_BARRIER : SOPP <0x0000000a, (ins), "s_barrier",
731 [(int_amdgcn_s_barrier)]> {
732 let SchedRW = [WriteBarrier];
733 let simm16 = 0;
734 let mayLoad = 1;
735 let mayStore = 1;
736 let isConvergent = 1;
737}
738
739let mayLoad = 1, mayStore = 1, hasSideEffects = 1 in
740def S_WAITCNT : SOPP <0x0000000c, (ins WAIT_FLAG:$simm16), "s_waitcnt $simm16">;
741def S_SETHALT : SOPP <0x0000000d, (ins i16imm:$simm16), "s_sethalt $simm16">;
742
743// On SI the documentation says sleep for approximately 64 * low 2
744// bits, consistent with the reported maximum of 448. On VI the
745// maximum reported is 960 cycles, so 960 / 64 = 15 max, so is the
746// maximum really 15 on VI?
747def S_SLEEP : SOPP <0x0000000e, (ins i32imm:$simm16),
748 "s_sleep $simm16", [(int_amdgcn_s_sleep SIMM16bit:$simm16)]> {
749 let hasSideEffects = 1;
750 let mayLoad = 1;
751 let mayStore = 1;
752}
753
754def S_SETPRIO : SOPP <0x0000000f, (ins i16imm:$simm16), "s_setprio $simm16">;
755
756let Uses = [EXEC, M0] in {
757// FIXME: Should this be mayLoad+mayStore?
758def S_SENDMSG : SOPP <0x00000010, (ins SendMsgImm:$simm16), "s_sendmsg $simm16",
759 [(AMDGPUsendmsg (i32 imm:$simm16))]
760>;
761} // End Uses = [EXEC, M0]
762
763def S_SENDMSGHALT : SOPP <0x00000011, (ins SendMsgImm:$simm16), "s_sendmsghalt $simm16">;
764def S_TRAP : SOPP <0x00000012, (ins i16imm:$simm16), "s_trap $simm16">;
765def S_ICACHE_INV : SOPP <0x00000013, (ins), "s_icache_inv"> {
766 let simm16 = 0;
767}
768def S_INCPERFLEVEL : SOPP <0x00000014, (ins i32imm:$simm16), "s_incperflevel $simm16",
769 [(int_amdgcn_s_incperflevel SIMM16bit:$simm16)]> {
770 let hasSideEffects = 1;
771 let mayLoad = 1;
772 let mayStore = 1;
773}
774def S_DECPERFLEVEL : SOPP <0x00000015, (ins i32imm:$simm16), "s_decperflevel $simm16",
775 [(int_amdgcn_s_decperflevel SIMM16bit:$simm16)]> {
776 let hasSideEffects = 1;
777 let mayLoad = 1;
778 let mayStore = 1;
779}
780def S_TTRACEDATA : SOPP <0x00000016, (ins), "s_ttracedata"> {
781 let simm16 = 0;
782}
783} // End hasSideEffects
784
785
786let Predicates = [isGCN] in {
787
788//===----------------------------------------------------------------------===//
789// S_GETREG_B32 Intrinsic Pattern.
790//===----------------------------------------------------------------------===//
791def : Pat <
792 (int_amdgcn_s_getreg imm:$simm16),
793 (S_GETREG_B32 (as_i16imm $simm16))
794>;
795
796//===----------------------------------------------------------------------===//
797// SOP1 Patterns
798//===----------------------------------------------------------------------===//
799
800def : Pat <
801 (i64 (ctpop i64:$src)),
802 (i64 (REG_SEQUENCE SReg_64,
803 (i32 (COPY_TO_REGCLASS (S_BCNT1_I32_B64 $src), SReg_32)), sub0,
804 (S_MOV_B32 0), sub1))
805>;
806
807def : Pat <
808 (i32 (smax i32:$x, (i32 (ineg i32:$x)))),
809 (S_ABS_I32 $x)
810>;
811
812//===----------------------------------------------------------------------===//
813// SOP2 Patterns
814//===----------------------------------------------------------------------===//
815
816// V_ADD_I32_e32/S_ADD_U32 produces carry in VCC/SCC. For the vector
817// case, the sgpr-copies pass will fix this to use the vector version.
818def : Pat <
819 (i32 (addc i32:$src0, i32:$src1)),
820 (S_ADD_U32 $src0, $src1)
821>;
822
823//===----------------------------------------------------------------------===//
824// SOPP Patterns
825//===----------------------------------------------------------------------===//
826
827def : Pat <
828 (int_amdgcn_s_waitcnt i32:$simm16),
829 (S_WAITCNT (as_i16imm $simm16))
830>;
831
832} // End isGCN predicate
833
834
835//===----------------------------------------------------------------------===//
836// Real target instructions, move this to the appropriate subtarget TD file
837//===----------------------------------------------------------------------===//
838
839class Select_si<string opName> :
840 SIMCInstr<opName, SIEncodingFamily.SI> {
841 list<Predicate> AssemblerPredicates = [isSICI];
842 string DecoderNamespace = "SICI";
843}
844
845class SOP1_Real_si<bits<8> op, SOP1_Pseudo ps> :
846 SOP1_Real<op, ps>,
847 Select_si<ps.Mnemonic>;
848
849class SOP2_Real_si<bits<7> op, SOP2_Pseudo ps> :
850 SOP2_Real<op, ps>,
851 Select_si<ps.Mnemonic>;
852
853class SOPK_Real_si<bits<5> op, SOPK_Pseudo ps> :
854 SOPK_Real32<op, ps>,
855 Select_si<ps.Mnemonic>;
856
857def S_MOV_B32_si : SOP1_Real_si <0x03, S_MOV_B32>;
858def S_MOV_B64_si : SOP1_Real_si <0x04, S_MOV_B64>;
859def S_CMOV_B32_si : SOP1_Real_si <0x05, S_CMOV_B32>;
860def S_CMOV_B64_si : SOP1_Real_si <0x06, S_CMOV_B64>;
861def S_NOT_B32_si : SOP1_Real_si <0x07, S_NOT_B32>;
862def S_NOT_B64_si : SOP1_Real_si <0x08, S_NOT_B64>;
863def S_WQM_B32_si : SOP1_Real_si <0x09, S_WQM_B32>;
864def S_WQM_B64_si : SOP1_Real_si <0x0a, S_WQM_B64>;
865def S_BREV_B32_si : SOP1_Real_si <0x0b, S_BREV_B32>;
866def S_BREV_B64_si : SOP1_Real_si <0x0c, S_BREV_B64>;
867def S_BCNT0_I32_B32_si : SOP1_Real_si <0x0d, S_BCNT0_I32_B32>;
868def S_BCNT0_I32_B64_si : SOP1_Real_si <0x0e, S_BCNT0_I32_B64>;
869def S_BCNT1_I32_B32_si : SOP1_Real_si <0x0f, S_BCNT1_I32_B32>;
870def S_BCNT1_I32_B64_si : SOP1_Real_si <0x10, S_BCNT1_I32_B64>;
871def S_FF0_I32_B32_si : SOP1_Real_si <0x11, S_FF0_I32_B32>;
872def S_FF0_I32_B64_si : SOP1_Real_si <0x12, S_FF0_I32_B64>;
873def S_FF1_I32_B32_si : SOP1_Real_si <0x13, S_FF1_I32_B32>;
874def S_FF1_I32_B64_si : SOP1_Real_si <0x14, S_FF1_I32_B64>;
875def S_FLBIT_I32_B32_si : SOP1_Real_si <0x15, S_FLBIT_I32_B32>;
876def S_FLBIT_I32_B64_si : SOP1_Real_si <0x16, S_FLBIT_I32_B64>;
877def S_FLBIT_I32_si : SOP1_Real_si <0x17, S_FLBIT_I32>;
878def S_FLBIT_I32_I64_si : SOP1_Real_si <0x18, S_FLBIT_I32_I64>;
879def S_SEXT_I32_I8_si : SOP1_Real_si <0x19, S_SEXT_I32_I8>;
880def S_SEXT_I32_I16_si : SOP1_Real_si <0x1a, S_SEXT_I32_I16>;
881def S_BITSET0_B32_si : SOP1_Real_si <0x1b, S_BITSET0_B32>;
882def S_BITSET0_B64_si : SOP1_Real_si <0x1c, S_BITSET0_B64>;
883def S_BITSET1_B32_si : SOP1_Real_si <0x1d, S_BITSET1_B32>;
884def S_BITSET1_B64_si : SOP1_Real_si <0x1e, S_BITSET1_B64>;
885def S_GETPC_B64_si : SOP1_Real_si <0x1f, S_GETPC_B64>;
886def S_SETPC_B64_si : SOP1_Real_si <0x20, S_SETPC_B64>;
887def S_SWAPPC_B64_si : SOP1_Real_si <0x21, S_SWAPPC_B64>;
888def S_RFE_B64_si : SOP1_Real_si <0x22, S_RFE_B64>;
889def S_AND_SAVEEXEC_B64_si : SOP1_Real_si <0x24, S_AND_SAVEEXEC_B64>;
890def S_OR_SAVEEXEC_B64_si : SOP1_Real_si <0x25, S_OR_SAVEEXEC_B64>;
891def S_XOR_SAVEEXEC_B64_si : SOP1_Real_si <0x26, S_XOR_SAVEEXEC_B64>;
892def S_ANDN2_SAVEEXEC_B64_si: SOP1_Real_si <0x27, S_ANDN2_SAVEEXEC_B64>;
893def S_ORN2_SAVEEXEC_B64_si : SOP1_Real_si <0x28, S_ORN2_SAVEEXEC_B64>;
894def S_NAND_SAVEEXEC_B64_si : SOP1_Real_si <0x29, S_NAND_SAVEEXEC_B64>;
895def S_NOR_SAVEEXEC_B64_si : SOP1_Real_si <0x2a, S_NOR_SAVEEXEC_B64>;
896def S_XNOR_SAVEEXEC_B64_si : SOP1_Real_si <0x2b, S_XNOR_SAVEEXEC_B64>;
897def S_QUADMASK_B32_si : SOP1_Real_si <0x2c, S_QUADMASK_B32>;
898def S_QUADMASK_B64_si : SOP1_Real_si <0x2d, S_QUADMASK_B64>;
899def S_MOVRELS_B32_si : SOP1_Real_si <0x2e, S_MOVRELS_B32>;
900def S_MOVRELS_B64_si : SOP1_Real_si <0x2f, S_MOVRELS_B64>;
901def S_MOVRELD_B32_si : SOP1_Real_si <0x30, S_MOVRELD_B32>;
902def S_MOVRELD_B64_si : SOP1_Real_si <0x31, S_MOVRELD_B64>;
903def S_CBRANCH_JOIN_si : SOP1_Real_si <0x32, S_CBRANCH_JOIN>;
904def S_MOV_REGRD_B32_si : SOP1_Real_si <0x33, S_MOV_REGRD_B32>;
905def S_ABS_I32_si : SOP1_Real_si <0x34, S_ABS_I32>;
906def S_MOV_FED_B32_si : SOP1_Real_si <0x35, S_MOV_FED_B32>;
907
908def S_ADD_U32_si : SOP2_Real_si <0x00, S_ADD_U32>;
909def S_ADD_I32_si : SOP2_Real_si <0x02, S_ADD_I32>;
910def S_SUB_U32_si : SOP2_Real_si <0x01, S_SUB_U32>;
911def S_SUB_I32_si : SOP2_Real_si <0x03, S_SUB_I32>;
912def S_ADDC_U32_si : SOP2_Real_si <0x04, S_ADDC_U32>;
913def S_SUBB_U32_si : SOP2_Real_si <0x05, S_SUBB_U32>;
914def S_MIN_I32_si : SOP2_Real_si <0x06, S_MIN_I32>;
915def S_MIN_U32_si : SOP2_Real_si <0x07, S_MIN_U32>;
916def S_MAX_I32_si : SOP2_Real_si <0x08, S_MAX_I32>;
917def S_MAX_U32_si : SOP2_Real_si <0x09, S_MAX_U32>;
918def S_CSELECT_B32_si : SOP2_Real_si <0x0a, S_CSELECT_B32>;
919def S_CSELECT_B64_si : SOP2_Real_si <0x0b, S_CSELECT_B64>;
920def S_AND_B32_si : SOP2_Real_si <0x0e, S_AND_B32>;
921def S_AND_B64_si : SOP2_Real_si <0x0f, S_AND_B64>;
922def S_OR_B32_si : SOP2_Real_si <0x10, S_OR_B32>;
923def S_OR_B64_si : SOP2_Real_si <0x11, S_OR_B64>;
924def S_XOR_B32_si : SOP2_Real_si <0x12, S_XOR_B32>;
925def S_XOR_B64_si : SOP2_Real_si <0x13, S_XOR_B64>;
926def S_ANDN2_B32_si : SOP2_Real_si <0x14, S_ANDN2_B32>;
927def S_ANDN2_B64_si : SOP2_Real_si <0x15, S_ANDN2_B64>;
928def S_ORN2_B32_si : SOP2_Real_si <0x16, S_ORN2_B32>;
929def S_ORN2_B64_si : SOP2_Real_si <0x17, S_ORN2_B64>;
930def S_NAND_B32_si : SOP2_Real_si <0x18, S_NAND_B32>;
931def S_NAND_B64_si : SOP2_Real_si <0x19, S_NAND_B64>;
932def S_NOR_B32_si : SOP2_Real_si <0x1a, S_NOR_B32>;
933def S_NOR_B64_si : SOP2_Real_si <0x1b, S_NOR_B64>;
934def S_XNOR_B32_si : SOP2_Real_si <0x1c, S_XNOR_B32>;
935def S_XNOR_B64_si : SOP2_Real_si <0x1d, S_XNOR_B64>;
936def S_LSHL_B32_si : SOP2_Real_si <0x1e, S_LSHL_B32>;
937def S_LSHL_B64_si : SOP2_Real_si <0x1f, S_LSHL_B64>;
938def S_LSHR_B32_si : SOP2_Real_si <0x20, S_LSHR_B32>;
939def S_LSHR_B64_si : SOP2_Real_si <0x21, S_LSHR_B64>;
940def S_ASHR_I32_si : SOP2_Real_si <0x22, S_ASHR_I32>;
941def S_ASHR_I64_si : SOP2_Real_si <0x23, S_ASHR_I64>;
942def S_BFM_B32_si : SOP2_Real_si <0x24, S_BFM_B32>;
943def S_BFM_B64_si : SOP2_Real_si <0x25, S_BFM_B64>;
944def S_MUL_I32_si : SOP2_Real_si <0x26, S_MUL_I32>;
945def S_BFE_U32_si : SOP2_Real_si <0x27, S_BFE_U32>;
946def S_BFE_I32_si : SOP2_Real_si <0x28, S_BFE_I32>;
947def S_BFE_U64_si : SOP2_Real_si <0x29, S_BFE_U64>;
948def S_BFE_I64_si : SOP2_Real_si <0x2a, S_BFE_I64>;
949def S_CBRANCH_G_FORK_si : SOP2_Real_si <0x2b, S_CBRANCH_G_FORK>;
950def S_ABSDIFF_I32_si : SOP2_Real_si <0x2c, S_ABSDIFF_I32>;
951
952def S_MOVK_I32_si : SOPK_Real_si <0x00, S_MOVK_I32>;
953def S_CMOVK_I32_si : SOPK_Real_si <0x02, S_CMOVK_I32>;
954def S_CMPK_EQ_I32_si : SOPK_Real_si <0x03, S_CMPK_EQ_I32>;
955def S_CMPK_LG_I32_si : SOPK_Real_si <0x04, S_CMPK_LG_I32>;
956def S_CMPK_GT_I32_si : SOPK_Real_si <0x05, S_CMPK_GT_I32>;
957def S_CMPK_GE_I32_si : SOPK_Real_si <0x06, S_CMPK_GE_I32>;
958def S_CMPK_LT_I32_si : SOPK_Real_si <0x07, S_CMPK_LT_I32>;
959def S_CMPK_LE_I32_si : SOPK_Real_si <0x08, S_CMPK_LE_I32>;
960def S_CMPK_EQ_U32_si : SOPK_Real_si <0x09, S_CMPK_EQ_U32>;
961def S_CMPK_LG_U32_si : SOPK_Real_si <0x0a, S_CMPK_LG_U32>;
962def S_CMPK_GT_U32_si : SOPK_Real_si <0x0b, S_CMPK_GT_U32>;
963def S_CMPK_GE_U32_si : SOPK_Real_si <0x0c, S_CMPK_GE_U32>;
964def S_CMPK_LT_U32_si : SOPK_Real_si <0x0d, S_CMPK_LT_U32>;
965def S_CMPK_LE_U32_si : SOPK_Real_si <0x0e, S_CMPK_LE_U32>;
966def S_ADDK_I32_si : SOPK_Real_si <0x0f, S_ADDK_I32>;
967def S_MULK_I32_si : SOPK_Real_si <0x10, S_MULK_I32>;
968def S_CBRANCH_I_FORK_si : SOPK_Real_si <0x11, S_CBRANCH_I_FORK>;
969def S_GETREG_B32_si : SOPK_Real_si <0x12, S_GETREG_B32>;
970def S_SETREG_B32_si : SOPK_Real_si <0x13, S_SETREG_B32>;
971//def S_GETREG_REGRD_B32_si : SOPK_Real_si <0x14, S_GETREG_REGRD_B32>; // see pseudo for comments
972def S_SETREG_IMM32_B32_si : SOPK_Real64<0x15, S_SETREG_IMM32_B32>,
973 Select_si<S_SETREG_IMM32_B32.Mnemonic>;
974
975
976class Select_vi<string opName> :
977 SIMCInstr<opName, SIEncodingFamily.VI> {
978 list<Predicate> AssemblerPredicates = [isVI];
979 string DecoderNamespace = "VI";
980}
981
982class SOP1_Real_vi<bits<8> op, SOP1_Pseudo ps> :
983 SOP1_Real<op, ps>,
984 Select_vi<ps.Mnemonic>;
985
986
987class SOP2_Real_vi<bits<7> op, SOP2_Pseudo ps> :
988 SOP2_Real<op, ps>,
989 Select_vi<ps.Mnemonic>;
990
991class SOPK_Real_vi<bits<5> op, SOPK_Pseudo ps> :
992 SOPK_Real32<op, ps>,
993 Select_vi<ps.Mnemonic>;
994
995def S_MOV_B32_vi : SOP1_Real_vi <0x00, S_MOV_B32>;
996def S_MOV_B64_vi : SOP1_Real_vi <0x01, S_MOV_B64>;
997def S_CMOV_B32_vi : SOP1_Real_vi <0x02, S_CMOV_B32>;
998def S_CMOV_B64_vi : SOP1_Real_vi <0x03, S_CMOV_B64>;
999def S_NOT_B32_vi : SOP1_Real_vi <0x04, S_NOT_B32>;
1000def S_NOT_B64_vi : SOP1_Real_vi <0x05, S_NOT_B64>;
1001def S_WQM_B32_vi : SOP1_Real_vi <0x06, S_WQM_B32>;
1002def S_WQM_B64_vi : SOP1_Real_vi <0x07, S_WQM_B64>;
1003def S_BREV_B32_vi : SOP1_Real_vi <0x08, S_BREV_B32>;
1004def S_BREV_B64_vi : SOP1_Real_vi <0x09, S_BREV_B64>;
1005def S_BCNT0_I32_B32_vi : SOP1_Real_vi <0x0a, S_BCNT0_I32_B32>;
1006def S_BCNT0_I32_B64_vi : SOP1_Real_vi <0x0b, S_BCNT0_I32_B64>;
1007def S_BCNT1_I32_B32_vi : SOP1_Real_vi <0x0c, S_BCNT1_I32_B32>;
1008def S_BCNT1_I32_B64_vi : SOP1_Real_vi <0x0d, S_BCNT1_I32_B64>;
1009def S_FF0_I32_B32_vi : SOP1_Real_vi <0x0e, S_FF0_I32_B32>;
1010def S_FF0_I32_B64_vi : SOP1_Real_vi <0x0f, S_FF0_I32_B64>;
1011def S_FF1_I32_B32_vi : SOP1_Real_vi <0x10, S_FF1_I32_B32>;
1012def S_FF1_I32_B64_vi : SOP1_Real_vi <0x11, S_FF1_I32_B64>;
1013def S_FLBIT_I32_B32_vi : SOP1_Real_vi <0x12, S_FLBIT_I32_B32>;
1014def S_FLBIT_I32_B64_vi : SOP1_Real_vi <0x13, S_FLBIT_I32_B64>;
1015def S_FLBIT_I32_vi : SOP1_Real_vi <0x14, S_FLBIT_I32>;
1016def S_FLBIT_I32_I64_vi : SOP1_Real_vi <0x15, S_FLBIT_I32_I64>;
1017def S_SEXT_I32_I8_vi : SOP1_Real_vi <0x16, S_SEXT_I32_I8>;
1018def S_SEXT_I32_I16_vi : SOP1_Real_vi <0x17, S_SEXT_I32_I16>;
1019def S_BITSET0_B32_vi : SOP1_Real_vi <0x18, S_BITSET0_B32>;
1020def S_BITSET0_B64_vi : SOP1_Real_vi <0x19, S_BITSET0_B64>;
1021def S_BITSET1_B32_vi : SOP1_Real_vi <0x1a, S_BITSET1_B32>;
1022def S_BITSET1_B64_vi : SOP1_Real_vi <0x1b, S_BITSET1_B64>;
1023def S_GETPC_B64_vi : SOP1_Real_vi <0x1c, S_GETPC_B64>;
1024def S_SETPC_B64_vi : SOP1_Real_vi <0x1d, S_SETPC_B64>;
1025def S_SWAPPC_B64_vi : SOP1_Real_vi <0x1e, S_SWAPPC_B64>;
1026def S_RFE_B64_vi : SOP1_Real_vi <0x1f, S_RFE_B64>;
1027def S_AND_SAVEEXEC_B64_vi : SOP1_Real_vi <0x20, S_AND_SAVEEXEC_B64>;
1028def S_OR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x21, S_OR_SAVEEXEC_B64>;
1029def S_XOR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x22, S_XOR_SAVEEXEC_B64>;
1030def S_ANDN2_SAVEEXEC_B64_vi: SOP1_Real_vi <0x23, S_ANDN2_SAVEEXEC_B64>;
1031def S_ORN2_SAVEEXEC_B64_vi : SOP1_Real_vi <0x24, S_ORN2_SAVEEXEC_B64>;
1032def S_NAND_SAVEEXEC_B64_vi : SOP1_Real_vi <0x25, S_NAND_SAVEEXEC_B64>;
1033def S_NOR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x26, S_NOR_SAVEEXEC_B64>;
1034def S_XNOR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x27, S_XNOR_SAVEEXEC_B64>;
1035def S_QUADMASK_B32_vi : SOP1_Real_vi <0x28, S_QUADMASK_B32>;
1036def S_QUADMASK_B64_vi : SOP1_Real_vi <0x29, S_QUADMASK_B64>;
1037def S_MOVRELS_B32_vi : SOP1_Real_vi <0x2a, S_MOVRELS_B32>;
1038def S_MOVRELS_B64_vi : SOP1_Real_vi <0x2b, S_MOVRELS_B64>;
1039def S_MOVRELD_B32_vi : SOP1_Real_vi <0x2c, S_MOVRELD_B32>;
1040def S_MOVRELD_B64_vi : SOP1_Real_vi <0x2d, S_MOVRELD_B64>;
1041def S_CBRANCH_JOIN_vi : SOP1_Real_vi <0x2e, S_CBRANCH_JOIN>;
1042def S_MOV_REGRD_B32_vi : SOP1_Real_vi <0x2f, S_MOV_REGRD_B32>;
1043def S_ABS_I32_vi : SOP1_Real_vi <0x30, S_ABS_I32>;
1044def S_MOV_FED_B32_vi : SOP1_Real_vi <0x31, S_MOV_FED_B32>;
1045
1046def S_ADD_U32_vi : SOP2_Real_vi <0x00, S_ADD_U32>;
1047def S_ADD_I32_vi : SOP2_Real_vi <0x02, S_ADD_I32>;
1048def S_SUB_U32_vi : SOP2_Real_vi <0x01, S_SUB_U32>;
1049def S_SUB_I32_vi : SOP2_Real_vi <0x03, S_SUB_I32>;
1050def S_ADDC_U32_vi : SOP2_Real_vi <0x04, S_ADDC_U32>;
1051def S_SUBB_U32_vi : SOP2_Real_vi <0x05, S_SUBB_U32>;
1052def S_MIN_I32_vi : SOP2_Real_vi <0x06, S_MIN_I32>;
1053def S_MIN_U32_vi : SOP2_Real_vi <0x07, S_MIN_U32>;
1054def S_MAX_I32_vi : SOP2_Real_vi <0x08, S_MAX_I32>;
1055def S_MAX_U32_vi : SOP2_Real_vi <0x09, S_MAX_U32>;
1056def S_CSELECT_B32_vi : SOP2_Real_vi <0x0a, S_CSELECT_B32>;
1057def S_CSELECT_B64_vi : SOP2_Real_vi <0x0b, S_CSELECT_B64>;
1058def S_AND_B32_vi : SOP2_Real_vi <0x0c, S_AND_B32>;
1059def S_AND_B64_vi : SOP2_Real_vi <0x0d, S_AND_B64>;
1060def S_OR_B32_vi : SOP2_Real_vi <0x0e, S_OR_B32>;
1061def S_OR_B64_vi : SOP2_Real_vi <0x0f, S_OR_B64>;
1062def S_XOR_B32_vi : SOP2_Real_vi <0x10, S_XOR_B32>;
1063def S_XOR_B64_vi : SOP2_Real_vi <0x11, S_XOR_B64>;
1064def S_ANDN2_B32_vi : SOP2_Real_vi <0x12, S_ANDN2_B32>;
1065def S_ANDN2_B64_vi : SOP2_Real_vi <0x13, S_ANDN2_B64>;
1066def S_ORN2_B32_vi : SOP2_Real_vi <0x14, S_ORN2_B32>;
1067def S_ORN2_B64_vi : SOP2_Real_vi <0x15, S_ORN2_B64>;
1068def S_NAND_B32_vi : SOP2_Real_vi <0x16, S_NAND_B32>;
1069def S_NAND_B64_vi : SOP2_Real_vi <0x17, S_NAND_B64>;
1070def S_NOR_B32_vi : SOP2_Real_vi <0x18, S_NOR_B32>;
1071def S_NOR_B64_vi : SOP2_Real_vi <0x19, S_NOR_B64>;
1072def S_XNOR_B32_vi : SOP2_Real_vi <0x1a, S_XNOR_B32>;
1073def S_XNOR_B64_vi : SOP2_Real_vi <0x1b, S_XNOR_B64>;
1074def S_LSHL_B32_vi : SOP2_Real_vi <0x1c, S_LSHL_B32>;
1075def S_LSHL_B64_vi : SOP2_Real_vi <0x1d, S_LSHL_B64>;
1076def S_LSHR_B32_vi : SOP2_Real_vi <0x1e, S_LSHR_B32>;
1077def S_LSHR_B64_vi : SOP2_Real_vi <0x1f, S_LSHR_B64>;
1078def S_ASHR_I32_vi : SOP2_Real_vi <0x20, S_ASHR_I32>;
1079def S_ASHR_I64_vi : SOP2_Real_vi <0x21, S_ASHR_I64>;
1080def S_BFM_B32_vi : SOP2_Real_vi <0x22, S_BFM_B32>;
1081def S_BFM_B64_vi : SOP2_Real_vi <0x23, S_BFM_B64>;
1082def S_MUL_I32_vi : SOP2_Real_vi <0x24, S_MUL_I32>;
1083def S_BFE_U32_vi : SOP2_Real_vi <0x25, S_BFE_U32>;
1084def S_BFE_I32_vi : SOP2_Real_vi <0x26, S_BFE_I32>;
1085def S_BFE_U64_vi : SOP2_Real_vi <0x27, S_BFE_U64>;
1086def S_BFE_I64_vi : SOP2_Real_vi <0x28, S_BFE_I64>;
1087def S_CBRANCH_G_FORK_vi : SOP2_Real_vi <0x29, S_CBRANCH_G_FORK>;
1088def S_ABSDIFF_I32_vi : SOP2_Real_vi <0x2a, S_ABSDIFF_I32>;
1089
1090def S_MOVK_I32_vi : SOPK_Real_vi <0x00, S_MOVK_I32>;
1091def S_CMOVK_I32_vi : SOPK_Real_vi <0x01, S_CMOVK_I32>;
1092def S_CMPK_EQ_I32_vi : SOPK_Real_vi <0x02, S_CMPK_EQ_I32>;
1093def S_CMPK_LG_I32_vi : SOPK_Real_vi <0x03, S_CMPK_LG_I32>;
1094def S_CMPK_GT_I32_vi : SOPK_Real_vi <0x04, S_CMPK_GT_I32>;
1095def S_CMPK_GE_I32_vi : SOPK_Real_vi <0x05, S_CMPK_GE_I32>;
1096def S_CMPK_LT_I32_vi : SOPK_Real_vi <0x06, S_CMPK_LT_I32>;
1097def S_CMPK_LE_I32_vi : SOPK_Real_vi <0x07, S_CMPK_LE_I32>;
1098def S_CMPK_EQ_U32_vi : SOPK_Real_vi <0x08, S_CMPK_EQ_U32>;
1099def S_CMPK_LG_U32_vi : SOPK_Real_vi <0x09, S_CMPK_LG_U32>;
1100def S_CMPK_GT_U32_vi : SOPK_Real_vi <0x0A, S_CMPK_GT_U32>;
1101def S_CMPK_GE_U32_vi : SOPK_Real_vi <0x0B, S_CMPK_GE_U32>;
1102def S_CMPK_LT_U32_vi : SOPK_Real_vi <0x0C, S_CMPK_LT_U32>;
1103def S_CMPK_LE_U32_vi : SOPK_Real_vi <0x0D, S_CMPK_LE_U32>;
1104def S_ADDK_I32_vi : SOPK_Real_vi <0x0E, S_ADDK_I32>;
1105def S_MULK_I32_vi : SOPK_Real_vi <0x0F, S_MULK_I32>;
1106def S_CBRANCH_I_FORK_vi : SOPK_Real_vi <0x10, S_CBRANCH_I_FORK>;
1107def S_GETREG_B32_vi : SOPK_Real_vi <0x11, S_GETREG_B32>;
1108def S_SETREG_B32_vi : SOPK_Real_vi <0x12, S_SETREG_B32>;
1109//def S_GETREG_REGRD_B32_vi : SOPK_Real_vi <0x13, S_GETREG_REGRD_B32>; // see pseudo for comments
1110def S_SETREG_IMM32_B32_vi : SOPK_Real64<0x14, S_SETREG_IMM32_B32>,
Tom Stellard2add8a12016-09-06 20:00:26 +00001111 Select_vi<S_SETREG_IMM32_B32.Mnemonic>;