blob: 966bb6666ccd4812ce0a748454ccafd78ea5eebf [file] [log] [blame]
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001//===-- FLATInstructions.td - FLAT Instruction Defintions -----------------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Valery Pykhtin8bc65962016-09-05 11:22:51 +00006//
7//===----------------------------------------------------------------------===//
8
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00009def FLATAtomic : ComplexPattern<i64, 3, "SelectFlatAtomic", [], [SDNPWantRoot], -10>;
10def FLATOffset : ComplexPattern<i64, 3, "SelectFlatOffset<false>", [], [SDNPWantRoot], -10>;
Matt Arsenault4e309b02017-07-29 01:03:53 +000011
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +000012def FLATOffsetSigned : ComplexPattern<i64, 3, "SelectFlatOffset<true>", [], [SDNPWantRoot], -10>;
13def FLATSignedAtomic : ComplexPattern<i64, 3, "SelectFlatAtomicSigned", [], [SDNPWantRoot], -10>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +000014
15//===----------------------------------------------------------------------===//
16// FLAT classes
17//===----------------------------------------------------------------------===//
18
19class FLAT_Pseudo<string opName, dag outs, dag ins,
20 string asmOps, list<dag> pattern=[]> :
21 InstSI<outs, ins, "", pattern>,
22 SIMCInstr<opName, SIEncodingFamily.NONE> {
23
24 let isPseudo = 1;
25 let isCodeGenOnly = 1;
26
Valery Pykhtin8bc65962016-09-05 11:22:51 +000027 let FLAT = 1;
Valery Pykhtin8bc65962016-09-05 11:22:51 +000028
Valery Pykhtin8bc65962016-09-05 11:22:51 +000029 let UseNamedOperandTable = 1;
30 let hasSideEffects = 0;
31 let SchedRW = [WriteVMEM];
32
33 string Mnemonic = opName;
34 string AsmOperands = asmOps;
35
Matt Arsenault9698f1c2017-06-20 19:54:14 +000036 bits<1> is_flat_global = 0;
37 bits<1> is_flat_scratch = 0;
38
Valery Pykhtin8bc65962016-09-05 11:22:51 +000039 bits<1> has_vdst = 1;
Matt Arsenault04004712017-07-20 05:17:54 +000040
41 // We need to distinguish having saddr and enabling saddr because
42 // saddr is only valid for scratch and global instructions. Pre-gfx9
43 // these bits were reserved, so we also don't necessarily want to
44 // set these bits to the disabled value for the original flat
45 // segment instructions.
46 bits<1> has_saddr = 0;
47 bits<1> enabled_saddr = 0;
48 bits<7> saddr_value = 0;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +000049 bits<1> has_vaddr = 1;
Matt Arsenault04004712017-07-20 05:17:54 +000050
Valery Pykhtin8bc65962016-09-05 11:22:51 +000051 bits<1> has_data = 1;
52 bits<1> has_glc = 1;
53 bits<1> glcValue = 0;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +000054 bits<1> has_dlc = 1;
55 bits<1> dlcValue = 0;
Matt Arsenault9698f1c2017-06-20 19:54:14 +000056
Matt Arsenault8728c5f2017-08-07 14:58:04 +000057 let SubtargetPredicate = !if(is_flat_global, HasFlatGlobalInsts,
58 !if(is_flat_scratch, HasFlatScratchInsts, HasFlatAddressSpace));
59
Matt Arsenault9698f1c2017-06-20 19:54:14 +000060 // TODO: M0 if it could possibly access LDS (before gfx9? only)?
61 let Uses = !if(is_flat_global, [EXEC], [EXEC, FLAT_SCR]);
Matt Arsenault6ab9ea92017-07-21 18:34:51 +000062
63 // Internally, FLAT instruction are executed as both an LDS and a
64 // Buffer instruction; so, they increment both VM_CNT and LGKM_CNT
65 // and are not considered done until both have been decremented.
66 let VM_CNT = 1;
67 let LGKM_CNT = !if(!or(is_flat_global, is_flat_scratch), 0, 1);
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +000068
69 let IsNonFlatSeg = !if(!or(is_flat_global, is_flat_scratch), 1, 0);
Valery Pykhtin8bc65962016-09-05 11:22:51 +000070}
71
72class FLAT_Real <bits<7> op, FLAT_Pseudo ps> :
73 InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []>,
74 Enc64 {
75
76 let isPseudo = 0;
77 let isCodeGenOnly = 0;
78
79 // copy relevant pseudo op flags
80 let SubtargetPredicate = ps.SubtargetPredicate;
81 let AsmMatchConverter = ps.AsmMatchConverter;
Matt Arsenaultfd023142017-06-12 15:55:58 +000082 let TSFlags = ps.TSFlags;
83 let UseNamedOperandTable = ps.UseNamedOperandTable;
Valery Pykhtin8bc65962016-09-05 11:22:51 +000084
85 // encoding fields
Matt Arsenault97279a82016-11-29 19:30:44 +000086 bits<8> vaddr;
87 bits<8> vdata;
Matt Arsenault04004712017-07-20 05:17:54 +000088 bits<7> saddr;
Valery Pykhtin8bc65962016-09-05 11:22:51 +000089 bits<8> vdst;
Matt Arsenault04004712017-07-20 05:17:54 +000090
Valery Pykhtin8bc65962016-09-05 11:22:51 +000091 bits<1> slc;
92 bits<1> glc;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +000093 bits<1> dlc;
Matt Arsenault47ccafe2017-05-11 17:38:33 +000094
Matt Arsenaultfd023142017-06-12 15:55:58 +000095 // Only valid on gfx9
96 bits<1> lds = 0; // XXX - What does this actually do?
Matt Arsenault9698f1c2017-06-20 19:54:14 +000097
98 // Segment, 00=flat, 01=scratch, 10=global, 11=reserved
99 bits<2> seg = !if(ps.is_flat_global, 0b10,
100 !if(ps.is_flat_scratch, 0b01, 0));
Matt Arsenaultfd023142017-06-12 15:55:58 +0000101
102 // Signed offset. Highest bit ignored for flat and treated as 12-bit
103 // unsigned for flat acceses.
104 bits<13> offset;
105 bits<1> nv = 0; // XXX - What does this actually do?
106
Matt Arsenault47ccafe2017-05-11 17:38:33 +0000107 // We don't use tfe right now, and it was removed in gfx9.
108 bits<1> tfe = 0;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000109
Matt Arsenaultfd023142017-06-12 15:55:58 +0000110 // Only valid on GFX9+
111 let Inst{12-0} = offset;
112 let Inst{13} = lds;
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000113 let Inst{15-14} = seg;
Matt Arsenaultfd023142017-06-12 15:55:58 +0000114
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000115 let Inst{16} = !if(ps.has_glc, glc, ps.glcValue);
116 let Inst{17} = slc;
117 let Inst{24-18} = op;
118 let Inst{31-26} = 0x37; // Encoding.
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000119 let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
Matt Arsenault97279a82016-11-29 19:30:44 +0000120 let Inst{47-40} = !if(ps.has_data, vdata, ?);
Matt Arsenault04004712017-07-20 05:17:54 +0000121 let Inst{54-48} = !if(ps.has_saddr, !if(ps.enabled_saddr, saddr, 0x7f), 0);
122
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000123 // 54-48 is reserved.
Matt Arsenaultfd023142017-06-12 15:55:58 +0000124 let Inst{55} = nv; // nv on GFX9+, TFE before.
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000125 let Inst{63-56} = !if(ps.has_vdst, vdst, ?);
126}
127
Ron Liebermancac749a2018-11-16 01:13:34 +0000128class GlobalSaddrTable <bit is_saddr, string Name = ""> {
129 bit IsSaddr = is_saddr;
130 string SaddrOp = Name;
131}
132
Matt Arsenault04004712017-07-20 05:17:54 +0000133// TODO: Is exec allowed for saddr? The disabled value 0x7f is the
134// same encoding value as exec_hi, so it isn't possible to use that if
135// saddr is 32-bit (which isn't handled here yet).
Matt Arsenaultfd023142017-06-12 15:55:58 +0000136class FLAT_Load_Pseudo <string opName, RegisterClass regClass,
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000137 bit HasTiedOutput = 0,
Matt Arsenault04004712017-07-20 05:17:54 +0000138 bit HasSignedOffset = 0, bit HasSaddr = 0, bit EnableSaddr = 0> : FLAT_Pseudo<
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000139 opName,
140 (outs regClass:$vdst),
Matt Arsenault461ed082017-09-08 19:09:13 +0000141 !con(
142 !con(
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000143 !con(
144 !con((ins VReg_64:$vaddr),
145 !if(EnableSaddr, (ins SReg_64:$saddr), (ins))),
146 (ins !if(HasSignedOffset,offset_s13,offset_u12):$offset)),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000147 (ins GLC:$glc, SLC:$slc, DLC:$dlc)),
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000148 !if(HasTiedOutput, (ins regClass:$vdst_in), (ins))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000149 " $vdst, $vaddr"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$glc$slc$dlc"> {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000150 let has_data = 0;
151 let mayLoad = 1;
Matt Arsenault04004712017-07-20 05:17:54 +0000152 let has_saddr = HasSaddr;
153 let enabled_saddr = EnableSaddr;
154 let PseudoInstr = opName#!if(!and(HasSaddr, EnableSaddr), "_SADDR", "");
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000155 let maybeAtomic = 1;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000156
157 let Constraints = !if(HasTiedOutput, "$vdst = $vdst_in", "");
158 let DisableEncoding = !if(HasTiedOutput, "$vdst_in", "");
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000159}
160
Matt Arsenaultfd023142017-06-12 15:55:58 +0000161class FLAT_Store_Pseudo <string opName, RegisterClass vdataClass,
Matt Arsenault04004712017-07-20 05:17:54 +0000162 bit HasSignedOffset = 0, bit HasSaddr = 0, bit EnableSaddr = 0> : FLAT_Pseudo<
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000163 opName,
164 (outs),
Matt Arsenault461ed082017-09-08 19:09:13 +0000165 !con(
166 !con(
167 !con((ins VReg_64:$vaddr, vdataClass:$vdata),
168 !if(EnableSaddr, (ins SReg_64:$saddr), (ins))),
169 (ins !if(HasSignedOffset,offset_s13,offset_u12):$offset)),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000170 (ins GLC:$glc, SLC:$slc, DLC:$dlc)),
171 " $vaddr, $vdata"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$glc$slc$dlc"> {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000172 let mayLoad = 0;
173 let mayStore = 1;
174 let has_vdst = 0;
Matt Arsenault04004712017-07-20 05:17:54 +0000175 let has_saddr = HasSaddr;
176 let enabled_saddr = EnableSaddr;
177 let PseudoInstr = opName#!if(!and(HasSaddr, EnableSaddr), "_SADDR", "");
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000178 let maybeAtomic = 1;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000179}
180
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000181multiclass FLAT_Global_Load_Pseudo<string opName, RegisterClass regClass, bit HasTiedInput = 0> {
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000182 let is_flat_global = 1 in {
Ron Liebermancac749a2018-11-16 01:13:34 +0000183 def "" : FLAT_Load_Pseudo<opName, regClass, HasTiedInput, 1, 1>,
184 GlobalSaddrTable<0, opName>;
185 def _SADDR : FLAT_Load_Pseudo<opName, regClass, HasTiedInput, 1, 1, 1>,
186 GlobalSaddrTable<1, opName>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000187 }
188}
189
Matt Arsenault04004712017-07-20 05:17:54 +0000190multiclass FLAT_Global_Store_Pseudo<string opName, RegisterClass regClass> {
191 let is_flat_global = 1 in {
Ron Liebermancac749a2018-11-16 01:13:34 +0000192 def "" : FLAT_Store_Pseudo<opName, regClass, 1, 1>,
193 GlobalSaddrTable<0, opName>;
194 def _SADDR : FLAT_Store_Pseudo<opName, regClass, 1, 1, 1>,
195 GlobalSaddrTable<1, opName>;
Matt Arsenault04004712017-07-20 05:17:54 +0000196 }
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000197}
198
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000199class FLAT_Scratch_Load_Pseudo <string opName, RegisterClass regClass,
200 bit EnableSaddr = 0>: FLAT_Pseudo<
201 opName,
202 (outs regClass:$vdst),
203 !if(EnableSaddr,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000204 (ins SReg_32_XEXEC_HI:$saddr, offset_s13:$offset, GLC:$glc, SLC:$slc, DLC:$dlc),
205 (ins VGPR_32:$vaddr, offset_s13:$offset, GLC:$glc, SLC:$slc, DLC:$dlc)),
206 " $vdst, "#!if(EnableSaddr, "off", "$vaddr")#!if(EnableSaddr, ", $saddr", ", off")#"$offset$glc$slc$dlc"> {
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000207 let has_data = 0;
208 let mayLoad = 1;
209 let has_saddr = 1;
210 let enabled_saddr = EnableSaddr;
211 let has_vaddr = !if(EnableSaddr, 0, 1);
212 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
216class FLAT_Scratch_Store_Pseudo <string opName, RegisterClass vdataClass, bit EnableSaddr = 0> : FLAT_Pseudo<
217 opName,
218 (outs),
219 !if(EnableSaddr,
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000220 (ins vdataClass:$vdata, SReg_32_XEXEC_HI:$saddr, offset_s13:$offset, GLC:$glc, SLC:$slc, DLC:$dlc),
221 (ins vdataClass:$vdata, VGPR_32:$vaddr, offset_s13:$offset, GLC:$glc, SLC:$slc, DLC:$dlc)),
222 " "#!if(EnableSaddr, "off", "$vaddr")#", $vdata, "#!if(EnableSaddr, "$saddr", "off")#"$offset$glc$slc$dlc"> {
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000223 let mayLoad = 0;
224 let mayStore = 1;
225 let has_vdst = 0;
226 let has_saddr = 1;
227 let enabled_saddr = EnableSaddr;
228 let has_vaddr = !if(EnableSaddr, 0, 1);
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000229 let PseudoInstr = opName#!if(EnableSaddr, "_SADDR", "");
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000230 let maybeAtomic = 1;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000231}
232
233multiclass FLAT_Scratch_Load_Pseudo<string opName, RegisterClass regClass> {
234 let is_flat_scratch = 1 in {
235 def "" : FLAT_Scratch_Load_Pseudo<opName, regClass>;
236 def _SADDR : FLAT_Scratch_Load_Pseudo<opName, regClass, 1>;
237 }
238}
239
240multiclass FLAT_Scratch_Store_Pseudo<string opName, RegisterClass regClass> {
241 let is_flat_scratch = 1 in {
242 def "" : FLAT_Scratch_Store_Pseudo<opName, regClass>;
243 def _SADDR : FLAT_Scratch_Store_Pseudo<opName, regClass, 1>;
244 }
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000245}
246
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000247class FLAT_AtomicNoRet_Pseudo<string opName, dag outs, dag ins,
248 string asm, list<dag> pattern = []> :
249 FLAT_Pseudo<opName, outs, ins, asm, pattern> {
250 let mayLoad = 1;
251 let mayStore = 1;
252 let has_glc = 0;
253 let glcValue = 0;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000254 let has_dlc = 0;
255 let dlcValue = 0;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000256 let has_vdst = 0;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000257 let maybeAtomic = 1;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000258}
259
260class FLAT_AtomicRet_Pseudo<string opName, dag outs, dag ins,
261 string asm, list<dag> pattern = []>
262 : FLAT_AtomicNoRet_Pseudo<opName, outs, ins, asm, pattern> {
263 let hasPostISelHook = 1;
264 let has_vdst = 1;
265 let glcValue = 1;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000266 let dlcValue = 0;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000267 let PseudoInstr = NAME # "_RTN";
268}
269
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000270multiclass FLAT_Atomic_Pseudo<
271 string opName,
272 RegisterClass vdst_rc,
273 ValueType vt,
274 SDPatternOperator atomic = null_frag,
275 ValueType data_vt = vt,
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000276 RegisterClass data_rc = vdst_rc,
277 bit isFP = getIsFP<data_vt>.ret> {
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000278 def "" : FLAT_AtomicNoRet_Pseudo <opName,
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000279 (outs),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000280 (ins VReg_64:$vaddr, data_rc:$vdata, offset_u12:$offset, SLC:$slc),
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000281 " $vaddr, $vdata$offset$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000282 GlobalSaddrTable<0, opName>,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000283 AtomicNoRet <opName, 0> {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000284 let PseudoInstr = NAME;
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000285 let FPAtomic = isFP;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000286 }
287
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000288 def _RTN : FLAT_AtomicRet_Pseudo <opName,
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000289 (outs vdst_rc:$vdst),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000290 (ins VReg_64:$vaddr, data_rc:$vdata, offset_u12:$offset, SLC:$slc),
Matt Arsenaultfd023142017-06-12 15:55:58 +0000291 " $vdst, $vaddr, $vdata$offset glc$slc",
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000292 [(set vt:$vdst,
Matt Arsenaultfd023142017-06-12 15:55:58 +0000293 (atomic (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$vdata))]>,
Ron Liebermancac749a2018-11-16 01:13:34 +0000294 GlobalSaddrTable<0, opName#"_rtn">,
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000295 AtomicNoRet <opName, 1>{
296 let FPAtomic = isFP;
297 }
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000298}
299
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000300multiclass FLAT_Global_Atomic_Pseudo_NO_RTN<
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000301 string opName,
302 RegisterClass vdst_rc,
303 ValueType vt,
304 SDPatternOperator atomic = null_frag,
305 ValueType data_vt = vt,
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000306 RegisterClass data_rc = vdst_rc,
307 bit isFP = getIsFP<data_vt>.ret> {
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000308
309 def "" : FLAT_AtomicNoRet_Pseudo <opName,
310 (outs),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000311 (ins VReg_64:$vaddr, data_rc:$vdata, offset_s13:$offset, SLC:$slc),
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000312 " $vaddr, $vdata, off$offset$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000313 GlobalSaddrTable<0, opName>,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000314 AtomicNoRet <opName, 0> {
315 let has_saddr = 1;
316 let PseudoInstr = NAME;
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000317 let FPAtomic = isFP;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000318 }
319
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000320 def _SADDR : FLAT_AtomicNoRet_Pseudo <opName,
321 (outs),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000322 (ins VReg_64:$vaddr, data_rc:$vdata, SReg_64:$saddr, offset_s13:$offset, SLC:$slc),
Dmitry Preobrazhensky16608e62017-11-27 17:14:35 +0000323 " $vaddr, $vdata, $saddr$offset$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000324 GlobalSaddrTable<1, opName>,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000325 AtomicNoRet <opName#"_saddr", 0> {
326 let has_saddr = 1;
327 let enabled_saddr = 1;
328 let PseudoInstr = NAME#"_SADDR";
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000329 let FPAtomic = isFP;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000330 }
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000331}
332
333multiclass FLAT_Global_Atomic_Pseudo_RTN<
334 string opName,
335 RegisterClass vdst_rc,
336 ValueType vt,
337 SDPatternOperator atomic = null_frag,
338 ValueType data_vt = vt,
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000339 RegisterClass data_rc = vdst_rc,
340 bit isFP = getIsFP<data_vt>.ret> {
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000341
342 def _RTN : FLAT_AtomicRet_Pseudo <opName,
343 (outs vdst_rc:$vdst),
344 (ins VReg_64:$vaddr, data_rc:$vdata, offset_s13:$offset, SLC:$slc),
345 " $vdst, $vaddr, $vdata, off$offset glc$slc",
346 [(set vt:$vdst,
347 (atomic (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$vdata))]>,
Ron Liebermancac749a2018-11-16 01:13:34 +0000348 GlobalSaddrTable<0, opName#"_rtn">,
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000349 AtomicNoRet <opName, 1> {
350 let has_saddr = 1;
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000351 let FPAtomic = isFP;
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000352 }
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000353
354 def _SADDR_RTN : FLAT_AtomicRet_Pseudo <opName,
355 (outs vdst_rc:$vdst),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000356 (ins VReg_64:$vaddr, data_rc:$vdata, SReg_64:$saddr, offset_s13:$offset, SLC:$slc),
Dmitry Preobrazhensky16608e62017-11-27 17:14:35 +0000357 " $vdst, $vaddr, $vdata, $saddr$offset glc$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000358 GlobalSaddrTable<1, opName#"_rtn">,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000359 AtomicNoRet <opName#"_saddr", 1> {
360 let has_saddr = 1;
361 let enabled_saddr = 1;
362 let PseudoInstr = NAME#"_SADDR_RTN";
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000363 let FPAtomic = isFP;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000364 }
365}
366
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000367multiclass FLAT_Global_Atomic_Pseudo<
368 string opName,
369 RegisterClass vdst_rc,
370 ValueType vt,
371 SDPatternOperator atomic = null_frag,
372 ValueType data_vt = vt,
373 RegisterClass data_rc = vdst_rc> :
374 FLAT_Global_Atomic_Pseudo_NO_RTN<opName, vdst_rc, vt, atomic, data_vt, data_rc>,
375 FLAT_Global_Atomic_Pseudo_RTN<opName, vdst_rc, vt, atomic, data_vt, data_rc>;
376
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000377class flat_binary_atomic_op<SDNode atomic_op> : PatFrag<
378 (ops node:$ptr, node:$value),
379 (atomic_op node:$ptr, node:$value),
Matt Arsenault0da63502018-08-31 05:49:54 +0000380 [{return cast<MemSDNode>(N)->getAddressSpace() == AMDGPUAS::FLAT_ADDRESS;}]
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000381>;
382
383def atomic_cmp_swap_flat : flat_binary_atomic_op<AMDGPUatomic_cmp_swap>;
384def atomic_swap_flat : flat_binary_atomic_op<atomic_swap>;
385def atomic_add_flat : flat_binary_atomic_op<atomic_load_add>;
386def atomic_and_flat : flat_binary_atomic_op<atomic_load_and>;
387def atomic_max_flat : flat_binary_atomic_op<atomic_load_max>;
388def atomic_min_flat : flat_binary_atomic_op<atomic_load_min>;
389def atomic_or_flat : flat_binary_atomic_op<atomic_load_or>;
390def atomic_sub_flat : flat_binary_atomic_op<atomic_load_sub>;
391def atomic_umax_flat : flat_binary_atomic_op<atomic_load_umax>;
392def atomic_umin_flat : flat_binary_atomic_op<atomic_load_umin>;
393def atomic_xor_flat : flat_binary_atomic_op<atomic_load_xor>;
394def atomic_inc_flat : flat_binary_atomic_op<SIatomic_inc>;
395def atomic_dec_flat : flat_binary_atomic_op<SIatomic_dec>;
396
397
398
399//===----------------------------------------------------------------------===//
400// Flat Instructions
401//===----------------------------------------------------------------------===//
402
403def FLAT_LOAD_UBYTE : FLAT_Load_Pseudo <"flat_load_ubyte", VGPR_32>;
404def FLAT_LOAD_SBYTE : FLAT_Load_Pseudo <"flat_load_sbyte", VGPR_32>;
405def FLAT_LOAD_USHORT : FLAT_Load_Pseudo <"flat_load_ushort", VGPR_32>;
406def FLAT_LOAD_SSHORT : FLAT_Load_Pseudo <"flat_load_sshort", VGPR_32>;
407def FLAT_LOAD_DWORD : FLAT_Load_Pseudo <"flat_load_dword", VGPR_32>;
408def FLAT_LOAD_DWORDX2 : FLAT_Load_Pseudo <"flat_load_dwordx2", VReg_64>;
409def FLAT_LOAD_DWORDX4 : FLAT_Load_Pseudo <"flat_load_dwordx4", VReg_128>;
410def FLAT_LOAD_DWORDX3 : FLAT_Load_Pseudo <"flat_load_dwordx3", VReg_96>;
411
412def FLAT_STORE_BYTE : FLAT_Store_Pseudo <"flat_store_byte", VGPR_32>;
413def FLAT_STORE_SHORT : FLAT_Store_Pseudo <"flat_store_short", VGPR_32>;
414def FLAT_STORE_DWORD : FLAT_Store_Pseudo <"flat_store_dword", VGPR_32>;
415def FLAT_STORE_DWORDX2 : FLAT_Store_Pseudo <"flat_store_dwordx2", VReg_64>;
416def FLAT_STORE_DWORDX4 : FLAT_Store_Pseudo <"flat_store_dwordx4", VReg_128>;
417def FLAT_STORE_DWORDX3 : FLAT_Store_Pseudo <"flat_store_dwordx3", VReg_96>;
418
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000419let SubtargetPredicate = HasD16LoadStore in {
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000420def FLAT_LOAD_UBYTE_D16 : FLAT_Load_Pseudo <"flat_load_ubyte_d16", VGPR_32, 1>;
421def FLAT_LOAD_UBYTE_D16_HI : FLAT_Load_Pseudo <"flat_load_ubyte_d16_hi", VGPR_32, 1>;
422def FLAT_LOAD_SBYTE_D16 : FLAT_Load_Pseudo <"flat_load_sbyte_d16", VGPR_32, 1>;
423def FLAT_LOAD_SBYTE_D16_HI : FLAT_Load_Pseudo <"flat_load_sbyte_d16_hi", VGPR_32, 1>;
424def FLAT_LOAD_SHORT_D16 : FLAT_Load_Pseudo <"flat_load_short_d16", VGPR_32, 1>;
425def FLAT_LOAD_SHORT_D16_HI : FLAT_Load_Pseudo <"flat_load_short_d16_hi", VGPR_32, 1>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000426
427def FLAT_STORE_BYTE_D16_HI : FLAT_Store_Pseudo <"flat_store_byte_d16_hi", VGPR_32>;
428def FLAT_STORE_SHORT_D16_HI : FLAT_Store_Pseudo <"flat_store_short_d16_hi", VGPR_32>;
429}
430
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000431defm FLAT_ATOMIC_CMPSWAP : FLAT_Atomic_Pseudo <"flat_atomic_cmpswap",
432 VGPR_32, i32, atomic_cmp_swap_flat,
433 v2i32, VReg_64>;
434
435defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_cmpswap_x2",
436 VReg_64, i64, atomic_cmp_swap_flat,
437 v2i64, VReg_128>;
438
439defm FLAT_ATOMIC_SWAP : FLAT_Atomic_Pseudo <"flat_atomic_swap",
440 VGPR_32, i32, atomic_swap_flat>;
441
442defm FLAT_ATOMIC_SWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_swap_x2",
443 VReg_64, i64, atomic_swap_flat>;
444
445defm FLAT_ATOMIC_ADD : FLAT_Atomic_Pseudo <"flat_atomic_add",
446 VGPR_32, i32, atomic_add_flat>;
447
448defm FLAT_ATOMIC_SUB : FLAT_Atomic_Pseudo <"flat_atomic_sub",
449 VGPR_32, i32, atomic_sub_flat>;
450
451defm FLAT_ATOMIC_SMIN : FLAT_Atomic_Pseudo <"flat_atomic_smin",
452 VGPR_32, i32, atomic_min_flat>;
453
454defm FLAT_ATOMIC_UMIN : FLAT_Atomic_Pseudo <"flat_atomic_umin",
455 VGPR_32, i32, atomic_umin_flat>;
456
457defm FLAT_ATOMIC_SMAX : FLAT_Atomic_Pseudo <"flat_atomic_smax",
458 VGPR_32, i32, atomic_max_flat>;
459
460defm FLAT_ATOMIC_UMAX : FLAT_Atomic_Pseudo <"flat_atomic_umax",
461 VGPR_32, i32, atomic_umax_flat>;
462
463defm FLAT_ATOMIC_AND : FLAT_Atomic_Pseudo <"flat_atomic_and",
464 VGPR_32, i32, atomic_and_flat>;
465
466defm FLAT_ATOMIC_OR : FLAT_Atomic_Pseudo <"flat_atomic_or",
467 VGPR_32, i32, atomic_or_flat>;
468
469defm FLAT_ATOMIC_XOR : FLAT_Atomic_Pseudo <"flat_atomic_xor",
470 VGPR_32, i32, atomic_xor_flat>;
471
472defm FLAT_ATOMIC_INC : FLAT_Atomic_Pseudo <"flat_atomic_inc",
473 VGPR_32, i32, atomic_inc_flat>;
474
475defm FLAT_ATOMIC_DEC : FLAT_Atomic_Pseudo <"flat_atomic_dec",
476 VGPR_32, i32, atomic_dec_flat>;
477
478defm FLAT_ATOMIC_ADD_X2 : FLAT_Atomic_Pseudo <"flat_atomic_add_x2",
479 VReg_64, i64, atomic_add_flat>;
480
481defm FLAT_ATOMIC_SUB_X2 : FLAT_Atomic_Pseudo <"flat_atomic_sub_x2",
482 VReg_64, i64, atomic_sub_flat>;
483
484defm FLAT_ATOMIC_SMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_smin_x2",
485 VReg_64, i64, atomic_min_flat>;
486
487defm FLAT_ATOMIC_UMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_umin_x2",
488 VReg_64, i64, atomic_umin_flat>;
489
490defm FLAT_ATOMIC_SMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_smax_x2",
491 VReg_64, i64, atomic_max_flat>;
492
493defm FLAT_ATOMIC_UMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_umax_x2",
494 VReg_64, i64, atomic_umax_flat>;
495
496defm FLAT_ATOMIC_AND_X2 : FLAT_Atomic_Pseudo <"flat_atomic_and_x2",
497 VReg_64, i64, atomic_and_flat>;
498
499defm FLAT_ATOMIC_OR_X2 : FLAT_Atomic_Pseudo <"flat_atomic_or_x2",
500 VReg_64, i64, atomic_or_flat>;
501
502defm FLAT_ATOMIC_XOR_X2 : FLAT_Atomic_Pseudo <"flat_atomic_xor_x2",
503 VReg_64, i64, atomic_xor_flat>;
504
505defm FLAT_ATOMIC_INC_X2 : FLAT_Atomic_Pseudo <"flat_atomic_inc_x2",
506 VReg_64, i64, atomic_inc_flat>;
507
508defm FLAT_ATOMIC_DEC_X2 : FLAT_Atomic_Pseudo <"flat_atomic_dec_x2",
509 VReg_64, i64, atomic_dec_flat>;
510
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000511// GFX7-, GFX10-only flat instructions.
512let SubtargetPredicate = isGFX7GFX10 in {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000513
514defm FLAT_ATOMIC_FCMPSWAP : FLAT_Atomic_Pseudo <"flat_atomic_fcmpswap",
515 VGPR_32, f32, null_frag, v2f32, VReg_64>;
516
517defm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fcmpswap_x2",
518 VReg_64, f64, null_frag, v2f64, VReg_128>;
519
520defm FLAT_ATOMIC_FMIN : FLAT_Atomic_Pseudo <"flat_atomic_fmin",
521 VGPR_32, f32>;
522
523defm FLAT_ATOMIC_FMAX : FLAT_Atomic_Pseudo <"flat_atomic_fmax",
524 VGPR_32, f32>;
525
526defm FLAT_ATOMIC_FMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fmin_x2",
527 VReg_64, f64>;
528
529defm FLAT_ATOMIC_FMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fmax_x2",
530 VReg_64, f64>;
531
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000532} // End SubtargetPredicate = isGFX7GFX10
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000533
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000534let SubtargetPredicate = HasFlatGlobalInsts in {
Matt Arsenault04004712017-07-20 05:17:54 +0000535defm GLOBAL_LOAD_UBYTE : FLAT_Global_Load_Pseudo <"global_load_ubyte", VGPR_32>;
536defm GLOBAL_LOAD_SBYTE : FLAT_Global_Load_Pseudo <"global_load_sbyte", VGPR_32>;
537defm GLOBAL_LOAD_USHORT : FLAT_Global_Load_Pseudo <"global_load_ushort", VGPR_32>;
538defm GLOBAL_LOAD_SSHORT : FLAT_Global_Load_Pseudo <"global_load_sshort", VGPR_32>;
539defm GLOBAL_LOAD_DWORD : FLAT_Global_Load_Pseudo <"global_load_dword", VGPR_32>;
540defm GLOBAL_LOAD_DWORDX2 : FLAT_Global_Load_Pseudo <"global_load_dwordx2", VReg_64>;
541defm GLOBAL_LOAD_DWORDX3 : FLAT_Global_Load_Pseudo <"global_load_dwordx3", VReg_96>;
542defm GLOBAL_LOAD_DWORDX4 : FLAT_Global_Load_Pseudo <"global_load_dwordx4", VReg_128>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000543
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000544defm GLOBAL_LOAD_UBYTE_D16 : FLAT_Global_Load_Pseudo <"global_load_ubyte_d16", VGPR_32, 1>;
545defm GLOBAL_LOAD_UBYTE_D16_HI : FLAT_Global_Load_Pseudo <"global_load_ubyte_d16_hi", VGPR_32, 1>;
546defm GLOBAL_LOAD_SBYTE_D16 : FLAT_Global_Load_Pseudo <"global_load_sbyte_d16", VGPR_32, 1>;
547defm GLOBAL_LOAD_SBYTE_D16_HI : FLAT_Global_Load_Pseudo <"global_load_sbyte_d16_hi", VGPR_32, 1>;
548defm GLOBAL_LOAD_SHORT_D16 : FLAT_Global_Load_Pseudo <"global_load_short_d16", VGPR_32, 1>;
549defm GLOBAL_LOAD_SHORT_D16_HI : FLAT_Global_Load_Pseudo <"global_load_short_d16_hi", VGPR_32, 1>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000550
Matt Arsenault04004712017-07-20 05:17:54 +0000551defm GLOBAL_STORE_BYTE : FLAT_Global_Store_Pseudo <"global_store_byte", VGPR_32>;
552defm GLOBAL_STORE_SHORT : FLAT_Global_Store_Pseudo <"global_store_short", VGPR_32>;
553defm GLOBAL_STORE_DWORD : FLAT_Global_Store_Pseudo <"global_store_dword", VGPR_32>;
554defm GLOBAL_STORE_DWORDX2 : FLAT_Global_Store_Pseudo <"global_store_dwordx2", VReg_64>;
555defm GLOBAL_STORE_DWORDX3 : FLAT_Global_Store_Pseudo <"global_store_dwordx3", VReg_96>;
556defm GLOBAL_STORE_DWORDX4 : FLAT_Global_Store_Pseudo <"global_store_dwordx4", VReg_128>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000557
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000558defm GLOBAL_STORE_BYTE_D16_HI : FLAT_Global_Store_Pseudo <"global_store_byte_d16_hi", VGPR_32>;
559defm GLOBAL_STORE_SHORT_D16_HI : FLAT_Global_Store_Pseudo <"global_store_short_d16_hi", VGPR_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000560
561let is_flat_global = 1 in {
562defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Global_Atomic_Pseudo <"global_atomic_cmpswap",
563 VGPR_32, i32, AMDGPUatomic_cmp_swap_global,
564 v2i32, VReg_64>;
565
566defm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_cmpswap_x2",
567 VReg_64, i64, AMDGPUatomic_cmp_swap_global,
568 v2i64, VReg_128>;
569
570defm GLOBAL_ATOMIC_SWAP : FLAT_Global_Atomic_Pseudo <"global_atomic_swap",
571 VGPR_32, i32, atomic_swap_global>;
572
573defm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_swap_x2",
574 VReg_64, i64, atomic_swap_global>;
575
576defm GLOBAL_ATOMIC_ADD : FLAT_Global_Atomic_Pseudo <"global_atomic_add",
577 VGPR_32, i32, atomic_add_global>;
578
579defm GLOBAL_ATOMIC_SUB : FLAT_Global_Atomic_Pseudo <"global_atomic_sub",
580 VGPR_32, i32, atomic_sub_global>;
581
582defm GLOBAL_ATOMIC_SMIN : FLAT_Global_Atomic_Pseudo <"global_atomic_smin",
583 VGPR_32, i32, atomic_min_global>;
584
585defm GLOBAL_ATOMIC_UMIN : FLAT_Global_Atomic_Pseudo <"global_atomic_umin",
586 VGPR_32, i32, atomic_umin_global>;
587
588defm GLOBAL_ATOMIC_SMAX : FLAT_Global_Atomic_Pseudo <"global_atomic_smax",
589 VGPR_32, i32, atomic_max_global>;
590
591defm GLOBAL_ATOMIC_UMAX : FLAT_Global_Atomic_Pseudo <"global_atomic_umax",
592 VGPR_32, i32, atomic_umax_global>;
593
594defm GLOBAL_ATOMIC_AND : FLAT_Global_Atomic_Pseudo <"global_atomic_and",
595 VGPR_32, i32, atomic_and_global>;
596
597defm GLOBAL_ATOMIC_OR : FLAT_Global_Atomic_Pseudo <"global_atomic_or",
598 VGPR_32, i32, atomic_or_global>;
599
600defm GLOBAL_ATOMIC_XOR : FLAT_Global_Atomic_Pseudo <"global_atomic_xor",
601 VGPR_32, i32, atomic_xor_global>;
602
603defm GLOBAL_ATOMIC_INC : FLAT_Global_Atomic_Pseudo <"global_atomic_inc",
604 VGPR_32, i32, atomic_inc_global>;
605
606defm GLOBAL_ATOMIC_DEC : FLAT_Global_Atomic_Pseudo <"global_atomic_dec",
607 VGPR_32, i32, atomic_dec_global>;
608
609defm GLOBAL_ATOMIC_ADD_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_add_x2",
610 VReg_64, i64, atomic_add_global>;
611
612defm GLOBAL_ATOMIC_SUB_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_sub_x2",
613 VReg_64, i64, atomic_sub_global>;
614
615defm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_smin_x2",
616 VReg_64, i64, atomic_min_global>;
617
618defm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_umin_x2",
619 VReg_64, i64, atomic_umin_global>;
620
621defm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_smax_x2",
622 VReg_64, i64, atomic_max_global>;
623
624defm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_umax_x2",
625 VReg_64, i64, atomic_umax_global>;
626
627defm GLOBAL_ATOMIC_AND_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_and_x2",
628 VReg_64, i64, atomic_and_global>;
629
630defm GLOBAL_ATOMIC_OR_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_or_x2",
631 VReg_64, i64, atomic_or_global>;
632
633defm GLOBAL_ATOMIC_XOR_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_xor_x2",
634 VReg_64, i64, atomic_xor_global>;
635
636defm GLOBAL_ATOMIC_INC_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_inc_x2",
637 VReg_64, i64, atomic_inc_global>;
638
639defm GLOBAL_ATOMIC_DEC_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_dec_x2",
640 VReg_64, i64, atomic_dec_global>;
641} // End is_flat_global = 1
642
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000643} // End SubtargetPredicate = HasFlatGlobalInsts
644
645
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000646let SubtargetPredicate = HasFlatScratchInsts in {
647defm SCRATCH_LOAD_UBYTE : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte", VGPR_32>;
648defm SCRATCH_LOAD_SBYTE : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte", VGPR_32>;
649defm SCRATCH_LOAD_USHORT : FLAT_Scratch_Load_Pseudo <"scratch_load_ushort", VGPR_32>;
650defm SCRATCH_LOAD_SSHORT : FLAT_Scratch_Load_Pseudo <"scratch_load_sshort", VGPR_32>;
651defm SCRATCH_LOAD_DWORD : FLAT_Scratch_Load_Pseudo <"scratch_load_dword", VGPR_32>;
652defm SCRATCH_LOAD_DWORDX2 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx2", VReg_64>;
653defm SCRATCH_LOAD_DWORDX3 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx3", VReg_96>;
654defm SCRATCH_LOAD_DWORDX4 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx4", VReg_128>;
655
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000656defm SCRATCH_LOAD_UBYTE_D16 : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte_d16", VGPR_32>;
657defm SCRATCH_LOAD_UBYTE_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte_d16_hi", VGPR_32>;
658defm SCRATCH_LOAD_SBYTE_D16 : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte_d16", VGPR_32>;
659defm SCRATCH_LOAD_SBYTE_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte_d16_hi", VGPR_32>;
660defm SCRATCH_LOAD_SHORT_D16 : FLAT_Scratch_Load_Pseudo <"scratch_load_short_d16", VGPR_32>;
661defm SCRATCH_LOAD_SHORT_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_short_d16_hi", VGPR_32>;
662
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000663defm SCRATCH_STORE_BYTE : FLAT_Scratch_Store_Pseudo <"scratch_store_byte", VGPR_32>;
664defm SCRATCH_STORE_SHORT : FLAT_Scratch_Store_Pseudo <"scratch_store_short", VGPR_32>;
665defm SCRATCH_STORE_DWORD : FLAT_Scratch_Store_Pseudo <"scratch_store_dword", VGPR_32>;
666defm SCRATCH_STORE_DWORDX2 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx2", VReg_64>;
667defm SCRATCH_STORE_DWORDX3 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx3", VReg_96>;
668defm SCRATCH_STORE_DWORDX4 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx4", VReg_128>;
669
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000670defm SCRATCH_STORE_BYTE_D16_HI : FLAT_Scratch_Store_Pseudo <"scratch_store_byte_d16_hi", VGPR_32>;
671defm SCRATCH_STORE_SHORT_D16_HI : FLAT_Scratch_Store_Pseudo <"scratch_store_short_d16_hi", VGPR_32>;
672
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000673} // End SubtargetPredicate = HasFlatScratchInsts
674
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000675let SubtargetPredicate = isGFX10Plus, is_flat_global = 1 in {
676 defm GLOBAL_ATOMIC_FCMPSWAP :
677 FLAT_Global_Atomic_Pseudo<"global_atomic_fcmpswap", VGPR_32, f32>;
678 defm GLOBAL_ATOMIC_FMIN :
679 FLAT_Global_Atomic_Pseudo<"global_atomic_fmin", VGPR_32, f32>;
680 defm GLOBAL_ATOMIC_FMAX :
681 FLAT_Global_Atomic_Pseudo<"global_atomic_fmax", VGPR_32, f32>;
682 defm GLOBAL_ATOMIC_FCMPSWAP_X2 :
683 FLAT_Global_Atomic_Pseudo<"global_atomic_fcmpswap_x2", VReg_64, f64>;
684 defm GLOBAL_ATOMIC_FMIN_X2 :
685 FLAT_Global_Atomic_Pseudo<"global_atomic_fmin_x2", VReg_64, f64>;
686 defm GLOBAL_ATOMIC_FMAX_X2 :
687 FLAT_Global_Atomic_Pseudo<"global_atomic_fmax_x2", VReg_64, f64>;
688} // End SubtargetPredicate = isGFX10Plus, is_flat_global = 1
689
690
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000691//===----------------------------------------------------------------------===//
692// Flat Patterns
693//===----------------------------------------------------------------------===//
694
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000695// Patterns for global loads with no offset.
Matt Arsenault90c75932017-10-03 00:06:41 +0000696class FlatLoadPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000697 (vt (node (FLATOffset i64:$vaddr, i16:$offset, i1:$slc))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000698 (inst $vaddr, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000699>;
700
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000701class FlatLoadPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
702 (node (FLATOffset i64:$vaddr, i16:$offset, i1:$slc), vt:$in),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000703 (inst $vaddr, $offset, 0, 0, $slc, $in)
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000704>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000705
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000706class FlatSignedLoadPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
707 (node (FLATOffsetSigned i64:$vaddr, i16:$offset, i1:$slc), vt:$in),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000708 (inst $vaddr, $offset, 0, 0, $slc, $in)
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000709>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000710
Matt Arsenault90c75932017-10-03 00:06:41 +0000711class FlatLoadAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000712 (vt (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000713 (inst $vaddr, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000714>;
715
Matt Arsenault90c75932017-10-03 00:06:41 +0000716class FlatLoadSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000717 (vt (node (FLATOffsetSigned i64:$vaddr, i16:$offset, i1:$slc))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000718 (inst $vaddr, $offset, 0, 0, $slc)
Matt Arsenault4e309b02017-07-29 01:03:53 +0000719>;
720
Matt Arsenault90c75932017-10-03 00:06:41 +0000721class FlatStorePat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000722 (node vt:$data, (FLATOffset i64:$vaddr, i16:$offset, i1:$slc)),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000723 (inst $vaddr, $data, $offset, 0, 0, $slc)
Matt Arsenault4e309b02017-07-29 01:03:53 +0000724>;
725
Matt Arsenault90c75932017-10-03 00:06:41 +0000726class FlatStoreSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000727 (node vt:$data, (FLATOffsetSigned i64:$vaddr, i16:$offset, i1:$slc)),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000728 (inst $vaddr, $data, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000729>;
730
Matt Arsenault90c75932017-10-03 00:06:41 +0000731class FlatStoreAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000732 // atomic store follows atomic binop convention so the address comes
733 // first.
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000734 (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), vt:$data),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000735 (inst $vaddr, $data, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000736>;
737
Matt Arsenault90c75932017-10-03 00:06:41 +0000738class FlatStoreSignedAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000739 // atomic store follows atomic binop convention so the address comes
740 // first.
741 (node (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), vt:$data),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000742 (inst $vaddr, $data, $offset, 0, 0, $slc)
Matt Arsenault4e309b02017-07-29 01:03:53 +0000743>;
744
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000745class FlatAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt,
Matt Arsenault90c75932017-10-03 00:06:41 +0000746 ValueType data_vt = vt> : GCNPat <
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000747 (vt (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$data)),
748 (inst $vaddr, $data, $offset, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000749>;
750
Matt Arsenault4e309b02017-07-29 01:03:53 +0000751class FlatSignedAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt,
Matt Arsenault90c75932017-10-03 00:06:41 +0000752 ValueType data_vt = vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000753 (vt (node (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$data)),
754 (inst $vaddr, $data, $offset, $slc)
755>;
756
Matt Arsenault90c75932017-10-03 00:06:41 +0000757let OtherPredicates = [HasFlatAddressSpace] in {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000758
Matt Arsenaultbc683832017-09-20 03:43:35 +0000759def : FlatLoadPat <FLAT_LOAD_UBYTE, az_extloadi8_flat, i32>;
760def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i32>;
761def : FlatLoadPat <FLAT_LOAD_UBYTE, az_extloadi8_flat, i16>;
762def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i16>;
763def : FlatLoadPat <FLAT_LOAD_USHORT, az_extloadi16_flat, i32>;
764def : FlatLoadPat <FLAT_LOAD_USHORT, load_flat, i16>;
765def : FlatLoadPat <FLAT_LOAD_SSHORT, sextloadi16_flat, i32>;
766def : FlatLoadPat <FLAT_LOAD_DWORD, load_flat, i32>;
767def : FlatLoadPat <FLAT_LOAD_DWORDX2, load_flat, v2i32>;
Tim Renouf361b5b22019-03-21 12:01:21 +0000768def : FlatLoadPat <FLAT_LOAD_DWORDX3, load_flat, v3i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000769def : FlatLoadPat <FLAT_LOAD_DWORDX4, load_flat, v4i32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000770
Matt Arsenaultbc683832017-09-20 03:43:35 +0000771def : FlatLoadAtomicPat <FLAT_LOAD_DWORD, atomic_load_flat, i32>;
772def : FlatLoadAtomicPat <FLAT_LOAD_DWORDX2, atomic_load_flat, i64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000773
Matt Arsenaultbc683832017-09-20 03:43:35 +0000774def : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i32>;
775def : FlatStorePat <FLAT_STORE_SHORT, truncstorei16_flat, i32>;
776def : FlatStorePat <FLAT_STORE_DWORD, store_flat, i32>;
777def : FlatStorePat <FLAT_STORE_DWORDX2, store_flat, v2i32>;
Tim Renouf361b5b22019-03-21 12:01:21 +0000778def : FlatStorePat <FLAT_STORE_DWORDX3, store_flat, v3i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000779def : FlatStorePat <FLAT_STORE_DWORDX4, store_flat, v4i32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000780
Matt Arsenaultbc683832017-09-20 03:43:35 +0000781def : FlatStoreAtomicPat <FLAT_STORE_DWORD, atomic_store_flat, i32>;
782def : FlatStoreAtomicPat <FLAT_STORE_DWORDX2, atomic_store_flat, i64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000783
784def : FlatAtomicPat <FLAT_ATOMIC_ADD_RTN, atomic_add_global, i32>;
785def : FlatAtomicPat <FLAT_ATOMIC_SUB_RTN, atomic_sub_global, i32>;
786def : FlatAtomicPat <FLAT_ATOMIC_INC_RTN, atomic_inc_global, i32>;
787def : FlatAtomicPat <FLAT_ATOMIC_DEC_RTN, atomic_dec_global, i32>;
788def : FlatAtomicPat <FLAT_ATOMIC_AND_RTN, atomic_and_global, i32>;
789def : FlatAtomicPat <FLAT_ATOMIC_SMAX_RTN, atomic_max_global, i32>;
790def : FlatAtomicPat <FLAT_ATOMIC_UMAX_RTN, atomic_umax_global, i32>;
791def : FlatAtomicPat <FLAT_ATOMIC_SMIN_RTN, atomic_min_global, i32>;
792def : FlatAtomicPat <FLAT_ATOMIC_UMIN_RTN, atomic_umin_global, i32>;
793def : FlatAtomicPat <FLAT_ATOMIC_OR_RTN, atomic_or_global, i32>;
794def : FlatAtomicPat <FLAT_ATOMIC_SWAP_RTN, atomic_swap_global, i32>;
Jan Vesely206a5102016-12-23 15:34:51 +0000795def : FlatAtomicPat <FLAT_ATOMIC_CMPSWAP_RTN, AMDGPUatomic_cmp_swap_global, i32, v2i32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000796def : FlatAtomicPat <FLAT_ATOMIC_XOR_RTN, atomic_xor_global, i32>;
797
798def : FlatAtomicPat <FLAT_ATOMIC_ADD_X2_RTN, atomic_add_global, i64>;
799def : FlatAtomicPat <FLAT_ATOMIC_SUB_X2_RTN, atomic_sub_global, i64>;
800def : FlatAtomicPat <FLAT_ATOMIC_INC_X2_RTN, atomic_inc_global, i64>;
801def : FlatAtomicPat <FLAT_ATOMIC_DEC_X2_RTN, atomic_dec_global, i64>;
802def : FlatAtomicPat <FLAT_ATOMIC_AND_X2_RTN, atomic_and_global, i64>;
803def : FlatAtomicPat <FLAT_ATOMIC_SMAX_X2_RTN, atomic_max_global, i64>;
804def : FlatAtomicPat <FLAT_ATOMIC_UMAX_X2_RTN, atomic_umax_global, i64>;
805def : FlatAtomicPat <FLAT_ATOMIC_SMIN_X2_RTN, atomic_min_global, i64>;
806def : FlatAtomicPat <FLAT_ATOMIC_UMIN_X2_RTN, atomic_umin_global, i64>;
807def : FlatAtomicPat <FLAT_ATOMIC_OR_X2_RTN, atomic_or_global, i64>;
808def : FlatAtomicPat <FLAT_ATOMIC_SWAP_X2_RTN, atomic_swap_global, i64>;
Jan Vesely206a5102016-12-23 15:34:51 +0000809def : FlatAtomicPat <FLAT_ATOMIC_CMPSWAP_X2_RTN, AMDGPUatomic_cmp_swap_global, i64, v2i64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000810def : FlatAtomicPat <FLAT_ATOMIC_XOR_X2_RTN, atomic_xor_global, i64>;
811
Matt Arsenaultbc683832017-09-20 03:43:35 +0000812def : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i16>;
813def : FlatStorePat <FLAT_STORE_SHORT, store_flat, i16>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000814
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +0000815let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultbc683832017-09-20 03:43:35 +0000816def : FlatStorePat <FLAT_STORE_SHORT_D16_HI, truncstorei16_hi16_flat, i32>;
817def : FlatStorePat <FLAT_STORE_BYTE_D16_HI, truncstorei8_hi16_flat, i32>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000818
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000819def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_flat, v2i16>;
820def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_flat, v2f16>;
821def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_flat, v2i16>;
822def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_flat, v2f16>;
823def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16_HI, load_d16_hi_flat, v2i16>;
824def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16_HI, load_d16_hi_flat, v2f16>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000825
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000826def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16, az_extloadi8_d16_lo_flat, v2i16>;
827def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16, az_extloadi8_d16_lo_flat, v2f16>;
828def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16, sextloadi8_d16_lo_flat, v2i16>;
829def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16, sextloadi8_d16_lo_flat, v2f16>;
830def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16, load_d16_lo_flat, v2i16>;
831def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16, load_d16_lo_flat, v2f16>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000832}
833
Matt Arsenault90c75932017-10-03 00:06:41 +0000834} // End OtherPredicates = [HasFlatAddressSpace]
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000835
Matt Arsenault90c75932017-10-03 00:06:41 +0000836let OtherPredicates = [HasFlatGlobalInsts], AddedComplexity = 10 in {
Matt Arsenault4e309b02017-07-29 01:03:53 +0000837
838def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, az_extloadi8_global, i32>;
839def : FlatLoadSignedPat <GLOBAL_LOAD_SBYTE, sextloadi8_global, i32>;
840def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, az_extloadi8_global, i16>;
841def : FlatLoadSignedPat <GLOBAL_LOAD_SBYTE, sextloadi8_global, i16>;
842def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, az_extloadi16_global, i32>;
843def : FlatLoadSignedPat <GLOBAL_LOAD_SSHORT, sextloadi16_global, i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000844def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, load_global, i16>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000845
Matt Arsenaultbc683832017-09-20 03:43:35 +0000846def : FlatLoadSignedPat <GLOBAL_LOAD_DWORD, load_global, i32>;
847def : FlatLoadSignedPat <GLOBAL_LOAD_DWORDX2, load_global, v2i32>;
Tim Renouf361b5b22019-03-21 12:01:21 +0000848def : FlatLoadSignedPat <GLOBAL_LOAD_DWORDX3, load_global, v3i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000849def : FlatLoadSignedPat <GLOBAL_LOAD_DWORDX4, load_global, v4i32>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000850
Matt Arsenaultbc683832017-09-20 03:43:35 +0000851def : FlatLoadAtomicPat <GLOBAL_LOAD_DWORD, atomic_load_global, i32>;
852def : FlatLoadAtomicPat <GLOBAL_LOAD_DWORDX2, atomic_load_global, i64>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000853
854def : FlatStoreSignedPat <GLOBAL_STORE_BYTE, truncstorei8_global, i32>;
855def : FlatStoreSignedPat <GLOBAL_STORE_BYTE, truncstorei8_global, i16>;
856def : FlatStoreSignedPat <GLOBAL_STORE_SHORT, truncstorei16_global, i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000857def : FlatStoreSignedPat <GLOBAL_STORE_SHORT, store_global, i16>;
858def : FlatStoreSignedPat <GLOBAL_STORE_DWORD, store_global, i32>;
859def : FlatStoreSignedPat <GLOBAL_STORE_DWORDX2, store_global, v2i32>;
Tim Renouf361b5b22019-03-21 12:01:21 +0000860def : FlatStoreSignedPat <GLOBAL_STORE_DWORDX3, store_global, v3i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000861def : FlatStoreSignedPat <GLOBAL_STORE_DWORDX4, store_global, v4i32>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000862
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +0000863let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultbc683832017-09-20 03:43:35 +0000864def : FlatStoreSignedPat <GLOBAL_STORE_SHORT_D16_HI, truncstorei16_hi16_global, i32>;
865def : FlatStoreSignedPat <GLOBAL_STORE_BYTE_D16_HI, truncstorei8_hi16_global, i32>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000866
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000867def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_global, v2i16>;
868def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_global, v2f16>;
869def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_global, v2i16>;
870def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_global, v2f16>;
871def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16_HI, load_d16_hi_global, v2i16>;
872def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16_HI, load_d16_hi_global, v2f16>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000873
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000874def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16, az_extloadi8_d16_lo_global, v2i16>;
875def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16, az_extloadi8_d16_lo_global, v2f16>;
876def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16, sextloadi8_d16_lo_global, v2i16>;
877def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16, sextloadi8_d16_lo_global, v2f16>;
878def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16, load_d16_lo_global, v2i16>;
879def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16, load_d16_lo_global, v2f16>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000880}
881
Matt Arsenaultbc683832017-09-20 03:43:35 +0000882def : FlatStoreSignedAtomicPat <GLOBAL_STORE_DWORD, store_atomic_global, i32>;
883def : FlatStoreSignedAtomicPat <GLOBAL_STORE_DWORDX2, store_atomic_global, i64>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000884
885def : FlatSignedAtomicPat <GLOBAL_ATOMIC_ADD_RTN, atomic_add_global, i32>;
886def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SUB_RTN, atomic_sub_global, i32>;
887def : FlatSignedAtomicPat <GLOBAL_ATOMIC_INC_RTN, atomic_inc_global, i32>;
888def : FlatSignedAtomicPat <GLOBAL_ATOMIC_DEC_RTN, atomic_dec_global, i32>;
889def : FlatSignedAtomicPat <GLOBAL_ATOMIC_AND_RTN, atomic_and_global, i32>;
890def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMAX_RTN, atomic_max_global, i32>;
891def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMAX_RTN, atomic_umax_global, i32>;
892def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMIN_RTN, atomic_min_global, i32>;
893def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMIN_RTN, atomic_umin_global, i32>;
894def : FlatSignedAtomicPat <GLOBAL_ATOMIC_OR_RTN, atomic_or_global, i32>;
895def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SWAP_RTN, atomic_swap_global, i32>;
896def : FlatSignedAtomicPat <GLOBAL_ATOMIC_CMPSWAP_RTN, AMDGPUatomic_cmp_swap_global, i32, v2i32>;
897def : FlatSignedAtomicPat <GLOBAL_ATOMIC_XOR_RTN, atomic_xor_global, i32>;
898
899def : FlatSignedAtomicPat <GLOBAL_ATOMIC_ADD_X2_RTN, atomic_add_global, i64>;
900def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SUB_X2_RTN, atomic_sub_global, i64>;
901def : FlatSignedAtomicPat <GLOBAL_ATOMIC_INC_X2_RTN, atomic_inc_global, i64>;
902def : FlatSignedAtomicPat <GLOBAL_ATOMIC_DEC_X2_RTN, atomic_dec_global, i64>;
903def : FlatSignedAtomicPat <GLOBAL_ATOMIC_AND_X2_RTN, atomic_and_global, i64>;
904def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMAX_X2_RTN, atomic_max_global, i64>;
905def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMAX_X2_RTN, atomic_umax_global, i64>;
906def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMIN_X2_RTN, atomic_min_global, i64>;
907def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMIN_X2_RTN, atomic_umin_global, i64>;
908def : FlatSignedAtomicPat <GLOBAL_ATOMIC_OR_X2_RTN, atomic_or_global, i64>;
909def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SWAP_X2_RTN, atomic_swap_global, i64>;
910def : FlatSignedAtomicPat <GLOBAL_ATOMIC_CMPSWAP_X2_RTN, AMDGPUatomic_cmp_swap_global, i64, v2i64>;
911def : FlatSignedAtomicPat <GLOBAL_ATOMIC_XOR_X2_RTN, atomic_xor_global, i64>;
912
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000913} // End OtherPredicates = [HasFlatGlobalInsts], AddedComplexity = 10
Matt Arsenault4e309b02017-07-29 01:03:53 +0000914
915
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000916//===----------------------------------------------------------------------===//
917// Target
918//===----------------------------------------------------------------------===//
919
920//===----------------------------------------------------------------------===//
921// CI
922//===----------------------------------------------------------------------===//
923
924class FLAT_Real_ci <bits<7> op, FLAT_Pseudo ps> :
925 FLAT_Real <op, ps>,
926 SIMCInstr <ps.PseudoInstr, SIEncodingFamily.SI> {
Stanislav Mekhanoshin51823022019-04-06 09:20:48 +0000927 let AssemblerPredicate = isGFX7Only;
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +0000928 let DecoderNamespace="GFX7";
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000929}
930
931def FLAT_LOAD_UBYTE_ci : FLAT_Real_ci <0x8, FLAT_LOAD_UBYTE>;
932def FLAT_LOAD_SBYTE_ci : FLAT_Real_ci <0x9, FLAT_LOAD_SBYTE>;
933def FLAT_LOAD_USHORT_ci : FLAT_Real_ci <0xa, FLAT_LOAD_USHORT>;
934def FLAT_LOAD_SSHORT_ci : FLAT_Real_ci <0xb, FLAT_LOAD_SSHORT>;
935def FLAT_LOAD_DWORD_ci : FLAT_Real_ci <0xc, FLAT_LOAD_DWORD>;
936def FLAT_LOAD_DWORDX2_ci : FLAT_Real_ci <0xd, FLAT_LOAD_DWORDX2>;
937def FLAT_LOAD_DWORDX4_ci : FLAT_Real_ci <0xe, FLAT_LOAD_DWORDX4>;
938def FLAT_LOAD_DWORDX3_ci : FLAT_Real_ci <0xf, FLAT_LOAD_DWORDX3>;
939
940def FLAT_STORE_BYTE_ci : FLAT_Real_ci <0x18, FLAT_STORE_BYTE>;
941def FLAT_STORE_SHORT_ci : FLAT_Real_ci <0x1a, FLAT_STORE_SHORT>;
942def FLAT_STORE_DWORD_ci : FLAT_Real_ci <0x1c, FLAT_STORE_DWORD>;
943def FLAT_STORE_DWORDX2_ci : FLAT_Real_ci <0x1d, FLAT_STORE_DWORDX2>;
944def FLAT_STORE_DWORDX4_ci : FLAT_Real_ci <0x1e, FLAT_STORE_DWORDX4>;
945def FLAT_STORE_DWORDX3_ci : FLAT_Real_ci <0x1f, FLAT_STORE_DWORDX3>;
946
947multiclass FLAT_Real_Atomics_ci <bits<7> op, FLAT_Pseudo ps> {
948 def _ci : FLAT_Real_ci<op, !cast<FLAT_Pseudo>(ps.PseudoInstr)>;
949 def _RTN_ci : FLAT_Real_ci<op, !cast<FLAT_Pseudo>(ps.PseudoInstr # "_RTN")>;
950}
951
952defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_ci <0x30, FLAT_ATOMIC_SWAP>;
953defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_ci <0x31, FLAT_ATOMIC_CMPSWAP>;
954defm FLAT_ATOMIC_ADD : FLAT_Real_Atomics_ci <0x32, FLAT_ATOMIC_ADD>;
955defm FLAT_ATOMIC_SUB : FLAT_Real_Atomics_ci <0x33, FLAT_ATOMIC_SUB>;
956defm FLAT_ATOMIC_SMIN : FLAT_Real_Atomics_ci <0x35, FLAT_ATOMIC_SMIN>;
957defm FLAT_ATOMIC_UMIN : FLAT_Real_Atomics_ci <0x36, FLAT_ATOMIC_UMIN>;
958defm FLAT_ATOMIC_SMAX : FLAT_Real_Atomics_ci <0x37, FLAT_ATOMIC_SMAX>;
959defm FLAT_ATOMIC_UMAX : FLAT_Real_Atomics_ci <0x38, FLAT_ATOMIC_UMAX>;
960defm FLAT_ATOMIC_AND : FLAT_Real_Atomics_ci <0x39, FLAT_ATOMIC_AND>;
961defm FLAT_ATOMIC_OR : FLAT_Real_Atomics_ci <0x3a, FLAT_ATOMIC_OR>;
962defm FLAT_ATOMIC_XOR : FLAT_Real_Atomics_ci <0x3b, FLAT_ATOMIC_XOR>;
963defm FLAT_ATOMIC_INC : FLAT_Real_Atomics_ci <0x3c, FLAT_ATOMIC_INC>;
964defm FLAT_ATOMIC_DEC : FLAT_Real_Atomics_ci <0x3d, FLAT_ATOMIC_DEC>;
965defm FLAT_ATOMIC_SWAP_X2 : FLAT_Real_Atomics_ci <0x50, FLAT_ATOMIC_SWAP_X2>;
966defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_ci <0x51, FLAT_ATOMIC_CMPSWAP_X2>;
967defm FLAT_ATOMIC_ADD_X2 : FLAT_Real_Atomics_ci <0x52, FLAT_ATOMIC_ADD_X2>;
968defm FLAT_ATOMIC_SUB_X2 : FLAT_Real_Atomics_ci <0x53, FLAT_ATOMIC_SUB_X2>;
969defm FLAT_ATOMIC_SMIN_X2 : FLAT_Real_Atomics_ci <0x55, FLAT_ATOMIC_SMIN_X2>;
970defm FLAT_ATOMIC_UMIN_X2 : FLAT_Real_Atomics_ci <0x56, FLAT_ATOMIC_UMIN_X2>;
971defm FLAT_ATOMIC_SMAX_X2 : FLAT_Real_Atomics_ci <0x57, FLAT_ATOMIC_SMAX_X2>;
972defm FLAT_ATOMIC_UMAX_X2 : FLAT_Real_Atomics_ci <0x58, FLAT_ATOMIC_UMAX_X2>;
973defm FLAT_ATOMIC_AND_X2 : FLAT_Real_Atomics_ci <0x59, FLAT_ATOMIC_AND_X2>;
974defm FLAT_ATOMIC_OR_X2 : FLAT_Real_Atomics_ci <0x5a, FLAT_ATOMIC_OR_X2>;
975defm FLAT_ATOMIC_XOR_X2 : FLAT_Real_Atomics_ci <0x5b, FLAT_ATOMIC_XOR_X2>;
976defm FLAT_ATOMIC_INC_X2 : FLAT_Real_Atomics_ci <0x5c, FLAT_ATOMIC_INC_X2>;
977defm FLAT_ATOMIC_DEC_X2 : FLAT_Real_Atomics_ci <0x5d, FLAT_ATOMIC_DEC_X2>;
978
979// CI Only flat instructions
980defm FLAT_ATOMIC_FCMPSWAP : FLAT_Real_Atomics_ci <0x3e, FLAT_ATOMIC_FCMPSWAP>;
981defm FLAT_ATOMIC_FMIN : FLAT_Real_Atomics_ci <0x3f, FLAT_ATOMIC_FMIN>;
982defm FLAT_ATOMIC_FMAX : FLAT_Real_Atomics_ci <0x40, FLAT_ATOMIC_FMAX>;
983defm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Real_Atomics_ci <0x5e, FLAT_ATOMIC_FCMPSWAP_X2>;
984defm FLAT_ATOMIC_FMIN_X2 : FLAT_Real_Atomics_ci <0x5f, FLAT_ATOMIC_FMIN_X2>;
985defm FLAT_ATOMIC_FMAX_X2 : FLAT_Real_Atomics_ci <0x60, FLAT_ATOMIC_FMAX_X2>;
986
987
988//===----------------------------------------------------------------------===//
989// VI
990//===----------------------------------------------------------------------===//
991
992class FLAT_Real_vi <bits<7> op, FLAT_Pseudo ps> :
993 FLAT_Real <op, ps>,
994 SIMCInstr <ps.PseudoInstr, SIEncodingFamily.VI> {
Stanislav Mekhanoshin51823022019-04-06 09:20:48 +0000995 let AssemblerPredicate = isGFX8GFX9;
996 let DecoderNamespace = "GFX8";
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000997}
998
Matt Arsenault04004712017-07-20 05:17:54 +0000999multiclass FLAT_Real_AllAddr_vi<bits<7> op> {
1000 def _vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME)>;
1001 def _SADDR_vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME#"_SADDR")>;
1002}
1003
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001004def FLAT_LOAD_UBYTE_vi : FLAT_Real_vi <0x10, FLAT_LOAD_UBYTE>;
1005def FLAT_LOAD_SBYTE_vi : FLAT_Real_vi <0x11, FLAT_LOAD_SBYTE>;
1006def FLAT_LOAD_USHORT_vi : FLAT_Real_vi <0x12, FLAT_LOAD_USHORT>;
1007def FLAT_LOAD_SSHORT_vi : FLAT_Real_vi <0x13, FLAT_LOAD_SSHORT>;
1008def FLAT_LOAD_DWORD_vi : FLAT_Real_vi <0x14, FLAT_LOAD_DWORD>;
1009def FLAT_LOAD_DWORDX2_vi : FLAT_Real_vi <0x15, FLAT_LOAD_DWORDX2>;
1010def FLAT_LOAD_DWORDX4_vi : FLAT_Real_vi <0x17, FLAT_LOAD_DWORDX4>;
1011def FLAT_LOAD_DWORDX3_vi : FLAT_Real_vi <0x16, FLAT_LOAD_DWORDX3>;
1012
1013def FLAT_STORE_BYTE_vi : FLAT_Real_vi <0x18, FLAT_STORE_BYTE>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001014def FLAT_STORE_BYTE_D16_HI_vi : FLAT_Real_vi <0x19, FLAT_STORE_BYTE_D16_HI>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001015def FLAT_STORE_SHORT_vi : FLAT_Real_vi <0x1a, FLAT_STORE_SHORT>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001016def FLAT_STORE_SHORT_D16_HI_vi : FLAT_Real_vi <0x1b, FLAT_STORE_SHORT_D16_HI>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001017def FLAT_STORE_DWORD_vi : FLAT_Real_vi <0x1c, FLAT_STORE_DWORD>;
1018def FLAT_STORE_DWORDX2_vi : FLAT_Real_vi <0x1d, FLAT_STORE_DWORDX2>;
1019def FLAT_STORE_DWORDX4_vi : FLAT_Real_vi <0x1f, FLAT_STORE_DWORDX4>;
1020def FLAT_STORE_DWORDX3_vi : FLAT_Real_vi <0x1e, FLAT_STORE_DWORDX3>;
1021
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001022def FLAT_LOAD_UBYTE_D16_vi : FLAT_Real_vi <0x20, FLAT_LOAD_UBYTE_D16>;
1023def FLAT_LOAD_UBYTE_D16_HI_vi : FLAT_Real_vi <0x21, FLAT_LOAD_UBYTE_D16_HI>;
1024def FLAT_LOAD_SBYTE_D16_vi : FLAT_Real_vi <0x22, FLAT_LOAD_SBYTE_D16>;
1025def FLAT_LOAD_SBYTE_D16_HI_vi : FLAT_Real_vi <0x23, FLAT_LOAD_SBYTE_D16_HI>;
1026def FLAT_LOAD_SHORT_D16_vi : FLAT_Real_vi <0x24, FLAT_LOAD_SHORT_D16>;
1027def FLAT_LOAD_SHORT_D16_HI_vi : FLAT_Real_vi <0x25, FLAT_LOAD_SHORT_D16_HI>;
1028
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001029multiclass FLAT_Real_Atomics_vi <bits<7> op, FLAT_Pseudo ps> {
1030 def _vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(ps.PseudoInstr)>;
1031 def _RTN_vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(ps.PseudoInstr # "_RTN")>;
1032}
1033
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +00001034multiclass FLAT_Global_Real_Atomics_vi<bits<7> op> :
1035 FLAT_Real_AllAddr_vi<op> {
1036 def _RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_RTN")>;
1037 def _SADDR_RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN")>;
1038}
1039
1040
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001041defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_vi <0x40, FLAT_ATOMIC_SWAP>;
1042defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_vi <0x41, FLAT_ATOMIC_CMPSWAP>;
1043defm FLAT_ATOMIC_ADD : FLAT_Real_Atomics_vi <0x42, FLAT_ATOMIC_ADD>;
1044defm FLAT_ATOMIC_SUB : FLAT_Real_Atomics_vi <0x43, FLAT_ATOMIC_SUB>;
1045defm FLAT_ATOMIC_SMIN : FLAT_Real_Atomics_vi <0x44, FLAT_ATOMIC_SMIN>;
1046defm FLAT_ATOMIC_UMIN : FLAT_Real_Atomics_vi <0x45, FLAT_ATOMIC_UMIN>;
1047defm FLAT_ATOMIC_SMAX : FLAT_Real_Atomics_vi <0x46, FLAT_ATOMIC_SMAX>;
1048defm FLAT_ATOMIC_UMAX : FLAT_Real_Atomics_vi <0x47, FLAT_ATOMIC_UMAX>;
1049defm FLAT_ATOMIC_AND : FLAT_Real_Atomics_vi <0x48, FLAT_ATOMIC_AND>;
1050defm FLAT_ATOMIC_OR : FLAT_Real_Atomics_vi <0x49, FLAT_ATOMIC_OR>;
1051defm FLAT_ATOMIC_XOR : FLAT_Real_Atomics_vi <0x4a, FLAT_ATOMIC_XOR>;
1052defm FLAT_ATOMIC_INC : FLAT_Real_Atomics_vi <0x4b, FLAT_ATOMIC_INC>;
1053defm FLAT_ATOMIC_DEC : FLAT_Real_Atomics_vi <0x4c, FLAT_ATOMIC_DEC>;
1054defm FLAT_ATOMIC_SWAP_X2 : FLAT_Real_Atomics_vi <0x60, FLAT_ATOMIC_SWAP_X2>;
1055defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_vi <0x61, FLAT_ATOMIC_CMPSWAP_X2>;
1056defm FLAT_ATOMIC_ADD_X2 : FLAT_Real_Atomics_vi <0x62, FLAT_ATOMIC_ADD_X2>;
1057defm FLAT_ATOMIC_SUB_X2 : FLAT_Real_Atomics_vi <0x63, FLAT_ATOMIC_SUB_X2>;
1058defm FLAT_ATOMIC_SMIN_X2 : FLAT_Real_Atomics_vi <0x64, FLAT_ATOMIC_SMIN_X2>;
1059defm FLAT_ATOMIC_UMIN_X2 : FLAT_Real_Atomics_vi <0x65, FLAT_ATOMIC_UMIN_X2>;
1060defm FLAT_ATOMIC_SMAX_X2 : FLAT_Real_Atomics_vi <0x66, FLAT_ATOMIC_SMAX_X2>;
1061defm FLAT_ATOMIC_UMAX_X2 : FLAT_Real_Atomics_vi <0x67, FLAT_ATOMIC_UMAX_X2>;
1062defm FLAT_ATOMIC_AND_X2 : FLAT_Real_Atomics_vi <0x68, FLAT_ATOMIC_AND_X2>;
1063defm FLAT_ATOMIC_OR_X2 : FLAT_Real_Atomics_vi <0x69, FLAT_ATOMIC_OR_X2>;
1064defm FLAT_ATOMIC_XOR_X2 : FLAT_Real_Atomics_vi <0x6a, FLAT_ATOMIC_XOR_X2>;
1065defm FLAT_ATOMIC_INC_X2 : FLAT_Real_Atomics_vi <0x6b, FLAT_ATOMIC_INC_X2>;
1066defm FLAT_ATOMIC_DEC_X2 : FLAT_Real_Atomics_vi <0x6c, FLAT_ATOMIC_DEC_X2>;
1067
Matt Arsenault04004712017-07-20 05:17:54 +00001068defm GLOBAL_LOAD_UBYTE : FLAT_Real_AllAddr_vi <0x10>;
1069defm GLOBAL_LOAD_SBYTE : FLAT_Real_AllAddr_vi <0x11>;
1070defm GLOBAL_LOAD_USHORT : FLAT_Real_AllAddr_vi <0x12>;
1071defm GLOBAL_LOAD_SSHORT : FLAT_Real_AllAddr_vi <0x13>;
1072defm GLOBAL_LOAD_DWORD : FLAT_Real_AllAddr_vi <0x14>;
1073defm GLOBAL_LOAD_DWORDX2 : FLAT_Real_AllAddr_vi <0x15>;
Matt Arsenault04004712017-07-20 05:17:54 +00001074defm GLOBAL_LOAD_DWORDX3 : FLAT_Real_AllAddr_vi <0x16>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +00001075defm GLOBAL_LOAD_DWORDX4 : FLAT_Real_AllAddr_vi <0x17>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +00001076
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001077defm GLOBAL_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_vi <0x20>;
1078defm GLOBAL_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x21>;
1079defm GLOBAL_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_vi <0x22>;
1080defm GLOBAL_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x23>;
1081defm GLOBAL_LOAD_SHORT_D16 : FLAT_Real_AllAddr_vi <0x24>;
1082defm GLOBAL_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x25>;
1083
Matt Arsenault04004712017-07-20 05:17:54 +00001084defm GLOBAL_STORE_BYTE : FLAT_Real_AllAddr_vi <0x18>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001085defm GLOBAL_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_vi <0x19>;
Matt Arsenault04004712017-07-20 05:17:54 +00001086defm GLOBAL_STORE_SHORT : FLAT_Real_AllAddr_vi <0x1a>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001087defm GLOBAL_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x1b>;
Matt Arsenault04004712017-07-20 05:17:54 +00001088defm GLOBAL_STORE_DWORD : FLAT_Real_AllAddr_vi <0x1c>;
1089defm GLOBAL_STORE_DWORDX2 : FLAT_Real_AllAddr_vi <0x1d>;
Matt Arsenault04004712017-07-20 05:17:54 +00001090defm GLOBAL_STORE_DWORDX3 : FLAT_Real_AllAddr_vi <0x1e>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +00001091defm GLOBAL_STORE_DWORDX4 : FLAT_Real_AllAddr_vi <0x1f>;
1092
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +00001093
1094defm GLOBAL_ATOMIC_SWAP : FLAT_Global_Real_Atomics_vi <0x40>;
1095defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Global_Real_Atomics_vi <0x41>;
1096defm GLOBAL_ATOMIC_ADD : FLAT_Global_Real_Atomics_vi <0x42>;
1097defm GLOBAL_ATOMIC_SUB : FLAT_Global_Real_Atomics_vi <0x43>;
1098defm GLOBAL_ATOMIC_SMIN : FLAT_Global_Real_Atomics_vi <0x44>;
1099defm GLOBAL_ATOMIC_UMIN : FLAT_Global_Real_Atomics_vi <0x45>;
1100defm GLOBAL_ATOMIC_SMAX : FLAT_Global_Real_Atomics_vi <0x46>;
1101defm GLOBAL_ATOMIC_UMAX : FLAT_Global_Real_Atomics_vi <0x47>;
1102defm GLOBAL_ATOMIC_AND : FLAT_Global_Real_Atomics_vi <0x48>;
1103defm GLOBAL_ATOMIC_OR : FLAT_Global_Real_Atomics_vi <0x49>;
1104defm GLOBAL_ATOMIC_XOR : FLAT_Global_Real_Atomics_vi <0x4a>;
1105defm GLOBAL_ATOMIC_INC : FLAT_Global_Real_Atomics_vi <0x4b>;
1106defm GLOBAL_ATOMIC_DEC : FLAT_Global_Real_Atomics_vi <0x4c>;
1107defm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Global_Real_Atomics_vi <0x60>;
1108defm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Global_Real_Atomics_vi <0x61>;
1109defm GLOBAL_ATOMIC_ADD_X2 : FLAT_Global_Real_Atomics_vi <0x62>;
1110defm GLOBAL_ATOMIC_SUB_X2 : FLAT_Global_Real_Atomics_vi <0x63>;
1111defm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Global_Real_Atomics_vi <0x64>;
1112defm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Global_Real_Atomics_vi <0x65>;
1113defm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Global_Real_Atomics_vi <0x66>;
1114defm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Global_Real_Atomics_vi <0x67>;
1115defm GLOBAL_ATOMIC_AND_X2 : FLAT_Global_Real_Atomics_vi <0x68>;
1116defm GLOBAL_ATOMIC_OR_X2 : FLAT_Global_Real_Atomics_vi <0x69>;
1117defm GLOBAL_ATOMIC_XOR_X2 : FLAT_Global_Real_Atomics_vi <0x6a>;
1118defm GLOBAL_ATOMIC_INC_X2 : FLAT_Global_Real_Atomics_vi <0x6b>;
1119defm GLOBAL_ATOMIC_DEC_X2 : FLAT_Global_Real_Atomics_vi <0x6c>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +00001120
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001121defm SCRATCH_LOAD_UBYTE : FLAT_Real_AllAddr_vi <0x10>;
1122defm SCRATCH_LOAD_SBYTE : FLAT_Real_AllAddr_vi <0x11>;
1123defm SCRATCH_LOAD_USHORT : FLAT_Real_AllAddr_vi <0x12>;
1124defm SCRATCH_LOAD_SSHORT : FLAT_Real_AllAddr_vi <0x13>;
1125defm SCRATCH_LOAD_DWORD : FLAT_Real_AllAddr_vi <0x14>;
1126defm SCRATCH_LOAD_DWORDX2 : FLAT_Real_AllAddr_vi <0x15>;
1127defm SCRATCH_LOAD_DWORDX3 : FLAT_Real_AllAddr_vi <0x16>;
1128defm SCRATCH_LOAD_DWORDX4 : FLAT_Real_AllAddr_vi <0x17>;
1129defm SCRATCH_STORE_BYTE : FLAT_Real_AllAddr_vi <0x18>;
1130defm SCRATCH_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_vi <0x19>;
1131defm SCRATCH_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_vi <0x20>;
1132defm SCRATCH_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x21>;
1133defm SCRATCH_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_vi <0x22>;
1134defm SCRATCH_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x23>;
1135defm SCRATCH_LOAD_SHORT_D16 : FLAT_Real_AllAddr_vi <0x24>;
1136defm SCRATCH_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x25>;
1137defm SCRATCH_STORE_SHORT : FLAT_Real_AllAddr_vi <0x1a>;
1138defm SCRATCH_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x1b>;
1139defm SCRATCH_STORE_DWORD : FLAT_Real_AllAddr_vi <0x1c>;
1140defm SCRATCH_STORE_DWORDX2 : FLAT_Real_AllAddr_vi <0x1d>;
1141defm SCRATCH_STORE_DWORDX3 : FLAT_Real_AllAddr_vi <0x1e>;
1142defm SCRATCH_STORE_DWORDX4 : FLAT_Real_AllAddr_vi <0x1f>;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001143
1144
1145//===----------------------------------------------------------------------===//
1146// GFX10.
1147//===----------------------------------------------------------------------===//
1148
1149class FLAT_Real_gfx10<bits<7> op, FLAT_Pseudo ps> :
1150 FLAT_Real<op, ps>, SIMCInstr<ps.PseudoInstr, SIEncodingFamily.GFX10> {
1151 let AssemblerPredicate = isGFX10Plus;
1152 let DecoderNamespace = "GFX10";
1153
1154 let Inst{11-0} = {offset{12}, offset{10-0}};
1155 let Inst{12} = !if(ps.has_dlc, dlc, ps.dlcValue);
1156 let Inst{54-48} = !if(ps.has_saddr, !if(ps.enabled_saddr, saddr, 0x7d), 0x7d);
1157 let Inst{55} = 0;
1158}
1159
1160
1161multiclass FLAT_Real_Base_gfx10<bits<7> op> {
1162 def _gfx10 :
1163 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME)>;
1164}
1165
1166multiclass FLAT_Real_RTN_gfx10<bits<7> op> {
1167 def _RTN_gfx10 :
1168 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME#"_RTN")>;
1169}
1170
1171multiclass FLAT_Real_SADDR_gfx10<bits<7> op> {
1172 def _SADDR_gfx10 :
1173 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME#"_SADDR")>;
1174}
1175
1176multiclass FLAT_Real_SADDR_RTN_gfx10<bits<7> op> {
1177 def _SADDR_RTN_gfx10 :
1178 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN")>;
1179}
1180
1181
1182multiclass FLAT_Real_AllAddr_gfx10<bits<7> op> :
1183 FLAT_Real_Base_gfx10<op>,
1184 FLAT_Real_SADDR_gfx10<op>;
1185
1186multiclass FLAT_Real_Atomics_gfx10<bits<7> op> :
1187 FLAT_Real_Base_gfx10<op>,
1188 FLAT_Real_RTN_gfx10<op>;
1189
1190multiclass FLAT_Real_GlblAtomics_gfx10<bits<7> op> :
1191 FLAT_Real_AllAddr_gfx10<op>,
1192 FLAT_Real_RTN_gfx10<op>,
1193 FLAT_Real_SADDR_RTN_gfx10<op>;
1194
1195
1196// ENC_FLAT.
1197defm FLAT_LOAD_UBYTE : FLAT_Real_Base_gfx10<0x008>;
1198defm FLAT_LOAD_SBYTE : FLAT_Real_Base_gfx10<0x009>;
1199defm FLAT_LOAD_USHORT : FLAT_Real_Base_gfx10<0x00a>;
1200defm FLAT_LOAD_SSHORT : FLAT_Real_Base_gfx10<0x00b>;
1201defm FLAT_LOAD_DWORD : FLAT_Real_Base_gfx10<0x00c>;
1202defm FLAT_LOAD_DWORDX2 : FLAT_Real_Base_gfx10<0x00d>;
1203defm FLAT_LOAD_DWORDX4 : FLAT_Real_Base_gfx10<0x00e>;
1204defm FLAT_LOAD_DWORDX3 : FLAT_Real_Base_gfx10<0x00f>;
1205defm FLAT_STORE_BYTE : FLAT_Real_Base_gfx10<0x018>;
1206defm FLAT_STORE_BYTE_D16_HI : FLAT_Real_Base_gfx10<0x019>;
1207defm FLAT_STORE_SHORT : FLAT_Real_Base_gfx10<0x01a>;
1208defm FLAT_STORE_SHORT_D16_HI : FLAT_Real_Base_gfx10<0x01b>;
1209defm FLAT_STORE_DWORD : FLAT_Real_Base_gfx10<0x01c>;
1210defm FLAT_STORE_DWORDX2 : FLAT_Real_Base_gfx10<0x01d>;
1211defm FLAT_STORE_DWORDX4 : FLAT_Real_Base_gfx10<0x01e>;
1212defm FLAT_STORE_DWORDX3 : FLAT_Real_Base_gfx10<0x01f>;
1213defm FLAT_LOAD_UBYTE_D16 : FLAT_Real_Base_gfx10<0x020>;
1214defm FLAT_LOAD_UBYTE_D16_HI : FLAT_Real_Base_gfx10<0x021>;
1215defm FLAT_LOAD_SBYTE_D16 : FLAT_Real_Base_gfx10<0x022>;
1216defm FLAT_LOAD_SBYTE_D16_HI : FLAT_Real_Base_gfx10<0x023>;
1217defm FLAT_LOAD_SHORT_D16 : FLAT_Real_Base_gfx10<0x024>;
1218defm FLAT_LOAD_SHORT_D16_HI : FLAT_Real_Base_gfx10<0x025>;
1219defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_gfx10<0x030>;
1220defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_gfx10<0x031>;
1221defm FLAT_ATOMIC_ADD : FLAT_Real_Atomics_gfx10<0x032>;
1222defm FLAT_ATOMIC_SUB : FLAT_Real_Atomics_gfx10<0x033>;
1223defm FLAT_ATOMIC_SMIN : FLAT_Real_Atomics_gfx10<0x035>;
1224defm FLAT_ATOMIC_UMIN : FLAT_Real_Atomics_gfx10<0x036>;
1225defm FLAT_ATOMIC_SMAX : FLAT_Real_Atomics_gfx10<0x037>;
1226defm FLAT_ATOMIC_UMAX : FLAT_Real_Atomics_gfx10<0x038>;
1227defm FLAT_ATOMIC_AND : FLAT_Real_Atomics_gfx10<0x039>;
1228defm FLAT_ATOMIC_OR : FLAT_Real_Atomics_gfx10<0x03a>;
1229defm FLAT_ATOMIC_XOR : FLAT_Real_Atomics_gfx10<0x03b>;
1230defm FLAT_ATOMIC_INC : FLAT_Real_Atomics_gfx10<0x03c>;
1231defm FLAT_ATOMIC_DEC : FLAT_Real_Atomics_gfx10<0x03d>;
1232defm FLAT_ATOMIC_FCMPSWAP : FLAT_Real_Atomics_gfx10<0x03e>;
1233defm FLAT_ATOMIC_FMIN : FLAT_Real_Atomics_gfx10<0x03f>;
1234defm FLAT_ATOMIC_FMAX : FLAT_Real_Atomics_gfx10<0x040>;
1235defm FLAT_ATOMIC_SWAP_X2 : FLAT_Real_Atomics_gfx10<0x050>;
1236defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_gfx10<0x051>;
1237defm FLAT_ATOMIC_ADD_X2 : FLAT_Real_Atomics_gfx10<0x052>;
1238defm FLAT_ATOMIC_SUB_X2 : FLAT_Real_Atomics_gfx10<0x053>;
1239defm FLAT_ATOMIC_SMIN_X2 : FLAT_Real_Atomics_gfx10<0x055>;
1240defm FLAT_ATOMIC_UMIN_X2 : FLAT_Real_Atomics_gfx10<0x056>;
1241defm FLAT_ATOMIC_SMAX_X2 : FLAT_Real_Atomics_gfx10<0x057>;
1242defm FLAT_ATOMIC_UMAX_X2 : FLAT_Real_Atomics_gfx10<0x058>;
1243defm FLAT_ATOMIC_AND_X2 : FLAT_Real_Atomics_gfx10<0x059>;
1244defm FLAT_ATOMIC_OR_X2 : FLAT_Real_Atomics_gfx10<0x05a>;
1245defm FLAT_ATOMIC_XOR_X2 : FLAT_Real_Atomics_gfx10<0x05b>;
1246defm FLAT_ATOMIC_INC_X2 : FLAT_Real_Atomics_gfx10<0x05c>;
1247defm FLAT_ATOMIC_DEC_X2 : FLAT_Real_Atomics_gfx10<0x05d>;
1248defm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Real_Atomics_gfx10<0x05e>;
1249defm FLAT_ATOMIC_FMIN_X2 : FLAT_Real_Atomics_gfx10<0x05f>;
1250defm FLAT_ATOMIC_FMAX_X2 : FLAT_Real_Atomics_gfx10<0x060>;
1251
1252
1253// ENC_FLAT_GLBL.
1254defm GLOBAL_LOAD_UBYTE : FLAT_Real_AllAddr_gfx10<0x008>;
1255defm GLOBAL_LOAD_SBYTE : FLAT_Real_AllAddr_gfx10<0x009>;
1256defm GLOBAL_LOAD_USHORT : FLAT_Real_AllAddr_gfx10<0x00a>;
1257defm GLOBAL_LOAD_SSHORT : FLAT_Real_AllAddr_gfx10<0x00b>;
1258defm GLOBAL_LOAD_DWORD : FLAT_Real_AllAddr_gfx10<0x00c>;
1259defm GLOBAL_LOAD_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x00d>;
1260defm GLOBAL_LOAD_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x00e>;
1261defm GLOBAL_LOAD_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x00f>;
1262defm GLOBAL_STORE_BYTE : FLAT_Real_AllAddr_gfx10<0x018>;
1263defm GLOBAL_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x019>;
1264defm GLOBAL_STORE_SHORT : FLAT_Real_AllAddr_gfx10<0x01a>;
1265defm GLOBAL_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x01b>;
1266defm GLOBAL_STORE_DWORD : FLAT_Real_AllAddr_gfx10<0x01c>;
1267defm GLOBAL_STORE_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x01d>;
1268defm GLOBAL_STORE_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x01e>;
1269defm GLOBAL_STORE_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x01f>;
1270defm GLOBAL_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x020>;
1271defm GLOBAL_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x021>;
1272defm GLOBAL_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x022>;
1273defm GLOBAL_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x023>;
1274defm GLOBAL_LOAD_SHORT_D16 : FLAT_Real_AllAddr_gfx10<0x024>;
1275defm GLOBAL_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x025>;
1276defm GLOBAL_ATOMIC_SWAP : FLAT_Real_GlblAtomics_gfx10<0x030>;
1277defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Real_GlblAtomics_gfx10<0x031>;
1278defm GLOBAL_ATOMIC_ADD : FLAT_Real_GlblAtomics_gfx10<0x032>;
1279defm GLOBAL_ATOMIC_SUB : FLAT_Real_GlblAtomics_gfx10<0x033>;
1280defm GLOBAL_ATOMIC_SMIN : FLAT_Real_GlblAtomics_gfx10<0x035>;
1281defm GLOBAL_ATOMIC_UMIN : FLAT_Real_GlblAtomics_gfx10<0x036>;
1282defm GLOBAL_ATOMIC_SMAX : FLAT_Real_GlblAtomics_gfx10<0x037>;
1283defm GLOBAL_ATOMIC_UMAX : FLAT_Real_GlblAtomics_gfx10<0x038>;
1284defm GLOBAL_ATOMIC_AND : FLAT_Real_GlblAtomics_gfx10<0x039>;
1285defm GLOBAL_ATOMIC_OR : FLAT_Real_GlblAtomics_gfx10<0x03a>;
1286defm GLOBAL_ATOMIC_XOR : FLAT_Real_GlblAtomics_gfx10<0x03b>;
1287defm GLOBAL_ATOMIC_INC : FLAT_Real_GlblAtomics_gfx10<0x03c>;
1288defm GLOBAL_ATOMIC_DEC : FLAT_Real_GlblAtomics_gfx10<0x03d>;
1289defm GLOBAL_ATOMIC_FCMPSWAP : FLAT_Real_GlblAtomics_gfx10<0x03e>;
1290defm GLOBAL_ATOMIC_FMIN : FLAT_Real_GlblAtomics_gfx10<0x03f>;
1291defm GLOBAL_ATOMIC_FMAX : FLAT_Real_GlblAtomics_gfx10<0x040>;
1292defm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Real_GlblAtomics_gfx10<0x050>;
1293defm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Real_GlblAtomics_gfx10<0x051>;
1294defm GLOBAL_ATOMIC_ADD_X2 : FLAT_Real_GlblAtomics_gfx10<0x052>;
1295defm GLOBAL_ATOMIC_SUB_X2 : FLAT_Real_GlblAtomics_gfx10<0x053>;
1296defm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Real_GlblAtomics_gfx10<0x055>;
1297defm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Real_GlblAtomics_gfx10<0x056>;
1298defm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Real_GlblAtomics_gfx10<0x057>;
1299defm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Real_GlblAtomics_gfx10<0x058>;
1300defm GLOBAL_ATOMIC_AND_X2 : FLAT_Real_GlblAtomics_gfx10<0x059>;
1301defm GLOBAL_ATOMIC_OR_X2 : FLAT_Real_GlblAtomics_gfx10<0x05a>;
1302defm GLOBAL_ATOMIC_XOR_X2 : FLAT_Real_GlblAtomics_gfx10<0x05b>;
1303defm GLOBAL_ATOMIC_INC_X2 : FLAT_Real_GlblAtomics_gfx10<0x05c>;
1304defm GLOBAL_ATOMIC_DEC_X2 : FLAT_Real_GlblAtomics_gfx10<0x05d>;
1305defm GLOBAL_ATOMIC_FCMPSWAP_X2 : FLAT_Real_GlblAtomics_gfx10<0x05e>;
1306defm GLOBAL_ATOMIC_FMIN_X2 : FLAT_Real_GlblAtomics_gfx10<0x05f>;
1307defm GLOBAL_ATOMIC_FMAX_X2 : FLAT_Real_GlblAtomics_gfx10<0x060>;
1308
1309
1310// ENC_FLAT_SCRATCH.
1311defm SCRATCH_LOAD_UBYTE : FLAT_Real_AllAddr_gfx10<0x008>;
1312defm SCRATCH_LOAD_SBYTE : FLAT_Real_AllAddr_gfx10<0x009>;
1313defm SCRATCH_LOAD_USHORT : FLAT_Real_AllAddr_gfx10<0x00a>;
1314defm SCRATCH_LOAD_SSHORT : FLAT_Real_AllAddr_gfx10<0x00b>;
1315defm SCRATCH_LOAD_DWORD : FLAT_Real_AllAddr_gfx10<0x00c>;
1316defm SCRATCH_LOAD_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x00d>;
1317defm SCRATCH_LOAD_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x00e>;
1318defm SCRATCH_LOAD_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x00f>;
1319defm SCRATCH_STORE_BYTE : FLAT_Real_AllAddr_gfx10<0x018>;
1320defm SCRATCH_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x019>;
1321defm SCRATCH_STORE_SHORT : FLAT_Real_AllAddr_gfx10<0x01a>;
1322defm SCRATCH_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x01b>;
1323defm SCRATCH_STORE_DWORD : FLAT_Real_AllAddr_gfx10<0x01c>;
1324defm SCRATCH_STORE_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x01d>;
1325defm SCRATCH_STORE_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x01e>;
1326defm SCRATCH_STORE_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x01f>;
1327defm SCRATCH_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x020>;
1328defm SCRATCH_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x021>;
1329defm SCRATCH_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x022>;
1330defm SCRATCH_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x023>;
1331defm SCRATCH_LOAD_SHORT_D16 : FLAT_Real_AllAddr_gfx10<0x024>;
1332defm SCRATCH_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x025>;