xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/FLATInstructions.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15ffd83dbSDimitry Andric//===-- FLATInstructions.td - FLAT Instruction Definitions ----------------===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90eae32dcSDimitry Andricdef FlatOffset : ComplexPattern<iPTR, 2, "SelectFlatOffset", [], [SDNPWantRoot], -10>;
100eae32dcSDimitry Andricdef GlobalOffset : ComplexPattern<iPTR, 2, "SelectGlobalOffset", [], [SDNPWantRoot], -10>;
110eae32dcSDimitry Andricdef ScratchOffset : ComplexPattern<iPTR, 2, "SelectScratchOffset", [], [SDNPWantRoot], -10>;
120b57cec5SDimitry Andric
130eae32dcSDimitry Andricdef GlobalSAddr : ComplexPattern<iPTR, 3, "SelectGlobalSAddr", [], [SDNPWantRoot], -10>;
140eae32dcSDimitry Andricdef ScratchSAddr : ComplexPattern<iPTR, 2, "SelectScratchSAddr", [], [SDNPWantRoot], -10>;
1581ad6265SDimitry Andricdef ScratchSVAddr : ComplexPattern<iPTR, 3, "SelectScratchSVAddr", [], [SDNPWantRoot], -10>;
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
180b57cec5SDimitry Andric// FLAT classes
190b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
200b57cec5SDimitry Andric
210b57cec5SDimitry Andricclass FLAT_Pseudo<string opName, dag outs, dag ins,
220b57cec5SDimitry Andric                  string asmOps, list<dag> pattern=[]> :
230b57cec5SDimitry Andric  InstSI<outs, ins, "", pattern>,
24*0fca6ea1SDimitry Andric  SIMCInstr<NAME, SIEncodingFamily.NONE> {
250b57cec5SDimitry Andric
260b57cec5SDimitry Andric  let isPseudo = 1;
270b57cec5SDimitry Andric  let isCodeGenOnly = 1;
280b57cec5SDimitry Andric
290b57cec5SDimitry Andric  let FLAT = 1;
300b57cec5SDimitry Andric
310b57cec5SDimitry Andric  let UseNamedOperandTable = 1;
320b57cec5SDimitry Andric  let hasSideEffects = 0;
330b57cec5SDimitry Andric  let SchedRW = [WriteVMEM];
340b57cec5SDimitry Andric
350b57cec5SDimitry Andric  string Mnemonic = opName;
360b57cec5SDimitry Andric  string AsmOperands = asmOps;
370b57cec5SDimitry Andric
380b57cec5SDimitry Andric  bits<1> is_flat_global = 0;
390b57cec5SDimitry Andric  bits<1> is_flat_scratch = 0;
400b57cec5SDimitry Andric
410b57cec5SDimitry Andric  bits<1> has_vdst = 1;
420b57cec5SDimitry Andric
430b57cec5SDimitry Andric  // We need to distinguish having saddr and enabling saddr because
440b57cec5SDimitry Andric  // saddr is only valid for scratch and global instructions. Pre-gfx9
450b57cec5SDimitry Andric  // these bits were reserved, so we also don't necessarily want to
460b57cec5SDimitry Andric  // set these bits to the disabled value for the original flat
470b57cec5SDimitry Andric  // segment instructions.
480b57cec5SDimitry Andric  bits<1> has_saddr = 0;
490b57cec5SDimitry Andric  bits<1> enabled_saddr = 0;
500b57cec5SDimitry Andric  bits<7> saddr_value = 0;
510b57cec5SDimitry Andric  bits<1> has_vaddr = 1;
520b57cec5SDimitry Andric
530b57cec5SDimitry Andric  bits<1> has_data = 1;
540b57cec5SDimitry Andric  bits<1> has_glc  = 1;
550b57cec5SDimitry Andric  bits<1> glcValue = 0;
560b57cec5SDimitry Andric  bits<1> has_dlc  = 1;
570b57cec5SDimitry Andric  bits<1> dlcValue = 0;
58fe6060f1SDimitry Andric  bits<1> has_sccb  = 1;
59fe6060f1SDimitry Andric  bits<1> sccbValue = 0;
6081ad6265SDimitry Andric  bits<1> has_sve  = 0; // Scratch VGPR Enable
6181ad6265SDimitry Andric  bits<1> lds = 0;
6281ad6265SDimitry Andric  bits<1> sve = 0;
631db9f3b2SDimitry Andric  bits<1> has_offset = 1;
640b57cec5SDimitry Andric
650b57cec5SDimitry Andric  let SubtargetPredicate = !if(is_flat_global, HasFlatGlobalInsts,
660b57cec5SDimitry Andric    !if(is_flat_scratch, HasFlatScratchInsts, HasFlatAddressSpace));
670b57cec5SDimitry Andric
680b57cec5SDimitry Andric  // TODO: M0 if it could possibly access LDS (before gfx9? only)?
690b57cec5SDimitry Andric  let Uses = !if(is_flat_global, [EXEC], [EXEC, FLAT_SCR]);
700b57cec5SDimitry Andric
710b57cec5SDimitry Andric  // Internally, FLAT instruction are executed as both an LDS and a
720b57cec5SDimitry Andric  // Buffer instruction; so, they increment both VM_CNT and LGKM_CNT
730b57cec5SDimitry Andric  // and are not considered done until both have been decremented.
740b57cec5SDimitry Andric  let VM_CNT = 1;
75e8d8bef9SDimitry Andric  let LGKM_CNT = !not(!or(is_flat_global, is_flat_scratch));
760b57cec5SDimitry Andric
77fe6060f1SDimitry Andric  let FlatGlobal = is_flat_global;
78e8d8bef9SDimitry Andric
79fe6060f1SDimitry Andric  let FlatScratch = is_flat_scratch;
800b57cec5SDimitry Andric}
810b57cec5SDimitry Andric
8281ad6265SDimitry Andricclass FLAT_Real <bits<7> op, FLAT_Pseudo ps, string opName = ps.Mnemonic> :
8381ad6265SDimitry Andric  InstSI <ps.OutOperandList, ps.InOperandList, opName # ps.AsmOperands, []>,
840b57cec5SDimitry Andric  Enc64 {
850b57cec5SDimitry Andric
860b57cec5SDimitry Andric  let isPseudo = 0;
870b57cec5SDimitry Andric  let isCodeGenOnly = 0;
880b57cec5SDimitry Andric
89fe6060f1SDimitry Andric  let FLAT = 1;
90fe6060f1SDimitry Andric
910b57cec5SDimitry Andric  // copy relevant pseudo op flags
920b57cec5SDimitry Andric  let SubtargetPredicate   = ps.SubtargetPredicate;
930b57cec5SDimitry Andric  let AsmMatchConverter    = ps.AsmMatchConverter;
94e8d8bef9SDimitry Andric  let OtherPredicates      = ps.OtherPredicates;
950b57cec5SDimitry Andric  let TSFlags              = ps.TSFlags;
960b57cec5SDimitry Andric  let UseNamedOperandTable = ps.UseNamedOperandTable;
97fe6060f1SDimitry Andric  let SchedRW              = ps.SchedRW;
98fe6060f1SDimitry Andric  let mayLoad              = ps.mayLoad;
99fe6060f1SDimitry Andric  let mayStore             = ps.mayStore;
100fe6060f1SDimitry Andric  let IsAtomicRet          = ps.IsAtomicRet;
101fe6060f1SDimitry Andric  let IsAtomicNoRet        = ps.IsAtomicNoRet;
102fe6060f1SDimitry Andric  let VM_CNT               = ps.VM_CNT;
103fe6060f1SDimitry Andric  let LGKM_CNT             = ps.LGKM_CNT;
10481ad6265SDimitry Andric  let VALU                 = ps.VALU;
105*0fca6ea1SDimitry Andric  let Uses                 = ps.Uses;
106*0fca6ea1SDimitry Andric  let Defs                 = ps.Defs;
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andric  // encoding fields
1090b57cec5SDimitry Andric  bits<8> vaddr;
110fe6060f1SDimitry Andric  bits<10> vdata;
1110b57cec5SDimitry Andric  bits<7> saddr;
112fe6060f1SDimitry Andric  bits<10> vdst;
1130b57cec5SDimitry Andric
114fe6060f1SDimitry Andric  bits<5> cpol;
1150b57cec5SDimitry Andric
1160b57cec5SDimitry Andric  // Only valid on gfx9
11781ad6265SDimitry Andric  bits<1> lds = ps.lds; // LDS DMA for global and scratch
1180b57cec5SDimitry Andric
1190b57cec5SDimitry Andric  // Segment, 00=flat, 01=scratch, 10=global, 11=reserved
120*0fca6ea1SDimitry Andric  bits<2> seg = {ps.is_flat_global, ps.is_flat_scratch};
1210b57cec5SDimitry Andric
1220b57cec5SDimitry Andric  // Signed offset. Highest bit ignored for flat and treated as 12-bit
1235ffd83dbSDimitry Andric  // unsigned for flat accesses.
1240b57cec5SDimitry Andric  bits<13> offset;
125fe6060f1SDimitry Andric  // GFX90A+ only: instruction uses AccVGPR for data
126fe6060f1SDimitry Andric  bits<1> acc = !if(ps.has_vdst, vdst{9}, !if(ps.has_data, vdata{9}, 0));
1270b57cec5SDimitry Andric
1280b57cec5SDimitry Andric  // We don't use tfe right now, and it was removed in gfx9.
1290b57cec5SDimitry Andric  bits<1> tfe = 0;
1300b57cec5SDimitry Andric
1310b57cec5SDimitry Andric  // Only valid on GFX9+
1320b57cec5SDimitry Andric  let Inst{12-0} = offset;
13381ad6265SDimitry Andric  let Inst{13} = !if(ps.has_sve, ps.sve, lds);
1340b57cec5SDimitry Andric  let Inst{15-14} = seg;
1350b57cec5SDimitry Andric
136fe6060f1SDimitry Andric  let Inst{16}    = !if(ps.has_glc, cpol{CPolBit.GLC}, ps.glcValue);
137fe6060f1SDimitry Andric  let Inst{17}    = cpol{CPolBit.SLC};
1380b57cec5SDimitry Andric  let Inst{24-18} = op;
1390b57cec5SDimitry Andric  let Inst{31-26} = 0x37; // Encoding.
1400b57cec5SDimitry Andric  let Inst{39-32} = !if(ps.has_vaddr, vaddr, ?);
141fe6060f1SDimitry Andric  let Inst{47-40} = !if(ps.has_data, vdata{7-0}, ?);
1420b57cec5SDimitry Andric  let Inst{54-48} = !if(ps.has_saddr, !if(ps.enabled_saddr, saddr, 0x7f), 0);
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andric  // 54-48 is reserved.
145fe6060f1SDimitry Andric  let Inst{55}    = acc; // nv on GFX9+, TFE before. AccVGPR for data on GFX90A.
146fe6060f1SDimitry Andric  let Inst{63-56} = !if(ps.has_vdst, vdst{7-0}, ?);
1470b57cec5SDimitry Andric}
1480b57cec5SDimitry Andric
1495f757f3fSDimitry Andricclass VFLAT_Real <bits<8> op, FLAT_Pseudo ps, string opName = ps.Mnemonic> :
1505f757f3fSDimitry Andric  InstSI <ps.OutOperandList, ps.InOperandList, opName # ps.AsmOperands, []>,
1515f757f3fSDimitry Andric  Enc96 {
1525f757f3fSDimitry Andric
1535f757f3fSDimitry Andric  let FLAT = 1;
1545f757f3fSDimitry Andric
1555f757f3fSDimitry Andric  // copy relevant pseudo op flags
1565f757f3fSDimitry Andric  let SubtargetPredicate   = ps.SubtargetPredicate;
157*0fca6ea1SDimitry Andric  let WaveSizePredicate    = ps.WaveSizePredicate;
1585f757f3fSDimitry Andric  let AsmMatchConverter    = ps.AsmMatchConverter;
1595f757f3fSDimitry Andric  let OtherPredicates      = ps.OtherPredicates;
1605f757f3fSDimitry Andric  let TSFlags              = ps.TSFlags;
1615f757f3fSDimitry Andric  let UseNamedOperandTable = ps.UseNamedOperandTable;
1625f757f3fSDimitry Andric  let SchedRW              = ps.SchedRW;
1635f757f3fSDimitry Andric  let mayLoad              = ps.mayLoad;
1645f757f3fSDimitry Andric  let mayStore             = ps.mayStore;
1655f757f3fSDimitry Andric  let IsAtomicRet          = ps.IsAtomicRet;
1665f757f3fSDimitry Andric  let IsAtomicNoRet        = ps.IsAtomicNoRet;
1675f757f3fSDimitry Andric  let VM_CNT               = ps.VM_CNT;
1685f757f3fSDimitry Andric  let LGKM_CNT             = ps.LGKM_CNT;
1695f757f3fSDimitry Andric  let VALU                 = ps.VALU;
170*0fca6ea1SDimitry Andric  let Uses                 = ps.Uses;
171*0fca6ea1SDimitry Andric  let Defs                 = ps.Defs;
1725f757f3fSDimitry Andric
1735f757f3fSDimitry Andric  bits<7> saddr;
1745f757f3fSDimitry Andric  bits<8> vdst;
1755f757f3fSDimitry Andric  bits<6> cpol;
1765f757f3fSDimitry Andric  bits<8> vdata; // vsrc
1775f757f3fSDimitry Andric  bits<8> vaddr;
1785f757f3fSDimitry Andric  bits<24> offset;
1795f757f3fSDimitry Andric
180*0fca6ea1SDimitry Andric  let Inst{6-0} = !if(ps.enabled_saddr, saddr, SGPR_NULL_gfx11plus.Index);
1815f757f3fSDimitry Andric  let Inst{21-14} = op;
1825f757f3fSDimitry Andric  let Inst{31-26} = 0x3b;
1835f757f3fSDimitry Andric  let Inst{39-32} = !if(ps.has_vdst, vdst, ?);
1845f757f3fSDimitry Andric  let Inst{49} = ps.sve;
1855f757f3fSDimitry Andric  let Inst{54-53} = cpol{2-1}; // th{2-1}
1865f757f3fSDimitry Andric  let Inst{52} = !if(ps.IsAtomicRet, 1, cpol{0}); // th{0}
1875f757f3fSDimitry Andric  let Inst{51-50} = cpol{4-3}; // scope
1885f757f3fSDimitry Andric  let Inst{62-55} = !if(ps.has_data, vdata{7-0}, ?);
1895f757f3fSDimitry Andric  let Inst{71-64} = !if(ps.has_vaddr, vaddr, ?);
1901db9f3b2SDimitry Andric  let Inst{95-72} = !if(ps.has_offset, offset, ?);
1915f757f3fSDimitry Andric}
1925f757f3fSDimitry Andric
1930b57cec5SDimitry Andricclass GlobalSaddrTable <bit is_saddr, string Name = ""> {
1940b57cec5SDimitry Andric  bit IsSaddr = is_saddr;
1950b57cec5SDimitry Andric  string SaddrOp = Name;
1960b57cec5SDimitry Andric}
1970b57cec5SDimitry Andric
1980b57cec5SDimitry Andric// TODO: Is exec allowed for saddr? The disabled value 0x7f is the
1990b57cec5SDimitry Andric// same encoding value as exec_hi, so it isn't possible to use that if
2000b57cec5SDimitry Andric// saddr is 32-bit (which isn't handled here yet).
2010b57cec5SDimitry Andricclass FLAT_Load_Pseudo <string opName, RegisterClass regClass,
2020b57cec5SDimitry Andric  bit HasTiedOutput = 0,
203fe6060f1SDimitry Andric  bit HasSaddr = 0, bit EnableSaddr = 0,
204fe6060f1SDimitry Andric  RegisterOperand vdata_op = getLdStRegisterOperand<regClass>.ret> : FLAT_Pseudo<
2050b57cec5SDimitry Andric  opName,
206fe6060f1SDimitry Andric  (outs vdata_op:$vdst),
2070b57cec5SDimitry Andric  !con(
2080b57cec5SDimitry Andric    !con(
209e8d8bef9SDimitry Andric      !if(EnableSaddr,
210e8d8bef9SDimitry Andric        (ins SReg_64:$saddr, VGPR_32:$vaddr),
211e8d8bef9SDimitry Andric        (ins VReg_64:$vaddr)),
212e8d8bef9SDimitry Andric        (ins flat_offset:$offset)),
213e8d8bef9SDimitry Andric        // FIXME: Operands with default values do not work with following non-optional operands.
214fe6060f1SDimitry Andric        !if(HasTiedOutput, (ins CPol:$cpol, vdata_op:$vdst_in),
215fe6060f1SDimitry Andric                           (ins CPol_0:$cpol))),
216fe6060f1SDimitry Andric  " $vdst, $vaddr"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$cpol"> {
2170b57cec5SDimitry Andric  let has_data = 0;
2180b57cec5SDimitry Andric  let mayLoad = 1;
2190b57cec5SDimitry Andric  let has_saddr = HasSaddr;
2200b57cec5SDimitry Andric  let enabled_saddr = EnableSaddr;
2210b57cec5SDimitry Andric
2220b57cec5SDimitry Andric  let Constraints = !if(HasTiedOutput, "$vdst = $vdst_in", "");
2230b57cec5SDimitry Andric  let DisableEncoding = !if(HasTiedOutput, "$vdst_in", "");
2240b57cec5SDimitry Andric}
2250b57cec5SDimitry Andric
2260b57cec5SDimitry Andricclass FLAT_Store_Pseudo <string opName, RegisterClass vdataClass,
2270b57cec5SDimitry Andric  bit HasSaddr = 0, bit EnableSaddr = 0> : FLAT_Pseudo<
2280b57cec5SDimitry Andric  opName,
2290b57cec5SDimitry Andric  (outs),
2300b57cec5SDimitry Andric  !con(
231e8d8bef9SDimitry Andric    !if(EnableSaddr,
232fe6060f1SDimitry Andric      (ins VGPR_32:$vaddr, getLdStRegisterOperand<vdataClass>.ret:$vdata, SReg_64:$saddr),
233fe6060f1SDimitry Andric      (ins VReg_64:$vaddr, getLdStRegisterOperand<vdataClass>.ret:$vdata)),
234fe6060f1SDimitry Andric      (ins flat_offset:$offset, CPol_0:$cpol)),
235fe6060f1SDimitry Andric  " $vaddr, $vdata"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$cpol"> {
2360b57cec5SDimitry Andric  let mayLoad  = 0;
2370b57cec5SDimitry Andric  let mayStore = 1;
2380b57cec5SDimitry Andric  let has_vdst = 0;
2390b57cec5SDimitry Andric  let has_saddr = HasSaddr;
2400b57cec5SDimitry Andric  let enabled_saddr = EnableSaddr;
2410b57cec5SDimitry Andric}
2420b57cec5SDimitry Andric
2430b57cec5SDimitry Andricmulticlass FLAT_Global_Load_Pseudo<string opName, RegisterClass regClass, bit HasTiedInput = 0> {
244*0fca6ea1SDimitry Andric  let is_flat_global = 1 in {
2450b57cec5SDimitry Andric    def "" : FLAT_Load_Pseudo<opName, regClass, HasTiedInput, 1>,
2460b57cec5SDimitry Andric      GlobalSaddrTable<0, opName>;
2470b57cec5SDimitry Andric    def _SADDR : FLAT_Load_Pseudo<opName, regClass, HasTiedInput, 1, 1>,
2480b57cec5SDimitry Andric      GlobalSaddrTable<1, opName>;
2490b57cec5SDimitry Andric  }
2500b57cec5SDimitry Andric}
2510b57cec5SDimitry Andric
2525ffd83dbSDimitry Andricclass FLAT_Global_Load_AddTid_Pseudo <string opName, RegisterClass regClass,
253349cc55cSDimitry Andric  bit HasTiedOutput = 0, bit EnableSaddr = 0> : FLAT_Pseudo<
2545ffd83dbSDimitry Andric  opName,
2555ffd83dbSDimitry Andric  (outs regClass:$vdst),
256e8d8bef9SDimitry Andric  !con(!if(EnableSaddr, (ins SReg_64:$saddr), (ins)),
257fe6060f1SDimitry Andric    (ins flat_offset:$offset, CPol_0:$cpol),
2585ffd83dbSDimitry Andric    !if(HasTiedOutput, (ins regClass:$vdst_in), (ins))),
259fe6060f1SDimitry Andric  " $vdst, "#!if(EnableSaddr, "$saddr", "off")#"$offset$cpol"> {
2605ffd83dbSDimitry Andric  let is_flat_global = 1;
2615ffd83dbSDimitry Andric  let has_data = 0;
2625ffd83dbSDimitry Andric  let mayLoad = 1;
2635ffd83dbSDimitry Andric  let has_vaddr = 0;
2645ffd83dbSDimitry Andric  let has_saddr = 1;
265e8d8bef9SDimitry Andric  let enabled_saddr = EnableSaddr;
2665ffd83dbSDimitry Andric
2675ffd83dbSDimitry Andric  let Constraints = !if(HasTiedOutput, "$vdst = $vdst_in", "");
2685ffd83dbSDimitry Andric  let DisableEncoding = !if(HasTiedOutput, "$vdst_in", "");
2695ffd83dbSDimitry Andric}
2705ffd83dbSDimitry Andric
271e8d8bef9SDimitry Andricmulticlass FLAT_Global_Load_AddTid_Pseudo<string opName, RegisterClass regClass,
272349cc55cSDimitry Andric  bit HasTiedOutput = 0> {
273349cc55cSDimitry Andric  def "" : FLAT_Global_Load_AddTid_Pseudo<opName, regClass, HasTiedOutput>,
274e8d8bef9SDimitry Andric    GlobalSaddrTable<0, opName>;
275349cc55cSDimitry Andric  def _SADDR : FLAT_Global_Load_AddTid_Pseudo<opName, regClass, HasTiedOutput, 1>,
276e8d8bef9SDimitry Andric    GlobalSaddrTable<1, opName>;
277e8d8bef9SDimitry Andric}
278e8d8bef9SDimitry Andric
2790b57cec5SDimitry Andricmulticlass FLAT_Global_Store_Pseudo<string opName, RegisterClass regClass> {
280*0fca6ea1SDimitry Andric  let is_flat_global = 1 in {
2810b57cec5SDimitry Andric    def "" : FLAT_Store_Pseudo<opName, regClass, 1>,
2820b57cec5SDimitry Andric      GlobalSaddrTable<0, opName>;
2830b57cec5SDimitry Andric    def _SADDR : FLAT_Store_Pseudo<opName, regClass, 1, 1>,
2840b57cec5SDimitry Andric      GlobalSaddrTable<1, opName>;
2850b57cec5SDimitry Andric  }
2860b57cec5SDimitry Andric}
2870b57cec5SDimitry Andric
28881ad6265SDimitry Andricclass FLAT_Global_Load_LDS_Pseudo <string opName, bit EnableSaddr = 0> : FLAT_Pseudo<
28981ad6265SDimitry Andric  opName,
29081ad6265SDimitry Andric  (outs ),
29181ad6265SDimitry Andric  !con(
29281ad6265SDimitry Andric      !if(EnableSaddr, (ins SReg_64:$saddr, VGPR_32:$vaddr), (ins VReg_64:$vaddr)),
29381ad6265SDimitry Andric      (ins flat_offset:$offset, CPol_0:$cpol)),
29481ad6265SDimitry Andric  " $vaddr"#!if(EnableSaddr, ", $saddr", ", off")#"$offset$cpol"> {
29581ad6265SDimitry Andric  let LGKM_CNT = 1;
29681ad6265SDimitry Andric  let is_flat_global = 1;
29781ad6265SDimitry Andric  let lds = 1;
29881ad6265SDimitry Andric  let has_data = 0;
29981ad6265SDimitry Andric  let has_vdst = 0;
30081ad6265SDimitry Andric  let mayLoad = 1;
30181ad6265SDimitry Andric  let mayStore = 1;
30281ad6265SDimitry Andric  let has_saddr = 1;
30381ad6265SDimitry Andric  let enabled_saddr = EnableSaddr;
30481ad6265SDimitry Andric  let VALU = 1;
30581ad6265SDimitry Andric  let Uses = [M0, EXEC];
30681ad6265SDimitry Andric  let SchedRW = [WriteVMEM, WriteLDS];
30781ad6265SDimitry Andric}
30881ad6265SDimitry Andric
30981ad6265SDimitry Andricmulticlass FLAT_Global_Load_LDS_Pseudo<string opName> {
31081ad6265SDimitry Andric  def ""     : FLAT_Global_Load_LDS_Pseudo<opName>,
31181ad6265SDimitry Andric    GlobalSaddrTable<0, opName>;
31281ad6265SDimitry Andric  def _SADDR : FLAT_Global_Load_LDS_Pseudo<opName, 1>,
31381ad6265SDimitry Andric    GlobalSaddrTable<1, opName>;
31481ad6265SDimitry Andric}
31581ad6265SDimitry Andric
3165ffd83dbSDimitry Andricclass FLAT_Global_Store_AddTid_Pseudo <string opName, RegisterClass vdataClass,
317349cc55cSDimitry Andric  bit EnableSaddr = 0> : FLAT_Pseudo<
3185ffd83dbSDimitry Andric  opName,
3195ffd83dbSDimitry Andric  (outs),
320e8d8bef9SDimitry Andric  !con(!if(EnableSaddr, (ins vdataClass:$vdata, SReg_64:$saddr), (ins vdataClass:$vdata)),
321fe6060f1SDimitry Andric    (ins flat_offset:$offset, CPol:$cpol)),
322fe6060f1SDimitry Andric  " $vdata, "#!if(EnableSaddr, "$saddr", "off")#"$offset$cpol"> {
3235ffd83dbSDimitry Andric  let is_flat_global = 1;
3245ffd83dbSDimitry Andric  let mayLoad  = 0;
3255ffd83dbSDimitry Andric  let mayStore = 1;
3265ffd83dbSDimitry Andric  let has_vdst = 0;
3275ffd83dbSDimitry Andric  let has_vaddr = 0;
3285ffd83dbSDimitry Andric  let has_saddr = 1;
329e8d8bef9SDimitry Andric  let enabled_saddr = EnableSaddr;
330e8d8bef9SDimitry Andric}
331e8d8bef9SDimitry Andric
332349cc55cSDimitry Andricmulticlass FLAT_Global_Store_AddTid_Pseudo<string opName, RegisterClass regClass> {
333349cc55cSDimitry Andric  def "" : FLAT_Global_Store_AddTid_Pseudo<opName, regClass>,
334e8d8bef9SDimitry Andric    GlobalSaddrTable<0, opName>;
335349cc55cSDimitry Andric  def _SADDR : FLAT_Global_Store_AddTid_Pseudo<opName, regClass, 1>,
336e8d8bef9SDimitry Andric    GlobalSaddrTable<1, opName>;
337e8d8bef9SDimitry Andric}
338e8d8bef9SDimitry Andric
3391db9f3b2SDimitry Andricclass FLAT_Global_Invalidate_Writeback<string opName, SDPatternOperator node = null_frag> :
3401db9f3b2SDimitry Andric  FLAT_Pseudo<opName, (outs), (ins CPol:$cpol), "$cpol", [(node)]> {
3411db9f3b2SDimitry Andric
3421db9f3b2SDimitry Andric  let AsmMatchConverter = "";
3431db9f3b2SDimitry Andric
3441db9f3b2SDimitry Andric  let hasSideEffects = 1;
3451db9f3b2SDimitry Andric  let mayLoad = 0;
3461db9f3b2SDimitry Andric  let mayStore = 0;
3471db9f3b2SDimitry Andric  let is_flat_global = 1;
3481db9f3b2SDimitry Andric
3491db9f3b2SDimitry Andric  let has_offset = 0;
3501db9f3b2SDimitry Andric  let has_saddr = 0;
3511db9f3b2SDimitry Andric  let enabled_saddr = 0;
3521db9f3b2SDimitry Andric  let saddr_value = 0;
3531db9f3b2SDimitry Andric  let has_vdst = 0;
3541db9f3b2SDimitry Andric  let has_data = 0;
3551db9f3b2SDimitry Andric  let has_vaddr = 0;
3561db9f3b2SDimitry Andric  let has_glc = 0;
3571db9f3b2SDimitry Andric  let has_dlc = 0;
3581db9f3b2SDimitry Andric  let glcValue = 0;
3591db9f3b2SDimitry Andric  let dlcValue = 0;
3601db9f3b2SDimitry Andric  let has_sccb = 0;
3611db9f3b2SDimitry Andric  let sccbValue = 0;
3621db9f3b2SDimitry Andric  let has_sve = 0;
3631db9f3b2SDimitry Andric  let lds = 0;
3641db9f3b2SDimitry Andric  let sve = 0;
3651db9f3b2SDimitry Andric}
3661db9f3b2SDimitry Andric
367e8d8bef9SDimitry Andricclass FlatScratchInst <string sv_op, string mode> {
368e8d8bef9SDimitry Andric  string SVOp = sv_op;
369e8d8bef9SDimitry Andric  string Mode = mode;
3705ffd83dbSDimitry Andric}
3715ffd83dbSDimitry Andric
3720b57cec5SDimitry Andricclass FLAT_Scratch_Load_Pseudo <string opName, RegisterClass regClass,
373e8d8bef9SDimitry Andric  bit HasTiedOutput = 0,
374e8d8bef9SDimitry Andric  bit EnableSaddr = 0,
37581ad6265SDimitry Andric  bit EnableSVE = 0,
37681ad6265SDimitry Andric  bit EnableVaddr = !or(EnableSVE, !not(EnableSaddr))>
377e8d8bef9SDimitry Andric  : FLAT_Pseudo<
3780b57cec5SDimitry Andric  opName,
379fe6060f1SDimitry Andric  (outs getLdStRegisterOperand<regClass>.ret:$vdst),
380e8d8bef9SDimitry Andric  !con(
38181ad6265SDimitry Andric    !if(EnableSVE,
38281ad6265SDimitry Andric        (ins VGPR_32:$vaddr, SReg_32_XEXEC_HI:$saddr, flat_offset:$offset),
3830b57cec5SDimitry Andric        !if(EnableSaddr,
384e8d8bef9SDimitry Andric          (ins SReg_32_XEXEC_HI:$saddr, flat_offset:$offset),
385e8d8bef9SDimitry Andric          !if(EnableVaddr,
386e8d8bef9SDimitry Andric            (ins VGPR_32:$vaddr, flat_offset:$offset),
38781ad6265SDimitry Andric            (ins flat_offset:$offset)))),
388fe6060f1SDimitry Andric     !if(HasTiedOutput, (ins CPol:$cpol, getLdStRegisterOperand<regClass>.ret:$vdst_in),
389fe6060f1SDimitry Andric                        (ins CPol_0:$cpol))),
390fe6060f1SDimitry Andric  " $vdst, "#!if(EnableVaddr, "$vaddr, ", "off, ")#!if(EnableSaddr, "$saddr", "off")#"$offset$cpol"> {
391*0fca6ea1SDimitry Andric  let is_flat_scratch = 1;
3920b57cec5SDimitry Andric  let has_data = 0;
3930b57cec5SDimitry Andric  let mayLoad = 1;
3940b57cec5SDimitry Andric  let has_saddr = 1;
3950b57cec5SDimitry Andric  let enabled_saddr = EnableSaddr;
396e8d8bef9SDimitry Andric  let has_vaddr = EnableVaddr;
39781ad6265SDimitry Andric  let has_sve = EnableSVE;
39881ad6265SDimitry Andric  let sve = EnableVaddr;
399e8d8bef9SDimitry Andric
400e8d8bef9SDimitry Andric  let Constraints = !if(HasTiedOutput, "$vdst = $vdst_in", "");
401e8d8bef9SDimitry Andric  let DisableEncoding = !if(HasTiedOutput, "$vdst_in", "");
4020b57cec5SDimitry Andric}
4030b57cec5SDimitry Andric
404e8d8bef9SDimitry Andricclass FLAT_Scratch_Store_Pseudo <string opName, RegisterClass vdataClass, bit EnableSaddr = 0,
40581ad6265SDimitry Andric  bit EnableSVE = 0,
40681ad6265SDimitry Andric  bit EnableVaddr = !or(EnableSVE, !not(EnableSaddr)),
407fe6060f1SDimitry Andric  RegisterOperand vdata_op = getLdStRegisterOperand<vdataClass>.ret> : FLAT_Pseudo<
4080b57cec5SDimitry Andric  opName,
4090b57cec5SDimitry Andric  (outs),
41081ad6265SDimitry Andric  !if(EnableSVE,
41181ad6265SDimitry Andric    (ins vdata_op:$vdata, VGPR_32:$vaddr, SReg_32_XEXEC_HI:$saddr, flat_offset:$offset, CPol_0:$cpol),
4120b57cec5SDimitry Andric    !if(EnableSaddr,
413fe6060f1SDimitry Andric      (ins vdata_op:$vdata, SReg_32_XEXEC_HI:$saddr, flat_offset:$offset, CPol_0:$cpol),
414e8d8bef9SDimitry Andric      !if(EnableVaddr,
415fe6060f1SDimitry Andric        (ins vdata_op:$vdata, VGPR_32:$vaddr, flat_offset:$offset, CPol_0:$cpol),
41681ad6265SDimitry Andric        (ins vdata_op:$vdata, flat_offset:$offset, CPol_0:$cpol)))),
417fe6060f1SDimitry Andric  " "#!if(EnableVaddr, "$vaddr", "off")#", $vdata, "#!if(EnableSaddr, "$saddr", "off")#"$offset$cpol"> {
418*0fca6ea1SDimitry Andric  let is_flat_scratch = 1;
4190b57cec5SDimitry Andric  let mayLoad  = 0;
4200b57cec5SDimitry Andric  let mayStore = 1;
4210b57cec5SDimitry Andric  let has_vdst = 0;
4220b57cec5SDimitry Andric  let has_saddr = 1;
4230b57cec5SDimitry Andric  let enabled_saddr = EnableSaddr;
424e8d8bef9SDimitry Andric  let has_vaddr = EnableVaddr;
42581ad6265SDimitry Andric  let has_sve = EnableSVE;
42681ad6265SDimitry Andric  let sve = EnableVaddr;
4270b57cec5SDimitry Andric}
4280b57cec5SDimitry Andric
429e8d8bef9SDimitry Andricmulticlass FLAT_Scratch_Load_Pseudo<string opName, RegisterClass regClass, bit HasTiedOutput = 0> {
430e8d8bef9SDimitry Andric  def "" : FLAT_Scratch_Load_Pseudo<opName, regClass, HasTiedOutput>,
431e8d8bef9SDimitry Andric           FlatScratchInst<opName, "SV">;
432e8d8bef9SDimitry Andric  def _SADDR : FLAT_Scratch_Load_Pseudo<opName, regClass, HasTiedOutput, 1>,
433e8d8bef9SDimitry Andric               FlatScratchInst<opName, "SS">;
434e8d8bef9SDimitry Andric
43581ad6265SDimitry Andric  let SubtargetPredicate = HasFlatScratchSVSMode in
43681ad6265SDimitry Andric  def _SVS : FLAT_Scratch_Load_Pseudo<opName, regClass, HasTiedOutput, 1, 1>,
43781ad6265SDimitry Andric             FlatScratchInst<opName, "SVS">;
43881ad6265SDimitry Andric
439e8d8bef9SDimitry Andric  let SubtargetPredicate = HasFlatScratchSTMode in
44081ad6265SDimitry Andric  def _ST  : FLAT_Scratch_Load_Pseudo<opName, regClass, HasTiedOutput, 0, 0, 0>,
441e8d8bef9SDimitry Andric             FlatScratchInst<opName, "ST">;
4420b57cec5SDimitry Andric}
4430b57cec5SDimitry Andric
4440b57cec5SDimitry Andricmulticlass FLAT_Scratch_Store_Pseudo<string opName, RegisterClass regClass> {
445e8d8bef9SDimitry Andric  def "" : FLAT_Scratch_Store_Pseudo<opName, regClass>,
446e8d8bef9SDimitry Andric           FlatScratchInst<opName, "SV">;
447e8d8bef9SDimitry Andric  def _SADDR : FLAT_Scratch_Store_Pseudo<opName, regClass, 1>,
448e8d8bef9SDimitry Andric               FlatScratchInst<opName, "SS">;
449e8d8bef9SDimitry Andric
45081ad6265SDimitry Andric  let SubtargetPredicate = HasFlatScratchSVSMode in
45181ad6265SDimitry Andric  def _SVS : FLAT_Scratch_Store_Pseudo<opName, regClass, 1, 1>,
45281ad6265SDimitry Andric             FlatScratchInst<opName, "SVS">;
45381ad6265SDimitry Andric
454e8d8bef9SDimitry Andric  let SubtargetPredicate = HasFlatScratchSTMode in
45581ad6265SDimitry Andric  def _ST  : FLAT_Scratch_Store_Pseudo<opName, regClass, 0, 0, 0>,
456e8d8bef9SDimitry Andric             FlatScratchInst<opName, "ST">;
4570b57cec5SDimitry Andric}
4580b57cec5SDimitry Andric
45981ad6265SDimitry Andricclass FLAT_Scratch_Load_LDS_Pseudo <string opName, bit EnableSaddr = 0,
46081ad6265SDimitry Andric  bit EnableSVE = 0,
46181ad6265SDimitry Andric  bit EnableVaddr = !or(EnableSVE, !not(EnableSaddr))> : FLAT_Pseudo<
46281ad6265SDimitry Andric  opName,
46381ad6265SDimitry Andric  (outs ),
46481ad6265SDimitry Andric  !if(EnableSVE,
46581ad6265SDimitry Andric    (ins VGPR_32:$vaddr, SReg_32_XEXEC_HI:$saddr, flat_offset:$offset, CPol:$cpol),
46681ad6265SDimitry Andric    !if(EnableSaddr,
46781ad6265SDimitry Andric      (ins SReg_32_XEXEC_HI:$saddr, flat_offset:$offset, CPol:$cpol),
46881ad6265SDimitry Andric      !if(EnableVaddr,
46981ad6265SDimitry Andric        (ins VGPR_32:$vaddr, flat_offset:$offset, CPol:$cpol),
47081ad6265SDimitry Andric        (ins flat_offset:$offset, CPol:$cpol)))),
47181ad6265SDimitry Andric  " "#!if(EnableVaddr, "$vaddr, ", "off, ")#!if(EnableSaddr, "$saddr", "off")#"$offset$cpol"> {
47281ad6265SDimitry Andric
47381ad6265SDimitry Andric  let LGKM_CNT = 1;
47481ad6265SDimitry Andric  let is_flat_scratch = 1;
47581ad6265SDimitry Andric  let lds = 1;
47681ad6265SDimitry Andric  let has_data = 0;
47781ad6265SDimitry Andric  let has_vdst = 0;
47881ad6265SDimitry Andric  let mayLoad = 1;
47981ad6265SDimitry Andric  let mayStore = 1;
48081ad6265SDimitry Andric  let has_saddr = 1;
48181ad6265SDimitry Andric  let enabled_saddr = EnableSaddr;
48281ad6265SDimitry Andric  let has_vaddr = EnableVaddr;
48381ad6265SDimitry Andric  let has_sve = EnableSVE;
48481ad6265SDimitry Andric  let sve = EnableVaddr;
48581ad6265SDimitry Andric  let VALU = 1;
48681ad6265SDimitry Andric  let Uses = [M0, EXEC];
48781ad6265SDimitry Andric  let SchedRW = [WriteVMEM, WriteLDS];
48881ad6265SDimitry Andric}
48981ad6265SDimitry Andric
49081ad6265SDimitry Andricmulticlass FLAT_Scratch_Load_LDS_Pseudo<string opName> {
49181ad6265SDimitry Andric  def ""     : FLAT_Scratch_Load_LDS_Pseudo<opName>,
49281ad6265SDimitry Andric               FlatScratchInst<opName, "SV">;
49381ad6265SDimitry Andric  def _SADDR : FLAT_Scratch_Load_LDS_Pseudo<opName, 1>,
49481ad6265SDimitry Andric               FlatScratchInst<opName, "SS">;
49581ad6265SDimitry Andric  def _SVS   : FLAT_Scratch_Load_LDS_Pseudo<opName, 1, 1>,
49681ad6265SDimitry Andric               FlatScratchInst<opName, "SVS">;
49781ad6265SDimitry Andric  def _ST    : FLAT_Scratch_Load_LDS_Pseudo<opName, 0, 0, 0>,
49881ad6265SDimitry Andric               FlatScratchInst<opName, "ST">;
49981ad6265SDimitry Andric}
50081ad6265SDimitry Andric
5010b57cec5SDimitry Andricclass FLAT_AtomicNoRet_Pseudo<string opName, dag outs, dag ins,
5020b57cec5SDimitry Andric                               string asm, list<dag> pattern = []> :
5030b57cec5SDimitry Andric  FLAT_Pseudo<opName, outs, ins, asm, pattern> {
5040b57cec5SDimitry Andric    let mayLoad = 1;
5050b57cec5SDimitry Andric    let mayStore = 1;
5060b57cec5SDimitry Andric    let has_glc  = 0;
5070b57cec5SDimitry Andric    let glcValue = 0;
5080b57cec5SDimitry Andric    let has_vdst = 0;
509fe6060f1SDimitry Andric    let has_sccb  = 1;
510fe6060f1SDimitry Andric    let sccbValue = 0;
511fe6060f1SDimitry Andric    let IsAtomicNoRet = 1;
5120b57cec5SDimitry Andric}
5130b57cec5SDimitry Andric
5140b57cec5SDimitry Andricclass FLAT_AtomicRet_Pseudo<string opName, dag outs, dag ins,
5150b57cec5SDimitry Andric                            string asm, list<dag> pattern = []>
5160b57cec5SDimitry Andric  : FLAT_AtomicNoRet_Pseudo<opName, outs, ins, asm, pattern> {
5170b57cec5SDimitry Andric  let hasPostISelHook = 1;
5180b57cec5SDimitry Andric  let has_vdst = 1;
5190b57cec5SDimitry Andric  let glcValue = 1;
520fe6060f1SDimitry Andric  let sccbValue = 0;
521fe6060f1SDimitry Andric  let IsAtomicNoRet = 0;
522fe6060f1SDimitry Andric  let IsAtomicRet = 1;
5230b57cec5SDimitry Andric}
5240b57cec5SDimitry Andric
52506c3fb27SDimitry Andricmulticlass FLAT_Atomic_Pseudo_NO_RTN<
5260b57cec5SDimitry Andric  string opName,
5270b57cec5SDimitry Andric  RegisterClass vdst_rc,
5280b57cec5SDimitry Andric  ValueType vt,
5290b57cec5SDimitry Andric  ValueType data_vt = vt,
5300b57cec5SDimitry Andric  RegisterClass data_rc = vdst_rc,
531fe6060f1SDimitry Andric  RegisterOperand data_op = getLdStRegisterOperand<data_rc>.ret> {
5320b57cec5SDimitry Andric  def "" : FLAT_AtomicNoRet_Pseudo <opName,
5330b57cec5SDimitry Andric    (outs),
534fe6060f1SDimitry Andric    (ins VReg_64:$vaddr, data_op:$vdata, flat_offset:$offset, CPol_0:$cpol),
535fe6060f1SDimitry Andric    " $vaddr, $vdata$offset$cpol">,
536*0fca6ea1SDimitry Andric    GlobalSaddrTable<0, opName> {
5377a6dacacSDimitry Andric    let FPAtomic = data_vt.isFP;
5385ffd83dbSDimitry Andric    let AddedComplexity = -1; // Prefer global atomics if available
5390b57cec5SDimitry Andric  }
54006c3fb27SDimitry Andric}
5410b57cec5SDimitry Andric
54206c3fb27SDimitry Andricmulticlass FLAT_Atomic_Pseudo_RTN<
54306c3fb27SDimitry Andric  string opName,
54406c3fb27SDimitry Andric  RegisterClass vdst_rc,
54506c3fb27SDimitry Andric  ValueType vt,
54606c3fb27SDimitry Andric  ValueType data_vt = vt,
54706c3fb27SDimitry Andric  RegisterClass data_rc = vdst_rc,
54806c3fb27SDimitry Andric  RegisterOperand data_op = getLdStRegisterOperand<data_rc>.ret> {
5490b57cec5SDimitry Andric  def _RTN : FLAT_AtomicRet_Pseudo <opName,
550fe6060f1SDimitry Andric    (outs getLdStRegisterOperand<vdst_rc>.ret:$vdst),
551fe6060f1SDimitry Andric    (ins VReg_64:$vaddr, data_op:$vdata, flat_offset:$offset, CPol_GLC1:$cpol),
55281ad6265SDimitry Andric    " $vdst, $vaddr, $vdata$offset$cpol">,
553*0fca6ea1SDimitry Andric    GlobalSaddrTable<0, opName#"_rtn"> {
5547a6dacacSDimitry Andric    let FPAtomic = data_vt.isFP;
5555ffd83dbSDimitry Andric    let AddedComplexity = -1; // Prefer global atomics if available
5560b57cec5SDimitry Andric  }
5570b57cec5SDimitry Andric}
5580b57cec5SDimitry Andric
55906c3fb27SDimitry Andricmulticlass FLAT_Atomic_Pseudo<
56006c3fb27SDimitry Andric  string opName,
56106c3fb27SDimitry Andric  RegisterClass vdst_rc,
56206c3fb27SDimitry Andric  ValueType vt,
56306c3fb27SDimitry Andric  ValueType data_vt = vt,
56406c3fb27SDimitry Andric  RegisterClass data_rc = vdst_rc,
56506c3fb27SDimitry Andric  RegisterOperand data_op = getLdStRegisterOperand<data_rc>.ret> {
5667a6dacacSDimitry Andric  defm "" : FLAT_Atomic_Pseudo_NO_RTN<opName, vdst_rc, vt, data_vt, data_rc, data_op>;
5677a6dacacSDimitry Andric  defm "" : FLAT_Atomic_Pseudo_RTN<opName, vdst_rc, vt, data_vt, data_rc, data_op>;
56806c3fb27SDimitry Andric}
56906c3fb27SDimitry Andric
5700b57cec5SDimitry Andricmulticlass FLAT_Global_Atomic_Pseudo_NO_RTN<
5710b57cec5SDimitry Andric  string opName,
5720b57cec5SDimitry Andric  RegisterClass vdst_rc,
5730b57cec5SDimitry Andric  ValueType vt,
5740b57cec5SDimitry Andric  ValueType data_vt = vt,
5750b57cec5SDimitry Andric  RegisterClass data_rc = vdst_rc,
576fe6060f1SDimitry Andric  RegisterOperand data_op = getLdStRegisterOperand<data_rc>.ret> {
5770b57cec5SDimitry Andric
578*0fca6ea1SDimitry Andric  let is_flat_global = 1 in {
5790b57cec5SDimitry Andric    def "" : FLAT_AtomicNoRet_Pseudo <opName,
5800b57cec5SDimitry Andric      (outs),
581fe6060f1SDimitry Andric      (ins VReg_64:$vaddr, data_op:$vdata, flat_offset:$offset, CPol_0:$cpol),
582fe6060f1SDimitry Andric      " $vaddr, $vdata, off$offset$cpol">,
583*0fca6ea1SDimitry Andric      GlobalSaddrTable<0, opName> {
5840b57cec5SDimitry Andric      let has_saddr = 1;
5857a6dacacSDimitry Andric      let FPAtomic = data_vt.isFP;
5860b57cec5SDimitry Andric    }
5870b57cec5SDimitry Andric
5880b57cec5SDimitry Andric    def _SADDR : FLAT_AtomicNoRet_Pseudo <opName,
5890b57cec5SDimitry Andric      (outs),
590fe6060f1SDimitry Andric      (ins VGPR_32:$vaddr, data_op:$vdata, SReg_64:$saddr, flat_offset:$offset, CPol_0:$cpol),
591fe6060f1SDimitry Andric      " $vaddr, $vdata, $saddr$offset$cpol">,
592*0fca6ea1SDimitry Andric      GlobalSaddrTable<1, opName> {
5930b57cec5SDimitry Andric      let has_saddr = 1;
5940b57cec5SDimitry Andric      let enabled_saddr = 1;
5957a6dacacSDimitry Andric      let FPAtomic = data_vt.isFP;
5960b57cec5SDimitry Andric    }
5970b57cec5SDimitry Andric  }
598*0fca6ea1SDimitry Andric}
5990b57cec5SDimitry Andric
6000b57cec5SDimitry Andricmulticlass FLAT_Global_Atomic_Pseudo_RTN<
6010b57cec5SDimitry Andric  string opName,
6020b57cec5SDimitry Andric  RegisterClass vdst_rc,
6030b57cec5SDimitry Andric  ValueType vt,
6040b57cec5SDimitry Andric  ValueType data_vt = vt,
6050b57cec5SDimitry Andric  RegisterClass data_rc = vdst_rc,
606fe6060f1SDimitry Andric  RegisterOperand data_op = getLdStRegisterOperand<data_rc>.ret,
607fe6060f1SDimitry Andric  RegisterOperand vdst_op = getLdStRegisterOperand<vdst_rc>.ret> {
6080b57cec5SDimitry Andric
609*0fca6ea1SDimitry Andric  let is_flat_global = 1 in {
6100b57cec5SDimitry Andric    def _RTN : FLAT_AtomicRet_Pseudo <opName,
611fe6060f1SDimitry Andric      (outs vdst_op:$vdst),
612fe6060f1SDimitry Andric        (ins VReg_64:$vaddr, data_op:$vdata, flat_offset:$offset, CPol_GLC1:$cpol),
61381ad6265SDimitry Andric      " $vdst, $vaddr, $vdata, off$offset$cpol">,
614*0fca6ea1SDimitry Andric      GlobalSaddrTable<0, opName#"_rtn"> {
6150b57cec5SDimitry Andric      let has_saddr = 1;
6167a6dacacSDimitry Andric      let FPAtomic = data_vt.isFP;
6170b57cec5SDimitry Andric    }
6180b57cec5SDimitry Andric
6190b57cec5SDimitry Andric    def _SADDR_RTN : FLAT_AtomicRet_Pseudo <opName,
620fe6060f1SDimitry Andric      (outs vdst_op:$vdst),
621fe6060f1SDimitry Andric        (ins VGPR_32:$vaddr, data_op:$vdata, SReg_64:$saddr, flat_offset:$offset, CPol_GLC1:$cpol),
622fe6060f1SDimitry Andric      " $vdst, $vaddr, $vdata, $saddr$offset$cpol">,
623*0fca6ea1SDimitry Andric      GlobalSaddrTable<1, opName#"_rtn"> {
6240b57cec5SDimitry Andric       let has_saddr = 1;
6250b57cec5SDimitry Andric       let enabled_saddr = 1;
6267a6dacacSDimitry Andric       let FPAtomic = data_vt.isFP;
6270b57cec5SDimitry Andric    }
6280b57cec5SDimitry Andric  }
629*0fca6ea1SDimitry Andric}
6300b57cec5SDimitry Andric
6310b57cec5SDimitry Andricmulticlass FLAT_Global_Atomic_Pseudo<
6320b57cec5SDimitry Andric  string opName,
6330b57cec5SDimitry Andric  RegisterClass vdst_rc,
6340b57cec5SDimitry Andric  ValueType vt,
6350b57cec5SDimitry Andric  ValueType data_vt = vt,
6365ffd83dbSDimitry Andric  RegisterClass data_rc = vdst_rc> {
637349cc55cSDimitry Andric  defm "" : FLAT_Global_Atomic_Pseudo_NO_RTN<opName, vdst_rc, vt, data_vt, data_rc>;
63881ad6265SDimitry Andric  defm "" : FLAT_Global_Atomic_Pseudo_RTN<opName, vdst_rc, vt, data_vt, data_rc>;
6395ffd83dbSDimitry Andric}
6400b57cec5SDimitry Andric
6410b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
6420b57cec5SDimitry Andric// Flat Instructions
6430b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
6440b57cec5SDimitry Andric
6450b57cec5SDimitry Andricdef FLAT_LOAD_UBYTE    : FLAT_Load_Pseudo <"flat_load_ubyte", VGPR_32>;
6460b57cec5SDimitry Andricdef FLAT_LOAD_SBYTE    : FLAT_Load_Pseudo <"flat_load_sbyte", VGPR_32>;
6470b57cec5SDimitry Andricdef FLAT_LOAD_USHORT   : FLAT_Load_Pseudo <"flat_load_ushort", VGPR_32>;
6480b57cec5SDimitry Andricdef FLAT_LOAD_SSHORT   : FLAT_Load_Pseudo <"flat_load_sshort", VGPR_32>;
6490b57cec5SDimitry Andricdef FLAT_LOAD_DWORD    : FLAT_Load_Pseudo <"flat_load_dword", VGPR_32>;
6500b57cec5SDimitry Andricdef FLAT_LOAD_DWORDX2  : FLAT_Load_Pseudo <"flat_load_dwordx2", VReg_64>;
6510b57cec5SDimitry Andricdef FLAT_LOAD_DWORDX4  : FLAT_Load_Pseudo <"flat_load_dwordx4", VReg_128>;
6520b57cec5SDimitry Andricdef FLAT_LOAD_DWORDX3  : FLAT_Load_Pseudo <"flat_load_dwordx3", VReg_96>;
6530b57cec5SDimitry Andric
6540b57cec5SDimitry Andricdef FLAT_STORE_BYTE    : FLAT_Store_Pseudo <"flat_store_byte", VGPR_32>;
6550b57cec5SDimitry Andricdef FLAT_STORE_SHORT   : FLAT_Store_Pseudo <"flat_store_short", VGPR_32>;
6560b57cec5SDimitry Andricdef FLAT_STORE_DWORD   : FLAT_Store_Pseudo <"flat_store_dword", VGPR_32>;
6570b57cec5SDimitry Andricdef FLAT_STORE_DWORDX2 : FLAT_Store_Pseudo <"flat_store_dwordx2", VReg_64>;
6580b57cec5SDimitry Andricdef FLAT_STORE_DWORDX4 : FLAT_Store_Pseudo <"flat_store_dwordx4", VReg_128>;
6590b57cec5SDimitry Andricdef FLAT_STORE_DWORDX3 : FLAT_Store_Pseudo <"flat_store_dwordx3", VReg_96>;
6600b57cec5SDimitry Andric
6610b57cec5SDimitry Andriclet SubtargetPredicate = HasD16LoadStore in {
662bdd1243dSDimitry Andriclet TiedSourceNotRead = 1 in {
6630b57cec5SDimitry Andricdef FLAT_LOAD_UBYTE_D16     : FLAT_Load_Pseudo <"flat_load_ubyte_d16", VGPR_32, 1>;
6640b57cec5SDimitry Andricdef FLAT_LOAD_UBYTE_D16_HI  : FLAT_Load_Pseudo <"flat_load_ubyte_d16_hi", VGPR_32, 1>;
6650b57cec5SDimitry Andricdef FLAT_LOAD_SBYTE_D16     : FLAT_Load_Pseudo <"flat_load_sbyte_d16", VGPR_32, 1>;
6660b57cec5SDimitry Andricdef FLAT_LOAD_SBYTE_D16_HI  : FLAT_Load_Pseudo <"flat_load_sbyte_d16_hi", VGPR_32, 1>;
6670b57cec5SDimitry Andricdef FLAT_LOAD_SHORT_D16     : FLAT_Load_Pseudo <"flat_load_short_d16", VGPR_32, 1>;
6680b57cec5SDimitry Andricdef FLAT_LOAD_SHORT_D16_HI  : FLAT_Load_Pseudo <"flat_load_short_d16_hi", VGPR_32, 1>;
669bdd1243dSDimitry Andric}
6700b57cec5SDimitry Andric
6710b57cec5SDimitry Andricdef FLAT_STORE_BYTE_D16_HI  : FLAT_Store_Pseudo <"flat_store_byte_d16_hi", VGPR_32>;
6720b57cec5SDimitry Andricdef FLAT_STORE_SHORT_D16_HI : FLAT_Store_Pseudo <"flat_store_short_d16_hi", VGPR_32>;
6730b57cec5SDimitry Andric}
6740b57cec5SDimitry Andric
6750b57cec5SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP    : FLAT_Atomic_Pseudo <"flat_atomic_cmpswap",
67681ad6265SDimitry Andric                                VGPR_32, i32, v2i32, VReg_64>;
6770b57cec5SDimitry Andric
6780b57cec5SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_cmpswap_x2",
67981ad6265SDimitry Andric                                VReg_64, i64, v2i64, VReg_128>;
6800b57cec5SDimitry Andric
6810b57cec5SDimitry Andricdefm FLAT_ATOMIC_SWAP       : FLAT_Atomic_Pseudo <"flat_atomic_swap",
68281ad6265SDimitry Andric                                VGPR_32, i32>;
6830b57cec5SDimitry Andric
6840b57cec5SDimitry Andricdefm FLAT_ATOMIC_SWAP_X2    : FLAT_Atomic_Pseudo <"flat_atomic_swap_x2",
68581ad6265SDimitry Andric                                VReg_64, i64>;
6860b57cec5SDimitry Andric
6870b57cec5SDimitry Andricdefm FLAT_ATOMIC_ADD        : FLAT_Atomic_Pseudo <"flat_atomic_add",
68881ad6265SDimitry Andric                                VGPR_32, i32>;
6890b57cec5SDimitry Andric
6900b57cec5SDimitry Andricdefm FLAT_ATOMIC_SUB        : FLAT_Atomic_Pseudo <"flat_atomic_sub",
69181ad6265SDimitry Andric                                VGPR_32, i32>;
6920b57cec5SDimitry Andric
6930b57cec5SDimitry Andricdefm FLAT_ATOMIC_SMIN       : FLAT_Atomic_Pseudo <"flat_atomic_smin",
69481ad6265SDimitry Andric                                VGPR_32, i32>;
6950b57cec5SDimitry Andric
6960b57cec5SDimitry Andricdefm FLAT_ATOMIC_UMIN       : FLAT_Atomic_Pseudo <"flat_atomic_umin",
69781ad6265SDimitry Andric                                VGPR_32, i32>;
6980b57cec5SDimitry Andric
6990b57cec5SDimitry Andricdefm FLAT_ATOMIC_SMAX       : FLAT_Atomic_Pseudo <"flat_atomic_smax",
70081ad6265SDimitry Andric                                VGPR_32, i32>;
7010b57cec5SDimitry Andric
7020b57cec5SDimitry Andricdefm FLAT_ATOMIC_UMAX       : FLAT_Atomic_Pseudo <"flat_atomic_umax",
70381ad6265SDimitry Andric                                VGPR_32, i32>;
7040b57cec5SDimitry Andric
7050b57cec5SDimitry Andricdefm FLAT_ATOMIC_AND        : FLAT_Atomic_Pseudo <"flat_atomic_and",
70681ad6265SDimitry Andric                                VGPR_32, i32>;
7070b57cec5SDimitry Andric
7080b57cec5SDimitry Andricdefm FLAT_ATOMIC_OR         : FLAT_Atomic_Pseudo <"flat_atomic_or",
70981ad6265SDimitry Andric                                VGPR_32, i32>;
7100b57cec5SDimitry Andric
7110b57cec5SDimitry Andricdefm FLAT_ATOMIC_XOR        : FLAT_Atomic_Pseudo <"flat_atomic_xor",
71281ad6265SDimitry Andric                                VGPR_32, i32>;
7130b57cec5SDimitry Andric
7140b57cec5SDimitry Andricdefm FLAT_ATOMIC_INC        : FLAT_Atomic_Pseudo <"flat_atomic_inc",
71581ad6265SDimitry Andric                                VGPR_32, i32>;
7160b57cec5SDimitry Andric
7170b57cec5SDimitry Andricdefm FLAT_ATOMIC_DEC        : FLAT_Atomic_Pseudo <"flat_atomic_dec",
71881ad6265SDimitry Andric                                VGPR_32, i32>;
7190b57cec5SDimitry Andric
7200b57cec5SDimitry Andricdefm FLAT_ATOMIC_ADD_X2     : FLAT_Atomic_Pseudo <"flat_atomic_add_x2",
72181ad6265SDimitry Andric                                VReg_64, i64>;
7220b57cec5SDimitry Andric
7230b57cec5SDimitry Andricdefm FLAT_ATOMIC_SUB_X2     : FLAT_Atomic_Pseudo <"flat_atomic_sub_x2",
72481ad6265SDimitry Andric                                VReg_64, i64>;
7250b57cec5SDimitry Andric
7260b57cec5SDimitry Andricdefm FLAT_ATOMIC_SMIN_X2    : FLAT_Atomic_Pseudo <"flat_atomic_smin_x2",
72781ad6265SDimitry Andric                                VReg_64, i64>;
7280b57cec5SDimitry Andric
7290b57cec5SDimitry Andricdefm FLAT_ATOMIC_UMIN_X2    : FLAT_Atomic_Pseudo <"flat_atomic_umin_x2",
73081ad6265SDimitry Andric                                VReg_64, i64>;
7310b57cec5SDimitry Andric
7320b57cec5SDimitry Andricdefm FLAT_ATOMIC_SMAX_X2    : FLAT_Atomic_Pseudo <"flat_atomic_smax_x2",
73381ad6265SDimitry Andric                                VReg_64, i64>;
7340b57cec5SDimitry Andric
7350b57cec5SDimitry Andricdefm FLAT_ATOMIC_UMAX_X2    : FLAT_Atomic_Pseudo <"flat_atomic_umax_x2",
73681ad6265SDimitry Andric                                VReg_64, i64>;
7370b57cec5SDimitry Andric
7380b57cec5SDimitry Andricdefm FLAT_ATOMIC_AND_X2     : FLAT_Atomic_Pseudo <"flat_atomic_and_x2",
73981ad6265SDimitry Andric                                VReg_64, i64>;
7400b57cec5SDimitry Andric
7410b57cec5SDimitry Andricdefm FLAT_ATOMIC_OR_X2      : FLAT_Atomic_Pseudo <"flat_atomic_or_x2",
74281ad6265SDimitry Andric                                VReg_64, i64>;
7430b57cec5SDimitry Andric
7440b57cec5SDimitry Andricdefm FLAT_ATOMIC_XOR_X2     : FLAT_Atomic_Pseudo <"flat_atomic_xor_x2",
74581ad6265SDimitry Andric                                VReg_64, i64>;
7460b57cec5SDimitry Andric
7470b57cec5SDimitry Andricdefm FLAT_ATOMIC_INC_X2     : FLAT_Atomic_Pseudo <"flat_atomic_inc_x2",
74881ad6265SDimitry Andric                                VReg_64, i64>;
7490b57cec5SDimitry Andric
7500b57cec5SDimitry Andricdefm FLAT_ATOMIC_DEC_X2     : FLAT_Atomic_Pseudo <"flat_atomic_dec_x2",
75181ad6265SDimitry Andric                                VReg_64, i64>;
7520b57cec5SDimitry Andric
7530b57cec5SDimitry Andric// GFX7-, GFX10-only flat instructions.
7540b57cec5SDimitry Andriclet SubtargetPredicate = isGFX7GFX10 in {
7550b57cec5SDimitry Andricdefm FLAT_ATOMIC_FCMPSWAP_X2 : FLAT_Atomic_Pseudo <"flat_atomic_fcmpswap_x2",
75681ad6265SDimitry Andric                                VReg_64, f64, v2f64, VReg_128>;
7570b57cec5SDimitry Andric} // End SubtargetPredicate = isGFX7GFX10
7580b57cec5SDimitry Andric
759*0fca6ea1SDimitry Andric
760*0fca6ea1SDimitry Andric// The names may be flat_atomic_fmin_x2 on some subtargets, but we
761*0fca6ea1SDimitry Andric// choose this as the canonical name.
762*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasAtomicFMinFMaxF64FlatInsts in {
763*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_MIN_F64 : FLAT_Atomic_Pseudo <"flat_atomic_min_f64",
764*0fca6ea1SDimitry Andric                                               VReg_64, f64>;
765*0fca6ea1SDimitry Andric
766*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_MAX_F64 : FLAT_Atomic_Pseudo <"flat_atomic_max_f64",
767*0fca6ea1SDimitry Andric                                                VReg_64, f64>;
768*0fca6ea1SDimitry Andric}
769*0fca6ea1SDimitry Andric
770*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasAtomicFMinFMaxF64GlobalInsts in {
77181ad6265SDimitry Andricdefm GLOBAL_ATOMIC_MIN_F64 : FLAT_Global_Atomic_Pseudo<"global_atomic_min_f64", VReg_64, f64>;
77281ad6265SDimitry Andricdefm GLOBAL_ATOMIC_MAX_F64 : FLAT_Global_Atomic_Pseudo<"global_atomic_max_f64", VReg_64, f64>;
773*0fca6ea1SDimitry Andric}
774*0fca6ea1SDimitry Andric
775*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasFlatBufferGlobalAtomicFaddF64Inst  in {
776*0fca6ea1SDimitry Andric  defm FLAT_ATOMIC_ADD_F64   : FLAT_Atomic_Pseudo<"flat_atomic_add_f64", VReg_64, f64>;
777*0fca6ea1SDimitry Andric  defm GLOBAL_ATOMIC_ADD_F64 : FLAT_Global_Atomic_Pseudo<"global_atomic_add_f64", VReg_64, f64>;
778*0fca6ea1SDimitry Andric} // End SubtargetPredicate = HasFlatBufferGlobalAtomicFaddF64Inst
779fe6060f1SDimitry Andric
78006c3fb27SDimitry Andriclet SubtargetPredicate = HasAtomicFlatPkAdd16Insts in {
78181ad6265SDimitry Andric  defm FLAT_ATOMIC_PK_ADD_F16    : FLAT_Atomic_Pseudo<"flat_atomic_pk_add_f16",  VGPR_32, v2f16>;
78206c3fb27SDimitry Andric  let FPAtomic = 1 in
78306c3fb27SDimitry Andric    defm FLAT_ATOMIC_PK_ADD_BF16   : FLAT_Atomic_Pseudo<"flat_atomic_pk_add_bf16", VGPR_32, v2i16>;
78406c3fb27SDimitry Andric} // End SubtargetPredicate = HasAtomicFlatPkAdd16Insts
78506c3fb27SDimitry Andric
78606c3fb27SDimitry Andriclet SubtargetPredicate = HasAtomicGlobalPkAddBF16Inst, FPAtomic = 1 in
78706c3fb27SDimitry Andric  defm GLOBAL_ATOMIC_PK_ADD_BF16 : FLAT_Global_Atomic_Pseudo<"global_atomic_pk_add_bf16", VGPR_32, v2i16>;
78881ad6265SDimitry Andric
78981ad6265SDimitry Andric// GFX7-, GFX10-, GFX11-only flat instructions.
79081ad6265SDimitry Andriclet SubtargetPredicate = isGFX7GFX10GFX11 in {
79181ad6265SDimitry Andric
79281ad6265SDimitry Andricdefm FLAT_ATOMIC_FCMPSWAP    : FLAT_Atomic_Pseudo <"flat_atomic_fcmpswap",
79381ad6265SDimitry Andric                                VGPR_32, f32, v2f32, VReg_64>;
79481ad6265SDimitry Andric
79581ad6265SDimitry Andricdefm FLAT_ATOMIC_FMIN        : FLAT_Atomic_Pseudo <"flat_atomic_fmin",
79681ad6265SDimitry Andric                                VGPR_32, f32>;
79781ad6265SDimitry Andric
79881ad6265SDimitry Andricdefm FLAT_ATOMIC_FMAX        : FLAT_Atomic_Pseudo <"flat_atomic_fmax",
79981ad6265SDimitry Andric                                VGPR_32, f32>;
80081ad6265SDimitry Andric
80181ad6265SDimitry Andric} // End SubtargetPredicate = isGFX7GFX10GFX11
80281ad6265SDimitry Andric
80381ad6265SDimitry Andric// GFX940-, GFX11-only flat instructions.
804bdd1243dSDimitry Andriclet SubtargetPredicate = HasFlatAtomicFaddF32Inst in {
80581ad6265SDimitry Andric  defm FLAT_ATOMIC_ADD_F32       : FLAT_Atomic_Pseudo<"flat_atomic_add_f32",     VGPR_32, f32>;
806bdd1243dSDimitry Andric} // End SubtargetPredicate = HasFlatAtomicFaddF32Inst
80781ad6265SDimitry Andric
8085f757f3fSDimitry Andriclet SubtargetPredicate = isGFX12Plus in {
8095f757f3fSDimitry Andric  defm FLAT_ATOMIC_CSUB_U32 : FLAT_Atomic_Pseudo <"flat_atomic_csub_u32", VGPR_32, i32>;
8107a6dacacSDimitry Andric  defm FLAT_ATOMIC_COND_SUB_U32 : FLAT_Atomic_Pseudo <"flat_atomic_cond_sub_u32", VGPR_32, i32>;
8115f757f3fSDimitry Andric} // End SubtargetPredicate = isGFX12Plus
8125f757f3fSDimitry Andric
8130b57cec5SDimitry Andricdefm GLOBAL_LOAD_UBYTE    : FLAT_Global_Load_Pseudo <"global_load_ubyte", VGPR_32>;
8140b57cec5SDimitry Andricdefm GLOBAL_LOAD_SBYTE    : FLAT_Global_Load_Pseudo <"global_load_sbyte", VGPR_32>;
8150b57cec5SDimitry Andricdefm GLOBAL_LOAD_USHORT   : FLAT_Global_Load_Pseudo <"global_load_ushort", VGPR_32>;
8160b57cec5SDimitry Andricdefm GLOBAL_LOAD_SSHORT   : FLAT_Global_Load_Pseudo <"global_load_sshort", VGPR_32>;
8170b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORD    : FLAT_Global_Load_Pseudo <"global_load_dword", VGPR_32>;
8180b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORDX2  : FLAT_Global_Load_Pseudo <"global_load_dwordx2", VReg_64>;
8190b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORDX3  : FLAT_Global_Load_Pseudo <"global_load_dwordx3", VReg_96>;
8200b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORDX4  : FLAT_Global_Load_Pseudo <"global_load_dwordx4", VReg_128>;
8210b57cec5SDimitry Andric
822bdd1243dSDimitry Andriclet TiedSourceNotRead = 1 in {
8230b57cec5SDimitry Andricdefm GLOBAL_LOAD_UBYTE_D16    : FLAT_Global_Load_Pseudo <"global_load_ubyte_d16", VGPR_32, 1>;
8240b57cec5SDimitry Andricdefm GLOBAL_LOAD_UBYTE_D16_HI : FLAT_Global_Load_Pseudo <"global_load_ubyte_d16_hi", VGPR_32, 1>;
8250b57cec5SDimitry Andricdefm GLOBAL_LOAD_SBYTE_D16    : FLAT_Global_Load_Pseudo <"global_load_sbyte_d16", VGPR_32, 1>;
8260b57cec5SDimitry Andricdefm GLOBAL_LOAD_SBYTE_D16_HI : FLAT_Global_Load_Pseudo <"global_load_sbyte_d16_hi", VGPR_32, 1>;
8270b57cec5SDimitry Andricdefm GLOBAL_LOAD_SHORT_D16    : FLAT_Global_Load_Pseudo <"global_load_short_d16", VGPR_32, 1>;
8280b57cec5SDimitry Andricdefm GLOBAL_LOAD_SHORT_D16_HI : FLAT_Global_Load_Pseudo <"global_load_short_d16_hi", VGPR_32, 1>;
829bdd1243dSDimitry Andric}
830bdd1243dSDimitry Andric
8315ffd83dbSDimitry Andriclet OtherPredicates = [HasGFX10_BEncoding] in
832e8d8bef9SDimitry Andricdefm GLOBAL_LOAD_DWORD_ADDTID : FLAT_Global_Load_AddTid_Pseudo <"global_load_dword_addtid", VGPR_32>;
8330b57cec5SDimitry Andric
8340b57cec5SDimitry Andricdefm GLOBAL_STORE_BYTE    : FLAT_Global_Store_Pseudo <"global_store_byte", VGPR_32>;
8350b57cec5SDimitry Andricdefm GLOBAL_STORE_SHORT   : FLAT_Global_Store_Pseudo <"global_store_short", VGPR_32>;
8360b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORD   : FLAT_Global_Store_Pseudo <"global_store_dword", VGPR_32>;
8370b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORDX2 : FLAT_Global_Store_Pseudo <"global_store_dwordx2", VReg_64>;
8380b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORDX3 : FLAT_Global_Store_Pseudo <"global_store_dwordx3", VReg_96>;
8390b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORDX4 : FLAT_Global_Store_Pseudo <"global_store_dwordx4", VReg_128>;
8405ffd83dbSDimitry Andriclet OtherPredicates = [HasGFX10_BEncoding] in
841e8d8bef9SDimitry Andricdefm GLOBAL_STORE_DWORD_ADDTID : FLAT_Global_Store_AddTid_Pseudo <"global_store_dword_addtid", VGPR_32>;
8420b57cec5SDimitry Andric
8430b57cec5SDimitry Andricdefm GLOBAL_STORE_BYTE_D16_HI  : FLAT_Global_Store_Pseudo <"global_store_byte_d16_hi", VGPR_32>;
8440b57cec5SDimitry Andricdefm GLOBAL_STORE_SHORT_D16_HI : FLAT_Global_Store_Pseudo <"global_store_short_d16_hi", VGPR_32>;
8450b57cec5SDimitry Andric
8460b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_CMPSWAP : FLAT_Global_Atomic_Pseudo <"global_atomic_cmpswap",
84781ad6265SDimitry Andric                               VGPR_32, i32, v2i32, VReg_64>;
8480b57cec5SDimitry Andric
8490b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_cmpswap_x2",
85081ad6265SDimitry Andric                                  VReg_64, i64, v2i64, VReg_128>;
8510b57cec5SDimitry Andric
8520b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SWAP : FLAT_Global_Atomic_Pseudo <"global_atomic_swap",
85381ad6265SDimitry Andric                             VGPR_32, i32>;
8540b57cec5SDimitry Andric
8550b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SWAP_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_swap_x2",
85681ad6265SDimitry Andric                                VReg_64, i64>;
8570b57cec5SDimitry Andric
8580b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_ADD : FLAT_Global_Atomic_Pseudo <"global_atomic_add",
85981ad6265SDimitry Andric                           VGPR_32, i32>;
8600b57cec5SDimitry Andric
8610b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SUB : FLAT_Global_Atomic_Pseudo <"global_atomic_sub",
86281ad6265SDimitry Andric                           VGPR_32, i32>;
8630b57cec5SDimitry Andric
8640b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMIN : FLAT_Global_Atomic_Pseudo <"global_atomic_smin",
86581ad6265SDimitry Andric                            VGPR_32, i32>;
8660b57cec5SDimitry Andric
8670b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMIN : FLAT_Global_Atomic_Pseudo <"global_atomic_umin",
86881ad6265SDimitry Andric                            VGPR_32, i32>;
8690b57cec5SDimitry Andric
8700b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMAX : FLAT_Global_Atomic_Pseudo <"global_atomic_smax",
87181ad6265SDimitry Andric                            VGPR_32, i32>;
8720b57cec5SDimitry Andric
8730b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMAX : FLAT_Global_Atomic_Pseudo <"global_atomic_umax",
87481ad6265SDimitry Andric                            VGPR_32, i32>;
8750b57cec5SDimitry Andric
8760b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_AND : FLAT_Global_Atomic_Pseudo <"global_atomic_and",
87781ad6265SDimitry Andric                           VGPR_32, i32>;
8780b57cec5SDimitry Andric
8790b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_OR : FLAT_Global_Atomic_Pseudo <"global_atomic_or",
88081ad6265SDimitry Andric                          VGPR_32, i32>;
8810b57cec5SDimitry Andric
8820b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_XOR : FLAT_Global_Atomic_Pseudo <"global_atomic_xor",
88381ad6265SDimitry Andric                           VGPR_32, i32>;
8840b57cec5SDimitry Andric
8850b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_INC : FLAT_Global_Atomic_Pseudo <"global_atomic_inc",
88681ad6265SDimitry Andric                           VGPR_32, i32>;
8870b57cec5SDimitry Andric
8880b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_DEC : FLAT_Global_Atomic_Pseudo <"global_atomic_dec",
88981ad6265SDimitry Andric                           VGPR_32, i32>;
8900b57cec5SDimitry Andric
8910b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_ADD_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_add_x2",
89281ad6265SDimitry Andric                              VReg_64, i64>;
8930b57cec5SDimitry Andric
8940b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SUB_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_sub_x2",
89581ad6265SDimitry Andric                              VReg_64, i64>;
8960b57cec5SDimitry Andric
8970b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMIN_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_smin_x2",
89881ad6265SDimitry Andric                               VReg_64, i64>;
8990b57cec5SDimitry Andric
9000b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMIN_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_umin_x2",
90181ad6265SDimitry Andric                               VReg_64, i64>;
9020b57cec5SDimitry Andric
9030b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMAX_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_smax_x2",
90481ad6265SDimitry Andric                               VReg_64, i64>;
9050b57cec5SDimitry Andric
9060b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMAX_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_umax_x2",
90781ad6265SDimitry Andric                               VReg_64, i64>;
9080b57cec5SDimitry Andric
9090b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_AND_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_and_x2",
91081ad6265SDimitry Andric                              VReg_64, i64>;
9110b57cec5SDimitry Andric
9120b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_OR_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_or_x2",
91381ad6265SDimitry Andric                             VReg_64, i64>;
9140b57cec5SDimitry Andric
9150b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_XOR_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_xor_x2",
91681ad6265SDimitry Andric                              VReg_64, i64>;
9170b57cec5SDimitry Andric
9180b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_INC_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_inc_x2",
91981ad6265SDimitry Andric                              VReg_64, i64>;
9200b57cec5SDimitry Andric
9210b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_DEC_X2 : FLAT_Global_Atomic_Pseudo <"global_atomic_dec_x2",
92281ad6265SDimitry Andric                              VReg_64, i64>;
9235ffd83dbSDimitry Andric
9245f757f3fSDimitry Andriclet SubtargetPredicate = HasGFX10_BEncoding in {
9255f757f3fSDimitry Andric  defm GLOBAL_ATOMIC_CSUB : FLAT_Global_Atomic_Pseudo <"global_atomic_csub",
92681ad6265SDimitry Andric                                VGPR_32, i32>;
9275f757f3fSDimitry Andric}
92881ad6265SDimitry Andric
92981ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_UBYTE  : FLAT_Global_Load_LDS_Pseudo <"global_load_lds_ubyte">;
93081ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_SBYTE  : FLAT_Global_Load_LDS_Pseudo <"global_load_lds_sbyte">;
93181ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_USHORT : FLAT_Global_Load_LDS_Pseudo <"global_load_lds_ushort">;
93281ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_SSHORT : FLAT_Global_Load_LDS_Pseudo <"global_load_lds_sshort">;
93381ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_DWORD  : FLAT_Global_Load_LDS_Pseudo <"global_load_lds_dword">;
93481ad6265SDimitry Andric
935647cbc5dSDimitry Andriclet SubtargetPredicate = isGFX12Plus in {
9367a6dacacSDimitry Andric  defm GLOBAL_ATOMIC_COND_SUB_U32    : FLAT_Global_Atomic_Pseudo <"global_atomic_cond_sub_u32", VGPR_32, i32>;
937647cbc5dSDimitry Andric  defm GLOBAL_ATOMIC_ORDERED_ADD_B64 : FLAT_Global_Atomic_Pseudo <"global_atomic_ordered_add_b64", VReg_64, i64>;
9381db9f3b2SDimitry Andric
9391db9f3b2SDimitry Andric  def GLOBAL_INV    : FLAT_Global_Invalidate_Writeback<"global_inv">;
9401db9f3b2SDimitry Andric  def GLOBAL_WB     : FLAT_Global_Invalidate_Writeback<"global_wb">;
9411db9f3b2SDimitry Andric  def GLOBAL_WBINV  : FLAT_Global_Invalidate_Writeback<"global_wbinv">;
942647cbc5dSDimitry Andric} // End SubtargetPredicate = isGFX12Plus
943647cbc5dSDimitry Andric
9440b57cec5SDimitry Andricdefm SCRATCH_LOAD_UBYTE    : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte", VGPR_32>;
9450b57cec5SDimitry Andricdefm SCRATCH_LOAD_SBYTE    : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte", VGPR_32>;
9460b57cec5SDimitry Andricdefm SCRATCH_LOAD_USHORT   : FLAT_Scratch_Load_Pseudo <"scratch_load_ushort", VGPR_32>;
9470b57cec5SDimitry Andricdefm SCRATCH_LOAD_SSHORT   : FLAT_Scratch_Load_Pseudo <"scratch_load_sshort", VGPR_32>;
9480b57cec5SDimitry Andricdefm SCRATCH_LOAD_DWORD    : FLAT_Scratch_Load_Pseudo <"scratch_load_dword", VGPR_32>;
9490b57cec5SDimitry Andricdefm SCRATCH_LOAD_DWORDX2  : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx2", VReg_64>;
9500b57cec5SDimitry Andricdefm SCRATCH_LOAD_DWORDX3  : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx3", VReg_96>;
9510b57cec5SDimitry Andricdefm SCRATCH_LOAD_DWORDX4  : FLAT_Scratch_Load_Pseudo <"scratch_load_dwordx4", VReg_128>;
9520b57cec5SDimitry Andric
953bdd1243dSDimitry Andriclet TiedSourceNotRead = 1 in {
954e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_UBYTE_D16    : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte_d16", VGPR_32, 1>;
955e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_UBYTE_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_ubyte_d16_hi", VGPR_32, 1>;
956e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_SBYTE_D16    : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte_d16", VGPR_32, 1>;
957e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_SBYTE_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_sbyte_d16_hi", VGPR_32, 1>;
958e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_SHORT_D16    : FLAT_Scratch_Load_Pseudo <"scratch_load_short_d16", VGPR_32, 1>;
959e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_SHORT_D16_HI : FLAT_Scratch_Load_Pseudo <"scratch_load_short_d16_hi", VGPR_32, 1>;
960bdd1243dSDimitry Andric}
9610b57cec5SDimitry Andric
9620b57cec5SDimitry Andricdefm SCRATCH_STORE_BYTE    : FLAT_Scratch_Store_Pseudo <"scratch_store_byte", VGPR_32>;
9630b57cec5SDimitry Andricdefm SCRATCH_STORE_SHORT   : FLAT_Scratch_Store_Pseudo <"scratch_store_short", VGPR_32>;
9640b57cec5SDimitry Andricdefm SCRATCH_STORE_DWORD   : FLAT_Scratch_Store_Pseudo <"scratch_store_dword", VGPR_32>;
9650b57cec5SDimitry Andricdefm SCRATCH_STORE_DWORDX2 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx2", VReg_64>;
9660b57cec5SDimitry Andricdefm SCRATCH_STORE_DWORDX3 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx3", VReg_96>;
9670b57cec5SDimitry Andricdefm SCRATCH_STORE_DWORDX4 : FLAT_Scratch_Store_Pseudo <"scratch_store_dwordx4", VReg_128>;
9680b57cec5SDimitry Andric
9690b57cec5SDimitry Andricdefm SCRATCH_STORE_BYTE_D16_HI : FLAT_Scratch_Store_Pseudo <"scratch_store_byte_d16_hi", VGPR_32>;
9700b57cec5SDimitry Andricdefm SCRATCH_STORE_SHORT_D16_HI : FLAT_Scratch_Store_Pseudo <"scratch_store_short_d16_hi", VGPR_32>;
9710b57cec5SDimitry Andric
97281ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_UBYTE  : FLAT_Scratch_Load_LDS_Pseudo <"scratch_load_lds_ubyte">;
97381ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_SBYTE  : FLAT_Scratch_Load_LDS_Pseudo <"scratch_load_lds_sbyte">;
97481ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_USHORT : FLAT_Scratch_Load_LDS_Pseudo <"scratch_load_lds_ushort">;
97581ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_SSHORT : FLAT_Scratch_Load_LDS_Pseudo <"scratch_load_lds_sshort">;
97681ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_DWORD  : FLAT_Scratch_Load_LDS_Pseudo <"scratch_load_lds_dword">;
97781ad6265SDimitry Andric
9787a6dacacSDimitry Andriclet SubtargetPredicate = isGFX12Plus in {
979*0fca6ea1SDimitry Andric  let Uses = [EXEC, M0] in {
980*0fca6ea1SDimitry Andric    defm GLOBAL_LOAD_BLOCK  : FLAT_Global_Load_Pseudo <"global_load_block", VReg_1024>;
981*0fca6ea1SDimitry Andric    defm GLOBAL_STORE_BLOCK  : FLAT_Global_Store_Pseudo <"global_store_block", VReg_1024>;
982*0fca6ea1SDimitry Andric  }
983*0fca6ea1SDimitry Andric  let Uses = [EXEC, FLAT_SCR, M0] in {
984*0fca6ea1SDimitry Andric    defm SCRATCH_LOAD_BLOCK : FLAT_Scratch_Load_Pseudo <"scratch_load_block", VReg_1024>;
985*0fca6ea1SDimitry Andric    defm SCRATCH_STORE_BLOCK : FLAT_Scratch_Store_Pseudo <"scratch_store_block", VReg_1024>;
986*0fca6ea1SDimitry Andric  }
987*0fca6ea1SDimitry Andric
9887a6dacacSDimitry Andric  let WaveSizePredicate = isWave32 in {
989*0fca6ea1SDimitry Andric    let Mnemonic = "global_load_tr_b128" in
9907a6dacacSDimitry Andric    defm GLOBAL_LOAD_TR_B128_w32  : FLAT_Global_Load_Pseudo <"global_load_tr_b128_w32", VReg_128>;
991*0fca6ea1SDimitry Andric    let Mnemonic = "global_load_tr_b64" in
9927a6dacacSDimitry Andric    defm GLOBAL_LOAD_TR_B64_w32   : FLAT_Global_Load_Pseudo <"global_load_tr_b64_w32", VReg_64>;
9937a6dacacSDimitry Andric  }
9947a6dacacSDimitry Andric  let WaveSizePredicate = isWave64 in {
995*0fca6ea1SDimitry Andric    let Mnemonic = "global_load_tr_b128" in
9967a6dacacSDimitry Andric    defm GLOBAL_LOAD_TR_B128_w64  : FLAT_Global_Load_Pseudo <"global_load_tr_b128_w64", VReg_64>;
997*0fca6ea1SDimitry Andric    let Mnemonic = "global_load_tr_b64" in
9987a6dacacSDimitry Andric    defm GLOBAL_LOAD_TR_B64_w64   : FLAT_Global_Load_Pseudo <"global_load_tr_b64_w64", VGPR_32>;
9997a6dacacSDimitry Andric  }
10007a6dacacSDimitry Andric} // End SubtargetPredicate = isGFX12Plus
10017a6dacacSDimitry Andric
1002*0fca6ea1SDimitry Andriclet SubtargetPredicate = isGFX10Plus in {
10030b57cec5SDimitry Andric  defm GLOBAL_ATOMIC_FCMPSWAP :
100481ad6265SDimitry Andric    FLAT_Global_Atomic_Pseudo<"global_atomic_fcmpswap", VGPR_32, f32, v2f32, VReg_64>;
10050b57cec5SDimitry Andric  defm GLOBAL_ATOMIC_FMIN :
100681ad6265SDimitry Andric    FLAT_Global_Atomic_Pseudo<"global_atomic_fmin", VGPR_32, f32>;
10070b57cec5SDimitry Andric  defm GLOBAL_ATOMIC_FMAX :
100881ad6265SDimitry Andric    FLAT_Global_Atomic_Pseudo<"global_atomic_fmax", VGPR_32, f32>;
10090b57cec5SDimitry Andric  defm GLOBAL_ATOMIC_FCMPSWAP_X2 :
101081ad6265SDimitry Andric    FLAT_Global_Atomic_Pseudo<"global_atomic_fcmpswap_x2", VReg_64, f64, v2f64, VReg_128>;
1011*0fca6ea1SDimitry Andric} // End SubtargetPredicate = isGFX10Plus
10120b57cec5SDimitry Andric
101381ad6265SDimitry Andriclet OtherPredicates = [HasAtomicFaddNoRtnInsts] in
10140b57cec5SDimitry Andric  defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_NO_RTN <
1015e8d8bef9SDimitry Andric    "global_atomic_add_f32", VGPR_32, f32
10160b57cec5SDimitry Andric  >;
101706c3fb27SDimitry Andriclet OtherPredicates = [HasAtomicBufferGlobalPkAddF16NoRtnInsts] in
10180b57cec5SDimitry Andric  defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_NO_RTN <
1019e8d8bef9SDimitry Andric    "global_atomic_pk_add_f16", VGPR_32, v2f16
10200b57cec5SDimitry Andric  >;
102181ad6265SDimitry Andriclet OtherPredicates = [HasAtomicFaddRtnInsts] in
1022fe6060f1SDimitry Andric  defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_RTN <
102381ad6265SDimitry Andric    "global_atomic_add_f32", VGPR_32, f32
1024fe6060f1SDimitry Andric  >;
102506c3fb27SDimitry Andriclet OtherPredicates = [HasAtomicBufferGlobalPkAddF16Insts] in
1026fe6060f1SDimitry Andric  defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_RTN <
102781ad6265SDimitry Andric    "global_atomic_pk_add_f16", VGPR_32, v2f16
1028fe6060f1SDimitry Andric  >;
10290b57cec5SDimitry Andric
10300b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
10310b57cec5SDimitry Andric// Flat Patterns
10320b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
10330b57cec5SDimitry Andric
10340b57cec5SDimitry Andric// Patterns for global loads with no offset.
10350b57cec5SDimitry Andricclass FlatLoadPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
103606c3fb27SDimitry Andric  (vt (node (FlatOffset i64:$vaddr, i32:$offset))),
1037e8d8bef9SDimitry Andric  (inst $vaddr, $offset)
10380b57cec5SDimitry Andric>;
10390b57cec5SDimitry Andric
10400b57cec5SDimitry Andricclass FlatLoadPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
104106c3fb27SDimitry Andric  (node (FlatOffset (i64 VReg_64:$vaddr), i32:$offset), vt:$in),
1042fe6060f1SDimitry Andric  (inst $vaddr, $offset, 0, $in)
10430b57cec5SDimitry Andric>;
10440b57cec5SDimitry Andric
10450b57cec5SDimitry Andricclass FlatSignedLoadPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
104606c3fb27SDimitry Andric  (node (GlobalOffset (i64 VReg_64:$vaddr), i32:$offset), vt:$in),
1047fe6060f1SDimitry Andric  (inst $vaddr, $offset, 0, $in)
10480b57cec5SDimitry Andric>;
10490b57cec5SDimitry Andric
1050e8d8bef9SDimitry Andricclass GlobalLoadSaddrPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
105106c3fb27SDimitry Andric  (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset), vt:$in)),
1052fe6060f1SDimitry Andric  (inst $saddr, $voffset, $offset, 0, $in)
10530b57cec5SDimitry Andric>;
10540b57cec5SDimitry Andric
10550b57cec5SDimitry Andricclass FlatLoadSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
105606c3fb27SDimitry Andric  (vt (node (GlobalOffset (i64 VReg_64:$vaddr), i32:$offset))),
1057e8d8bef9SDimitry Andric  (inst $vaddr, $offset)
10580b57cec5SDimitry Andric>;
10590b57cec5SDimitry Andric
1060e8d8bef9SDimitry Andricclass GlobalLoadSaddrPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
106106c3fb27SDimitry Andric  (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset))),
1062fe6060f1SDimitry Andric  (inst $saddr, $voffset, $offset, 0)
10630b57cec5SDimitry Andric>;
10640b57cec5SDimitry Andric
1065e8d8bef9SDimitry Andricclass GlobalStoreSaddrPat <FLAT_Pseudo inst, SDPatternOperator node,
1066e8d8bef9SDimitry Andric                           ValueType vt> : GCNPat <
106706c3fb27SDimitry Andric  (node vt:$data, (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset)),
1068e8d8bef9SDimitry Andric  (inst $voffset, getVregSrcForVT<vt>.ret:$data, $saddr, $offset)
10690b57cec5SDimitry Andric>;
10700b57cec5SDimitry Andric
1071e8d8bef9SDimitry Andricclass GlobalAtomicSaddrPat <FLAT_Pseudo inst, SDPatternOperator node,
1072e8d8bef9SDimitry Andric                            ValueType vt, ValueType data_vt = vt> : GCNPat <
107306c3fb27SDimitry Andric  (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset), data_vt:$data)),
1074e8d8bef9SDimitry Andric  (inst $voffset, getVregSrcForVT<data_vt>.ret:$data, $saddr, $offset)
1075e8d8bef9SDimitry Andric>;
1076e8d8bef9SDimitry Andric
1077e8d8bef9SDimitry Andricclass GlobalAtomicNoRtnSaddrPat <FLAT_Pseudo inst, SDPatternOperator node,
1078e8d8bef9SDimitry Andric                                 ValueType vt> : GCNPat <
107906c3fb27SDimitry Andric  (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset), vt:$data),
1080e8d8bef9SDimitry Andric  (inst $voffset, getVregSrcForVT<vt>.ret:$data, $saddr, $offset)
1081e8d8bef9SDimitry Andric>;
1082e8d8bef9SDimitry Andric
1083e8d8bef9SDimitry Andricclass FlatStorePat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
108406c3fb27SDimitry Andric  (node vt:$data, (FlatOffset i64:$vaddr, i32:$offset)),
1085e8d8bef9SDimitry Andric  (inst $vaddr, getVregSrcForVT<vt>.ret:$data, $offset)
1086e8d8bef9SDimitry Andric>;
1087e8d8bef9SDimitry Andric
1088e8d8bef9SDimitry Andricclass FlatStoreSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
108906c3fb27SDimitry Andric  (node vt:$data, (GlobalOffset i64:$vaddr, i32:$offset)),
1090e8d8bef9SDimitry Andric  (inst $vaddr, getVregSrcForVT<vt>.ret:$data, $offset)
1091e8d8bef9SDimitry Andric>;
1092e8d8bef9SDimitry Andric
1093e8d8bef9SDimitry Andricclass FlatStoreSignedAtomicPat <FLAT_Pseudo inst, SDPatternOperator node,
1094e8d8bef9SDimitry Andric                                ValueType vt, ValueType data_vt = vt> : GCNPat <
10950b57cec5SDimitry Andric  // atomic store follows atomic binop convention so the address comes
10960b57cec5SDimitry Andric  // first.
109706c3fb27SDimitry Andric  (node (GlobalOffset i64:$vaddr, i32:$offset), data_vt:$data),
1098e8d8bef9SDimitry Andric  (inst $vaddr, getVregSrcForVT<data_vt>.ret:$data, $offset)
10990b57cec5SDimitry Andric>;
11000b57cec5SDimitry Andric
11017a6dacacSDimitry Andricmulticlass FlatAtomicNoRtnPatBase <string inst, string node, ValueType vt,
11027a6dacacSDimitry Andric                                   ValueType data_vt = vt> {
11037a6dacacSDimitry Andric
11047a6dacacSDimitry Andric  defvar noRtnNode = !cast<PatFrags>(node);
110581ad6265SDimitry Andric
1106753f127fSDimitry Andric  let AddedComplexity = 1 in
110706c3fb27SDimitry Andric  def : GCNPat <(vt (noRtnNode (FlatOffset i64:$vaddr, i32:$offset), data_vt:$data)),
110881ad6265SDimitry Andric    (!cast<FLAT_Pseudo>(inst) VReg_64:$vaddr, getVregSrcForVT<data_vt>.ret:$data, $offset)>;
110981ad6265SDimitry Andric}
111081ad6265SDimitry Andric
11117a6dacacSDimitry Andricmulticlass FlatAtomicNoRtnPatWithAddrSpace<string inst, string node, string addrSpaceSuffix,
11127a6dacacSDimitry Andric                                           ValueType vt> :
11137a6dacacSDimitry Andric  FlatAtomicNoRtnPatBase<inst, node # "_noret_" # addrSpaceSuffix, vt, vt>;
11147a6dacacSDimitry Andric
11157a6dacacSDimitry Andricmulticlass FlatAtomicNoRtnPat <string inst, string node, ValueType vt,
11167a6dacacSDimitry Andric                          ValueType data_vt = vt, bit isIntr = 0> :
1117*0fca6ea1SDimitry Andric  FlatAtomicNoRtnPatBase<inst, node # "_noret" # !if(isIntr, "", "_"#vt), vt, data_vt>;
11187a6dacacSDimitry Andric
11197a6dacacSDimitry Andric
11207a6dacacSDimitry Andricmulticlass FlatAtomicRtnPatBase <string inst, string node, ValueType vt,
11217a6dacacSDimitry Andric                                 ValueType data_vt = vt> {
11227a6dacacSDimitry Andric
11237a6dacacSDimitry Andric  defvar rtnNode = !cast<SDPatternOperator>(node);
11245f757f3fSDimitry Andric
11255f757f3fSDimitry Andric  def : GCNPat <(vt (rtnNode (FlatOffset i64:$vaddr, i32:$offset), data_vt:$data)),
11265f757f3fSDimitry Andric    (!cast<FLAT_Pseudo>(inst#"_RTN") VReg_64:$vaddr, getVregSrcForVT<data_vt>.ret:$data, $offset)>;
11275f757f3fSDimitry Andric}
11285f757f3fSDimitry Andric
11297a6dacacSDimitry Andricmulticlass FlatAtomicRtnPatWithAddrSpace<string inst, string intr, string addrSpaceSuffix,
11307a6dacacSDimitry Andric                                         ValueType vt> :
11317a6dacacSDimitry Andric  FlatAtomicRtnPatBase<inst, intr # "_" # addrSpaceSuffix, vt, vt>;
11327a6dacacSDimitry Andric
11337a6dacacSDimitry Andricmulticlass FlatAtomicRtnPat <string inst, string node, ValueType vt,
11347a6dacacSDimitry Andric                             ValueType data_vt = vt, bit isIntr = 0> :
1135*0fca6ea1SDimitry Andric  FlatAtomicRtnPatBase<inst, node # !if(isIntr, "", "_"#vt), vt, data_vt>;
11367a6dacacSDimitry Andric
11377a6dacacSDimitry Andric
11385f757f3fSDimitry Andricmulticlass FlatAtomicPat <string inst, string node, ValueType vt,
11395f757f3fSDimitry Andric                          ValueType data_vt = vt, bit isIntr = 0> :
11405f757f3fSDimitry Andric  FlatAtomicRtnPat<inst, node, vt, data_vt, isIntr>,
11415f757f3fSDimitry Andric  FlatAtomicNoRtnPat<inst, node, vt, data_vt, isIntr>;
11425f757f3fSDimitry Andric
11435f757f3fSDimitry Andricmulticlass FlatAtomicIntrNoRtnPat <string inst, string node, ValueType vt,
11445f757f3fSDimitry Andric                                 ValueType data_vt = vt> {
11455f757f3fSDimitry Andric  defm : FlatAtomicNoRtnPat<inst, node, vt, data_vt, /* isIntr */ 1>;
11465f757f3fSDimitry Andric}
11475f757f3fSDimitry Andric
11485f757f3fSDimitry Andricmulticlass FlatAtomicIntrRtnPat <string inst, string node, ValueType vt,
11495f757f3fSDimitry Andric                                ValueType data_vt = vt> {
11505f757f3fSDimitry Andric  defm : FlatAtomicRtnPat<inst, node, vt, data_vt, /* isIntr */ 1>;
11515f757f3fSDimitry Andric}
11525f757f3fSDimitry Andric
11535f757f3fSDimitry Andricmulticlass FlatAtomicIntrPat <string inst, string node, ValueType vt,
11545f757f3fSDimitry Andric                              ValueType data_vt = vt> :
11555f757f3fSDimitry Andric  FlatAtomicRtnPat<inst, node, vt, data_vt, /* isIntr */ 1>,
11565f757f3fSDimitry Andric  FlatAtomicNoRtnPat<inst, node, vt, data_vt, /* isIntr */ 1>;
11575f757f3fSDimitry Andric
1158bdd1243dSDimitry Andricclass FlatSignedAtomicPatBase <FLAT_Pseudo inst, SDPatternOperator node,
1159bdd1243dSDimitry Andric                               ValueType vt, ValueType data_vt = vt> : GCNPat <
116006c3fb27SDimitry Andric  (vt (node (GlobalOffset i64:$vaddr, i32:$offset), data_vt:$data)),
1161bdd1243dSDimitry Andric  (inst VReg_64:$vaddr, getVregSrcForVT<data_vt>.ret:$data, $offset)
1162bdd1243dSDimitry Andric>;
1163bdd1243dSDimitry Andric
116481ad6265SDimitry Andricmulticlass FlatSignedAtomicPat <string inst, string node, ValueType vt,
1165753f127fSDimitry Andric                                ValueType data_vt = vt, int complexity = 0,
1166753f127fSDimitry Andric                                bit isIntr = 0> {
1167*0fca6ea1SDimitry Andric  defvar rtnNode = !cast<SDPatternOperator>(node # !if(isIntr, "", "_" # vt));
1168*0fca6ea1SDimitry Andric  defvar noRtnNode = !cast<PatFrags>(node # "_noret" # !if(isIntr, "", "_" # vt));
116981ad6265SDimitry Andric
1170753f127fSDimitry Andric  let AddedComplexity = complexity in
1171bdd1243dSDimitry Andric  def : FlatSignedAtomicPatBase<!cast<FLAT_Pseudo>(inst#"_RTN"), rtnNode, vt, data_vt>;
117281ad6265SDimitry Andric
1173753f127fSDimitry Andric  let AddedComplexity = !add(complexity, 1) in
1174bdd1243dSDimitry Andric  def : FlatSignedAtomicPatBase<!cast<FLAT_Pseudo>(inst), noRtnNode, vt, data_vt>;
117581ad6265SDimitry Andric}
117681ad6265SDimitry Andric
1177e8d8bef9SDimitry Andricclass ScratchLoadSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
117806c3fb27SDimitry Andric  (vt (node (ScratchOffset (i32 VGPR_32:$vaddr), i32:$offset))),
1179e8d8bef9SDimitry Andric  (inst $vaddr, $offset)
1180e8d8bef9SDimitry Andric>;
1181e8d8bef9SDimitry Andric
1182e8d8bef9SDimitry Andricclass ScratchLoadSignedPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
118306c3fb27SDimitry Andric  (node (ScratchOffset (i32 VGPR_32:$vaddr), i32:$offset), vt:$in),
1184fe6060f1SDimitry Andric  (inst $vaddr, $offset, 0, $in)
1185e8d8bef9SDimitry Andric>;
1186e8d8bef9SDimitry Andric
1187e8d8bef9SDimitry Andricclass ScratchStoreSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
118806c3fb27SDimitry Andric  (node vt:$data, (ScratchOffset (i32 VGPR_32:$vaddr), i32:$offset)),
1189e8d8bef9SDimitry Andric  (inst getVregSrcForVT<vt>.ret:$data, $vaddr, $offset)
1190e8d8bef9SDimitry Andric>;
1191e8d8bef9SDimitry Andric
1192e8d8bef9SDimitry Andricclass ScratchLoadSaddrPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
119306c3fb27SDimitry Andric  (vt (node (ScratchSAddr (i32 SGPR_32:$saddr), i32:$offset))),
1194e8d8bef9SDimitry Andric  (inst $saddr, $offset)
1195e8d8bef9SDimitry Andric>;
1196e8d8bef9SDimitry Andric
1197e8d8bef9SDimitry Andricclass ScratchLoadSaddrPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
119806c3fb27SDimitry Andric  (vt (node (ScratchSAddr (i32 SGPR_32:$saddr), i32:$offset), vt:$in)),
1199fe6060f1SDimitry Andric  (inst $saddr, $offset, 0, $in)
1200e8d8bef9SDimitry Andric>;
1201e8d8bef9SDimitry Andric
1202e8d8bef9SDimitry Andricclass ScratchStoreSaddrPat <FLAT_Pseudo inst, SDPatternOperator node,
1203e8d8bef9SDimitry Andric                            ValueType vt> : GCNPat <
120406c3fb27SDimitry Andric  (node vt:$data, (ScratchSAddr (i32 SGPR_32:$saddr), i32:$offset)),
1205e8d8bef9SDimitry Andric  (inst getVregSrcForVT<vt>.ret:$data, $saddr, $offset)
12060b57cec5SDimitry Andric>;
12070b57cec5SDimitry Andric
120881ad6265SDimitry Andricclass ScratchLoadSVaddrPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
120906c3fb27SDimitry Andric  (vt (node (ScratchSVAddr (i32 VGPR_32:$vaddr), (i32 SGPR_32:$saddr), i32:$offset))),
121081ad6265SDimitry Andric  (inst $vaddr, $saddr, $offset, 0)
121181ad6265SDimitry Andric>;
121281ad6265SDimitry Andric
121381ad6265SDimitry Andricclass ScratchStoreSVaddrPat <FLAT_Pseudo inst, SDPatternOperator node,
121481ad6265SDimitry Andric                             ValueType vt> : GCNPat <
121506c3fb27SDimitry Andric  (node vt:$data, (ScratchSVAddr (i32 VGPR_32:$vaddr), (i32 SGPR_32:$saddr), i32:$offset)),
121681ad6265SDimitry Andric  (inst getVregSrcForVT<vt>.ret:$data, $vaddr, $saddr, $offset)
121781ad6265SDimitry Andric>;
121881ad6265SDimitry Andric
121981ad6265SDimitry Andricclass ScratchLoadSVaddrPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
122006c3fb27SDimitry Andric  (vt (node (ScratchSVAddr (i32 VGPR_32:$vaddr), (i32 SGPR_32:$saddr), i32:$offset), vt:$in)),
122181ad6265SDimitry Andric  (inst $vaddr, $saddr, $offset, 0, $in)
122281ad6265SDimitry Andric>;
122381ad6265SDimitry Andric
1224*0fca6ea1SDimitry Andricmulticlass GlobalFLATLoadPats<FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> {
1225*0fca6ea1SDimitry Andric  def : FlatLoadSignedPat <inst, node, vt> {
1226*0fca6ea1SDimitry Andric    let AddedComplexity = 10;
1227*0fca6ea1SDimitry Andric  }
1228*0fca6ea1SDimitry Andric
1229*0fca6ea1SDimitry Andric  def : GlobalLoadSaddrPat<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SADDR"), node, vt> {
1230*0fca6ea1SDimitry Andric    let AddedComplexity = 11;
1231*0fca6ea1SDimitry Andric  }
1232*0fca6ea1SDimitry Andric}
1233*0fca6ea1SDimitry Andric
1234*0fca6ea1SDimitry Andricmulticlass GlobalFLATLoadPats_D16<FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> {
1235*0fca6ea1SDimitry Andric  def : FlatSignedLoadPat_D16 <inst, node, vt> {
1236*0fca6ea1SDimitry Andric    let AddedComplexity = 10;
1237*0fca6ea1SDimitry Andric  }
1238*0fca6ea1SDimitry Andric
1239*0fca6ea1SDimitry Andric  def : GlobalLoadSaddrPat_D16<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SADDR"), node, vt> {
1240*0fca6ea1SDimitry Andric    let AddedComplexity = 11;
1241*0fca6ea1SDimitry Andric  }
1242*0fca6ea1SDimitry Andric}
1243*0fca6ea1SDimitry Andric
1244*0fca6ea1SDimitry Andricmulticlass GlobalFLATStorePats<FLAT_Pseudo inst, SDPatternOperator node,
1245*0fca6ea1SDimitry Andric                               ValueType vt> {
1246*0fca6ea1SDimitry Andric  def : FlatStoreSignedPat <inst, node, vt> {
1247*0fca6ea1SDimitry Andric    let AddedComplexity = 10;
1248*0fca6ea1SDimitry Andric  }
1249*0fca6ea1SDimitry Andric
1250*0fca6ea1SDimitry Andric  def : GlobalStoreSaddrPat<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SADDR"), node, vt> {
1251*0fca6ea1SDimitry Andric    let AddedComplexity = 11;
1252*0fca6ea1SDimitry Andric  }
1253*0fca6ea1SDimitry Andric}
1254*0fca6ea1SDimitry Andric
1255*0fca6ea1SDimitry Andricmulticlass GlobalFLATAtomicPatsNoRtnBase<string inst, string node, ValueType vt,
1256*0fca6ea1SDimitry Andric                                         ValueType data_vt = vt> {
1257*0fca6ea1SDimitry Andric  let AddedComplexity = 11 in
1258*0fca6ea1SDimitry Andric  def : FlatSignedAtomicPatBase<!cast<FLAT_Pseudo>(inst), !cast<SDPatternOperator>(node), vt, data_vt>;
1259*0fca6ea1SDimitry Andric
1260*0fca6ea1SDimitry Andric  let AddedComplexity = 13 in
1261*0fca6ea1SDimitry Andric  def : GlobalAtomicSaddrPat<!cast<FLAT_Pseudo>(inst#"_SADDR"), !cast<SDPatternOperator>(node), vt, data_vt>;
1262*0fca6ea1SDimitry Andric}
1263*0fca6ea1SDimitry Andric
1264*0fca6ea1SDimitry Andricmulticlass GlobalFLATAtomicPatsRtnBase<string inst, string node, ValueType vt,
1265*0fca6ea1SDimitry Andric                                       ValueType data_vt = vt, bit isPatFrags = 0> {
1266*0fca6ea1SDimitry Andric  defvar rtnNode = !if(isPatFrags, !cast<PatFrags>(node), !cast<SDPatternOperator>(node));
1267*0fca6ea1SDimitry Andric
1268*0fca6ea1SDimitry Andric  let AddedComplexity = 10 in
1269*0fca6ea1SDimitry Andric  def : FlatSignedAtomicPatBase<!cast<FLAT_Pseudo>(inst#"_RTN"), rtnNode, vt, data_vt>;
1270*0fca6ea1SDimitry Andric
1271*0fca6ea1SDimitry Andric  let AddedComplexity = 12 in
1272*0fca6ea1SDimitry Andric  def : GlobalAtomicSaddrPat<!cast<FLAT_Pseudo>(inst#"_SADDR_RTN"), rtnNode, vt, data_vt>;
1273*0fca6ea1SDimitry Andric}
1274*0fca6ea1SDimitry Andric
1275*0fca6ea1SDimitry Andricmulticlass GlobalFLATAtomicPatsNoRtn<string inst, string node, ValueType vt,
1276*0fca6ea1SDimitry Andric                                     ValueType data_vt = vt, bit isIntr = 0> :
1277*0fca6ea1SDimitry Andric  GlobalFLATAtomicPatsNoRtnBase<inst, node # "_noret" # !if(isIntr, "", "_" # vt), vt, data_vt>;
1278*0fca6ea1SDimitry Andric
1279*0fca6ea1SDimitry Andricmulticlass GlobalFLATAtomicPatsRtn<string inst, string node, ValueType vt,
1280*0fca6ea1SDimitry Andric                                   ValueType data_vt = vt, bit isIntr = 0> :
1281*0fca6ea1SDimitry Andric  GlobalFLATAtomicPatsRtnBase<inst, node # !if(isIntr, "", "_" # vt), vt, data_vt>;
1282*0fca6ea1SDimitry Andric
1283*0fca6ea1SDimitry Andricmulticlass GlobalFLATAtomicPats<string inst, string node, ValueType vt,
1284*0fca6ea1SDimitry Andric                                ValueType data_vt = vt, bit isIntr = 0> :
1285*0fca6ea1SDimitry Andric  GlobalFLATAtomicPatsNoRtn<inst, node, vt, data_vt, isIntr>,
1286*0fca6ea1SDimitry Andric  GlobalFLATAtomicPatsRtn<inst, node, vt, data_vt, isIntr>;
1287*0fca6ea1SDimitry Andric
1288*0fca6ea1SDimitry Andricmulticlass GlobalFLATAtomicPatsNoRtnWithAddrSpace<string inst, string intr, string addrSpaceSuffix,
1289*0fca6ea1SDimitry Andric                                                  ValueType vt, ValueType data_vt = vt> :
1290*0fca6ea1SDimitry Andric  GlobalFLATAtomicPatsNoRtnBase<inst, intr # "_noret_" # addrSpaceSuffix, vt, data_vt>;
1291*0fca6ea1SDimitry Andric
1292*0fca6ea1SDimitry Andricmulticlass GlobalFLATAtomicPatsRtnWithAddrSpace<string inst, string intr, string addrSpaceSuffix,
1293*0fca6ea1SDimitry Andric                                                ValueType vt, ValueType data_vt = vt> :
1294*0fca6ea1SDimitry Andric  GlobalFLATAtomicPatsRtnBase<inst, intr # "_" # addrSpaceSuffix, vt, data_vt, /*isPatFrags*/ 1>;
1295*0fca6ea1SDimitry Andric
1296*0fca6ea1SDimitry Andricmulticlass GlobalFLATAtomicPatsWithAddrSpace<string inst, string intr, string addrSpaceSuffix,
1297*0fca6ea1SDimitry Andric                                             ValueType vt, ValueType data_vt = vt> :
1298*0fca6ea1SDimitry Andric  GlobalFLATAtomicPatsNoRtnWithAddrSpace<inst, intr, addrSpaceSuffix, vt, data_vt>,
1299*0fca6ea1SDimitry Andric  GlobalFLATAtomicPatsRtnWithAddrSpace<inst, intr, addrSpaceSuffix, vt, data_vt>;
1300*0fca6ea1SDimitry Andric
1301*0fca6ea1SDimitry Andricmulticlass GlobalFLATAtomicIntrPats<string inst, string node, ValueType vt,
1302*0fca6ea1SDimitry Andric                                    ValueType data_vt = vt> {
1303*0fca6ea1SDimitry Andric  defm : GlobalFLATAtomicPats<inst, node, vt, data_vt, /* isIntr */ 1>;
1304*0fca6ea1SDimitry Andric}
1305*0fca6ea1SDimitry Andric
1306*0fca6ea1SDimitry Andricmulticlass ScratchFLATLoadPats<FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> {
1307*0fca6ea1SDimitry Andric  def : ScratchLoadSignedPat <inst, node, vt> {
1308*0fca6ea1SDimitry Andric    let AddedComplexity = 25;
1309*0fca6ea1SDimitry Andric  }
1310*0fca6ea1SDimitry Andric
1311*0fca6ea1SDimitry Andric  def : ScratchLoadSaddrPat<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SADDR"), node, vt> {
1312*0fca6ea1SDimitry Andric    let AddedComplexity = 26;
1313*0fca6ea1SDimitry Andric  }
1314*0fca6ea1SDimitry Andric
1315*0fca6ea1SDimitry Andric  def : ScratchLoadSVaddrPat<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SVS"), node, vt> {
1316*0fca6ea1SDimitry Andric    let SubtargetPredicate = HasFlatScratchSVSMode;
1317*0fca6ea1SDimitry Andric    let AddedComplexity = 27;
1318*0fca6ea1SDimitry Andric  }
1319*0fca6ea1SDimitry Andric}
1320*0fca6ea1SDimitry Andric
1321*0fca6ea1SDimitry Andricmulticlass ScratchFLATStorePats<FLAT_Pseudo inst, SDPatternOperator node,
1322*0fca6ea1SDimitry Andric                               ValueType vt> {
1323*0fca6ea1SDimitry Andric  def : ScratchStoreSignedPat <inst, node, vt> {
1324*0fca6ea1SDimitry Andric    let AddedComplexity = 25;
1325*0fca6ea1SDimitry Andric  }
1326*0fca6ea1SDimitry Andric
1327*0fca6ea1SDimitry Andric  def : ScratchStoreSaddrPat<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SADDR"), node, vt> {
1328*0fca6ea1SDimitry Andric    let AddedComplexity = 26;
1329*0fca6ea1SDimitry Andric  }
1330*0fca6ea1SDimitry Andric
1331*0fca6ea1SDimitry Andric  def : ScratchStoreSVaddrPat<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SVS"), node, vt> {
1332*0fca6ea1SDimitry Andric    let SubtargetPredicate = HasFlatScratchSVSMode;
1333*0fca6ea1SDimitry Andric    let AddedComplexity = 27;
1334*0fca6ea1SDimitry Andric  }
1335*0fca6ea1SDimitry Andric}
1336*0fca6ea1SDimitry Andric
1337*0fca6ea1SDimitry Andricmulticlass ScratchFLATLoadPats_D16<FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> {
1338*0fca6ea1SDimitry Andric  def : ScratchLoadSignedPat_D16 <inst, node, vt> {
1339*0fca6ea1SDimitry Andric    let AddedComplexity = 25;
1340*0fca6ea1SDimitry Andric  }
1341*0fca6ea1SDimitry Andric
1342*0fca6ea1SDimitry Andric  def : ScratchLoadSaddrPat_D16<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SADDR"), node, vt> {
1343*0fca6ea1SDimitry Andric    let AddedComplexity = 26;
1344*0fca6ea1SDimitry Andric  }
1345*0fca6ea1SDimitry Andric
1346*0fca6ea1SDimitry Andric  def : ScratchLoadSVaddrPat_D16 <!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SVS"), node, vt> {
1347*0fca6ea1SDimitry Andric    let SubtargetPredicate = HasFlatScratchSVSMode;
1348*0fca6ea1SDimitry Andric    let AddedComplexity = 27;
1349*0fca6ea1SDimitry Andric  }
1350*0fca6ea1SDimitry Andric}
1351*0fca6ea1SDimitry Andric
13520b57cec5SDimitry Andriclet OtherPredicates = [HasFlatAddressSpace] in {
13530b57cec5SDimitry Andric
135481ad6265SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_UBYTE, atomic_load_8_flat, i32>;
135581ad6265SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_UBYTE, atomic_load_8_flat, i16>;
135681ad6265SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_USHORT, atomic_load_16_flat, i32>;
135781ad6265SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_USHORT, atomic_load_16_flat, i16>;
13580b57cec5SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_UBYTE, extloadi8_flat, i32>;
13590b57cec5SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_UBYTE, zextloadi8_flat, i32>;
13600b57cec5SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i32>;
13610b57cec5SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_UBYTE, extloadi8_flat, i16>;
13620b57cec5SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_UBYTE, zextloadi8_flat, i16>;
13630b57cec5SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i16>;
13640b57cec5SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_USHORT, extloadi16_flat, i32>;
13650b57cec5SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_USHORT, zextloadi16_flat, i32>;
13660b57cec5SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_USHORT, load_flat, i16>;
13670b57cec5SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_SSHORT, sextloadi16_flat, i32>;
13680b57cec5SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_DWORDX3, load_flat, v3i32>;
13690b57cec5SDimitry Andric
1370e8d8bef9SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_DWORD, atomic_load_32_flat, i32>;
1371e8d8bef9SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_DWORDX2, atomic_load_64_flat, i64>;
13720b57cec5SDimitry Andric
13730b57cec5SDimitry Andricdef : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i32>;
13740b57cec5SDimitry Andricdef : FlatStorePat <FLAT_STORE_SHORT, truncstorei16_flat, i32>;
13758bcb0991SDimitry Andric
13768bcb0991SDimitry Andricforeach vt = Reg32Types.types in {
13778bcb0991SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_DWORD, load_flat, vt>;
13788bcb0991SDimitry Andricdef : FlatStorePat <FLAT_STORE_DWORD, store_flat, vt>;
13798bcb0991SDimitry Andric}
13808bcb0991SDimitry Andric
13818bcb0991SDimitry Andricforeach vt = VReg_64.RegTypes in {
1382e8d8bef9SDimitry Andricdef : FlatStorePat <FLAT_STORE_DWORDX2, store_flat, vt>;
13838bcb0991SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_DWORDX2, load_flat, vt>;
13848bcb0991SDimitry Andric}
13858bcb0991SDimitry Andric
1386e8d8bef9SDimitry Andricdef : FlatStorePat <FLAT_STORE_DWORDX3, store_flat, v3i32>;
1387480093f4SDimitry Andric
1388480093f4SDimitry Andricforeach vt = VReg_128.RegTypes in {
1389480093f4SDimitry Andricdef : FlatLoadPat <FLAT_LOAD_DWORDX4, load_flat, vt>;
1390e8d8bef9SDimitry Andricdef : FlatStorePat <FLAT_STORE_DWORDX4, store_flat, vt>;
1391480093f4SDimitry Andric}
13920b57cec5SDimitry Andric
13935f757f3fSDimitry Andricdef : FlatStorePat <FLAT_STORE_DWORD, atomic_store_32_flat, i32>;
13945f757f3fSDimitry Andricdef : FlatStorePat <FLAT_STORE_DWORDX2, atomic_store_64_flat, i64>;
13955f757f3fSDimitry Andricdef : FlatStorePat <FLAT_STORE_BYTE, atomic_store_8_flat, i32>;
13965f757f3fSDimitry Andricdef : FlatStorePat <FLAT_STORE_BYTE, atomic_store_8_flat, i16>;
13975f757f3fSDimitry Andricdef : FlatStorePat <FLAT_STORE_SHORT, atomic_store_16_flat, i32>;
13985f757f3fSDimitry Andricdef : FlatStorePat <FLAT_STORE_SHORT, atomic_store_16_flat, i16>;
13990b57cec5SDimitry Andric
140081ad6265SDimitry Andricforeach as = [ "flat", "global" ] in {
140181ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_ADD", "atomic_load_add_"#as, i32>;
140281ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_SUB", "atomic_load_sub_"#as, i32>;
140306c3fb27SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_INC", "atomic_load_uinc_wrap_"#as, i32>;
140406c3fb27SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_DEC", "atomic_load_udec_wrap_"#as, i32>;
140581ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_AND", "atomic_load_and_"#as, i32>;
140681ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_SMAX", "atomic_load_max_"#as, i32>;
140781ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_UMAX", "atomic_load_umax_"#as, i32>;
140881ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_SMIN", "atomic_load_min_"#as, i32>;
140981ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_UMIN", "atomic_load_umin_"#as, i32>;
141081ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_OR", "atomic_load_or_"#as, i32>;
141181ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_SWAP", "atomic_swap_"#as, i32>;
141281ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_CMPSWAP", "AMDGPUatomic_cmp_swap_"#as, i32, v2i32>;
141381ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_XOR", "atomic_load_xor_"#as, i32>;
14140b57cec5SDimitry Andric
141581ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_ADD_X2", "atomic_load_add_"#as, i64>;
141681ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_SUB_X2", "atomic_load_sub_"#as, i64>;
141706c3fb27SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_INC_X2", "atomic_load_uinc_wrap_"#as, i64>;
141806c3fb27SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_DEC_X2", "atomic_load_udec_wrap_"#as, i64>;
141981ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_AND_X2", "atomic_load_and_"#as, i64>;
142081ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_SMAX_X2", "atomic_load_max_"#as, i64>;
142181ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_UMAX_X2", "atomic_load_umax_"#as, i64>;
142281ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_SMIN_X2", "atomic_load_min_"#as, i64>;
142381ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_UMIN_X2", "atomic_load_umin_"#as, i64>;
142481ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_OR_X2", "atomic_load_or_"#as, i64>;
142581ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_SWAP_X2", "atomic_swap_"#as, i64>;
142681ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_CMPSWAP_X2", "AMDGPUatomic_cmp_swap_"#as, i64, v2i64>;
142781ad6265SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_XOR_X2", "atomic_load_xor_"#as, i64>;
1428*0fca6ea1SDimitry Andric
1429*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasAtomicFMinFMaxF32FlatInsts in {
1430*0fca6ea1SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_FMIN", "atomic_load_fmin_"#as, f32>;
1431*0fca6ea1SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_FMAX", "atomic_load_fmax_"#as, f32>;
1432*0fca6ea1SDimitry Andric}
1433*0fca6ea1SDimitry Andric
1434*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasAtomicFMinFMaxF64FlatInsts in {
1435*0fca6ea1SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_MIN_F64", "atomic_load_fmin_"#as, f64>;
1436*0fca6ea1SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_MAX_F64", "atomic_load_fmax_"#as, f64>;
1437*0fca6ea1SDimitry Andric}
1438*0fca6ea1SDimitry Andric
143981ad6265SDimitry Andric} // end foreach as
14400b57cec5SDimitry Andric
14417a6dacacSDimitry Andriclet SubtargetPredicate = isGFX12Plus in {
14427a6dacacSDimitry Andric  defm : FlatAtomicRtnPatWithAddrSpace<"FLAT_ATOMIC_COND_SUB_U32", "int_amdgcn_atomic_cond_sub_u32", "flat_addrspace", i32 >;
14437a6dacacSDimitry Andric
14447a6dacacSDimitry Andric  let OtherPredicates = [HasAtomicCSubNoRtnInsts] in
14457a6dacacSDimitry Andric    defm : FlatAtomicNoRtnPatWithAddrSpace<"FLAT_ATOMIC_COND_SUB_U32", "int_amdgcn_atomic_cond_sub_u32", "flat_addrspace", i32>;
14467a6dacacSDimitry Andric}
14477a6dacacSDimitry Andric
14480b57cec5SDimitry Andricdef : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i16>;
14490b57cec5SDimitry Andricdef : FlatStorePat <FLAT_STORE_SHORT, store_flat, i16>;
14500b57cec5SDimitry Andric
145181ad6265SDimitry Andriclet OtherPredicates = [HasD16LoadStore] in {
14520b57cec5SDimitry Andricdef : FlatStorePat <FLAT_STORE_SHORT_D16_HI, truncstorei16_hi16_flat, i32>;
14530b57cec5SDimitry Andricdef : FlatStorePat <FLAT_STORE_BYTE_D16_HI, truncstorei8_hi16_flat, i32>;
145481ad6265SDimitry Andric}
14550b57cec5SDimitry Andric
145681ad6265SDimitry Andriclet OtherPredicates = [D16PreservesUnusedBits] in {
14570b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_flat, v2i16>;
14580b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_flat, v2f16>;
14590b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_flat, v2i16>;
14600b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_flat, v2f16>;
14610b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16_HI, load_d16_hi_flat, v2i16>;
14620b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16_HI, load_d16_hi_flat, v2f16>;
14630b57cec5SDimitry Andric
14640b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16, az_extloadi8_d16_lo_flat, v2i16>;
14650b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_UBYTE_D16, az_extloadi8_d16_lo_flat, v2f16>;
14660b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16, sextloadi8_d16_lo_flat, v2i16>;
14670b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_SBYTE_D16, sextloadi8_d16_lo_flat, v2f16>;
14680b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16, load_d16_lo_flat, v2i16>;
14690b57cec5SDimitry Andricdef : FlatLoadPat_D16 <FLAT_LOAD_SHORT_D16, load_d16_lo_flat, v2f16>;
14700b57cec5SDimitry Andric}
14710b57cec5SDimitry Andric
14720b57cec5SDimitry Andric} // End OtherPredicates = [HasFlatAddressSpace]
14730b57cec5SDimitry Andric
1474e8d8bef9SDimitry Andriclet OtherPredicates = [HasFlatGlobalInsts] in {
1475e8d8bef9SDimitry Andric
147681ad6265SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_UBYTE, atomic_load_8_global, i32>;
147781ad6265SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_UBYTE, atomic_load_8_global, i16>;
147881ad6265SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_USHORT, atomic_load_16_global, i32>;
147981ad6265SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_USHORT, atomic_load_16_global, i16>;
1480e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_UBYTE, extloadi8_global, i32>;
1481e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_UBYTE, zextloadi8_global, i32>;
1482e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_SBYTE, sextloadi8_global, i32>;
1483e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_UBYTE, extloadi8_global, i16>;
1484e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_UBYTE, zextloadi8_global, i16>;
1485e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_SBYTE, sextloadi8_global, i16>;
1486e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_USHORT, extloadi16_global, i32>;
1487e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_USHORT, zextloadi16_global, i32>;
1488e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_SSHORT, sextloadi16_global, i32>;
1489e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_USHORT, load_global, i16>;
14900b57cec5SDimitry Andric
14918bcb0991SDimitry Andricforeach vt = Reg32Types.types in {
1492e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_DWORD, load_global, vt>;
1493e8d8bef9SDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_DWORD, store_global, vt>;
14948bcb0991SDimitry Andric}
14958bcb0991SDimitry Andric
14968bcb0991SDimitry Andricforeach vt = VReg_64.RegTypes in {
1497e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_DWORDX2, load_global, vt>;
1498e8d8bef9SDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_DWORDX2, store_global, vt>;
14998bcb0991SDimitry Andric}
15008bcb0991SDimitry Andric
1501e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_DWORDX3, load_global, v3i32>;
1502480093f4SDimitry Andric
1503480093f4SDimitry Andricforeach vt = VReg_128.RegTypes in {
1504e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_DWORDX4, load_global, vt>;
1505e8d8bef9SDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_DWORDX4, store_global, vt>;
1506480093f4SDimitry Andric}
15070b57cec5SDimitry Andric
1508e8d8bef9SDimitry Andric// There is no distinction for atomic load lowering during selection;
1509e8d8bef9SDimitry Andric// the memory legalizer will set the cache bits and insert the
1510e8d8bef9SDimitry Andric// appropriate waits.
1511e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_DWORD, atomic_load_32_global, i32>;
1512e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats <GLOBAL_LOAD_DWORDX2, atomic_load_64_global, i64>;
15130b57cec5SDimitry Andric
1514e8d8bef9SDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_BYTE, truncstorei8_global, i32>;
1515e8d8bef9SDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_BYTE, truncstorei8_global, i16>;
1516e8d8bef9SDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_SHORT, truncstorei16_global, i32>;
1517e8d8bef9SDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_SHORT, store_global, i16>;
1518e8d8bef9SDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_DWORDX3, store_global, v3i32>;
15190b57cec5SDimitry Andric
152081ad6265SDimitry Andriclet OtherPredicates = [HasD16LoadStore] in {
1521e8d8bef9SDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_SHORT_D16_HI, truncstorei16_hi16_global, i32>;
1522e8d8bef9SDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_BYTE_D16_HI, truncstorei8_hi16_global, i32>;
152381ad6265SDimitry Andric}
15240b57cec5SDimitry Andric
152581ad6265SDimitry Andriclet OtherPredicates = [D16PreservesUnusedBits] in {
1526e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_global, v2i16>;
1527e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_global, v2f16>;
1528e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_global, v2i16>;
1529e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_global, v2f16>;
1530e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_SHORT_D16_HI, load_d16_hi_global, v2i16>;
1531e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_SHORT_D16_HI, load_d16_hi_global, v2f16>;
15320b57cec5SDimitry Andric
1533e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_UBYTE_D16, az_extloadi8_d16_lo_global, v2i16>;
1534e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_UBYTE_D16, az_extloadi8_d16_lo_global, v2f16>;
1535e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_SBYTE_D16, sextloadi8_d16_lo_global, v2i16>;
1536e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_SBYTE_D16, sextloadi8_d16_lo_global, v2f16>;
1537e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_SHORT_D16, load_d16_lo_global, v2i16>;
1538e8d8bef9SDimitry Andricdefm : GlobalFLATLoadPats_D16 <GLOBAL_LOAD_SHORT_D16, load_d16_lo_global, v2f16>;
15390b57cec5SDimitry Andric}
15400b57cec5SDimitry Andric
15415f757f3fSDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_BYTE, atomic_store_8_global, i32>;
15425f757f3fSDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_BYTE, atomic_store_8_global, i16>;
15435f757f3fSDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_SHORT, atomic_store_16_global, i32>;
15445f757f3fSDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_SHORT, atomic_store_16_global, i16>;
15455f757f3fSDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_DWORD, atomic_store_32_global, i32>;
15465f757f3fSDimitry Andricdefm : GlobalFLATStorePats <GLOBAL_STORE_DWORDX2, atomic_store_64_global, i64>;
15470b57cec5SDimitry Andric
154881ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_ADD", "atomic_load_add_global", i32>;
154981ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_SUB", "atomic_load_sub_global", i32>;
155006c3fb27SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_INC", "atomic_load_uinc_wrap_global", i32>;
155106c3fb27SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_DEC", "atomic_load_udec_wrap_global", i32>;
155281ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_AND", "atomic_load_and_global", i32>;
155381ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_SMAX", "atomic_load_max_global", i32>;
155481ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_UMAX", "atomic_load_umax_global", i32>;
155581ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_SMIN", "atomic_load_min_global", i32>;
155681ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_UMIN", "atomic_load_umin_global", i32>;
155781ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_OR", "atomic_load_or_global", i32>;
155881ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_SWAP", "atomic_swap_global", i32>;
155981ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_CMPSWAP", "AMDGPUatomic_cmp_swap_global", i32, v2i32>;
156081ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_XOR", "atomic_load_xor_global", i32>;
1561bdd1243dSDimitry Andricdefm : GlobalFLATAtomicPatsRtn <"GLOBAL_ATOMIC_CSUB", "int_amdgcn_global_atomic_csub", i32, i32, /* isIntr */ 1>;
15620b57cec5SDimitry Andric
15635f757f3fSDimitry Andriclet OtherPredicates = [HasAtomicCSubNoRtnInsts] in
15645f757f3fSDimitry Andricdefm : GlobalFLATAtomicPatsNoRtn <"GLOBAL_ATOMIC_CSUB", "int_amdgcn_global_atomic_csub", i32, i32, /* isIntr */ 1>;
15655f757f3fSDimitry Andric
156681ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_ADD_X2", "atomic_load_add_global", i64>;
156781ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_SUB_X2", "atomic_load_sub_global", i64>;
156806c3fb27SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_INC_X2", "atomic_load_uinc_wrap_global", i64>;
156906c3fb27SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_DEC_X2", "atomic_load_udec_wrap_global", i64>;
157081ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_AND_X2", "atomic_load_and_global", i64>;
157181ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_SMAX_X2", "atomic_load_max_global", i64>;
157281ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_UMAX_X2", "atomic_load_umax_global", i64>;
157381ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_SMIN_X2", "atomic_load_min_global", i64>;
157481ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_UMIN_X2", "atomic_load_umin_global", i64>;
157581ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_OR_X2", "atomic_load_or_global", i64>;
157681ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_SWAP_X2", "atomic_swap_global", i64>;
157781ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_CMPSWAP_X2", "AMDGPUatomic_cmp_swap_global", i64, v2i64>;
157881ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_XOR_X2", "atomic_load_xor_global", i64>;
15790b57cec5SDimitry Andric
15807a6dacacSDimitry Andriclet SubtargetPredicate = isGFX12Plus in {
15817a6dacacSDimitry Andric  defm : GlobalFLATAtomicPatsRtnWithAddrSpace <"GLOBAL_ATOMIC_COND_SUB_U32", "int_amdgcn_atomic_cond_sub_u32", "global_addrspace", i32>;
15827a6dacacSDimitry Andric
15837a6dacacSDimitry Andric  let OtherPredicates = [HasAtomicCSubNoRtnInsts] in
15847a6dacacSDimitry Andric    defm : GlobalFLATAtomicPatsNoRtnWithAddrSpace  <"GLOBAL_ATOMIC_COND_SUB_U32", "int_amdgcn_atomic_cond_sub_u32", "global_addrspace",  i32>;
15857a6dacacSDimitry Andric}
15867a6dacacSDimitry Andric
1587647cbc5dSDimitry Andriclet OtherPredicates = [isGFX12Plus] in {
1588647cbc5dSDimitry Andric  defm : GlobalFLATAtomicPatsRtn <"GLOBAL_ATOMIC_ORDERED_ADD_B64", "int_amdgcn_global_atomic_ordered_add_b64", i64, i64, /* isIntr */ 1>;
15897a6dacacSDimitry Andric
15907a6dacacSDimitry Andric  let WaveSizePredicate = isWave32 in {
1591*0fca6ea1SDimitry Andric    defm : GlobalFLATLoadPats <GLOBAL_LOAD_TR_B64_w32, int_amdgcn_global_load_tr_b64, v2i32>;
1592*0fca6ea1SDimitry Andric    foreach vt = [v8i16, v8f16, v8bf16] in
1593*0fca6ea1SDimitry Andric      defm : GlobalFLATLoadPats <GLOBAL_LOAD_TR_B128_w32, int_amdgcn_global_load_tr_b128, vt>;
15947a6dacacSDimitry Andric  }
15957a6dacacSDimitry Andric  let WaveSizePredicate = isWave64 in {
1596*0fca6ea1SDimitry Andric    defm : GlobalFLATLoadPats <GLOBAL_LOAD_TR_B64_w64, int_amdgcn_global_load_tr_b64, i32>;
1597*0fca6ea1SDimitry Andric    foreach vt = [v4i16, v4f16, v4bf16] in
1598*0fca6ea1SDimitry Andric      defm : GlobalFLATLoadPats <GLOBAL_LOAD_TR_B128_w64, int_amdgcn_global_load_tr_b128, vt>;
15997a6dacacSDimitry Andric  }
1600647cbc5dSDimitry Andric}
1601647cbc5dSDimitry Andric
1602*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasAtomicFMinFMaxF32GlobalInsts, OtherPredicates = [HasFlatGlobalInsts] in {
160381ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_FMIN", "atomic_load_fmin_global", f32>;
160481ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_FMAX", "atomic_load_fmax_global", f32>;
16055f757f3fSDimitry Andricdefm : GlobalFLATAtomicIntrPats <"GLOBAL_ATOMIC_FMIN", "int_amdgcn_global_atomic_fmin", f32>;
16065f757f3fSDimitry Andricdefm : GlobalFLATAtomicIntrPats <"GLOBAL_ATOMIC_FMAX", "int_amdgcn_global_atomic_fmax", f32>;
160706c3fb27SDimitry Andric}
160806c3fb27SDimitry Andric
1609*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasAtomicFMinFMaxF32FlatInsts in {
1610*0fca6ea1SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_FMIN", "atomic_load_fmin_flat", f32>;
1611*0fca6ea1SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_FMAX", "atomic_load_fmax_flat", f32>;
1612*0fca6ea1SDimitry Andricdefm : FlatAtomicIntrPat <"FLAT_ATOMIC_FMIN", "int_amdgcn_flat_atomic_fmin", f32>;
1613*0fca6ea1SDimitry Andricdefm : FlatAtomicIntrPat <"FLAT_ATOMIC_FMAX", "int_amdgcn_flat_atomic_fmax", f32>;
1614349cc55cSDimitry Andric}
1615349cc55cSDimitry Andric
16165f757f3fSDimitry Andriclet OtherPredicates = [isGFX12Only] in {
1617*0fca6ea1SDimitry Andric  // FIXME: Remove these intrinsics
16185f757f3fSDimitry Andric  defm : GlobalFLATAtomicIntrPats <"GLOBAL_ATOMIC_FMIN", "int_amdgcn_global_atomic_fmin_num", f32>;
16195f757f3fSDimitry Andric  defm : GlobalFLATAtomicIntrPats <"GLOBAL_ATOMIC_FMAX", "int_amdgcn_global_atomic_fmax_num", f32>;
1620*0fca6ea1SDimitry Andric  defm : FlatAtomicIntrPat <"FLAT_ATOMIC_FMIN", "int_amdgcn_flat_atomic_fmin_num", f32>;
1621*0fca6ea1SDimitry Andric  defm : FlatAtomicIntrPat <"FLAT_ATOMIC_FMAX", "int_amdgcn_flat_atomic_fmax_num", f32>;
16225f757f3fSDimitry Andric}
16235f757f3fSDimitry Andric
1624bdd1243dSDimitry Andriclet OtherPredicates = [HasAtomicFaddNoRtnInsts] in {
1625bdd1243dSDimitry Andricdefm : GlobalFLATAtomicPatsNoRtn <"GLOBAL_ATOMIC_ADD_F32", "atomic_load_fadd_global", f32>;
1626bdd1243dSDimitry Andricdefm : GlobalFLATAtomicPatsNoRtnWithAddrSpace <"GLOBAL_ATOMIC_ADD_F32", "int_amdgcn_flat_atomic_fadd", "global_addrspace", f32>;
1627bdd1243dSDimitry Andricdefm : GlobalFLATAtomicPatsNoRtnWithAddrSpace <"GLOBAL_ATOMIC_ADD_F32", "int_amdgcn_global_atomic_fadd", "global_addrspace", f32>;
1628bdd1243dSDimitry Andric}
1629bdd1243dSDimitry Andric
163006c3fb27SDimitry Andriclet OtherPredicates = [HasAtomicBufferGlobalPkAddF16NoRtnInsts] in {
1631*0fca6ea1SDimitry Andricdefm : GlobalFLATAtomicPatsNoRtn <"GLOBAL_ATOMIC_PK_ADD_F16", "atomic_load_fadd_global", v2f16>;
1632bdd1243dSDimitry Andricdefm : GlobalFLATAtomicPatsNoRtnWithAddrSpace <"GLOBAL_ATOMIC_PK_ADD_F16", "int_amdgcn_flat_atomic_fadd", "global_addrspace", v2f16>;
1633bdd1243dSDimitry Andricdefm : GlobalFLATAtomicPatsNoRtnWithAddrSpace <"GLOBAL_ATOMIC_PK_ADD_F16", "int_amdgcn_global_atomic_fadd", "global_addrspace", v2f16>;
1634bdd1243dSDimitry Andric}
1635bdd1243dSDimitry Andric
1636bdd1243dSDimitry Andriclet OtherPredicates = [HasAtomicFaddRtnInsts] in {
1637bdd1243dSDimitry Andricdefm : GlobalFLATAtomicPatsRtn <"GLOBAL_ATOMIC_ADD_F32", "atomic_load_fadd_global", f32>;
1638bdd1243dSDimitry Andricdefm : GlobalFLATAtomicPatsRtnWithAddrSpace <"GLOBAL_ATOMIC_ADD_F32", "int_amdgcn_flat_atomic_fadd", "global_addrspace", f32>;
1639bdd1243dSDimitry Andricdefm : GlobalFLATAtomicPatsRtnWithAddrSpace <"GLOBAL_ATOMIC_ADD_F32", "int_amdgcn_global_atomic_fadd", "global_addrspace", f32>;
1640bdd1243dSDimitry Andric}
16410b57cec5SDimitry Andric
164206c3fb27SDimitry Andriclet OtherPredicates = [HasAtomicBufferGlobalPkAddF16Insts] in {
164306c3fb27SDimitry Andricdefm : GlobalFLATAtomicPatsRtnWithAddrSpace <"GLOBAL_ATOMIC_PK_ADD_F16", "int_amdgcn_flat_atomic_fadd", "global_addrspace", v2f16>;
164406c3fb27SDimitry Andricdefm : GlobalFLATAtomicPatsRtnWithAddrSpace <"GLOBAL_ATOMIC_PK_ADD_F16", "int_amdgcn_global_atomic_fadd", "global_addrspace", v2f16>;
1645*0fca6ea1SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_PK_ADD_F16", "atomic_load_fadd_global", v2f16>;
164606c3fb27SDimitry Andric}
164706c3fb27SDimitry Andric
1648*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasAtomicFMinFMaxF64GlobalInsts, OtherPredicates = [HasFlatGlobalInsts] in {
164981ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_MIN_F64", "atomic_load_fmin_global", f64>;
165081ad6265SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_MAX_F64", "atomic_load_fmax_global", f64>;
165181ad6265SDimitry Andricdefm : GlobalFLATAtomicIntrPats <"GLOBAL_ATOMIC_MIN_F64", "int_amdgcn_global_atomic_fmin", f64>;
165281ad6265SDimitry Andricdefm : GlobalFLATAtomicIntrPats <"GLOBAL_ATOMIC_MAX_F64", "int_amdgcn_global_atomic_fmax", f64>;
1653*0fca6ea1SDimitry Andric}
1654*0fca6ea1SDimitry Andric
1655*0fca6ea1SDimitry Andriclet SubtargetPredicate = HasAtomicFMinFMaxF64FlatInsts in {
1656*0fca6ea1SDimitry Andricdefm : FlatAtomicIntrPat <"FLAT_ATOMIC_MIN_F64", "int_amdgcn_flat_atomic_fmin", f64>;
1657*0fca6ea1SDimitry Andricdefm : FlatAtomicIntrPat <"FLAT_ATOMIC_MAX_F64", "int_amdgcn_flat_atomic_fmax", f64>;
1658*0fca6ea1SDimitry Andric}
1659*0fca6ea1SDimitry Andric
1660*0fca6ea1SDimitry Andriclet OtherPredicates = [HasFlatBufferGlobalAtomicFaddF64Inst] in {
1661*0fca6ea1SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_ADD_F64", "atomic_load_fadd_global", f64>;
1662*0fca6ea1SDimitry Andricdefm : GlobalFLATAtomicPatsWithAddrSpace<"GLOBAL_ATOMIC_ADD_F64", "int_amdgcn_flat_atomic_fadd", "global_addrspace", f64>;
1663*0fca6ea1SDimitry Andricdefm : GlobalFLATAtomicPatsWithAddrSpace<"GLOBAL_ATOMIC_ADD_F64", "int_amdgcn_global_atomic_fadd", "global_addrspace", f64>;
1664*0fca6ea1SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_ADD_F64", "atomic_load_fadd_flat", f64>;
1665*0fca6ea1SDimitry Andricdefm : FlatAtomicIntrPat <"FLAT_ATOMIC_ADD_F64", "int_amdgcn_flat_atomic_fadd", f64>;
166681ad6265SDimitry Andric}
166781ad6265SDimitry Andric
1668bdd1243dSDimitry Andriclet OtherPredicates = [HasFlatAtomicFaddF32Inst] in {
1669*0fca6ea1SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_ADD_F32", "atomic_load_fadd_flat", f32>;
1670*0fca6ea1SDimitry Andricdefm : FlatAtomicIntrPat <"FLAT_ATOMIC_ADD_F32", "int_amdgcn_flat_atomic_fadd", f32>;
1671bdd1243dSDimitry Andric}
1672bdd1243dSDimitry Andric
167306c3fb27SDimitry Andriclet OtherPredicates = [HasAtomicFlatPkAdd16Insts] in {
1674*0fca6ea1SDimitry Andricdefm : FlatAtomicIntrPat <"FLAT_ATOMIC_PK_ADD_F16", "int_amdgcn_flat_atomic_fadd", v2f16>;
1675*0fca6ea1SDimitry Andricdefm : FlatAtomicIntrPat <"FLAT_ATOMIC_PK_ADD_BF16", "int_amdgcn_flat_atomic_fadd_v2bf16", v2i16>;
1676*0fca6ea1SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_PK_ADD_F16", "atomic_load_fadd_flat", v2f16>;
1677*0fca6ea1SDimitry Andricdefm : FlatAtomicPat <"FLAT_ATOMIC_PK_ADD_BF16", "atomic_load_fadd_flat", v2bf16>;
1678fe6060f1SDimitry Andric}
1679fe6060f1SDimitry Andric
168006c3fb27SDimitry Andriclet OtherPredicates = [HasAtomicGlobalPkAddBF16Inst] in
168106c3fb27SDimitry Andricdefm : GlobalFLATAtomicIntrPats <"GLOBAL_ATOMIC_PK_ADD_BF16", "int_amdgcn_global_atomic_fadd_v2bf16", v2i16>;
1682*0fca6ea1SDimitry Andricdefm : GlobalFLATAtomicPats <"GLOBAL_ATOMIC_PK_ADD_BF16", "atomic_load_fadd_global", v2bf16>;
16830b57cec5SDimitry Andric} // End OtherPredicates = [HasFlatGlobalInsts], AddedComplexity = 10
16840b57cec5SDimitry Andric
1685e8d8bef9SDimitry Andriclet OtherPredicates = [HasFlatScratchInsts, EnableFlatScratch] in {
1686e8d8bef9SDimitry Andric
1687e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_UBYTE, extloadi8_private, i32>;
1688e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_UBYTE, zextloadi8_private, i32>;
1689e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_SBYTE, sextloadi8_private, i32>;
1690e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_UBYTE, extloadi8_private, i16>;
1691e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_UBYTE, zextloadi8_private, i16>;
1692e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_SBYTE, sextloadi8_private, i16>;
1693e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_USHORT, extloadi16_private, i32>;
1694e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_USHORT, zextloadi16_private, i32>;
1695e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_SSHORT, sextloadi16_private, i32>;
1696e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_USHORT, load_private, i16>;
1697e8d8bef9SDimitry Andric
1698e8d8bef9SDimitry Andricforeach vt = Reg32Types.types in {
1699e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_DWORD, load_private, vt>;
1700e8d8bef9SDimitry Andricdefm : ScratchFLATStorePats <SCRATCH_STORE_DWORD, store_private, vt>;
1701e8d8bef9SDimitry Andric}
1702e8d8bef9SDimitry Andric
1703e8d8bef9SDimitry Andricforeach vt = VReg_64.RegTypes in {
1704e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_DWORDX2, load_private, vt>;
1705e8d8bef9SDimitry Andricdefm : ScratchFLATStorePats <SCRATCH_STORE_DWORDX2, store_private, vt>;
1706e8d8bef9SDimitry Andric}
1707e8d8bef9SDimitry Andric
1708e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_DWORDX3, load_private, v3i32>;
1709e8d8bef9SDimitry Andric
1710e8d8bef9SDimitry Andricforeach vt = VReg_128.RegTypes in {
1711e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats <SCRATCH_LOAD_DWORDX4, load_private, vt>;
1712e8d8bef9SDimitry Andricdefm : ScratchFLATStorePats <SCRATCH_STORE_DWORDX4, store_private, vt>;
1713e8d8bef9SDimitry Andric}
1714e8d8bef9SDimitry Andric
1715e8d8bef9SDimitry Andricdefm : ScratchFLATStorePats <SCRATCH_STORE_BYTE, truncstorei8_private, i32>;
1716e8d8bef9SDimitry Andricdefm : ScratchFLATStorePats <SCRATCH_STORE_BYTE, truncstorei8_private, i16>;
1717e8d8bef9SDimitry Andricdefm : ScratchFLATStorePats <SCRATCH_STORE_SHORT, truncstorei16_private, i32>;
1718e8d8bef9SDimitry Andricdefm : ScratchFLATStorePats <SCRATCH_STORE_SHORT, store_private, i16>;
1719e8d8bef9SDimitry Andricdefm : ScratchFLATStorePats <SCRATCH_STORE_DWORDX3, store_private, v3i32>;
1720e8d8bef9SDimitry Andric
172181ad6265SDimitry Andriclet OtherPredicates = [HasD16LoadStore, HasFlatScratchInsts, EnableFlatScratch] in {
1722e8d8bef9SDimitry Andricdefm : ScratchFLATStorePats <SCRATCH_STORE_SHORT_D16_HI, truncstorei16_hi16_private, i32>;
1723e8d8bef9SDimitry Andricdefm : ScratchFLATStorePats <SCRATCH_STORE_BYTE_D16_HI, truncstorei8_hi16_private, i32>;
172481ad6265SDimitry Andric}
1725e8d8bef9SDimitry Andric
172681ad6265SDimitry Andriclet OtherPredicates = [D16PreservesUnusedBits, HasFlatScratchInsts, EnableFlatScratch] in {
1727e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_private, v2i16>;
1728e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_UBYTE_D16_HI, az_extloadi8_d16_hi_private, v2f16>;
1729e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_private, v2i16>;
1730e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_SBYTE_D16_HI, sextloadi8_d16_hi_private, v2f16>;
1731e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_SHORT_D16_HI, load_d16_hi_private, v2i16>;
1732e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_SHORT_D16_HI, load_d16_hi_private, v2f16>;
1733e8d8bef9SDimitry Andric
1734e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_UBYTE_D16, az_extloadi8_d16_lo_private, v2i16>;
1735e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_UBYTE_D16, az_extloadi8_d16_lo_private, v2f16>;
1736e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_SBYTE_D16, sextloadi8_d16_lo_private, v2i16>;
1737e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_SBYTE_D16, sextloadi8_d16_lo_private, v2f16>;
1738e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_SHORT_D16, load_d16_lo_private, v2i16>;
1739e8d8bef9SDimitry Andricdefm : ScratchFLATLoadPats_D16 <SCRATCH_LOAD_SHORT_D16, load_d16_lo_private, v2f16>;
1740e8d8bef9SDimitry Andric}
1741e8d8bef9SDimitry Andric
1742e8d8bef9SDimitry Andric} // End OtherPredicates = [HasFlatScratchInsts,EnableFlatScratch]
17430b57cec5SDimitry Andric
17440b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
17450b57cec5SDimitry Andric// Target
17460b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
17470b57cec5SDimitry Andric
17480b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
17490b57cec5SDimitry Andric// CI
17500b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
17510b57cec5SDimitry Andric
1752*0fca6ea1SDimitry Andricclass FLAT_Real_ci <bits<7> op, FLAT_Pseudo ps, string asmName = ps.Mnemonic> :
1753*0fca6ea1SDimitry Andric  FLAT_Real <op, ps, asmName>,
17540b57cec5SDimitry Andric  SIMCInstr <ps.PseudoInstr, SIEncodingFamily.SI> {
17550b57cec5SDimitry Andric  let AssemblerPredicate = isGFX7Only;
17560b57cec5SDimitry Andric  let DecoderNamespace="GFX7";
17570b57cec5SDimitry Andric}
17580b57cec5SDimitry Andric
17590b57cec5SDimitry Andricdef FLAT_LOAD_UBYTE_ci         : FLAT_Real_ci <0x8,  FLAT_LOAD_UBYTE>;
17600b57cec5SDimitry Andricdef FLAT_LOAD_SBYTE_ci         : FLAT_Real_ci <0x9,  FLAT_LOAD_SBYTE>;
17610b57cec5SDimitry Andricdef FLAT_LOAD_USHORT_ci        : FLAT_Real_ci <0xa,  FLAT_LOAD_USHORT>;
17620b57cec5SDimitry Andricdef FLAT_LOAD_SSHORT_ci        : FLAT_Real_ci <0xb,  FLAT_LOAD_SSHORT>;
17630b57cec5SDimitry Andricdef FLAT_LOAD_DWORD_ci         : FLAT_Real_ci <0xc,  FLAT_LOAD_DWORD>;
17640b57cec5SDimitry Andricdef FLAT_LOAD_DWORDX2_ci       : FLAT_Real_ci <0xd,  FLAT_LOAD_DWORDX2>;
17650b57cec5SDimitry Andricdef FLAT_LOAD_DWORDX4_ci       : FLAT_Real_ci <0xe,  FLAT_LOAD_DWORDX4>;
17660b57cec5SDimitry Andricdef FLAT_LOAD_DWORDX3_ci       : FLAT_Real_ci <0xf,  FLAT_LOAD_DWORDX3>;
17670b57cec5SDimitry Andric
17680b57cec5SDimitry Andricdef FLAT_STORE_BYTE_ci         : FLAT_Real_ci <0x18, FLAT_STORE_BYTE>;
17690b57cec5SDimitry Andricdef FLAT_STORE_SHORT_ci        : FLAT_Real_ci <0x1a, FLAT_STORE_SHORT>;
17700b57cec5SDimitry Andricdef FLAT_STORE_DWORD_ci        : FLAT_Real_ci <0x1c, FLAT_STORE_DWORD>;
17710b57cec5SDimitry Andricdef FLAT_STORE_DWORDX2_ci      : FLAT_Real_ci <0x1d, FLAT_STORE_DWORDX2>;
17720b57cec5SDimitry Andricdef FLAT_STORE_DWORDX4_ci      : FLAT_Real_ci <0x1e, FLAT_STORE_DWORDX4>;
17730b57cec5SDimitry Andricdef FLAT_STORE_DWORDX3_ci      : FLAT_Real_ci <0x1f, FLAT_STORE_DWORDX3>;
17740b57cec5SDimitry Andric
1775*0fca6ea1SDimitry Andricmulticlass FLAT_Real_Atomics_ci <bits<7> op, string opName = NAME,
1776*0fca6ea1SDimitry Andric                                 string asmName = !cast<FLAT_Pseudo>(opName).Mnemonic> {
1777*0fca6ea1SDimitry Andric  defvar ps = !cast<FLAT_Pseudo>(opName);
1778*0fca6ea1SDimitry Andric  defvar ps_rtn = !cast<FLAT_Pseudo>(opName#"_RTN");
1779*0fca6ea1SDimitry Andric
1780*0fca6ea1SDimitry Andric  def _ci     : FLAT_Real_ci<op, ps, asmName>;
1781*0fca6ea1SDimitry Andric  def _RTN_ci : FLAT_Real_ci<op, ps_rtn, asmName>;
17820b57cec5SDimitry Andric}
17830b57cec5SDimitry Andric
1784*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SWAP          : FLAT_Real_Atomics_ci <0x30>;
1785*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP       : FLAT_Real_Atomics_ci <0x31>;
1786*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_ADD           : FLAT_Real_Atomics_ci <0x32>;
1787*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SUB           : FLAT_Real_Atomics_ci <0x33>;
1788*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMIN          : FLAT_Real_Atomics_ci <0x35>;
1789*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMIN          : FLAT_Real_Atomics_ci <0x36>;
1790*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMAX          : FLAT_Real_Atomics_ci <0x37>;
1791*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMAX          : FLAT_Real_Atomics_ci <0x38>;
1792*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_AND           : FLAT_Real_Atomics_ci <0x39>;
1793*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_OR            : FLAT_Real_Atomics_ci <0x3a>;
1794*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_XOR           : FLAT_Real_Atomics_ci <0x3b>;
1795*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_INC           : FLAT_Real_Atomics_ci <0x3c>;
1796*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_DEC           : FLAT_Real_Atomics_ci <0x3d>;
1797*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SWAP_X2       : FLAT_Real_Atomics_ci <0x50>;
1798*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP_X2    : FLAT_Real_Atomics_ci <0x51>;
1799*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_ADD_X2        : FLAT_Real_Atomics_ci <0x52>;
1800*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SUB_X2        : FLAT_Real_Atomics_ci <0x53>;
1801*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMIN_X2       : FLAT_Real_Atomics_ci <0x55>;
1802*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMIN_X2       : FLAT_Real_Atomics_ci <0x56>;
1803*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMAX_X2       : FLAT_Real_Atomics_ci <0x57>;
1804*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMAX_X2       : FLAT_Real_Atomics_ci <0x58>;
1805*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_AND_X2        : FLAT_Real_Atomics_ci <0x59>;
1806*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_OR_X2         : FLAT_Real_Atomics_ci <0x5a>;
1807*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_XOR_X2        : FLAT_Real_Atomics_ci <0x5b>;
1808*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_INC_X2        : FLAT_Real_Atomics_ci <0x5c>;
1809*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_DEC_X2        : FLAT_Real_Atomics_ci <0x5d>;
18100b57cec5SDimitry Andric
18110b57cec5SDimitry Andric// CI Only flat instructions
1812*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FCMPSWAP      : FLAT_Real_Atomics_ci <0x3e>;
1813*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FMIN          : FLAT_Real_Atomics_ci <0x3f>;
1814*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FMAX          : FLAT_Real_Atomics_ci <0x40>;
1815*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FCMPSWAP_X2   : FLAT_Real_Atomics_ci <0x5e>;
1816*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FMIN_X2       : FLAT_Real_Atomics_ci <0x5f, "FLAT_ATOMIC_MIN_F64", "flat_atomic_fmin_x2">;
1817*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FMAX_X2       : FLAT_Real_Atomics_ci <0x60, "FLAT_ATOMIC_MAX_F64", "flat_atomic_fmax_x2">;
18180b57cec5SDimitry Andric
18190b57cec5SDimitry Andric
18200b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
18210b57cec5SDimitry Andric// VI
18220b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
18230b57cec5SDimitry Andric
1824fe6060f1SDimitry Andricclass FLAT_Real_vi <bits<7> op, FLAT_Pseudo ps, bit has_sccb = ps.has_sccb> :
18250b57cec5SDimitry Andric  FLAT_Real <op, ps>,
18260b57cec5SDimitry Andric  SIMCInstr <ps.PseudoInstr, SIEncodingFamily.VI> {
18270b57cec5SDimitry Andric  let AssemblerPredicate = isGFX8GFX9;
18280b57cec5SDimitry Andric  let DecoderNamespace = "GFX8";
1829fe6060f1SDimitry Andric
1830fe6060f1SDimitry Andric  let Inst{25} = !if(has_sccb, cpol{CPolBit.SCC}, ps.sccbValue);
1831fe6060f1SDimitry Andric  let AsmString = ps.Mnemonic #
1832fe6060f1SDimitry Andric                  !subst("$sccb", !if(has_sccb, "$sccb",""), ps.AsmOperands);
18330b57cec5SDimitry Andric}
18340b57cec5SDimitry Andric
1835fe6060f1SDimitry Andricmulticlass FLAT_Real_AllAddr_vi<bits<7> op,
1836fe6060f1SDimitry Andric  bit has_sccb = !cast<FLAT_Pseudo>(NAME).has_sccb> {
1837fe6060f1SDimitry Andric  def _vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME), has_sccb>;
1838fe6060f1SDimitry Andric  def _SADDR_vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME#"_SADDR"), has_sccb>;
18390b57cec5SDimitry Andric}
18400b57cec5SDimitry Andric
184181ad6265SDimitry Andricclass FLAT_Real_gfx940 <bits<7> op, FLAT_Pseudo ps> :
184281ad6265SDimitry Andric  FLAT_Real <op, ps>,
184381ad6265SDimitry Andric  SIMCInstr <ps.PseudoInstr, SIEncodingFamily.GFX940> {
184481ad6265SDimitry Andric  let AssemblerPredicate = isGFX940Plus;
184581ad6265SDimitry Andric  let DecoderNamespace = "GFX9";
184681ad6265SDimitry Andric  let Inst{13} = ps.sve;
184781ad6265SDimitry Andric  let Inst{25} = !if(ps.has_sccb, cpol{CPolBit.SCC}, ps.sccbValue);
184881ad6265SDimitry Andric}
184981ad6265SDimitry Andric
185081ad6265SDimitry Andricmulticlass FLAT_Real_AllAddr_SVE_vi<bits<7> op> {
185181ad6265SDimitry Andric  def _vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME)> {
185281ad6265SDimitry Andric    let AssemblerPredicate = isGFX8GFX9NotGFX940;
185381ad6265SDimitry Andric    let OtherPredicates = [isGFX8GFX9NotGFX940];
185481ad6265SDimitry Andric  }
185581ad6265SDimitry Andric  def _SADDR_vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(NAME#"_SADDR")> {
185681ad6265SDimitry Andric    let DecoderNamespace = "GFX9";
185781ad6265SDimitry Andric  }
185881ad6265SDimitry Andric  let AssemblerPredicate = isGFX940Plus, SubtargetPredicate = isGFX940Plus in {
185981ad6265SDimitry Andric    def _VE_gfx940  : FLAT_Real_gfx940<op, !cast<FLAT_Pseudo>(NAME)>;
186081ad6265SDimitry Andric    def _SVS_gfx940 : FLAT_Real_gfx940<op, !cast<FLAT_Pseudo>(NAME#"_SVS")>;
186181ad6265SDimitry Andric    def _ST_gfx940  : FLAT_Real_gfx940<op, !cast<FLAT_Pseudo>(NAME#"_ST")>;
186281ad6265SDimitry Andric  }
186381ad6265SDimitry Andric}
186481ad6265SDimitry Andric
186581ad6265SDimitry Andricmulticlass FLAT_Real_AllAddr_LDS<bits<7> op, bits<7> pre_gfx940_op,
1866*0fca6ea1SDimitry Andric  string pre_gfx940_name = !subst("_lds", "", !cast<FLAT_Pseudo>(NAME).Mnemonic),
186781ad6265SDimitry Andric  bit has_sccb = !cast<FLAT_Pseudo>(NAME).has_sccb> {
186881ad6265SDimitry Andric
186981ad6265SDimitry Andric  let OtherPredicates = [isGFX8GFX9NotGFX940] in {
187081ad6265SDimitry Andric    def _vi : FLAT_Real_vi<pre_gfx940_op, !cast<FLAT_Pseudo>(NAME), has_sccb> {
187181ad6265SDimitry Andric      let AsmString = pre_gfx940_name # !cast<FLAT_Pseudo>(NAME).AsmOperands # " lds";
187281ad6265SDimitry Andric    }
187381ad6265SDimitry Andric    def _SADDR_vi : FLAT_Real_vi<pre_gfx940_op, !cast<FLAT_Pseudo>(NAME#"_SADDR"), has_sccb> {
187481ad6265SDimitry Andric      let AsmString = pre_gfx940_name # !cast<FLAT_Pseudo>(NAME#"_SADDR").AsmOperands # " lds";
187581ad6265SDimitry Andric    }
187681ad6265SDimitry Andric  }
187781ad6265SDimitry Andric
187881ad6265SDimitry Andric  let SubtargetPredicate = isGFX940Plus in {
187981ad6265SDimitry Andric    def _gfx940 : FLAT_Real_gfx940<op, !cast<FLAT_Pseudo>(NAME)>;
188081ad6265SDimitry Andric    def _SADDR_gfx940 : FLAT_Real_gfx940<op, !cast<FLAT_Pseudo>(NAME#"_SADDR")>;
188181ad6265SDimitry Andric  }
188281ad6265SDimitry Andric}
188381ad6265SDimitry Andric
188481ad6265SDimitry Andricmulticlass FLAT_Real_AllAddr_SVE_LDS<bits<7> op, bits<7> pre_gfx940_op> {
188581ad6265SDimitry Andric  defm "" : FLAT_Real_AllAddr_LDS<op, pre_gfx940_op>;
188681ad6265SDimitry Andric  let SubtargetPredicate = isGFX940Plus in {
188781ad6265SDimitry Andric    def _SVS_gfx940 : FLAT_Real_gfx940<op, !cast<FLAT_Pseudo>(NAME#"_SVS")>;
188881ad6265SDimitry Andric    def _ST_gfx940  : FLAT_Real_gfx940<op, !cast<FLAT_Pseudo>(NAME#"_ST")>;
188981ad6265SDimitry Andric  }
189081ad6265SDimitry Andric}
189181ad6265SDimitry Andric
18920b57cec5SDimitry Andricdef FLAT_LOAD_UBYTE_vi         : FLAT_Real_vi <0x10, FLAT_LOAD_UBYTE>;
18930b57cec5SDimitry Andricdef FLAT_LOAD_SBYTE_vi         : FLAT_Real_vi <0x11, FLAT_LOAD_SBYTE>;
18940b57cec5SDimitry Andricdef FLAT_LOAD_USHORT_vi        : FLAT_Real_vi <0x12, FLAT_LOAD_USHORT>;
18950b57cec5SDimitry Andricdef FLAT_LOAD_SSHORT_vi        : FLAT_Real_vi <0x13, FLAT_LOAD_SSHORT>;
18960b57cec5SDimitry Andricdef FLAT_LOAD_DWORD_vi         : FLAT_Real_vi <0x14, FLAT_LOAD_DWORD>;
18970b57cec5SDimitry Andricdef FLAT_LOAD_DWORDX2_vi       : FLAT_Real_vi <0x15, FLAT_LOAD_DWORDX2>;
18980b57cec5SDimitry Andricdef FLAT_LOAD_DWORDX4_vi       : FLAT_Real_vi <0x17, FLAT_LOAD_DWORDX4>;
18990b57cec5SDimitry Andricdef FLAT_LOAD_DWORDX3_vi       : FLAT_Real_vi <0x16, FLAT_LOAD_DWORDX3>;
19000b57cec5SDimitry Andric
19010b57cec5SDimitry Andricdef FLAT_STORE_BYTE_vi         : FLAT_Real_vi <0x18, FLAT_STORE_BYTE>;
19020b57cec5SDimitry Andricdef FLAT_STORE_BYTE_D16_HI_vi  : FLAT_Real_vi <0x19, FLAT_STORE_BYTE_D16_HI>;
19030b57cec5SDimitry Andricdef FLAT_STORE_SHORT_vi        : FLAT_Real_vi <0x1a, FLAT_STORE_SHORT>;
19040b57cec5SDimitry Andricdef FLAT_STORE_SHORT_D16_HI_vi : FLAT_Real_vi <0x1b, FLAT_STORE_SHORT_D16_HI>;
19050b57cec5SDimitry Andricdef FLAT_STORE_DWORD_vi        : FLAT_Real_vi <0x1c, FLAT_STORE_DWORD>;
19060b57cec5SDimitry Andricdef FLAT_STORE_DWORDX2_vi      : FLAT_Real_vi <0x1d, FLAT_STORE_DWORDX2>;
19070b57cec5SDimitry Andricdef FLAT_STORE_DWORDX4_vi      : FLAT_Real_vi <0x1f, FLAT_STORE_DWORDX4>;
19080b57cec5SDimitry Andricdef FLAT_STORE_DWORDX3_vi      : FLAT_Real_vi <0x1e, FLAT_STORE_DWORDX3>;
19090b57cec5SDimitry Andric
19100b57cec5SDimitry Andricdef FLAT_LOAD_UBYTE_D16_vi    : FLAT_Real_vi <0x20, FLAT_LOAD_UBYTE_D16>;
19110b57cec5SDimitry Andricdef FLAT_LOAD_UBYTE_D16_HI_vi : FLAT_Real_vi <0x21, FLAT_LOAD_UBYTE_D16_HI>;
19120b57cec5SDimitry Andricdef FLAT_LOAD_SBYTE_D16_vi    : FLAT_Real_vi <0x22, FLAT_LOAD_SBYTE_D16>;
19130b57cec5SDimitry Andricdef FLAT_LOAD_SBYTE_D16_HI_vi : FLAT_Real_vi <0x23, FLAT_LOAD_SBYTE_D16_HI>;
19140b57cec5SDimitry Andricdef FLAT_LOAD_SHORT_D16_vi    : FLAT_Real_vi <0x24, FLAT_LOAD_SHORT_D16>;
19150b57cec5SDimitry Andricdef FLAT_LOAD_SHORT_D16_HI_vi : FLAT_Real_vi <0x25, FLAT_LOAD_SHORT_D16_HI>;
19160b57cec5SDimitry Andric
1917*0fca6ea1SDimitry Andricmulticlass FLAT_Real_Atomics_vi <bits<7> op,
1918fe6060f1SDimitry Andric  bit has_sccb = !cast<FLAT_Pseudo>(NAME).has_sccb> {
1919*0fca6ea1SDimitry Andric  defvar ps = !cast<FLAT_Pseudo>(NAME);
1920fe6060f1SDimitry Andric  def _vi     : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(ps.PseudoInstr), has_sccb>;
1921fe6060f1SDimitry Andric  def _RTN_vi : FLAT_Real_vi<op, !cast<FLAT_Pseudo>(ps.PseudoInstr # "_RTN"), has_sccb>;
19220b57cec5SDimitry Andric}
19230b57cec5SDimitry Andric
1924fe6060f1SDimitry Andricmulticlass FLAT_Global_Real_Atomics_vi<bits<7> op,
1925fe6060f1SDimitry Andric  bit has_sccb = !cast<FLAT_Pseudo>(NAME).has_sccb> :
1926fe6060f1SDimitry Andric  FLAT_Real_AllAddr_vi<op, has_sccb> {
1927fe6060f1SDimitry Andric  def _RTN_vi  : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_RTN"), has_sccb>;
1928fe6060f1SDimitry Andric  def _SADDR_RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN"), has_sccb>;
19290b57cec5SDimitry Andric}
19300b57cec5SDimitry Andric
19310b57cec5SDimitry Andric
1932*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SWAP       : FLAT_Real_Atomics_vi <0x40>;
1933*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP    : FLAT_Real_Atomics_vi <0x41>;
1934*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_ADD        : FLAT_Real_Atomics_vi <0x42>;
1935*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SUB        : FLAT_Real_Atomics_vi <0x43>;
1936*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMIN       : FLAT_Real_Atomics_vi <0x44>;
1937*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMIN       : FLAT_Real_Atomics_vi <0x45>;
1938*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMAX       : FLAT_Real_Atomics_vi <0x46>;
1939*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMAX       : FLAT_Real_Atomics_vi <0x47>;
1940*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_AND        : FLAT_Real_Atomics_vi <0x48>;
1941*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_OR         : FLAT_Real_Atomics_vi <0x49>;
1942*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_XOR        : FLAT_Real_Atomics_vi <0x4a>;
1943*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_INC        : FLAT_Real_Atomics_vi <0x4b>;
1944*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_DEC        : FLAT_Real_Atomics_vi <0x4c>;
1945*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SWAP_X2    : FLAT_Real_Atomics_vi <0x60>;
1946*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP_X2 : FLAT_Real_Atomics_vi <0x61>;
1947*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_ADD_X2     : FLAT_Real_Atomics_vi <0x62>;
1948*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SUB_X2     : FLAT_Real_Atomics_vi <0x63>;
1949*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMIN_X2    : FLAT_Real_Atomics_vi <0x64>;
1950*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMIN_X2    : FLAT_Real_Atomics_vi <0x65>;
1951*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMAX_X2    : FLAT_Real_Atomics_vi <0x66>;
1952*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMAX_X2    : FLAT_Real_Atomics_vi <0x67>;
1953*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_AND_X2     : FLAT_Real_Atomics_vi <0x68>;
1954*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_OR_X2      : FLAT_Real_Atomics_vi <0x69>;
1955*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_XOR_X2     : FLAT_Real_Atomics_vi <0x6a>;
1956*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_INC_X2     : FLAT_Real_Atomics_vi <0x6b>;
1957*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_DEC_X2     : FLAT_Real_Atomics_vi <0x6c>;
19580b57cec5SDimitry Andric
19590b57cec5SDimitry Andricdefm GLOBAL_LOAD_UBYTE : FLAT_Real_AllAddr_vi <0x10>;
19600b57cec5SDimitry Andricdefm GLOBAL_LOAD_SBYTE : FLAT_Real_AllAddr_vi <0x11>;
19610b57cec5SDimitry Andricdefm GLOBAL_LOAD_USHORT : FLAT_Real_AllAddr_vi <0x12>;
19620b57cec5SDimitry Andricdefm GLOBAL_LOAD_SSHORT : FLAT_Real_AllAddr_vi <0x13>;
19630b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORD : FLAT_Real_AllAddr_vi <0x14>;
19640b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORDX2 : FLAT_Real_AllAddr_vi <0x15>;
19650b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORDX3 : FLAT_Real_AllAddr_vi <0x16>;
19660b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORDX4 : FLAT_Real_AllAddr_vi <0x17>;
19670b57cec5SDimitry Andric
19680b57cec5SDimitry Andricdefm GLOBAL_LOAD_UBYTE_D16    : FLAT_Real_AllAddr_vi <0x20>;
19690b57cec5SDimitry Andricdefm GLOBAL_LOAD_UBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x21>;
19700b57cec5SDimitry Andricdefm GLOBAL_LOAD_SBYTE_D16    : FLAT_Real_AllAddr_vi <0x22>;
19710b57cec5SDimitry Andricdefm GLOBAL_LOAD_SBYTE_D16_HI : FLAT_Real_AllAddr_vi <0x23>;
19720b57cec5SDimitry Andricdefm GLOBAL_LOAD_SHORT_D16    : FLAT_Real_AllAddr_vi <0x24>;
19730b57cec5SDimitry Andricdefm GLOBAL_LOAD_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x25>;
19740b57cec5SDimitry Andric
19750b57cec5SDimitry Andricdefm GLOBAL_STORE_BYTE : FLAT_Real_AllAddr_vi <0x18>;
19760b57cec5SDimitry Andricdefm GLOBAL_STORE_BYTE_D16_HI : FLAT_Real_AllAddr_vi <0x19>;
19770b57cec5SDimitry Andricdefm GLOBAL_STORE_SHORT : FLAT_Real_AllAddr_vi <0x1a>;
19780b57cec5SDimitry Andricdefm GLOBAL_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_vi <0x1b>;
19790b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORD : FLAT_Real_AllAddr_vi <0x1c>;
19800b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORDX2 : FLAT_Real_AllAddr_vi <0x1d>;
19810b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORDX3 : FLAT_Real_AllAddr_vi <0x1e>;
19820b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORDX4 : FLAT_Real_AllAddr_vi <0x1f>;
19830b57cec5SDimitry Andric
198481ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_UBYTE  : FLAT_Real_AllAddr_LDS <0x026, 0x10>;
198581ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_SBYTE  : FLAT_Real_AllAddr_LDS <0x027, 0x11>;
198681ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_USHORT : FLAT_Real_AllAddr_LDS <0x028, 0x12>;
198781ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_SSHORT : FLAT_Real_AllAddr_LDS <0x029, 0x13>;
198881ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_DWORD  : FLAT_Real_AllAddr_LDS <0x02a, 0x14>;
19890b57cec5SDimitry Andric
19900b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SWAP       : FLAT_Global_Real_Atomics_vi <0x40>;
19910b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_CMPSWAP    : FLAT_Global_Real_Atomics_vi <0x41>;
19920b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_ADD        : FLAT_Global_Real_Atomics_vi <0x42>;
19930b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SUB        : FLAT_Global_Real_Atomics_vi <0x43>;
19940b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMIN       : FLAT_Global_Real_Atomics_vi <0x44>;
19950b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMIN       : FLAT_Global_Real_Atomics_vi <0x45>;
19960b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMAX       : FLAT_Global_Real_Atomics_vi <0x46>;
19970b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMAX       : FLAT_Global_Real_Atomics_vi <0x47>;
19980b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_AND        : FLAT_Global_Real_Atomics_vi <0x48>;
19990b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_OR         : FLAT_Global_Real_Atomics_vi <0x49>;
20000b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_XOR        : FLAT_Global_Real_Atomics_vi <0x4a>;
20010b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_INC        : FLAT_Global_Real_Atomics_vi <0x4b>;
20020b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_DEC        : FLAT_Global_Real_Atomics_vi <0x4c>;
20030b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SWAP_X2    : FLAT_Global_Real_Atomics_vi <0x60>;
20040b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_CMPSWAP_X2 : FLAT_Global_Real_Atomics_vi <0x61>;
20050b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_ADD_X2     : FLAT_Global_Real_Atomics_vi <0x62>;
20060b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SUB_X2     : FLAT_Global_Real_Atomics_vi <0x63>;
20070b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMIN_X2    : FLAT_Global_Real_Atomics_vi <0x64>;
20080b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMIN_X2    : FLAT_Global_Real_Atomics_vi <0x65>;
20090b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMAX_X2    : FLAT_Global_Real_Atomics_vi <0x66>;
20100b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMAX_X2    : FLAT_Global_Real_Atomics_vi <0x67>;
20110b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_AND_X2     : FLAT_Global_Real_Atomics_vi <0x68>;
20120b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_OR_X2      : FLAT_Global_Real_Atomics_vi <0x69>;
20130b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_XOR_X2     : FLAT_Global_Real_Atomics_vi <0x6a>;
20140b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_INC_X2     : FLAT_Global_Real_Atomics_vi <0x6b>;
20150b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_DEC_X2     : FLAT_Global_Real_Atomics_vi <0x6c>;
20160b57cec5SDimitry Andric
201781ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_UBYTE  : FLAT_Real_AllAddr_SVE_LDS <0x026, 0x10>;
201881ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_SBYTE  : FLAT_Real_AllAddr_SVE_LDS <0x027, 0x11>;
201981ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_USHORT : FLAT_Real_AllAddr_SVE_LDS <0x028, 0x12>;
202081ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_SSHORT : FLAT_Real_AllAddr_SVE_LDS <0x029, 0x13>;
202181ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_DWORD  : FLAT_Real_AllAddr_SVE_LDS <0x02a, 0x14>;
20220b57cec5SDimitry Andric
202381ad6265SDimitry Andricdefm SCRATCH_LOAD_UBYTE         : FLAT_Real_AllAddr_SVE_vi <0x10>;
202481ad6265SDimitry Andricdefm SCRATCH_LOAD_SBYTE         : FLAT_Real_AllAddr_SVE_vi <0x11>;
202581ad6265SDimitry Andricdefm SCRATCH_LOAD_USHORT        : FLAT_Real_AllAddr_SVE_vi <0x12>;
202681ad6265SDimitry Andricdefm SCRATCH_LOAD_SSHORT        : FLAT_Real_AllAddr_SVE_vi <0x13>;
202781ad6265SDimitry Andricdefm SCRATCH_LOAD_DWORD         : FLAT_Real_AllAddr_SVE_vi <0x14>;
202881ad6265SDimitry Andricdefm SCRATCH_LOAD_DWORDX2       : FLAT_Real_AllAddr_SVE_vi <0x15>;
202981ad6265SDimitry Andricdefm SCRATCH_LOAD_DWORDX3       : FLAT_Real_AllAddr_SVE_vi <0x16>;
203081ad6265SDimitry Andricdefm SCRATCH_LOAD_DWORDX4       : FLAT_Real_AllAddr_SVE_vi <0x17>;
203181ad6265SDimitry Andricdefm SCRATCH_STORE_BYTE         : FLAT_Real_AllAddr_SVE_vi <0x18>;
203281ad6265SDimitry Andricdefm SCRATCH_STORE_BYTE_D16_HI  : FLAT_Real_AllAddr_SVE_vi <0x19>;
203381ad6265SDimitry Andricdefm SCRATCH_LOAD_UBYTE_D16     : FLAT_Real_AllAddr_SVE_vi <0x20>;
203481ad6265SDimitry Andricdefm SCRATCH_LOAD_UBYTE_D16_HI  : FLAT_Real_AllAddr_SVE_vi <0x21>;
203581ad6265SDimitry Andricdefm SCRATCH_LOAD_SBYTE_D16     : FLAT_Real_AllAddr_SVE_vi <0x22>;
203681ad6265SDimitry Andricdefm SCRATCH_LOAD_SBYTE_D16_HI  : FLAT_Real_AllAddr_SVE_vi <0x23>;
203781ad6265SDimitry Andricdefm SCRATCH_LOAD_SHORT_D16     : FLAT_Real_AllAddr_SVE_vi <0x24>;
203881ad6265SDimitry Andricdefm SCRATCH_LOAD_SHORT_D16_HI  : FLAT_Real_AllAddr_SVE_vi <0x25>;
203981ad6265SDimitry Andricdefm SCRATCH_STORE_SHORT        : FLAT_Real_AllAddr_SVE_vi <0x1a>;
204081ad6265SDimitry Andricdefm SCRATCH_STORE_SHORT_D16_HI : FLAT_Real_AllAddr_SVE_vi <0x1b>;
204181ad6265SDimitry Andricdefm SCRATCH_STORE_DWORD        : FLAT_Real_AllAddr_SVE_vi <0x1c>;
204281ad6265SDimitry Andricdefm SCRATCH_STORE_DWORDX2      : FLAT_Real_AllAddr_SVE_vi <0x1d>;
204381ad6265SDimitry Andricdefm SCRATCH_STORE_DWORDX3      : FLAT_Real_AllAddr_SVE_vi <0x1e>;
204481ad6265SDimitry Andricdefm SCRATCH_STORE_DWORDX4      : FLAT_Real_AllAddr_SVE_vi <0x1f>;
204581ad6265SDimitry Andric
204681ad6265SDimitry Andriclet SubtargetPredicate = isGFX8GFX9NotGFX940 in {
204781ad6265SDimitry Andric  // These instructions are encoded differently on gfx90* and gfx940.
2048fe6060f1SDimitry Andric  defm GLOBAL_ATOMIC_ADD_F32    : FLAT_Global_Real_Atomics_vi <0x04d, 0>;
2049fe6060f1SDimitry Andric  defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Real_Atomics_vi <0x04e, 0>;
2050fe6060f1SDimitry Andric}
2051fe6060f1SDimitry Andric
2052fe6060f1SDimitry Andriclet SubtargetPredicate = isGFX90AOnly in {
2053*0fca6ea1SDimitry Andric  defm FLAT_ATOMIC_ADD_F64   : FLAT_Real_Atomics_vi<0x4f, 0>;
2054*0fca6ea1SDimitry Andric  defm FLAT_ATOMIC_MIN_F64   : FLAT_Real_Atomics_vi<0x50, 0>;
2055*0fca6ea1SDimitry Andric  defm FLAT_ATOMIC_MAX_F64   : FLAT_Real_Atomics_vi<0x51, 0>;
2056fe6060f1SDimitry Andric  defm GLOBAL_ATOMIC_ADD_F64 : FLAT_Global_Real_Atomics_vi<0x4f, 0>;
2057fe6060f1SDimitry Andric  defm GLOBAL_ATOMIC_MIN_F64 : FLAT_Global_Real_Atomics_vi<0x50, 0>;
2058fe6060f1SDimitry Andric  defm GLOBAL_ATOMIC_MAX_F64 : FLAT_Global_Real_Atomics_vi<0x51, 0>;
2059fe6060f1SDimitry Andric} // End SubtargetPredicate = isGFX90AOnly
20600b57cec5SDimitry Andric
206181ad6265SDimitry Andricmulticlass FLAT_Real_AllAddr_gfx940<bits<7> op> {
206281ad6265SDimitry Andric  def _gfx940       : FLAT_Real_gfx940<op, !cast<FLAT_Pseudo>(NAME)>;
206381ad6265SDimitry Andric  def _SADDR_gfx940 : FLAT_Real_gfx940<op, !cast<FLAT_Pseudo>(NAME#"_SADDR")>;
206481ad6265SDimitry Andric}
206581ad6265SDimitry Andric
2066*0fca6ea1SDimitry Andricmulticlass FLAT_Real_Atomics_gfx940 <bits<7> op> {
2067*0fca6ea1SDimitry Andric  defvar ps = !cast<FLAT_Pseudo>(NAME);
206881ad6265SDimitry Andric  def _gfx940     : FLAT_Real_gfx940<op, !cast<FLAT_Pseudo>(ps.PseudoInstr)>;
206981ad6265SDimitry Andric  def _RTN_gfx940 : FLAT_Real_gfx940<op, !cast<FLAT_Pseudo>(ps.PseudoInstr # "_RTN")>;
207081ad6265SDimitry Andric}
207181ad6265SDimitry Andric
207281ad6265SDimitry Andricmulticlass FLAT_Global_Real_Atomics_gfx940<bits<7> op> :
207381ad6265SDimitry Andric  FLAT_Real_AllAddr_gfx940<op> {
207481ad6265SDimitry Andric  def _RTN_gfx940       : FLAT_Real_gfx940 <op, !cast<FLAT_Pseudo>(NAME#"_RTN")>;
207581ad6265SDimitry Andric  def _SADDR_RTN_gfx940 : FLAT_Real_gfx940 <op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN")>;
207681ad6265SDimitry Andric}
207781ad6265SDimitry Andric
207881ad6265SDimitry Andriclet SubtargetPredicate = isGFX940Plus in {
207981ad6265SDimitry Andric  // These instructions are encoded differently on gfx90* and gfx940.
208081ad6265SDimitry Andric  defm GLOBAL_ATOMIC_ADD_F32     : FLAT_Global_Real_Atomics_gfx940 <0x04d>;
208181ad6265SDimitry Andric  defm GLOBAL_ATOMIC_PK_ADD_F16  : FLAT_Global_Real_Atomics_gfx940 <0x04e>;
208281ad6265SDimitry Andric
2083*0fca6ea1SDimitry Andric  defm FLAT_ATOMIC_ADD_F64       : FLAT_Real_Atomics_gfx940<0x4f>;
2084*0fca6ea1SDimitry Andric  defm FLAT_ATOMIC_MIN_F64       : FLAT_Real_Atomics_gfx940<0x50>;
2085*0fca6ea1SDimitry Andric  defm FLAT_ATOMIC_MAX_F64       : FLAT_Real_Atomics_gfx940<0x51>;
208681ad6265SDimitry Andric  defm GLOBAL_ATOMIC_ADD_F64     : FLAT_Global_Real_Atomics_gfx940<0x4f>;
208781ad6265SDimitry Andric  defm GLOBAL_ATOMIC_MIN_F64     : FLAT_Global_Real_Atomics_gfx940<0x50>;
208881ad6265SDimitry Andric  defm GLOBAL_ATOMIC_MAX_F64     : FLAT_Global_Real_Atomics_gfx940<0x51>;
2089*0fca6ea1SDimitry Andric  defm FLAT_ATOMIC_ADD_F32       : FLAT_Real_Atomics_vi<0x4d>;
2090*0fca6ea1SDimitry Andric  defm FLAT_ATOMIC_PK_ADD_F16    : FLAT_Real_Atomics_vi<0x4e>;
2091*0fca6ea1SDimitry Andric  defm FLAT_ATOMIC_PK_ADD_BF16   : FLAT_Real_Atomics_vi<0x52>;
209281ad6265SDimitry Andric  defm GLOBAL_ATOMIC_PK_ADD_BF16 : FLAT_Global_Real_Atomics_vi<0x52>;
209381ad6265SDimitry Andric} // End SubtargetPredicate = isGFX940Plus
209481ad6265SDimitry Andric
20950b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
20960b57cec5SDimitry Andric// GFX10.
20970b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
20980b57cec5SDimitry Andric
2099*0fca6ea1SDimitry Andricclass FLAT_Real_gfx10<bits<7> op, FLAT_Pseudo ps, string opName = ps.Mnemonic> :
2100*0fca6ea1SDimitry Andric    FLAT_Real<op, ps, opName>, SIMCInstr<ps.PseudoInstr, SIEncodingFamily.GFX10> {
210181ad6265SDimitry Andric  let AssemblerPredicate = isGFX10Only;
21020b57cec5SDimitry Andric  let DecoderNamespace = "GFX10";
21030b57cec5SDimitry Andric
21048bcb0991SDimitry Andric  let Inst{11-0}  = offset{11-0};
2105fe6060f1SDimitry Andric  let Inst{12}    = !if(ps.has_dlc, cpol{CPolBit.DLC}, ps.dlcValue);
2106*0fca6ea1SDimitry Andric  let Inst{54-48} = !cond(ps.enabled_saddr : saddr,
2107*0fca6ea1SDimitry Andric                          !and(ps.is_flat_scratch, !not(ps.has_vaddr)) : EXEC_HI.Index{6-0}, // ST mode
2108*0fca6ea1SDimitry Andric                          true : SGPR_NULL_gfxpre11.Index{6-0});
21090b57cec5SDimitry Andric  let Inst{55}    = 0;
21100b57cec5SDimitry Andric}
21110b57cec5SDimitry Andric
2112*0fca6ea1SDimitry Andricmulticlass FLAT_Real_Base_gfx10<bits<7> op, string psName = NAME,
2113*0fca6ea1SDimitry Andric                                string asmName = !cast<FLAT_Pseudo>(psName).Mnemonic> {
21140b57cec5SDimitry Andric  def _gfx10 :
2115*0fca6ea1SDimitry Andric    FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(psName), asmName>;
21160b57cec5SDimitry Andric}
21170b57cec5SDimitry Andric
2118*0fca6ea1SDimitry Andricmulticlass FLAT_Real_RTN_gfx10<bits<7> op, string psName = NAME,
2119*0fca6ea1SDimitry Andric                               string asmName = !cast<FLAT_Pseudo>(psName).Mnemonic> {
21200b57cec5SDimitry Andric  def _RTN_gfx10 :
2121*0fca6ea1SDimitry Andric    FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(psName#"_RTN"), asmName>;
21220b57cec5SDimitry Andric}
21230b57cec5SDimitry Andric
2124*0fca6ea1SDimitry Andricmulticlass FLAT_Real_SADDR_gfx10<bits<7> op, string psName = NAME,
2125*0fca6ea1SDimitry Andric                                 string asmName = !cast<FLAT_Pseudo>(psName#"_SADDR").Mnemonic> {
21260b57cec5SDimitry Andric  def _SADDR_gfx10 :
2127*0fca6ea1SDimitry Andric    FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(psName#"_SADDR"), asmName>;
21280b57cec5SDimitry Andric}
21290b57cec5SDimitry Andric
2130*0fca6ea1SDimitry Andricmulticlass FLAT_Real_SADDR_RTN_gfx10<bits<7> op, string psName = NAME,
2131*0fca6ea1SDimitry Andric                                     string asmName = !cast<FLAT_Pseudo>(psName#"_SADDR_RTN").Mnemonic> {
21320b57cec5SDimitry Andric  def _SADDR_RTN_gfx10 :
2133*0fca6ea1SDimitry Andric    FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(psName#"_SADDR_RTN"), asmName>;
21340b57cec5SDimitry Andric}
21350b57cec5SDimitry Andric
2136e8d8bef9SDimitry Andricmulticlass FLAT_Real_ST_gfx10<bits<7> op> {
2137e8d8bef9SDimitry Andric  def _ST_gfx10 :
2138*0fca6ea1SDimitry Andric    FLAT_Real_gfx10<op, !cast<FLAT_Pseudo>(NAME#"_ST")>;
2139e8d8bef9SDimitry Andric}
21400b57cec5SDimitry Andric
2141*0fca6ea1SDimitry Andricmulticlass FLAT_Real_AllAddr_gfx10<bits<7> op, string OpName = NAME,
2142*0fca6ea1SDimitry Andric                                   string asmName = !cast<FLAT_Pseudo>(OpName).Mnemonic> :
2143*0fca6ea1SDimitry Andric  FLAT_Real_Base_gfx10<op, OpName, asmName>,
2144*0fca6ea1SDimitry Andric  FLAT_Real_SADDR_gfx10<op, OpName, asmName>;
21450b57cec5SDimitry Andric
2146*0fca6ea1SDimitry Andricmulticlass FLAT_Real_Atomics_gfx10<bits<7> op, string OpName = NAME,
2147*0fca6ea1SDimitry Andric                                   string asmName = !cast<FLAT_Pseudo>(OpName).Mnemonic> :
2148*0fca6ea1SDimitry Andric  FLAT_Real_Base_gfx10<op, OpName, asmName>,
2149*0fca6ea1SDimitry Andric  FLAT_Real_RTN_gfx10<op, OpName, asmName>;
21500b57cec5SDimitry Andric
2151*0fca6ea1SDimitry Andricmulticlass FLAT_Real_GlblAtomics_gfx10<bits<7> op, string OpName = NAME,
2152*0fca6ea1SDimitry Andric                                       string asmName = !cast<FLAT_Pseudo>(OpName).Mnemonic> :
2153*0fca6ea1SDimitry Andric  FLAT_Real_AllAddr_gfx10<op, OpName, asmName>,
2154*0fca6ea1SDimitry Andric  FLAT_Real_RTN_gfx10<op, OpName, asmName>,
2155*0fca6ea1SDimitry Andric  FLAT_Real_SADDR_RTN_gfx10<op, OpName, asmName>;
21560b57cec5SDimitry Andric
2157*0fca6ea1SDimitry Andricmulticlass FLAT_Real_GlblAtomics_RTN_gfx10<bits<7> op, string OpName = NAME> :
2158*0fca6ea1SDimitry Andric  FLAT_Real_RTN_gfx10<op, OpName>,
2159*0fca6ea1SDimitry Andric  FLAT_Real_SADDR_RTN_gfx10<op, OpName>;
21600b57cec5SDimitry Andric
2161e8d8bef9SDimitry Andricmulticlass FLAT_Real_ScratchAllAddr_gfx10<bits<7> op> :
2162e8d8bef9SDimitry Andric  FLAT_Real_Base_gfx10<op>,
2163e8d8bef9SDimitry Andric  FLAT_Real_SADDR_gfx10<op>,
2164e8d8bef9SDimitry Andric  FLAT_Real_ST_gfx10<op>;
2165e8d8bef9SDimitry Andric
216681ad6265SDimitry Andricmulticlass FLAT_Real_AllAddr_LDS_gfx10<bits<7> op,
2167*0fca6ea1SDimitry Andric  string opname = !subst("_lds", "", !cast<FLAT_Pseudo>(NAME).Mnemonic)> {
216881ad6265SDimitry Andric  let AsmString = opname # !cast<FLAT_Pseudo>(NAME).AsmOperands # " lds" in
216981ad6265SDimitry Andric  defm "" : FLAT_Real_Base_gfx10<op>;
217081ad6265SDimitry Andric
217181ad6265SDimitry Andric  let AsmString = opname # !cast<FLAT_Pseudo>(NAME#"_SADDR").AsmOperands # " lds" in
217281ad6265SDimitry Andric  defm "" : FLAT_Real_SADDR_gfx10<op>;
217381ad6265SDimitry Andric}
217481ad6265SDimitry Andric
217581ad6265SDimitry Andricmulticlass FLAT_Real_ScratchAllAddr_LDS_gfx10<bits<7> op,
2176*0fca6ea1SDimitry Andric  string opname = !subst("_lds", "", !cast<FLAT_Pseudo>(NAME).Mnemonic)> {
217781ad6265SDimitry Andric  defm "" : FLAT_Real_AllAddr_LDS_gfx10<op>;
217881ad6265SDimitry Andric
217981ad6265SDimitry Andric  let AsmString = opname # !cast<FLAT_Pseudo>(NAME#"_ST").AsmOperands # " lds" in
218081ad6265SDimitry Andric  defm "" : FLAT_Real_ST_gfx10<op>;
218181ad6265SDimitry Andric}
218281ad6265SDimitry Andric
21830b57cec5SDimitry Andric// ENC_FLAT.
21840b57cec5SDimitry Andricdefm FLAT_LOAD_UBYTE            : FLAT_Real_Base_gfx10<0x008>;
21850b57cec5SDimitry Andricdefm FLAT_LOAD_SBYTE            : FLAT_Real_Base_gfx10<0x009>;
21860b57cec5SDimitry Andricdefm FLAT_LOAD_USHORT           : FLAT_Real_Base_gfx10<0x00a>;
21870b57cec5SDimitry Andricdefm FLAT_LOAD_SSHORT           : FLAT_Real_Base_gfx10<0x00b>;
21880b57cec5SDimitry Andricdefm FLAT_LOAD_DWORD            : FLAT_Real_Base_gfx10<0x00c>;
21890b57cec5SDimitry Andricdefm FLAT_LOAD_DWORDX2          : FLAT_Real_Base_gfx10<0x00d>;
21900b57cec5SDimitry Andricdefm FLAT_LOAD_DWORDX4          : FLAT_Real_Base_gfx10<0x00e>;
21910b57cec5SDimitry Andricdefm FLAT_LOAD_DWORDX3          : FLAT_Real_Base_gfx10<0x00f>;
21920b57cec5SDimitry Andricdefm FLAT_STORE_BYTE            : FLAT_Real_Base_gfx10<0x018>;
21930b57cec5SDimitry Andricdefm FLAT_STORE_BYTE_D16_HI     : FLAT_Real_Base_gfx10<0x019>;
21940b57cec5SDimitry Andricdefm FLAT_STORE_SHORT           : FLAT_Real_Base_gfx10<0x01a>;
21950b57cec5SDimitry Andricdefm FLAT_STORE_SHORT_D16_HI    : FLAT_Real_Base_gfx10<0x01b>;
21960b57cec5SDimitry Andricdefm FLAT_STORE_DWORD           : FLAT_Real_Base_gfx10<0x01c>;
21970b57cec5SDimitry Andricdefm FLAT_STORE_DWORDX2         : FLAT_Real_Base_gfx10<0x01d>;
21980b57cec5SDimitry Andricdefm FLAT_STORE_DWORDX4         : FLAT_Real_Base_gfx10<0x01e>;
21990b57cec5SDimitry Andricdefm FLAT_STORE_DWORDX3         : FLAT_Real_Base_gfx10<0x01f>;
22000b57cec5SDimitry Andricdefm FLAT_LOAD_UBYTE_D16        : FLAT_Real_Base_gfx10<0x020>;
22010b57cec5SDimitry Andricdefm FLAT_LOAD_UBYTE_D16_HI     : FLAT_Real_Base_gfx10<0x021>;
22020b57cec5SDimitry Andricdefm FLAT_LOAD_SBYTE_D16        : FLAT_Real_Base_gfx10<0x022>;
22030b57cec5SDimitry Andricdefm FLAT_LOAD_SBYTE_D16_HI     : FLAT_Real_Base_gfx10<0x023>;
22040b57cec5SDimitry Andricdefm FLAT_LOAD_SHORT_D16        : FLAT_Real_Base_gfx10<0x024>;
22050b57cec5SDimitry Andricdefm FLAT_LOAD_SHORT_D16_HI     : FLAT_Real_Base_gfx10<0x025>;
22060b57cec5SDimitry Andricdefm FLAT_ATOMIC_SWAP           : FLAT_Real_Atomics_gfx10<0x030>;
22070b57cec5SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP        : FLAT_Real_Atomics_gfx10<0x031>;
22080b57cec5SDimitry Andricdefm FLAT_ATOMIC_ADD            : FLAT_Real_Atomics_gfx10<0x032>;
22090b57cec5SDimitry Andricdefm FLAT_ATOMIC_SUB            : FLAT_Real_Atomics_gfx10<0x033>;
22100b57cec5SDimitry Andricdefm FLAT_ATOMIC_SMIN           : FLAT_Real_Atomics_gfx10<0x035>;
22110b57cec5SDimitry Andricdefm FLAT_ATOMIC_UMIN           : FLAT_Real_Atomics_gfx10<0x036>;
22120b57cec5SDimitry Andricdefm FLAT_ATOMIC_SMAX           : FLAT_Real_Atomics_gfx10<0x037>;
22130b57cec5SDimitry Andricdefm FLAT_ATOMIC_UMAX           : FLAT_Real_Atomics_gfx10<0x038>;
22140b57cec5SDimitry Andricdefm FLAT_ATOMIC_AND            : FLAT_Real_Atomics_gfx10<0x039>;
22150b57cec5SDimitry Andricdefm FLAT_ATOMIC_OR             : FLAT_Real_Atomics_gfx10<0x03a>;
22160b57cec5SDimitry Andricdefm FLAT_ATOMIC_XOR            : FLAT_Real_Atomics_gfx10<0x03b>;
22170b57cec5SDimitry Andricdefm FLAT_ATOMIC_INC            : FLAT_Real_Atomics_gfx10<0x03c>;
22180b57cec5SDimitry Andricdefm FLAT_ATOMIC_DEC            : FLAT_Real_Atomics_gfx10<0x03d>;
22190b57cec5SDimitry Andricdefm FLAT_ATOMIC_FCMPSWAP       : FLAT_Real_Atomics_gfx10<0x03e>;
22200b57cec5SDimitry Andricdefm FLAT_ATOMIC_FMIN           : FLAT_Real_Atomics_gfx10<0x03f>;
22210b57cec5SDimitry Andricdefm FLAT_ATOMIC_FMAX           : FLAT_Real_Atomics_gfx10<0x040>;
22220b57cec5SDimitry Andricdefm FLAT_ATOMIC_SWAP_X2        : FLAT_Real_Atomics_gfx10<0x050>;
22230b57cec5SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP_X2     : FLAT_Real_Atomics_gfx10<0x051>;
22240b57cec5SDimitry Andricdefm FLAT_ATOMIC_ADD_X2         : FLAT_Real_Atomics_gfx10<0x052>;
22250b57cec5SDimitry Andricdefm FLAT_ATOMIC_SUB_X2         : FLAT_Real_Atomics_gfx10<0x053>;
22260b57cec5SDimitry Andricdefm FLAT_ATOMIC_SMIN_X2        : FLAT_Real_Atomics_gfx10<0x055>;
22270b57cec5SDimitry Andricdefm FLAT_ATOMIC_UMIN_X2        : FLAT_Real_Atomics_gfx10<0x056>;
22280b57cec5SDimitry Andricdefm FLAT_ATOMIC_SMAX_X2        : FLAT_Real_Atomics_gfx10<0x057>;
22290b57cec5SDimitry Andricdefm FLAT_ATOMIC_UMAX_X2        : FLAT_Real_Atomics_gfx10<0x058>;
22300b57cec5SDimitry Andricdefm FLAT_ATOMIC_AND_X2         : FLAT_Real_Atomics_gfx10<0x059>;
22310b57cec5SDimitry Andricdefm FLAT_ATOMIC_OR_X2          : FLAT_Real_Atomics_gfx10<0x05a>;
22320b57cec5SDimitry Andricdefm FLAT_ATOMIC_XOR_X2         : FLAT_Real_Atomics_gfx10<0x05b>;
22330b57cec5SDimitry Andricdefm FLAT_ATOMIC_INC_X2         : FLAT_Real_Atomics_gfx10<0x05c>;
22340b57cec5SDimitry Andricdefm FLAT_ATOMIC_DEC_X2         : FLAT_Real_Atomics_gfx10<0x05d>;
22350b57cec5SDimitry Andricdefm FLAT_ATOMIC_FCMPSWAP_X2    : FLAT_Real_Atomics_gfx10<0x05e>;
2236*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FMIN_X2        : FLAT_Real_Atomics_gfx10<0x05f, "FLAT_ATOMIC_MIN_F64", "flat_atomic_fmin_x2">;
2237*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FMAX_X2        : FLAT_Real_Atomics_gfx10<0x060, "FLAT_ATOMIC_MAX_F64", "flat_atomic_fmax_x2">;
22380b57cec5SDimitry Andric
22390b57cec5SDimitry Andric
22400b57cec5SDimitry Andric// ENC_FLAT_GLBL.
22410b57cec5SDimitry Andricdefm GLOBAL_LOAD_UBYTE          : FLAT_Real_AllAddr_gfx10<0x008>;
22420b57cec5SDimitry Andricdefm GLOBAL_LOAD_SBYTE          : FLAT_Real_AllAddr_gfx10<0x009>;
22430b57cec5SDimitry Andricdefm GLOBAL_LOAD_USHORT         : FLAT_Real_AllAddr_gfx10<0x00a>;
22440b57cec5SDimitry Andricdefm GLOBAL_LOAD_SSHORT         : FLAT_Real_AllAddr_gfx10<0x00b>;
22450b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORD          : FLAT_Real_AllAddr_gfx10<0x00c>;
22460b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORDX2        : FLAT_Real_AllAddr_gfx10<0x00d>;
22470b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORDX4        : FLAT_Real_AllAddr_gfx10<0x00e>;
22480b57cec5SDimitry Andricdefm GLOBAL_LOAD_DWORDX3        : FLAT_Real_AllAddr_gfx10<0x00f>;
22490b57cec5SDimitry Andricdefm GLOBAL_STORE_BYTE          : FLAT_Real_AllAddr_gfx10<0x018>;
22500b57cec5SDimitry Andricdefm GLOBAL_STORE_BYTE_D16_HI   : FLAT_Real_AllAddr_gfx10<0x019>;
22510b57cec5SDimitry Andricdefm GLOBAL_STORE_SHORT         : FLAT_Real_AllAddr_gfx10<0x01a>;
22520b57cec5SDimitry Andricdefm GLOBAL_STORE_SHORT_D16_HI  : FLAT_Real_AllAddr_gfx10<0x01b>;
22530b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORD         : FLAT_Real_AllAddr_gfx10<0x01c>;
22540b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORDX2       : FLAT_Real_AllAddr_gfx10<0x01d>;
22550b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORDX4       : FLAT_Real_AllAddr_gfx10<0x01e>;
22560b57cec5SDimitry Andricdefm GLOBAL_STORE_DWORDX3       : FLAT_Real_AllAddr_gfx10<0x01f>;
22570b57cec5SDimitry Andricdefm GLOBAL_LOAD_UBYTE_D16      : FLAT_Real_AllAddr_gfx10<0x020>;
22580b57cec5SDimitry Andricdefm GLOBAL_LOAD_UBYTE_D16_HI   : FLAT_Real_AllAddr_gfx10<0x021>;
22590b57cec5SDimitry Andricdefm GLOBAL_LOAD_SBYTE_D16      : FLAT_Real_AllAddr_gfx10<0x022>;
22600b57cec5SDimitry Andricdefm GLOBAL_LOAD_SBYTE_D16_HI   : FLAT_Real_AllAddr_gfx10<0x023>;
22610b57cec5SDimitry Andricdefm GLOBAL_LOAD_SHORT_D16      : FLAT_Real_AllAddr_gfx10<0x024>;
22620b57cec5SDimitry Andricdefm GLOBAL_LOAD_SHORT_D16_HI   : FLAT_Real_AllAddr_gfx10<0x025>;
22630b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SWAP         : FLAT_Real_GlblAtomics_gfx10<0x030>;
22640b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_CMPSWAP      : FLAT_Real_GlblAtomics_gfx10<0x031>;
22650b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_ADD          : FLAT_Real_GlblAtomics_gfx10<0x032>;
22660b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SUB          : FLAT_Real_GlblAtomics_gfx10<0x033>;
22675f757f3fSDimitry Andricdefm GLOBAL_ATOMIC_CSUB         : FLAT_Real_GlblAtomics_gfx10<0x034>;
22680b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMIN         : FLAT_Real_GlblAtomics_gfx10<0x035>;
22690b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMIN         : FLAT_Real_GlblAtomics_gfx10<0x036>;
22700b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMAX         : FLAT_Real_GlblAtomics_gfx10<0x037>;
22710b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMAX         : FLAT_Real_GlblAtomics_gfx10<0x038>;
22720b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_AND          : FLAT_Real_GlblAtomics_gfx10<0x039>;
22730b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_OR           : FLAT_Real_GlblAtomics_gfx10<0x03a>;
22740b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_XOR          : FLAT_Real_GlblAtomics_gfx10<0x03b>;
22750b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_INC          : FLAT_Real_GlblAtomics_gfx10<0x03c>;
22760b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_DEC          : FLAT_Real_GlblAtomics_gfx10<0x03d>;
22770b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_FCMPSWAP     : FLAT_Real_GlblAtomics_gfx10<0x03e>;
22780b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_FMIN         : FLAT_Real_GlblAtomics_gfx10<0x03f>;
22790b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_FMAX         : FLAT_Real_GlblAtomics_gfx10<0x040>;
22800b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SWAP_X2      : FLAT_Real_GlblAtomics_gfx10<0x050>;
22810b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_CMPSWAP_X2   : FLAT_Real_GlblAtomics_gfx10<0x051>;
22820b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_ADD_X2       : FLAT_Real_GlblAtomics_gfx10<0x052>;
22830b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SUB_X2       : FLAT_Real_GlblAtomics_gfx10<0x053>;
22840b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMIN_X2      : FLAT_Real_GlblAtomics_gfx10<0x055>;
22850b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMIN_X2      : FLAT_Real_GlblAtomics_gfx10<0x056>;
22860b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_SMAX_X2      : FLAT_Real_GlblAtomics_gfx10<0x057>;
22870b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_UMAX_X2      : FLAT_Real_GlblAtomics_gfx10<0x058>;
22880b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_AND_X2       : FLAT_Real_GlblAtomics_gfx10<0x059>;
22890b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_OR_X2        : FLAT_Real_GlblAtomics_gfx10<0x05a>;
22900b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_XOR_X2       : FLAT_Real_GlblAtomics_gfx10<0x05b>;
22910b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_INC_X2       : FLAT_Real_GlblAtomics_gfx10<0x05c>;
22920b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_DEC_X2       : FLAT_Real_GlblAtomics_gfx10<0x05d>;
22930b57cec5SDimitry Andricdefm GLOBAL_ATOMIC_FCMPSWAP_X2  : FLAT_Real_GlblAtomics_gfx10<0x05e>;
2294*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_FMIN_X2      : FLAT_Real_GlblAtomics_gfx10<0x05f, "GLOBAL_ATOMIC_MIN_F64", "global_atomic_fmin_x2">;
2295*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_FMAX_X2      : FLAT_Real_GlblAtomics_gfx10<0x060, "GLOBAL_ATOMIC_MAX_F64", "global_atomic_fmax_x2">;
2296e8d8bef9SDimitry Andricdefm GLOBAL_LOAD_DWORD_ADDTID   : FLAT_Real_AllAddr_gfx10<0x016>;
2297e8d8bef9SDimitry Andricdefm GLOBAL_STORE_DWORD_ADDTID  : FLAT_Real_AllAddr_gfx10<0x017>;
22980b57cec5SDimitry Andric
229981ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_UBYTE      : FLAT_Real_AllAddr_LDS_gfx10 <0x008>;
230081ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_SBYTE      : FLAT_Real_AllAddr_LDS_gfx10 <0x009>;
230181ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_USHORT     : FLAT_Real_AllAddr_LDS_gfx10 <0x00a>;
230281ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_SSHORT     : FLAT_Real_AllAddr_LDS_gfx10 <0x00b>;
230381ad6265SDimitry Andricdefm GLOBAL_LOAD_LDS_DWORD      : FLAT_Real_AllAddr_LDS_gfx10 <0x00c>;
230481ad6265SDimitry Andric
23050b57cec5SDimitry Andric// ENC_FLAT_SCRATCH.
2306e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_UBYTE         : FLAT_Real_ScratchAllAddr_gfx10<0x008>;
2307e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_SBYTE         : FLAT_Real_ScratchAllAddr_gfx10<0x009>;
2308e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_USHORT        : FLAT_Real_ScratchAllAddr_gfx10<0x00a>;
2309e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_SSHORT        : FLAT_Real_ScratchAllAddr_gfx10<0x00b>;
2310e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_DWORD         : FLAT_Real_ScratchAllAddr_gfx10<0x00c>;
2311e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_DWORDX2       : FLAT_Real_ScratchAllAddr_gfx10<0x00d>;
2312e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_DWORDX4       : FLAT_Real_ScratchAllAddr_gfx10<0x00e>;
2313e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_DWORDX3       : FLAT_Real_ScratchAllAddr_gfx10<0x00f>;
2314e8d8bef9SDimitry Andricdefm SCRATCH_STORE_BYTE         : FLAT_Real_ScratchAllAddr_gfx10<0x018>;
2315e8d8bef9SDimitry Andricdefm SCRATCH_STORE_BYTE_D16_HI  : FLAT_Real_ScratchAllAddr_gfx10<0x019>;
2316e8d8bef9SDimitry Andricdefm SCRATCH_STORE_SHORT        : FLAT_Real_ScratchAllAddr_gfx10<0x01a>;
2317e8d8bef9SDimitry Andricdefm SCRATCH_STORE_SHORT_D16_HI : FLAT_Real_ScratchAllAddr_gfx10<0x01b>;
2318e8d8bef9SDimitry Andricdefm SCRATCH_STORE_DWORD        : FLAT_Real_ScratchAllAddr_gfx10<0x01c>;
2319e8d8bef9SDimitry Andricdefm SCRATCH_STORE_DWORDX2      : FLAT_Real_ScratchAllAddr_gfx10<0x01d>;
2320e8d8bef9SDimitry Andricdefm SCRATCH_STORE_DWORDX4      : FLAT_Real_ScratchAllAddr_gfx10<0x01e>;
2321e8d8bef9SDimitry Andricdefm SCRATCH_STORE_DWORDX3      : FLAT_Real_ScratchAllAddr_gfx10<0x01f>;
2322e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_UBYTE_D16     : FLAT_Real_ScratchAllAddr_gfx10<0x020>;
2323e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_UBYTE_D16_HI  : FLAT_Real_ScratchAllAddr_gfx10<0x021>;
2324e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_SBYTE_D16     : FLAT_Real_ScratchAllAddr_gfx10<0x022>;
2325e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_SBYTE_D16_HI  : FLAT_Real_ScratchAllAddr_gfx10<0x023>;
2326e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_SHORT_D16     : FLAT_Real_ScratchAllAddr_gfx10<0x024>;
2327e8d8bef9SDimitry Andricdefm SCRATCH_LOAD_SHORT_D16_HI  : FLAT_Real_ScratchAllAddr_gfx10<0x025>;
232881ad6265SDimitry Andric
232981ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_UBYTE     : FLAT_Real_ScratchAllAddr_LDS_gfx10 <0x008>;
233081ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_SBYTE     : FLAT_Real_ScratchAllAddr_LDS_gfx10 <0x009>;
233181ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_USHORT    : FLAT_Real_ScratchAllAddr_LDS_gfx10 <0x00a>;
233281ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_SSHORT    : FLAT_Real_ScratchAllAddr_LDS_gfx10 <0x00b>;
233381ad6265SDimitry Andricdefm SCRATCH_LOAD_LDS_DWORD     : FLAT_Real_ScratchAllAddr_LDS_gfx10 <0x00c>;
233481ad6265SDimitry Andric
233581ad6265SDimitry Andric//===----------------------------------------------------------------------===//
233681ad6265SDimitry Andric// GFX11
233781ad6265SDimitry Andric//===----------------------------------------------------------------------===//
233881ad6265SDimitry Andric
2339*0fca6ea1SDimitry Andricclass get_FLAT_ps<string name> {
2340*0fca6ea1SDimitry Andric  string Mnemonic = !cast<FLAT_Pseudo>(name).Mnemonic;
2341*0fca6ea1SDimitry Andric}
2342*0fca6ea1SDimitry Andric
2343*0fca6ea1SDimitry Andricmulticlass FLAT_Real_gfx11 <bits<7> op,
2344*0fca6ea1SDimitry Andric                            string name = get_FLAT_ps<NAME>.Mnemonic> {
2345*0fca6ea1SDimitry Andric  defvar ps = !cast<FLAT_Pseudo>(NAME);
2346*0fca6ea1SDimitry Andric  def _gfx11 : FLAT_Real <op, ps, name>,
234781ad6265SDimitry Andric               SIMCInstr <ps.PseudoInstr, SIEncodingFamily.GFX11> {
23485f757f3fSDimitry Andric    let AssemblerPredicate = isGFX11Only;
234981ad6265SDimitry Andric    let DecoderNamespace = "GFX11";
235081ad6265SDimitry Andric
235181ad6265SDimitry Andric    let Inst{13}    = !if(ps.has_dlc, cpol{CPolBit.DLC}, ps.dlcValue);
235281ad6265SDimitry Andric    let Inst{14}    = !if(ps.has_glc, cpol{CPolBit.GLC}, ps.glcValue);
235381ad6265SDimitry Andric    let Inst{15}    = cpol{CPolBit.SLC};
235481ad6265SDimitry Andric    let Inst{17-16} = seg;
2355*0fca6ea1SDimitry Andric    let Inst{54-48} = !if(ps.enabled_saddr, saddr, SGPR_NULL_gfx11plus.Index);
235681ad6265SDimitry Andric    let Inst{55}    = ps.sve;
235781ad6265SDimitry Andric  }
235806c3fb27SDimitry Andric}
235906c3fb27SDimitry Andric
2360*0fca6ea1SDimitry Andricmulticlass FLAT_Aliases_gfx11<string name> {
2361*0fca6ea1SDimitry Andric  defvar ps = get_FLAT_ps<NAME>;
2362*0fca6ea1SDimitry Andric  if !ne(ps.Mnemonic, name) then
2363*0fca6ea1SDimitry Andric    def : AMDGPUMnemonicAlias<ps.Mnemonic, name> {
2364*0fca6ea1SDimitry Andric      let AssemblerPredicate = isGFX11Only;
236581ad6265SDimitry Andric    }
236681ad6265SDimitry Andric}
236781ad6265SDimitry Andric
2368*0fca6ea1SDimitry Andricmulticlass FLAT_Real_Base_gfx11<bits<7> op,
2369*0fca6ea1SDimitry Andric                                string name = get_FLAT_ps<NAME>.Mnemonic> :
2370*0fca6ea1SDimitry Andric  FLAT_Aliases_gfx11<name>,
2371*0fca6ea1SDimitry Andric  FLAT_Real_gfx11<op, name>;
2372*0fca6ea1SDimitry Andric
2373*0fca6ea1SDimitry Andricmulticlass FLAT_Real_Atomics_gfx11<bits<7> op,
2374*0fca6ea1SDimitry Andric                                   string name = get_FLAT_ps<NAME>.Mnemonic> :
2375*0fca6ea1SDimitry Andric  FLAT_Real_Base_gfx11<op, name> {
2376*0fca6ea1SDimitry Andric  defm _RTN : FLAT_Real_gfx11<op, name>;
237781ad6265SDimitry Andric}
237881ad6265SDimitry Andric
2379*0fca6ea1SDimitry Andricmulticlass GLOBAL_Real_AllAddr_gfx11<bits<7> op,
2380*0fca6ea1SDimitry Andric                                     string name = get_FLAT_ps<NAME>.Mnemonic> :
2381*0fca6ea1SDimitry Andric  FLAT_Real_Base_gfx11<op, name> {
2382*0fca6ea1SDimitry Andric  defm _SADDR : FLAT_Real_gfx11<op, name>;
238381ad6265SDimitry Andric}
238481ad6265SDimitry Andric
2385*0fca6ea1SDimitry Andricmulticlass GLOBAL_Real_Atomics_gfx11<bits<7> op,
2386*0fca6ea1SDimitry Andric                                     string name = get_FLAT_ps<NAME>.Mnemonic> :
2387*0fca6ea1SDimitry Andric  GLOBAL_Real_AllAddr_gfx11<op, name> {
2388*0fca6ea1SDimitry Andric  defm _RTN : FLAT_Real_gfx11<op, name>;
2389*0fca6ea1SDimitry Andric  defm _SADDR_RTN : FLAT_Real_gfx11<op, name>;
239081ad6265SDimitry Andric}
239181ad6265SDimitry Andric
2392*0fca6ea1SDimitry Andricmulticlass SCRATCH_Real_AllAddr_gfx11<bits<7> op,
2393*0fca6ea1SDimitry Andric                                     string name = get_FLAT_ps<NAME>.Mnemonic> :
2394*0fca6ea1SDimitry Andric  FLAT_Real_Base_gfx11<op, name> {
2395*0fca6ea1SDimitry Andric  defm _SADDR : FLAT_Real_gfx11<op, name>;
2396*0fca6ea1SDimitry Andric  defm _ST : FLAT_Real_gfx11<op, name>;
2397*0fca6ea1SDimitry Andric  defm _SVS : FLAT_Real_gfx11<op, name>;
239881ad6265SDimitry Andric}
239981ad6265SDimitry Andric
240081ad6265SDimitry Andric// ENC_FLAT.
2401*0fca6ea1SDimitry Andricdefm FLAT_LOAD_UBYTE            : FLAT_Real_Base_gfx11<0x010, "flat_load_u8">;
2402*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SBYTE            : FLAT_Real_Base_gfx11<0x011, "flat_load_i8">;
2403*0fca6ea1SDimitry Andricdefm FLAT_LOAD_USHORT           : FLAT_Real_Base_gfx11<0x012, "flat_load_u16">;
2404*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SSHORT           : FLAT_Real_Base_gfx11<0x013, "flat_load_i16">;
2405*0fca6ea1SDimitry Andricdefm FLAT_LOAD_DWORD            : FLAT_Real_Base_gfx11<0x014, "flat_load_b32">;
2406*0fca6ea1SDimitry Andricdefm FLAT_LOAD_DWORDX2          : FLAT_Real_Base_gfx11<0x015, "flat_load_b64">;
2407*0fca6ea1SDimitry Andricdefm FLAT_LOAD_DWORDX3          : FLAT_Real_Base_gfx11<0x016, "flat_load_b96">;
2408*0fca6ea1SDimitry Andricdefm FLAT_LOAD_DWORDX4          : FLAT_Real_Base_gfx11<0x017, "flat_load_b128">;
2409*0fca6ea1SDimitry Andricdefm FLAT_STORE_BYTE            : FLAT_Real_Base_gfx11<0x018, "flat_store_b8">;
2410*0fca6ea1SDimitry Andricdefm FLAT_STORE_SHORT           : FLAT_Real_Base_gfx11<0x019, "flat_store_b16">;
2411*0fca6ea1SDimitry Andricdefm FLAT_STORE_DWORD           : FLAT_Real_Base_gfx11<0x01a, "flat_store_b32">;
2412*0fca6ea1SDimitry Andricdefm FLAT_STORE_DWORDX2         : FLAT_Real_Base_gfx11<0x01b, "flat_store_b64">;
2413*0fca6ea1SDimitry Andricdefm FLAT_STORE_DWORDX3         : FLAT_Real_Base_gfx11<0x01c, "flat_store_b96">;
2414*0fca6ea1SDimitry Andricdefm FLAT_STORE_DWORDX4         : FLAT_Real_Base_gfx11<0x01d, "flat_store_b128">;
2415*0fca6ea1SDimitry Andricdefm FLAT_LOAD_UBYTE_D16        : FLAT_Real_Base_gfx11<0x01e, "flat_load_d16_u8">;
2416*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SBYTE_D16        : FLAT_Real_Base_gfx11<0x01f, "flat_load_d16_i8">;
2417*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SHORT_D16        : FLAT_Real_Base_gfx11<0x020, "flat_load_d16_b16">;
2418*0fca6ea1SDimitry Andricdefm FLAT_LOAD_UBYTE_D16_HI     : FLAT_Real_Base_gfx11<0x021, "flat_load_d16_hi_u8">;
2419*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SBYTE_D16_HI     : FLAT_Real_Base_gfx11<0x022, "flat_load_d16_hi_i8">;
2420*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SHORT_D16_HI     : FLAT_Real_Base_gfx11<0x023, "flat_load_d16_hi_b16">;
2421*0fca6ea1SDimitry Andricdefm FLAT_STORE_BYTE_D16_HI     : FLAT_Real_Base_gfx11<0x024, "flat_store_d16_hi_b8">;
2422*0fca6ea1SDimitry Andricdefm FLAT_STORE_SHORT_D16_HI    : FLAT_Real_Base_gfx11<0x025, "flat_store_d16_hi_b16">;
2423*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SWAP           : FLAT_Real_Atomics_gfx11<0x033, "flat_atomic_swap_b32">;
2424*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP        : FLAT_Real_Atomics_gfx11<0x034, "flat_atomic_cmpswap_b32">;
2425*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_ADD            : FLAT_Real_Atomics_gfx11<0x035, "flat_atomic_add_u32">;
2426*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SUB            : FLAT_Real_Atomics_gfx11<0x036, "flat_atomic_sub_u32">;
2427*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMIN           : FLAT_Real_Atomics_gfx11<0x038, "flat_atomic_min_i32">;
2428*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMIN           : FLAT_Real_Atomics_gfx11<0x039, "flat_atomic_min_u32">;
2429*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMAX           : FLAT_Real_Atomics_gfx11<0x03a, "flat_atomic_max_i32">;
2430*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMAX           : FLAT_Real_Atomics_gfx11<0x03b, "flat_atomic_max_u32">;
2431*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_AND            : FLAT_Real_Atomics_gfx11<0x03c, "flat_atomic_and_b32">;
2432*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_OR             : FLAT_Real_Atomics_gfx11<0x03d, "flat_atomic_or_b32">;
2433*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_XOR            : FLAT_Real_Atomics_gfx11<0x03e, "flat_atomic_xor_b32">;
2434*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_INC            : FLAT_Real_Atomics_gfx11<0x03f, "flat_atomic_inc_u32">;
2435*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_DEC            : FLAT_Real_Atomics_gfx11<0x040, "flat_atomic_dec_u32">;
2436*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SWAP_X2        : FLAT_Real_Atomics_gfx11<0x041, "flat_atomic_swap_b64">;
2437*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP_X2     : FLAT_Real_Atomics_gfx11<0x042, "flat_atomic_cmpswap_b64">;
2438*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_ADD_X2         : FLAT_Real_Atomics_gfx11<0x043, "flat_atomic_add_u64">;
2439*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SUB_X2         : FLAT_Real_Atomics_gfx11<0x044, "flat_atomic_sub_u64">;
2440*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMIN_X2        : FLAT_Real_Atomics_gfx11<0x045, "flat_atomic_min_i64">;
2441*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMIN_X2        : FLAT_Real_Atomics_gfx11<0x046, "flat_atomic_min_u64">;
2442*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMAX_X2        : FLAT_Real_Atomics_gfx11<0x047, "flat_atomic_max_i64">;
2443*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMAX_X2        : FLAT_Real_Atomics_gfx11<0x048, "flat_atomic_max_u64">;
2444*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_AND_X2         : FLAT_Real_Atomics_gfx11<0x049, "flat_atomic_and_b64">;
2445*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_OR_X2          : FLAT_Real_Atomics_gfx11<0x04a, "flat_atomic_or_b64">;
2446*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_XOR_X2         : FLAT_Real_Atomics_gfx11<0x04b, "flat_atomic_xor_b64">;
2447*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_INC_X2         : FLAT_Real_Atomics_gfx11<0x04c, "flat_atomic_inc_u64">;
2448*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_DEC_X2         : FLAT_Real_Atomics_gfx11<0x04d, "flat_atomic_dec_u64">;
2449*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FCMPSWAP       : FLAT_Real_Atomics_gfx11<0x050, "flat_atomic_cmpswap_f32">;
2450*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FMIN           : FLAT_Real_Atomics_gfx11<0x051, "flat_atomic_min_f32">;
2451*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FMAX           : FLAT_Real_Atomics_gfx11<0x052, "flat_atomic_max_f32">;
2452*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_ADD_F32        : FLAT_Real_Atomics_gfx11<0x056>;
245381ad6265SDimitry Andric
245481ad6265SDimitry Andric// ENC_FLAT_GLBL.
2455*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_UBYTE          : GLOBAL_Real_AllAddr_gfx11<0x010, "global_load_u8">;
2456*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SBYTE          : GLOBAL_Real_AllAddr_gfx11<0x011, "global_load_i8">;
2457*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_USHORT         : GLOBAL_Real_AllAddr_gfx11<0x012, "global_load_u16">;
2458*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SSHORT         : GLOBAL_Real_AllAddr_gfx11<0x013, "global_load_i16">;
2459*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_DWORD          : GLOBAL_Real_AllAddr_gfx11<0x014, "global_load_b32">;
2460*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_DWORDX2        : GLOBAL_Real_AllAddr_gfx11<0x015, "global_load_b64">;
2461*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_DWORDX3        : GLOBAL_Real_AllAddr_gfx11<0x016, "global_load_b96">;
2462*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_DWORDX4        : GLOBAL_Real_AllAddr_gfx11<0x017, "global_load_b128">;
2463*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_BYTE          : GLOBAL_Real_AllAddr_gfx11<0x018, "global_store_b8">;
2464*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_SHORT         : GLOBAL_Real_AllAddr_gfx11<0x019, "global_store_b16">;
2465*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_DWORD         : GLOBAL_Real_AllAddr_gfx11<0x01a, "global_store_b32">;
2466*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_DWORDX2       : GLOBAL_Real_AllAddr_gfx11<0x01b, "global_store_b64">;
2467*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_DWORDX3       : GLOBAL_Real_AllAddr_gfx11<0x01c, "global_store_b96">;
2468*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_DWORDX4       : GLOBAL_Real_AllAddr_gfx11<0x01d, "global_store_b128">;
2469*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_UBYTE_D16      : GLOBAL_Real_AllAddr_gfx11<0x01e, "global_load_d16_u8">;
2470*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SBYTE_D16      : GLOBAL_Real_AllAddr_gfx11<0x01f, "global_load_d16_i8">;
2471*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SHORT_D16      : GLOBAL_Real_AllAddr_gfx11<0x020, "global_load_d16_b16">;
2472*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_UBYTE_D16_HI   : GLOBAL_Real_AllAddr_gfx11<0x021, "global_load_d16_hi_u8">;
2473*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SBYTE_D16_HI   : GLOBAL_Real_AllAddr_gfx11<0x022, "global_load_d16_hi_i8">;
2474*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SHORT_D16_HI   : GLOBAL_Real_AllAddr_gfx11<0x023, "global_load_d16_hi_b16">;
2475*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_BYTE_D16_HI   : GLOBAL_Real_AllAddr_gfx11<0x024, "global_store_d16_hi_b8">;
2476*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_SHORT_D16_HI  : GLOBAL_Real_AllAddr_gfx11<0x025, "global_store_d16_hi_b16">;
2477*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_DWORD_ADDTID   : GLOBAL_Real_AllAddr_gfx11<0x028, "global_load_addtid_b32">;
2478*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_DWORD_ADDTID  : GLOBAL_Real_AllAddr_gfx11<0x029, "global_store_addtid_b32">;
2479*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SWAP         : GLOBAL_Real_Atomics_gfx11<0x033, "global_atomic_swap_b32">;
2480*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_CMPSWAP      : GLOBAL_Real_Atomics_gfx11<0x034, "global_atomic_cmpswap_b32">;
2481*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_ADD          : GLOBAL_Real_Atomics_gfx11<0x035, "global_atomic_add_u32">;
2482*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SUB          : GLOBAL_Real_Atomics_gfx11<0x036, "global_atomic_sub_u32">;
2483*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_CSUB         : GLOBAL_Real_Atomics_gfx11<0x037, "global_atomic_csub_u32">;
2484*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SMIN         : GLOBAL_Real_Atomics_gfx11<0x038, "global_atomic_min_i32">;
2485*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_UMIN         : GLOBAL_Real_Atomics_gfx11<0x039, "global_atomic_min_u32">;
2486*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SMAX         : GLOBAL_Real_Atomics_gfx11<0x03a, "global_atomic_max_i32">;
2487*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_UMAX         : GLOBAL_Real_Atomics_gfx11<0x03b, "global_atomic_max_u32">;
2488*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_AND          : GLOBAL_Real_Atomics_gfx11<0x03c, "global_atomic_and_b32">;
2489*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_OR           : GLOBAL_Real_Atomics_gfx11<0x03d, "global_atomic_or_b32">;
2490*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_XOR          : GLOBAL_Real_Atomics_gfx11<0x03e, "global_atomic_xor_b32">;
2491*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_INC          : GLOBAL_Real_Atomics_gfx11<0x03f, "global_atomic_inc_u32">;
2492*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_DEC          : GLOBAL_Real_Atomics_gfx11<0x040, "global_atomic_dec_u32">;
2493*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SWAP_X2      : GLOBAL_Real_Atomics_gfx11<0x041, "global_atomic_swap_b64">;
2494*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_CMPSWAP_X2   : GLOBAL_Real_Atomics_gfx11<0x042, "global_atomic_cmpswap_b64">;
2495*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_ADD_X2       : GLOBAL_Real_Atomics_gfx11<0x043, "global_atomic_add_u64">;
2496*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SUB_X2       : GLOBAL_Real_Atomics_gfx11<0x044, "global_atomic_sub_u64">;
2497*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SMIN_X2      : GLOBAL_Real_Atomics_gfx11<0x045, "global_atomic_min_i64">;
2498*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_UMIN_X2      : GLOBAL_Real_Atomics_gfx11<0x046, "global_atomic_min_u64">;
2499*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SMAX_X2      : GLOBAL_Real_Atomics_gfx11<0x047, "global_atomic_max_i64">;
2500*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_UMAX_X2      : GLOBAL_Real_Atomics_gfx11<0x048, "global_atomic_max_u64">;
2501*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_AND_X2       : GLOBAL_Real_Atomics_gfx11<0x049, "global_atomic_and_b64">;
2502*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_OR_X2        : GLOBAL_Real_Atomics_gfx11<0x04a, "global_atomic_or_b64">;
2503*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_XOR_X2       : GLOBAL_Real_Atomics_gfx11<0x04b, "global_atomic_xor_b64">;
2504*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_INC_X2       : GLOBAL_Real_Atomics_gfx11<0x04c, "global_atomic_inc_u64">;
2505*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_DEC_X2       : GLOBAL_Real_Atomics_gfx11<0x04d, "global_atomic_dec_u64">;
2506*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_FCMPSWAP     : GLOBAL_Real_Atomics_gfx11<0x050, "global_atomic_cmpswap_f32">;
2507*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_FMIN         : GLOBAL_Real_Atomics_gfx11<0x051, "global_atomic_min_f32">;
2508*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_FMAX         : GLOBAL_Real_Atomics_gfx11<0x052, "global_atomic_max_f32">;
2509*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_ADD_F32      : GLOBAL_Real_Atomics_gfx11<0x056>;
251081ad6265SDimitry Andric
251181ad6265SDimitry Andric// ENC_FLAT_SCRATCH.
2512*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_UBYTE         : SCRATCH_Real_AllAddr_gfx11<0x10, "scratch_load_u8">;
2513*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SBYTE         : SCRATCH_Real_AllAddr_gfx11<0x11, "scratch_load_i8">;
2514*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_USHORT        : SCRATCH_Real_AllAddr_gfx11<0x12, "scratch_load_u16">;
2515*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SSHORT        : SCRATCH_Real_AllAddr_gfx11<0x13, "scratch_load_i16">;
2516*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_DWORD         : SCRATCH_Real_AllAddr_gfx11<0x14, "scratch_load_b32">;
2517*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_DWORDX2       : SCRATCH_Real_AllAddr_gfx11<0x15, "scratch_load_b64">;
2518*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_DWORDX3       : SCRATCH_Real_AllAddr_gfx11<0x16, "scratch_load_b96">;
2519*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_DWORDX4       : SCRATCH_Real_AllAddr_gfx11<0x17, "scratch_load_b128">;
2520*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_BYTE         : SCRATCH_Real_AllAddr_gfx11<0x18, "scratch_store_b8">;
2521*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_SHORT        : SCRATCH_Real_AllAddr_gfx11<0x19, "scratch_store_b16">;
2522*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_DWORD        : SCRATCH_Real_AllAddr_gfx11<0x1a, "scratch_store_b32">;
2523*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_DWORDX2      : SCRATCH_Real_AllAddr_gfx11<0x1b, "scratch_store_b64">;
2524*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_DWORDX3      : SCRATCH_Real_AllAddr_gfx11<0x1c, "scratch_store_b96">;
2525*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_DWORDX4      : SCRATCH_Real_AllAddr_gfx11<0x1d, "scratch_store_b128">;
2526*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_UBYTE_D16     : SCRATCH_Real_AllAddr_gfx11<0x1e, "scratch_load_d16_u8">;
2527*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SBYTE_D16     : SCRATCH_Real_AllAddr_gfx11<0x1f, "scratch_load_d16_i8">;
2528*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SHORT_D16     : SCRATCH_Real_AllAddr_gfx11<0x20, "scratch_load_d16_b16">;
2529*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_UBYTE_D16_HI  : SCRATCH_Real_AllAddr_gfx11<0x21, "scratch_load_d16_hi_u8">;
2530*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SBYTE_D16_HI  : SCRATCH_Real_AllAddr_gfx11<0x22, "scratch_load_d16_hi_i8">;
2531*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SHORT_D16_HI  : SCRATCH_Real_AllAddr_gfx11<0x23, "scratch_load_d16_hi_b16">;
2532*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_BYTE_D16_HI  : SCRATCH_Real_AllAddr_gfx11<0x24, "scratch_store_d16_hi_b8">;
2533*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_SHORT_D16_HI : SCRATCH_Real_AllAddr_gfx11<0x25, "scratch_store_d16_hi_b16">;
25345f757f3fSDimitry Andric
25355f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
25365f757f3fSDimitry Andric// GFX12
25375f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
25385f757f3fSDimitry Andric
2539*0fca6ea1SDimitry Andricmulticlass VFLAT_Real_gfx12 <bits<8> op, string name = get_FLAT_ps<NAME>.Mnemonic> {
2540*0fca6ea1SDimitry Andric  defvar ps = !cast<FLAT_Pseudo>(NAME);
2541*0fca6ea1SDimitry Andric  def _gfx12 : VFLAT_Real <op, ps, name>,
25425f757f3fSDimitry Andric               SIMCInstr <ps.PseudoInstr, SIEncodingFamily.GFX12> {
2543*0fca6ea1SDimitry Andric    let AssemblerPredicate = isGFX12Only;
25445f757f3fSDimitry Andric    let DecoderNamespace = "GFX12";
25455f757f3fSDimitry Andric
2546*0fca6ea1SDimitry Andric    let Inst{25-24} = {ps.is_flat_global, ps.is_flat_scratch};
25475f757f3fSDimitry Andric  }
25485f757f3fSDimitry Andric}
25495f757f3fSDimitry Andric
2550*0fca6ea1SDimitry Andricmulticlass VFLAT_Aliases_gfx12<string name, string alias = name> {
2551*0fca6ea1SDimitry Andric  defvar ps = get_FLAT_ps<NAME>;
2552*0fca6ea1SDimitry Andric  let AssemblerPredicate = isGFX12Only in {
2553*0fca6ea1SDimitry Andric    if !ne(ps.Mnemonic, name) then
2554*0fca6ea1SDimitry Andric      def : AMDGPUMnemonicAlias<ps.Mnemonic, name>;
2555*0fca6ea1SDimitry Andric    if !ne(alias, name) then
2556*0fca6ea1SDimitry Andric      def : AMDGPUMnemonicAlias<alias, name>;
25575f757f3fSDimitry Andric  }
25585f757f3fSDimitry Andric}
25595f757f3fSDimitry Andric
2560*0fca6ea1SDimitry Andricmulticlass VFLAT_Real_Base_gfx12<bits<8> op,
2561*0fca6ea1SDimitry Andric                                 string name = get_FLAT_ps<NAME>.Mnemonic,
2562*0fca6ea1SDimitry Andric                                 string alias = name> :
2563*0fca6ea1SDimitry Andric  VFLAT_Aliases_gfx12<name, alias>,
2564*0fca6ea1SDimitry Andric  VFLAT_Real_gfx12<op, name>;
2565*0fca6ea1SDimitry Andric
2566*0fca6ea1SDimitry Andricmulticlass VFLAT_Real_Atomics_gfx12<bits<8> op,
2567*0fca6ea1SDimitry Andric                                    string name = get_FLAT_ps<NAME>.Mnemonic,
2568*0fca6ea1SDimitry Andric                                    string alias = name> :
2569*0fca6ea1SDimitry Andric  VFLAT_Real_Base_gfx12<op, name, alias> {
2570*0fca6ea1SDimitry Andric  defm _RTN : VFLAT_Real_gfx12<op, name>;
25715f757f3fSDimitry Andric}
25725f757f3fSDimitry Andric
2573*0fca6ea1SDimitry Andricmulticlass VGLOBAL_Real_AllAddr_gfx12<bits<8> op,
2574*0fca6ea1SDimitry Andric                                      string name = get_FLAT_ps<NAME>.Mnemonic,
2575*0fca6ea1SDimitry Andric                                      string alias = name> :
2576*0fca6ea1SDimitry Andric  VFLAT_Real_Base_gfx12<op, name, alias> {
2577*0fca6ea1SDimitry Andric  defm _SADDR : VFLAT_Real_gfx12<op, name>;
25785f757f3fSDimitry Andric}
25795f757f3fSDimitry Andric
2580*0fca6ea1SDimitry Andricmulticlass VGLOBAL_Real_AllAddr_gfx12_w64<bits<8> op,
2581*0fca6ea1SDimitry Andric                                       string name = get_FLAT_ps<NAME>.Mnemonic> :
2582*0fca6ea1SDimitry Andric  VFLAT_Aliases_gfx12<name> {
2583*0fca6ea1SDimitry Andric  let DecoderNamespace = "GFX12W64" in {
2584*0fca6ea1SDimitry Andric    defm "" : VFLAT_Real_gfx12<op, name>;
2585*0fca6ea1SDimitry Andric    defm _SADDR : VFLAT_Real_gfx12<op, name>;
25865f757f3fSDimitry Andric  }
25875f757f3fSDimitry Andric}
25885f757f3fSDimitry Andric
2589*0fca6ea1SDimitry Andricmulticlass VGLOBAL_Real_Atomics_gfx12<bits<8> op,
2590*0fca6ea1SDimitry Andric                                      string name = get_FLAT_ps<NAME>.Mnemonic,
2591*0fca6ea1SDimitry Andric                                      string alias = name> :
2592*0fca6ea1SDimitry Andric  VGLOBAL_Real_AllAddr_gfx12<op, name, alias> {
2593*0fca6ea1SDimitry Andric  defm _RTN : VFLAT_Real_gfx12<op, name>;
2594*0fca6ea1SDimitry Andric  defm _SADDR_RTN : VFLAT_Real_gfx12<op, name>;
25955f757f3fSDimitry Andric}
25965f757f3fSDimitry Andric
2597*0fca6ea1SDimitry Andricmulticlass VSCRATCH_Real_AllAddr_gfx12<bits<8> op,
2598*0fca6ea1SDimitry Andric                                       string name = get_FLAT_ps<NAME>.Mnemonic> :
2599*0fca6ea1SDimitry Andric  VFLAT_Real_Base_gfx12<op, name> {
2600*0fca6ea1SDimitry Andric  defm _SADDR : VFLAT_Real_gfx12<op, name>;
2601*0fca6ea1SDimitry Andric  defm _ST : VFLAT_Real_gfx12<op, name>;
2602*0fca6ea1SDimitry Andric  defm _SVS : VFLAT_Real_gfx12<op, name>;
2603*0fca6ea1SDimitry Andric}
26045f757f3fSDimitry Andric
26055f757f3fSDimitry Andric// ENC_VFLAT.
2606*0fca6ea1SDimitry Andricdefm FLAT_LOAD_UBYTE               : VFLAT_Real_Base_gfx12<0x010, "flat_load_u8">;
2607*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SBYTE               : VFLAT_Real_Base_gfx12<0x011, "flat_load_i8">;
2608*0fca6ea1SDimitry Andricdefm FLAT_LOAD_USHORT              : VFLAT_Real_Base_gfx12<0x012, "flat_load_u16">;
2609*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SSHORT              : VFLAT_Real_Base_gfx12<0x013, "flat_load_i16">;
2610*0fca6ea1SDimitry Andricdefm FLAT_LOAD_DWORD               : VFLAT_Real_Base_gfx12<0x014, "flat_load_b32">;
2611*0fca6ea1SDimitry Andricdefm FLAT_LOAD_DWORDX2             : VFLAT_Real_Base_gfx12<0x015, "flat_load_b64">;
2612*0fca6ea1SDimitry Andricdefm FLAT_LOAD_DWORDX3             : VFLAT_Real_Base_gfx12<0x016, "flat_load_b96">;
2613*0fca6ea1SDimitry Andricdefm FLAT_LOAD_DWORDX4             : VFLAT_Real_Base_gfx12<0x017, "flat_load_b128">;
2614*0fca6ea1SDimitry Andricdefm FLAT_STORE_BYTE               : VFLAT_Real_Base_gfx12<0x018, "flat_store_b8">;
2615*0fca6ea1SDimitry Andricdefm FLAT_STORE_SHORT              : VFLAT_Real_Base_gfx12<0x019, "flat_store_b16">;
2616*0fca6ea1SDimitry Andricdefm FLAT_STORE_DWORD              : VFLAT_Real_Base_gfx12<0x01a, "flat_store_b32">;
2617*0fca6ea1SDimitry Andricdefm FLAT_STORE_DWORDX2            : VFLAT_Real_Base_gfx12<0x01b, "flat_store_b64">;
2618*0fca6ea1SDimitry Andricdefm FLAT_STORE_DWORDX3            : VFLAT_Real_Base_gfx12<0x01c, "flat_store_b96">;
2619*0fca6ea1SDimitry Andricdefm FLAT_STORE_DWORDX4            : VFLAT_Real_Base_gfx12<0x01d, "flat_store_b128">;
2620*0fca6ea1SDimitry Andricdefm FLAT_LOAD_UBYTE_D16           : VFLAT_Real_Base_gfx12<0x01e, "flat_load_d16_u8">;
2621*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SBYTE_D16           : VFLAT_Real_Base_gfx12<0x01f, "flat_load_d16_i8">;
2622*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SHORT_D16           : VFLAT_Real_Base_gfx12<0x020, "flat_load_d16_b16">;
2623*0fca6ea1SDimitry Andricdefm FLAT_LOAD_UBYTE_D16_HI        : VFLAT_Real_Base_gfx12<0x021, "flat_load_d16_hi_u8">;
2624*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SBYTE_D16_HI        : VFLAT_Real_Base_gfx12<0x022, "flat_load_d16_hi_i8">;
2625*0fca6ea1SDimitry Andricdefm FLAT_LOAD_SHORT_D16_HI        : VFLAT_Real_Base_gfx12<0x023, "flat_load_d16_hi_b16">;
2626*0fca6ea1SDimitry Andricdefm FLAT_STORE_BYTE_D16_HI        : VFLAT_Real_Base_gfx12<0x024, "flat_store_d16_hi_b8">;
2627*0fca6ea1SDimitry Andricdefm FLAT_STORE_SHORT_D16_HI       : VFLAT_Real_Base_gfx12<0x025, "flat_store_d16_hi_b16">;
2628*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SWAP              : VFLAT_Real_Atomics_gfx12<0x033, "flat_atomic_swap_b32">;
2629*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP           : VFLAT_Real_Atomics_gfx12<0x034, "flat_atomic_cmpswap_b32">;
2630*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_ADD               : VFLAT_Real_Atomics_gfx12<0x035, "flat_atomic_add_u32">;
2631*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SUB               : VFLAT_Real_Atomics_gfx12<0x036, "flat_atomic_sub_u32">;
2632*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_CSUB_U32          : VFLAT_Real_Atomics_gfx12<0x037, "flat_atomic_sub_clamp_u32">;
2633*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMIN              : VFLAT_Real_Atomics_gfx12<0x038, "flat_atomic_min_i32">;
2634*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMIN              : VFLAT_Real_Atomics_gfx12<0x039, "flat_atomic_min_u32">;
2635*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMAX              : VFLAT_Real_Atomics_gfx12<0x03a, "flat_atomic_max_i32">;
2636*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMAX              : VFLAT_Real_Atomics_gfx12<0x03b, "flat_atomic_max_u32">;
2637*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_AND               : VFLAT_Real_Atomics_gfx12<0x03c, "flat_atomic_and_b32">;
2638*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_OR                : VFLAT_Real_Atomics_gfx12<0x03d, "flat_atomic_or_b32">;
2639*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_XOR               : VFLAT_Real_Atomics_gfx12<0x03e, "flat_atomic_xor_b32">;
2640*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_INC               : VFLAT_Real_Atomics_gfx12<0x03f, "flat_atomic_inc_u32">;
2641*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_DEC               : VFLAT_Real_Atomics_gfx12<0x040, "flat_atomic_dec_u32">;
2642*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SWAP_X2           : VFLAT_Real_Atomics_gfx12<0x041, "flat_atomic_swap_b64">;
2643*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_CMPSWAP_X2        : VFLAT_Real_Atomics_gfx12<0x042, "flat_atomic_cmpswap_b64">;
2644*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_ADD_X2            : VFLAT_Real_Atomics_gfx12<0x043, "flat_atomic_add_u64">;
2645*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SUB_X2            : VFLAT_Real_Atomics_gfx12<0x044, "flat_atomic_sub_u64">;
2646*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMIN_X2           : VFLAT_Real_Atomics_gfx12<0x045, "flat_atomic_min_i64">;
2647*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMIN_X2           : VFLAT_Real_Atomics_gfx12<0x046, "flat_atomic_min_u64">;
2648*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_SMAX_X2           : VFLAT_Real_Atomics_gfx12<0x047, "flat_atomic_max_i64">;
2649*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_UMAX_X2           : VFLAT_Real_Atomics_gfx12<0x048, "flat_atomic_max_u64">;
2650*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_AND_X2            : VFLAT_Real_Atomics_gfx12<0x049, "flat_atomic_and_b64">;
2651*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_OR_X2             : VFLAT_Real_Atomics_gfx12<0x04a, "flat_atomic_or_b64">;
2652*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_XOR_X2            : VFLAT_Real_Atomics_gfx12<0x04b, "flat_atomic_xor_b64">;
2653*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_INC_X2            : VFLAT_Real_Atomics_gfx12<0x04c, "flat_atomic_inc_u64">;
2654*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_DEC_X2            : VFLAT_Real_Atomics_gfx12<0x04d, "flat_atomic_dec_u64">;
2655*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_COND_SUB_U32      : VFLAT_Real_Atomics_gfx12<0x050>;
2656*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FMIN              : VFLAT_Real_Atomics_gfx12<0x051, "flat_atomic_min_num_f32", "flat_atomic_min_f32">;
2657*0fca6ea1SDimitry Andricdefm FLAT_ATOMIC_FMAX              : VFLAT_Real_Atomics_gfx12<0x052, "flat_atomic_max_num_f32", "flat_atomic_max_f32">;
26587a6dacacSDimitry Andricdefm FLAT_ATOMIC_ADD_F32           : VFLAT_Real_Atomics_gfx12<0x056>;
26597a6dacacSDimitry Andricdefm FLAT_ATOMIC_PK_ADD_F16        : VFLAT_Real_Atomics_gfx12<0x059>;
26607a6dacacSDimitry Andricdefm FLAT_ATOMIC_PK_ADD_BF16       : VFLAT_Real_Atomics_gfx12<0x05a>;
26615f757f3fSDimitry Andric
26625f757f3fSDimitry Andric// ENC_VGLOBAL.
2663*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_UBYTE             : VGLOBAL_Real_AllAddr_gfx12<0x010, "global_load_u8">;
2664*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SBYTE             : VGLOBAL_Real_AllAddr_gfx12<0x011, "global_load_i8">;
2665*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_USHORT            : VGLOBAL_Real_AllAddr_gfx12<0x012, "global_load_u16">;
2666*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SSHORT            : VGLOBAL_Real_AllAddr_gfx12<0x013, "global_load_i16">;
2667*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_DWORD             : VGLOBAL_Real_AllAddr_gfx12<0x014, "global_load_b32">;
2668*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_DWORDX2           : VGLOBAL_Real_AllAddr_gfx12<0x015, "global_load_b64">;
2669*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_DWORDX3           : VGLOBAL_Real_AllAddr_gfx12<0x016, "global_load_b96">;
2670*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_DWORDX4           : VGLOBAL_Real_AllAddr_gfx12<0x017, "global_load_b128">;
2671*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_BYTE             : VGLOBAL_Real_AllAddr_gfx12<0x018, "global_store_b8">;
2672*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_SHORT            : VGLOBAL_Real_AllAddr_gfx12<0x019, "global_store_b16">;
2673*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_DWORD            : VGLOBAL_Real_AllAddr_gfx12<0x01a, "global_store_b32">;
2674*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_DWORDX2          : VGLOBAL_Real_AllAddr_gfx12<0x01b, "global_store_b64">;
2675*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_DWORDX3          : VGLOBAL_Real_AllAddr_gfx12<0x01c, "global_store_b96">;
2676*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_DWORDX4          : VGLOBAL_Real_AllAddr_gfx12<0x01d, "global_store_b128">;
2677*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_UBYTE_D16         : VGLOBAL_Real_AllAddr_gfx12<0x01e, "global_load_d16_u8">;
2678*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SBYTE_D16         : VGLOBAL_Real_AllAddr_gfx12<0x01f, "global_load_d16_i8">;
2679*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SHORT_D16         : VGLOBAL_Real_AllAddr_gfx12<0x020, "global_load_d16_b16">;
2680*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_UBYTE_D16_HI      : VGLOBAL_Real_AllAddr_gfx12<0x021, "global_load_d16_hi_u8">;
2681*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SBYTE_D16_HI      : VGLOBAL_Real_AllAddr_gfx12<0x022, "global_load_d16_hi_i8">;
2682*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_SHORT_D16_HI      : VGLOBAL_Real_AllAddr_gfx12<0x023, "global_load_d16_hi_b16">;
2683*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_BYTE_D16_HI      : VGLOBAL_Real_AllAddr_gfx12<0x024, "global_store_d16_hi_b8">;
2684*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_SHORT_D16_HI     : VGLOBAL_Real_AllAddr_gfx12<0x025, "global_store_d16_hi_b16">;
2685*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_DWORD_ADDTID      : VGLOBAL_Real_AllAddr_gfx12<0x028, "global_load_addtid_b32">;
2686*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_DWORD_ADDTID     : VGLOBAL_Real_AllAddr_gfx12<0x029, "global_store_addtid_b32">;
2687*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_BLOCK             : VGLOBAL_Real_AllAddr_gfx12<0x053>;
2688*0fca6ea1SDimitry Andricdefm GLOBAL_STORE_BLOCK            : VGLOBAL_Real_AllAddr_gfx12<0x054>;
26895f757f3fSDimitry Andric
2690*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SWAP            : VGLOBAL_Real_Atomics_gfx12<0x033, "global_atomic_swap_b32">;
2691*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_CMPSWAP         : VGLOBAL_Real_Atomics_gfx12<0x034, "global_atomic_cmpswap_b32">;
2692*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_ADD             : VGLOBAL_Real_Atomics_gfx12<0x035, "global_atomic_add_u32">;
2693*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SUB             : VGLOBAL_Real_Atomics_gfx12<0x036, "global_atomic_sub_u32">;
2694*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_CSUB            : VGLOBAL_Real_Atomics_gfx12<0x037, "global_atomic_sub_clamp_u32", "global_atomic_csub_u32">;
2695*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SMIN            : VGLOBAL_Real_Atomics_gfx12<0x038, "global_atomic_min_i32">;
2696*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_UMIN            : VGLOBAL_Real_Atomics_gfx12<0x039, "global_atomic_min_u32">;
2697*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SMAX            : VGLOBAL_Real_Atomics_gfx12<0x03a, "global_atomic_max_i32">;
2698*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_UMAX            : VGLOBAL_Real_Atomics_gfx12<0x03b, "global_atomic_max_u32">;
2699*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_AND             : VGLOBAL_Real_Atomics_gfx12<0x03c, "global_atomic_and_b32">;
2700*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_OR              : VGLOBAL_Real_Atomics_gfx12<0x03d, "global_atomic_or_b32">;
2701*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_XOR             : VGLOBAL_Real_Atomics_gfx12<0x03e, "global_atomic_xor_b32">;
2702*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_INC             : VGLOBAL_Real_Atomics_gfx12<0x03f, "global_atomic_inc_u32">;
2703*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_DEC             : VGLOBAL_Real_Atomics_gfx12<0x040, "global_atomic_dec_u32">;
2704*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SWAP_X2         : VGLOBAL_Real_Atomics_gfx12<0x041, "global_atomic_swap_b64">;
2705*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_CMPSWAP_X2      : VGLOBAL_Real_Atomics_gfx12<0x042, "global_atomic_cmpswap_b64">;
2706*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_ADD_X2          : VGLOBAL_Real_Atomics_gfx12<0x043, "global_atomic_add_u64">;
2707*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SUB_X2          : VGLOBAL_Real_Atomics_gfx12<0x044, "global_atomic_sub_u64">;
2708*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SMIN_X2         : VGLOBAL_Real_Atomics_gfx12<0x045, "global_atomic_min_i64">;
2709*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_UMIN_X2         : VGLOBAL_Real_Atomics_gfx12<0x046, "global_atomic_min_u64">;
2710*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_SMAX_X2         : VGLOBAL_Real_Atomics_gfx12<0x047, "global_atomic_max_i64">;
2711*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_UMAX_X2         : VGLOBAL_Real_Atomics_gfx12<0x048, "global_atomic_max_u64">;
2712*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_AND_X2          : VGLOBAL_Real_Atomics_gfx12<0x049, "global_atomic_and_b64">;
2713*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_OR_X2           : VGLOBAL_Real_Atomics_gfx12<0x04a, "global_atomic_or_b64">;
2714*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_XOR_X2          : VGLOBAL_Real_Atomics_gfx12<0x04b, "global_atomic_xor_b64">;
2715*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_INC_X2          : VGLOBAL_Real_Atomics_gfx12<0x04c, "global_atomic_inc_u64">;
2716*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_DEC_X2          : VGLOBAL_Real_Atomics_gfx12<0x04d, "global_atomic_dec_u64">;
2717*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_COND_SUB_U32    : VGLOBAL_Real_Atomics_gfx12<0x050>;
2718*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_FMIN            : VGLOBAL_Real_Atomics_gfx12<0x051, "global_atomic_min_num_f32", "global_atomic_min_f32">;
2719*0fca6ea1SDimitry Andricdefm GLOBAL_ATOMIC_FMAX            : VGLOBAL_Real_Atomics_gfx12<0x052, "global_atomic_max_num_f32", "global_atomic_max_f32">;
27207a6dacacSDimitry Andricdefm GLOBAL_ATOMIC_ADD_F32         : VGLOBAL_Real_Atomics_gfx12<0x056>;
27215f757f3fSDimitry Andric
2722*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_TR_B128_w32       : VGLOBAL_Real_AllAddr_gfx12<0x057>;
2723*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_TR_B64_w32        : VGLOBAL_Real_AllAddr_gfx12<0x058>;
27247a6dacacSDimitry Andric
2725*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_TR_B128_w64       : VGLOBAL_Real_AllAddr_gfx12_w64<0x057>;
2726*0fca6ea1SDimitry Andricdefm GLOBAL_LOAD_TR_B64_w64        : VGLOBAL_Real_AllAddr_gfx12_w64<0x058>;
27277a6dacacSDimitry Andric
27287a6dacacSDimitry Andricdefm GLOBAL_ATOMIC_ORDERED_ADD_B64 : VGLOBAL_Real_Atomics_gfx12<0x073>;
27297a6dacacSDimitry Andricdefm GLOBAL_ATOMIC_PK_ADD_F16      : VGLOBAL_Real_Atomics_gfx12<0x059>;
27307a6dacacSDimitry Andricdefm GLOBAL_ATOMIC_PK_ADD_BF16     : VGLOBAL_Real_Atomics_gfx12<0x05a>;
27317a6dacacSDimitry Andric
27327a6dacacSDimitry Andricdefm GLOBAL_INV                    : VFLAT_Real_Base_gfx12<0x02b>;
27337a6dacacSDimitry Andricdefm GLOBAL_WB                     : VFLAT_Real_Base_gfx12<0x02c>;
27347a6dacacSDimitry Andricdefm GLOBAL_WBINV                  : VFLAT_Real_Base_gfx12<0x04f>;
27351db9f3b2SDimitry Andric
27365f757f3fSDimitry Andric// ENC_VSCRATCH.
2737*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_UBYTE            : VSCRATCH_Real_AllAddr_gfx12<0x10, "scratch_load_u8">;
2738*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SBYTE            : VSCRATCH_Real_AllAddr_gfx12<0x11, "scratch_load_i8">;
2739*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_USHORT           : VSCRATCH_Real_AllAddr_gfx12<0x12, "scratch_load_u16">;
2740*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SSHORT           : VSCRATCH_Real_AllAddr_gfx12<0x13, "scratch_load_i16">;
2741*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_DWORD            : VSCRATCH_Real_AllAddr_gfx12<0x14, "scratch_load_b32">;
2742*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_DWORDX2          : VSCRATCH_Real_AllAddr_gfx12<0x15, "scratch_load_b64">;
2743*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_DWORDX3          : VSCRATCH_Real_AllAddr_gfx12<0x16, "scratch_load_b96">;
2744*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_DWORDX4          : VSCRATCH_Real_AllAddr_gfx12<0x17, "scratch_load_b128">;
2745*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_BYTE            : VSCRATCH_Real_AllAddr_gfx12<0x18, "scratch_store_b8">;
2746*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_SHORT           : VSCRATCH_Real_AllAddr_gfx12<0x19, "scratch_store_b16">;
2747*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_DWORD           : VSCRATCH_Real_AllAddr_gfx12<0x1a, "scratch_store_b32">;
2748*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_DWORDX2         : VSCRATCH_Real_AllAddr_gfx12<0x1b, "scratch_store_b64">;
2749*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_DWORDX3         : VSCRATCH_Real_AllAddr_gfx12<0x1c, "scratch_store_b96">;
2750*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_DWORDX4         : VSCRATCH_Real_AllAddr_gfx12<0x1d, "scratch_store_b128">;
2751*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_UBYTE_D16        : VSCRATCH_Real_AllAddr_gfx12<0x1e, "scratch_load_d16_u8">;
2752*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SBYTE_D16        : VSCRATCH_Real_AllAddr_gfx12<0x1f, "scratch_load_d16_i8">;
2753*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SHORT_D16        : VSCRATCH_Real_AllAddr_gfx12<0x20, "scratch_load_d16_b16">;
2754*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_UBYTE_D16_HI     : VSCRATCH_Real_AllAddr_gfx12<0x21, "scratch_load_d16_hi_u8">;
2755*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SBYTE_D16_HI     : VSCRATCH_Real_AllAddr_gfx12<0x22, "scratch_load_d16_hi_i8">;
2756*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_SHORT_D16_HI     : VSCRATCH_Real_AllAddr_gfx12<0x23, "scratch_load_d16_hi_b16">;
2757*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_BYTE_D16_HI     : VSCRATCH_Real_AllAddr_gfx12<0x24, "scratch_store_d16_hi_b8">;
2758*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_SHORT_D16_HI    : VSCRATCH_Real_AllAddr_gfx12<0x25, "scratch_store_d16_hi_b16">;
2759*0fca6ea1SDimitry Andric
2760*0fca6ea1SDimitry Andricdefm SCRATCH_LOAD_BLOCK            : VSCRATCH_Real_AllAddr_gfx12<0x53>;
2761*0fca6ea1SDimitry Andricdefm SCRATCH_STORE_BLOCK           : VSCRATCH_Real_AllAddr_gfx12<0x54>;
2762