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