blob: df9fcff509efef6a9d8a4886d7079fcd01291869 [file] [log] [blame]
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001//===-- FLATInstructions.td - FLAT 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
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +000010def FLATAtomic : ComplexPattern<i64, 3, "SelectFlatAtomic", [], [], -10>;
Matt Arsenault4e309b02017-07-29 01:03:53 +000011def FLATOffset : ComplexPattern<i64, 3, "SelectFlatOffset<false>", [], [], -10>;
12
13def FLATOffsetSigned : ComplexPattern<i64, 3, "SelectFlatOffset<true>", [], [], -10>;
14def FLATSignedAtomic : ComplexPattern<i64, 3, "SelectFlatAtomicSigned", [], [], -10>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +000015
16//===----------------------------------------------------------------------===//
17// FLAT classes
18//===----------------------------------------------------------------------===//
19
20class FLAT_Pseudo<string opName, dag outs, dag ins,
21 string asmOps, list<dag> pattern=[]> :
22 InstSI<outs, ins, "", pattern>,
23 SIMCInstr<opName, SIEncodingFamily.NONE> {
24
25 let isPseudo = 1;
26 let isCodeGenOnly = 1;
27
28 let SubtargetPredicate = isCIVI;
29
30 let FLAT = 1;
Valery Pykhtin8bc65962016-09-05 11:22:51 +000031
Valery Pykhtin8bc65962016-09-05 11:22:51 +000032 let UseNamedOperandTable = 1;
33 let hasSideEffects = 0;
34 let SchedRW = [WriteVMEM];
35
36 string Mnemonic = opName;
37 string AsmOperands = asmOps;
38
Matt Arsenault9698f1c2017-06-20 19:54:14 +000039 bits<1> is_flat_global = 0;
40 bits<1> is_flat_scratch = 0;
41
Valery Pykhtin8bc65962016-09-05 11:22:51 +000042 bits<1> has_vdst = 1;
Matt Arsenault04004712017-07-20 05:17:54 +000043
44 // We need to distinguish having saddr and enabling saddr because
45 // saddr is only valid for scratch and global instructions. Pre-gfx9
46 // these bits were reserved, so we also don't necessarily want to
47 // set these bits to the disabled value for the original flat
48 // segment instructions.
49 bits<1> has_saddr = 0;
50 bits<1> enabled_saddr = 0;
51 bits<7> saddr_value = 0;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +000052 bits<1> has_vaddr = 1;
Matt Arsenault04004712017-07-20 05:17:54 +000053
Valery Pykhtin8bc65962016-09-05 11:22:51 +000054 bits<1> has_data = 1;
55 bits<1> has_glc = 1;
56 bits<1> glcValue = 0;
Matt Arsenault9698f1c2017-06-20 19:54:14 +000057
58 // TODO: M0 if it could possibly access LDS (before gfx9? only)?
59 let Uses = !if(is_flat_global, [EXEC], [EXEC, FLAT_SCR]);
Matt Arsenault6ab9ea92017-07-21 18:34:51 +000060
61 // Internally, FLAT instruction are executed as both an LDS and a
62 // Buffer instruction; so, they increment both VM_CNT and LGKM_CNT
63 // and are not considered done until both have been decremented.
64 let VM_CNT = 1;
65 let LGKM_CNT = !if(!or(is_flat_global, is_flat_scratch), 0, 1);
Valery Pykhtin8bc65962016-09-05 11:22:51 +000066}
67
68class FLAT_Real <bits<7> op, FLAT_Pseudo ps> :
69 InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []>,
70 Enc64 {
71
72 let isPseudo = 0;
73 let isCodeGenOnly = 0;
74
75 // copy relevant pseudo op flags
76 let SubtargetPredicate = ps.SubtargetPredicate;
77 let AsmMatchConverter = ps.AsmMatchConverter;
Matt Arsenaultfd023142017-06-12 15:55:58 +000078 let TSFlags = ps.TSFlags;
79 let UseNamedOperandTable = ps.UseNamedOperandTable;
Valery Pykhtin8bc65962016-09-05 11:22:51 +000080
81 // encoding fields
Matt Arsenault97279a82016-11-29 19:30:44 +000082 bits<8> vaddr;
83 bits<8> vdata;
Matt Arsenault04004712017-07-20 05:17:54 +000084 bits<7> saddr;
Valery Pykhtin8bc65962016-09-05 11:22:51 +000085 bits<8> vdst;
Matt Arsenault04004712017-07-20 05:17:54 +000086
Valery Pykhtin8bc65962016-09-05 11:22:51 +000087 bits<1> slc;
88 bits<1> glc;
Matt Arsenault47ccafe2017-05-11 17:38:33 +000089
Matt Arsenaultfd023142017-06-12 15:55:58 +000090 // Only valid on gfx9
91 bits<1> lds = 0; // XXX - What does this actually do?
Matt Arsenault9698f1c2017-06-20 19:54:14 +000092
93 // Segment, 00=flat, 01=scratch, 10=global, 11=reserved
94 bits<2> seg = !if(ps.is_flat_global, 0b10,
95 !if(ps.is_flat_scratch, 0b01, 0));
Matt Arsenaultfd023142017-06-12 15:55:58 +000096
97 // Signed offset. Highest bit ignored for flat and treated as 12-bit
98 // unsigned for flat acceses.
99 bits<13> offset;
100 bits<1> nv = 0; // XXX - What does this actually do?
101
Matt Arsenault47ccafe2017-05-11 17:38:33 +0000102 // We don't use tfe right now, and it was removed in gfx9.
103 bits<1> tfe = 0;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000104
Matt Arsenaultfd023142017-06-12 15:55:58 +0000105 // Only valid on GFX9+
106 let Inst{12-0} = offset;
107 let Inst{13} = lds;
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000108 let Inst{15-14} = seg;
Matt Arsenaultfd023142017-06-12 15:55:58 +0000109
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000110 let Inst{16} = !if(ps.has_glc, glc, ps.glcValue);
111 let Inst{17} = slc;
112 let Inst{24-18} = op;
113 let Inst{31-26} = 0x37; // Encoding.
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000114 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
Matt Arsenault97279a82016-11-29 19:30:44 +0000115 let Inst{47-40} = !if(ps.has_data, vdata, ?);
Matt Arsenault04004712017-07-20 05:17:54 +0000116 let Inst{54-48} = !if(ps.has_saddr, !if(ps.enabled_saddr, saddr, 0x7f), 0);
117
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000118 // 54-48 is reserved.
Matt Arsenaultfd023142017-06-12 15:55:58 +0000119 let Inst{55} = nv; // nv on GFX9+, TFE before.
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000120 let Inst{63-56} = !if(ps.has_vdst, vdst, ?);
121}
122
Matt Arsenault04004712017-07-20 05:17:54 +0000123// TODO: Is exec allowed for saddr? The disabled value 0x7f is the
124// same encoding value as exec_hi, so it isn't possible to use that if
125// saddr is 32-bit (which isn't handled here yet).
Matt Arsenaultfd023142017-06-12 15:55:58 +0000126class FLAT_Load_Pseudo <string opName, RegisterClass regClass,
Matt Arsenault04004712017-07-20 05:17:54 +0000127 bit HasSignedOffset = 0, bit HasSaddr = 0, bit EnableSaddr = 0> : FLAT_Pseudo<
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000128 opName,
129 (outs regClass:$vdst),
Matt Arsenault04004712017-07-20 05:17:54 +0000130 !if(EnableSaddr,
131 !if(HasSignedOffset,
132 (ins VReg_64:$vaddr, SReg_64:$saddr, offset_s13:$offset, GLC:$glc, slc:$slc),
133 (ins VReg_64:$vaddr, SReg_64:$saddr, offset_u12:$offset, GLC:$glc, slc:$slc)),
134 !if(HasSignedOffset,
135 (ins VReg_64:$vaddr, offset_s13:$offset, GLC:$glc, slc:$slc),
136 (ins VReg_64:$vaddr, offset_u12:$offset, GLC:$glc, slc:$slc))),
137 " $vdst, $vaddr"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$glc$slc"> {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000138 let has_data = 0;
139 let mayLoad = 1;
Matt Arsenault04004712017-07-20 05:17:54 +0000140 let has_saddr = HasSaddr;
141 let enabled_saddr = EnableSaddr;
142 let PseudoInstr = opName#!if(!and(HasSaddr, EnableSaddr), "_SADDR", "");
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000143 let maybeAtomic = 1;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000144}
145
Matt Arsenaultfd023142017-06-12 15:55:58 +0000146class FLAT_Store_Pseudo <string opName, RegisterClass vdataClass,
Matt Arsenault04004712017-07-20 05:17:54 +0000147 bit HasSignedOffset = 0, bit HasSaddr = 0, bit EnableSaddr = 0> : FLAT_Pseudo<
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000148 opName,
149 (outs),
Matt Arsenault04004712017-07-20 05:17:54 +0000150 !if(EnableSaddr,
151 !if(HasSignedOffset,
152 (ins VReg_64:$vaddr, vdataClass:$vdata, SReg_64:$saddr, offset_s13:$offset, GLC:$glc, slc:$slc),
153 (ins VReg_64:$vaddr, vdataClass:$vdata, SReg_64:$saddr, offset_u12:$offset, GLC:$glc, slc:$slc)),
154 !if(HasSignedOffset,
155 (ins VReg_64:$vaddr, vdataClass:$vdata, offset_s13:$offset, GLC:$glc, slc:$slc),
156 (ins VReg_64:$vaddr, vdataClass:$vdata, offset_u12:$offset, GLC:$glc, slc:$slc))),
157 " $vaddr, $vdata"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$glc$slc"> {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000158 let mayLoad = 0;
159 let mayStore = 1;
160 let has_vdst = 0;
Matt Arsenault04004712017-07-20 05:17:54 +0000161 let has_saddr = HasSaddr;
162 let enabled_saddr = EnableSaddr;
163 let PseudoInstr = opName#!if(!and(HasSaddr, EnableSaddr), "_SADDR", "");
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000164 let maybeAtomic = 1;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000165}
166
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000167multiclass FLAT_Global_Load_Pseudo<string opName, RegisterClass regClass> {
168 let is_flat_global = 1 in {
169 def "" : FLAT_Load_Pseudo<opName, regClass, 1, 1>;
170 def _SADDR : FLAT_Load_Pseudo<opName, regClass, 1, 1, 1>;
171 }
172}
173
Matt Arsenault04004712017-07-20 05:17:54 +0000174multiclass FLAT_Global_Store_Pseudo<string opName, RegisterClass regClass> {
175 let is_flat_global = 1 in {
176 def "" : FLAT_Store_Pseudo<opName, regClass, 1, 1>;
177 def _SADDR : FLAT_Store_Pseudo<opName, regClass, 1, 1, 1>;
178 }
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000179}
180
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000181class FLAT_Scratch_Load_Pseudo <string opName, RegisterClass regClass,
182 bit EnableSaddr = 0>: FLAT_Pseudo<
183 opName,
184 (outs regClass:$vdst),
185 !if(EnableSaddr,
186 (ins SReg_32_XEXEC_HI:$saddr, offset_s13:$offset, GLC:$glc, slc:$slc),
187 (ins VGPR_32:$vaddr, offset_s13:$offset, GLC:$glc, slc:$slc)),
188 " $vdst, "#!if(EnableSaddr, "off", "$vaddr")#!if(EnableSaddr, ", $saddr", ", off")#"$offset$glc$slc"> {
189 let has_data = 0;
190 let mayLoad = 1;
191 let has_saddr = 1;
192 let enabled_saddr = EnableSaddr;
193 let has_vaddr = !if(EnableSaddr, 0, 1);
194 let PseudoInstr = opName#!if(EnableSaddr, "_SADDR", "");
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000195 let maybeAtomic = 1;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000196}
197
198class FLAT_Scratch_Store_Pseudo <string opName, RegisterClass vdataClass, bit EnableSaddr = 0> : FLAT_Pseudo<
199 opName,
200 (outs),
201 !if(EnableSaddr,
202 (ins vdataClass:$vdata, SReg_32_XEXEC_HI:$saddr, offset_s13:$offset, GLC:$glc, slc:$slc),
203 (ins vdataClass:$vdata, VGPR_32:$vaddr, offset_s13:$offset, GLC:$glc, slc:$slc)),
204 " "#!if(EnableSaddr, "off", "$vaddr")#", $vdata, "#!if(EnableSaddr, "$saddr", "off")#"$offset$glc$slc"> {
205 let mayLoad = 0;
206 let mayStore = 1;
207 let has_vdst = 0;
208 let has_saddr = 1;
209 let enabled_saddr = EnableSaddr;
210 let has_vaddr = !if(EnableSaddr, 0, 1);
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000211 let PseudoInstr = opName#!if(EnableSaddr, "_SADDR", "");
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000212 let maybeAtomic = 1;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000213}
214
215multiclass FLAT_Scratch_Load_Pseudo<string opName, RegisterClass regClass> {
216 let is_flat_scratch = 1 in {
217 def "" : FLAT_Scratch_Load_Pseudo<opName, regClass>;
218 def _SADDR : FLAT_Scratch_Load_Pseudo<opName, regClass, 1>;
219 }
220}
221
222multiclass FLAT_Scratch_Store_Pseudo<string opName, RegisterClass regClass> {
223 let is_flat_scratch = 1 in {
224 def "" : FLAT_Scratch_Store_Pseudo<opName, regClass>;
225 def _SADDR : FLAT_Scratch_Store_Pseudo<opName, regClass, 1>;
226 }
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000227}
228
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000229class FLAT_AtomicNoRet_Pseudo<string opName, dag outs, dag ins,
230 string asm, list<dag> pattern = []> :
231 FLAT_Pseudo<opName, outs, ins, asm, pattern> {
232 let mayLoad = 1;
233 let mayStore = 1;
234 let has_glc = 0;
235 let glcValue = 0;
236 let has_vdst = 0;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000237 let maybeAtomic = 1;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000238}
239
240class FLAT_AtomicRet_Pseudo<string opName, dag outs, dag ins,
241 string asm, list<dag> pattern = []>
242 : FLAT_AtomicNoRet_Pseudo<opName, outs, ins, asm, pattern> {
243 let hasPostISelHook = 1;
244 let has_vdst = 1;
245 let glcValue = 1;
246 let PseudoInstr = NAME # "_RTN";
247}
248
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000249multiclass FLAT_Atomic_Pseudo<
250 string opName,
251 RegisterClass vdst_rc,
252 ValueType vt,
253 SDPatternOperator atomic = null_frag,
254 ValueType data_vt = vt,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000255 RegisterClass data_rc = vdst_rc> {
256 def "" : FLAT_AtomicNoRet_Pseudo <opName,
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000257 (outs),
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000258 (ins VReg_64:$vaddr, data_rc:$vdata, offset_u12:$offset, slc:$slc),
259 " $vaddr, $vdata$offset$slc">,
260 AtomicNoRet <opName, 0> {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000261 let PseudoInstr = NAME;
262 }
263
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000264 def _RTN : FLAT_AtomicRet_Pseudo <opName,
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000265 (outs vdst_rc:$vdst),
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000266 (ins VReg_64:$vaddr, data_rc:$vdata, offset_u12:$offset, slc:$slc),
Matt Arsenaultfd023142017-06-12 15:55:58 +0000267 " $vdst, $vaddr, $vdata$offset glc$slc",
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000268 [(set vt:$vdst,
Matt Arsenaultfd023142017-06-12 15:55:58 +0000269 (atomic (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$vdata))]>,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000270 AtomicNoRet <opName, 1>;
271}
272
273multiclass FLAT_Global_Atomic_Pseudo<
274 string opName,
275 RegisterClass vdst_rc,
276 ValueType vt,
277 SDPatternOperator atomic = null_frag,
278 ValueType data_vt = vt,
279 RegisterClass data_rc = vdst_rc> {
280
281 def "" : FLAT_AtomicNoRet_Pseudo <opName,
282 (outs),
283 (ins VReg_64:$vaddr, data_rc:$vdata, offset_s13:$offset, slc:$slc),
284 " $vaddr, $vdata, off$offset$slc">,
285 AtomicNoRet <opName, 0> {
286 let has_saddr = 1;
287 let PseudoInstr = NAME;
288 }
289
290 def _RTN : FLAT_AtomicRet_Pseudo <opName,
291 (outs vdst_rc:$vdst),
292 (ins VReg_64:$vaddr, data_rc:$vdata, offset_s13:$offset, slc:$slc),
293 " $vdst, $vaddr, $vdata, off$offset glc$slc",
294 [(set vt:$vdst,
Matt Arsenault4e309b02017-07-29 01:03:53 +0000295 (atomic (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$vdata))]>,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000296 AtomicNoRet <opName, 1> {
297 let has_saddr = 1;
298 }
299
300 def _SADDR : FLAT_AtomicNoRet_Pseudo <opName,
301 (outs),
302 (ins VReg_64:$vaddr, data_rc:$vdata, SReg_64:$saddr, offset_s13:$offset, slc:$slc),
303 " $vaddr, $vdata$saddr$offset$slc">,
304 AtomicNoRet <opName#"_saddr", 0> {
305 let has_saddr = 1;
306 let enabled_saddr = 1;
307 let PseudoInstr = NAME#"_SADDR";
308 }
309
310 def _SADDR_RTN : FLAT_AtomicRet_Pseudo <opName,
311 (outs vdst_rc:$vdst),
312 (ins VReg_64:$vaddr, data_rc:$vdata, SReg_64:$saddr, offset_s13:$offset, slc:$slc),
313 " $vdst, $vaddr, $vdata$saddr$offset glc$slc">,
314 AtomicNoRet <opName#"_saddr", 1> {
315 let has_saddr = 1;
316 let enabled_saddr = 1;
317 let PseudoInstr = NAME#"_SADDR_RTN";
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000318 }
319}
320
321class flat_binary_atomic_op<SDNode atomic_op> : PatFrag<
322 (ops node:$ptr, node:$value),
323 (atomic_op node:$ptr, node:$value),
Yaxun Liu1a14bfa2017-03-27 14:04:01 +0000324 [{return cast<MemSDNode>(N)->getAddressSpace() == AMDGPUASI.FLAT_ADDRESS;}]
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000325>;
326
327def atomic_cmp_swap_flat : flat_binary_atomic_op<AMDGPUatomic_cmp_swap>;
328def atomic_swap_flat : flat_binary_atomic_op<atomic_swap>;
329def atomic_add_flat : flat_binary_atomic_op<atomic_load_add>;
330def atomic_and_flat : flat_binary_atomic_op<atomic_load_and>;
331def atomic_max_flat : flat_binary_atomic_op<atomic_load_max>;
332def atomic_min_flat : flat_binary_atomic_op<atomic_load_min>;
333def atomic_or_flat : flat_binary_atomic_op<atomic_load_or>;
334def atomic_sub_flat : flat_binary_atomic_op<atomic_load_sub>;
335def atomic_umax_flat : flat_binary_atomic_op<atomic_load_umax>;
336def atomic_umin_flat : flat_binary_atomic_op<atomic_load_umin>;
337def atomic_xor_flat : flat_binary_atomic_op<atomic_load_xor>;
338def atomic_inc_flat : flat_binary_atomic_op<SIatomic_inc>;
339def atomic_dec_flat : flat_binary_atomic_op<SIatomic_dec>;
340
341
342
343//===----------------------------------------------------------------------===//
344// Flat Instructions
345//===----------------------------------------------------------------------===//
346
347def FLAT_LOAD_UBYTE : FLAT_Load_Pseudo <"flat_load_ubyte", VGPR_32>;
348def FLAT_LOAD_SBYTE : FLAT_Load_Pseudo <"flat_load_sbyte", VGPR_32>;
349def FLAT_LOAD_USHORT : FLAT_Load_Pseudo <"flat_load_ushort", VGPR_32>;
350def FLAT_LOAD_SSHORT : FLAT_Load_Pseudo <"flat_load_sshort", VGPR_32>;
351def FLAT_LOAD_DWORD : FLAT_Load_Pseudo <"flat_load_dword", VGPR_32>;
352def FLAT_LOAD_DWORDX2 : FLAT_Load_Pseudo <"flat_load_dwordx2", VReg_64>;
353def FLAT_LOAD_DWORDX4 : FLAT_Load_Pseudo <"flat_load_dwordx4", VReg_128>;
354def FLAT_LOAD_DWORDX3 : FLAT_Load_Pseudo <"flat_load_dwordx3", VReg_96>;
355
356def FLAT_STORE_BYTE : FLAT_Store_Pseudo <"flat_store_byte", VGPR_32>;
357def FLAT_STORE_SHORT : FLAT_Store_Pseudo <"flat_store_short", VGPR_32>;
358def FLAT_STORE_DWORD : FLAT_Store_Pseudo <"flat_store_dword", VGPR_32>;
359def FLAT_STORE_DWORDX2 : FLAT_Store_Pseudo <"flat_store_dwordx2", VReg_64>;
360def FLAT_STORE_DWORDX4 : FLAT_Store_Pseudo <"flat_store_dwordx4", VReg_128>;
361def FLAT_STORE_DWORDX3 : FLAT_Store_Pseudo <"flat_store_dwordx3", VReg_96>;
362
363defm FLAT_ATOMIC_CMPSWAP : FLAT_Atomic_Pseudo <"flat_atomic_cmpswap",
364 VGPR_32, i32, atomic_cmp_swap_flat,
365 v2i32, VReg_64>;
366
367defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_cmpswap_x2",
368 VReg_64, i64, atomic_cmp_swap_flat,
369 v2i64, VReg_128>;
370
371defm FLAT_ATOMIC_SWAP : FLAT_Atomic_Pseudo <"flat_atomic_swap",
372 VGPR_32, i32, atomic_swap_flat>;
373
374defm FLAT_ATOMIC_SWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_swap_x2",
375 VReg_64, i64, atomic_swap_flat>;
376
377defm FLAT_ATOMIC_ADD : FLAT_Atomic_Pseudo <"flat_atomic_add",
378 VGPR_32, i32, atomic_add_flat>;
379
380defm FLAT_ATOMIC_SUB : FLAT_Atomic_Pseudo <"flat_atomic_sub",
381 VGPR_32, i32, atomic_sub_flat>;
382
383defm FLAT_ATOMIC_SMIN : FLAT_Atomic_Pseudo <"flat_atomic_smin",
384 VGPR_32, i32, atomic_min_flat>;
385
386defm FLAT_ATOMIC_UMIN : FLAT_Atomic_Pseudo <"flat_atomic_umin",
387 VGPR_32, i32, atomic_umin_flat>;
388
389defm FLAT_ATOMIC_SMAX : FLAT_Atomic_Pseudo <"flat_atomic_smax",
390 VGPR_32, i32, atomic_max_flat>;
391
392defm FLAT_ATOMIC_UMAX : FLAT_Atomic_Pseudo <"flat_atomic_umax",
393 VGPR_32, i32, atomic_umax_flat>;
394
395defm FLAT_ATOMIC_AND : FLAT_Atomic_Pseudo <"flat_atomic_and",
396 VGPR_32, i32, atomic_and_flat>;
397
398defm FLAT_ATOMIC_OR : FLAT_Atomic_Pseudo <"flat_atomic_or",
399 VGPR_32, i32, atomic_or_flat>;
400
401defm FLAT_ATOMIC_XOR : FLAT_Atomic_Pseudo <"flat_atomic_xor",
402 VGPR_32, i32, atomic_xor_flat>;
403
404defm FLAT_ATOMIC_INC : FLAT_Atomic_Pseudo <"flat_atomic_inc",
405 VGPR_32, i32, atomic_inc_flat>;
406
407defm FLAT_ATOMIC_DEC : FLAT_Atomic_Pseudo <"flat_atomic_dec",
408 VGPR_32, i32, atomic_dec_flat>;
409
410defm FLAT_ATOMIC_ADD_X2 : FLAT_Atomic_Pseudo <"flat_atomic_add_x2",
411 VReg_64, i64, atomic_add_flat>;
412
413defm FLAT_ATOMIC_SUB_X2 : FLAT_Atomic_Pseudo <"flat_atomic_sub_x2",
414 VReg_64, i64, atomic_sub_flat>;
415
416defm FLAT_ATOMIC_SMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_smin_x2",
417 VReg_64, i64, atomic_min_flat>;
418
419defm FLAT_ATOMIC_UMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_umin_x2",
420 VReg_64, i64, atomic_umin_flat>;
421
422defm FLAT_ATOMIC_SMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_smax_x2",
423 VReg_64, i64, atomic_max_flat>;
424
425defm FLAT_ATOMIC_UMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_umax_x2",
426 VReg_64, i64, atomic_umax_flat>;
427
428defm FLAT_ATOMIC_AND_X2 : FLAT_Atomic_Pseudo <"flat_atomic_and_x2",
429 VReg_64, i64, atomic_and_flat>;
430
431defm FLAT_ATOMIC_OR_X2 : FLAT_Atomic_Pseudo <"flat_atomic_or_x2",
432 VReg_64, i64, atomic_or_flat>;
433
434defm FLAT_ATOMIC_XOR_X2 : FLAT_Atomic_Pseudo <"flat_atomic_xor_x2",
435 VReg_64, i64, atomic_xor_flat>;
436
437defm FLAT_ATOMIC_INC_X2 : FLAT_Atomic_Pseudo <"flat_atomic_inc_x2",
438 VReg_64, i64, atomic_inc_flat>;
439
440defm FLAT_ATOMIC_DEC_X2 : FLAT_Atomic_Pseudo <"flat_atomic_dec_x2",
441 VReg_64, i64, atomic_dec_flat>;
442
443let SubtargetPredicate = isCI in { // CI Only flat instructions : FIXME Only?
444
445defm FLAT_ATOMIC_FCMPSWAP : FLAT_Atomic_Pseudo <"flat_atomic_fcmpswap",
446 VGPR_32, f32, null_frag, v2f32, VReg_64>;
447
448defm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fcmpswap_x2",
449 VReg_64, f64, null_frag, v2f64, VReg_128>;
450
451defm FLAT_ATOMIC_FMIN : FLAT_Atomic_Pseudo <"flat_atomic_fmin",
452 VGPR_32, f32>;
453
454defm FLAT_ATOMIC_FMAX : FLAT_Atomic_Pseudo <"flat_atomic_fmax",
455 VGPR_32, f32>;
456
457defm FLAT_ATOMIC_FMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fmin_x2",
458 VReg_64, f64>;
459
460defm FLAT_ATOMIC_FMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fmax_x2",
461 VReg_64, f64>;
462
463} // End SubtargetPredicate = isCI
464
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000465let SubtargetPredicate = HasFlatGlobalInsts in {
Matt Arsenault04004712017-07-20 05:17:54 +0000466defm GLOBAL_LOAD_UBYTE : FLAT_Global_Load_Pseudo <"global_load_ubyte", VGPR_32>;
467defm GLOBAL_LOAD_SBYTE : FLAT_Global_Load_Pseudo <"global_load_sbyte", VGPR_32>;
468defm GLOBAL_LOAD_USHORT : FLAT_Global_Load_Pseudo <"global_load_ushort", VGPR_32>;
469defm GLOBAL_LOAD_SSHORT : FLAT_Global_Load_Pseudo <"global_load_sshort", VGPR_32>;
470defm GLOBAL_LOAD_DWORD : FLAT_Global_Load_Pseudo <"global_load_dword", VGPR_32>;
471defm GLOBAL_LOAD_DWORDX2 : FLAT_Global_Load_Pseudo <"global_load_dwordx2", VReg_64>;
472defm GLOBAL_LOAD_DWORDX3 : FLAT_Global_Load_Pseudo <"global_load_dwordx3", VReg_96>;
473defm GLOBAL_LOAD_DWORDX4 : FLAT_Global_Load_Pseudo <"global_load_dwordx4", VReg_128>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000474
Matt Arsenault04004712017-07-20 05:17:54 +0000475defm GLOBAL_STORE_BYTE : FLAT_Global_Store_Pseudo <"global_store_byte", VGPR_32>;
476defm GLOBAL_STORE_SHORT : FLAT_Global_Store_Pseudo <"global_store_short", VGPR_32>;
477defm GLOBAL_STORE_DWORD : FLAT_Global_Store_Pseudo <"global_store_dword", VGPR_32>;
478defm GLOBAL_STORE_DWORDX2 : FLAT_Global_Store_Pseudo <"global_store_dwordx2", VReg_64>;
479defm GLOBAL_STORE_DWORDX3 : FLAT_Global_Store_Pseudo <"global_store_dwordx3", VReg_96>;
480defm GLOBAL_STORE_DWORDX4 : FLAT_Global_Store_Pseudo <"global_store_dwordx4", VReg_128>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000481
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000482
483let is_flat_global = 1 in {
484defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Global_Atomic_Pseudo <"global_atomic_cmpswap",
485 VGPR_32, i32, AMDGPUatomic_cmp_swap_global,
486 v2i32, VReg_64>;
487
488defm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_cmpswap_x2",
489 VReg_64, i64, AMDGPUatomic_cmp_swap_global,
490 v2i64, VReg_128>;
491
492defm GLOBAL_ATOMIC_SWAP : FLAT_Global_Atomic_Pseudo <"global_atomic_swap",
493 VGPR_32, i32, atomic_swap_global>;
494
495defm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_swap_x2",
496 VReg_64, i64, atomic_swap_global>;
497
498defm GLOBAL_ATOMIC_ADD : FLAT_Global_Atomic_Pseudo <"global_atomic_add",
499 VGPR_32, i32, atomic_add_global>;
500
501defm GLOBAL_ATOMIC_SUB : FLAT_Global_Atomic_Pseudo <"global_atomic_sub",
502 VGPR_32, i32, atomic_sub_global>;
503
504defm GLOBAL_ATOMIC_SMIN : FLAT_Global_Atomic_Pseudo <"global_atomic_smin",
505 VGPR_32, i32, atomic_min_global>;
506
507defm GLOBAL_ATOMIC_UMIN : FLAT_Global_Atomic_Pseudo <"global_atomic_umin",
508 VGPR_32, i32, atomic_umin_global>;
509
510defm GLOBAL_ATOMIC_SMAX : FLAT_Global_Atomic_Pseudo <"global_atomic_smax",
511 VGPR_32, i32, atomic_max_global>;
512
513defm GLOBAL_ATOMIC_UMAX : FLAT_Global_Atomic_Pseudo <"global_atomic_umax",
514 VGPR_32, i32, atomic_umax_global>;
515
516defm GLOBAL_ATOMIC_AND : FLAT_Global_Atomic_Pseudo <"global_atomic_and",
517 VGPR_32, i32, atomic_and_global>;
518
519defm GLOBAL_ATOMIC_OR : FLAT_Global_Atomic_Pseudo <"global_atomic_or",
520 VGPR_32, i32, atomic_or_global>;
521
522defm GLOBAL_ATOMIC_XOR : FLAT_Global_Atomic_Pseudo <"global_atomic_xor",
523 VGPR_32, i32, atomic_xor_global>;
524
525defm GLOBAL_ATOMIC_INC : FLAT_Global_Atomic_Pseudo <"global_atomic_inc",
526 VGPR_32, i32, atomic_inc_global>;
527
528defm GLOBAL_ATOMIC_DEC : FLAT_Global_Atomic_Pseudo <"global_atomic_dec",
529 VGPR_32, i32, atomic_dec_global>;
530
531defm GLOBAL_ATOMIC_ADD_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_add_x2",
532 VReg_64, i64, atomic_add_global>;
533
534defm GLOBAL_ATOMIC_SUB_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_sub_x2",
535 VReg_64, i64, atomic_sub_global>;
536
537defm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_smin_x2",
538 VReg_64, i64, atomic_min_global>;
539
540defm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_umin_x2",
541 VReg_64, i64, atomic_umin_global>;
542
543defm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_smax_x2",
544 VReg_64, i64, atomic_max_global>;
545
546defm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_umax_x2",
547 VReg_64, i64, atomic_umax_global>;
548
549defm GLOBAL_ATOMIC_AND_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_and_x2",
550 VReg_64, i64, atomic_and_global>;
551
552defm GLOBAL_ATOMIC_OR_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_or_x2",
553 VReg_64, i64, atomic_or_global>;
554
555defm GLOBAL_ATOMIC_XOR_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_xor_x2",
556 VReg_64, i64, atomic_xor_global>;
557
558defm GLOBAL_ATOMIC_INC_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_inc_x2",
559 VReg_64, i64, atomic_inc_global>;
560
561defm GLOBAL_ATOMIC_DEC_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_dec_x2",
562 VReg_64, i64, atomic_dec_global>;
563} // End is_flat_global = 1
564
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000565} // End SubtargetPredicate = HasFlatGlobalInsts
566
567
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000568let SubtargetPredicate = HasFlatScratchInsts in {
569defm SCRATCH_LOAD_UBYTE : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte", VGPR_32>;
570defm SCRATCH_LOAD_SBYTE : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte", VGPR_32>;
571defm SCRATCH_LOAD_USHORT : FLAT_Scratch_Load_Pseudo <"scratch_load_ushort", VGPR_32>;
572defm SCRATCH_LOAD_SSHORT : FLAT_Scratch_Load_Pseudo <"scratch_load_sshort", VGPR_32>;
573defm SCRATCH_LOAD_DWORD : FLAT_Scratch_Load_Pseudo <"scratch_load_dword", VGPR_32>;
574defm SCRATCH_LOAD_DWORDX2 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx2", VReg_64>;
575defm SCRATCH_LOAD_DWORDX3 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx3", VReg_96>;
576defm SCRATCH_LOAD_DWORDX4 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx4", VReg_128>;
577
578defm SCRATCH_STORE_BYTE : FLAT_Scratch_Store_Pseudo <"scratch_store_byte", VGPR_32>;
579defm SCRATCH_STORE_SHORT : FLAT_Scratch_Store_Pseudo <"scratch_store_short", VGPR_32>;
580defm SCRATCH_STORE_DWORD : FLAT_Scratch_Store_Pseudo <"scratch_store_dword", VGPR_32>;
581defm SCRATCH_STORE_DWORDX2 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx2", VReg_64>;
582defm SCRATCH_STORE_DWORDX3 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx3", VReg_96>;
583defm SCRATCH_STORE_DWORDX4 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx4", VReg_128>;
584
585} // End SubtargetPredicate = HasFlatScratchInsts
586
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000587//===----------------------------------------------------------------------===//
588// Flat Patterns
589//===----------------------------------------------------------------------===//
590
591class flat_ld <SDPatternOperator ld> : PatFrag<(ops node:$ptr),
592 (ld node:$ptr), [{
593 auto const AS = cast<MemSDNode>(N)->getAddressSpace();
Yaxun Liu1a14bfa2017-03-27 14:04:01 +0000594 return AS == AMDGPUASI.FLAT_ADDRESS ||
595 AS == AMDGPUASI.GLOBAL_ADDRESS ||
596 AS == AMDGPUASI.CONSTANT_ADDRESS;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000597}]>;
598
599class flat_st <SDPatternOperator st> : PatFrag<(ops node:$val, node:$ptr),
600 (st node:$val, node:$ptr), [{
601 auto const AS = cast<MemSDNode>(N)->getAddressSpace();
Yaxun Liu1a14bfa2017-03-27 14:04:01 +0000602 return AS == AMDGPUASI.FLAT_ADDRESS ||
603 AS == AMDGPUASI.GLOBAL_ADDRESS;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000604}]>;
605
606def atomic_flat_load : flat_ld <atomic_load>;
607def flat_load : flat_ld <load>;
608def flat_az_extloadi8 : flat_ld <az_extloadi8>;
609def flat_sextloadi8 : flat_ld <sextloadi8>;
610def flat_az_extloadi16 : flat_ld <az_extloadi16>;
611def flat_sextloadi16 : flat_ld <sextloadi16>;
612
613def atomic_flat_store : flat_st <atomic_store>;
614def flat_store : flat_st <store>;
615def flat_truncstorei8 : flat_st <truncstorei8>;
616def flat_truncstorei16 : flat_st <truncstorei16>;
617
618// Patterns for global loads with no offset.
619class FlatLoadPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : Pat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000620 (vt (node (FLATOffset i64:$vaddr, i16:$offset, i1:$slc))),
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000621 (inst $vaddr, $offset, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000622>;
623
624class FlatLoadAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : Pat <
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000625 (vt (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc))),
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +0000626 (inst $vaddr, $offset, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000627>;
628
Matt Arsenault4e309b02017-07-29 01:03:53 +0000629class FlatLoadSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : Pat <
630 (vt (node (FLATOffsetSigned i64:$vaddr, i16:$offset, i1:$slc))),
631 (inst $vaddr, $offset, 0, $slc)
632>;
633
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000634class FlatStorePat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : Pat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000635 (node vt:$data, (FLATOffset i64:$vaddr, i16:$offset, i1:$slc)),
636 (inst $vaddr, $data, $offset, 0, $slc)
637>;
638
639class FlatStoreSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : Pat <
640 (node vt:$data, (FLATOffsetSigned i64:$vaddr, i16:$offset, i1:$slc)),
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000641 (inst $vaddr, $data, $offset, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000642>;
643
644class FlatStoreAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : Pat <
645 // atomic store follows atomic binop convention so the address comes
646 // first.
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000647 (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), vt:$data),
Konstantin Zhuravlyove9a5a772017-07-21 21:19:23 +0000648 (inst $vaddr, $data, $offset, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000649>;
650
Matt Arsenault4e309b02017-07-29 01:03:53 +0000651class FlatStoreSignedAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : Pat <
652 // atomic store follows atomic binop convention so the address comes
653 // first.
654 (node (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), vt:$data),
655 (inst $vaddr, $data, $offset, 0, $slc)
656>;
657
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000658class FlatAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt,
659 ValueType data_vt = vt> : Pat <
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000660 (vt (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$data)),
661 (inst $vaddr, $data, $offset, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000662>;
663
Matt Arsenault4e309b02017-07-29 01:03:53 +0000664class FlatSignedAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt,
665 ValueType data_vt = vt> : Pat <
666 (vt (node (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$data)),
667 (inst $vaddr, $data, $offset, $slc)
668>;
669
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000670let Predicates = [isCIVI] in {
671
672def : FlatLoadPat <FLAT_LOAD_UBYTE, flat_az_extloadi8, i32>;
673def : FlatLoadPat <FLAT_LOAD_SBYTE, flat_sextloadi8, i32>;
Tom Stellard115a6152016-11-10 16:02:37 +0000674def : FlatLoadPat <FLAT_LOAD_UBYTE, flat_az_extloadi8, i16>;
675def : FlatLoadPat <FLAT_LOAD_SBYTE, flat_sextloadi8, i16>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000676def : FlatLoadPat <FLAT_LOAD_USHORT, flat_az_extloadi16, i32>;
677def : FlatLoadPat <FLAT_LOAD_SSHORT, flat_sextloadi16, i32>;
678def : FlatLoadPat <FLAT_LOAD_DWORD, flat_load, i32>;
679def : FlatLoadPat <FLAT_LOAD_DWORDX2, flat_load, v2i32>;
680def : FlatLoadPat <FLAT_LOAD_DWORDX4, flat_load, v4i32>;
681
682def : FlatLoadAtomicPat <FLAT_LOAD_DWORD, atomic_flat_load, i32>;
683def : FlatLoadAtomicPat <FLAT_LOAD_DWORDX2, atomic_flat_load, i64>;
684
685def : FlatStorePat <FLAT_STORE_BYTE, flat_truncstorei8, i32>;
686def : FlatStorePat <FLAT_STORE_SHORT, flat_truncstorei16, i32>;
687def : FlatStorePat <FLAT_STORE_DWORD, flat_store, i32>;
688def : FlatStorePat <FLAT_STORE_DWORDX2, flat_store, v2i32>;
689def : FlatStorePat <FLAT_STORE_DWORDX4, flat_store, v4i32>;
690
691def : FlatStoreAtomicPat <FLAT_STORE_DWORD, atomic_flat_store, i32>;
692def : FlatStoreAtomicPat <FLAT_STORE_DWORDX2, atomic_flat_store, i64>;
693
694def : FlatAtomicPat <FLAT_ATOMIC_ADD_RTN, atomic_add_global, i32>;
695def : FlatAtomicPat <FLAT_ATOMIC_SUB_RTN, atomic_sub_global, i32>;
696def : FlatAtomicPat <FLAT_ATOMIC_INC_RTN, atomic_inc_global, i32>;
697def : FlatAtomicPat <FLAT_ATOMIC_DEC_RTN, atomic_dec_global, i32>;
698def : FlatAtomicPat <FLAT_ATOMIC_AND_RTN, atomic_and_global, i32>;
699def : FlatAtomicPat <FLAT_ATOMIC_SMAX_RTN, atomic_max_global, i32>;
700def : FlatAtomicPat <FLAT_ATOMIC_UMAX_RTN, atomic_umax_global, i32>;
701def : FlatAtomicPat <FLAT_ATOMIC_SMIN_RTN, atomic_min_global, i32>;
702def : FlatAtomicPat <FLAT_ATOMIC_UMIN_RTN, atomic_umin_global, i32>;
703def : FlatAtomicPat <FLAT_ATOMIC_OR_RTN, atomic_or_global, i32>;
704def : FlatAtomicPat <FLAT_ATOMIC_SWAP_RTN, atomic_swap_global, i32>;
Jan Vesely206a5102016-12-23 15:34:51 +0000705def : FlatAtomicPat <FLAT_ATOMIC_CMPSWAP_RTN, AMDGPUatomic_cmp_swap_global, i32, v2i32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000706def : FlatAtomicPat <FLAT_ATOMIC_XOR_RTN, atomic_xor_global, i32>;
707
708def : FlatAtomicPat <FLAT_ATOMIC_ADD_X2_RTN, atomic_add_global, i64>;
709def : FlatAtomicPat <FLAT_ATOMIC_SUB_X2_RTN, atomic_sub_global, i64>;
710def : FlatAtomicPat <FLAT_ATOMIC_INC_X2_RTN, atomic_inc_global, i64>;
711def : FlatAtomicPat <FLAT_ATOMIC_DEC_X2_RTN, atomic_dec_global, i64>;
712def : FlatAtomicPat <FLAT_ATOMIC_AND_X2_RTN, atomic_and_global, i64>;
713def : FlatAtomicPat <FLAT_ATOMIC_SMAX_X2_RTN, atomic_max_global, i64>;
714def : FlatAtomicPat <FLAT_ATOMIC_UMAX_X2_RTN, atomic_umax_global, i64>;
715def : FlatAtomicPat <FLAT_ATOMIC_SMIN_X2_RTN, atomic_min_global, i64>;
716def : FlatAtomicPat <FLAT_ATOMIC_UMIN_X2_RTN, atomic_umin_global, i64>;
717def : FlatAtomicPat <FLAT_ATOMIC_OR_X2_RTN, atomic_or_global, i64>;
718def : FlatAtomicPat <FLAT_ATOMIC_SWAP_X2_RTN, atomic_swap_global, i64>;
Jan Vesely206a5102016-12-23 15:34:51 +0000719def : FlatAtomicPat <FLAT_ATOMIC_CMPSWAP_X2_RTN, AMDGPUatomic_cmp_swap_global, i64, v2i64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000720def : FlatAtomicPat <FLAT_ATOMIC_XOR_X2_RTN, atomic_xor_global, i64>;
721
722} // End Predicates = [isCIVI]
723
Tom Stellard115a6152016-11-10 16:02:37 +0000724let Predicates = [isVI] in {
725 def : FlatStorePat <FLAT_STORE_BYTE, flat_truncstorei8, i16>;
726 def : FlatStorePat <FLAT_STORE_SHORT, flat_store, i16>;
727}
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000728
729
Matt Arsenault4e309b02017-07-29 01:03:53 +0000730let Predicates = [HasFlatGlobalInsts], AddedComplexity = 10 in {
731
732def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, az_extloadi8_global, i32>;
733def : FlatLoadSignedPat <GLOBAL_LOAD_SBYTE, sextloadi8_global, i32>;
734def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, az_extloadi8_global, i16>;
735def : FlatLoadSignedPat <GLOBAL_LOAD_SBYTE, sextloadi8_global, i16>;
736def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, az_extloadi16_global, i32>;
737def : FlatLoadSignedPat <GLOBAL_LOAD_SSHORT, sextloadi16_global, i32>;
738
739
740def : FlatLoadSignedPat <GLOBAL_LOAD_DWORD, global_load, i32>;
741def : FlatLoadSignedPat <GLOBAL_LOAD_DWORDX2, global_load, v2i32>;
742def : FlatLoadSignedPat <GLOBAL_LOAD_DWORDX4, global_load, v4i32>;
743
744def : FlatLoadAtomicPat <GLOBAL_LOAD_DWORD, global_atomic_load, i32>;
745def : FlatLoadAtomicPat <GLOBAL_LOAD_DWORDX2, global_atomic_load, i64>;
746
747def : FlatStoreSignedPat <GLOBAL_STORE_BYTE, truncstorei8_global, i32>;
748def : FlatStoreSignedPat <GLOBAL_STORE_BYTE, truncstorei8_global, i16>;
749def : FlatStoreSignedPat <GLOBAL_STORE_SHORT, truncstorei16_global, i32>;
750def : FlatStoreSignedPat <GLOBAL_STORE_SHORT, global_store, i16>;
751def : FlatStoreSignedPat <GLOBAL_STORE_DWORD, global_store, i32>;
752def : FlatStoreSignedPat <GLOBAL_STORE_DWORDX2, global_store, v2i32>;
753def : FlatStoreSignedPat <GLOBAL_STORE_DWORDX4, global_store, v4i32>;
754
755def : FlatStoreSignedAtomicPat <GLOBAL_STORE_DWORD, global_store_atomic, i32>;
756def : FlatStoreSignedAtomicPat <GLOBAL_STORE_DWORDX2, global_store_atomic, i64>;
757
758def : FlatSignedAtomicPat <GLOBAL_ATOMIC_ADD_RTN, atomic_add_global, i32>;
759def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SUB_RTN, atomic_sub_global, i32>;
760def : FlatSignedAtomicPat <GLOBAL_ATOMIC_INC_RTN, atomic_inc_global, i32>;
761def : FlatSignedAtomicPat <GLOBAL_ATOMIC_DEC_RTN, atomic_dec_global, i32>;
762def : FlatSignedAtomicPat <GLOBAL_ATOMIC_AND_RTN, atomic_and_global, i32>;
763def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMAX_RTN, atomic_max_global, i32>;
764def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMAX_RTN, atomic_umax_global, i32>;
765def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMIN_RTN, atomic_min_global, i32>;
766def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMIN_RTN, atomic_umin_global, i32>;
767def : FlatSignedAtomicPat <GLOBAL_ATOMIC_OR_RTN, atomic_or_global, i32>;
768def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SWAP_RTN, atomic_swap_global, i32>;
769def : FlatSignedAtomicPat <GLOBAL_ATOMIC_CMPSWAP_RTN, AMDGPUatomic_cmp_swap_global, i32, v2i32>;
770def : FlatSignedAtomicPat <GLOBAL_ATOMIC_XOR_RTN, atomic_xor_global, i32>;
771
772def : FlatSignedAtomicPat <GLOBAL_ATOMIC_ADD_X2_RTN, atomic_add_global, i64>;
773def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SUB_X2_RTN, atomic_sub_global, i64>;
774def : FlatSignedAtomicPat <GLOBAL_ATOMIC_INC_X2_RTN, atomic_inc_global, i64>;
775def : FlatSignedAtomicPat <GLOBAL_ATOMIC_DEC_X2_RTN, atomic_dec_global, i64>;
776def : FlatSignedAtomicPat <GLOBAL_ATOMIC_AND_X2_RTN, atomic_and_global, i64>;
777def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMAX_X2_RTN, atomic_max_global, i64>;
778def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMAX_X2_RTN, atomic_umax_global, i64>;
779def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMIN_X2_RTN, atomic_min_global, i64>;
780def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMIN_X2_RTN, atomic_umin_global, i64>;
781def : FlatSignedAtomicPat <GLOBAL_ATOMIC_OR_X2_RTN, atomic_or_global, i64>;
782def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SWAP_X2_RTN, atomic_swap_global, i64>;
783def : FlatSignedAtomicPat <GLOBAL_ATOMIC_CMPSWAP_X2_RTN, AMDGPUatomic_cmp_swap_global, i64, v2i64>;
784def : FlatSignedAtomicPat <GLOBAL_ATOMIC_XOR_X2_RTN, atomic_xor_global, i64>;
785
786} // End Predicates = [HasFlatGlobalInsts]
787
788
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000789//===----------------------------------------------------------------------===//
790// Target
791//===----------------------------------------------------------------------===//
792
793//===----------------------------------------------------------------------===//
794// CI
795//===----------------------------------------------------------------------===//
796
797class FLAT_Real_ci <bits<7> op, FLAT_Pseudo ps> :
798 FLAT_Real <op, ps>,
799 SIMCInstr <ps.PseudoInstr, SIEncodingFamily.SI> {
800 let AssemblerPredicate = isCIOnly;
801 let DecoderNamespace="CI";
802}
803
804def FLAT_LOAD_UBYTE_ci : FLAT_Real_ci <0x8, FLAT_LOAD_UBYTE>;
805def FLAT_LOAD_SBYTE_ci : FLAT_Real_ci <0x9, FLAT_LOAD_SBYTE>;
806def FLAT_LOAD_USHORT_ci : FLAT_Real_ci <0xa, FLAT_LOAD_USHORT>;
807def FLAT_LOAD_SSHORT_ci : FLAT_Real_ci <0xb, FLAT_LOAD_SSHORT>;
808def FLAT_LOAD_DWORD_ci : FLAT_Real_ci <0xc, FLAT_LOAD_DWORD>;
809def FLAT_LOAD_DWORDX2_ci : FLAT_Real_ci <0xd, FLAT_LOAD_DWORDX2>;
810def FLAT_LOAD_DWORDX4_ci : FLAT_Real_ci <0xe, FLAT_LOAD_DWORDX4>;
811def FLAT_LOAD_DWORDX3_ci : FLAT_Real_ci <0xf, FLAT_LOAD_DWORDX3>;
812
813def FLAT_STORE_BYTE_ci : FLAT_Real_ci <0x18, FLAT_STORE_BYTE>;
814def FLAT_STORE_SHORT_ci : FLAT_Real_ci <0x1a, FLAT_STORE_SHORT>;
815def FLAT_STORE_DWORD_ci : FLAT_Real_ci <0x1c, FLAT_STORE_DWORD>;
816def FLAT_STORE_DWORDX2_ci : FLAT_Real_ci <0x1d, FLAT_STORE_DWORDX2>;
817def FLAT_STORE_DWORDX4_ci : FLAT_Real_ci <0x1e, FLAT_STORE_DWORDX4>;
818def FLAT_STORE_DWORDX3_ci : FLAT_Real_ci <0x1f, FLAT_STORE_DWORDX3>;
819
820multiclass FLAT_Real_Atomics_ci <bits<7> op, FLAT_Pseudo ps> {
821 def _ci : FLAT_Real_ci<op, !cast<FLAT_Pseudo>(ps.PseudoInstr)>;
822 def _RTN_ci : FLAT_Real_ci<op, !cast<FLAT_Pseudo>(ps.PseudoInstr # "_RTN")>;
823}
824
825defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_ci <0x30, FLAT_ATOMIC_SWAP>;
826defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_ci <0x31, FLAT_ATOMIC_CMPSWAP>;
827defm FLAT_ATOMIC_ADD : FLAT_Real_Atomics_ci <0x32, FLAT_ATOMIC_ADD>;
828defm FLAT_ATOMIC_SUB : FLAT_Real_Atomics_ci <0x33, FLAT_ATOMIC_SUB>;
829defm FLAT_ATOMIC_SMIN : FLAT_Real_Atomics_ci <0x35, FLAT_ATOMIC_SMIN>;
830defm FLAT_ATOMIC_UMIN : FLAT_Real_Atomics_ci <0x36, FLAT_ATOMIC_UMIN>;
831defm FLAT_ATOMIC_SMAX : FLAT_Real_Atomics_ci <0x37, FLAT_ATOMIC_SMAX>;
832defm FLAT_ATOMIC_UMAX : FLAT_Real_Atomics_ci <0x38, FLAT_ATOMIC_UMAX>;
833defm FLAT_ATOMIC_AND : FLAT_Real_Atomics_ci <0x39, FLAT_ATOMIC_AND>;
834defm FLAT_ATOMIC_OR : FLAT_Real_Atomics_ci <0x3a, FLAT_ATOMIC_OR>;
835defm FLAT_ATOMIC_XOR : FLAT_Real_Atomics_ci <0x3b, FLAT_ATOMIC_XOR>;
836defm FLAT_ATOMIC_INC : FLAT_Real_Atomics_ci <0x3c, FLAT_ATOMIC_INC>;
837defm FLAT_ATOMIC_DEC : FLAT_Real_Atomics_ci <0x3d, FLAT_ATOMIC_DEC>;
838defm FLAT_ATOMIC_SWAP_X2 : FLAT_Real_Atomics_ci <0x50, FLAT_ATOMIC_SWAP_X2>;
839defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_ci <0x51, FLAT_ATOMIC_CMPSWAP_X2>;
840defm FLAT_ATOMIC_ADD_X2 : FLAT_Real_Atomics_ci <0x52, FLAT_ATOMIC_ADD_X2>;
841defm FLAT_ATOMIC_SUB_X2 : FLAT_Real_Atomics_ci <0x53, FLAT_ATOMIC_SUB_X2>;
842defm FLAT_ATOMIC_SMIN_X2 : FLAT_Real_Atomics_ci <0x55, FLAT_ATOMIC_SMIN_X2>;
843defm FLAT_ATOMIC_UMIN_X2 : FLAT_Real_Atomics_ci <0x56, FLAT_ATOMIC_UMIN_X2>;
844defm FLAT_ATOMIC_SMAX_X2 : FLAT_Real_Atomics_ci <0x57, FLAT_ATOMIC_SMAX_X2>;
845defm FLAT_ATOMIC_UMAX_X2 : FLAT_Real_Atomics_ci <0x58, FLAT_ATOMIC_UMAX_X2>;
846defm FLAT_ATOMIC_AND_X2 : FLAT_Real_Atomics_ci <0x59, FLAT_ATOMIC_AND_X2>;
847defm FLAT_ATOMIC_OR_X2 : FLAT_Real_Atomics_ci <0x5a, FLAT_ATOMIC_OR_X2>;
848defm FLAT_ATOMIC_XOR_X2 : FLAT_Real_Atomics_ci <0x5b, FLAT_ATOMIC_XOR_X2>;
849defm FLAT_ATOMIC_INC_X2 : FLAT_Real_Atomics_ci <0x5c, FLAT_ATOMIC_INC_X2>;
850defm FLAT_ATOMIC_DEC_X2 : FLAT_Real_Atomics_ci <0x5d, FLAT_ATOMIC_DEC_X2>;
851
852// CI Only flat instructions
853defm FLAT_ATOMIC_FCMPSWAP : FLAT_Real_Atomics_ci <0x3e, FLAT_ATOMIC_FCMPSWAP>;
854defm FLAT_ATOMIC_FMIN : FLAT_Real_Atomics_ci <0x3f, FLAT_ATOMIC_FMIN>;
855defm FLAT_ATOMIC_FMAX : FLAT_Real_Atomics_ci <0x40, FLAT_ATOMIC_FMAX>;
856defm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Real_Atomics_ci <0x5e, FLAT_ATOMIC_FCMPSWAP_X2>;
857defm FLAT_ATOMIC_FMIN_X2 : FLAT_Real_Atomics_ci <0x5f, FLAT_ATOMIC_FMIN_X2>;
858defm FLAT_ATOMIC_FMAX_X2 : FLAT_Real_Atomics_ci <0x60, FLAT_ATOMIC_FMAX_X2>;
859
860
861//===----------------------------------------------------------------------===//
862// VI
863//===----------------------------------------------------------------------===//
864
865class FLAT_Real_vi <bits<7> op, FLAT_Pseudo ps> :
866 FLAT_Real <op, ps>,
867 SIMCInstr <ps.PseudoInstr, SIEncodingFamily.VI> {
868 let AssemblerPredicate = isVI;
869 let DecoderNamespace="VI";
870}
871
Matt Arsenault04004712017-07-20 05:17:54 +0000872multiclass FLAT_Real_AllAddr_vi<bits<7> op> {
873 def _vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME)>;
874 def _SADDR_vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME#"_SADDR")>;
875}
876
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000877def FLAT_LOAD_UBYTE_vi : FLAT_Real_vi <0x10, FLAT_LOAD_UBYTE>;
878def FLAT_LOAD_SBYTE_vi : FLAT_Real_vi <0x11, FLAT_LOAD_SBYTE>;
879def FLAT_LOAD_USHORT_vi : FLAT_Real_vi <0x12, FLAT_LOAD_USHORT>;
880def FLAT_LOAD_SSHORT_vi : FLAT_Real_vi <0x13, FLAT_LOAD_SSHORT>;
881def FLAT_LOAD_DWORD_vi : FLAT_Real_vi <0x14, FLAT_LOAD_DWORD>;
882def FLAT_LOAD_DWORDX2_vi : FLAT_Real_vi <0x15, FLAT_LOAD_DWORDX2>;
883def FLAT_LOAD_DWORDX4_vi : FLAT_Real_vi <0x17, FLAT_LOAD_DWORDX4>;
884def FLAT_LOAD_DWORDX3_vi : FLAT_Real_vi <0x16, FLAT_LOAD_DWORDX3>;
885
886def FLAT_STORE_BYTE_vi : FLAT_Real_vi <0x18, FLAT_STORE_BYTE>;
887def FLAT_STORE_SHORT_vi : FLAT_Real_vi <0x1a, FLAT_STORE_SHORT>;
888def FLAT_STORE_DWORD_vi : FLAT_Real_vi <0x1c, FLAT_STORE_DWORD>;
889def FLAT_STORE_DWORDX2_vi : FLAT_Real_vi <0x1d, FLAT_STORE_DWORDX2>;
890def FLAT_STORE_DWORDX4_vi : FLAT_Real_vi <0x1f, FLAT_STORE_DWORDX4>;
891def FLAT_STORE_DWORDX3_vi : FLAT_Real_vi <0x1e, FLAT_STORE_DWORDX3>;
892
893multiclass FLAT_Real_Atomics_vi <bits<7> op, FLAT_Pseudo ps> {
894 def _vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(ps.PseudoInstr)>;
895 def _RTN_vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(ps.PseudoInstr # "_RTN")>;
896}
897
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000898multiclass FLAT_Global_Real_Atomics_vi<bits<7> op> :
899 FLAT_Real_AllAddr_vi<op> {
900 def _RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_RTN")>;
901 def _SADDR_RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN")>;
902}
903
904
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000905defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_vi <0x40, FLAT_ATOMIC_SWAP>;
906defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_vi <0x41, FLAT_ATOMIC_CMPSWAP>;
907defm FLAT_ATOMIC_ADD : FLAT_Real_Atomics_vi <0x42, FLAT_ATOMIC_ADD>;
908defm FLAT_ATOMIC_SUB : FLAT_Real_Atomics_vi <0x43, FLAT_ATOMIC_SUB>;
909defm FLAT_ATOMIC_SMIN : FLAT_Real_Atomics_vi <0x44, FLAT_ATOMIC_SMIN>;
910defm FLAT_ATOMIC_UMIN : FLAT_Real_Atomics_vi <0x45, FLAT_ATOMIC_UMIN>;
911defm FLAT_ATOMIC_SMAX : FLAT_Real_Atomics_vi <0x46, FLAT_ATOMIC_SMAX>;
912defm FLAT_ATOMIC_UMAX : FLAT_Real_Atomics_vi <0x47, FLAT_ATOMIC_UMAX>;
913defm FLAT_ATOMIC_AND : FLAT_Real_Atomics_vi <0x48, FLAT_ATOMIC_AND>;
914defm FLAT_ATOMIC_OR : FLAT_Real_Atomics_vi <0x49, FLAT_ATOMIC_OR>;
915defm FLAT_ATOMIC_XOR : FLAT_Real_Atomics_vi <0x4a, FLAT_ATOMIC_XOR>;
916defm FLAT_ATOMIC_INC : FLAT_Real_Atomics_vi <0x4b, FLAT_ATOMIC_INC>;
917defm FLAT_ATOMIC_DEC : FLAT_Real_Atomics_vi <0x4c, FLAT_ATOMIC_DEC>;
918defm FLAT_ATOMIC_SWAP_X2 : FLAT_Real_Atomics_vi <0x60, FLAT_ATOMIC_SWAP_X2>;
919defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_vi <0x61, FLAT_ATOMIC_CMPSWAP_X2>;
920defm FLAT_ATOMIC_ADD_X2 : FLAT_Real_Atomics_vi <0x62, FLAT_ATOMIC_ADD_X2>;
921defm FLAT_ATOMIC_SUB_X2 : FLAT_Real_Atomics_vi <0x63, FLAT_ATOMIC_SUB_X2>;
922defm FLAT_ATOMIC_SMIN_X2 : FLAT_Real_Atomics_vi <0x64, FLAT_ATOMIC_SMIN_X2>;
923defm FLAT_ATOMIC_UMIN_X2 : FLAT_Real_Atomics_vi <0x65, FLAT_ATOMIC_UMIN_X2>;
924defm FLAT_ATOMIC_SMAX_X2 : FLAT_Real_Atomics_vi <0x66, FLAT_ATOMIC_SMAX_X2>;
925defm FLAT_ATOMIC_UMAX_X2 : FLAT_Real_Atomics_vi <0x67, FLAT_ATOMIC_UMAX_X2>;
926defm FLAT_ATOMIC_AND_X2 : FLAT_Real_Atomics_vi <0x68, FLAT_ATOMIC_AND_X2>;
927defm FLAT_ATOMIC_OR_X2 : FLAT_Real_Atomics_vi <0x69, FLAT_ATOMIC_OR_X2>;
928defm FLAT_ATOMIC_XOR_X2 : FLAT_Real_Atomics_vi <0x6a, FLAT_ATOMIC_XOR_X2>;
929defm FLAT_ATOMIC_INC_X2 : FLAT_Real_Atomics_vi <0x6b, FLAT_ATOMIC_INC_X2>;
930defm FLAT_ATOMIC_DEC_X2 : FLAT_Real_Atomics_vi <0x6c, FLAT_ATOMIC_DEC_X2>;
931
Matt Arsenault04004712017-07-20 05:17:54 +0000932defm GLOBAL_LOAD_UBYTE : FLAT_Real_AllAddr_vi <0x10>;
933defm GLOBAL_LOAD_SBYTE : FLAT_Real_AllAddr_vi <0x11>;
934defm GLOBAL_LOAD_USHORT : FLAT_Real_AllAddr_vi <0x12>;
935defm GLOBAL_LOAD_SSHORT : FLAT_Real_AllAddr_vi <0x13>;
936defm GLOBAL_LOAD_DWORD : FLAT_Real_AllAddr_vi <0x14>;
937defm GLOBAL_LOAD_DWORDX2 : FLAT_Real_AllAddr_vi <0x15>;
Matt Arsenault04004712017-07-20 05:17:54 +0000938defm GLOBAL_LOAD_DWORDX3 : FLAT_Real_AllAddr_vi <0x16>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000939defm GLOBAL_LOAD_DWORDX4 : FLAT_Real_AllAddr_vi <0x17>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000940
Matt Arsenault04004712017-07-20 05:17:54 +0000941defm GLOBAL_STORE_BYTE : FLAT_Real_AllAddr_vi <0x18>;
942defm GLOBAL_STORE_SHORT : FLAT_Real_AllAddr_vi <0x1a>;
943defm GLOBAL_STORE_DWORD : FLAT_Real_AllAddr_vi <0x1c>;
944defm GLOBAL_STORE_DWORDX2 : FLAT_Real_AllAddr_vi <0x1d>;
Matt Arsenault04004712017-07-20 05:17:54 +0000945defm GLOBAL_STORE_DWORDX3 : FLAT_Real_AllAddr_vi <0x1e>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000946defm GLOBAL_STORE_DWORDX4 : FLAT_Real_AllAddr_vi <0x1f>;
947
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000948
949defm GLOBAL_ATOMIC_SWAP : FLAT_Global_Real_Atomics_vi <0x40>;
950defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Global_Real_Atomics_vi <0x41>;
951defm GLOBAL_ATOMIC_ADD : FLAT_Global_Real_Atomics_vi <0x42>;
952defm GLOBAL_ATOMIC_SUB : FLAT_Global_Real_Atomics_vi <0x43>;
953defm GLOBAL_ATOMIC_SMIN : FLAT_Global_Real_Atomics_vi <0x44>;
954defm GLOBAL_ATOMIC_UMIN : FLAT_Global_Real_Atomics_vi <0x45>;
955defm GLOBAL_ATOMIC_SMAX : FLAT_Global_Real_Atomics_vi <0x46>;
956defm GLOBAL_ATOMIC_UMAX : FLAT_Global_Real_Atomics_vi <0x47>;
957defm GLOBAL_ATOMIC_AND : FLAT_Global_Real_Atomics_vi <0x48>;
958defm GLOBAL_ATOMIC_OR : FLAT_Global_Real_Atomics_vi <0x49>;
959defm GLOBAL_ATOMIC_XOR : FLAT_Global_Real_Atomics_vi <0x4a>;
960defm GLOBAL_ATOMIC_INC : FLAT_Global_Real_Atomics_vi <0x4b>;
961defm GLOBAL_ATOMIC_DEC : FLAT_Global_Real_Atomics_vi <0x4c>;
962defm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Global_Real_Atomics_vi <0x60>;
963defm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Global_Real_Atomics_vi <0x61>;
964defm GLOBAL_ATOMIC_ADD_X2 : FLAT_Global_Real_Atomics_vi <0x62>;
965defm GLOBAL_ATOMIC_SUB_X2 : FLAT_Global_Real_Atomics_vi <0x63>;
966defm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Global_Real_Atomics_vi <0x64>;
967defm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Global_Real_Atomics_vi <0x65>;
968defm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Global_Real_Atomics_vi <0x66>;
969defm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Global_Real_Atomics_vi <0x67>;
970defm GLOBAL_ATOMIC_AND_X2 : FLAT_Global_Real_Atomics_vi <0x68>;
971defm GLOBAL_ATOMIC_OR_X2 : FLAT_Global_Real_Atomics_vi <0x69>;
972defm GLOBAL_ATOMIC_XOR_X2 : FLAT_Global_Real_Atomics_vi <0x6a>;
973defm GLOBAL_ATOMIC_INC_X2 : FLAT_Global_Real_Atomics_vi <0x6b>;
974defm GLOBAL_ATOMIC_DEC_X2 : FLAT_Global_Real_Atomics_vi <0x6c>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000975
976defm SCRATCH_LOAD_UBYTE : FLAT_Real_AllAddr_vi <0x10>;
977defm SCRATCH_LOAD_SBYTE : FLAT_Real_AllAddr_vi <0x11>;
978defm SCRATCH_LOAD_USHORT : FLAT_Real_AllAddr_vi <0x12>;
979defm SCRATCH_LOAD_SSHORT : FLAT_Real_AllAddr_vi <0x13>;
980defm SCRATCH_LOAD_DWORD : FLAT_Real_AllAddr_vi <0x14>;
981defm SCRATCH_LOAD_DWORDX2 : FLAT_Real_AllAddr_vi <0x15>;
982defm SCRATCH_LOAD_DWORDX4 : FLAT_Real_AllAddr_vi <0x17>;
983defm SCRATCH_LOAD_DWORDX3 : FLAT_Real_AllAddr_vi <0x16>;
984
985defm SCRATCH_STORE_BYTE : FLAT_Real_AllAddr_vi <0x18>;
986defm SCRATCH_STORE_SHORT : FLAT_Real_AllAddr_vi <0x1a>;
987defm SCRATCH_STORE_DWORD : FLAT_Real_AllAddr_vi <0x1c>;
988defm SCRATCH_STORE_DWORDX2 : FLAT_Real_AllAddr_vi <0x1d>;
989defm SCRATCH_STORE_DWORDX4 : FLAT_Real_AllAddr_vi <0x1f>;
990defm SCRATCH_STORE_DWORDX3 : FLAT_Real_AllAddr_vi <0x1e>;