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