blob: 71cff6a572d50b83689d4a5b18ca38854c7253a3 [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,
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000138 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(
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000143 !con((ins VReg_64:$vaddr),
144 !if(EnableSaddr, (ins SReg_64:$saddr), (ins))),
145 (ins flat_offset:$offset, GLC:$glc, SLC:$slc, DLC:$dlc)),
146 !if(HasTiedOutput, (ins regClass:$vdst_in), (ins))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000147 " $vdst, $vaddr"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$glc$slc$dlc"> {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000148 let has_data = 0;
149 let mayLoad = 1;
Matt Arsenault04004712017-07-20 05:17:54 +0000150 let has_saddr = HasSaddr;
151 let enabled_saddr = EnableSaddr;
152 let PseudoInstr = opName#!if(!and(HasSaddr, EnableSaddr), "_SADDR", "");
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000153 let maybeAtomic = 1;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000154
155 let Constraints = !if(HasTiedOutput, "$vdst = $vdst_in", "");
156 let DisableEncoding = !if(HasTiedOutput, "$vdst_in", "");
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000157}
158
Matt Arsenaultfd023142017-06-12 15:55:58 +0000159class FLAT_Store_Pseudo <string opName, RegisterClass vdataClass,
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000160 bit HasSaddr = 0, bit EnableSaddr = 0> : FLAT_Pseudo<
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000161 opName,
162 (outs),
Matt Arsenault461ed082017-09-08 19:09:13 +0000163 !con(
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000164 !con((ins VReg_64:$vaddr, vdataClass:$vdata),
165 !if(EnableSaddr, (ins SReg_64:$saddr), (ins))),
166 (ins flat_offset:$offset, GLC:$glc, SLC:$slc, DLC:$dlc)),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000167 " $vaddr, $vdata"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$glc$slc$dlc"> {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000168 let mayLoad = 0;
169 let mayStore = 1;
170 let has_vdst = 0;
Matt Arsenault04004712017-07-20 05:17:54 +0000171 let has_saddr = HasSaddr;
172 let enabled_saddr = EnableSaddr;
173 let PseudoInstr = opName#!if(!and(HasSaddr, EnableSaddr), "_SADDR", "");
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000174 let maybeAtomic = 1;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000175}
176
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000177multiclass FLAT_Global_Load_Pseudo<string opName, RegisterClass regClass, bit HasTiedInput = 0> {
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000178 let is_flat_global = 1 in {
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000179 def "" : FLAT_Load_Pseudo<opName, regClass, HasTiedInput, 1>,
Ron Liebermancac749a2018-11-16 01:13:34 +0000180 GlobalSaddrTable<0, opName>;
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000181 def _SADDR : FLAT_Load_Pseudo<opName, regClass, HasTiedInput, 1, 1>,
Ron Liebermancac749a2018-11-16 01:13:34 +0000182 GlobalSaddrTable<1, opName>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000183 }
184}
185
Matt Arsenault04004712017-07-20 05:17:54 +0000186multiclass FLAT_Global_Store_Pseudo<string opName, RegisterClass regClass> {
187 let is_flat_global = 1 in {
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000188 def "" : FLAT_Store_Pseudo<opName, regClass, 1>,
Ron Liebermancac749a2018-11-16 01:13:34 +0000189 GlobalSaddrTable<0, opName>;
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000190 def _SADDR : FLAT_Store_Pseudo<opName, regClass, 1, 1>,
Ron Liebermancac749a2018-11-16 01:13:34 +0000191 GlobalSaddrTable<1, opName>;
Matt Arsenault04004712017-07-20 05:17:54 +0000192 }
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000193}
194
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000195class FLAT_Scratch_Load_Pseudo <string opName, RegisterClass regClass,
196 bit EnableSaddr = 0>: FLAT_Pseudo<
197 opName,
198 (outs regClass:$vdst),
199 !if(EnableSaddr,
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000200 (ins SReg_32_XEXEC_HI:$saddr, flat_offset:$offset, GLC:$glc, SLC:$slc, DLC:$dlc),
201 (ins VGPR_32:$vaddr, flat_offset:$offset, GLC:$glc, SLC:$slc, DLC:$dlc)),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000202 " $vdst, "#!if(EnableSaddr, "off", "$vaddr")#!if(EnableSaddr, ", $saddr", ", off")#"$offset$glc$slc$dlc"> {
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000203 let has_data = 0;
204 let mayLoad = 1;
205 let has_saddr = 1;
206 let enabled_saddr = EnableSaddr;
207 let has_vaddr = !if(EnableSaddr, 0, 1);
208 let PseudoInstr = opName#!if(EnableSaddr, "_SADDR", "");
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000209 let maybeAtomic = 1;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000210}
211
212class FLAT_Scratch_Store_Pseudo <string opName, RegisterClass vdataClass, bit EnableSaddr = 0> : FLAT_Pseudo<
213 opName,
214 (outs),
215 !if(EnableSaddr,
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000216 (ins vdataClass:$vdata, SReg_32_XEXEC_HI:$saddr, flat_offset:$offset, GLC:$glc, SLC:$slc, DLC:$dlc),
217 (ins vdataClass:$vdata, VGPR_32:$vaddr, flat_offset:$offset, GLC:$glc, SLC:$slc, DLC:$dlc)),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000218 " "#!if(EnableSaddr, "off", "$vaddr")#", $vdata, "#!if(EnableSaddr, "$saddr", "off")#"$offset$glc$slc$dlc"> {
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000219 let mayLoad = 0;
220 let mayStore = 1;
221 let has_vdst = 0;
222 let has_saddr = 1;
223 let enabled_saddr = EnableSaddr;
224 let has_vaddr = !if(EnableSaddr, 0, 1);
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000225 let PseudoInstr = opName#!if(EnableSaddr, "_SADDR", "");
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000226 let maybeAtomic = 1;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000227}
228
229multiclass FLAT_Scratch_Load_Pseudo<string opName, RegisterClass regClass> {
230 let is_flat_scratch = 1 in {
231 def "" : FLAT_Scratch_Load_Pseudo<opName, regClass>;
232 def _SADDR : FLAT_Scratch_Load_Pseudo<opName, regClass, 1>;
233 }
234}
235
236multiclass FLAT_Scratch_Store_Pseudo<string opName, RegisterClass regClass> {
237 let is_flat_scratch = 1 in {
238 def "" : FLAT_Scratch_Store_Pseudo<opName, regClass>;
239 def _SADDR : FLAT_Scratch_Store_Pseudo<opName, regClass, 1>;
240 }
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000241}
242
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000243class FLAT_AtomicNoRet_Pseudo<string opName, dag outs, dag ins,
244 string asm, list<dag> pattern = []> :
245 FLAT_Pseudo<opName, outs, ins, asm, pattern> {
246 let mayLoad = 1;
247 let mayStore = 1;
248 let has_glc = 0;
249 let glcValue = 0;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000250 let has_dlc = 0;
251 let dlcValue = 0;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000252 let has_vdst = 0;
Konstantin Zhuravlyov070d88e2017-07-21 21:05:45 +0000253 let maybeAtomic = 1;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000254}
255
256class FLAT_AtomicRet_Pseudo<string opName, dag outs, dag ins,
257 string asm, list<dag> pattern = []>
258 : FLAT_AtomicNoRet_Pseudo<opName, outs, ins, asm, pattern> {
259 let hasPostISelHook = 1;
260 let has_vdst = 1;
261 let glcValue = 1;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000262 let dlcValue = 0;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000263 let PseudoInstr = NAME # "_RTN";
264}
265
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000266multiclass FLAT_Atomic_Pseudo<
267 string opName,
268 RegisterClass vdst_rc,
269 ValueType vt,
270 SDPatternOperator atomic = null_frag,
271 ValueType data_vt = vt,
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000272 RegisterClass data_rc = vdst_rc,
Stanislav Mekhanoshinbefab662019-10-17 21:46:56 +0000273 bit isFP = isFloatType<data_vt>.ret> {
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000274 def "" : FLAT_AtomicNoRet_Pseudo <opName,
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000275 (outs),
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000276 (ins VReg_64:$vaddr, data_rc:$vdata, flat_offset:$offset, SLC:$slc),
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000277 " $vaddr, $vdata$offset$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000278 GlobalSaddrTable<0, opName>,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000279 AtomicNoRet <opName, 0> {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000280 let PseudoInstr = NAME;
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000281 let FPAtomic = isFP;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000282 }
283
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000284 def _RTN : FLAT_AtomicRet_Pseudo <opName,
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000285 (outs vdst_rc:$vdst),
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000286 (ins VReg_64:$vaddr, data_rc:$vdata, flat_offset:$offset, SLC:$slc),
Matt Arsenaultfd023142017-06-12 15:55:58 +0000287 " $vdst, $vaddr, $vdata$offset glc$slc",
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000288 [(set vt:$vdst,
Matt Arsenaultfd023142017-06-12 15:55:58 +0000289 (atomic (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$vdata))]>,
Ron Liebermancac749a2018-11-16 01:13:34 +0000290 GlobalSaddrTable<0, opName#"_rtn">,
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000291 AtomicNoRet <opName, 1>{
292 let FPAtomic = isFP;
293 }
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000294}
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,
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000302 RegisterClass data_rc = vdst_rc,
Stanislav Mekhanoshinbefab662019-10-17 21:46:56 +0000303 bit isFP = isFloatType<data_vt>.ret> {
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000304
305 def "" : FLAT_AtomicNoRet_Pseudo <opName,
306 (outs),
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000307 (ins VReg_64:$vaddr, data_rc:$vdata, flat_offset:$offset, SLC:$slc),
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000308 " $vaddr, $vdata, off$offset$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000309 GlobalSaddrTable<0, opName>,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000310 AtomicNoRet <opName, 0> {
311 let has_saddr = 1;
312 let PseudoInstr = NAME;
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000313 let FPAtomic = isFP;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000314 }
315
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000316 def _SADDR : FLAT_AtomicNoRet_Pseudo <opName,
317 (outs),
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000318 (ins VReg_64:$vaddr, data_rc:$vdata, SReg_64:$saddr, flat_offset:$offset, SLC:$slc),
Dmitry Preobrazhensky16608e62017-11-27 17:14:35 +0000319 " $vaddr, $vdata, $saddr$offset$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000320 GlobalSaddrTable<1, opName>,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000321 AtomicNoRet <opName#"_saddr", 0> {
322 let has_saddr = 1;
323 let enabled_saddr = 1;
324 let PseudoInstr = NAME#"_SADDR";
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000325 let FPAtomic = isFP;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000326 }
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000327}
328
329multiclass FLAT_Global_Atomic_Pseudo_RTN<
330 string opName,
331 RegisterClass vdst_rc,
332 ValueType vt,
333 SDPatternOperator atomic = null_frag,
334 ValueType data_vt = vt,
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000335 RegisterClass data_rc = vdst_rc,
Stanislav Mekhanoshinbefab662019-10-17 21:46:56 +0000336 bit isFP = isFloatType<data_vt>.ret> {
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000337
338 def _RTN : FLAT_AtomicRet_Pseudo <opName,
339 (outs vdst_rc:$vdst),
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000340 (ins VReg_64:$vaddr, data_rc:$vdata, flat_offset:$offset, SLC:$slc),
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000341 " $vdst, $vaddr, $vdata, off$offset glc$slc",
342 [(set vt:$vdst,
343 (atomic (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$vdata))]>,
Ron Liebermancac749a2018-11-16 01:13:34 +0000344 GlobalSaddrTable<0, opName#"_rtn">,
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000345 AtomicNoRet <opName, 1> {
346 let has_saddr = 1;
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000347 let FPAtomic = isFP;
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000348 }
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000349
350 def _SADDR_RTN : FLAT_AtomicRet_Pseudo <opName,
351 (outs vdst_rc:$vdst),
Dmitry Preobrazhensky2eff0312019-07-08 14:27:37 +0000352 (ins VReg_64:$vaddr, data_rc:$vdata, SReg_64:$saddr, flat_offset:$offset, SLC:$slc),
Dmitry Preobrazhensky16608e62017-11-27 17:14:35 +0000353 " $vdst, $vaddr, $vdata, $saddr$offset glc$slc">,
Ron Liebermancac749a2018-11-16 01:13:34 +0000354 GlobalSaddrTable<1, opName#"_rtn">,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000355 AtomicNoRet <opName#"_saddr", 1> {
356 let has_saddr = 1;
357 let enabled_saddr = 1;
358 let PseudoInstr = NAME#"_SADDR_RTN";
Stanislav Mekhanoshinbdf7f812019-06-21 16:30:14 +0000359 let FPAtomic = isFP;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000360 }
361}
362
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000363multiclass FLAT_Global_Atomic_Pseudo<
364 string opName,
365 RegisterClass vdst_rc,
366 ValueType vt,
Matt Arsenaulte16a7132019-08-29 14:53:17 -0400367 SDPatternOperator atomic_rtn = null_frag,
368 SDPatternOperator atomic_no_rtn = null_frag,
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000369 ValueType data_vt = vt,
370 RegisterClass data_rc = vdst_rc> :
Matt Arsenaulte16a7132019-08-29 14:53:17 -0400371 FLAT_Global_Atomic_Pseudo_NO_RTN<opName, vdst_rc, vt, atomic_no_rtn, data_vt, data_rc>,
372 FLAT_Global_Atomic_Pseudo_RTN<opName, vdst_rc, vt, atomic_rtn, data_vt, data_rc>;
Konstantin Zhuravlyov15e90e32018-11-07 21:42:13 +0000373
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000374
375//===----------------------------------------------------------------------===//
376// Flat Instructions
377//===----------------------------------------------------------------------===//
378
379def FLAT_LOAD_UBYTE : FLAT_Load_Pseudo <"flat_load_ubyte", VGPR_32>;
380def FLAT_LOAD_SBYTE : FLAT_Load_Pseudo <"flat_load_sbyte", VGPR_32>;
381def FLAT_LOAD_USHORT : FLAT_Load_Pseudo <"flat_load_ushort", VGPR_32>;
382def FLAT_LOAD_SSHORT : FLAT_Load_Pseudo <"flat_load_sshort", VGPR_32>;
383def FLAT_LOAD_DWORD : FLAT_Load_Pseudo <"flat_load_dword", VGPR_32>;
384def FLAT_LOAD_DWORDX2 : FLAT_Load_Pseudo <"flat_load_dwordx2", VReg_64>;
385def FLAT_LOAD_DWORDX4 : FLAT_Load_Pseudo <"flat_load_dwordx4", VReg_128>;
386def FLAT_LOAD_DWORDX3 : FLAT_Load_Pseudo <"flat_load_dwordx3", VReg_96>;
387
388def FLAT_STORE_BYTE : FLAT_Store_Pseudo <"flat_store_byte", VGPR_32>;
389def FLAT_STORE_SHORT : FLAT_Store_Pseudo <"flat_store_short", VGPR_32>;
390def FLAT_STORE_DWORD : FLAT_Store_Pseudo <"flat_store_dword", VGPR_32>;
391def FLAT_STORE_DWORDX2 : FLAT_Store_Pseudo <"flat_store_dwordx2", VReg_64>;
392def FLAT_STORE_DWORDX4 : FLAT_Store_Pseudo <"flat_store_dwordx4", VReg_128>;
393def FLAT_STORE_DWORDX3 : FLAT_Store_Pseudo <"flat_store_dwordx3", VReg_96>;
394
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000395let SubtargetPredicate = HasD16LoadStore in {
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000396def FLAT_LOAD_UBYTE_D16 : FLAT_Load_Pseudo <"flat_load_ubyte_d16", VGPR_32, 1>;
397def FLAT_LOAD_UBYTE_D16_HI : FLAT_Load_Pseudo <"flat_load_ubyte_d16_hi", VGPR_32, 1>;
398def FLAT_LOAD_SBYTE_D16 : FLAT_Load_Pseudo <"flat_load_sbyte_d16", VGPR_32, 1>;
399def FLAT_LOAD_SBYTE_D16_HI : FLAT_Load_Pseudo <"flat_load_sbyte_d16_hi", VGPR_32, 1>;
400def FLAT_LOAD_SHORT_D16 : FLAT_Load_Pseudo <"flat_load_short_d16", VGPR_32, 1>;
401def FLAT_LOAD_SHORT_D16_HI : FLAT_Load_Pseudo <"flat_load_short_d16_hi", VGPR_32, 1>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000402
403def FLAT_STORE_BYTE_D16_HI : FLAT_Store_Pseudo <"flat_store_byte_d16_hi", VGPR_32>;
404def FLAT_STORE_SHORT_D16_HI : FLAT_Store_Pseudo <"flat_store_short_d16_hi", VGPR_32>;
405}
406
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000407defm FLAT_ATOMIC_CMPSWAP : FLAT_Atomic_Pseudo <"flat_atomic_cmpswap",
Matt Arsenault171cf532019-10-08 10:04:41 -0700408 VGPR_32, i32, AMDGPUatomic_cmp_swap_flat_32,
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000409 v2i32, VReg_64>;
410
411defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_cmpswap_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700412 VReg_64, i64, AMDGPUatomic_cmp_swap_flat_64,
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000413 v2i64, VReg_128>;
414
415defm FLAT_ATOMIC_SWAP : FLAT_Atomic_Pseudo <"flat_atomic_swap",
Matt Arsenault171cf532019-10-08 10:04:41 -0700416 VGPR_32, i32, atomic_swap_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000417
418defm FLAT_ATOMIC_SWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_swap_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700419 VReg_64, i64, atomic_swap_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000420
421defm FLAT_ATOMIC_ADD : FLAT_Atomic_Pseudo <"flat_atomic_add",
Matt Arsenault171cf532019-10-08 10:04:41 -0700422 VGPR_32, i32, atomic_load_add_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000423
424defm FLAT_ATOMIC_SUB : FLAT_Atomic_Pseudo <"flat_atomic_sub",
Matt Arsenault171cf532019-10-08 10:04:41 -0700425 VGPR_32, i32, atomic_load_sub_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000426
427defm FLAT_ATOMIC_SMIN : FLAT_Atomic_Pseudo <"flat_atomic_smin",
Matt Arsenault171cf532019-10-08 10:04:41 -0700428 VGPR_32, i32, atomic_load_min_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000429
430defm FLAT_ATOMIC_UMIN : FLAT_Atomic_Pseudo <"flat_atomic_umin",
Matt Arsenault171cf532019-10-08 10:04:41 -0700431 VGPR_32, i32, atomic_load_umin_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000432
433defm FLAT_ATOMIC_SMAX : FLAT_Atomic_Pseudo <"flat_atomic_smax",
Matt Arsenault171cf532019-10-08 10:04:41 -0700434 VGPR_32, i32, atomic_load_max_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000435
436defm FLAT_ATOMIC_UMAX : FLAT_Atomic_Pseudo <"flat_atomic_umax",
Matt Arsenault171cf532019-10-08 10:04:41 -0700437 VGPR_32, i32, atomic_load_umax_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000438
439defm FLAT_ATOMIC_AND : FLAT_Atomic_Pseudo <"flat_atomic_and",
Matt Arsenault171cf532019-10-08 10:04:41 -0700440 VGPR_32, i32, atomic_load_and_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000441
442defm FLAT_ATOMIC_OR : FLAT_Atomic_Pseudo <"flat_atomic_or",
Matt Arsenault171cf532019-10-08 10:04:41 -0700443 VGPR_32, i32, atomic_load_or_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000444
445defm FLAT_ATOMIC_XOR : FLAT_Atomic_Pseudo <"flat_atomic_xor",
Matt Arsenault171cf532019-10-08 10:04:41 -0700446 VGPR_32, i32, atomic_load_xor_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000447
448defm FLAT_ATOMIC_INC : FLAT_Atomic_Pseudo <"flat_atomic_inc",
Matt Arsenault171cf532019-10-08 10:04:41 -0700449 VGPR_32, i32, atomic_inc_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000450
451defm FLAT_ATOMIC_DEC : FLAT_Atomic_Pseudo <"flat_atomic_dec",
Matt Arsenault171cf532019-10-08 10:04:41 -0700452 VGPR_32, i32, atomic_dec_flat_32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000453
454defm FLAT_ATOMIC_ADD_X2 : FLAT_Atomic_Pseudo <"flat_atomic_add_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700455 VReg_64, i64, atomic_load_add_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000456
457defm FLAT_ATOMIC_SUB_X2 : FLAT_Atomic_Pseudo <"flat_atomic_sub_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700458 VReg_64, i64, atomic_load_sub_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000459
460defm FLAT_ATOMIC_SMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_smin_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700461 VReg_64, i64, atomic_load_min_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000462
463defm FLAT_ATOMIC_UMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_umin_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700464 VReg_64, i64, atomic_load_umin_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000465
466defm FLAT_ATOMIC_SMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_smax_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700467 VReg_64, i64, atomic_load_max_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000468
469defm FLAT_ATOMIC_UMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_umax_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700470 VReg_64, i64, atomic_load_umax_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000471
472defm FLAT_ATOMIC_AND_X2 : FLAT_Atomic_Pseudo <"flat_atomic_and_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700473 VReg_64, i64, atomic_load_and_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000474
475defm FLAT_ATOMIC_OR_X2 : FLAT_Atomic_Pseudo <"flat_atomic_or_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700476 VReg_64, i64, atomic_load_or_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000477
478defm FLAT_ATOMIC_XOR_X2 : FLAT_Atomic_Pseudo <"flat_atomic_xor_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700479 VReg_64, i64, atomic_load_xor_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000480
481defm FLAT_ATOMIC_INC_X2 : FLAT_Atomic_Pseudo <"flat_atomic_inc_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700482 VReg_64, i64, atomic_inc_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000483
484defm FLAT_ATOMIC_DEC_X2 : FLAT_Atomic_Pseudo <"flat_atomic_dec_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700485 VReg_64, i64, atomic_dec_flat_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000486
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000487// GFX7-, GFX10-only flat instructions.
488let SubtargetPredicate = isGFX7GFX10 in {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000489
490defm FLAT_ATOMIC_FCMPSWAP : FLAT_Atomic_Pseudo <"flat_atomic_fcmpswap",
491 VGPR_32, f32, null_frag, v2f32, VReg_64>;
492
493defm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fcmpswap_x2",
494 VReg_64, f64, null_frag, v2f64, VReg_128>;
495
496defm FLAT_ATOMIC_FMIN : FLAT_Atomic_Pseudo <"flat_atomic_fmin",
497 VGPR_32, f32>;
498
499defm FLAT_ATOMIC_FMAX : FLAT_Atomic_Pseudo <"flat_atomic_fmax",
500 VGPR_32, f32>;
501
502defm FLAT_ATOMIC_FMIN_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fmin_x2",
503 VReg_64, f64>;
504
505defm FLAT_ATOMIC_FMAX_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fmax_x2",
506 VReg_64, f64>;
507
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000508} // End SubtargetPredicate = isGFX7GFX10
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000509
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000510let SubtargetPredicate = HasFlatGlobalInsts in {
Matt Arsenault04004712017-07-20 05:17:54 +0000511defm GLOBAL_LOAD_UBYTE : FLAT_Global_Load_Pseudo <"global_load_ubyte", VGPR_32>;
512defm GLOBAL_LOAD_SBYTE : FLAT_Global_Load_Pseudo <"global_load_sbyte", VGPR_32>;
513defm GLOBAL_LOAD_USHORT : FLAT_Global_Load_Pseudo <"global_load_ushort", VGPR_32>;
514defm GLOBAL_LOAD_SSHORT : FLAT_Global_Load_Pseudo <"global_load_sshort", VGPR_32>;
515defm GLOBAL_LOAD_DWORD : FLAT_Global_Load_Pseudo <"global_load_dword", VGPR_32>;
516defm GLOBAL_LOAD_DWORDX2 : FLAT_Global_Load_Pseudo <"global_load_dwordx2", VReg_64>;
517defm GLOBAL_LOAD_DWORDX3 : FLAT_Global_Load_Pseudo <"global_load_dwordx3", VReg_96>;
518defm GLOBAL_LOAD_DWORDX4 : FLAT_Global_Load_Pseudo <"global_load_dwordx4", VReg_128>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000519
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000520defm GLOBAL_LOAD_UBYTE_D16 : FLAT_Global_Load_Pseudo <"global_load_ubyte_d16", VGPR_32, 1>;
521defm GLOBAL_LOAD_UBYTE_D16_HI : FLAT_Global_Load_Pseudo <"global_load_ubyte_d16_hi", VGPR_32, 1>;
522defm GLOBAL_LOAD_SBYTE_D16 : FLAT_Global_Load_Pseudo <"global_load_sbyte_d16", VGPR_32, 1>;
523defm GLOBAL_LOAD_SBYTE_D16_HI : FLAT_Global_Load_Pseudo <"global_load_sbyte_d16_hi", VGPR_32, 1>;
524defm GLOBAL_LOAD_SHORT_D16 : FLAT_Global_Load_Pseudo <"global_load_short_d16", VGPR_32, 1>;
525defm GLOBAL_LOAD_SHORT_D16_HI : FLAT_Global_Load_Pseudo <"global_load_short_d16_hi", VGPR_32, 1>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000526
Matt Arsenault04004712017-07-20 05:17:54 +0000527defm GLOBAL_STORE_BYTE : FLAT_Global_Store_Pseudo <"global_store_byte", VGPR_32>;
528defm GLOBAL_STORE_SHORT : FLAT_Global_Store_Pseudo <"global_store_short", VGPR_32>;
529defm GLOBAL_STORE_DWORD : FLAT_Global_Store_Pseudo <"global_store_dword", VGPR_32>;
530defm GLOBAL_STORE_DWORDX2 : FLAT_Global_Store_Pseudo <"global_store_dwordx2", VReg_64>;
531defm GLOBAL_STORE_DWORDX3 : FLAT_Global_Store_Pseudo <"global_store_dwordx3", VReg_96>;
532defm GLOBAL_STORE_DWORDX4 : FLAT_Global_Store_Pseudo <"global_store_dwordx4", VReg_128>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000533
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000534defm GLOBAL_STORE_BYTE_D16_HI : FLAT_Global_Store_Pseudo <"global_store_byte_d16_hi", VGPR_32>;
535defm GLOBAL_STORE_SHORT_D16_HI : FLAT_Global_Store_Pseudo <"global_store_short_d16_hi", VGPR_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000536
537let is_flat_global = 1 in {
538defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Global_Atomic_Pseudo <"global_atomic_cmpswap",
Matt Arsenaulte16a7132019-08-29 14:53:17 -0400539 VGPR_32, i32, AMDGPUatomic_cmp_swap_global_32, null_frag,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000540 v2i32, VReg_64>;
541
542defm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_cmpswap_x2",
Matt Arsenault171cf532019-10-08 10:04:41 -0700543 VReg_64, i64, AMDGPUatomic_cmp_swap_global_64,
Matt Arsenaulte16a7132019-08-29 14:53:17 -0400544 null_frag,
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000545 v2i64, VReg_128>;
546
547defm GLOBAL_ATOMIC_SWAP : FLAT_Global_Atomic_Pseudo <"global_atomic_swap",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000548 VGPR_32, i32, atomic_swap_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000549
550defm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_swap_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000551 VReg_64, i64, atomic_swap_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000552
553defm GLOBAL_ATOMIC_ADD : FLAT_Global_Atomic_Pseudo <"global_atomic_add",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000554 VGPR_32, i32, atomic_load_add_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000555
556defm GLOBAL_ATOMIC_SUB : FLAT_Global_Atomic_Pseudo <"global_atomic_sub",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000557 VGPR_32, i32, atomic_load_sub_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000558
559defm GLOBAL_ATOMIC_SMIN : FLAT_Global_Atomic_Pseudo <"global_atomic_smin",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000560 VGPR_32, i32, atomic_load_min_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000561
562defm GLOBAL_ATOMIC_UMIN : FLAT_Global_Atomic_Pseudo <"global_atomic_umin",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000563 VGPR_32, i32, atomic_load_umin_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000564
565defm GLOBAL_ATOMIC_SMAX : FLAT_Global_Atomic_Pseudo <"global_atomic_smax",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000566 VGPR_32, i32, atomic_load_max_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000567
568defm GLOBAL_ATOMIC_UMAX : FLAT_Global_Atomic_Pseudo <"global_atomic_umax",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000569 VGPR_32, i32, atomic_load_umax_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000570
571defm GLOBAL_ATOMIC_AND : FLAT_Global_Atomic_Pseudo <"global_atomic_and",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000572 VGPR_32, i32, atomic_load_and_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000573
574defm GLOBAL_ATOMIC_OR : FLAT_Global_Atomic_Pseudo <"global_atomic_or",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000575 VGPR_32, i32, atomic_load_or_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000576
577defm GLOBAL_ATOMIC_XOR : FLAT_Global_Atomic_Pseudo <"global_atomic_xor",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000578 VGPR_32, i32, atomic_load_xor_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000579
580defm GLOBAL_ATOMIC_INC : FLAT_Global_Atomic_Pseudo <"global_atomic_inc",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000581 VGPR_32, i32, atomic_inc_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000582
583defm GLOBAL_ATOMIC_DEC : FLAT_Global_Atomic_Pseudo <"global_atomic_dec",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000584 VGPR_32, i32, atomic_dec_global_32>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000585
586defm GLOBAL_ATOMIC_ADD_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_add_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000587 VReg_64, i64, atomic_load_add_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000588
589defm GLOBAL_ATOMIC_SUB_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_sub_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000590 VReg_64, i64, atomic_load_sub_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000591
592defm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_smin_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000593 VReg_64, i64, atomic_load_min_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000594
595defm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_umin_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000596 VReg_64, i64, atomic_load_umin_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000597
598defm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_smax_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000599 VReg_64, i64, atomic_load_max_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000600
601defm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_umax_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000602 VReg_64, i64, atomic_load_umax_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000603
604defm GLOBAL_ATOMIC_AND_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_and_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000605 VReg_64, i64, atomic_load_and_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000606
607defm GLOBAL_ATOMIC_OR_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_or_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000608 VReg_64, i64, atomic_load_or_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000609
610defm GLOBAL_ATOMIC_XOR_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_xor_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000611 VReg_64, i64, atomic_load_xor_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000612
613defm GLOBAL_ATOMIC_INC_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_inc_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000614 VReg_64, i64, atomic_inc_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000615
616defm GLOBAL_ATOMIC_DEC_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_dec_x2",
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000617 VReg_64, i64, atomic_dec_global_64>;
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +0000618} // End is_flat_global = 1
619
Matt Arsenault9698f1c2017-06-20 19:54:14 +0000620} // End SubtargetPredicate = HasFlatGlobalInsts
621
622
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000623let SubtargetPredicate = HasFlatScratchInsts in {
624defm SCRATCH_LOAD_UBYTE : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte", VGPR_32>;
625defm SCRATCH_LOAD_SBYTE : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte", VGPR_32>;
626defm SCRATCH_LOAD_USHORT : FLAT_Scratch_Load_Pseudo <"scratch_load_ushort", VGPR_32>;
627defm SCRATCH_LOAD_SSHORT : FLAT_Scratch_Load_Pseudo <"scratch_load_sshort", VGPR_32>;
628defm SCRATCH_LOAD_DWORD : FLAT_Scratch_Load_Pseudo <"scratch_load_dword", VGPR_32>;
629defm SCRATCH_LOAD_DWORDX2 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx2", VReg_64>;
630defm SCRATCH_LOAD_DWORDX3 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx3", VReg_96>;
631defm SCRATCH_LOAD_DWORDX4 : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx4", VReg_128>;
632
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000633defm SCRATCH_LOAD_UBYTE_D16 : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte_d16", VGPR_32>;
634defm SCRATCH_LOAD_UBYTE_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte_d16_hi", VGPR_32>;
635defm SCRATCH_LOAD_SBYTE_D16 : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte_d16", VGPR_32>;
636defm SCRATCH_LOAD_SBYTE_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte_d16_hi", VGPR_32>;
637defm SCRATCH_LOAD_SHORT_D16 : FLAT_Scratch_Load_Pseudo <"scratch_load_short_d16", VGPR_32>;
638defm SCRATCH_LOAD_SHORT_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_short_d16_hi", VGPR_32>;
639
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000640defm SCRATCH_STORE_BYTE : FLAT_Scratch_Store_Pseudo <"scratch_store_byte", VGPR_32>;
641defm SCRATCH_STORE_SHORT : FLAT_Scratch_Store_Pseudo <"scratch_store_short", VGPR_32>;
642defm SCRATCH_STORE_DWORD : FLAT_Scratch_Store_Pseudo <"scratch_store_dword", VGPR_32>;
643defm SCRATCH_STORE_DWORDX2 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx2", VReg_64>;
644defm SCRATCH_STORE_DWORDX3 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx3", VReg_96>;
645defm SCRATCH_STORE_DWORDX4 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx4", VReg_128>;
646
Matt Arsenaulted6e8f02017-09-01 18:36:06 +0000647defm SCRATCH_STORE_BYTE_D16_HI : FLAT_Scratch_Store_Pseudo <"scratch_store_byte_d16_hi", VGPR_32>;
648defm SCRATCH_STORE_SHORT_D16_HI : FLAT_Scratch_Store_Pseudo <"scratch_store_short_d16_hi", VGPR_32>;
649
Matt Arsenaultca7b0a12017-07-21 15:36:16 +0000650} // End SubtargetPredicate = HasFlatScratchInsts
651
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000652let SubtargetPredicate = isGFX10Plus, is_flat_global = 1 in {
653 defm GLOBAL_ATOMIC_FCMPSWAP :
654 FLAT_Global_Atomic_Pseudo<"global_atomic_fcmpswap", VGPR_32, f32>;
655 defm GLOBAL_ATOMIC_FMIN :
656 FLAT_Global_Atomic_Pseudo<"global_atomic_fmin", VGPR_32, f32>;
657 defm GLOBAL_ATOMIC_FMAX :
658 FLAT_Global_Atomic_Pseudo<"global_atomic_fmax", VGPR_32, f32>;
659 defm GLOBAL_ATOMIC_FCMPSWAP_X2 :
660 FLAT_Global_Atomic_Pseudo<"global_atomic_fcmpswap_x2", VReg_64, f64>;
661 defm GLOBAL_ATOMIC_FMIN_X2 :
662 FLAT_Global_Atomic_Pseudo<"global_atomic_fmin_x2", VReg_64, f64>;
663 defm GLOBAL_ATOMIC_FMAX_X2 :
664 FLAT_Global_Atomic_Pseudo<"global_atomic_fmax_x2", VReg_64, f64>;
665} // End SubtargetPredicate = isGFX10Plus, is_flat_global = 1
666
Stanislav Mekhanoshine93279f2019-07-11 00:10:17 +0000667let SubtargetPredicate = HasAtomicFaddInsts, is_flat_global = 1 in {
668
669defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_NO_RTN <
Matt Arsenault70e20c02019-08-01 03:22:40 +0000670 "global_atomic_add_f32", VGPR_32, f32, atomic_fadd_global_noret
Stanislav Mekhanoshine93279f2019-07-11 00:10:17 +0000671>;
672defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_NO_RTN <
Matt Arsenault70e20c02019-08-01 03:22:40 +0000673 "global_atomic_pk_add_f16", VGPR_32, v2f16, atomic_pk_fadd_global_noret
Stanislav Mekhanoshine93279f2019-07-11 00:10:17 +0000674>;
675
676} // End SubtargetPredicate = HasAtomicFaddInsts
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000677
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000678//===----------------------------------------------------------------------===//
679// Flat Patterns
680//===----------------------------------------------------------------------===//
681
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000682// Patterns for global loads with no offset.
Matt Arsenault90c75932017-10-03 00:06:41 +0000683class FlatLoadPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000684 (vt (node (FLATOffset i64:$vaddr, i16:$offset, i1:$slc))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000685 (inst $vaddr, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000686>;
687
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000688class FlatLoadPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault7eb19022019-07-16 18:26:42 +0000689 (node (FLATOffset (i64 VReg_64:$vaddr), i16:$offset, i1:$slc), vt:$in),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000690 (inst $vaddr, $offset, 0, 0, $slc, $in)
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000691>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000692
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000693class FlatSignedLoadPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault7eb19022019-07-16 18:26:42 +0000694 (node (FLATOffsetSigned (i64 VReg_64:$vaddr), i16:$offset, i1:$slc), vt:$in),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000695 (inst $vaddr, $offset, 0, 0, $slc, $in)
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000696>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000697
Matt Arsenault90c75932017-10-03 00:06:41 +0000698class FlatLoadAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault7eb19022019-07-16 18:26:42 +0000699 (vt (node (FLATAtomic (i64 VReg_64:$vaddr), i16:$offset, i1:$slc))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000700 (inst $vaddr, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000701>;
702
Matt Arsenault90c75932017-10-03 00:06:41 +0000703class FlatLoadSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
Matt Arsenault7eb19022019-07-16 18:26:42 +0000704 (vt (node (FLATOffsetSigned (i64 VReg_64:$vaddr), i16:$offset, i1:$slc))),
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +0000705 (inst $vaddr, $offset, 0, 0, $slc)
Matt Arsenault4e309b02017-07-29 01:03:53 +0000706>;
707
Matt Arsenault7eb19022019-07-16 18:26:42 +0000708class FlatStorePat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt, RegisterClass rc = VGPR_32> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000709 (node vt:$data, (FLATOffset i64:$vaddr, i16:$offset, i1:$slc)),
Matt Arsenault7eb19022019-07-16 18:26:42 +0000710 (inst $vaddr, rc:$data, $offset, 0, 0, $slc)
Matt Arsenault4e309b02017-07-29 01:03:53 +0000711>;
712
Matt Arsenault7eb19022019-07-16 18:26:42 +0000713class FlatStoreSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt, RegisterClass rc = VGPR_32> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000714 (node vt:$data, (FLATOffsetSigned i64:$vaddr, i16:$offset, i1:$slc)),
Matt Arsenault7eb19022019-07-16 18:26:42 +0000715 (inst $vaddr, rc:$data, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000716>;
717
Matt Arsenault7eb19022019-07-16 18:26:42 +0000718class FlatStoreAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt, RegisterClass rc = VGPR_32> : GCNPat <
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000719 // atomic store follows atomic binop convention so the address comes
720 // first.
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000721 (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), vt:$data),
Matt Arsenault7eb19022019-07-16 18:26:42 +0000722 (inst $vaddr, rc:$data, $offset, 0, 0, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000723>;
724
Matt Arsenault7eb19022019-07-16 18:26:42 +0000725class FlatStoreSignedAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt, RegisterClass rc = VGPR_32> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000726 // atomic store follows atomic binop convention so the address comes
727 // first.
728 (node (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), vt:$data),
Matt Arsenault7eb19022019-07-16 18:26:42 +0000729 (inst $vaddr, rc:$data, $offset, 0, 0, $slc)
Matt Arsenault4e309b02017-07-29 01:03:53 +0000730>;
731
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000732class FlatAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt,
Matt Arsenault90c75932017-10-03 00:06:41 +0000733 ValueType data_vt = vt> : GCNPat <
Matt Arsenaultdb7c6a82017-06-12 16:53:51 +0000734 (vt (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$data)),
735 (inst $vaddr, $data, $offset, $slc)
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000736>;
737
Stanislav Mekhanoshine93279f2019-07-11 00:10:17 +0000738class FlatAtomicPatNoRtn <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
739 (node (FLATAtomic i64:$vaddr, i16:$offset, i1:$slc), vt:$data),
740 (inst $vaddr, $data, $offset, $slc)
741>;
742
Matt Arsenault4e309b02017-07-29 01:03:53 +0000743class FlatSignedAtomicPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt,
Matt Arsenault90c75932017-10-03 00:06:41 +0000744 ValueType data_vt = vt> : GCNPat <
Matt Arsenault4e309b02017-07-29 01:03:53 +0000745 (vt (node (FLATSignedAtomic i64:$vaddr, i16:$offset, i1:$slc), data_vt:$data)),
746 (inst $vaddr, $data, $offset, $slc)
747>;
748
Matt Arsenault90c75932017-10-03 00:06:41 +0000749let OtherPredicates = [HasFlatAddressSpace] in {
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000750
Matt Arsenault1739b702019-07-16 02:46:05 +0000751def : FlatLoadPat <FLAT_LOAD_UBYTE, extloadi8_flat, i32>;
752def : FlatLoadPat <FLAT_LOAD_UBYTE, zextloadi8_flat, i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000753def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i32>;
Matt Arsenault1739b702019-07-16 02:46:05 +0000754def : FlatLoadPat <FLAT_LOAD_UBYTE, extloadi8_flat, i16>;
755def : FlatLoadPat <FLAT_LOAD_UBYTE, zextloadi8_flat, i16>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000756def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i16>;
Matt Arsenault1739b702019-07-16 02:46:05 +0000757def : FlatLoadPat <FLAT_LOAD_USHORT, extloadi16_flat, i32>;
758def : FlatLoadPat <FLAT_LOAD_USHORT, zextloadi16_flat, i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000759def : FlatLoadPat <FLAT_LOAD_USHORT, load_flat, i16>;
760def : FlatLoadPat <FLAT_LOAD_SSHORT, sextloadi16_flat, i32>;
Tim Renouf361b5b22019-03-21 12:01:21 +0000761def : FlatLoadPat <FLAT_LOAD_DWORDX3, load_flat, v3i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000762def : FlatLoadPat <FLAT_LOAD_DWORDX4, load_flat, v4i32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000763
Matt Arsenaultc6fd5ab2019-07-16 17:38:50 +0000764def : FlatLoadAtomicPat <FLAT_LOAD_DWORD, atomic_load_32_flat, i32>;
765def : FlatLoadAtomicPat <FLAT_LOAD_DWORDX2, atomic_load_64_flat, i64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000766
Matt Arsenaultbc683832017-09-20 03:43:35 +0000767def : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i32>;
768def : FlatStorePat <FLAT_STORE_SHORT, truncstorei16_flat, i32>;
Matt Arsenault57495262019-08-01 03:52:40 +0000769
Matt Arsenaultee093ba2019-09-06 00:36:10 +0000770foreach vt = Reg32Types.types in {
Matt Arsenault57495262019-08-01 03:52:40 +0000771def : FlatLoadPat <FLAT_LOAD_DWORD, load_flat, vt>;
772def : FlatStorePat <FLAT_STORE_DWORD, store_flat, vt>;
773}
774
775foreach vt = VReg_64.RegTypes in {
776def : FlatStorePat <FLAT_STORE_DWORDX2, store_flat, vt, VReg_64>;
777def : FlatLoadPat <FLAT_LOAD_DWORDX2, load_flat, vt>;
778}
779
Matt Arsenault7eb19022019-07-16 18:26:42 +0000780def : FlatStorePat <FLAT_STORE_DWORDX3, store_flat, v3i32, VReg_96>;
781def : FlatStorePat <FLAT_STORE_DWORDX4, store_flat, v4i32, VReg_128>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000782
Matt Arsenault8f8d07e2019-07-16 18:21:25 +0000783def : FlatStoreAtomicPat <FLAT_STORE_DWORD, atomic_store_flat_32, i32>;
Matt Arsenault7eb19022019-07-16 18:26:42 +0000784def : FlatStoreAtomicPat <FLAT_STORE_DWORDX2, atomic_store_flat_64, i64, VReg_64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000785
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000786def : FlatAtomicPat <FLAT_ATOMIC_ADD_RTN, atomic_load_add_global_32, i32>;
787def : FlatAtomicPat <FLAT_ATOMIC_SUB_RTN, atomic_load_sub_global_32, i32>;
788def : FlatAtomicPat <FLAT_ATOMIC_INC_RTN, atomic_inc_global_32, i32>;
789def : FlatAtomicPat <FLAT_ATOMIC_DEC_RTN, atomic_dec_global_32, i32>;
790def : FlatAtomicPat <FLAT_ATOMIC_AND_RTN, atomic_load_and_global_32, i32>;
791def : FlatAtomicPat <FLAT_ATOMIC_SMAX_RTN, atomic_load_max_global_32, i32>;
792def : FlatAtomicPat <FLAT_ATOMIC_UMAX_RTN, atomic_load_umax_global_32, i32>;
793def : FlatAtomicPat <FLAT_ATOMIC_SMIN_RTN, atomic_load_min_global_32, i32>;
794def : FlatAtomicPat <FLAT_ATOMIC_UMIN_RTN, atomic_load_umin_global_32, i32>;
795def : FlatAtomicPat <FLAT_ATOMIC_OR_RTN, atomic_load_or_global_32, i32>;
796def : FlatAtomicPat <FLAT_ATOMIC_SWAP_RTN, atomic_swap_global_32, i32>;
Matt Arsenault171cf532019-10-08 10:04:41 -0700797def : FlatAtomicPat <FLAT_ATOMIC_CMPSWAP_RTN, AMDGPUatomic_cmp_swap_global_32, i32, v2i32>;
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000798def : FlatAtomicPat <FLAT_ATOMIC_XOR_RTN, atomic_load_xor_global_32, i32>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000799
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000800def : FlatAtomicPat <FLAT_ATOMIC_ADD_X2_RTN, atomic_load_add_global_64, i64>;
801def : FlatAtomicPat <FLAT_ATOMIC_SUB_X2_RTN, atomic_load_sub_global_64, i64>;
802def : FlatAtomicPat <FLAT_ATOMIC_INC_X2_RTN, atomic_inc_global_64, i64>;
803def : FlatAtomicPat <FLAT_ATOMIC_DEC_X2_RTN, atomic_dec_global_64, i64>;
804def : FlatAtomicPat <FLAT_ATOMIC_AND_X2_RTN, atomic_load_and_global_64, i64>;
805def : FlatAtomicPat <FLAT_ATOMIC_SMAX_X2_RTN, atomic_load_max_global_64, i64>;
806def : FlatAtomicPat <FLAT_ATOMIC_UMAX_X2_RTN, atomic_load_umax_global_64, i64>;
807def : FlatAtomicPat <FLAT_ATOMIC_SMIN_X2_RTN, atomic_load_min_global_64, i64>;
808def : FlatAtomicPat <FLAT_ATOMIC_UMIN_X2_RTN, atomic_load_umin_global_64, i64>;
809def : FlatAtomicPat <FLAT_ATOMIC_OR_X2_RTN, atomic_load_or_global_64, i64>;
810def : FlatAtomicPat <FLAT_ATOMIC_SWAP_X2_RTN, atomic_swap_global_64, i64>;
Matt Arsenault171cf532019-10-08 10:04:41 -0700811def : FlatAtomicPat <FLAT_ATOMIC_CMPSWAP_X2_RTN, AMDGPUatomic_cmp_swap_global_64, i64, v2i64>;
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000812def : FlatAtomicPat <FLAT_ATOMIC_XOR_X2_RTN, atomic_load_xor_global_64, i64>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000813
Matt Arsenaultbc683832017-09-20 03:43:35 +0000814def : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i16>;
815def : FlatStorePat <FLAT_STORE_SHORT, store_flat, i16>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000816
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +0000817let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultbc683832017-09-20 03:43:35 +0000818def : FlatStorePat <FLAT_STORE_SHORT_D16_HI, truncstorei16_hi16_flat, i32>;
819def : FlatStorePat <FLAT_STORE_BYTE_D16_HI, truncstorei8_hi16_flat, i32>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000820
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000821def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_flat, v2i16>;
822def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_flat, v2f16>;
823def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_flat, v2i16>;
824def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_flat, v2f16>;
825def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16_HI, load_d16_hi_flat, v2i16>;
826def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16_HI, load_d16_hi_flat, v2f16>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000827
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000828def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16, az_extloadi8_d16_lo_flat, v2i16>;
829def : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16, az_extloadi8_d16_lo_flat, v2f16>;
830def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16, sextloadi8_d16_lo_flat, v2i16>;
831def : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16, sextloadi8_d16_lo_flat, v2f16>;
832def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16, load_d16_lo_flat, v2i16>;
833def : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16, load_d16_lo_flat, v2f16>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000834}
835
Matt Arsenault90c75932017-10-03 00:06:41 +0000836} // End OtherPredicates = [HasFlatAddressSpace]
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000837
Matt Arsenault90c75932017-10-03 00:06:41 +0000838let OtherPredicates = [HasFlatGlobalInsts], AddedComplexity = 10 in {
Matt Arsenault4e309b02017-07-29 01:03:53 +0000839
Matt Arsenault1739b702019-07-16 02:46:05 +0000840def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, extloadi8_global, i32>;
841def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, zextloadi8_global, i32>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000842def : FlatLoadSignedPat <GLOBAL_LOAD_SBYTE, sextloadi8_global, i32>;
Matt Arsenault1739b702019-07-16 02:46:05 +0000843def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, extloadi8_global, i16>;
844def : FlatLoadSignedPat <GLOBAL_LOAD_UBYTE, zextloadi8_global, i16>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000845def : FlatLoadSignedPat <GLOBAL_LOAD_SBYTE, sextloadi8_global, i16>;
Matt Arsenault1739b702019-07-16 02:46:05 +0000846def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, extloadi16_global, i32>;
847def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, zextloadi16_global, i32>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000848def : FlatLoadSignedPat <GLOBAL_LOAD_SSHORT, sextloadi16_global, i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000849def : FlatLoadSignedPat <GLOBAL_LOAD_USHORT, load_global, i16>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000850
Matt Arsenaultee093ba2019-09-06 00:36:10 +0000851foreach vt = Reg32Types.types in {
Matt Arsenault57495262019-08-01 03:52:40 +0000852def : FlatLoadSignedPat <GLOBAL_LOAD_DWORD, load_global, vt>;
853def : FlatStoreSignedPat <GLOBAL_STORE_DWORD, store_global, vt, VGPR_32>;
854}
855
856foreach vt = VReg_64.RegTypes in {
857def : FlatLoadSignedPat <GLOBAL_LOAD_DWORDX2, load_global, vt>;
858def : FlatStoreSignedPat <GLOBAL_STORE_DWORDX2, store_global, vt, VReg_64>;
859}
860
Tim Renouf361b5b22019-03-21 12:01:21 +0000861def : FlatLoadSignedPat <GLOBAL_LOAD_DWORDX3, load_global, v3i32>;
Matt Arsenaultbc683832017-09-20 03:43:35 +0000862def : FlatLoadSignedPat <GLOBAL_LOAD_DWORDX4, load_global, v4i32>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000863
Matt Arsenaultc6fd5ab2019-07-16 17:38:50 +0000864def : FlatLoadAtomicPat <GLOBAL_LOAD_DWORD, atomic_load_32_global, i32>;
865def : FlatLoadAtomicPat <GLOBAL_LOAD_DWORDX2, atomic_load_64_global, i64>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000866
Matt Arsenault7eb19022019-07-16 18:26:42 +0000867def : FlatStoreSignedPat <GLOBAL_STORE_BYTE, truncstorei8_global, i32, VGPR_32>;
868def : FlatStoreSignedPat <GLOBAL_STORE_BYTE, truncstorei8_global, i16, VGPR_32>;
869def : FlatStoreSignedPat <GLOBAL_STORE_SHORT, truncstorei16_global, i32, VGPR_32>;
870def : FlatStoreSignedPat <GLOBAL_STORE_SHORT, store_global, i16, VGPR_32>;
Matt Arsenault7eb19022019-07-16 18:26:42 +0000871def : FlatStoreSignedPat <GLOBAL_STORE_DWORDX3, store_global, v3i32, VReg_96>;
872def : FlatStoreSignedPat <GLOBAL_STORE_DWORDX4, store_global, v4i32, VReg_128>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000873
Konstantin Zhuravlyovc2c2eb72018-05-04 20:06:57 +0000874let OtherPredicates = [D16PreservesUnusedBits] in {
Matt Arsenaultbc683832017-09-20 03:43:35 +0000875def : FlatStoreSignedPat <GLOBAL_STORE_SHORT_D16_HI, truncstorei16_hi16_global, i32>;
876def : FlatStoreSignedPat <GLOBAL_STORE_BYTE_D16_HI, truncstorei8_hi16_global, i32>;
Matt Arsenaultb81495d2017-09-20 05:01:53 +0000877
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000878def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_global, v2i16>;
879def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_global, v2f16>;
880def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_global, v2i16>;
881def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_global, v2f16>;
882def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16_HI, load_d16_hi_global, v2i16>;
883def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16_HI, load_d16_hi_global, v2f16>;
Matt Arsenaulte1cd4822017-11-13 00:22:09 +0000884
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000885def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16, az_extloadi8_d16_lo_global, v2i16>;
886def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_UBYTE_D16, az_extloadi8_d16_lo_global, v2f16>;
887def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16, sextloadi8_d16_lo_global, v2i16>;
888def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SBYTE_D16, sextloadi8_d16_lo_global, v2f16>;
889def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16, load_d16_lo_global, v2i16>;
890def : FlatSignedLoadPat_D16 <GLOBAL_LOAD_SHORT_D16, load_d16_lo_global, v2f16>;
Matt Arsenaultfcc213f2017-09-20 03:20:09 +0000891}
892
Matt Arsenaultbc683832017-09-20 03:43:35 +0000893def : FlatStoreSignedAtomicPat <GLOBAL_STORE_DWORD, store_atomic_global, i32>;
Matt Arsenault7eb19022019-07-16 18:26:42 +0000894def : FlatStoreSignedAtomicPat <GLOBAL_STORE_DWORDX2, store_atomic_global, i64, VReg_64>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000895
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000896def : FlatSignedAtomicPat <GLOBAL_ATOMIC_ADD_RTN, atomic_load_add_global_32, i32>;
897def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SUB_RTN, atomic_load_sub_global_32, i32>;
898def : FlatSignedAtomicPat <GLOBAL_ATOMIC_INC_RTN, atomic_inc_global_32, i32>;
899def : FlatSignedAtomicPat <GLOBAL_ATOMIC_DEC_RTN, atomic_dec_global_32, i32>;
900def : FlatSignedAtomicPat <GLOBAL_ATOMIC_AND_RTN, atomic_load_and_global_32, i32>;
901def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMAX_RTN, atomic_load_max_global_32, i32>;
902def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMAX_RTN, atomic_load_umax_global_32, i32>;
903def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMIN_RTN, atomic_load_min_global_32, i32>;
904def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMIN_RTN, atomic_load_umin_global_32, i32>;
905def : FlatSignedAtomicPat <GLOBAL_ATOMIC_OR_RTN, atomic_load_or_global_32, i32>;
906def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SWAP_RTN, atomic_swap_global_32, i32>;
Matt Arsenault171cf532019-10-08 10:04:41 -0700907def : FlatSignedAtomicPat <GLOBAL_ATOMIC_CMPSWAP_RTN, AMDGPUatomic_cmp_swap_global_32, i32, v2i32>;
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000908def : FlatSignedAtomicPat <GLOBAL_ATOMIC_XOR_RTN, atomic_load_xor_global_32, i32>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000909
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000910def : FlatSignedAtomicPat <GLOBAL_ATOMIC_ADD_X2_RTN, atomic_load_add_global_64, i64>;
911def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SUB_X2_RTN, atomic_load_sub_global_64, i64>;
912def : FlatSignedAtomicPat <GLOBAL_ATOMIC_INC_X2_RTN, atomic_inc_global_64, i64>;
913def : FlatSignedAtomicPat <GLOBAL_ATOMIC_DEC_X2_RTN, atomic_dec_global_64, i64>;
914def : FlatSignedAtomicPat <GLOBAL_ATOMIC_AND_X2_RTN, atomic_load_and_global_64, i64>;
915def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMAX_X2_RTN, atomic_load_max_global_64, i64>;
916def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMAX_X2_RTN, atomic_load_umax_global_64, i64>;
917def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SMIN_X2_RTN, atomic_load_min_global_64, i64>;
918def : FlatSignedAtomicPat <GLOBAL_ATOMIC_UMIN_X2_RTN, atomic_load_umin_global_64, i64>;
919def : FlatSignedAtomicPat <GLOBAL_ATOMIC_OR_X2_RTN, atomic_load_or_global_64, i64>;
920def : FlatSignedAtomicPat <GLOBAL_ATOMIC_SWAP_X2_RTN, atomic_swap_global_64, i64>;
Matt Arsenault171cf532019-10-08 10:04:41 -0700921def : FlatSignedAtomicPat <GLOBAL_ATOMIC_CMPSWAP_X2_RTN, AMDGPUatomic_cmp_swap_global_64, i64, v2i64>;
Matt Arsenaulte6ce4842019-08-01 03:25:52 +0000922def : FlatSignedAtomicPat <GLOBAL_ATOMIC_XOR_X2_RTN, atomic_load_xor_global_64, i64>;
Matt Arsenault4e309b02017-07-29 01:03:53 +0000923
Matt Arsenault70e20c02019-08-01 03:22:40 +0000924def : FlatAtomicPatNoRtn <GLOBAL_ATOMIC_ADD_F32, atomic_fadd_global_noret, f32>;
925def : FlatAtomicPatNoRtn <GLOBAL_ATOMIC_PK_ADD_F16, atomic_pk_fadd_global_noret, v2f16>;
Stanislav Mekhanoshine93279f2019-07-11 00:10:17 +0000926
Matt Arsenaulte8c03a22019-03-08 20:58:11 +0000927} // End OtherPredicates = [HasFlatGlobalInsts], AddedComplexity = 10
Matt Arsenault4e309b02017-07-29 01:03:53 +0000928
929
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000930//===----------------------------------------------------------------------===//
931// Target
932//===----------------------------------------------------------------------===//
933
934//===----------------------------------------------------------------------===//
935// CI
936//===----------------------------------------------------------------------===//
937
938class FLAT_Real_ci <bits<7> op, FLAT_Pseudo ps> :
939 FLAT_Real <op, ps>,
940 SIMCInstr <ps.PseudoInstr, SIEncodingFamily.SI> {
Stanislav Mekhanoshin51823022019-04-06 09:20:48 +0000941 let AssemblerPredicate = isGFX7Only;
Stanislav Mekhanoshin7895c032019-04-05 18:24:34 +0000942 let DecoderNamespace="GFX7";
Valery Pykhtin8bc65962016-09-05 11:22:51 +0000943}
944
945def FLAT_LOAD_UBYTE_ci : FLAT_Real_ci <0x8, FLAT_LOAD_UBYTE>;
946def FLAT_LOAD_SBYTE_ci : FLAT_Real_ci <0x9, FLAT_LOAD_SBYTE>;
947def FLAT_LOAD_USHORT_ci : FLAT_Real_ci <0xa, FLAT_LOAD_USHORT>;
948def FLAT_LOAD_SSHORT_ci : FLAT_Real_ci <0xb, FLAT_LOAD_SSHORT>;
949def FLAT_LOAD_DWORD_ci : FLAT_Real_ci <0xc, FLAT_LOAD_DWORD>;
950def FLAT_LOAD_DWORDX2_ci : FLAT_Real_ci <0xd, FLAT_LOAD_DWORDX2>;
951def FLAT_LOAD_DWORDX4_ci : FLAT_Real_ci <0xe, FLAT_LOAD_DWORDX4>;
952def FLAT_LOAD_DWORDX3_ci : FLAT_Real_ci <0xf, FLAT_LOAD_DWORDX3>;
953
954def FLAT_STORE_BYTE_ci : FLAT_Real_ci <0x18, FLAT_STORE_BYTE>;
955def FLAT_STORE_SHORT_ci : FLAT_Real_ci <0x1a, FLAT_STORE_SHORT>;
956def FLAT_STORE_DWORD_ci : FLAT_Real_ci <0x1c, FLAT_STORE_DWORD>;
957def FLAT_STORE_DWORDX2_ci : FLAT_Real_ci <0x1d, FLAT_STORE_DWORDX2>;
958def FLAT_STORE_DWORDX4_ci : FLAT_Real_ci <0x1e, FLAT_STORE_DWORDX4>;
959def FLAT_STORE_DWORDX3_ci : FLAT_Real_ci <0x1f, FLAT_STORE_DWORDX3>;
960
961multiclass FLAT_Real_Atomics_ci <bits<7> op, FLAT_Pseudo ps> {
962 def _ci : FLAT_Real_ci<op, !cast<FLAT_Pseudo>(ps.PseudoInstr)>;
963 def _RTN_ci : FLAT_Real_ci<op, !cast<FLAT_Pseudo>(ps.PseudoInstr # "_RTN")>;
964}
965
966defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_ci <0x30, FLAT_ATOMIC_SWAP>;
967defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_ci <0x31, FLAT_ATOMIC_CMPSWAP>;
968defm FLAT_ATOMIC_ADD : FLAT_Real_Atomics_ci <0x32, FLAT_ATOMIC_ADD>;
969defm FLAT_ATOMIC_SUB : FLAT_Real_Atomics_ci <0x33, FLAT_ATOMIC_SUB>;
970defm FLAT_ATOMIC_SMIN : FLAT_Real_Atomics_ci <0x35, FLAT_ATOMIC_SMIN>;
971defm FLAT_ATOMIC_UMIN : FLAT_Real_Atomics_ci <0x36, FLAT_ATOMIC_UMIN>;
972defm FLAT_ATOMIC_SMAX : FLAT_Real_Atomics_ci <0x37, FLAT_ATOMIC_SMAX>;
973defm FLAT_ATOMIC_UMAX : FLAT_Real_Atomics_ci <0x38, FLAT_ATOMIC_UMAX>;
974defm FLAT_ATOMIC_AND : FLAT_Real_Atomics_ci <0x39, FLAT_ATOMIC_AND>;
975defm FLAT_ATOMIC_OR : FLAT_Real_Atomics_ci <0x3a, FLAT_ATOMIC_OR>;
976defm FLAT_ATOMIC_XOR : FLAT_Real_Atomics_ci <0x3b, FLAT_ATOMIC_XOR>;
977defm FLAT_ATOMIC_INC : FLAT_Real_Atomics_ci <0x3c, FLAT_ATOMIC_INC>;
978defm FLAT_ATOMIC_DEC : FLAT_Real_Atomics_ci <0x3d, FLAT_ATOMIC_DEC>;
979defm FLAT_ATOMIC_SWAP_X2 : FLAT_Real_Atomics_ci <0x50, FLAT_ATOMIC_SWAP_X2>;
980defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_ci <0x51, FLAT_ATOMIC_CMPSWAP_X2>;
981defm FLAT_ATOMIC_ADD_X2 : FLAT_Real_Atomics_ci <0x52, FLAT_ATOMIC_ADD_X2>;
982defm FLAT_ATOMIC_SUB_X2 : FLAT_Real_Atomics_ci <0x53, FLAT_ATOMIC_SUB_X2>;
983defm FLAT_ATOMIC_SMIN_X2 : FLAT_Real_Atomics_ci <0x55, FLAT_ATOMIC_SMIN_X2>;
984defm FLAT_ATOMIC_UMIN_X2 : FLAT_Real_Atomics_ci <0x56, FLAT_ATOMIC_UMIN_X2>;
985defm FLAT_ATOMIC_SMAX_X2 : FLAT_Real_Atomics_ci <0x57, FLAT_ATOMIC_SMAX_X2>;
986defm FLAT_ATOMIC_UMAX_X2 : FLAT_Real_Atomics_ci <0x58, FLAT_ATOMIC_UMAX_X2>;
987defm FLAT_ATOMIC_AND_X2 : FLAT_Real_Atomics_ci <0x59, FLAT_ATOMIC_AND_X2>;
988defm FLAT_ATOMIC_OR_X2 : FLAT_Real_Atomics_ci <0x5a, FLAT_ATOMIC_OR_X2>;
989defm FLAT_ATOMIC_XOR_X2 : FLAT_Real_Atomics_ci <0x5b, FLAT_ATOMIC_XOR_X2>;
990defm FLAT_ATOMIC_INC_X2 : FLAT_Real_Atomics_ci <0x5c, FLAT_ATOMIC_INC_X2>;
991defm FLAT_ATOMIC_DEC_X2 : FLAT_Real_Atomics_ci <0x5d, FLAT_ATOMIC_DEC_X2>;
992
993// CI Only flat instructions
994defm FLAT_ATOMIC_FCMPSWAP : FLAT_Real_Atomics_ci <0x3e, FLAT_ATOMIC_FCMPSWAP>;
995defm FLAT_ATOMIC_FMIN : FLAT_Real_Atomics_ci <0x3f, FLAT_ATOMIC_FMIN>;
996defm FLAT_ATOMIC_FMAX : FLAT_Real_Atomics_ci <0x40, FLAT_ATOMIC_FMAX>;
997defm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Real_Atomics_ci <0x5e, FLAT_ATOMIC_FCMPSWAP_X2>;
998defm FLAT_ATOMIC_FMIN_X2 : FLAT_Real_Atomics_ci <0x5f, FLAT_ATOMIC_FMIN_X2>;
999defm FLAT_ATOMIC_FMAX_X2 : FLAT_Real_Atomics_ci <0x60, FLAT_ATOMIC_FMAX_X2>;
1000
1001
1002//===----------------------------------------------------------------------===//
1003// VI
1004//===----------------------------------------------------------------------===//
1005
1006class FLAT_Real_vi <bits<7> op, FLAT_Pseudo ps> :
1007 FLAT_Real <op, ps>,
1008 SIMCInstr <ps.PseudoInstr, SIEncodingFamily.VI> {
Stanislav Mekhanoshin51823022019-04-06 09:20:48 +00001009 let AssemblerPredicate = isGFX8GFX9;
1010 let DecoderNamespace = "GFX8";
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001011}
1012
Matt Arsenault04004712017-07-20 05:17:54 +00001013multiclass FLAT_Real_AllAddr_vi<bits<7> op> {
1014 def _vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME)>;
1015 def _SADDR_vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME#"_SADDR")>;
1016}
1017
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001018def FLAT_LOAD_UBYTE_vi : FLAT_Real_vi <0x10, FLAT_LOAD_UBYTE>;
1019def FLAT_LOAD_SBYTE_vi : FLAT_Real_vi <0x11, FLAT_LOAD_SBYTE>;
1020def FLAT_LOAD_USHORT_vi : FLAT_Real_vi <0x12, FLAT_LOAD_USHORT>;
1021def FLAT_LOAD_SSHORT_vi : FLAT_Real_vi <0x13, FLAT_LOAD_SSHORT>;
1022def FLAT_LOAD_DWORD_vi : FLAT_Real_vi <0x14, FLAT_LOAD_DWORD>;
1023def FLAT_LOAD_DWORDX2_vi : FLAT_Real_vi <0x15, FLAT_LOAD_DWORDX2>;
1024def FLAT_LOAD_DWORDX4_vi : FLAT_Real_vi <0x17, FLAT_LOAD_DWORDX4>;
1025def FLAT_LOAD_DWORDX3_vi : FLAT_Real_vi <0x16, FLAT_LOAD_DWORDX3>;
1026
1027def FLAT_STORE_BYTE_vi : FLAT_Real_vi <0x18, FLAT_STORE_BYTE>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001028def FLAT_STORE_BYTE_D16_HI_vi : FLAT_Real_vi <0x19, FLAT_STORE_BYTE_D16_HI>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001029def FLAT_STORE_SHORT_vi : FLAT_Real_vi <0x1a, FLAT_STORE_SHORT>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001030def FLAT_STORE_SHORT_D16_HI_vi : FLAT_Real_vi <0x1b, FLAT_STORE_SHORT_D16_HI>;
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001031def FLAT_STORE_DWORD_vi : FLAT_Real_vi <0x1c, FLAT_STORE_DWORD>;
1032def FLAT_STORE_DWORDX2_vi : FLAT_Real_vi <0x1d, FLAT_STORE_DWORDX2>;
1033def FLAT_STORE_DWORDX4_vi : FLAT_Real_vi <0x1f, FLAT_STORE_DWORDX4>;
1034def FLAT_STORE_DWORDX3_vi : FLAT_Real_vi <0x1e, FLAT_STORE_DWORDX3>;
1035
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001036def FLAT_LOAD_UBYTE_D16_vi : FLAT_Real_vi <0x20, FLAT_LOAD_UBYTE_D16>;
1037def FLAT_LOAD_UBYTE_D16_HI_vi : FLAT_Real_vi <0x21, FLAT_LOAD_UBYTE_D16_HI>;
1038def FLAT_LOAD_SBYTE_D16_vi : FLAT_Real_vi <0x22, FLAT_LOAD_SBYTE_D16>;
1039def FLAT_LOAD_SBYTE_D16_HI_vi : FLAT_Real_vi <0x23, FLAT_LOAD_SBYTE_D16_HI>;
1040def FLAT_LOAD_SHORT_D16_vi : FLAT_Real_vi <0x24, FLAT_LOAD_SHORT_D16>;
1041def FLAT_LOAD_SHORT_D16_HI_vi : FLAT_Real_vi <0x25, FLAT_LOAD_SHORT_D16_HI>;
1042
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001043multiclass FLAT_Real_Atomics_vi <bits<7> op, FLAT_Pseudo ps> {
1044 def _vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(ps.PseudoInstr)>;
1045 def _RTN_vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(ps.PseudoInstr # "_RTN")>;
1046}
1047
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +00001048multiclass FLAT_Global_Real_Atomics_vi<bits<7> op> :
1049 FLAT_Real_AllAddr_vi<op> {
1050 def _RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_RTN")>;
1051 def _SADDR_RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN")>;
1052}
1053
1054
Valery Pykhtin8bc65962016-09-05 11:22:51 +00001055defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_vi <0x40, FLAT_ATOMIC_SWAP>;
1056defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_vi <0x41, FLAT_ATOMIC_CMPSWAP>;
1057defm FLAT_ATOMIC_ADD : FLAT_Real_Atomics_vi <0x42, FLAT_ATOMIC_ADD>;
1058defm FLAT_ATOMIC_SUB : FLAT_Real_Atomics_vi <0x43, FLAT_ATOMIC_SUB>;
1059defm FLAT_ATOMIC_SMIN : FLAT_Real_Atomics_vi <0x44, FLAT_ATOMIC_SMIN>;
1060defm FLAT_ATOMIC_UMIN : FLAT_Real_Atomics_vi <0x45, FLAT_ATOMIC_UMIN>;
1061defm FLAT_ATOMIC_SMAX : FLAT_Real_Atomics_vi <0x46, FLAT_ATOMIC_SMAX>;
1062defm FLAT_ATOMIC_UMAX : FLAT_Real_Atomics_vi <0x47, FLAT_ATOMIC_UMAX>;
1063defm FLAT_ATOMIC_AND : FLAT_Real_Atomics_vi <0x48, FLAT_ATOMIC_AND>;
1064defm FLAT_ATOMIC_OR : FLAT_Real_Atomics_vi <0x49, FLAT_ATOMIC_OR>;
1065defm FLAT_ATOMIC_XOR : FLAT_Real_Atomics_vi <0x4a, FLAT_ATOMIC_XOR>;
1066defm FLAT_ATOMIC_INC : FLAT_Real_Atomics_vi <0x4b, FLAT_ATOMIC_INC>;
1067defm FLAT_ATOMIC_DEC : FLAT_Real_Atomics_vi <0x4c, FLAT_ATOMIC_DEC>;
1068defm FLAT_ATOMIC_SWAP_X2 : FLAT_Real_Atomics_vi <0x60, FLAT_ATOMIC_SWAP_X2>;
1069defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_vi <0x61, FLAT_ATOMIC_CMPSWAP_X2>;
1070defm FLAT_ATOMIC_ADD_X2 : FLAT_Real_Atomics_vi <0x62, FLAT_ATOMIC_ADD_X2>;
1071defm FLAT_ATOMIC_SUB_X2 : FLAT_Real_Atomics_vi <0x63, FLAT_ATOMIC_SUB_X2>;
1072defm FLAT_ATOMIC_SMIN_X2 : FLAT_Real_Atomics_vi <0x64, FLAT_ATOMIC_SMIN_X2>;
1073defm FLAT_ATOMIC_UMIN_X2 : FLAT_Real_Atomics_vi <0x65, FLAT_ATOMIC_UMIN_X2>;
1074defm FLAT_ATOMIC_SMAX_X2 : FLAT_Real_Atomics_vi <0x66, FLAT_ATOMIC_SMAX_X2>;
1075defm FLAT_ATOMIC_UMAX_X2 : FLAT_Real_Atomics_vi <0x67, FLAT_ATOMIC_UMAX_X2>;
1076defm FLAT_ATOMIC_AND_X2 : FLAT_Real_Atomics_vi <0x68, FLAT_ATOMIC_AND_X2>;
1077defm FLAT_ATOMIC_OR_X2 : FLAT_Real_Atomics_vi <0x69, FLAT_ATOMIC_OR_X2>;
1078defm FLAT_ATOMIC_XOR_X2 : FLAT_Real_Atomics_vi <0x6a, FLAT_ATOMIC_XOR_X2>;
1079defm FLAT_ATOMIC_INC_X2 : FLAT_Real_Atomics_vi <0x6b, FLAT_ATOMIC_INC_X2>;
1080defm FLAT_ATOMIC_DEC_X2 : FLAT_Real_Atomics_vi <0x6c, FLAT_ATOMIC_DEC_X2>;
1081
Matt Arsenault04004712017-07-20 05:17:54 +00001082defm GLOBAL_LOAD_UBYTE : FLAT_Real_AllAddr_vi <0x10>;
1083defm GLOBAL_LOAD_SBYTE : FLAT_Real_AllAddr_vi <0x11>;
1084defm GLOBAL_LOAD_USHORT : FLAT_Real_AllAddr_vi <0x12>;
1085defm GLOBAL_LOAD_SSHORT : FLAT_Real_AllAddr_vi <0x13>;
1086defm GLOBAL_LOAD_DWORD : FLAT_Real_AllAddr_vi <0x14>;
1087defm GLOBAL_LOAD_DWORDX2 : FLAT_Real_AllAddr_vi <0x15>;
Matt Arsenault04004712017-07-20 05:17:54 +00001088defm GLOBAL_LOAD_DWORDX3 : FLAT_Real_AllAddr_vi <0x16>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +00001089defm GLOBAL_LOAD_DWORDX4 : FLAT_Real_AllAddr_vi <0x17>;
Matt Arsenault9698f1c2017-06-20 19:54:14 +00001090
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001091defm GLOBAL_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_vi <0x20>;
1092defm GLOBAL_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x21>;
1093defm GLOBAL_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_vi <0x22>;
1094defm GLOBAL_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x23>;
1095defm GLOBAL_LOAD_SHORT_D16 : FLAT_Real_AllAddr_vi <0x24>;
1096defm GLOBAL_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x25>;
1097
Matt Arsenault04004712017-07-20 05:17:54 +00001098defm GLOBAL_STORE_BYTE : FLAT_Real_AllAddr_vi <0x18>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001099defm GLOBAL_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_vi <0x19>;
Matt Arsenault04004712017-07-20 05:17:54 +00001100defm GLOBAL_STORE_SHORT : FLAT_Real_AllAddr_vi <0x1a>;
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001101defm GLOBAL_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x1b>;
Matt Arsenault04004712017-07-20 05:17:54 +00001102defm GLOBAL_STORE_DWORD : FLAT_Real_AllAddr_vi <0x1c>;
1103defm GLOBAL_STORE_DWORDX2 : FLAT_Real_AllAddr_vi <0x1d>;
Matt Arsenault04004712017-07-20 05:17:54 +00001104defm GLOBAL_STORE_DWORDX3 : FLAT_Real_AllAddr_vi <0x1e>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +00001105defm GLOBAL_STORE_DWORDX4 : FLAT_Real_AllAddr_vi <0x1f>;
1106
Matt Arsenaultf65c5ac2017-07-20 17:31:56 +00001107
1108defm GLOBAL_ATOMIC_SWAP : FLAT_Global_Real_Atomics_vi <0x40>;
1109defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Global_Real_Atomics_vi <0x41>;
1110defm GLOBAL_ATOMIC_ADD : FLAT_Global_Real_Atomics_vi <0x42>;
1111defm GLOBAL_ATOMIC_SUB : FLAT_Global_Real_Atomics_vi <0x43>;
1112defm GLOBAL_ATOMIC_SMIN : FLAT_Global_Real_Atomics_vi <0x44>;
1113defm GLOBAL_ATOMIC_UMIN : FLAT_Global_Real_Atomics_vi <0x45>;
1114defm GLOBAL_ATOMIC_SMAX : FLAT_Global_Real_Atomics_vi <0x46>;
1115defm GLOBAL_ATOMIC_UMAX : FLAT_Global_Real_Atomics_vi <0x47>;
1116defm GLOBAL_ATOMIC_AND : FLAT_Global_Real_Atomics_vi <0x48>;
1117defm GLOBAL_ATOMIC_OR : FLAT_Global_Real_Atomics_vi <0x49>;
1118defm GLOBAL_ATOMIC_XOR : FLAT_Global_Real_Atomics_vi <0x4a>;
1119defm GLOBAL_ATOMIC_INC : FLAT_Global_Real_Atomics_vi <0x4b>;
1120defm GLOBAL_ATOMIC_DEC : FLAT_Global_Real_Atomics_vi <0x4c>;
1121defm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Global_Real_Atomics_vi <0x60>;
1122defm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Global_Real_Atomics_vi <0x61>;
1123defm GLOBAL_ATOMIC_ADD_X2 : FLAT_Global_Real_Atomics_vi <0x62>;
1124defm GLOBAL_ATOMIC_SUB_X2 : FLAT_Global_Real_Atomics_vi <0x63>;
1125defm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Global_Real_Atomics_vi <0x64>;
1126defm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Global_Real_Atomics_vi <0x65>;
1127defm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Global_Real_Atomics_vi <0x66>;
1128defm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Global_Real_Atomics_vi <0x67>;
1129defm GLOBAL_ATOMIC_AND_X2 : FLAT_Global_Real_Atomics_vi <0x68>;
1130defm GLOBAL_ATOMIC_OR_X2 : FLAT_Global_Real_Atomics_vi <0x69>;
1131defm GLOBAL_ATOMIC_XOR_X2 : FLAT_Global_Real_Atomics_vi <0x6a>;
1132defm GLOBAL_ATOMIC_INC_X2 : FLAT_Global_Real_Atomics_vi <0x6b>;
1133defm GLOBAL_ATOMIC_DEC_X2 : FLAT_Global_Real_Atomics_vi <0x6c>;
Matt Arsenaultca7b0a12017-07-21 15:36:16 +00001134
Matt Arsenaulted6e8f02017-09-01 18:36:06 +00001135defm SCRATCH_LOAD_UBYTE : FLAT_Real_AllAddr_vi <0x10>;
1136defm SCRATCH_LOAD_SBYTE : FLAT_Real_AllAddr_vi <0x11>;
1137defm SCRATCH_LOAD_USHORT : FLAT_Real_AllAddr_vi <0x12>;
1138defm SCRATCH_LOAD_SSHORT : FLAT_Real_AllAddr_vi <0x13>;
1139defm SCRATCH_LOAD_DWORD : FLAT_Real_AllAddr_vi <0x14>;
1140defm SCRATCH_LOAD_DWORDX2 : FLAT_Real_AllAddr_vi <0x15>;
1141defm SCRATCH_LOAD_DWORDX3 : FLAT_Real_AllAddr_vi <0x16>;
1142defm SCRATCH_LOAD_DWORDX4 : FLAT_Real_AllAddr_vi <0x17>;
1143defm SCRATCH_STORE_BYTE : FLAT_Real_AllAddr_vi <0x18>;
1144defm SCRATCH_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_vi <0x19>;
1145defm SCRATCH_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_vi <0x20>;
1146defm SCRATCH_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x21>;
1147defm SCRATCH_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_vi <0x22>;
1148defm SCRATCH_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x23>;
1149defm SCRATCH_LOAD_SHORT_D16 : FLAT_Real_AllAddr_vi <0x24>;
1150defm SCRATCH_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x25>;
1151defm SCRATCH_STORE_SHORT : FLAT_Real_AllAddr_vi <0x1a>;
1152defm SCRATCH_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x1b>;
1153defm SCRATCH_STORE_DWORD : FLAT_Real_AllAddr_vi <0x1c>;
1154defm SCRATCH_STORE_DWORDX2 : FLAT_Real_AllAddr_vi <0x1d>;
1155defm SCRATCH_STORE_DWORDX3 : FLAT_Real_AllAddr_vi <0x1e>;
1156defm SCRATCH_STORE_DWORDX4 : FLAT_Real_AllAddr_vi <0x1f>;
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001157
1158
1159//===----------------------------------------------------------------------===//
1160// GFX10.
1161//===----------------------------------------------------------------------===//
1162
1163class FLAT_Real_gfx10<bits<7> op, FLAT_Pseudo ps> :
1164 FLAT_Real<op, ps>, SIMCInstr<ps.PseudoInstr, SIEncodingFamily.GFX10> {
1165 let AssemblerPredicate = isGFX10Plus;
1166 let DecoderNamespace = "GFX10";
1167
Dmitry Preobrazhensky94d04072019-10-04 12:10:22 +00001168 let Inst{11-0} = offset{11-0};
Stanislav Mekhanoshina6322942019-04-30 22:08:23 +00001169 let Inst{12} = !if(ps.has_dlc, dlc, ps.dlcValue);
1170 let Inst{54-48} = !if(ps.has_saddr, !if(ps.enabled_saddr, saddr, 0x7d), 0x7d);
1171 let Inst{55} = 0;
1172}
1173
1174
1175multiclass FLAT_Real_Base_gfx10<bits<7> op> {
1176 def _gfx10 :
1177 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME)>;
1178}
1179
1180multiclass FLAT_Real_RTN_gfx10<bits<7> op> {
1181 def _RTN_gfx10 :
1182 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME#"_RTN")>;
1183}
1184
1185multiclass FLAT_Real_SADDR_gfx10<bits<7> op> {
1186 def _SADDR_gfx10 :
1187 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME#"_SADDR")>;
1188}
1189
1190multiclass FLAT_Real_SADDR_RTN_gfx10<bits<7> op> {
1191 def _SADDR_RTN_gfx10 :
1192 FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN")>;
1193}
1194
1195
1196multiclass FLAT_Real_AllAddr_gfx10<bits<7> op> :
1197 FLAT_Real_Base_gfx10<op>,
1198 FLAT_Real_SADDR_gfx10<op>;
1199
1200multiclass FLAT_Real_Atomics_gfx10<bits<7> op> :
1201 FLAT_Real_Base_gfx10<op>,
1202 FLAT_Real_RTN_gfx10<op>;
1203
1204multiclass FLAT_Real_GlblAtomics_gfx10<bits<7> op> :
1205 FLAT_Real_AllAddr_gfx10<op>,
1206 FLAT_Real_RTN_gfx10<op>,
1207 FLAT_Real_SADDR_RTN_gfx10<op>;
1208
1209
1210// ENC_FLAT.
1211defm FLAT_LOAD_UBYTE : FLAT_Real_Base_gfx10<0x008>;
1212defm FLAT_LOAD_SBYTE : FLAT_Real_Base_gfx10<0x009>;
1213defm FLAT_LOAD_USHORT : FLAT_Real_Base_gfx10<0x00a>;
1214defm FLAT_LOAD_SSHORT : FLAT_Real_Base_gfx10<0x00b>;
1215defm FLAT_LOAD_DWORD : FLAT_Real_Base_gfx10<0x00c>;
1216defm FLAT_LOAD_DWORDX2 : FLAT_Real_Base_gfx10<0x00d>;
1217defm FLAT_LOAD_DWORDX4 : FLAT_Real_Base_gfx10<0x00e>;
1218defm FLAT_LOAD_DWORDX3 : FLAT_Real_Base_gfx10<0x00f>;
1219defm FLAT_STORE_BYTE : FLAT_Real_Base_gfx10<0x018>;
1220defm FLAT_STORE_BYTE_D16_HI : FLAT_Real_Base_gfx10<0x019>;
1221defm FLAT_STORE_SHORT : FLAT_Real_Base_gfx10<0x01a>;
1222defm FLAT_STORE_SHORT_D16_HI : FLAT_Real_Base_gfx10<0x01b>;
1223defm FLAT_STORE_DWORD : FLAT_Real_Base_gfx10<0x01c>;
1224defm FLAT_STORE_DWORDX2 : FLAT_Real_Base_gfx10<0x01d>;
1225defm FLAT_STORE_DWORDX4 : FLAT_Real_Base_gfx10<0x01e>;
1226defm FLAT_STORE_DWORDX3 : FLAT_Real_Base_gfx10<0x01f>;
1227defm FLAT_LOAD_UBYTE_D16 : FLAT_Real_Base_gfx10<0x020>;
1228defm FLAT_LOAD_UBYTE_D16_HI : FLAT_Real_Base_gfx10<0x021>;
1229defm FLAT_LOAD_SBYTE_D16 : FLAT_Real_Base_gfx10<0x022>;
1230defm FLAT_LOAD_SBYTE_D16_HI : FLAT_Real_Base_gfx10<0x023>;
1231defm FLAT_LOAD_SHORT_D16 : FLAT_Real_Base_gfx10<0x024>;
1232defm FLAT_LOAD_SHORT_D16_HI : FLAT_Real_Base_gfx10<0x025>;
1233defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_gfx10<0x030>;
1234defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_gfx10<0x031>;
1235defm FLAT_ATOMIC_ADD : FLAT_Real_Atomics_gfx10<0x032>;
1236defm FLAT_ATOMIC_SUB : FLAT_Real_Atomics_gfx10<0x033>;
1237defm FLAT_ATOMIC_SMIN : FLAT_Real_Atomics_gfx10<0x035>;
1238defm FLAT_ATOMIC_UMIN : FLAT_Real_Atomics_gfx10<0x036>;
1239defm FLAT_ATOMIC_SMAX : FLAT_Real_Atomics_gfx10<0x037>;
1240defm FLAT_ATOMIC_UMAX : FLAT_Real_Atomics_gfx10<0x038>;
1241defm FLAT_ATOMIC_AND : FLAT_Real_Atomics_gfx10<0x039>;
1242defm FLAT_ATOMIC_OR : FLAT_Real_Atomics_gfx10<0x03a>;
1243defm FLAT_ATOMIC_XOR : FLAT_Real_Atomics_gfx10<0x03b>;
1244defm FLAT_ATOMIC_INC : FLAT_Real_Atomics_gfx10<0x03c>;
1245defm FLAT_ATOMIC_DEC : FLAT_Real_Atomics_gfx10<0x03d>;
1246defm FLAT_ATOMIC_FCMPSWAP : FLAT_Real_Atomics_gfx10<0x03e>;
1247defm FLAT_ATOMIC_FMIN : FLAT_Real_Atomics_gfx10<0x03f>;
1248defm FLAT_ATOMIC_FMAX : FLAT_Real_Atomics_gfx10<0x040>;
1249defm FLAT_ATOMIC_SWAP_X2 : FLAT_Real_Atomics_gfx10<0x050>;
1250defm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_gfx10<0x051>;
1251defm FLAT_ATOMIC_ADD_X2 : FLAT_Real_Atomics_gfx10<0x052>;
1252defm FLAT_ATOMIC_SUB_X2 : FLAT_Real_Atomics_gfx10<0x053>;
1253defm FLAT_ATOMIC_SMIN_X2 : FLAT_Real_Atomics_gfx10<0x055>;
1254defm FLAT_ATOMIC_UMIN_X2 : FLAT_Real_Atomics_gfx10<0x056>;
1255defm FLAT_ATOMIC_SMAX_X2 : FLAT_Real_Atomics_gfx10<0x057>;
1256defm FLAT_ATOMIC_UMAX_X2 : FLAT_Real_Atomics_gfx10<0x058>;
1257defm FLAT_ATOMIC_AND_X2 : FLAT_Real_Atomics_gfx10<0x059>;
1258defm FLAT_ATOMIC_OR_X2 : FLAT_Real_Atomics_gfx10<0x05a>;
1259defm FLAT_ATOMIC_XOR_X2 : FLAT_Real_Atomics_gfx10<0x05b>;
1260defm FLAT_ATOMIC_INC_X2 : FLAT_Real_Atomics_gfx10<0x05c>;
1261defm FLAT_ATOMIC_DEC_X2 : FLAT_Real_Atomics_gfx10<0x05d>;
1262defm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Real_Atomics_gfx10<0x05e>;
1263defm FLAT_ATOMIC_FMIN_X2 : FLAT_Real_Atomics_gfx10<0x05f>;
1264defm FLAT_ATOMIC_FMAX_X2 : FLAT_Real_Atomics_gfx10<0x060>;
1265
1266
1267// ENC_FLAT_GLBL.
1268defm GLOBAL_LOAD_UBYTE : FLAT_Real_AllAddr_gfx10<0x008>;
1269defm GLOBAL_LOAD_SBYTE : FLAT_Real_AllAddr_gfx10<0x009>;
1270defm GLOBAL_LOAD_USHORT : FLAT_Real_AllAddr_gfx10<0x00a>;
1271defm GLOBAL_LOAD_SSHORT : FLAT_Real_AllAddr_gfx10<0x00b>;
1272defm GLOBAL_LOAD_DWORD : FLAT_Real_AllAddr_gfx10<0x00c>;
1273defm GLOBAL_LOAD_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x00d>;
1274defm GLOBAL_LOAD_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x00e>;
1275defm GLOBAL_LOAD_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x00f>;
1276defm GLOBAL_STORE_BYTE : FLAT_Real_AllAddr_gfx10<0x018>;
1277defm GLOBAL_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x019>;
1278defm GLOBAL_STORE_SHORT : FLAT_Real_AllAddr_gfx10<0x01a>;
1279defm GLOBAL_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x01b>;
1280defm GLOBAL_STORE_DWORD : FLAT_Real_AllAddr_gfx10<0x01c>;
1281defm GLOBAL_STORE_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x01d>;
1282defm GLOBAL_STORE_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x01e>;
1283defm GLOBAL_STORE_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x01f>;
1284defm GLOBAL_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x020>;
1285defm GLOBAL_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x021>;
1286defm GLOBAL_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x022>;
1287defm GLOBAL_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x023>;
1288defm GLOBAL_LOAD_SHORT_D16 : FLAT_Real_AllAddr_gfx10<0x024>;
1289defm GLOBAL_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x025>;
1290defm GLOBAL_ATOMIC_SWAP : FLAT_Real_GlblAtomics_gfx10<0x030>;
1291defm GLOBAL_ATOMIC_CMPSWAP : FLAT_Real_GlblAtomics_gfx10<0x031>;
1292defm GLOBAL_ATOMIC_ADD : FLAT_Real_GlblAtomics_gfx10<0x032>;
1293defm GLOBAL_ATOMIC_SUB : FLAT_Real_GlblAtomics_gfx10<0x033>;
1294defm GLOBAL_ATOMIC_SMIN : FLAT_Real_GlblAtomics_gfx10<0x035>;
1295defm GLOBAL_ATOMIC_UMIN : FLAT_Real_GlblAtomics_gfx10<0x036>;
1296defm GLOBAL_ATOMIC_SMAX : FLAT_Real_GlblAtomics_gfx10<0x037>;
1297defm GLOBAL_ATOMIC_UMAX : FLAT_Real_GlblAtomics_gfx10<0x038>;
1298defm GLOBAL_ATOMIC_AND : FLAT_Real_GlblAtomics_gfx10<0x039>;
1299defm GLOBAL_ATOMIC_OR : FLAT_Real_GlblAtomics_gfx10<0x03a>;
1300defm GLOBAL_ATOMIC_XOR : FLAT_Real_GlblAtomics_gfx10<0x03b>;
1301defm GLOBAL_ATOMIC_INC : FLAT_Real_GlblAtomics_gfx10<0x03c>;
1302defm GLOBAL_ATOMIC_DEC : FLAT_Real_GlblAtomics_gfx10<0x03d>;
1303defm GLOBAL_ATOMIC_FCMPSWAP : FLAT_Real_GlblAtomics_gfx10<0x03e>;
1304defm GLOBAL_ATOMIC_FMIN : FLAT_Real_GlblAtomics_gfx10<0x03f>;
1305defm GLOBAL_ATOMIC_FMAX : FLAT_Real_GlblAtomics_gfx10<0x040>;
1306defm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Real_GlblAtomics_gfx10<0x050>;
1307defm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Real_GlblAtomics_gfx10<0x051>;
1308defm GLOBAL_ATOMIC_ADD_X2 : FLAT_Real_GlblAtomics_gfx10<0x052>;
1309defm GLOBAL_ATOMIC_SUB_X2 : FLAT_Real_GlblAtomics_gfx10<0x053>;
1310defm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Real_GlblAtomics_gfx10<0x055>;
1311defm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Real_GlblAtomics_gfx10<0x056>;
1312defm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Real_GlblAtomics_gfx10<0x057>;
1313defm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Real_GlblAtomics_gfx10<0x058>;
1314defm GLOBAL_ATOMIC_AND_X2 : FLAT_Real_GlblAtomics_gfx10<0x059>;
1315defm GLOBAL_ATOMIC_OR_X2 : FLAT_Real_GlblAtomics_gfx10<0x05a>;
1316defm GLOBAL_ATOMIC_XOR_X2 : FLAT_Real_GlblAtomics_gfx10<0x05b>;
1317defm GLOBAL_ATOMIC_INC_X2 : FLAT_Real_GlblAtomics_gfx10<0x05c>;
1318defm GLOBAL_ATOMIC_DEC_X2 : FLAT_Real_GlblAtomics_gfx10<0x05d>;
1319defm GLOBAL_ATOMIC_FCMPSWAP_X2 : FLAT_Real_GlblAtomics_gfx10<0x05e>;
1320defm GLOBAL_ATOMIC_FMIN_X2 : FLAT_Real_GlblAtomics_gfx10<0x05f>;
1321defm GLOBAL_ATOMIC_FMAX_X2 : FLAT_Real_GlblAtomics_gfx10<0x060>;
1322
1323
1324// ENC_FLAT_SCRATCH.
1325defm SCRATCH_LOAD_UBYTE : FLAT_Real_AllAddr_gfx10<0x008>;
1326defm SCRATCH_LOAD_SBYTE : FLAT_Real_AllAddr_gfx10<0x009>;
1327defm SCRATCH_LOAD_USHORT : FLAT_Real_AllAddr_gfx10<0x00a>;
1328defm SCRATCH_LOAD_SSHORT : FLAT_Real_AllAddr_gfx10<0x00b>;
1329defm SCRATCH_LOAD_DWORD : FLAT_Real_AllAddr_gfx10<0x00c>;
1330defm SCRATCH_LOAD_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x00d>;
1331defm SCRATCH_LOAD_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x00e>;
1332defm SCRATCH_LOAD_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x00f>;
1333defm SCRATCH_STORE_BYTE : FLAT_Real_AllAddr_gfx10<0x018>;
1334defm SCRATCH_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x019>;
1335defm SCRATCH_STORE_SHORT : FLAT_Real_AllAddr_gfx10<0x01a>;
1336defm SCRATCH_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x01b>;
1337defm SCRATCH_STORE_DWORD : FLAT_Real_AllAddr_gfx10<0x01c>;
1338defm SCRATCH_STORE_DWORDX2 : FLAT_Real_AllAddr_gfx10<0x01d>;
1339defm SCRATCH_STORE_DWORDX4 : FLAT_Real_AllAddr_gfx10<0x01e>;
1340defm SCRATCH_STORE_DWORDX3 : FLAT_Real_AllAddr_gfx10<0x01f>;
1341defm SCRATCH_LOAD_UBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x020>;
1342defm SCRATCH_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x021>;
1343defm SCRATCH_LOAD_SBYTE_D16 : FLAT_Real_AllAddr_gfx10<0x022>;
1344defm SCRATCH_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_gfx10<0x023>;
1345defm SCRATCH_LOAD_SHORT_D16 : FLAT_Real_AllAddr_gfx10<0x024>;
1346defm SCRATCH_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_gfx10<0x025>;
Stanislav Mekhanoshine93279f2019-07-11 00:10:17 +00001347
1348let SubtargetPredicate = HasAtomicFaddInsts in {
1349
1350defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Real_AllAddr_vi <0x04d>;
1351defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Real_AllAddr_vi <0x04e>;
1352
1353} // End SubtargetPredicate = HasAtomicFaddInsts