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