| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 1 | //===-- MIMGInstructions.td - MIMG Instruction Defintions -----------------===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 10 | // MIMG-specific encoding families to distinguish between semantically |
| 11 | // equivalent machine instructions with different encoding. |
| 12 | // |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 13 | // - MIMGEncGfx6: encoding introduced with gfx6 (obsoleted for atomics in gfx8) |
| 14 | // - MIMGEncGfx8: encoding introduced with gfx8 for atomics |
| 15 | class MIMGEncoding; |
| 16 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 17 | def MIMGEncGfx6 : MIMGEncoding; |
| 18 | def MIMGEncGfx8 : MIMGEncoding; |
| 19 | |
| 20 | def MIMGEncoding : GenericEnum { |
| 21 | let FilterClass = "MIMGEncoding"; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 22 | } |
| 23 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 24 | // Represent an ISA-level opcode, independent of the encoding and the |
| 25 | // vdata/vaddr size. |
| 26 | class MIMGBaseOpcode { |
| 27 | MIMGBaseOpcode BaseOpcode = !cast<MIMGBaseOpcode>(NAME); |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 28 | bit Store = 0; |
| 29 | bit Atomic = 0; |
| 30 | bit AtomicX2 = 0; // (f)cmpswap |
| 31 | bit Sampler = 0; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 32 | bits<8> NumExtraArgs = 0; |
| 33 | bit Gradients = 0; |
| 34 | bit Coordinates = 1; |
| 35 | bit LodOrClampOrMip = 0; |
| 36 | bit HasD16 = 0; |
| Dmitry Preobrazhensky | 0b4eb1e | 2018-01-26 15:43:29 +0000 | [diff] [blame] | 37 | } |
| 38 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 39 | def MIMGBaseOpcode : GenericEnum { |
| 40 | let FilterClass = "MIMGBaseOpcode"; |
| 41 | } |
| 42 | |
| 43 | def MIMGBaseOpcodesTable : GenericTable { |
| 44 | let FilterClass = "MIMGBaseOpcode"; |
| 45 | let CppTypeName = "MIMGBaseOpcodeInfo"; |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 46 | let Fields = ["BaseOpcode", "Store", "Atomic", "AtomicX2", "Sampler", |
| 47 | "NumExtraArgs", "Gradients", "Coordinates", "LodOrClampOrMip", |
| 48 | "HasD16"]; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 49 | GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode; |
| 50 | |
| 51 | let PrimaryKey = ["BaseOpcode"]; |
| 52 | let PrimaryKeyName = "getMIMGBaseOpcodeInfo"; |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 53 | } |
| 54 | |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 55 | def MIMGDim : GenericEnum { |
| 56 | let FilterClass = "AMDGPUDimProps"; |
| 57 | } |
| 58 | |
| 59 | def MIMGDimInfoTable : GenericTable { |
| 60 | let FilterClass = "AMDGPUDimProps"; |
| 61 | let CppTypeName = "MIMGDimInfo"; |
| 62 | let Fields = ["Dim", "NumCoords", "NumGradients", "DA"]; |
| 63 | GenericEnum TypeOf_Dim = MIMGDim; |
| 64 | |
| 65 | let PrimaryKey = ["Dim"]; |
| 66 | let PrimaryKeyName = "getMIMGDimInfo"; |
| 67 | } |
| 68 | |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 69 | class mimg <bits<7> si, bits<7> vi = si> { |
| 70 | field bits<7> SI = si; |
| 71 | field bits<7> VI = vi; |
| 72 | } |
| 73 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 74 | class MIMG <dag outs, string dns = ""> |
| 75 | : InstSI <outs, (ins), "", []> { |
| 76 | |
| 77 | let VM_CNT = 1; |
| 78 | let EXP_CNT = 1; |
| 79 | let MIMG = 1; |
| 80 | let Uses = [EXEC]; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 81 | let mayLoad = 1; |
| 82 | let mayStore = 0; |
| 83 | let hasPostISelHook = 1; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 84 | let SchedRW = [WriteVMEM]; |
| 85 | let UseNamedOperandTable = 1; |
| 86 | let hasSideEffects = 0; // XXX ???? |
| 87 | |
| 88 | let SubtargetPredicate = isGCN; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 89 | let DecoderNamespace = dns; |
| 90 | let isAsmParserOnly = !if(!eq(dns,""), 1, 0); |
| 91 | let AsmMatchConverter = "cvtMIMG"; |
| Tom Stellard | 244891d | 2016-12-20 15:52:17 +0000 | [diff] [blame] | 92 | let usesCustomInserter = 1; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 93 | |
| 94 | Instruction Opcode = !cast<Instruction>(NAME); |
| 95 | MIMGBaseOpcode BaseOpcode; |
| 96 | MIMGEncoding MIMGEncoding = MIMGEncGfx6; |
| 97 | bits<8> VDataDwords; |
| 98 | bits<8> VAddrDwords; |
| 99 | } |
| 100 | |
| 101 | def MIMGInfoTable : GenericTable { |
| 102 | let FilterClass = "MIMG"; |
| 103 | let CppTypeName = "MIMGInfo"; |
| 104 | let Fields = ["Opcode", "BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"]; |
| 105 | GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode; |
| 106 | GenericEnum TypeOf_MIMGEncoding = MIMGEncoding; |
| 107 | |
| 108 | let PrimaryKey = ["BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"]; |
| 109 | let PrimaryKeyName = "getMIMGOpcodeHelper"; |
| 110 | } |
| 111 | |
| 112 | def getMIMGInfo : SearchIndex { |
| 113 | let Table = MIMGInfoTable; |
| 114 | let Key = ["Opcode"]; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 115 | } |
| 116 | |
| 117 | class MIMG_NoSampler_Helper <bits<7> op, string asm, |
| 118 | RegisterClass dst_rc, |
| 119 | RegisterClass addr_rc, |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 120 | string dns=""> |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 121 | : MIMG <(outs dst_rc:$vdata), dns>, |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 122 | MIMGe<op> { |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 123 | let ssamp = 0; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 124 | let d16 = !if(BaseOpcode.HasD16, ?, 0); |
| Changpeng Fang | 4737e89 | 2018-01-18 22:08:53 +0000 | [diff] [blame] | 125 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 126 | let InOperandList = !con((ins addr_rc:$vaddr, SReg_256:$srsrc, |
| 127 | DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc, |
| 128 | R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da), |
| 129 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 130 | let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da" |
| 131 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 132 | } |
| 133 | |
| 134 | multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm, |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 135 | RegisterClass dst_rc, |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 136 | bit enableDisasm> { |
| 137 | let VAddrDwords = 1 in |
| 138 | def NAME # _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VGPR_32, |
| 139 | !if(enableDisasm, "AMDGPU", "")>; |
| 140 | let VAddrDwords = 2 in |
| 141 | def NAME # _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>; |
| 142 | let VAddrDwords = 3 in |
| 143 | def NAME # _V3 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_96>; |
| 144 | let VAddrDwords = 4 in |
| 145 | def NAME # _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 146 | } |
| 147 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 148 | multiclass MIMG_NoSampler <bits<7> op, string asm, bit has_d16, bit mip = 0, |
| 149 | bit isResInfo = 0> { |
| 150 | def "" : MIMGBaseOpcode { |
| 151 | let Coordinates = !if(isResInfo, 0, 1); |
| 152 | let LodOrClampOrMip = mip; |
| 153 | let HasD16 = has_d16; |
| 154 | } |
| 155 | |
| 156 | let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), |
| 157 | mayLoad = !if(isResInfo, 0, 1) in { |
| 158 | let VDataDwords = 1 in |
| 159 | defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VGPR_32, 1>; |
| 160 | let VDataDwords = 2 in |
| 161 | defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 0>; |
| 162 | let VDataDwords = 3 in |
| 163 | defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 0>; |
| 164 | let VDataDwords = 4 in |
| 165 | defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 0>; |
| 166 | } |
| Dmitry Preobrazhensky | 2456ac6 | 2018-03-28 15:44:16 +0000 | [diff] [blame] | 167 | } |
| 168 | |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 169 | class MIMG_Store_Helper <bits<7> op, string asm, |
| 170 | RegisterClass data_rc, |
| Matt Arsenault | cad7fa8 | 2017-12-13 21:07:51 +0000 | [diff] [blame] | 171 | RegisterClass addr_rc, |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 172 | string dns = ""> |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 173 | : MIMG <(outs), dns>, |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 174 | MIMGe<op> { |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 175 | let ssamp = 0; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 176 | let d16 = !if(BaseOpcode.HasD16, ?, 0); |
| 177 | |
| Matt Arsenault | d94b63d | 2017-12-29 17:18:18 +0000 | [diff] [blame] | 178 | let mayLoad = 0; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 179 | let mayStore = 1; |
| Matt Arsenault | d94b63d | 2017-12-29 17:18:18 +0000 | [diff] [blame] | 180 | let hasSideEffects = 0; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 181 | let hasPostISelHook = 0; |
| 182 | let DisableWQM = 1; |
| Changpeng Fang | 4737e89 | 2018-01-18 22:08:53 +0000 | [diff] [blame] | 183 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 184 | let InOperandList = !con((ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc, |
| 185 | DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc, |
| 186 | R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da), |
| 187 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 188 | let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da" |
| 189 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 190 | } |
| 191 | |
| 192 | multiclass MIMG_Store_Addr_Helper <bits<7> op, string asm, |
| 193 | RegisterClass data_rc, |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 194 | bit enableDisasm> { |
| 195 | let VAddrDwords = 1 in |
| 196 | def NAME # _V1 : MIMG_Store_Helper <op, asm, data_rc, VGPR_32, |
| 197 | !if(enableDisasm, "AMDGPU", "")>; |
| 198 | let VAddrDwords = 2 in |
| 199 | def NAME # _V2 : MIMG_Store_Helper <op, asm, data_rc, VReg_64>; |
| 200 | let VAddrDwords = 3 in |
| 201 | def NAME # _V3 : MIMG_Store_Helper <op, asm, data_rc, VReg_96>; |
| 202 | let VAddrDwords = 4 in |
| 203 | def NAME # _V4 : MIMG_Store_Helper <op, asm, data_rc, VReg_128>; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 204 | } |
| 205 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 206 | multiclass MIMG_Store <bits<7> op, string asm, bit has_d16, bit mip = 0> { |
| 207 | def "" : MIMGBaseOpcode { |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 208 | let Store = 1; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 209 | let LodOrClampOrMip = mip; |
| 210 | let HasD16 = has_d16; |
| 211 | } |
| 212 | |
| 213 | let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in { |
| 214 | let VDataDwords = 1 in |
| 215 | defm _V1 : MIMG_Store_Addr_Helper <op, asm, VGPR_32, 1>; |
| 216 | let VDataDwords = 2 in |
| 217 | defm _V2 : MIMG_Store_Addr_Helper <op, asm, VReg_64, 0>; |
| 218 | let VDataDwords = 3 in |
| 219 | defm _V3 : MIMG_Store_Addr_Helper <op, asm, VReg_96, 0>; |
| 220 | let VDataDwords = 4 in |
| 221 | defm _V4 : MIMG_Store_Addr_Helper <op, asm, VReg_128, 0>; |
| 222 | } |
| Dmitry Preobrazhensky | 2456ac6 | 2018-03-28 15:44:16 +0000 | [diff] [blame] | 223 | } |
| 224 | |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 225 | class MIMG_Atomic_Helper <string asm, RegisterClass data_rc, |
| Dmitry Preobrazhensky | 6cb42e7 | 2018-01-26 14:07:38 +0000 | [diff] [blame] | 226 | RegisterClass addr_rc, string dns="", |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 227 | bit enableDasm = 0> |
| 228 | : MIMG <(outs data_rc:$vdst), !if(enableDasm, dns, "")> { |
| Matt Arsenault | d94b63d | 2017-12-29 17:18:18 +0000 | [diff] [blame] | 229 | let mayLoad = 1; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 230 | let mayStore = 1; |
| Matt Arsenault | d94b63d | 2017-12-29 17:18:18 +0000 | [diff] [blame] | 231 | let hasSideEffects = 1; // FIXME: Remove this |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 232 | let hasPostISelHook = 0; |
| 233 | let DisableWQM = 1; |
| 234 | let Constraints = "$vdst = $vdata"; |
| 235 | let AsmMatchConverter = "cvtMIMGAtomic"; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 236 | |
| 237 | let InOperandList = (ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc, |
| 238 | DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc, |
| 239 | R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da); |
| 240 | let AsmString = asm#" $vdst, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da"; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 241 | } |
| 242 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 243 | multiclass MIMG_Atomic_Helper_m <mimg op, string asm, RegisterClass data_rc, |
| 244 | RegisterClass addr_rc, bit enableDasm = 0> { |
| Nicolai Haehnle | db6911a | 2018-06-21 13:37:45 +0000 | [diff] [blame] | 245 | let ssamp = 0, d16 = 0 in { |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 246 | def _si : MIMG_Atomic_Helper<asm, data_rc, addr_rc, "SICI", enableDasm>, |
| 247 | SIMCInstr<NAME, SIEncodingFamily.SI>, |
| 248 | MIMGe<op.SI> { |
| 249 | let AssemblerPredicates = [isSICI]; |
| 250 | let DisableDecoder = DisableSIDecoder; |
| 251 | } |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 252 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 253 | def _vi : MIMG_Atomic_Helper<asm, data_rc, addr_rc, "VI", enableDasm>, |
| 254 | SIMCInstr<NAME, SIEncodingFamily.VI>, |
| 255 | MIMGe<op.VI> { |
| 256 | let AssemblerPredicates = [isVI]; |
| 257 | let DisableDecoder = DisableVIDecoder; |
| 258 | let MIMGEncoding = MIMGEncGfx8; |
| 259 | } |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 260 | } |
| 261 | } |
| 262 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 263 | multiclass MIMG_Atomic_Addr_Helper_m <mimg op, string asm, |
| Dmitry Preobrazhensky | 0b4eb1e | 2018-01-26 15:43:29 +0000 | [diff] [blame] | 264 | RegisterClass data_rc, |
| Dmitry Preobrazhensky | 0b4eb1e | 2018-01-26 15:43:29 +0000 | [diff] [blame] | 265 | bit enableDasm = 0> { |
| Dmitry Preobrazhensky | 6cb42e7 | 2018-01-26 14:07:38 +0000 | [diff] [blame] | 266 | // _V* variants have different address size, but the size is not encoded. |
| 267 | // So only one variant can be disassembled. V1 looks the safest to decode. |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 268 | let VAddrDwords = 1 in |
| 269 | defm _V1 : MIMG_Atomic_Helper_m <op, asm, data_rc, VGPR_32, enableDasm>; |
| 270 | let VAddrDwords = 2 in |
| 271 | defm _V2 : MIMG_Atomic_Helper_m <op, asm, data_rc, VReg_64>; |
| 272 | let VAddrDwords = 3 in |
| 273 | defm _V3 : MIMG_Atomic_Helper_m <op, asm, data_rc, VReg_96>; |
| 274 | let VAddrDwords = 4 in |
| 275 | defm _V4 : MIMG_Atomic_Helper_m <op, asm, data_rc, VReg_128>; |
| Dmitry Preobrazhensky | 0b4eb1e | 2018-01-26 15:43:29 +0000 | [diff] [blame] | 276 | } |
| 277 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 278 | multiclass MIMG_Atomic <mimg op, string asm, bit isCmpSwap = 0> { // 64-bit atomics |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 279 | def "" : MIMGBaseOpcode { |
| 280 | let Atomic = 1; |
| 281 | let AtomicX2 = isCmpSwap; |
| 282 | } |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 283 | |
| 284 | let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in { |
| 285 | // _V* variants have different dst size, but the size is encoded implicitly, |
| 286 | // using dmask and tfe. Only 32-bit variant is registered with disassembler. |
| 287 | // Other variants are reconstructed by disassembler using dmask and tfe. |
| 288 | let VDataDwords = !if(isCmpSwap, 2, 1) in |
| 289 | defm _V1 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_64, VGPR_32), 1>; |
| 290 | let VDataDwords = !if(isCmpSwap, 4, 2) in |
| 291 | defm _V2 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_128, VReg_64)>; |
| 292 | } |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 293 | } |
| 294 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 295 | class MIMG_Sampler_Helper <bits<7> op, string asm, RegisterClass dst_rc, |
| 296 | RegisterClass src_rc, string dns=""> |
| 297 | : MIMG <(outs dst_rc:$vdata), dns>, |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 298 | MIMGe<op> { |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 299 | let d16 = !if(BaseOpcode.HasD16, ?, 0); |
| Changpeng Fang | 4737e89 | 2018-01-18 22:08:53 +0000 | [diff] [blame] | 300 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 301 | let InOperandList = !con((ins src_rc:$vaddr, SReg_256:$srsrc, SReg_128:$ssamp, |
| 302 | DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc, |
| 303 | R128:$r128, TFE:$tfe, LWE:$lwe, DA:$da), |
| 304 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 305 | let AsmString = asm#" $vdata, $vaddr, $srsrc, $ssamp$dmask$unorm$glc$slc$r128$tfe$lwe$da" |
| 306 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 307 | } |
| 308 | |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame^] | 309 | class MIMGAddrSize<int dw, bit enable_disasm> { |
| 310 | int NumWords = dw; |
| 311 | |
| 312 | RegisterClass RegClass = !if(!le(NumWords, 0), ?, |
| 313 | !if(!eq(NumWords, 1), VGPR_32, |
| 314 | !if(!eq(NumWords, 2), VReg_64, |
| 315 | !if(!eq(NumWords, 3), VReg_96, |
| 316 | !if(!eq(NumWords, 4), VReg_128, |
| 317 | !if(!le(NumWords, 8), VReg_256, |
| 318 | !if(!le(NumWords, 16), VReg_512, ?))))))); |
| 319 | |
| 320 | // Whether the instruction variant with this vaddr size should be enabled for |
| 321 | // the auto-generated disassembler. |
| 322 | bit Disassemble = enable_disasm; |
| 323 | } |
| 324 | |
| 325 | // Return whether a value inside the range [min, max] (endpoints inclusive) |
| 326 | // is in the given list. |
| 327 | class isRangeInList<int min, int max, list<int> lst> { |
| 328 | bit ret = !foldl(0, lst, lhs, y, !or(lhs, !and(!le(min, y), !le(y, max)))); |
| 329 | } |
| 330 | |
| 331 | class MIMGAddrSizes_tmp<list<MIMGAddrSize> lst, int min> { |
| 332 | list<MIMGAddrSize> List = lst; |
| 333 | int Min = min; |
| 334 | } |
| 335 | |
| 336 | class MIMG_Sampler_AddrSizes<AMDGPUSampleVariant sample> { |
| 337 | // List of all possible numbers of address words, taking all combinations of |
| 338 | // A16 and image dimension into account (note: no MSAA, since this is for |
| 339 | // sample/gather ops). |
| 340 | list<int> AllNumAddrWords = |
| 341 | !foreach(dw, !if(sample.Gradients, |
| 342 | !if(!eq(sample.LodOrClamp, ""), |
| 343 | [2, 3, 4, 5, 6, 7, 9], |
| 344 | [2, 3, 4, 5, 7, 8, 10]), |
| 345 | !if(!eq(sample.LodOrClamp, ""), |
| 346 | [1, 2, 3], |
| 347 | [1, 2, 3, 4])), |
| 348 | !add(dw, !size(sample.ExtraAddrArgs))); |
| 349 | |
| 350 | // Generate machine instructions based on possible register classes for the |
| 351 | // required numbers of address words. The disassembler defaults to the |
| 352 | // smallest register class. |
| 353 | list<MIMGAddrSize> MachineInstrs = |
| 354 | !foldl(MIMGAddrSizes_tmp<[], 0>, [1, 2, 3, 4, 8, 16], lhs, dw, |
| 355 | !if(isRangeInList<lhs.Min, dw, AllNumAddrWords>.ret, |
| 356 | MIMGAddrSizes_tmp< |
| 357 | !listconcat(lhs.List, [MIMGAddrSize<dw, !empty(lhs.List)>]), |
| 358 | !if(!eq(dw, 3), 3, !add(dw, 1))>, // we still need _V4 for codegen w/ 3 dwords |
| 359 | lhs)).List; |
| 360 | } |
| 361 | |
| 362 | multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm, |
| 363 | AMDGPUSampleVariant sample, RegisterClass dst_rc, |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 364 | bit enableDisasm = 0> { |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame^] | 365 | foreach addr = MIMG_Sampler_AddrSizes<sample>.MachineInstrs in { |
| 366 | let VAddrDwords = addr.NumWords in |
| 367 | def _V # addr.NumWords |
| 368 | : MIMG_Sampler_Helper <op, asm, dst_rc, addr.RegClass, |
| 369 | !if(!and(enableDisasm, addr.Disassemble), "AMDGPU", "")>; |
| 370 | } |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 371 | } |
| 372 | |
| 373 | class MIMG_Sampler_BaseOpcode<AMDGPUSampleVariant sample> |
| 374 | : MIMGBaseOpcode { |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 375 | let Sampler = 1; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 376 | let NumExtraArgs = !size(sample.ExtraAddrArgs); |
| 377 | let Gradients = sample.Gradients; |
| 378 | let LodOrClampOrMip = !ne(sample.LodOrClamp, ""); |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 379 | } |
| 380 | |
| Nicolai Haehnle | 2367f03 | 2018-06-21 13:36:13 +0000 | [diff] [blame] | 381 | multiclass MIMG_Sampler <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0, |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 382 | bit isGetLod = 0, |
| Nicolai Haehnle | 2367f03 | 2018-06-21 13:36:13 +0000 | [diff] [blame] | 383 | string asm = "image_sample"#sample.LowerCaseMod> { |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 384 | def "" : MIMG_Sampler_BaseOpcode<sample> { |
| 385 | let HasD16 = !if(isGetLod, 0, 1); |
| 386 | } |
| 387 | |
| 388 | let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm, |
| 389 | mayLoad = !if(isGetLod, 0, 1) in { |
| 390 | let VDataDwords = 1 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame^] | 391 | defm _V1 : MIMG_Sampler_Src_Helper<op, asm, sample, VGPR_32, 1>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 392 | let VDataDwords = 2 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame^] | 393 | defm _V2 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_64>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 394 | let VDataDwords = 3 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame^] | 395 | defm _V3 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_96>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 396 | let VDataDwords = 4 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame^] | 397 | defm _V4 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_128>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 398 | } |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 399 | } |
| 400 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 401 | multiclass MIMG_Sampler_WQM <bits<7> op, AMDGPUSampleVariant sample> |
| 402 | : MIMG_Sampler<op, sample, 1>; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 403 | |
| Nicolai Haehnle | 2367f03 | 2018-06-21 13:36:13 +0000 | [diff] [blame] | 404 | multiclass MIMG_Gather <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0, |
| 405 | string asm = "image_gather4"#sample.LowerCaseMod> { |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 406 | def "" : MIMG_Sampler_BaseOpcode<sample> { |
| 407 | let HasD16 = 1; |
| 408 | } |
| 409 | |
| 410 | let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm, |
| 411 | Gather4 = 1, hasPostISelHook = 0 in { |
| 412 | let VDataDwords = 2 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame^] | 413 | defm _V2 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_64>; /* for packed D16 only */ |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 414 | let VDataDwords = 4 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame^] | 415 | defm _V4 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_128, 1>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 416 | } |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 417 | } |
| 418 | |
| Nicolai Haehnle | 2367f03 | 2018-06-21 13:36:13 +0000 | [diff] [blame] | 419 | multiclass MIMG_Gather_WQM <bits<7> op, AMDGPUSampleVariant sample> |
| 420 | : MIMG_Gather<op, sample, 1>; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 421 | |
| 422 | //===----------------------------------------------------------------------===// |
| 423 | // MIMG Instructions |
| 424 | //===----------------------------------------------------------------------===// |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 425 | defm IMAGE_LOAD : MIMG_NoSampler <0x00000000, "image_load", 1>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 426 | defm IMAGE_LOAD_MIP : MIMG_NoSampler <0x00000001, "image_load_mip", 1, 1>; |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 427 | defm IMAGE_LOAD_PCK : MIMG_NoSampler <0x00000002, "image_load_pck", 0>; |
| 428 | defm IMAGE_LOAD_PCK_SGN : MIMG_NoSampler <0x00000003, "image_load_pck_sgn", 0>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 429 | defm IMAGE_LOAD_MIP_PCK : MIMG_NoSampler <0x00000004, "image_load_mip_pck", 0, 1>; |
| 430 | defm IMAGE_LOAD_MIP_PCK_SGN : MIMG_NoSampler <0x00000005, "image_load_mip_pck_sgn", 0, 1>; |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 431 | defm IMAGE_STORE : MIMG_Store <0x00000008, "image_store", 1>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 432 | defm IMAGE_STORE_MIP : MIMG_Store <0x00000009, "image_store_mip", 1, 1>; |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 433 | defm IMAGE_STORE_PCK : MIMG_Store <0x0000000a, "image_store_pck", 0>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 434 | defm IMAGE_STORE_MIP_PCK : MIMG_Store <0x0000000b, "image_store_mip_pck", 0, 1>; |
| Matt Arsenault | 856777d | 2017-12-08 20:00:57 +0000 | [diff] [blame] | 435 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 436 | defm IMAGE_GET_RESINFO : MIMG_NoSampler <0x0000000e, "image_get_resinfo", 0, 1, 1>; |
| Matt Arsenault | 856777d | 2017-12-08 20:00:57 +0000 | [diff] [blame] | 437 | |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 438 | defm IMAGE_ATOMIC_SWAP : MIMG_Atomic <mimg<0x0f, 0x10>, "image_atomic_swap">; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 439 | defm IMAGE_ATOMIC_CMPSWAP : MIMG_Atomic <mimg<0x10, 0x11>, "image_atomic_cmpswap", 1>; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 440 | defm IMAGE_ATOMIC_ADD : MIMG_Atomic <mimg<0x11, 0x12>, "image_atomic_add">; |
| 441 | defm IMAGE_ATOMIC_SUB : MIMG_Atomic <mimg<0x12, 0x13>, "image_atomic_sub">; |
| 442 | //def IMAGE_ATOMIC_RSUB : MIMG_NoPattern_ <"image_atomic_rsub", 0x00000013>; -- not on VI |
| 443 | defm IMAGE_ATOMIC_SMIN : MIMG_Atomic <mimg<0x14>, "image_atomic_smin">; |
| 444 | defm IMAGE_ATOMIC_UMIN : MIMG_Atomic <mimg<0x15>, "image_atomic_umin">; |
| 445 | defm IMAGE_ATOMIC_SMAX : MIMG_Atomic <mimg<0x16>, "image_atomic_smax">; |
| 446 | defm IMAGE_ATOMIC_UMAX : MIMG_Atomic <mimg<0x17>, "image_atomic_umax">; |
| 447 | defm IMAGE_ATOMIC_AND : MIMG_Atomic <mimg<0x18>, "image_atomic_and">; |
| 448 | defm IMAGE_ATOMIC_OR : MIMG_Atomic <mimg<0x19>, "image_atomic_or">; |
| 449 | defm IMAGE_ATOMIC_XOR : MIMG_Atomic <mimg<0x1a>, "image_atomic_xor">; |
| 450 | defm IMAGE_ATOMIC_INC : MIMG_Atomic <mimg<0x1b>, "image_atomic_inc">; |
| 451 | defm IMAGE_ATOMIC_DEC : MIMG_Atomic <mimg<0x1c>, "image_atomic_dec">; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 452 | //def IMAGE_ATOMIC_FCMPSWAP : MIMG_NoPattern_ <"image_atomic_fcmpswap", 0x0000001d, 1>; -- not on VI |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 453 | //def IMAGE_ATOMIC_FMIN : MIMG_NoPattern_ <"image_atomic_fmin", 0x0000001e>; -- not on VI |
| 454 | //def IMAGE_ATOMIC_FMAX : MIMG_NoPattern_ <"image_atomic_fmax", 0x0000001f>; -- not on VI |
| Nicolai Haehnle | 2367f03 | 2018-06-21 13:36:13 +0000 | [diff] [blame] | 455 | defm IMAGE_SAMPLE : MIMG_Sampler_WQM <0x00000020, AMDGPUSample>; |
| 456 | defm IMAGE_SAMPLE_CL : MIMG_Sampler_WQM <0x00000021, AMDGPUSample_cl>; |
| 457 | defm IMAGE_SAMPLE_D : MIMG_Sampler <0x00000022, AMDGPUSample_d>; |
| 458 | defm IMAGE_SAMPLE_D_CL : MIMG_Sampler <0x00000023, AMDGPUSample_d_cl>; |
| 459 | defm IMAGE_SAMPLE_L : MIMG_Sampler <0x00000024, AMDGPUSample_l>; |
| 460 | defm IMAGE_SAMPLE_B : MIMG_Sampler_WQM <0x00000025, AMDGPUSample_b>; |
| 461 | defm IMAGE_SAMPLE_B_CL : MIMG_Sampler_WQM <0x00000026, AMDGPUSample_b_cl>; |
| 462 | defm IMAGE_SAMPLE_LZ : MIMG_Sampler <0x00000027, AMDGPUSample_lz>; |
| 463 | defm IMAGE_SAMPLE_C : MIMG_Sampler_WQM <0x00000028, AMDGPUSample_c>; |
| 464 | defm IMAGE_SAMPLE_C_CL : MIMG_Sampler_WQM <0x00000029, AMDGPUSample_c_cl>; |
| 465 | defm IMAGE_SAMPLE_C_D : MIMG_Sampler <0x0000002a, AMDGPUSample_c_d>; |
| 466 | defm IMAGE_SAMPLE_C_D_CL : MIMG_Sampler <0x0000002b, AMDGPUSample_c_d_cl>; |
| 467 | defm IMAGE_SAMPLE_C_L : MIMG_Sampler <0x0000002c, AMDGPUSample_c_l>; |
| 468 | defm IMAGE_SAMPLE_C_B : MIMG_Sampler_WQM <0x0000002d, AMDGPUSample_c_b>; |
| 469 | defm IMAGE_SAMPLE_C_B_CL : MIMG_Sampler_WQM <0x0000002e, AMDGPUSample_c_b_cl>; |
| 470 | defm IMAGE_SAMPLE_C_LZ : MIMG_Sampler <0x0000002f, AMDGPUSample_c_lz>; |
| 471 | defm IMAGE_SAMPLE_O : MIMG_Sampler_WQM <0x00000030, AMDGPUSample_o>; |
| 472 | defm IMAGE_SAMPLE_CL_O : MIMG_Sampler_WQM <0x00000031, AMDGPUSample_cl_o>; |
| 473 | defm IMAGE_SAMPLE_D_O : MIMG_Sampler <0x00000032, AMDGPUSample_d_o>; |
| 474 | defm IMAGE_SAMPLE_D_CL_O : MIMG_Sampler <0x00000033, AMDGPUSample_d_cl_o>; |
| 475 | defm IMAGE_SAMPLE_L_O : MIMG_Sampler <0x00000034, AMDGPUSample_l_o>; |
| 476 | defm IMAGE_SAMPLE_B_O : MIMG_Sampler_WQM <0x00000035, AMDGPUSample_b_o>; |
| 477 | defm IMAGE_SAMPLE_B_CL_O : MIMG_Sampler_WQM <0x00000036, AMDGPUSample_b_cl_o>; |
| 478 | defm IMAGE_SAMPLE_LZ_O : MIMG_Sampler <0x00000037, AMDGPUSample_lz_o>; |
| 479 | defm IMAGE_SAMPLE_C_O : MIMG_Sampler_WQM <0x00000038, AMDGPUSample_c_o>; |
| 480 | defm IMAGE_SAMPLE_C_CL_O : MIMG_Sampler_WQM <0x00000039, AMDGPUSample_c_cl_o>; |
| 481 | defm IMAGE_SAMPLE_C_D_O : MIMG_Sampler <0x0000003a, AMDGPUSample_c_d_o>; |
| 482 | defm IMAGE_SAMPLE_C_D_CL_O : MIMG_Sampler <0x0000003b, AMDGPUSample_c_d_cl_o>; |
| 483 | defm IMAGE_SAMPLE_C_L_O : MIMG_Sampler <0x0000003c, AMDGPUSample_c_l_o>; |
| 484 | defm IMAGE_SAMPLE_C_B_CL_O : MIMG_Sampler_WQM <0x0000003e, AMDGPUSample_c_b_cl_o>; |
| 485 | defm IMAGE_SAMPLE_C_B_O : MIMG_Sampler_WQM <0x0000003d, AMDGPUSample_c_b_o>; |
| 486 | defm IMAGE_SAMPLE_C_LZ_O : MIMG_Sampler <0x0000003f, AMDGPUSample_c_lz_o>; |
| 487 | defm IMAGE_GATHER4 : MIMG_Gather_WQM <0x00000040, AMDGPUSample>; |
| 488 | defm IMAGE_GATHER4_CL : MIMG_Gather_WQM <0x00000041, AMDGPUSample_cl>; |
| 489 | defm IMAGE_GATHER4_L : MIMG_Gather <0x00000044, AMDGPUSample_l>; |
| 490 | defm IMAGE_GATHER4_B : MIMG_Gather_WQM <0x00000045, AMDGPUSample_b>; |
| 491 | defm IMAGE_GATHER4_B_CL : MIMG_Gather_WQM <0x00000046, AMDGPUSample_b_cl>; |
| 492 | defm IMAGE_GATHER4_LZ : MIMG_Gather <0x00000047, AMDGPUSample_lz>; |
| 493 | defm IMAGE_GATHER4_C : MIMG_Gather_WQM <0x00000048, AMDGPUSample_c>; |
| 494 | defm IMAGE_GATHER4_C_CL : MIMG_Gather_WQM <0x00000049, AMDGPUSample_c_cl>; |
| 495 | defm IMAGE_GATHER4_C_L : MIMG_Gather <0x0000004c, AMDGPUSample_c_l>; |
| 496 | defm IMAGE_GATHER4_C_B : MIMG_Gather_WQM <0x0000004d, AMDGPUSample_c_b>; |
| 497 | defm IMAGE_GATHER4_C_B_CL : MIMG_Gather_WQM <0x0000004e, AMDGPUSample_c_b_cl>; |
| 498 | defm IMAGE_GATHER4_C_LZ : MIMG_Gather <0x0000004f, AMDGPUSample_c_lz>; |
| 499 | defm IMAGE_GATHER4_O : MIMG_Gather_WQM <0x00000050, AMDGPUSample_o>; |
| 500 | defm IMAGE_GATHER4_CL_O : MIMG_Gather_WQM <0x00000051, AMDGPUSample_cl_o>; |
| 501 | defm IMAGE_GATHER4_L_O : MIMG_Gather <0x00000054, AMDGPUSample_l_o>; |
| 502 | defm IMAGE_GATHER4_B_O : MIMG_Gather_WQM <0x00000055, AMDGPUSample_b_o>; |
| 503 | defm IMAGE_GATHER4_B_CL_O : MIMG_Gather <0x00000056, AMDGPUSample_b_cl_o>; |
| 504 | defm IMAGE_GATHER4_LZ_O : MIMG_Gather <0x00000057, AMDGPUSample_lz_o>; |
| 505 | defm IMAGE_GATHER4_C_O : MIMG_Gather_WQM <0x00000058, AMDGPUSample_c_o>; |
| 506 | defm IMAGE_GATHER4_C_CL_O : MIMG_Gather_WQM <0x00000059, AMDGPUSample_c_cl_o>; |
| 507 | defm IMAGE_GATHER4_C_L_O : MIMG_Gather <0x0000005c, AMDGPUSample_c_l_o>; |
| 508 | defm IMAGE_GATHER4_C_B_O : MIMG_Gather_WQM <0x0000005d, AMDGPUSample_c_b_o>; |
| 509 | defm IMAGE_GATHER4_C_B_CL_O : MIMG_Gather_WQM <0x0000005e, AMDGPUSample_c_b_cl_o>; |
| 510 | defm IMAGE_GATHER4_C_LZ_O : MIMG_Gather <0x0000005f, AMDGPUSample_c_lz_o>; |
| Matt Arsenault | 856777d | 2017-12-08 20:00:57 +0000 | [diff] [blame] | 511 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 512 | defm IMAGE_GET_LOD : MIMG_Sampler <0x00000060, AMDGPUSample, 1, 1, "image_get_lod">; |
| Matt Arsenault | 856777d | 2017-12-08 20:00:57 +0000 | [diff] [blame] | 513 | |
| Nicolai Haehnle | 2367f03 | 2018-06-21 13:36:13 +0000 | [diff] [blame] | 514 | defm IMAGE_SAMPLE_CD : MIMG_Sampler <0x00000068, AMDGPUSample_cd>; |
| 515 | defm IMAGE_SAMPLE_CD_CL : MIMG_Sampler <0x00000069, AMDGPUSample_cd_cl>; |
| 516 | defm IMAGE_SAMPLE_C_CD : MIMG_Sampler <0x0000006a, AMDGPUSample_c_cd>; |
| 517 | defm IMAGE_SAMPLE_C_CD_CL : MIMG_Sampler <0x0000006b, AMDGPUSample_c_cd_cl>; |
| 518 | defm IMAGE_SAMPLE_CD_O : MIMG_Sampler <0x0000006c, AMDGPUSample_cd_o>; |
| 519 | defm IMAGE_SAMPLE_CD_CL_O : MIMG_Sampler <0x0000006d, AMDGPUSample_cd_cl_o>; |
| 520 | defm IMAGE_SAMPLE_C_CD_O : MIMG_Sampler <0x0000006e, AMDGPUSample_c_cd_o>; |
| 521 | defm IMAGE_SAMPLE_C_CD_CL_O : MIMG_Sampler <0x0000006f, AMDGPUSample_c_cd_cl_o>; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 522 | //def IMAGE_RSRC256 : MIMG_NoPattern_RSRC256 <"image_rsrc256", 0x0000007e>; |
| 523 | //def IMAGE_SAMPLER : MIMG_NoPattern_ <"image_sampler", 0x0000007f>; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 524 | |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 525 | /********** ========================================= **********/ |
| 526 | /********** Table of dimension-aware image intrinsics **********/ |
| 527 | /********** ========================================= **********/ |
| Nicolai Haehnle | 2f5a738 | 2018-04-04 10:58:54 +0000 | [diff] [blame] | 528 | |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 529 | class ImageDimIntrinsicInfo<AMDGPUImageDimIntrinsic I> { |
| 530 | Intrinsic Intr = I; |
| 531 | MIMGBaseOpcode BaseOpcode = !cast<MIMGBaseOpcode>(!strconcat("IMAGE_", I.P.OpMod)); |
| 532 | AMDGPUDimProps Dim = I.P.Dim; |
| Nicolai Haehnle | 2f5a738 | 2018-04-04 10:58:54 +0000 | [diff] [blame] | 533 | } |
| 534 | |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 535 | def ImageDimIntrinsicTable : GenericTable { |
| 536 | let FilterClass = "ImageDimIntrinsicInfo"; |
| 537 | let Fields = ["Intr", "BaseOpcode", "Dim"]; |
| 538 | GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode; |
| 539 | GenericEnum TypeOf_Dim = MIMGDim; |
| Nicolai Haehnle | 2f5a738 | 2018-04-04 10:58:54 +0000 | [diff] [blame] | 540 | |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 541 | let PrimaryKey = ["Intr"]; |
| 542 | let PrimaryKeyName = "getImageDimIntrinsicInfo"; |
| 543 | let PrimaryKeyEarlyOut = 1; |
| Nicolai Haehnle | 2f5a738 | 2018-04-04 10:58:54 +0000 | [diff] [blame] | 544 | } |
| 545 | |
| 546 | foreach intr = !listconcat(AMDGPUImageDimIntrinsics, |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 547 | AMDGPUImageDimAtomicIntrinsics) in { |
| 548 | def : ImageDimIntrinsicInfo<intr>; |
| Nicolai Haehnle | 2f5a738 | 2018-04-04 10:58:54 +0000 | [diff] [blame] | 549 | } |