blob: 5a42016074beb25a4e97e1357763b4fea1b1b7aa [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
Matt Arsenault7ccf6cd2016-09-16 21:41:16 +0000476class SOPKInstTable <bit is_sopk, string cmpOp = ""> {
477 bit IsSOPK = is_sopk;
478 string BaseCmpOp = cmpOp;
479}
480
Valery Pykhtina34fb492016-08-30 15:20:31 +0000481class SOPK_32 <string opName, list<dag> pattern=[]> : SOPK_Pseudo <
482 opName,
483 (outs SReg_32:$sdst),
484 (ins u16imm:$simm16),
485 "$sdst, $simm16",
486 pattern>;
487
Matt Arsenault7ccf6cd2016-09-16 21:41:16 +0000488class SOPK_SCC <string opName, string base_op = ""> : SOPK_Pseudo <
Valery Pykhtina34fb492016-08-30 15:20:31 +0000489 opName,
490 (outs),
491 (ins SReg_32:$sdst, u16imm:$simm16),
Matt Arsenault7ccf6cd2016-09-16 21:41:16 +0000492 "$sdst, $simm16", []>,
493 SOPKInstTable<1, base_op>{
Valery Pykhtina34fb492016-08-30 15:20:31 +0000494 let Defs = [SCC];
495}
496
497class SOPK_32TIE <string opName, list<dag> pattern=[]> : SOPK_Pseudo <
498 opName,
499 (outs SReg_32:$sdst),
500 (ins SReg_32:$src0, u16imm:$simm16),
501 "$sdst, $simm16",
502 pattern
503>;
504
505let isReMaterializable = 1, isMoveImm = 1 in {
506def S_MOVK_I32 : SOPK_32 <"s_movk_i32">;
507} // End isReMaterializable = 1
508let Uses = [SCC] in {
509def S_CMOVK_I32 : SOPK_32 <"s_cmovk_i32">;
510}
511
512let isCompare = 1 in {
513
514// This instruction is disabled for now until we can figure out how to teach
515// the instruction selector to correctly use the S_CMP* vs V_CMP*
516// instructions.
517//
518// When this instruction is enabled the code generator sometimes produces this
519// invalid sequence:
520//
521// SCC = S_CMPK_EQ_I32 SGPR0, imm
522// VCC = COPY SCC
523// VGPR0 = V_CNDMASK VCC, VGPR0, VGPR1
524//
525// def S_CMPK_EQ_I32 : SOPK_SCC <"s_cmpk_eq_i32",
526// [(set i1:$dst, (setcc i32:$src0, imm:$src1, SETEQ))]
527// >;
528
Matt Arsenault7ccf6cd2016-09-16 21:41:16 +0000529def S_CMPK_EQ_I32 : SOPK_SCC <"s_cmpk_eq_i32", "s_cmp_eq_i32">;
530def S_CMPK_LG_I32 : SOPK_SCC <"s_cmpk_lg_i32", "s_cmp_lg_i32">;
531def S_CMPK_GT_I32 : SOPK_SCC <"s_cmpk_gt_i32", "s_cmp_gt_i32">;
532def S_CMPK_GE_I32 : SOPK_SCC <"s_cmpk_ge_i32", "s_cmp_ge_i32">;
533def S_CMPK_LT_I32 : SOPK_SCC <"s_cmpk_lt_i32", "s_cmp_lt_i32">;
534def S_CMPK_LE_I32 : SOPK_SCC <"s_cmpk_le_i32", "s_cmp_le_i32">;
535
536let SOPKZext = 1 in {
537def S_CMPK_EQ_U32 : SOPK_SCC <"s_cmpk_eq_u32", "s_cmp_eq_u32">;
538def S_CMPK_LG_U32 : SOPK_SCC <"s_cmpk_lg_u32", "s_cmp_lg_u32">;
539def S_CMPK_GT_U32 : SOPK_SCC <"s_cmpk_gt_u32", "s_cmp_gt_u32">;
540def S_CMPK_GE_U32 : SOPK_SCC <"s_cmpk_ge_u32", "s_cmp_ge_u32">;
541def S_CMPK_LT_U32 : SOPK_SCC <"s_cmpk_lt_u32", "s_cmp_lt_u32">;
542def S_CMPK_LE_U32 : SOPK_SCC <"s_cmpk_le_u32", "s_cmp_le_u32">;
543} // End SOPKZext = 1
Valery Pykhtina34fb492016-08-30 15:20:31 +0000544} // End isCompare = 1
545
546let Defs = [SCC], isCommutable = 1, DisableEncoding = "$src0",
547 Constraints = "$sdst = $src0" in {
548 def S_ADDK_I32 : SOPK_32TIE <"s_addk_i32">;
549 def S_MULK_I32 : SOPK_32TIE <"s_mulk_i32">;
550}
551
552def S_CBRANCH_I_FORK : SOPK_Pseudo <
553 "s_cbranch_i_fork",
554 (outs), (ins SReg_64:$sdst, u16imm:$simm16),
555 "$sdst, $simm16"
556>;
557
558let mayLoad = 1 in {
559def S_GETREG_B32 : SOPK_Pseudo <
560 "s_getreg_b32",
561 (outs SReg_32:$sdst), (ins hwreg:$simm16),
562 "$sdst, $simm16"
563>;
564}
565
566def S_SETREG_B32 : SOPK_Pseudo <
567 "s_setreg_b32",
568 (outs), (ins SReg_32:$sdst, hwreg:$simm16),
569 "$simm16, $sdst"
570>;
571
572// FIXME: Not on SI?
573//def S_GETREG_REGRD_B32 : SOPK_32 <sopk<0x14, 0x13>, "s_getreg_regrd_b32">;
574
575def S_SETREG_IMM32_B32 : SOPK_Pseudo <
576 "s_setreg_imm32_b32",
577 (outs), (ins i32imm:$imm, hwreg:$simm16),
578 "$simm16, $imm"
579> {
580 let has_sdst = 0;
581}
582
583
584//===----------------------------------------------------------------------===//
585// SOPC Instructions
586//===----------------------------------------------------------------------===//
587
588class SOPCe <bits<7> op> : Enc32 {
589 bits<8> src0;
590 bits<8> src1;
591
592 let Inst{7-0} = src0;
593 let Inst{15-8} = src1;
594 let Inst{22-16} = op;
595 let Inst{31-23} = 0x17e;
596}
597
598class SOPC <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
599 InstSI<outs, ins, asm, pattern>, SOPCe <op> {
600 let mayLoad = 0;
601 let mayStore = 0;
602 let hasSideEffects = 0;
603 let SALU = 1;
604 let SOPC = 1;
605 let isCodeGenOnly = 0;
606 let Defs = [SCC];
607 let SchedRW = [WriteSALU];
608 let UseNamedOperandTable = 1;
609 let SubtargetPredicate = isGCN;
610}
611
612class SOPC_Base <bits<7> op, RegisterOperand rc0, RegisterOperand rc1,
613 string opName, list<dag> pattern = []> : SOPC <
614 op, (outs), (ins rc0:$src0, rc1:$src1),
615 opName#" $src0, $src1", pattern > {
616 let Defs = [SCC];
617}
618class SOPC_Helper <bits<7> op, RegisterOperand rc, ValueType vt,
619 string opName, PatLeaf cond> : SOPC_Base <
620 op, rc, rc, opName,
621 [(set SCC, (si_setcc_uniform vt:$src0, vt:$src1, cond))] > {
622}
623
Matt Arsenault7ccf6cd2016-09-16 21:41:16 +0000624class SOPC_CMP_32<bits<7> op, string opName,
625 PatLeaf cond = COND_NULL, string revOp = opName>
626 : SOPC_Helper<op, SSrc_b32, i32, opName, cond>,
627 Commutable_REV<revOp, !eq(revOp, opName)>,
628 SOPKInstTable<0, opName> {
629 let isCompare = 1;
630 let isCommutable = 1;
631}
Valery Pykhtina34fb492016-08-30 15:20:31 +0000632
Matt Arsenault7b1dc2c2016-09-17 02:02:19 +0000633class SOPC_CMP_64<bits<7> op, string opName,
634 PatLeaf cond = COND_NULL, string revOp = opName>
635 : SOPC_Helper<op, SSrc_b64, i64, opName, cond>,
636 Commutable_REV<revOp, !eq(revOp, opName)> {
637 let isCompare = 1;
638 let isCommutable = 1;
639}
640
Valery Pykhtina34fb492016-08-30 15:20:31 +0000641class SOPC_32<bits<7> op, string opName, list<dag> pattern = []>
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000642 : SOPC_Base<op, SSrc_b32, SSrc_b32, opName, pattern>;
Valery Pykhtina34fb492016-08-30 15:20:31 +0000643
644class SOPC_64_32<bits<7> op, string opName, list<dag> pattern = []>
Sam Kolton1eeb11b2016-09-09 14:44:04 +0000645 : SOPC_Base<op, SSrc_b64, SSrc_b32, opName, pattern>;
Valery Pykhtina34fb492016-08-30 15:20:31 +0000646
Matt Arsenault5d8eb252016-09-30 01:50:20 +0000647def S_CMP_EQ_I32 : SOPC_CMP_32 <0x00, "s_cmp_eq_i32">;
648def S_CMP_LG_I32 : SOPC_CMP_32 <0x01, "s_cmp_lg_i32">;
Valery Pykhtina34fb492016-08-30 15:20:31 +0000649def S_CMP_GT_I32 : SOPC_CMP_32 <0x02, "s_cmp_gt_i32", COND_SGT>;
650def S_CMP_GE_I32 : SOPC_CMP_32 <0x03, "s_cmp_ge_i32", COND_SGE>;
Matt Arsenault7ccf6cd2016-09-16 21:41:16 +0000651def S_CMP_LT_I32 : SOPC_CMP_32 <0x04, "s_cmp_lt_i32", COND_SLT, "s_cmp_gt_i32">;
652def S_CMP_LE_I32 : SOPC_CMP_32 <0x05, "s_cmp_le_i32", COND_SLE, "s_cmp_ge_i32">;
Valery Pykhtina34fb492016-08-30 15:20:31 +0000653def S_CMP_EQ_U32 : SOPC_CMP_32 <0x06, "s_cmp_eq_u32", COND_EQ>;
Matt Arsenault7ccf6cd2016-09-16 21:41:16 +0000654def S_CMP_LG_U32 : SOPC_CMP_32 <0x07, "s_cmp_lg_u32", COND_NE>;
Valery Pykhtina34fb492016-08-30 15:20:31 +0000655def S_CMP_GT_U32 : SOPC_CMP_32 <0x08, "s_cmp_gt_u32", COND_UGT>;
656def S_CMP_GE_U32 : SOPC_CMP_32 <0x09, "s_cmp_ge_u32", COND_UGE>;
Matt Arsenault7ccf6cd2016-09-16 21:41:16 +0000657def S_CMP_LT_U32 : SOPC_CMP_32 <0x0a, "s_cmp_lt_u32", COND_ULT, "s_cmp_gt_u32">;
658def S_CMP_LE_U32 : SOPC_CMP_32 <0x0b, "s_cmp_le_u32", COND_ULE, "s_cmp_ge_u32">;
659
Valery Pykhtina34fb492016-08-30 15:20:31 +0000660def S_BITCMP0_B32 : SOPC_32 <0x0c, "s_bitcmp0_b32">;
661def S_BITCMP1_B32 : SOPC_32 <0x0d, "s_bitcmp1_b32">;
662def S_BITCMP0_B64 : SOPC_64_32 <0x0e, "s_bitcmp0_b64">;
663def S_BITCMP1_B64 : SOPC_64_32 <0x0f, "s_bitcmp1_b64">;
664def S_SETVSKIP : SOPC_32 <0x10, "s_setvskip">;
665
Matt Arsenault7b1dc2c2016-09-17 02:02:19 +0000666let SubtargetPredicate = isVI in {
667def S_CMP_EQ_U64 : SOPC_CMP_64 <0x12, "s_cmp_eq_u64", COND_EQ>;
668def S_CMP_LG_U64 : SOPC_CMP_64 <0x13, "s_cmp_lg_u64", COND_NE>;
669}
Valery Pykhtina34fb492016-08-30 15:20:31 +0000670
671//===----------------------------------------------------------------------===//
672// SOPP Instructions
673//===----------------------------------------------------------------------===//
674
675class SOPPe <bits<7> op> : Enc32 {
676 bits <16> simm16;
677
678 let Inst{15-0} = simm16;
679 let Inst{22-16} = op;
680 let Inst{31-23} = 0x17f; // encoding
681}
682
683class SOPP <bits<7> op, dag ins, string asm, list<dag> pattern = []> :
684 InstSI <(outs), ins, asm, pattern >, SOPPe <op> {
685
686 let mayLoad = 0;
687 let mayStore = 0;
688 let hasSideEffects = 0;
689 let SALU = 1;
690 let SOPP = 1;
691 let SchedRW = [WriteSALU];
692
693 let UseNamedOperandTable = 1;
694 let SubtargetPredicate = isGCN;
695}
696
697
698def S_NOP : SOPP <0x00000000, (ins i16imm:$simm16), "s_nop $simm16">;
699
700let isTerminator = 1 in {
701
702def S_ENDPGM : SOPP <0x00000001, (ins), "s_endpgm",
703 [(AMDGPUendpgm)]> {
704 let simm16 = 0;
705 let isBarrier = 1;
706 let hasCtrlDep = 1;
707 let hasSideEffects = 1;
708}
709
710let isBranch = 1, SchedRW = [WriteBranch] in {
711def S_BRANCH : SOPP <
712 0x00000002, (ins sopp_brtarget:$simm16), "s_branch $simm16",
713 [(br bb:$simm16)]> {
714 let isBarrier = 1;
715}
716
717let Uses = [SCC] in {
718def S_CBRANCH_SCC0 : SOPP <
719 0x00000004, (ins sopp_brtarget:$simm16),
720 "s_cbranch_scc0 $simm16"
721>;
722def S_CBRANCH_SCC1 : SOPP <
723 0x00000005, (ins sopp_brtarget:$simm16),
724 "s_cbranch_scc1 $simm16",
725 [(si_uniform_br_scc SCC, bb:$simm16)]
726>;
727} // End Uses = [SCC]
728
729let Uses = [VCC] in {
730def S_CBRANCH_VCCZ : SOPP <
731 0x00000006, (ins sopp_brtarget:$simm16),
732 "s_cbranch_vccz $simm16"
733>;
734def S_CBRANCH_VCCNZ : SOPP <
735 0x00000007, (ins sopp_brtarget:$simm16),
736 "s_cbranch_vccnz $simm16"
737>;
738} // End Uses = [VCC]
739
740let Uses = [EXEC] in {
741def S_CBRANCH_EXECZ : SOPP <
742 0x00000008, (ins sopp_brtarget:$simm16),
743 "s_cbranch_execz $simm16"
744>;
745def S_CBRANCH_EXECNZ : SOPP <
746 0x00000009, (ins sopp_brtarget:$simm16),
747 "s_cbranch_execnz $simm16"
748>;
749} // End Uses = [EXEC]
750
751
752} // End isBranch = 1
753} // End isTerminator = 1
754
755let hasSideEffects = 1 in {
756def S_BARRIER : SOPP <0x0000000a, (ins), "s_barrier",
757 [(int_amdgcn_s_barrier)]> {
758 let SchedRW = [WriteBarrier];
759 let simm16 = 0;
760 let mayLoad = 1;
761 let mayStore = 1;
762 let isConvergent = 1;
763}
764
765let mayLoad = 1, mayStore = 1, hasSideEffects = 1 in
766def S_WAITCNT : SOPP <0x0000000c, (ins WAIT_FLAG:$simm16), "s_waitcnt $simm16">;
767def S_SETHALT : SOPP <0x0000000d, (ins i16imm:$simm16), "s_sethalt $simm16">;
768
769// On SI the documentation says sleep for approximately 64 * low 2
770// bits, consistent with the reported maximum of 448. On VI the
771// maximum reported is 960 cycles, so 960 / 64 = 15 max, so is the
772// maximum really 15 on VI?
773def S_SLEEP : SOPP <0x0000000e, (ins i32imm:$simm16),
774 "s_sleep $simm16", [(int_amdgcn_s_sleep SIMM16bit:$simm16)]> {
775 let hasSideEffects = 1;
776 let mayLoad = 1;
777 let mayStore = 1;
778}
779
780def S_SETPRIO : SOPP <0x0000000f, (ins i16imm:$simm16), "s_setprio $simm16">;
781
782let Uses = [EXEC, M0] in {
783// FIXME: Should this be mayLoad+mayStore?
784def S_SENDMSG : SOPP <0x00000010, (ins SendMsgImm:$simm16), "s_sendmsg $simm16",
785 [(AMDGPUsendmsg (i32 imm:$simm16))]
786>;
787} // End Uses = [EXEC, M0]
788
789def S_SENDMSGHALT : SOPP <0x00000011, (ins SendMsgImm:$simm16), "s_sendmsghalt $simm16">;
790def S_TRAP : SOPP <0x00000012, (ins i16imm:$simm16), "s_trap $simm16">;
791def S_ICACHE_INV : SOPP <0x00000013, (ins), "s_icache_inv"> {
792 let simm16 = 0;
793}
794def S_INCPERFLEVEL : SOPP <0x00000014, (ins i32imm:$simm16), "s_incperflevel $simm16",
795 [(int_amdgcn_s_incperflevel SIMM16bit:$simm16)]> {
796 let hasSideEffects = 1;
797 let mayLoad = 1;
798 let mayStore = 1;
799}
800def S_DECPERFLEVEL : SOPP <0x00000015, (ins i32imm:$simm16), "s_decperflevel $simm16",
801 [(int_amdgcn_s_decperflevel SIMM16bit:$simm16)]> {
802 let hasSideEffects = 1;
803 let mayLoad = 1;
804 let mayStore = 1;
805}
806def S_TTRACEDATA : SOPP <0x00000016, (ins), "s_ttracedata"> {
807 let simm16 = 0;
808}
809} // End hasSideEffects
810
811
812let Predicates = [isGCN] in {
813
814//===----------------------------------------------------------------------===//
815// S_GETREG_B32 Intrinsic Pattern.
816//===----------------------------------------------------------------------===//
817def : Pat <
818 (int_amdgcn_s_getreg imm:$simm16),
819 (S_GETREG_B32 (as_i16imm $simm16))
820>;
821
822//===----------------------------------------------------------------------===//
823// SOP1 Patterns
824//===----------------------------------------------------------------------===//
825
826def : Pat <
827 (i64 (ctpop i64:$src)),
828 (i64 (REG_SEQUENCE SReg_64,
829 (i32 (COPY_TO_REGCLASS (S_BCNT1_I32_B64 $src), SReg_32)), sub0,
830 (S_MOV_B32 0), sub1))
831>;
832
833def : Pat <
834 (i32 (smax i32:$x, (i32 (ineg i32:$x)))),
835 (S_ABS_I32 $x)
836>;
837
838//===----------------------------------------------------------------------===//
839// SOP2 Patterns
840//===----------------------------------------------------------------------===//
841
842// V_ADD_I32_e32/S_ADD_U32 produces carry in VCC/SCC. For the vector
843// case, the sgpr-copies pass will fix this to use the vector version.
844def : Pat <
845 (i32 (addc i32:$src0, i32:$src1)),
846 (S_ADD_U32 $src0, $src1)
847>;
848
849//===----------------------------------------------------------------------===//
850// SOPP Patterns
851//===----------------------------------------------------------------------===//
852
853def : Pat <
854 (int_amdgcn_s_waitcnt i32:$simm16),
855 (S_WAITCNT (as_i16imm $simm16))
856>;
857
858} // End isGCN predicate
859
860
861//===----------------------------------------------------------------------===//
862// Real target instructions, move this to the appropriate subtarget TD file
863//===----------------------------------------------------------------------===//
864
865class Select_si<string opName> :
866 SIMCInstr<opName, SIEncodingFamily.SI> {
867 list<Predicate> AssemblerPredicates = [isSICI];
868 string DecoderNamespace = "SICI";
869}
870
871class SOP1_Real_si<bits<8> op, SOP1_Pseudo ps> :
872 SOP1_Real<op, ps>,
873 Select_si<ps.Mnemonic>;
874
875class SOP2_Real_si<bits<7> op, SOP2_Pseudo ps> :
876 SOP2_Real<op, ps>,
877 Select_si<ps.Mnemonic>;
878
879class SOPK_Real_si<bits<5> op, SOPK_Pseudo ps> :
880 SOPK_Real32<op, ps>,
881 Select_si<ps.Mnemonic>;
882
883def S_MOV_B32_si : SOP1_Real_si <0x03, S_MOV_B32>;
884def S_MOV_B64_si : SOP1_Real_si <0x04, S_MOV_B64>;
885def S_CMOV_B32_si : SOP1_Real_si <0x05, S_CMOV_B32>;
886def S_CMOV_B64_si : SOP1_Real_si <0x06, S_CMOV_B64>;
887def S_NOT_B32_si : SOP1_Real_si <0x07, S_NOT_B32>;
888def S_NOT_B64_si : SOP1_Real_si <0x08, S_NOT_B64>;
889def S_WQM_B32_si : SOP1_Real_si <0x09, S_WQM_B32>;
890def S_WQM_B64_si : SOP1_Real_si <0x0a, S_WQM_B64>;
891def S_BREV_B32_si : SOP1_Real_si <0x0b, S_BREV_B32>;
892def S_BREV_B64_si : SOP1_Real_si <0x0c, S_BREV_B64>;
893def S_BCNT0_I32_B32_si : SOP1_Real_si <0x0d, S_BCNT0_I32_B32>;
894def S_BCNT0_I32_B64_si : SOP1_Real_si <0x0e, S_BCNT0_I32_B64>;
895def S_BCNT1_I32_B32_si : SOP1_Real_si <0x0f, S_BCNT1_I32_B32>;
896def S_BCNT1_I32_B64_si : SOP1_Real_si <0x10, S_BCNT1_I32_B64>;
897def S_FF0_I32_B32_si : SOP1_Real_si <0x11, S_FF0_I32_B32>;
898def S_FF0_I32_B64_si : SOP1_Real_si <0x12, S_FF0_I32_B64>;
899def S_FF1_I32_B32_si : SOP1_Real_si <0x13, S_FF1_I32_B32>;
900def S_FF1_I32_B64_si : SOP1_Real_si <0x14, S_FF1_I32_B64>;
901def S_FLBIT_I32_B32_si : SOP1_Real_si <0x15, S_FLBIT_I32_B32>;
902def S_FLBIT_I32_B64_si : SOP1_Real_si <0x16, S_FLBIT_I32_B64>;
903def S_FLBIT_I32_si : SOP1_Real_si <0x17, S_FLBIT_I32>;
904def S_FLBIT_I32_I64_si : SOP1_Real_si <0x18, S_FLBIT_I32_I64>;
905def S_SEXT_I32_I8_si : SOP1_Real_si <0x19, S_SEXT_I32_I8>;
906def S_SEXT_I32_I16_si : SOP1_Real_si <0x1a, S_SEXT_I32_I16>;
907def S_BITSET0_B32_si : SOP1_Real_si <0x1b, S_BITSET0_B32>;
908def S_BITSET0_B64_si : SOP1_Real_si <0x1c, S_BITSET0_B64>;
909def S_BITSET1_B32_si : SOP1_Real_si <0x1d, S_BITSET1_B32>;
910def S_BITSET1_B64_si : SOP1_Real_si <0x1e, S_BITSET1_B64>;
911def S_GETPC_B64_si : SOP1_Real_si <0x1f, S_GETPC_B64>;
912def S_SETPC_B64_si : SOP1_Real_si <0x20, S_SETPC_B64>;
913def S_SWAPPC_B64_si : SOP1_Real_si <0x21, S_SWAPPC_B64>;
914def S_RFE_B64_si : SOP1_Real_si <0x22, S_RFE_B64>;
915def S_AND_SAVEEXEC_B64_si : SOP1_Real_si <0x24, S_AND_SAVEEXEC_B64>;
916def S_OR_SAVEEXEC_B64_si : SOP1_Real_si <0x25, S_OR_SAVEEXEC_B64>;
917def S_XOR_SAVEEXEC_B64_si : SOP1_Real_si <0x26, S_XOR_SAVEEXEC_B64>;
918def S_ANDN2_SAVEEXEC_B64_si: SOP1_Real_si <0x27, S_ANDN2_SAVEEXEC_B64>;
919def S_ORN2_SAVEEXEC_B64_si : SOP1_Real_si <0x28, S_ORN2_SAVEEXEC_B64>;
920def S_NAND_SAVEEXEC_B64_si : SOP1_Real_si <0x29, S_NAND_SAVEEXEC_B64>;
921def S_NOR_SAVEEXEC_B64_si : SOP1_Real_si <0x2a, S_NOR_SAVEEXEC_B64>;
922def S_XNOR_SAVEEXEC_B64_si : SOP1_Real_si <0x2b, S_XNOR_SAVEEXEC_B64>;
923def S_QUADMASK_B32_si : SOP1_Real_si <0x2c, S_QUADMASK_B32>;
924def S_QUADMASK_B64_si : SOP1_Real_si <0x2d, S_QUADMASK_B64>;
925def S_MOVRELS_B32_si : SOP1_Real_si <0x2e, S_MOVRELS_B32>;
926def S_MOVRELS_B64_si : SOP1_Real_si <0x2f, S_MOVRELS_B64>;
927def S_MOVRELD_B32_si : SOP1_Real_si <0x30, S_MOVRELD_B32>;
928def S_MOVRELD_B64_si : SOP1_Real_si <0x31, S_MOVRELD_B64>;
929def S_CBRANCH_JOIN_si : SOP1_Real_si <0x32, S_CBRANCH_JOIN>;
930def S_MOV_REGRD_B32_si : SOP1_Real_si <0x33, S_MOV_REGRD_B32>;
931def S_ABS_I32_si : SOP1_Real_si <0x34, S_ABS_I32>;
932def S_MOV_FED_B32_si : SOP1_Real_si <0x35, S_MOV_FED_B32>;
933
934def S_ADD_U32_si : SOP2_Real_si <0x00, S_ADD_U32>;
935def S_ADD_I32_si : SOP2_Real_si <0x02, S_ADD_I32>;
936def S_SUB_U32_si : SOP2_Real_si <0x01, S_SUB_U32>;
937def S_SUB_I32_si : SOP2_Real_si <0x03, S_SUB_I32>;
938def S_ADDC_U32_si : SOP2_Real_si <0x04, S_ADDC_U32>;
939def S_SUBB_U32_si : SOP2_Real_si <0x05, S_SUBB_U32>;
940def S_MIN_I32_si : SOP2_Real_si <0x06, S_MIN_I32>;
941def S_MIN_U32_si : SOP2_Real_si <0x07, S_MIN_U32>;
942def S_MAX_I32_si : SOP2_Real_si <0x08, S_MAX_I32>;
943def S_MAX_U32_si : SOP2_Real_si <0x09, S_MAX_U32>;
944def S_CSELECT_B32_si : SOP2_Real_si <0x0a, S_CSELECT_B32>;
945def S_CSELECT_B64_si : SOP2_Real_si <0x0b, S_CSELECT_B64>;
946def S_AND_B32_si : SOP2_Real_si <0x0e, S_AND_B32>;
947def S_AND_B64_si : SOP2_Real_si <0x0f, S_AND_B64>;
948def S_OR_B32_si : SOP2_Real_si <0x10, S_OR_B32>;
949def S_OR_B64_si : SOP2_Real_si <0x11, S_OR_B64>;
950def S_XOR_B32_si : SOP2_Real_si <0x12, S_XOR_B32>;
951def S_XOR_B64_si : SOP2_Real_si <0x13, S_XOR_B64>;
952def S_ANDN2_B32_si : SOP2_Real_si <0x14, S_ANDN2_B32>;
953def S_ANDN2_B64_si : SOP2_Real_si <0x15, S_ANDN2_B64>;
954def S_ORN2_B32_si : SOP2_Real_si <0x16, S_ORN2_B32>;
955def S_ORN2_B64_si : SOP2_Real_si <0x17, S_ORN2_B64>;
956def S_NAND_B32_si : SOP2_Real_si <0x18, S_NAND_B32>;
957def S_NAND_B64_si : SOP2_Real_si <0x19, S_NAND_B64>;
958def S_NOR_B32_si : SOP2_Real_si <0x1a, S_NOR_B32>;
959def S_NOR_B64_si : SOP2_Real_si <0x1b, S_NOR_B64>;
960def S_XNOR_B32_si : SOP2_Real_si <0x1c, S_XNOR_B32>;
961def S_XNOR_B64_si : SOP2_Real_si <0x1d, S_XNOR_B64>;
962def S_LSHL_B32_si : SOP2_Real_si <0x1e, S_LSHL_B32>;
963def S_LSHL_B64_si : SOP2_Real_si <0x1f, S_LSHL_B64>;
964def S_LSHR_B32_si : SOP2_Real_si <0x20, S_LSHR_B32>;
965def S_LSHR_B64_si : SOP2_Real_si <0x21, S_LSHR_B64>;
966def S_ASHR_I32_si : SOP2_Real_si <0x22, S_ASHR_I32>;
967def S_ASHR_I64_si : SOP2_Real_si <0x23, S_ASHR_I64>;
968def S_BFM_B32_si : SOP2_Real_si <0x24, S_BFM_B32>;
969def S_BFM_B64_si : SOP2_Real_si <0x25, S_BFM_B64>;
970def S_MUL_I32_si : SOP2_Real_si <0x26, S_MUL_I32>;
971def S_BFE_U32_si : SOP2_Real_si <0x27, S_BFE_U32>;
972def S_BFE_I32_si : SOP2_Real_si <0x28, S_BFE_I32>;
973def S_BFE_U64_si : SOP2_Real_si <0x29, S_BFE_U64>;
974def S_BFE_I64_si : SOP2_Real_si <0x2a, S_BFE_I64>;
975def S_CBRANCH_G_FORK_si : SOP2_Real_si <0x2b, S_CBRANCH_G_FORK>;
976def S_ABSDIFF_I32_si : SOP2_Real_si <0x2c, S_ABSDIFF_I32>;
977
978def S_MOVK_I32_si : SOPK_Real_si <0x00, S_MOVK_I32>;
979def S_CMOVK_I32_si : SOPK_Real_si <0x02, S_CMOVK_I32>;
980def S_CMPK_EQ_I32_si : SOPK_Real_si <0x03, S_CMPK_EQ_I32>;
981def S_CMPK_LG_I32_si : SOPK_Real_si <0x04, S_CMPK_LG_I32>;
982def S_CMPK_GT_I32_si : SOPK_Real_si <0x05, S_CMPK_GT_I32>;
983def S_CMPK_GE_I32_si : SOPK_Real_si <0x06, S_CMPK_GE_I32>;
984def S_CMPK_LT_I32_si : SOPK_Real_si <0x07, S_CMPK_LT_I32>;
985def S_CMPK_LE_I32_si : SOPK_Real_si <0x08, S_CMPK_LE_I32>;
986def S_CMPK_EQ_U32_si : SOPK_Real_si <0x09, S_CMPK_EQ_U32>;
987def S_CMPK_LG_U32_si : SOPK_Real_si <0x0a, S_CMPK_LG_U32>;
988def S_CMPK_GT_U32_si : SOPK_Real_si <0x0b, S_CMPK_GT_U32>;
989def S_CMPK_GE_U32_si : SOPK_Real_si <0x0c, S_CMPK_GE_U32>;
990def S_CMPK_LT_U32_si : SOPK_Real_si <0x0d, S_CMPK_LT_U32>;
991def S_CMPK_LE_U32_si : SOPK_Real_si <0x0e, S_CMPK_LE_U32>;
992def S_ADDK_I32_si : SOPK_Real_si <0x0f, S_ADDK_I32>;
993def S_MULK_I32_si : SOPK_Real_si <0x10, S_MULK_I32>;
994def S_CBRANCH_I_FORK_si : SOPK_Real_si <0x11, S_CBRANCH_I_FORK>;
995def S_GETREG_B32_si : SOPK_Real_si <0x12, S_GETREG_B32>;
996def S_SETREG_B32_si : SOPK_Real_si <0x13, S_SETREG_B32>;
997//def S_GETREG_REGRD_B32_si : SOPK_Real_si <0x14, S_GETREG_REGRD_B32>; // see pseudo for comments
998def S_SETREG_IMM32_B32_si : SOPK_Real64<0x15, S_SETREG_IMM32_B32>,
999 Select_si<S_SETREG_IMM32_B32.Mnemonic>;
1000
1001
1002class Select_vi<string opName> :
1003 SIMCInstr<opName, SIEncodingFamily.VI> {
1004 list<Predicate> AssemblerPredicates = [isVI];
1005 string DecoderNamespace = "VI";
1006}
1007
1008class SOP1_Real_vi<bits<8> op, SOP1_Pseudo ps> :
1009 SOP1_Real<op, ps>,
1010 Select_vi<ps.Mnemonic>;
1011
1012
1013class SOP2_Real_vi<bits<7> op, SOP2_Pseudo ps> :
1014 SOP2_Real<op, ps>,
1015 Select_vi<ps.Mnemonic>;
1016
1017class SOPK_Real_vi<bits<5> op, SOPK_Pseudo ps> :
1018 SOPK_Real32<op, ps>,
1019 Select_vi<ps.Mnemonic>;
1020
1021def S_MOV_B32_vi : SOP1_Real_vi <0x00, S_MOV_B32>;
1022def S_MOV_B64_vi : SOP1_Real_vi <0x01, S_MOV_B64>;
1023def S_CMOV_B32_vi : SOP1_Real_vi <0x02, S_CMOV_B32>;
1024def S_CMOV_B64_vi : SOP1_Real_vi <0x03, S_CMOV_B64>;
1025def S_NOT_B32_vi : SOP1_Real_vi <0x04, S_NOT_B32>;
1026def S_NOT_B64_vi : SOP1_Real_vi <0x05, S_NOT_B64>;
1027def S_WQM_B32_vi : SOP1_Real_vi <0x06, S_WQM_B32>;
1028def S_WQM_B64_vi : SOP1_Real_vi <0x07, S_WQM_B64>;
1029def S_BREV_B32_vi : SOP1_Real_vi <0x08, S_BREV_B32>;
1030def S_BREV_B64_vi : SOP1_Real_vi <0x09, S_BREV_B64>;
1031def S_BCNT0_I32_B32_vi : SOP1_Real_vi <0x0a, S_BCNT0_I32_B32>;
1032def S_BCNT0_I32_B64_vi : SOP1_Real_vi <0x0b, S_BCNT0_I32_B64>;
1033def S_BCNT1_I32_B32_vi : SOP1_Real_vi <0x0c, S_BCNT1_I32_B32>;
1034def S_BCNT1_I32_B64_vi : SOP1_Real_vi <0x0d, S_BCNT1_I32_B64>;
1035def S_FF0_I32_B32_vi : SOP1_Real_vi <0x0e, S_FF0_I32_B32>;
1036def S_FF0_I32_B64_vi : SOP1_Real_vi <0x0f, S_FF0_I32_B64>;
1037def S_FF1_I32_B32_vi : SOP1_Real_vi <0x10, S_FF1_I32_B32>;
1038def S_FF1_I32_B64_vi : SOP1_Real_vi <0x11, S_FF1_I32_B64>;
1039def S_FLBIT_I32_B32_vi : SOP1_Real_vi <0x12, S_FLBIT_I32_B32>;
1040def S_FLBIT_I32_B64_vi : SOP1_Real_vi <0x13, S_FLBIT_I32_B64>;
1041def S_FLBIT_I32_vi : SOP1_Real_vi <0x14, S_FLBIT_I32>;
1042def S_FLBIT_I32_I64_vi : SOP1_Real_vi <0x15, S_FLBIT_I32_I64>;
1043def S_SEXT_I32_I8_vi : SOP1_Real_vi <0x16, S_SEXT_I32_I8>;
1044def S_SEXT_I32_I16_vi : SOP1_Real_vi <0x17, S_SEXT_I32_I16>;
1045def S_BITSET0_B32_vi : SOP1_Real_vi <0x18, S_BITSET0_B32>;
1046def S_BITSET0_B64_vi : SOP1_Real_vi <0x19, S_BITSET0_B64>;
1047def S_BITSET1_B32_vi : SOP1_Real_vi <0x1a, S_BITSET1_B32>;
1048def S_BITSET1_B64_vi : SOP1_Real_vi <0x1b, S_BITSET1_B64>;
1049def S_GETPC_B64_vi : SOP1_Real_vi <0x1c, S_GETPC_B64>;
1050def S_SETPC_B64_vi : SOP1_Real_vi <0x1d, S_SETPC_B64>;
1051def S_SWAPPC_B64_vi : SOP1_Real_vi <0x1e, S_SWAPPC_B64>;
1052def S_RFE_B64_vi : SOP1_Real_vi <0x1f, S_RFE_B64>;
1053def S_AND_SAVEEXEC_B64_vi : SOP1_Real_vi <0x20, S_AND_SAVEEXEC_B64>;
1054def S_OR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x21, S_OR_SAVEEXEC_B64>;
1055def S_XOR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x22, S_XOR_SAVEEXEC_B64>;
1056def S_ANDN2_SAVEEXEC_B64_vi: SOP1_Real_vi <0x23, S_ANDN2_SAVEEXEC_B64>;
1057def S_ORN2_SAVEEXEC_B64_vi : SOP1_Real_vi <0x24, S_ORN2_SAVEEXEC_B64>;
1058def S_NAND_SAVEEXEC_B64_vi : SOP1_Real_vi <0x25, S_NAND_SAVEEXEC_B64>;
1059def S_NOR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x26, S_NOR_SAVEEXEC_B64>;
1060def S_XNOR_SAVEEXEC_B64_vi : SOP1_Real_vi <0x27, S_XNOR_SAVEEXEC_B64>;
1061def S_QUADMASK_B32_vi : SOP1_Real_vi <0x28, S_QUADMASK_B32>;
1062def S_QUADMASK_B64_vi : SOP1_Real_vi <0x29, S_QUADMASK_B64>;
1063def S_MOVRELS_B32_vi : SOP1_Real_vi <0x2a, S_MOVRELS_B32>;
1064def S_MOVRELS_B64_vi : SOP1_Real_vi <0x2b, S_MOVRELS_B64>;
1065def S_MOVRELD_B32_vi : SOP1_Real_vi <0x2c, S_MOVRELD_B32>;
1066def S_MOVRELD_B64_vi : SOP1_Real_vi <0x2d, S_MOVRELD_B64>;
1067def S_CBRANCH_JOIN_vi : SOP1_Real_vi <0x2e, S_CBRANCH_JOIN>;
1068def S_MOV_REGRD_B32_vi : SOP1_Real_vi <0x2f, S_MOV_REGRD_B32>;
1069def S_ABS_I32_vi : SOP1_Real_vi <0x30, S_ABS_I32>;
1070def S_MOV_FED_B32_vi : SOP1_Real_vi <0x31, S_MOV_FED_B32>;
1071
1072def S_ADD_U32_vi : SOP2_Real_vi <0x00, S_ADD_U32>;
1073def S_ADD_I32_vi : SOP2_Real_vi <0x02, S_ADD_I32>;
1074def S_SUB_U32_vi : SOP2_Real_vi <0x01, S_SUB_U32>;
1075def S_SUB_I32_vi : SOP2_Real_vi <0x03, S_SUB_I32>;
1076def S_ADDC_U32_vi : SOP2_Real_vi <0x04, S_ADDC_U32>;
1077def S_SUBB_U32_vi : SOP2_Real_vi <0x05, S_SUBB_U32>;
1078def S_MIN_I32_vi : SOP2_Real_vi <0x06, S_MIN_I32>;
1079def S_MIN_U32_vi : SOP2_Real_vi <0x07, S_MIN_U32>;
1080def S_MAX_I32_vi : SOP2_Real_vi <0x08, S_MAX_I32>;
1081def S_MAX_U32_vi : SOP2_Real_vi <0x09, S_MAX_U32>;
1082def S_CSELECT_B32_vi : SOP2_Real_vi <0x0a, S_CSELECT_B32>;
1083def S_CSELECT_B64_vi : SOP2_Real_vi <0x0b, S_CSELECT_B64>;
1084def S_AND_B32_vi : SOP2_Real_vi <0x0c, S_AND_B32>;
1085def S_AND_B64_vi : SOP2_Real_vi <0x0d, S_AND_B64>;
1086def S_OR_B32_vi : SOP2_Real_vi <0x0e, S_OR_B32>;
1087def S_OR_B64_vi : SOP2_Real_vi <0x0f, S_OR_B64>;
1088def S_XOR_B32_vi : SOP2_Real_vi <0x10, S_XOR_B32>;
1089def S_XOR_B64_vi : SOP2_Real_vi <0x11, S_XOR_B64>;
1090def S_ANDN2_B32_vi : SOP2_Real_vi <0x12, S_ANDN2_B32>;
1091def S_ANDN2_B64_vi : SOP2_Real_vi <0x13, S_ANDN2_B64>;
1092def S_ORN2_B32_vi : SOP2_Real_vi <0x14, S_ORN2_B32>;
1093def S_ORN2_B64_vi : SOP2_Real_vi <0x15, S_ORN2_B64>;
1094def S_NAND_B32_vi : SOP2_Real_vi <0x16, S_NAND_B32>;
1095def S_NAND_B64_vi : SOP2_Real_vi <0x17, S_NAND_B64>;
1096def S_NOR_B32_vi : SOP2_Real_vi <0x18, S_NOR_B32>;
1097def S_NOR_B64_vi : SOP2_Real_vi <0x19, S_NOR_B64>;
1098def S_XNOR_B32_vi : SOP2_Real_vi <0x1a, S_XNOR_B32>;
1099def S_XNOR_B64_vi : SOP2_Real_vi <0x1b, S_XNOR_B64>;
1100def S_LSHL_B32_vi : SOP2_Real_vi <0x1c, S_LSHL_B32>;
1101def S_LSHL_B64_vi : SOP2_Real_vi <0x1d, S_LSHL_B64>;
1102def S_LSHR_B32_vi : SOP2_Real_vi <0x1e, S_LSHR_B32>;
1103def S_LSHR_B64_vi : SOP2_Real_vi <0x1f, S_LSHR_B64>;
1104def S_ASHR_I32_vi : SOP2_Real_vi <0x20, S_ASHR_I32>;
1105def S_ASHR_I64_vi : SOP2_Real_vi <0x21, S_ASHR_I64>;
1106def S_BFM_B32_vi : SOP2_Real_vi <0x22, S_BFM_B32>;
1107def S_BFM_B64_vi : SOP2_Real_vi <0x23, S_BFM_B64>;
1108def S_MUL_I32_vi : SOP2_Real_vi <0x24, S_MUL_I32>;
1109def S_BFE_U32_vi : SOP2_Real_vi <0x25, S_BFE_U32>;
1110def S_BFE_I32_vi : SOP2_Real_vi <0x26, S_BFE_I32>;
1111def S_BFE_U64_vi : SOP2_Real_vi <0x27, S_BFE_U64>;
1112def S_BFE_I64_vi : SOP2_Real_vi <0x28, S_BFE_I64>;
1113def S_CBRANCH_G_FORK_vi : SOP2_Real_vi <0x29, S_CBRANCH_G_FORK>;
1114def S_ABSDIFF_I32_vi : SOP2_Real_vi <0x2a, S_ABSDIFF_I32>;
1115
1116def S_MOVK_I32_vi : SOPK_Real_vi <0x00, S_MOVK_I32>;
1117def S_CMOVK_I32_vi : SOPK_Real_vi <0x01, S_CMOVK_I32>;
1118def S_CMPK_EQ_I32_vi : SOPK_Real_vi <0x02, S_CMPK_EQ_I32>;
1119def S_CMPK_LG_I32_vi : SOPK_Real_vi <0x03, S_CMPK_LG_I32>;
1120def S_CMPK_GT_I32_vi : SOPK_Real_vi <0x04, S_CMPK_GT_I32>;
1121def S_CMPK_GE_I32_vi : SOPK_Real_vi <0x05, S_CMPK_GE_I32>;
1122def S_CMPK_LT_I32_vi : SOPK_Real_vi <0x06, S_CMPK_LT_I32>;
1123def S_CMPK_LE_I32_vi : SOPK_Real_vi <0x07, S_CMPK_LE_I32>;
1124def S_CMPK_EQ_U32_vi : SOPK_Real_vi <0x08, S_CMPK_EQ_U32>;
1125def S_CMPK_LG_U32_vi : SOPK_Real_vi <0x09, S_CMPK_LG_U32>;
1126def S_CMPK_GT_U32_vi : SOPK_Real_vi <0x0A, S_CMPK_GT_U32>;
1127def S_CMPK_GE_U32_vi : SOPK_Real_vi <0x0B, S_CMPK_GE_U32>;
1128def S_CMPK_LT_U32_vi : SOPK_Real_vi <0x0C, S_CMPK_LT_U32>;
1129def S_CMPK_LE_U32_vi : SOPK_Real_vi <0x0D, S_CMPK_LE_U32>;
1130def S_ADDK_I32_vi : SOPK_Real_vi <0x0E, S_ADDK_I32>;
1131def S_MULK_I32_vi : SOPK_Real_vi <0x0F, S_MULK_I32>;
1132def S_CBRANCH_I_FORK_vi : SOPK_Real_vi <0x10, S_CBRANCH_I_FORK>;
1133def S_GETREG_B32_vi : SOPK_Real_vi <0x11, S_GETREG_B32>;
1134def S_SETREG_B32_vi : SOPK_Real_vi <0x12, S_SETREG_B32>;
1135//def S_GETREG_REGRD_B32_vi : SOPK_Real_vi <0x13, S_GETREG_REGRD_B32>; // see pseudo for comments
1136def S_SETREG_IMM32_B32_vi : SOPK_Real64<0x14, S_SETREG_IMM32_B32>,
Tom Stellard2add8a12016-09-06 20:00:26 +00001137 Select_vi<S_SETREG_IMM32_B32.Mnemonic>;