blob: 0196b36a95ce3bbefa1e4489a0057b751709f195 [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,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000276 RegisterClass data_rc = vdst_rc> {
277 def "" : FLAT_AtomicNoRet_Pseudo <opName,
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000278 (outs),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000279 (ins VReg_64:$vaddr, data_rc:$vdata, offset_u12:$offset, SLC:$slc),
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000280 " $vaddr, $vdata$offset$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000281 GlobalSaddrTable<0, opName>,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000282 AtomicNoRet <opName, 0> {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000283 let PseudoInstr = NAME;
284 }
285
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000286 def _RTN : FLAT_AtomicRet_Pseudo <opName,
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000287 (outs vdst_rc:$vdst),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000288 (ins VReg_64:$vaddr, data_rc:$vdata, offset_u12:$offset, SLC:$slc),
Matt Arsenaultfd023142017-06-12 15:55:58 +0000289 " $vdst, $vaddr, $vdata$offset glc$slc",
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000290 [(set vt:$vdst,
Matt Arsenaultfd023142017-06-12 15:55:58 +0000291 (atomic (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$vdata))]>,
Ron Liebermancac749a2018-11-16 01:13:34 +0000292 GlobalSaddrTable<0, opName#"_rtn">,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000293 AtomicNoRet <opName, 1>;
294}
295
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000296multiclass FLAT_Global_Atomic_Pseudo_NO_RTN<
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000297 string opName,
298 RegisterClass vdst_rc,
299 ValueType vt,
300 SDPatternOperator atomic = null_frag,
301 ValueType data_vt = vt,
302 RegisterClass data_rc = vdst_rc> {
303
304 def "" : FLAT_AtomicNoRet_Pseudo <opName,
305 (outs),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000306 (ins VReg_64:$vaddr, data_rc:$vdata, offset_s13:$offset, SLC:$slc),
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000307 " $vaddr, $vdata, off$offset$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000308 GlobalSaddrTable<0, opName>,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000309 AtomicNoRet <opName, 0> {
310 let has_saddr = 1;
311 let PseudoInstr = NAME;
312 }
313
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000314 def _SADDR : FLAT_AtomicNoRet_Pseudo <opName,
315 (outs),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000316 (ins VReg_64:$vaddr, data_rc:$vdata, SReg_64:$saddr, offset_s13:$offset, SLC:$slc),
Dmitry Preobrazhensky16608e62017-11-27 17:14:35 +0000317 " $vaddr, $vdata, $saddr$offset$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000318 GlobalSaddrTable<1, opName>,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000319 AtomicNoRet <opName#"_saddr", 0> {
320 let has_saddr = 1;
321 let enabled_saddr = 1;
322 let PseudoInstr = NAME#"_SADDR";
323 }
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000324}
325
326multiclass FLAT_Global_Atomic_Pseudo_RTN<
327 string opName,
328 RegisterClass vdst_rc,
329 ValueType vt,
330 SDPatternOperator atomic = null_frag,
331 ValueType data_vt = vt,
332 RegisterClass data_rc = vdst_rc> {
333
334 def _RTN : FLAT_AtomicRet_Pseudo <opName,
335 (outs vdst_rc:$vdst),
336 (ins VReg_64:$vaddr, data_rc:$vdata, offset_s13:$offset, SLC:$slc),
337 " $vdst, $vaddr, $vdata, off$offset glc$slc",
338 [(set vt:$vdst,
339 (atomic (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$vdata))]>,
Ron Liebermancac749a2018-11-16 01:13:34 +0000340 GlobalSaddrTable<0, opName#"_rtn">,
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000341 AtomicNoRet <opName, 1> {
342 let has_saddr = 1;
343 }
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000344
345 def _SADDR_RTN : FLAT_AtomicRet_Pseudo <opName,
346 (outs vdst_rc:$vdst),
Nicolai Haehnle59198ed2018-06-04 14:45:20 +0000347 (ins VReg_64:$vaddr, data_rc:$vdata, SReg_64:$saddr, offset_s13:$offset, SLC:$slc),
Dmitry Preobrazhensky16608e62017-11-27 17:14:35 +0000348 " $vdst, $vaddr, $vdata, $saddr$offset glc$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000349 GlobalSaddrTable<1, opName#"_rtn">,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000350 AtomicNoRet <opName#"_saddr", 1> {
351 let has_saddr = 1;
352 let enabled_saddr = 1;
353 let PseudoInstr = NAME#"_SADDR_RTN";
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000354 }
355}
356
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000357multiclass FLAT_Global_Atomic_Pseudo<
358 string opName,
359 RegisterClass vdst_rc,
360 ValueType vt,
361 SDPatternOperator atomic = null_frag,
362 ValueType data_vt = vt,
363 RegisterClass data_rc = vdst_rc> :
364 FLAT_Global_Atomic_Pseudo_NO_RTN<opName, vdst_rc, vt, atomic, data_vt, data_rc>,
365 FLAT_Global_Atomic_Pseudo_RTN<opName, vdst_rc, vt, atomic, data_vt, data_rc>;
366
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000367class flat_binary_atomic_op<SDNode atomic_op> : PatFrag<
368 (ops node:$ptr, node:$value),
369 (atomic_op node:$ptr, node:$value),
Matt Arsenault0da63502018-08-31 05:49:54 +0000370 [{return cast<MemSDNode>(N)->getAddressSpace() == AMDGPUAS::FLAT_ADDRESS;}]
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000371>;
372
373def atomic_cmp_swap_flat : flat_binary_atomic_op<AMDGPUatomic_cmp_swap>;
374def atomic_swap_flat : flat_binary_atomic_op<atomic_swap>;
375def atomic_add_flat : flat_binary_atomic_op<atomic_load_add>;
376def atomic_and_flat : flat_binary_atomic_op<atomic_load_and>;
377def atomic_max_flat : flat_binary_atomic_op<atomic_load_max>;
378def atomic_min_flat : flat_binary_atomic_op<atomic_load_min>;
379def atomic_or_flat : flat_binary_atomic_op<atomic_load_or>;
380def atomic_sub_flat : flat_binary_atomic_op<atomic_load_sub>;
381def atomic_umax_flat : flat_binary_atomic_op<atomic_load_umax>;
382def atomic_umin_flat : flat_binary_atomic_op<atomic_load_umin>;
383def atomic_xor_flat : flat_binary_atomic_op<atomic_load_xor>;
384def atomic_inc_flat : flat_binary_atomic_op<SIatomic_inc>;
385def atomic_dec_flat : flat_binary_atomic_op<SIatomic_dec>;
386
387
388
389//===----------------------------------------------------------------------===//
390// Flat Instructions
391//===----------------------------------------------------------------------===//
392
393def FLAT_LOAD_UBYTE : FLAT_Load_Pseudo <"flat_load_ubyte", VGPR_32>;
394def FLAT_LOAD_SBYTE : FLAT_Load_Pseudo <"flat_load_sbyte", VGPR_32>;
395def FLAT_LOAD_USHORT : FLAT_Load_Pseudo <"flat_load_ushort", VGPR_32>;
396def FLAT_LOAD_SSHORT : FLAT_Load_Pseudo <"flat_load_sshort", VGPR_32>;
397def FLAT_LOAD_DWORD : FLAT_Load_Pseudo <"flat_load_dword", VGPR_32>;
398def FLAT_LOAD_DWORDX2 : FLAT_Load_Pseudo <"flat_load_dwordx2", VReg_64>;
399def FLAT_LOAD_DWORDX4 : FLAT_Load_Pseudo <"flat_load_dwordx4", VReg_128>;
400def FLAT_LOAD_DWORDX3 : FLAT_Load_Pseudo <"flat_load_dwordx3", VReg_96>;
401
402def FLAT_STORE_BYTE : FLAT_Store_Pseudo <"flat_store_byte", VGPR_32>;
403def FLAT_STORE_SHORT : FLAT_Store_Pseudo <"flat_store_short", VGPR_32>;
404def FLAT_STORE_DWORD : FLAT_Store_Pseudo <"flat_store_dword", VGPR_32>;
405def FLAT_STORE_DWORDX2 : FLAT_Store_Pseudo <"flat_store_dwordx2", VReg_64>;
406def FLAT_STORE_DWORDX4 : FLAT_Store_Pseudo <"flat_store_dwordx4", VReg_128>;
407def FLAT_STORE_DWORDX3 : FLAT_Store_Pseudo <"flat_store_dwordx3", VReg_96>;
408
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000409let SubtargetPredicate = HasD16LoadStore in {
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000410def FLAT_LOAD_UBYTE_D16 : FLAT_Load_Pseudo <"flat_load_ubyte_d16", VGPR_32, 1>;
411def FLAT_LOAD_UBYTE_D16_HI : FLAT_Load_Pseudo <"flat_load_ubyte_d16_hi", VGPR_32, 1>;
412def FLAT_LOAD_SBYTE_D16 : FLAT_Load_Pseudo <"flat_load_sbyte_d16", VGPR_32, 1>;
413def FLAT_LOAD_SBYTE_D16_HI : FLAT_Load_Pseudo <"flat_load_sbyte_d16_hi", VGPR_32, 1>;
414def FLAT_LOAD_SHORT_D16 : FLAT_Load_Pseudo <"flat_load_short_d16", VGPR_32, 1>;
415def FLAT_LOAD_SHORT_D16_HI : FLAT_Load_Pseudo <"flat_load_short_d16_hi", VGPR_32, 1>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000416
417def FLAT_STORE_BYTE_D16_HI : FLAT_Store_Pseudo <"flat_store_byte_d16_hi", VGPR_32>;
418def FLAT_STORE_SHORT_D16_HI : FLAT_Store_Pseudo <"flat_store_short_d16_hi", VGPR_32>;
419}
420
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000421defm FLAT_ATOMIC_CMPSWAP : FLAT_Atomic_Pseudo <"flat_atomic_cmpswap",
422 VGPR_32, i32, atomic_cmp_swap_flat,
423 v2i32, VReg_64>;
424
425defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_cmpswap_x2",
426 VReg_64, i64, atomic_cmp_swap_flat,
427 v2i64, VReg_128>;
428
429defm FLAT_ATOMIC_SWAP : FLAT_Atomic_Pseudo <"flat_atomic_swap",
430 VGPR_32, i32, atomic_swap_flat>;
431
432defm FLAT_ATOMIC_SWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_swap_x2",
433 VReg_64, i64, atomic_swap_flat>;
434
435defm FLAT_ATOMIC_ADD : FLAT_Atomic_Pseudo <"flat_atomic_add",
436 VGPR_32, i32, atomic_add_flat>;
437
438defm FLAT_ATOMIC_SUB : FLAT_Atomic_Pseudo <"flat_atomic_sub",
439 VGPR_32, i32, atomic_sub_flat>;
440
441defm FLAT_ATOMIC_SMIN : FLAT_Atomic_Pseudo <"flat_atomic_smin",
442 VGPR_32, i32, atomic_min_flat>;
443
444defm FLAT_ATOMIC_UMIN : FLAT_Atomic_Pseudo <"flat_atomic_umin",
445 VGPR_32, i32, atomic_umin_flat>;
446
447defm FLAT_ATOMIC_SMAX : FLAT_Atomic_Pseudo <"flat_atomic_smax",
448 VGPR_32, i32, atomic_max_flat>;
449
450defm FLAT_ATOMIC_UMAX : FLAT_Atomic_Pseudo <"flat_atomic_umax",
451 VGPR_32, i32, atomic_umax_flat>;
452
453defm FLAT_ATOMIC_AND : FLAT_Atomic_Pseudo <"flat_atomic_and",
454 VGPR_32, i32, atomic_and_flat>;
455
456defm FLAT_ATOMIC_OR : FLAT_Atomic_Pseudo <"flat_atomic_or",
457 VGPR_32, i32, atomic_or_flat>;
458
459defm FLAT_ATOMIC_XOR : FLAT_Atomic_Pseudo <"flat_atomic_xor",
460 VGPR_32, i32, atomic_xor_flat>;
461
462defm FLAT_ATOMIC_INC : FLAT_Atomic_Pseudo <"flat_atomic_inc",
463 VGPR_32, i32, atomic_inc_flat>;
464
465defm FLAT_ATOMIC_DEC : FLAT_Atomic_Pseudo <"flat_atomic_dec",
466 VGPR_32, i32, atomic_dec_flat>;
467
468defm FLAT_ATOMIC_ADD_X2 : FLAT_Atomic_Pseudo <"flat_atomic_add_x2",
469 VReg_64, i64, atomic_add_flat>;
470
471defm FLAT_ATOMIC_SUB_X2 : FLAT_Atomic_Pseudo <"flat_atomic_sub_x2",
472 VReg_64, i64, atomic_sub_flat>;
473
474defm FLAT_ATOMIC_SMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_smin_x2",
475 VReg_64, i64, atomic_min_flat>;
476
477defm FLAT_ATOMIC_UMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_umin_x2",
478 VReg_64, i64, atomic_umin_flat>;
479
480defm FLAT_ATOMIC_SMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_smax_x2",
481 VReg_64, i64, atomic_max_flat>;
482
483defm FLAT_ATOMIC_UMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_umax_x2",
484 VReg_64, i64, atomic_umax_flat>;
485
486defm FLAT_ATOMIC_AND_X2 : FLAT_Atomic_Pseudo <"flat_atomic_and_x2",
487 VReg_64, i64, atomic_and_flat>;
488
489defm FLAT_ATOMIC_OR_X2 : FLAT_Atomic_Pseudo <"flat_atomic_or_x2",
490 VReg_64, i64, atomic_or_flat>;
491
492defm FLAT_ATOMIC_XOR_X2 : FLAT_Atomic_Pseudo <"flat_atomic_xor_x2",
493 VReg_64, i64, atomic_xor_flat>;
494
495defm FLAT_ATOMIC_INC_X2 : FLAT_Atomic_Pseudo <"flat_atomic_inc_x2",
496 VReg_64, i64, atomic_inc_flat>;
497
498defm FLAT_ATOMIC_DEC_X2 : FLAT_Atomic_Pseudo <"flat_atomic_dec_x2",
499 VReg_64, i64, atomic_dec_flat>;
500
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000501// GFX7-, GFX10-only flat instructions.
502let SubtargetPredicate = isGFX7GFX10 in {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000503
504defm FLAT_ATOMIC_FCMPSWAP : FLAT_Atomic_Pseudo <"flat_atomic_fcmpswap",
505 VGPR_32, f32, null_frag, v2f32, VReg_64>;
506
507defm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fcmpswap_x2",
508 VReg_64, f64, null_frag, v2f64, VReg_128>;
509
510defm FLAT_ATOMIC_FMIN : FLAT_Atomic_Pseudo <"flat_atomic_fmin",
511 VGPR_32, f32>;
512
513defm FLAT_ATOMIC_FMAX : FLAT_Atomic_Pseudo <"flat_atomic_fmax",
514 VGPR_32, f32>;
515
516defm FLAT_ATOMIC_FMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fmin_x2",
517 VReg_64, f64>;
518
519defm FLAT_ATOMIC_FMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fmax_x2",
520 VReg_64, f64>;
521
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000522} // End SubtargetPredicate = isGFX7GFX10
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000523
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000524let SubtargetPredicate = HasFlatGlobalInsts in {
Matt Arsenault04004712017-07-20 05:17:54 +0000525defm GLOBAL_LOAD_UBYTE : FLAT_Global_Load_Pseudo <"global_load_ubyte", VGPR_32>;
526defm GLOBAL_LOAD_SBYTE : FLAT_Global_Load_Pseudo <"global_load_sbyte", VGPR_32>;
527defm GLOBAL_LOAD_USHORT : FLAT_Global_Load_Pseudo <"global_load_ushort", VGPR_32>;
528defm GLOBAL_LOAD_SSHORT : FLAT_Global_Load_Pseudo <"global_load_sshort", VGPR_32>;
529defm GLOBAL_LOAD_DWORD : FLAT_Global_Load_Pseudo <"global_load_dword", VGPR_32>;
530defm GLOBAL_LOAD_DWORDX2 : FLAT_Global_Load_Pseudo <"global_load_dwordx2", VReg_64>;
531defm GLOBAL_LOAD_DWORDX3 : FLAT_Global_Load_Pseudo <"global_load_dwordx3", VReg_96>;
532defm GLOBAL_LOAD_DWORDX4 : FLAT_Global_Load_Pseudo <"global_load_dwordx4", VReg_128>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000533
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000534defm GLOBAL_LOAD_UBYTE_D16 : FLAT_Global_Load_Pseudo <"global_load_ubyte_d16", VGPR_32, 1>;
535defm GLOBAL_LOAD_UBYTE_D16_HI : FLAT_Global_Load_Pseudo <"global_load_ubyte_d16_hi", VGPR_32, 1>;
536defm GLOBAL_LOAD_SBYTE_D16 : FLAT_Global_Load_Pseudo <"global_load_sbyte_d16", VGPR_32, 1>;
537defm GLOBAL_LOAD_SBYTE_D16_HI : FLAT_Global_Load_Pseudo <"global_load_sbyte_d16_hi", VGPR_32, 1>;
538defm GLOBAL_LOAD_SHORT_D16 : FLAT_Global_Load_Pseudo <"global_load_short_d16", VGPR_32, 1>;
539defm GLOBAL_LOAD_SHORT_D16_HI : FLAT_Global_Load_Pseudo <"global_load_short_d16_hi", VGPR_32, 1>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000540
Matt Arsenault04004712017-07-20 05:17:54 +0000541defm GLOBAL_STORE_BYTE : FLAT_Global_Store_Pseudo <"global_store_byte", VGPR_32>;
542defm GLOBAL_STORE_SHORT : FLAT_Global_Store_Pseudo <"global_store_short", VGPR_32>;
543defm GLOBAL_STORE_DWORD : FLAT_Global_Store_Pseudo <"global_store_dword", VGPR_32>;
544defm GLOBAL_STORE_DWORDX2 : FLAT_Global_Store_Pseudo <"global_store_dwordx2", VReg_64>;
545defm GLOBAL_STORE_DWORDX3 : FLAT_Global_Store_Pseudo <"global_store_dwordx3", VReg_96>;
546defm GLOBAL_STORE_DWORDX4 : FLAT_Global_Store_Pseudo <"global_store_dwordx4", VReg_128>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000547
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000548defm GLOBAL_STORE_BYTE_D16_HI : FLAT_Global_Store_Pseudo <"global_store_byte_d16_hi", VGPR_32>;
549defm GLOBAL_STORE_SHORT_D16_HI : FLAT_Global_Store_Pseudo <"global_store_short_d16_hi", VGPR_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000550
551let is_flat_global = 1 in {
552defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Global_Atomic_Pseudo <"global_atomic_cmpswap",
553 VGPR_32, i32, AMDGPUatomic_cmp_swap_global,
554 v2i32, VReg_64>;
555
556defm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_cmpswap_x2",
557 VReg_64, i64, AMDGPUatomic_cmp_swap_global,
558 v2i64, VReg_128>;
559
560defm GLOBAL_ATOMIC_SWAP : FLAT_Global_Atomic_Pseudo <"global_atomic_swap",
561 VGPR_32, i32, atomic_swap_global>;
562
563defm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_swap_x2",
564 VReg_64, i64, atomic_swap_global>;
565
566defm GLOBAL_ATOMIC_ADD : FLAT_Global_Atomic_Pseudo <"global_atomic_add",
567 VGPR_32, i32, atomic_add_global>;
568
569defm GLOBAL_ATOMIC_SUB : FLAT_Global_Atomic_Pseudo <"global_atomic_sub",
570 VGPR_32, i32, atomic_sub_global>;
571
572defm GLOBAL_ATOMIC_SMIN : FLAT_Global_Atomic_Pseudo <"global_atomic_smin",
573 VGPR_32, i32, atomic_min_global>;
574
575defm GLOBAL_ATOMIC_UMIN : FLAT_Global_Atomic_Pseudo <"global_atomic_umin",
576 VGPR_32, i32, atomic_umin_global>;
577
578defm GLOBAL_ATOMIC_SMAX : FLAT_Global_Atomic_Pseudo <"global_atomic_smax",
579 VGPR_32, i32, atomic_max_global>;
580
581defm GLOBAL_ATOMIC_UMAX : FLAT_Global_Atomic_Pseudo <"global_atomic_umax",
582 VGPR_32, i32, atomic_umax_global>;
583
584defm GLOBAL_ATOMIC_AND : FLAT_Global_Atomic_Pseudo <"global_atomic_and",
585 VGPR_32, i32, atomic_and_global>;
586
587defm GLOBAL_ATOMIC_OR : FLAT_Global_Atomic_Pseudo <"global_atomic_or",
588 VGPR_32, i32, atomic_or_global>;
589
590defm GLOBAL_ATOMIC_XOR : FLAT_Global_Atomic_Pseudo <"global_atomic_xor",
591 VGPR_32, i32, atomic_xor_global>;
592
593defm GLOBAL_ATOMIC_INC : FLAT_Global_Atomic_Pseudo <"global_atomic_inc",
594 VGPR_32, i32, atomic_inc_global>;
595
596defm GLOBAL_ATOMIC_DEC : FLAT_Global_Atomic_Pseudo <"global_atomic_dec",
597 VGPR_32, i32, atomic_dec_global>;
598
599defm GLOBAL_ATOMIC_ADD_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_add_x2",
600 VReg_64, i64, atomic_add_global>;
601
602defm GLOBAL_ATOMIC_SUB_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_sub_x2",
603 VReg_64, i64, atomic_sub_global>;
604
605defm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_smin_x2",
606 VReg_64, i64, atomic_min_global>;
607
608defm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_umin_x2",
609 VReg_64, i64, atomic_umin_global>;
610
611defm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_smax_x2",
612 VReg_64, i64, atomic_max_global>;
613
614defm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_umax_x2",
615 VReg_64, i64, atomic_umax_global>;
616
617defm GLOBAL_ATOMIC_AND_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_and_x2",
618 VReg_64, i64, atomic_and_global>;
619
620defm GLOBAL_ATOMIC_OR_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_or_x2",
621 VReg_64, i64, atomic_or_global>;
622
623defm GLOBAL_ATOMIC_XOR_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_xor_x2",
624 VReg_64, i64, atomic_xor_global>;
625
626defm GLOBAL_ATOMIC_INC_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_inc_x2",
627 VReg_64, i64, atomic_inc_global>;
628
629defm GLOBAL_ATOMIC_DEC_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_dec_x2",
630 VReg_64, i64, atomic_dec_global>;
631} // End is_flat_global = 1
632
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000633} // End SubtargetPredicate = HasFlatGlobalInsts
634
635
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000636let SubtargetPredicate = HasFlatScratchInsts in {
637defm SCRATCH_LOAD_UBYTE : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte", VGPR_32>;
638defm SCRATCH_LOAD_SBYTE : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte", VGPR_32>;
639defm SCRATCH_LOAD_USHORT : FLAT_Scratch_Load_Pseudo <"scratch_load_ushort", VGPR_32>;
640defm SCRATCH_LOAD_SSHORT : FLAT_Scratch_Load_Pseudo <"scratch_load_sshort", VGPR_32>;
641defm SCRATCH_LOAD_DWORD : FLAT_Scratch_Load_Pseudo <"scratch_load_dword", VGPR_32>;
642defm SCRATCH_LOAD_DWORDX2 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx2", VReg_64>;
643defm SCRATCH_LOAD_DWORDX3 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx3", VReg_96>;
644defm SCRATCH_LOAD_DWORDX4 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx4", VReg_128>;
645
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000646defm SCRATCH_LOAD_UBYTE_D16 : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte_d16", VGPR_32>;
647defm SCRATCH_LOAD_UBYTE_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte_d16_hi", VGPR_32>;
648defm SCRATCH_LOAD_SBYTE_D16 : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte_d16", VGPR_32>;
649defm SCRATCH_LOAD_SBYTE_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte_d16_hi", VGPR_32>;
650defm SCRATCH_LOAD_SHORT_D16 : FLAT_Scratch_Load_Pseudo <"scratch_load_short_d16", VGPR_32>;
651defm SCRATCH_LOAD_SHORT_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_short_d16_hi", VGPR_32>;
652
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000653defm SCRATCH_STORE_BYTE : FLAT_Scratch_Store_Pseudo <"scratch_store_byte", VGPR_32>;
654defm SCRATCH_STORE_SHORT : FLAT_Scratch_Store_Pseudo <"scratch_store_short", VGPR_32>;
655defm SCRATCH_STORE_DWORD : FLAT_Scratch_Store_Pseudo <"scratch_store_dword", VGPR_32>;
656defm SCRATCH_STORE_DWORDX2 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx2", VReg_64>;
657defm SCRATCH_STORE_DWORDX3 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx3", VReg_96>;
658defm SCRATCH_STORE_DWORDX4 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx4", VReg_128>;
659
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000660defm SCRATCH_STORE_BYTE_D16_HI : FLAT_Scratch_Store_Pseudo <"scratch_store_byte_d16_hi", VGPR_32>;
661defm SCRATCH_STORE_SHORT_D16_HI : FLAT_Scratch_Store_Pseudo <"scratch_store_short_d16_hi", VGPR_32>;
662
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000663} // End SubtargetPredicate = HasFlatScratchInsts
664
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000665let SubtargetPredicate = isGFX10Plus, is_flat_global = 1 in {
666 defm GLOBAL_ATOMIC_FCMPSWAP :
667 FLAT_Global_Atomic_Pseudo<"global_atomic_fcmpswap", VGPR_32, f32>;
668 defm GLOBAL_ATOMIC_FMIN :
669 FLAT_Global_Atomic_Pseudo<"global_atomic_fmin", VGPR_32, f32>;
670 defm GLOBAL_ATOMIC_FMAX :
671 FLAT_Global_Atomic_Pseudo<"global_atomic_fmax", VGPR_32, f32>;
672 defm GLOBAL_ATOMIC_FCMPSWAP_X2 :
673 FLAT_Global_Atomic_Pseudo<"global_atomic_fcmpswap_x2", VReg_64, f64>;
674 defm GLOBAL_ATOMIC_FMIN_X2 :
675 FLAT_Global_Atomic_Pseudo<"global_atomic_fmin_x2", VReg_64, f64>;
676 defm GLOBAL_ATOMIC_FMAX_X2 :
677 FLAT_Global_Atomic_Pseudo<"global_atomic_fmax_x2", VReg_64, f64>;
678} // End SubtargetPredicate = isGFX10Plus, is_flat_global = 1
679
680
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000681//===----------------------------------------------------------------------===//
682// Flat Patterns
683//===----------------------------------------------------------------------===//
684
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000685// Patterns for global loads with no offset.
Matt Arsenault90c75932017-10-03 00:06:41 +0000686class FlatLoadPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000687 (vt (node (FLATOffset i64:$vaddr, i16:$offset, i1:$slc))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000688 (inst $vaddr, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000689>;
690
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000691class FlatLoadPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
692 (node (FLATOffset i64:$vaddr, i16:$offset, i1:$slc), vt:$in),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000693 (inst $vaddr, $offset, 0, 0, $slc, $in)
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000694>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000695
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000696class FlatSignedLoadPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
697 (node (FLATOffsetSigned i64:$vaddr, i16:$offset, i1:$slc), vt:$in),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000698 (inst $vaddr, $offset, 0, 0, $slc, $in)
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000699>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000700
Matt Arsenault90c75932017-10-03 00:06:41 +0000701class FlatLoadAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000702 (vt (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000703 (inst $vaddr, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000704>;
705
Matt Arsenault90c75932017-10-03 00:06:41 +0000706class FlatLoadSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000707 (vt (node (FLATOffsetSigned i64:$vaddr, i16:$offset, i1:$slc))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000708 (inst $vaddr, $offset, 0, 0, $slc)
Matt Arsenault4e309b02017-07-29 01:03:53 +0000709>;
710
Matt Arsenault90c75932017-10-03 00:06:41 +0000711class FlatStorePat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000712 (node vt:$data, (FLATOffset i64:$vaddr, i16:$offset, i1:$slc)),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000713 (inst $vaddr, $data, $offset, 0, 0, $slc)
Matt Arsenault4e309b02017-07-29 01:03:53 +0000714>;
715
Matt Arsenault90c75932017-10-03 00:06:41 +0000716class FlatStoreSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000717 (node vt:$data, (FLATOffsetSigned i64:$vaddr, i16:$offset, i1:$slc)),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000718 (inst $vaddr, $data, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000719>;
720
Matt Arsenault90c75932017-10-03 00:06:41 +0000721class FlatStoreAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000722 // atomic store follows atomic binop convention so the address comes
723 // first.
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000724 (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), vt:$data),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000725 (inst $vaddr, $data, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000726>;
727
Matt Arsenault90c75932017-10-03 00:06:41 +0000728class FlatStoreSignedAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000729 // atomic store follows atomic binop convention so the address comes
730 // first.
731 (node (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), vt:$data),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000732 (inst $vaddr, $data, $offset, 0, 0, $slc)
Matt Arsenault4e309b02017-07-29 01:03:53 +0000733>;
734
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000735class FlatAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt,
Matt Arsenault90c75932017-10-03 00:06:41 +0000736 ValueType data_vt = vt> : GCNPat <
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000737 (vt (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$data)),
738 (inst $vaddr, $data, $offset, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000739>;
740
Matt Arsenault4e309b02017-07-29 01:03:53 +0000741class FlatSignedAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt,
Matt Arsenault90c75932017-10-03 00:06:41 +0000742 ValueType data_vt = vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000743 (vt (node (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$data)),
744 (inst $vaddr, $data, $offset, $slc)
745>;
746
Matt Arsenault90c75932017-10-03 00:06:41 +0000747let OtherPredicates = [HasFlatAddressSpace] in {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000748
Matt Arsenaultbc683832017-09-20 03:43:35 +0000749def : FlatLoadPat <FLAT_LOAD_UBYTE, az_extloadi8_flat, i32>;
750def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i32>;
751def : FlatLoadPat <FLAT_LOAD_UBYTE, az_extloadi8_flat, i16>;
752def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i16>;
753def : FlatLoadPat <FLAT_LOAD_USHORT, az_extloadi16_flat, i32>;
754def : FlatLoadPat <FLAT_LOAD_USHORT, load_flat, i16>;
755def : FlatLoadPat <FLAT_LOAD_SSHORT, sextloadi16_flat, i32>;
756def : FlatLoadPat <FLAT_LOAD_DWORD, load_flat, i32>;
757def : FlatLoadPat <FLAT_LOAD_DWORDX2, load_flat, v2i32>;
Tim Renouf361b5b22019-03-21 12:01:21 +0000758def : FlatLoadPat <FLAT_LOAD_DWORDX3, load_flat, v3i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000759def : FlatLoadPat <FLAT_LOAD_DWORDX4, load_flat, v4i32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000760
Matt Arsenaultbc683832017-09-20 03:43:35 +0000761def : FlatLoadAtomicPat <FLAT_LOAD_DWORD, atomic_load_flat, i32>;
762def : FlatLoadAtomicPat <FLAT_LOAD_DWORDX2, atomic_load_flat, i64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000763
Matt Arsenaultbc683832017-09-20 03:43:35 +0000764def : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i32>;
765def : FlatStorePat <FLAT_STORE_SHORT, truncstorei16_flat, i32>;
766def : FlatStorePat <FLAT_STORE_DWORD, store_flat, i32>;
767def : FlatStorePat <FLAT_STORE_DWORDX2, store_flat, v2i32>;
Tim Renouf361b5b22019-03-21 12:01:21 +0000768def : FlatStorePat <FLAT_STORE_DWORDX3, store_flat, v3i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000769def : FlatStorePat <FLAT_STORE_DWORDX4, store_flat, v4i32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000770
Matt Arsenaultbc683832017-09-20 03:43:35 +0000771def : FlatStoreAtomicPat <FLAT_STORE_DWORD, atomic_store_flat, i32>;
772def : FlatStoreAtomicPat <FLAT_STORE_DWORDX2, atomic_store_flat, i64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000773
774def : FlatAtomicPat <FLAT_ATOMIC_ADD_RTN, atomic_add_global, i32>;
775def : FlatAtomicPat <FLAT_ATOMIC_SUB_RTN, atomic_sub_global, i32>;
776def : FlatAtomicPat <FLAT_ATOMIC_INC_RTN, atomic_inc_global, i32>;
777def : FlatAtomicPat <FLAT_ATOMIC_DEC_RTN, atomic_dec_global, i32>;
778def : FlatAtomicPat <FLAT_ATOMIC_AND_RTN, atomic_and_global, i32>;
779def : FlatAtomicPat <FLAT_ATOMIC_SMAX_RTN, atomic_max_global, i32>;
780def : FlatAtomicPat <FLAT_ATOMIC_UMAX_RTN, atomic_umax_global, i32>;
781def : FlatAtomicPat <FLAT_ATOMIC_SMIN_RTN, atomic_min_global, i32>;
782def : FlatAtomicPat <FLAT_ATOMIC_UMIN_RTN, atomic_umin_global, i32>;
783def : FlatAtomicPat <FLAT_ATOMIC_OR_RTN, atomic_or_global, i32>;
784def : FlatAtomicPat <FLAT_ATOMIC_SWAP_RTN, atomic_swap_global, i32>;
Jan Vesely206a5102016-12-23 15:34:51 +0000785def : FlatAtomicPat <FLAT_ATOMIC_CMPSWAP_RTN, AMDGPUatomic_cmp_swap_global, i32, v2i32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000786def : FlatAtomicPat <FLAT_ATOMIC_XOR_RTN, atomic_xor_global, i32>;
787
788def : FlatAtomicPat <FLAT_ATOMIC_ADD_X2_RTN, atomic_add_global, i64>;
789def : FlatAtomicPat <FLAT_ATOMIC_SUB_X2_RTN, atomic_sub_global, i64>;
790def : FlatAtomicPat <FLAT_ATOMIC_INC_X2_RTN, atomic_inc_global, i64>;
791def : FlatAtomicPat <FLAT_ATOMIC_DEC_X2_RTN, atomic_dec_global, i64>;
792def : FlatAtomicPat <FLAT_ATOMIC_AND_X2_RTN, atomic_and_global, i64>;
793def : FlatAtomicPat <FLAT_ATOMIC_SMAX_X2_RTN, atomic_max_global, i64>;
794def : FlatAtomicPat <FLAT_ATOMIC_UMAX_X2_RTN, atomic_umax_global, i64>;
795def : FlatAtomicPat <FLAT_ATOMIC_SMIN_X2_RTN, atomic_min_global, i64>;
796def : FlatAtomicPat <FLAT_ATOMIC_UMIN_X2_RTN, atomic_umin_global, i64>;
797def : FlatAtomicPat <FLAT_ATOMIC_OR_X2_RTN, atomic_or_global, i64>;
798def : FlatAtomicPat <FLAT_ATOMIC_SWAP_X2_RTN, atomic_swap_global, i64>;
Jan Vesely206a5102016-12-23 15:34:51 +0000799def : FlatAtomicPat <FLAT_ATOMIC_CMPSWAP_X2_RTN, AMDGPUatomic_cmp_swap_global, i64, v2i64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000800def : FlatAtomicPat <FLAT_ATOMIC_XOR_X2_RTN, atomic_xor_global, i64>;
801
Matt Arsenaultbc683832017-09-20 03:43:35 +0000802def : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i16>;
803def : FlatStorePat <FLAT_STORE_SHORT, store_flat, i16>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000804
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +0000805let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultbc683832017-09-20 03:43:35 +0000806def : FlatStorePat <FLAT_STORE_SHORT_D16_HI, truncstorei16_hi16_flat, i32>;
807def : FlatStorePat <FLAT_STORE_BYTE_D16_HI, truncstorei8_hi16_flat, i32>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000808
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000809def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_flat, v2i16>;
810def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_flat, v2f16>;
811def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_flat, v2i16>;
812def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_flat, v2f16>;
813def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16_HI, load_d16_hi_flat, v2i16>;
814def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16_HI, load_d16_hi_flat, v2f16>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000815
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000816def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16, az_extloadi8_d16_lo_flat, v2i16>;
817def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16, az_extloadi8_d16_lo_flat, v2f16>;
818def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16, sextloadi8_d16_lo_flat, v2i16>;
819def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16, sextloadi8_d16_lo_flat, v2f16>;
820def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16, load_d16_lo_flat, v2i16>;
821def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16, load_d16_lo_flat, v2f16>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000822}
823
Matt Arsenault90c75932017-10-03 00:06:41 +0000824} // End OtherPredicates = [HasFlatAddressSpace]
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000825
Matt Arsenault90c75932017-10-03 00:06:41 +0000826let OtherPredicates = [HasFlatGlobalInsts], AddedComplexity = 10 in {
Matt Arsenault4e309b02017-07-29 01:03:53 +0000827
828def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, az_extloadi8_global, i32>;
829def : FlatLoadSignedPat <GLOBAL_LOAD_SBYTE, sextloadi8_global, i32>;
830def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, az_extloadi8_global, i16>;
831def : FlatLoadSignedPat <GLOBAL_LOAD_SBYTE, sextloadi8_global, i16>;
832def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, az_extloadi16_global, i32>;
833def : FlatLoadSignedPat <GLOBAL_LOAD_SSHORT, sextloadi16_global, i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000834def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, load_global, i16>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000835
Matt Arsenaultbc683832017-09-20 03:43:35 +0000836def : FlatLoadSignedPat <GLOBAL_LOAD_DWORD, load_global, i32>;
837def : FlatLoadSignedPat <GLOBAL_LOAD_DWORDX2, load_global, v2i32>;
Tim Renouf361b5b22019-03-21 12:01:21 +0000838def : FlatLoadSignedPat <GLOBAL_LOAD_DWORDX3, load_global, v3i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000839def : FlatLoadSignedPat <GLOBAL_LOAD_DWORDX4, load_global, v4i32>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000840
Matt Arsenaultbc683832017-09-20 03:43:35 +0000841def : FlatLoadAtomicPat <GLOBAL_LOAD_DWORD, atomic_load_global, i32>;
842def : FlatLoadAtomicPat <GLOBAL_LOAD_DWORDX2, atomic_load_global, i64>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000843
844def : FlatStoreSignedPat <GLOBAL_STORE_BYTE, truncstorei8_global, i32>;
845def : FlatStoreSignedPat <GLOBAL_STORE_BYTE, truncstorei8_global, i16>;
846def : FlatStoreSignedPat <GLOBAL_STORE_SHORT, truncstorei16_global, i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000847def : FlatStoreSignedPat <GLOBAL_STORE_SHORT, store_global, i16>;
848def : FlatStoreSignedPat <GLOBAL_STORE_DWORD, store_global, i32>;
849def : FlatStoreSignedPat <GLOBAL_STORE_DWORDX2, store_global, v2i32>;
Tim Renouf361b5b22019-03-21 12:01:21 +0000850def : FlatStoreSignedPat <GLOBAL_STORE_DWORDX3, store_global, v3i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000851def : FlatStoreSignedPat <GLOBAL_STORE_DWORDX4, store_global, v4i32>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000852
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +0000853let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultbc683832017-09-20 03:43:35 +0000854def : FlatStoreSignedPat <GLOBAL_STORE_SHORT_D16_HI, truncstorei16_hi16_global, i32>;
855def : FlatStoreSignedPat <GLOBAL_STORE_BYTE_D16_HI, truncstorei8_hi16_global, i32>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000856
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000857def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_global, v2i16>;
858def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_global, v2f16>;
859def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_global, v2i16>;
860def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_global, v2f16>;
861def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16_HI, load_d16_hi_global, v2i16>;
862def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16_HI, load_d16_hi_global, v2f16>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000863
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000864def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16, az_extloadi8_d16_lo_global, v2i16>;
865def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16, az_extloadi8_d16_lo_global, v2f16>;
866def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16, sextloadi8_d16_lo_global, v2i16>;
867def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16, sextloadi8_d16_lo_global, v2f16>;
868def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16, load_d16_lo_global, v2i16>;
869def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16, load_d16_lo_global, v2f16>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000870}
871
Matt Arsenaultbc683832017-09-20 03:43:35 +0000872def : FlatStoreSignedAtomicPat <GLOBAL_STORE_DWORD, store_atomic_global, i32>;
873def : FlatStoreSignedAtomicPat <GLOBAL_STORE_DWORDX2, store_atomic_global, i64>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000874
875def : FlatSignedAtomicPat <GLOBAL_ATOMIC_ADD_RTN, atomic_add_global, i32>;
876def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SUB_RTN, atomic_sub_global, i32>;
877def : FlatSignedAtomicPat <GLOBAL_ATOMIC_INC_RTN, atomic_inc_global, i32>;
878def : FlatSignedAtomicPat <GLOBAL_ATOMIC_DEC_RTN, atomic_dec_global, i32>;
879def : FlatSignedAtomicPat <GLOBAL_ATOMIC_AND_RTN, atomic_and_global, i32>;
880def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMAX_RTN, atomic_max_global, i32>;
881def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMAX_RTN, atomic_umax_global, i32>;
882def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMIN_RTN, atomic_min_global, i32>;
883def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMIN_RTN, atomic_umin_global, i32>;
884def : FlatSignedAtomicPat <GLOBAL_ATOMIC_OR_RTN, atomic_or_global, i32>;
885def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SWAP_RTN, atomic_swap_global, i32>;
886def : FlatSignedAtomicPat <GLOBAL_ATOMIC_CMPSWAP_RTN, AMDGPUatomic_cmp_swap_global, i32, v2i32>;
887def : FlatSignedAtomicPat <GLOBAL_ATOMIC_XOR_RTN, atomic_xor_global, i32>;
888
889def : FlatSignedAtomicPat <GLOBAL_ATOMIC_ADD_X2_RTN, atomic_add_global, i64>;
890def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SUB_X2_RTN, atomic_sub_global, i64>;
891def : FlatSignedAtomicPat <GLOBAL_ATOMIC_INC_X2_RTN, atomic_inc_global, i64>;
892def : FlatSignedAtomicPat <GLOBAL_ATOMIC_DEC_X2_RTN, atomic_dec_global, i64>;
893def : FlatSignedAtomicPat <GLOBAL_ATOMIC_AND_X2_RTN, atomic_and_global, i64>;
894def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMAX_X2_RTN, atomic_max_global, i64>;
895def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMAX_X2_RTN, atomic_umax_global, i64>;
896def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMIN_X2_RTN, atomic_min_global, i64>;
897def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMIN_X2_RTN, atomic_umin_global, i64>;
898def : FlatSignedAtomicPat <GLOBAL_ATOMIC_OR_X2_RTN, atomic_or_global, i64>;
899def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SWAP_X2_RTN, atomic_swap_global, i64>;
900def : FlatSignedAtomicPat <GLOBAL_ATOMIC_CMPSWAP_X2_RTN, AMDGPUatomic_cmp_swap_global, i64, v2i64>;
901def : FlatSignedAtomicPat <GLOBAL_ATOMIC_XOR_X2_RTN, atomic_xor_global, i64>;
902
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000903} // End OtherPredicates = [HasFlatGlobalInsts], AddedComplexity = 10
Matt Arsenault4e309b02017-07-29 01:03:53 +0000904
905
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000906//===----------------------------------------------------------------------===//
907// Target
908//===----------------------------------------------------------------------===//
909
910//===----------------------------------------------------------------------===//
911// CI
912//===----------------------------------------------------------------------===//
913
914class FLAT_Real_ci <bits<7> op, FLAT_Pseudo ps> :
915 FLAT_Real <op, ps>,
916 SIMCInstr <ps.PseudoInstr, SIEncodingFamily.SI> {
Stanislav Mekhanoshin51823022019-04-06 09:20:48 +0000917 let AssemblerPredicate = isGFX7Only;
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +0000918 let DecoderNamespace="GFX7";
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000919}
920
921def FLAT_LOAD_UBYTE_ci : FLAT_Real_ci <0x8, FLAT_LOAD_UBYTE>;
922def FLAT_LOAD_SBYTE_ci : FLAT_Real_ci <0x9, FLAT_LOAD_SBYTE>;
923def FLAT_LOAD_USHORT_ci : FLAT_Real_ci <0xa, FLAT_LOAD_USHORT>;
924def FLAT_LOAD_SSHORT_ci : FLAT_Real_ci <0xb, FLAT_LOAD_SSHORT>;
925def FLAT_LOAD_DWORD_ci : FLAT_Real_ci <0xc, FLAT_LOAD_DWORD>;
926def FLAT_LOAD_DWORDX2_ci : FLAT_Real_ci <0xd, FLAT_LOAD_DWORDX2>;
927def FLAT_LOAD_DWORDX4_ci : FLAT_Real_ci <0xe, FLAT_LOAD_DWORDX4>;
928def FLAT_LOAD_DWORDX3_ci : FLAT_Real_ci <0xf, FLAT_LOAD_DWORDX3>;
929
930def FLAT_STORE_BYTE_ci : FLAT_Real_ci <0x18, FLAT_STORE_BYTE>;
931def FLAT_STORE_SHORT_ci : FLAT_Real_ci <0x1a, FLAT_STORE_SHORT>;
932def FLAT_STORE_DWORD_ci : FLAT_Real_ci <0x1c, FLAT_STORE_DWORD>;
933def FLAT_STORE_DWORDX2_ci : FLAT_Real_ci <0x1d, FLAT_STORE_DWORDX2>;
934def FLAT_STORE_DWORDX4_ci : FLAT_Real_ci <0x1e, FLAT_STORE_DWORDX4>;
935def FLAT_STORE_DWORDX3_ci : FLAT_Real_ci <0x1f, FLAT_STORE_DWORDX3>;
936
937multiclass FLAT_Real_Atomics_ci <bits<7> op, FLAT_Pseudo ps> {
938 def _ci : FLAT_Real_ci<op, !cast<FLAT_Pseudo>(ps.PseudoInstr)>;
939 def _RTN_ci : FLAT_Real_ci<op, !cast<FLAT_Pseudo>(ps.PseudoInstr # "_RTN")>;
940}
941
942defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_ci <0x30, FLAT_ATOMIC_SWAP>;
943defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_ci <0x31, FLAT_ATOMIC_CMPSWAP>;
944defm FLAT_ATOMIC_ADD : FLAT_Real_Atomics_ci <0x32, FLAT_ATOMIC_ADD>;
945defm FLAT_ATOMIC_SUB : FLAT_Real_Atomics_ci <0x33, FLAT_ATOMIC_SUB>;
946defm FLAT_ATOMIC_SMIN : FLAT_Real_Atomics_ci <0x35, FLAT_ATOMIC_SMIN>;
947defm FLAT_ATOMIC_UMIN : FLAT_Real_Atomics_ci <0x36, FLAT_ATOMIC_UMIN>;
948defm FLAT_ATOMIC_SMAX : FLAT_Real_Atomics_ci <0x37, FLAT_ATOMIC_SMAX>;
949defm FLAT_ATOMIC_UMAX : FLAT_Real_Atomics_ci <0x38, FLAT_ATOMIC_UMAX>;
950defm FLAT_ATOMIC_AND : FLAT_Real_Atomics_ci <0x39, FLAT_ATOMIC_AND>;
951defm FLAT_ATOMIC_OR : FLAT_Real_Atomics_ci <0x3a, FLAT_ATOMIC_OR>;
952defm FLAT_ATOMIC_XOR : FLAT_Real_Atomics_ci <0x3b, FLAT_ATOMIC_XOR>;
953defm FLAT_ATOMIC_INC : FLAT_Real_Atomics_ci <0x3c, FLAT_ATOMIC_INC>;
954defm FLAT_ATOMIC_DEC : FLAT_Real_Atomics_ci <0x3d, FLAT_ATOMIC_DEC>;
955defm FLAT_ATOMIC_SWAP_X2 : FLAT_Real_Atomics_ci <0x50, FLAT_ATOMIC_SWAP_X2>;
956defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_ci <0x51, FLAT_ATOMIC_CMPSWAP_X2>;
957defm FLAT_ATOMIC_ADD_X2 : FLAT_Real_Atomics_ci <0x52, FLAT_ATOMIC_ADD_X2>;
958defm FLAT_ATOMIC_SUB_X2 : FLAT_Real_Atomics_ci <0x53, FLAT_ATOMIC_SUB_X2>;
959defm FLAT_ATOMIC_SMIN_X2 : FLAT_Real_Atomics_ci <0x55, FLAT_ATOMIC_SMIN_X2>;
960defm FLAT_ATOMIC_UMIN_X2 : FLAT_Real_Atomics_ci <0x56, FLAT_ATOMIC_UMIN_X2>;
961defm FLAT_ATOMIC_SMAX_X2 : FLAT_Real_Atomics_ci <0x57, FLAT_ATOMIC_SMAX_X2>;
962defm FLAT_ATOMIC_UMAX_X2 : FLAT_Real_Atomics_ci <0x58, FLAT_ATOMIC_UMAX_X2>;
963defm FLAT_ATOMIC_AND_X2 : FLAT_Real_Atomics_ci <0x59, FLAT_ATOMIC_AND_X2>;
964defm FLAT_ATOMIC_OR_X2 : FLAT_Real_Atomics_ci <0x5a, FLAT_ATOMIC_OR_X2>;
965defm FLAT_ATOMIC_XOR_X2 : FLAT_Real_Atomics_ci <0x5b, FLAT_ATOMIC_XOR_X2>;
966defm FLAT_ATOMIC_INC_X2 : FLAT_Real_Atomics_ci <0x5c, FLAT_ATOMIC_INC_X2>;
967defm FLAT_ATOMIC_DEC_X2 : FLAT_Real_Atomics_ci <0x5d, FLAT_ATOMIC_DEC_X2>;
968
969// CI Only flat instructions
970defm FLAT_ATOMIC_FCMPSWAP : FLAT_Real_Atomics_ci <0x3e, FLAT_ATOMIC_FCMPSWAP>;
971defm FLAT_ATOMIC_FMIN : FLAT_Real_Atomics_ci <0x3f, FLAT_ATOMIC_FMIN>;
972defm FLAT_ATOMIC_FMAX : FLAT_Real_Atomics_ci <0x40, FLAT_ATOMIC_FMAX>;
973defm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Real_Atomics_ci <0x5e, FLAT_ATOMIC_FCMPSWAP_X2>;
974defm FLAT_ATOMIC_FMIN_X2 : FLAT_Real_Atomics_ci <0x5f, FLAT_ATOMIC_FMIN_X2>;
975defm FLAT_ATOMIC_FMAX_X2 : FLAT_Real_Atomics_ci <0x60, FLAT_ATOMIC_FMAX_X2>;
976
977
978//===----------------------------------------------------------------------===//
979// VI
980//===----------------------------------------------------------------------===//
981
982class FLAT_Real_vi <bits<7> op, FLAT_Pseudo ps> :
983 FLAT_Real <op, ps>,
984 SIMCInstr <ps.PseudoInstr, SIEncodingFamily.VI> {
Stanislav Mekhanoshin51823022019-04-06 09:20:48 +0000985 let AssemblerPredicate = isGFX8GFX9;
986 let DecoderNamespace = "GFX8";
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000987}
988
Matt Arsenault04004712017-07-20 05:17:54 +0000989multiclass FLAT_Real_AllAddr_vi<bits<7> op> {
990 def _vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME)>;
991 def _SADDR_vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME#"_SADDR")>;
992}
993
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000994def FLAT_LOAD_UBYTE_vi : FLAT_Real_vi <0x10, FLAT_LOAD_UBYTE>;
995def FLAT_LOAD_SBYTE_vi : FLAT_Real_vi <0x11, FLAT_LOAD_SBYTE>;
996def FLAT_LOAD_USHORT_vi : FLAT_Real_vi <0x12, FLAT_LOAD_USHORT>;
997def FLAT_LOAD_SSHORT_vi : FLAT_Real_vi <0x13, FLAT_LOAD_SSHORT>;
998def FLAT_LOAD_DWORD_vi : FLAT_Real_vi <0x14, FLAT_LOAD_DWORD>;
999def FLAT_LOAD_DWORDX2_vi : FLAT_Real_vi <0x15, FLAT_LOAD_DWORDX2>;
1000def FLAT_LOAD_DWORDX4_vi : FLAT_Real_vi <0x17, FLAT_LOAD_DWORDX4>;
1001def FLAT_LOAD_DWORDX3_vi : FLAT_Real_vi <0x16, FLAT_LOAD_DWORDX3>;
1002
1003def FLAT_STORE_BYTE_vi : FLAT_Real_vi <0x18, FLAT_STORE_BYTE>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001004def FLAT_STORE_BYTE_D16_HI_vi : FLAT_Real_vi <0x19, FLAT_STORE_BYTE_D16_HI>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001005def FLAT_STORE_SHORT_vi : FLAT_Real_vi <0x1a, FLAT_STORE_SHORT>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001006def FLAT_STORE_SHORT_D16_HI_vi : FLAT_Real_vi <0x1b, FLAT_STORE_SHORT_D16_HI>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001007def FLAT_STORE_DWORD_vi : FLAT_Real_vi <0x1c, FLAT_STORE_DWORD>;
1008def FLAT_STORE_DWORDX2_vi : FLAT_Real_vi <0x1d, FLAT_STORE_DWORDX2>;
1009def FLAT_STORE_DWORDX4_vi : FLAT_Real_vi <0x1f, FLAT_STORE_DWORDX4>;
1010def FLAT_STORE_DWORDX3_vi : FLAT_Real_vi <0x1e, FLAT_STORE_DWORDX3>;
1011
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001012def FLAT_LOAD_UBYTE_D16_vi : FLAT_Real_vi <0x20, FLAT_LOAD_UBYTE_D16>;
1013def FLAT_LOAD_UBYTE_D16_HI_vi : FLAT_Real_vi <0x21, FLAT_LOAD_UBYTE_D16_HI>;
1014def FLAT_LOAD_SBYTE_D16_vi : FLAT_Real_vi <0x22, FLAT_LOAD_SBYTE_D16>;
1015def FLAT_LOAD_SBYTE_D16_HI_vi : FLAT_Real_vi <0x23, FLAT_LOAD_SBYTE_D16_HI>;
1016def FLAT_LOAD_SHORT_D16_vi : FLAT_Real_vi <0x24, FLAT_LOAD_SHORT_D16>;
1017def FLAT_LOAD_SHORT_D16_HI_vi : FLAT_Real_vi <0x25, FLAT_LOAD_SHORT_D16_HI>;
1018
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001019multiclass FLAT_Real_Atomics_vi <bits<7> op, FLAT_Pseudo ps> {
1020 def _vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(ps.PseudoInstr)>;
1021 def _RTN_vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(ps.PseudoInstr # "_RTN")>;
1022}
1023
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +00001024multiclass FLAT_Global_Real_Atomics_vi<bits<7> op> :
1025 FLAT_Real_AllAddr_vi<op> {
1026 def _RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_RTN")>;
1027 def _SADDR_RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN")>;
1028}
1029
1030
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001031defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_vi <0x40, FLAT_ATOMIC_SWAP>;
1032defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_vi <0x41, FLAT_ATOMIC_CMPSWAP>;
1033defm FLAT_ATOMIC_ADD : FLAT_Real_Atomics_vi <0x42, FLAT_ATOMIC_ADD>;
1034defm FLAT_ATOMIC_SUB : FLAT_Real_Atomics_vi <0x43, FLAT_ATOMIC_SUB>;
1035defm FLAT_ATOMIC_SMIN : FLAT_Real_Atomics_vi <0x44, FLAT_ATOMIC_SMIN>;
1036defm FLAT_ATOMIC_UMIN : FLAT_Real_Atomics_vi <0x45, FLAT_ATOMIC_UMIN>;
1037defm FLAT_ATOMIC_SMAX : FLAT_Real_Atomics_vi <0x46, FLAT_ATOMIC_SMAX>;
1038defm FLAT_ATOMIC_UMAX : FLAT_Real_Atomics_vi <0x47, FLAT_ATOMIC_UMAX>;
1039defm FLAT_ATOMIC_AND : FLAT_Real_Atomics_vi <0x48, FLAT_ATOMIC_AND>;
1040defm FLAT_ATOMIC_OR : FLAT_Real_Atomics_vi <0x49, FLAT_ATOMIC_OR>;
1041defm FLAT_ATOMIC_XOR : FLAT_Real_Atomics_vi <0x4a, FLAT_ATOMIC_XOR>;
1042defm FLAT_ATOMIC_INC : FLAT_Real_Atomics_vi <0x4b, FLAT_ATOMIC_INC>;
1043defm FLAT_ATOMIC_DEC : FLAT_Real_Atomics_vi <0x4c, FLAT_ATOMIC_DEC>;
1044defm FLAT_ATOMIC_SWAP_X2 : FLAT_Real_Atomics_vi <0x60, FLAT_ATOMIC_SWAP_X2>;
1045defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_vi <0x61, FLAT_ATOMIC_CMPSWAP_X2>;
1046defm FLAT_ATOMIC_ADD_X2 : FLAT_Real_Atomics_vi <0x62, FLAT_ATOMIC_ADD_X2>;
1047defm FLAT_ATOMIC_SUB_X2 : FLAT_Real_Atomics_vi <0x63, FLAT_ATOMIC_SUB_X2>;
1048defm FLAT_ATOMIC_SMIN_X2 : FLAT_Real_Atomics_vi <0x64, FLAT_ATOMIC_SMIN_X2>;
1049defm FLAT_ATOMIC_UMIN_X2 : FLAT_Real_Atomics_vi <0x65, FLAT_ATOMIC_UMIN_X2>;
1050defm FLAT_ATOMIC_SMAX_X2 : FLAT_Real_Atomics_vi <0x66, FLAT_ATOMIC_SMAX_X2>;
1051defm FLAT_ATOMIC_UMAX_X2 : FLAT_Real_Atomics_vi <0x67, FLAT_ATOMIC_UMAX_X2>;
1052defm FLAT_ATOMIC_AND_X2 : FLAT_Real_Atomics_vi <0x68, FLAT_ATOMIC_AND_X2>;
1053defm FLAT_ATOMIC_OR_X2 : FLAT_Real_Atomics_vi <0x69, FLAT_ATOMIC_OR_X2>;
1054defm FLAT_ATOMIC_XOR_X2 : FLAT_Real_Atomics_vi <0x6a, FLAT_ATOMIC_XOR_X2>;
1055defm FLAT_ATOMIC_INC_X2 : FLAT_Real_Atomics_vi <0x6b, FLAT_ATOMIC_INC_X2>;
1056defm FLAT_ATOMIC_DEC_X2 : FLAT_Real_Atomics_vi <0x6c, FLAT_ATOMIC_DEC_X2>;
1057
Matt Arsenault04004712017-07-20 05:17:54 +00001058defm GLOBAL_LOAD_UBYTE : FLAT_Real_AllAddr_vi <0x10>;
1059defm GLOBAL_LOAD_SBYTE : FLAT_Real_AllAddr_vi <0x11>;
1060defm GLOBAL_LOAD_USHORT : FLAT_Real_AllAddr_vi <0x12>;
1061defm GLOBAL_LOAD_SSHORT : FLAT_Real_AllAddr_vi <0x13>;
1062defm GLOBAL_LOAD_DWORD : FLAT_Real_AllAddr_vi <0x14>;
1063defm GLOBAL_LOAD_DWORDX2 : FLAT_Real_AllAddr_vi <0x15>;
Matt Arsenault04004712017-07-20 05:17:54 +00001064defm GLOBAL_LOAD_DWORDX3 : FLAT_Real_AllAddr_vi <0x16>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +00001065defm GLOBAL_LOAD_DWORDX4 : FLAT_Real_AllAddr_vi <0x17>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +00001066
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001067defm GLOBAL_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_vi <0x20>;
1068defm GLOBAL_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x21>;
1069defm GLOBAL_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_vi <0x22>;
1070defm GLOBAL_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x23>;
1071defm GLOBAL_LOAD_SHORT_D16 : FLAT_Real_AllAddr_vi <0x24>;
1072defm GLOBAL_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x25>;
1073
Matt Arsenault04004712017-07-20 05:17:54 +00001074defm GLOBAL_STORE_BYTE : FLAT_Real_AllAddr_vi <0x18>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001075defm GLOBAL_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_vi <0x19>;
Matt Arsenault04004712017-07-20 05:17:54 +00001076defm GLOBAL_STORE_SHORT : FLAT_Real_AllAddr_vi <0x1a>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001077defm GLOBAL_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x1b>;
Matt Arsenault04004712017-07-20 05:17:54 +00001078defm GLOBAL_STORE_DWORD : FLAT_Real_AllAddr_vi <0x1c>;
1079defm GLOBAL_STORE_DWORDX2 : FLAT_Real_AllAddr_vi <0x1d>;
Matt Arsenault04004712017-07-20 05:17:54 +00001080defm GLOBAL_STORE_DWORDX3 : FLAT_Real_AllAddr_vi <0x1e>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +00001081defm GLOBAL_STORE_DWORDX4 : FLAT_Real_AllAddr_vi <0x1f>;
1082
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +00001083
1084defm GLOBAL_ATOMIC_SWAP : FLAT_Global_Real_Atomics_vi <0x40>;
1085defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Global_Real_Atomics_vi <0x41>;
1086defm GLOBAL_ATOMIC_ADD : FLAT_Global_Real_Atomics_vi <0x42>;
1087defm GLOBAL_ATOMIC_SUB : FLAT_Global_Real_Atomics_vi <0x43>;
1088defm GLOBAL_ATOMIC_SMIN : FLAT_Global_Real_Atomics_vi <0x44>;
1089defm GLOBAL_ATOMIC_UMIN : FLAT_Global_Real_Atomics_vi <0x45>;
1090defm GLOBAL_ATOMIC_SMAX : FLAT_Global_Real_Atomics_vi <0x46>;
1091defm GLOBAL_ATOMIC_UMAX : FLAT_Global_Real_Atomics_vi <0x47>;
1092defm GLOBAL_ATOMIC_AND : FLAT_Global_Real_Atomics_vi <0x48>;
1093defm GLOBAL_ATOMIC_OR : FLAT_Global_Real_Atomics_vi <0x49>;
1094defm GLOBAL_ATOMIC_XOR : FLAT_Global_Real_Atomics_vi <0x4a>;
1095defm GLOBAL_ATOMIC_INC : FLAT_Global_Real_Atomics_vi <0x4b>;
1096defm GLOBAL_ATOMIC_DEC : FLAT_Global_Real_Atomics_vi <0x4c>;
1097defm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Global_Real_Atomics_vi <0x60>;
1098defm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Global_Real_Atomics_vi <0x61>;
1099defm GLOBAL_ATOMIC_ADD_X2 : FLAT_Global_Real_Atomics_vi <0x62>;
1100defm GLOBAL_ATOMIC_SUB_X2 : FLAT_Global_Real_Atomics_vi <0x63>;
1101defm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Global_Real_Atomics_vi <0x64>;
1102defm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Global_Real_Atomics_vi <0x65>;
1103defm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Global_Real_Atomics_vi <0x66>;
1104defm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Global_Real_Atomics_vi <0x67>;
1105defm GLOBAL_ATOMIC_AND_X2 : FLAT_Global_Real_Atomics_vi <0x68>;
1106defm GLOBAL_ATOMIC_OR_X2 : FLAT_Global_Real_Atomics_vi <0x69>;
1107defm GLOBAL_ATOMIC_XOR_X2 : FLAT_Global_Real_Atomics_vi <0x6a>;
1108defm GLOBAL_ATOMIC_INC_X2 : FLAT_Global_Real_Atomics_vi <0x6b>;
1109defm GLOBAL_ATOMIC_DEC_X2 : FLAT_Global_Real_Atomics_vi <0x6c>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +00001110
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001111defm SCRATCH_LOAD_UBYTE : FLAT_Real_AllAddr_vi <0x10>;
1112defm SCRATCH_LOAD_SBYTE : FLAT_Real_AllAddr_vi <0x11>;
1113defm SCRATCH_LOAD_USHORT : FLAT_Real_AllAddr_vi <0x12>;
1114defm SCRATCH_LOAD_SSHORT : FLAT_Real_AllAddr_vi <0x13>;
1115defm SCRATCH_LOAD_DWORD : FLAT_Real_AllAddr_vi <0x14>;
1116defm SCRATCH_LOAD_DWORDX2 : FLAT_Real_AllAddr_vi <0x15>;
1117defm SCRATCH_LOAD_DWORDX3 : FLAT_Real_AllAddr_vi <0x16>;
1118defm SCRATCH_LOAD_DWORDX4 : FLAT_Real_AllAddr_vi <0x17>;
1119defm SCRATCH_STORE_BYTE : FLAT_Real_AllAddr_vi <0x18>;
1120defm SCRATCH_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_vi <0x19>;
1121defm SCRATCH_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_vi <0x20>;
1122defm SCRATCH_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x21>;
1123defm SCRATCH_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_vi <0x22>;
1124defm SCRATCH_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x23>;
1125defm SCRATCH_LOAD_SHORT_D16 : FLAT_Real_AllAddr_vi <0x24>;
1126defm SCRATCH_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x25>;
1127defm SCRATCH_STORE_SHORT : FLAT_Real_AllAddr_vi <0x1a>;
1128defm SCRATCH_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x1b>;
1129defm SCRATCH_STORE_DWORD : FLAT_Real_AllAddr_vi <0x1c>;
1130defm SCRATCH_STORE_DWORDX2 : FLAT_Real_AllAddr_vi <0x1d>;
1131defm SCRATCH_STORE_DWORDX3 : FLAT_Real_AllAddr_vi <0x1e>;
1132defm SCRATCH_STORE_DWORDX4 : FLAT_Real_AllAddr_vi <0x1f>;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001133
1134
1135//===----------------------------------------------------------------------===//
1136// GFX10.
1137//===----------------------------------------------------------------------===//
1138
1139class FLAT_Real_gfx10<bits<7> op, FLAT_Pseudo ps> :
1140 FLAT_Real<op, ps>, SIMCInstr<ps.PseudoInstr, SIEncodingFamily.GFX10> {
1141 let AssemblerPredicate = isGFX10Plus;
1142 let DecoderNamespace = "GFX10";
1143
1144 let Inst{11-0} = {offset{12}, offset{10-0}};
1145 let Inst{12} = !if(ps.has_dlc, dlc, ps.dlcValue);
1146 let Inst{54-48} = !if(ps.has_saddr, !if(ps.enabled_saddr, saddr, 0x7d), 0x7d);
1147 let Inst{55} = 0;
1148}
1149
1150
1151multiclass FLAT_Real_Base_gfx10<bits<7> op> {
1152 def _gfx10 :
1153 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME)>;
1154}
1155
1156multiclass FLAT_Real_RTN_gfx10<bits<7> op> {
1157 def _RTN_gfx10 :
1158 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME#"_RTN")>;
1159}
1160
1161multiclass FLAT_Real_SADDR_gfx10<bits<7> op> {
1162 def _SADDR_gfx10 :
1163 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME#"_SADDR")>;
1164}
1165
1166multiclass FLAT_Real_SADDR_RTN_gfx10<bits<7> op> {
1167 def _SADDR_RTN_gfx10 :
1168 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN")>;
1169}
1170
1171
1172multiclass FLAT_Real_AllAddr_gfx10<bits<7> op> :
1173 FLAT_Real_Base_gfx10<op>,
1174 FLAT_Real_SADDR_gfx10<op>;
1175
1176multiclass FLAT_Real_Atomics_gfx10<bits<7> op> :
1177 FLAT_Real_Base_gfx10<op>,
1178 FLAT_Real_RTN_gfx10<op>;
1179
1180multiclass FLAT_Real_GlblAtomics_gfx10<bits<7> op> :
1181 FLAT_Real_AllAddr_gfx10<op>,
1182 FLAT_Real_RTN_gfx10<op>,
1183 FLAT_Real_SADDR_RTN_gfx10<op>;
1184
1185
1186// ENC_FLAT.
1187defm FLAT_LOAD_UBYTE : FLAT_Real_Base_gfx10<0x008>;
1188defm FLAT_LOAD_SBYTE : FLAT_Real_Base_gfx10<0x009>;
1189defm FLAT_LOAD_USHORT : FLAT_Real_Base_gfx10<0x00a>;
1190defm FLAT_LOAD_SSHORT : FLAT_Real_Base_gfx10<0x00b>;
1191defm FLAT_LOAD_DWORD : FLAT_Real_Base_gfx10<0x00c>;
1192defm FLAT_LOAD_DWORDX2 : FLAT_Real_Base_gfx10<0x00d>;
1193defm FLAT_LOAD_DWORDX4 : FLAT_Real_Base_gfx10<0x00e>;
1194defm FLAT_LOAD_DWORDX3 : FLAT_Real_Base_gfx10<0x00f>;
1195defm FLAT_STORE_BYTE : FLAT_Real_Base_gfx10<0x018>;
1196defm FLAT_STORE_BYTE_D16_HI : FLAT_Real_Base_gfx10<0x019>;
1197defm FLAT_STORE_SHORT : FLAT_Real_Base_gfx10<0x01a>;
1198defm FLAT_STORE_SHORT_D16_HI : FLAT_Real_Base_gfx10<0x01b>;
1199defm FLAT_STORE_DWORD : FLAT_Real_Base_gfx10<0x01c>;
1200defm FLAT_STORE_DWORDX2 : FLAT_Real_Base_gfx10<0x01d>;
1201defm FLAT_STORE_DWORDX4 : FLAT_Real_Base_gfx10<0x01e>;
1202defm FLAT_STORE_DWORDX3 : FLAT_Real_Base_gfx10<0x01f>;
1203defm FLAT_LOAD_UBYTE_D16 : FLAT_Real_Base_gfx10<0x020>;
1204defm FLAT_LOAD_UBYTE_D16_HI : FLAT_Real_Base_gfx10<0x021>;
1205defm FLAT_LOAD_SBYTE_D16 : FLAT_Real_Base_gfx10<0x022>;
1206defm FLAT_LOAD_SBYTE_D16_HI : FLAT_Real_Base_gfx10<0x023>;
1207defm FLAT_LOAD_SHORT_D16 : FLAT_Real_Base_gfx10<0x024>;
1208defm FLAT_LOAD_SHORT_D16_HI : FLAT_Real_Base_gfx10<0x025>;
1209defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_gfx10<0x030>;
1210defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_gfx10<0x031>;
1211defm FLAT_ATOMIC_ADD : FLAT_Real_Atomics_gfx10<0x032>;
1212defm FLAT_ATOMIC_SUB : FLAT_Real_Atomics_gfx10<0x033>;
1213defm FLAT_ATOMIC_SMIN : FLAT_Real_Atomics_gfx10<0x035>;
1214defm FLAT_ATOMIC_UMIN : FLAT_Real_Atomics_gfx10<0x036>;
1215defm FLAT_ATOMIC_SMAX : FLAT_Real_Atomics_gfx10<0x037>;
1216defm FLAT_ATOMIC_UMAX : FLAT_Real_Atomics_gfx10<0x038>;
1217defm FLAT_ATOMIC_AND : FLAT_Real_Atomics_gfx10<0x039>;
1218defm FLAT_ATOMIC_OR : FLAT_Real_Atomics_gfx10<0x03a>;
1219defm FLAT_ATOMIC_XOR : FLAT_Real_Atomics_gfx10<0x03b>;
1220defm FLAT_ATOMIC_INC : FLAT_Real_Atomics_gfx10<0x03c>;
1221defm FLAT_ATOMIC_DEC : FLAT_Real_Atomics_gfx10<0x03d>;
1222defm FLAT_ATOMIC_FCMPSWAP : FLAT_Real_Atomics_gfx10<0x03e>;
1223defm FLAT_ATOMIC_FMIN : FLAT_Real_Atomics_gfx10<0x03f>;
1224defm FLAT_ATOMIC_FMAX : FLAT_Real_Atomics_gfx10<0x040>;
1225defm FLAT_ATOMIC_SWAP_X2 : FLAT_Real_Atomics_gfx10<0x050>;
1226defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_gfx10<0x051>;
1227defm FLAT_ATOMIC_ADD_X2 : FLAT_Real_Atomics_gfx10<0x052>;
1228defm FLAT_ATOMIC_SUB_X2 : FLAT_Real_Atomics_gfx10<0x053>;
1229defm FLAT_ATOMIC_SMIN_X2 : FLAT_Real_Atomics_gfx10<0x055>;
1230defm FLAT_ATOMIC_UMIN_X2 : FLAT_Real_Atomics_gfx10<0x056>;
1231defm FLAT_ATOMIC_SMAX_X2 : FLAT_Real_Atomics_gfx10<0x057>;
1232defm FLAT_ATOMIC_UMAX_X2 : FLAT_Real_Atomics_gfx10<0x058>;
1233defm FLAT_ATOMIC_AND_X2 : FLAT_Real_Atomics_gfx10<0x059>;
1234defm FLAT_ATOMIC_OR_X2 : FLAT_Real_Atomics_gfx10<0x05a>;
1235defm FLAT_ATOMIC_XOR_X2 : FLAT_Real_Atomics_gfx10<0x05b>;
1236defm FLAT_ATOMIC_INC_X2 : FLAT_Real_Atomics_gfx10<0x05c>;
1237defm FLAT_ATOMIC_DEC_X2 : FLAT_Real_Atomics_gfx10<0x05d>;
1238defm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Real_Atomics_gfx10<0x05e>;
1239defm FLAT_ATOMIC_FMIN_X2 : FLAT_Real_Atomics_gfx10<0x05f>;
1240defm FLAT_ATOMIC_FMAX_X2 : FLAT_Real_Atomics_gfx10<0x060>;
1241
1242
1243// ENC_FLAT_GLBL.
1244defm GLOBAL_LOAD_UBYTE : FLAT_Real_AllAddr_gfx10<0x008>;
1245defm GLOBAL_LOAD_SBYTE : FLAT_Real_AllAddr_gfx10<0x009>;
1246defm GLOBAL_LOAD_USHORT : FLAT_Real_AllAddr_gfx10<0x00a>;
1247defm GLOBAL_LOAD_SSHORT : FLAT_Real_AllAddr_gfx10<0x00b>;
1248defm GLOBAL_LOAD_DWORD : FLAT_Real_AllAddr_gfx10<0x00c>;
1249defm GLOBAL_LOAD_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x00d>;
1250defm GLOBAL_LOAD_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x00e>;
1251defm GLOBAL_LOAD_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x00f>;
1252defm GLOBAL_STORE_BYTE : FLAT_Real_AllAddr_gfx10<0x018>;
1253defm GLOBAL_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x019>;
1254defm GLOBAL_STORE_SHORT : FLAT_Real_AllAddr_gfx10<0x01a>;
1255defm GLOBAL_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x01b>;
1256defm GLOBAL_STORE_DWORD : FLAT_Real_AllAddr_gfx10<0x01c>;
1257defm GLOBAL_STORE_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x01d>;
1258defm GLOBAL_STORE_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x01e>;
1259defm GLOBAL_STORE_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x01f>;
1260defm GLOBAL_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x020>;
1261defm GLOBAL_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x021>;
1262defm GLOBAL_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x022>;
1263defm GLOBAL_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x023>;
1264defm GLOBAL_LOAD_SHORT_D16 : FLAT_Real_AllAddr_gfx10<0x024>;
1265defm GLOBAL_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x025>;
1266defm GLOBAL_ATOMIC_SWAP : FLAT_Real_GlblAtomics_gfx10<0x030>;
1267defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Real_GlblAtomics_gfx10<0x031>;
1268defm GLOBAL_ATOMIC_ADD : FLAT_Real_GlblAtomics_gfx10<0x032>;
1269defm GLOBAL_ATOMIC_SUB : FLAT_Real_GlblAtomics_gfx10<0x033>;
1270defm GLOBAL_ATOMIC_SMIN : FLAT_Real_GlblAtomics_gfx10<0x035>;
1271defm GLOBAL_ATOMIC_UMIN : FLAT_Real_GlblAtomics_gfx10<0x036>;
1272defm GLOBAL_ATOMIC_SMAX : FLAT_Real_GlblAtomics_gfx10<0x037>;
1273defm GLOBAL_ATOMIC_UMAX : FLAT_Real_GlblAtomics_gfx10<0x038>;
1274defm GLOBAL_ATOMIC_AND : FLAT_Real_GlblAtomics_gfx10<0x039>;
1275defm GLOBAL_ATOMIC_OR : FLAT_Real_GlblAtomics_gfx10<0x03a>;
1276defm GLOBAL_ATOMIC_XOR : FLAT_Real_GlblAtomics_gfx10<0x03b>;
1277defm GLOBAL_ATOMIC_INC : FLAT_Real_GlblAtomics_gfx10<0x03c>;
1278defm GLOBAL_ATOMIC_DEC : FLAT_Real_GlblAtomics_gfx10<0x03d>;
1279defm GLOBAL_ATOMIC_FCMPSWAP : FLAT_Real_GlblAtomics_gfx10<0x03e>;
1280defm GLOBAL_ATOMIC_FMIN : FLAT_Real_GlblAtomics_gfx10<0x03f>;
1281defm GLOBAL_ATOMIC_FMAX : FLAT_Real_GlblAtomics_gfx10<0x040>;
1282defm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Real_GlblAtomics_gfx10<0x050>;
1283defm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Real_GlblAtomics_gfx10<0x051>;
1284defm GLOBAL_ATOMIC_ADD_X2 : FLAT_Real_GlblAtomics_gfx10<0x052>;
1285defm GLOBAL_ATOMIC_SUB_X2 : FLAT_Real_GlblAtomics_gfx10<0x053>;
1286defm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Real_GlblAtomics_gfx10<0x055>;
1287defm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Real_GlblAtomics_gfx10<0x056>;
1288defm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Real_GlblAtomics_gfx10<0x057>;
1289defm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Real_GlblAtomics_gfx10<0x058>;
1290defm GLOBAL_ATOMIC_AND_X2 : FLAT_Real_GlblAtomics_gfx10<0x059>;
1291defm GLOBAL_ATOMIC_OR_X2 : FLAT_Real_GlblAtomics_gfx10<0x05a>;
1292defm GLOBAL_ATOMIC_XOR_X2 : FLAT_Real_GlblAtomics_gfx10<0x05b>;
1293defm GLOBAL_ATOMIC_INC_X2 : FLAT_Real_GlblAtomics_gfx10<0x05c>;
1294defm GLOBAL_ATOMIC_DEC_X2 : FLAT_Real_GlblAtomics_gfx10<0x05d>;
1295defm GLOBAL_ATOMIC_FCMPSWAP_X2 : FLAT_Real_GlblAtomics_gfx10<0x05e>;
1296defm GLOBAL_ATOMIC_FMIN_X2 : FLAT_Real_GlblAtomics_gfx10<0x05f>;
1297defm GLOBAL_ATOMIC_FMAX_X2 : FLAT_Real_GlblAtomics_gfx10<0x060>;
1298
1299
1300// ENC_FLAT_SCRATCH.
1301defm SCRATCH_LOAD_UBYTE : FLAT_Real_AllAddr_gfx10<0x008>;
1302defm SCRATCH_LOAD_SBYTE : FLAT_Real_AllAddr_gfx10<0x009>;
1303defm SCRATCH_LOAD_USHORT : FLAT_Real_AllAddr_gfx10<0x00a>;
1304defm SCRATCH_LOAD_SSHORT : FLAT_Real_AllAddr_gfx10<0x00b>;
1305defm SCRATCH_LOAD_DWORD : FLAT_Real_AllAddr_gfx10<0x00c>;
1306defm SCRATCH_LOAD_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x00d>;
1307defm SCRATCH_LOAD_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x00e>;
1308defm SCRATCH_LOAD_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x00f>;
1309defm SCRATCH_STORE_BYTE : FLAT_Real_AllAddr_gfx10<0x018>;
1310defm SCRATCH_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x019>;
1311defm SCRATCH_STORE_SHORT : FLAT_Real_AllAddr_gfx10<0x01a>;
1312defm SCRATCH_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x01b>;
1313defm SCRATCH_STORE_DWORD : FLAT_Real_AllAddr_gfx10<0x01c>;
1314defm SCRATCH_STORE_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x01d>;
1315defm SCRATCH_STORE_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x01e>;
1316defm SCRATCH_STORE_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x01f>;
1317defm SCRATCH_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x020>;
1318defm SCRATCH_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x021>;
1319defm SCRATCH_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x022>;
1320defm SCRATCH_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x023>;
1321defm SCRATCH_LOAD_SHORT_D16 : FLAT_Real_AllAddr_gfx10<0x024>;
1322defm SCRATCH_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x025>;