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