| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 1 | //===-- MIMGInstructions.td - MIMG Instruction Defintions -----------------===// |
| 2 | // |
| Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 9 | // MIMG-specific encoding families to distinguish between semantically |
| 10 | // equivalent machine instructions with different encoding. |
| 11 | // |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 12 | // - MIMGEncGfx6: encoding introduced with gfx6 (obsoleted for atomics in gfx8) |
| 13 | // - MIMGEncGfx8: encoding introduced with gfx8 for atomics |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 14 | // - MIMGEncGfx10Default: gfx default (non-NSA) encoding |
| 15 | // - MIMGEncGfx10NSA: gfx10 NSA encoding |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 16 | class MIMGEncoding; |
| 17 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 18 | def MIMGEncGfx6 : MIMGEncoding; |
| 19 | def MIMGEncGfx8 : MIMGEncoding; |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 20 | def MIMGEncGfx10Default : MIMGEncoding; |
| 21 | def MIMGEncGfx10NSA : MIMGEncoding; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 22 | |
| 23 | def MIMGEncoding : GenericEnum { |
| 24 | let FilterClass = "MIMGEncoding"; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 25 | } |
| 26 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 27 | // Represent an ISA-level opcode, independent of the encoding and the |
| 28 | // vdata/vaddr size. |
| 29 | class MIMGBaseOpcode { |
| 30 | MIMGBaseOpcode BaseOpcode = !cast<MIMGBaseOpcode>(NAME); |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 31 | bit Store = 0; |
| 32 | bit Atomic = 0; |
| 33 | bit AtomicX2 = 0; // (f)cmpswap |
| 34 | bit Sampler = 0; |
| David Stuttard | f77079f | 2019-01-14 11:55:24 +0000 | [diff] [blame] | 35 | bit Gather4 = 0; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 36 | bits<8> NumExtraArgs = 0; |
| 37 | bit Gradients = 0; |
| 38 | bit Coordinates = 1; |
| 39 | bit LodOrClampOrMip = 0; |
| 40 | bit HasD16 = 0; |
| Dmitry Preobrazhensky | 0b4eb1e | 2018-01-26 15:43:29 +0000 | [diff] [blame] | 41 | } |
| 42 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 43 | def MIMGBaseOpcode : GenericEnum { |
| 44 | let FilterClass = "MIMGBaseOpcode"; |
| 45 | } |
| 46 | |
| 47 | def MIMGBaseOpcodesTable : GenericTable { |
| 48 | let FilterClass = "MIMGBaseOpcode"; |
| 49 | let CppTypeName = "MIMGBaseOpcodeInfo"; |
| David Stuttard | f77079f | 2019-01-14 11:55:24 +0000 | [diff] [blame] | 50 | let Fields = ["BaseOpcode", "Store", "Atomic", "AtomicX2", "Sampler", "Gather4", |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 51 | "NumExtraArgs", "Gradients", "Coordinates", "LodOrClampOrMip", |
| 52 | "HasD16"]; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 53 | GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode; |
| 54 | |
| 55 | let PrimaryKey = ["BaseOpcode"]; |
| 56 | let PrimaryKeyName = "getMIMGBaseOpcodeInfo"; |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 57 | } |
| 58 | |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 59 | def MIMGDim : GenericEnum { |
| 60 | let FilterClass = "AMDGPUDimProps"; |
| 61 | } |
| 62 | |
| 63 | def MIMGDimInfoTable : GenericTable { |
| 64 | let FilterClass = "AMDGPUDimProps"; |
| 65 | let CppTypeName = "MIMGDimInfo"; |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 66 | let Fields = ["Dim", "NumCoords", "NumGradients", "DA", "Encoding", "AsmSuffix"]; |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 67 | GenericEnum TypeOf_Dim = MIMGDim; |
| 68 | |
| 69 | let PrimaryKey = ["Dim"]; |
| 70 | let PrimaryKeyName = "getMIMGDimInfo"; |
| 71 | } |
| 72 | |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 73 | def getMIMGDimInfoByEncoding : SearchIndex { |
| 74 | let Table = MIMGDimInfoTable; |
| 75 | let Key = ["Encoding"]; |
| 76 | } |
| 77 | |
| 78 | def getMIMGDimInfoByAsmSuffix : SearchIndex { |
| 79 | let Table = MIMGDimInfoTable; |
| 80 | let Key = ["AsmSuffix"]; |
| 81 | } |
| 82 | |
| 83 | class mimg <bits<7> si_gfx10, bits<7> vi = si_gfx10> { |
| 84 | field bits<7> SI_GFX10 = si_gfx10; |
| 85 | field bits<7> VI = vi; |
| 86 | } |
| 87 | |
| Ryan Taylor | 894c8fd | 2018-08-01 12:12:01 +0000 | [diff] [blame] | 88 | class MIMGLZMapping<MIMGBaseOpcode l, MIMGBaseOpcode lz> { |
| 89 | MIMGBaseOpcode L = l; |
| 90 | MIMGBaseOpcode LZ = lz; |
| 91 | } |
| 92 | |
| 93 | def MIMGLZMappingTable : GenericTable { |
| 94 | let FilterClass = "MIMGLZMapping"; |
| 95 | let CppTypeName = "MIMGLZMappingInfo"; |
| 96 | let Fields = ["L", "LZ"]; |
| 97 | GenericEnum TypeOf_L = MIMGBaseOpcode; |
| 98 | GenericEnum TypeOf_LZ = MIMGBaseOpcode; |
| 99 | |
| 100 | let PrimaryKey = ["L"]; |
| 101 | let PrimaryKeyName = "getMIMGLZMappingInfo"; |
| 102 | } |
| 103 | |
| Piotr Sobczak | 9b11e93 | 2019-06-10 15:58:51 +0000 | [diff] [blame^] | 104 | class MIMGMIPMapping<MIMGBaseOpcode mip, MIMGBaseOpcode nonmip> { |
| 105 | MIMGBaseOpcode MIP = mip; |
| 106 | MIMGBaseOpcode NONMIP = nonmip; |
| 107 | } |
| 108 | |
| 109 | def MIMGMIPMappingTable : GenericTable { |
| 110 | let FilterClass = "MIMGMIPMapping"; |
| 111 | let CppTypeName = "MIMGMIPMappingInfo"; |
| 112 | let Fields = ["MIP", "NONMIP"]; |
| 113 | GenericEnum TypeOf_MIP = MIMGBaseOpcode; |
| 114 | GenericEnum TypeOf_NONMIP = MIMGBaseOpcode; |
| 115 | |
| 116 | let PrimaryKey = ["MIP"]; |
| 117 | let PrimaryKeyName = "getMIMGMIPMappingInfo"; |
| 118 | } |
| 119 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 120 | class MIMG <dag outs, string dns = ""> |
| 121 | : InstSI <outs, (ins), "", []> { |
| 122 | |
| 123 | let VM_CNT = 1; |
| 124 | let EXP_CNT = 1; |
| 125 | let MIMG = 1; |
| 126 | let Uses = [EXEC]; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 127 | let mayLoad = 1; |
| 128 | let mayStore = 0; |
| 129 | let hasPostISelHook = 1; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 130 | let SchedRW = [WriteVMEM]; |
| 131 | let UseNamedOperandTable = 1; |
| 132 | let hasSideEffects = 0; // XXX ???? |
| 133 | |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 134 | let DecoderNamespace = dns; |
| 135 | let isAsmParserOnly = !if(!eq(dns,""), 1, 0); |
| 136 | let AsmMatchConverter = "cvtMIMG"; |
| Tom Stellard | 244891d | 2016-12-20 15:52:17 +0000 | [diff] [blame] | 137 | let usesCustomInserter = 1; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 138 | |
| 139 | Instruction Opcode = !cast<Instruction>(NAME); |
| 140 | MIMGBaseOpcode BaseOpcode; |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 141 | MIMGEncoding MIMGEncoding; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 142 | bits<8> VDataDwords; |
| 143 | bits<8> VAddrDwords; |
| 144 | } |
| 145 | |
| 146 | def MIMGInfoTable : GenericTable { |
| 147 | let FilterClass = "MIMG"; |
| 148 | let CppTypeName = "MIMGInfo"; |
| 149 | let Fields = ["Opcode", "BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"]; |
| 150 | GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode; |
| 151 | GenericEnum TypeOf_MIMGEncoding = MIMGEncoding; |
| 152 | |
| 153 | let PrimaryKey = ["BaseOpcode", "MIMGEncoding", "VDataDwords", "VAddrDwords"]; |
| 154 | let PrimaryKeyName = "getMIMGOpcodeHelper"; |
| 155 | } |
| 156 | |
| 157 | def getMIMGInfo : SearchIndex { |
| 158 | let Table = MIMGInfoTable; |
| 159 | let Key = ["Opcode"]; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 160 | } |
| 161 | |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 162 | // This is a separate class so that TableGen memoizes the computations. |
| 163 | class MIMGNSAHelper<int num_addrs> { |
| 164 | list<string> AddrAsmNames = |
| 165 | !foldl([]<string>, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], lhs, i, |
| 166 | !if(!lt(i, num_addrs), !listconcat(lhs, ["vaddr"#!size(lhs)]), lhs)); |
| 167 | dag AddrIns = !dag(ins, !foreach(arg, AddrAsmNames, VGPR_32), AddrAsmNames); |
| 168 | string AddrAsm = "[" # !foldl("$" # !head(AddrAsmNames), !tail(AddrAsmNames), lhs, rhs, |
| 169 | lhs # ", $" # rhs) # "]"; |
| 170 | |
| 171 | int NSA = !if(!le(num_addrs, 1), ?, |
| 172 | !if(!le(num_addrs, 5), 1, |
| 173 | !if(!le(num_addrs, 9), 2, |
| 174 | !if(!le(num_addrs, 13), 3, ?)))); |
| 175 | } |
| 176 | |
| 177 | // Base class of all pre-gfx10 MIMG instructions. |
| 178 | class MIMG_gfx6789<bits<7> op, dag outs, string dns = ""> |
| 179 | : MIMG<outs, dns>, MIMGe_gfx6789<op> { |
| 180 | let SubtargetPredicate = isGFX6GFX7GFX8GFX9; |
| 181 | let AssemblerPredicates = [isGFX6GFX7GFX8GFX9]; |
| 182 | |
| 183 | let MIMGEncoding = MIMGEncGfx6; |
| 184 | |
| 185 | let d16 = !if(BaseOpcode.HasD16, ?, 0); |
| 186 | } |
| 187 | |
| 188 | // Base class of all non-NSA gfx10 MIMG instructions. |
| 189 | class MIMG_gfx10<int op, dag outs, string dns = ""> |
| 190 | : MIMG<outs, dns>, MIMGe_gfx10<op> { |
| 191 | let SubtargetPredicate = isGFX10Plus; |
| 192 | let AssemblerPredicates = [isGFX10Plus]; |
| 193 | |
| 194 | let MIMGEncoding = MIMGEncGfx10Default; |
| 195 | |
| 196 | let d16 = !if(BaseOpcode.HasD16, ?, 0); |
| 197 | let nsa = 0; |
| 198 | } |
| 199 | |
| 200 | // Base class for all NSA MIMG instructions. Note that 1-dword addresses always |
| 201 | // use non-NSA variants. |
| 202 | class MIMG_nsa_gfx10<int op, dag outs, int num_addrs, string dns=""> |
| 203 | : MIMG<outs, dns>, MIMGe_gfx10<op> { |
| 204 | let SubtargetPredicate = isGFX10Plus; |
| 205 | let AssemblerPredicates = [isGFX10Plus]; |
| 206 | |
| 207 | let MIMGEncoding = MIMGEncGfx10NSA; |
| 208 | |
| 209 | MIMGNSAHelper nsah = MIMGNSAHelper<num_addrs>; |
| 210 | dag AddrIns = nsah.AddrIns; |
| 211 | string AddrAsm = nsah.AddrAsm; |
| 212 | |
| 213 | let d16 = !if(BaseOpcode.HasD16, ?, 0); |
| 214 | let nsa = nsah.NSA; |
| 215 | } |
| 216 | |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 217 | class MIMG_NoSampler_Helper <bits<7> op, string asm, |
| 218 | RegisterClass dst_rc, |
| 219 | RegisterClass addr_rc, |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 220 | string dns=""> |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 221 | : MIMG_gfx6789 <op, (outs dst_rc:$vdata), dns> { |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 222 | let InOperandList = !con((ins addr_rc:$vaddr, SReg_256:$srsrc, |
| 223 | DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc, |
| Ryan Taylor | 1f334d0 | 2018-08-28 15:07:30 +0000 | [diff] [blame] | 224 | R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da), |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 225 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 226 | let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da" |
| 227 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 228 | } |
| 229 | |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 230 | class MIMG_NoSampler_gfx10<int op, string opcode, |
| 231 | RegisterClass DataRC, RegisterClass AddrRC, |
| 232 | string dns=""> |
| 233 | : MIMG_gfx10<op, (outs DataRC:$vdata), dns> { |
| 234 | let InOperandList = !con((ins AddrRC:$vaddr0, SReg_256:$srsrc, DMask:$dmask, |
| 235 | Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc, |
| 236 | SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe), |
| 237 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 238 | let AsmString = opcode#" $vdata, $vaddr0, $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe" |
| 239 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| 240 | } |
| 241 | |
| 242 | class MIMG_NoSampler_nsa_gfx10<int op, string opcode, |
| 243 | RegisterClass DataRC, int num_addrs, |
| 244 | string dns=""> |
| 245 | : MIMG_nsa_gfx10<op, (outs DataRC:$vdata), num_addrs, dns> { |
| 246 | let InOperandList = !con(AddrIns, |
| 247 | (ins SReg_256:$srsrc, DMask:$dmask, |
| 248 | Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc, |
| 249 | SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe), |
| 250 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 251 | let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe" |
| 252 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| 253 | } |
| 254 | |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 255 | multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm, |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 256 | RegisterClass dst_rc, |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 257 | bit enableDisasm> { |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 258 | let ssamp = 0 in { |
| 259 | let VAddrDwords = 1 in { |
| 260 | def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VGPR_32, |
| 261 | !if(enableDisasm, "AMDGPU", "")>; |
| 262 | def _V1_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VGPR_32, |
| 263 | !if(enableDisasm, "AMDGPU", "")>; |
| 264 | } |
| 265 | |
| 266 | let VAddrDwords = 2 in { |
| 267 | def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>; |
| 268 | def _V2_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VReg_64>; |
| 269 | def _V2_nsa_gfx10 : MIMG_NoSampler_nsa_gfx10<op, asm, dst_rc, 2>; |
| 270 | } |
| 271 | |
| 272 | let VAddrDwords = 3 in { |
| 273 | def _V3 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_96>; |
| 274 | def _V3_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VReg_96>; |
| 275 | def _V3_nsa_gfx10 : MIMG_NoSampler_nsa_gfx10<op, asm, dst_rc, 3>; |
| 276 | } |
| 277 | |
| 278 | let VAddrDwords = 4 in { |
| 279 | def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>; |
| 280 | def _V4_gfx10 : MIMG_NoSampler_gfx10<op, asm, dst_rc, VReg_128>; |
| 281 | def _V4_nsa_gfx10 : MIMG_NoSampler_nsa_gfx10<op, asm, dst_rc, 4, |
| 282 | !if(enableDisasm, "AMDGPU", "")>; |
| 283 | } |
| 284 | } |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 285 | } |
| 286 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 287 | multiclass MIMG_NoSampler <bits<7> op, string asm, bit has_d16, bit mip = 0, |
| 288 | bit isResInfo = 0> { |
| 289 | def "" : MIMGBaseOpcode { |
| 290 | let Coordinates = !if(isResInfo, 0, 1); |
| 291 | let LodOrClampOrMip = mip; |
| 292 | let HasD16 = has_d16; |
| 293 | } |
| 294 | |
| 295 | let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), |
| 296 | mayLoad = !if(isResInfo, 0, 1) in { |
| 297 | let VDataDwords = 1 in |
| 298 | defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VGPR_32, 1>; |
| 299 | let VDataDwords = 2 in |
| 300 | defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 0>; |
| 301 | let VDataDwords = 3 in |
| 302 | defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 0>; |
| 303 | let VDataDwords = 4 in |
| 304 | defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 0>; |
| Tim Renouf | 6f0191a | 2019-03-22 15:21:11 +0000 | [diff] [blame] | 305 | let VDataDwords = 5 in |
| 306 | defm _V5 : MIMG_NoSampler_Src_Helper <op, asm, VReg_160, 0>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 307 | } |
| Dmitry Preobrazhensky | 2456ac6 | 2018-03-28 15:44:16 +0000 | [diff] [blame] | 308 | } |
| 309 | |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 310 | class MIMG_Store_Helper <bits<7> op, string asm, |
| 311 | RegisterClass data_rc, |
| Matt Arsenault | cad7fa8 | 2017-12-13 21:07:51 +0000 | [diff] [blame] | 312 | RegisterClass addr_rc, |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 313 | string dns = ""> |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 314 | : MIMG_gfx6789<op, (outs), dns> { |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 315 | let InOperandList = !con((ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc, |
| 316 | DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc, |
| Ryan Taylor | 1f334d0 | 2018-08-28 15:07:30 +0000 | [diff] [blame] | 317 | R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da), |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 318 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 319 | let AsmString = asm#" $vdata, $vaddr, $srsrc$dmask$unorm$glc$slc$r128$tfe$lwe$da" |
| 320 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 321 | } |
| 322 | |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 323 | class MIMG_Store_gfx10<int op, string opcode, |
| 324 | RegisterClass DataRC, RegisterClass AddrRC, |
| 325 | string dns=""> |
| 326 | : MIMG_gfx10<op, (outs), dns> { |
| 327 | let InOperandList = !con((ins DataRC:$vdata, AddrRC:$vaddr0, SReg_256:$srsrc, |
| 328 | DMask:$dmask, Dim:$dim, UNorm:$unorm, DLC:$dlc, |
| 329 | GLC:$glc, SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe), |
| 330 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 331 | let AsmString = opcode#" $vdata, $vaddr0, $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe" |
| 332 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| 333 | } |
| 334 | |
| 335 | class MIMG_Store_nsa_gfx10<int op, string opcode, |
| 336 | RegisterClass DataRC, int num_addrs, |
| 337 | string dns=""> |
| 338 | : MIMG_nsa_gfx10<op, (outs), num_addrs, dns> { |
| 339 | let InOperandList = !con((ins DataRC:$vdata), |
| 340 | AddrIns, |
| 341 | (ins SReg_256:$srsrc, DMask:$dmask, |
| 342 | Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc, |
| 343 | SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe), |
| 344 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 345 | let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe" |
| 346 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| 347 | } |
| 348 | |
| 349 | multiclass MIMG_Store_Addr_Helper <int op, string asm, |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 350 | RegisterClass data_rc, |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 351 | bit enableDisasm> { |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 352 | let mayLoad = 0, mayStore = 1, hasSideEffects = 0, hasPostISelHook = 0, |
| 353 | DisableWQM = 1, ssamp = 0 in { |
| 354 | let VAddrDwords = 1 in { |
| 355 | def _V1 : MIMG_Store_Helper <op, asm, data_rc, VGPR_32, |
| 356 | !if(enableDisasm, "AMDGPU", "")>; |
| 357 | def _V1_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VGPR_32, |
| 358 | !if(enableDisasm, "AMDGPU", "")>; |
| 359 | } |
| 360 | let VAddrDwords = 2 in { |
| 361 | def _V2 : MIMG_Store_Helper <op, asm, data_rc, VReg_64>; |
| 362 | def _V2_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VReg_64>; |
| 363 | def _V2_nsa_gfx10 : MIMG_Store_nsa_gfx10 <op, asm, data_rc, 2>; |
| 364 | } |
| 365 | let VAddrDwords = 3 in { |
| 366 | def _V3 : MIMG_Store_Helper <op, asm, data_rc, VReg_96>; |
| 367 | def _V3_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VReg_96>; |
| 368 | def _V3_nsa_gfx10 : MIMG_Store_nsa_gfx10 <op, asm, data_rc, 3>; |
| 369 | } |
| 370 | let VAddrDwords = 4 in { |
| 371 | def _V4 : MIMG_Store_Helper <op, asm, data_rc, VReg_128>; |
| 372 | def _V4_gfx10 : MIMG_Store_gfx10 <op, asm, data_rc, VReg_128>; |
| 373 | def _V4_nsa_gfx10 : MIMG_Store_nsa_gfx10 <op, asm, data_rc, 4, |
| 374 | !if(enableDisasm, "AMDGPU", "")>; |
| 375 | } |
| 376 | } |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 377 | } |
| 378 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 379 | multiclass MIMG_Store <bits<7> op, string asm, bit has_d16, bit mip = 0> { |
| 380 | def "" : MIMGBaseOpcode { |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 381 | let Store = 1; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 382 | let LodOrClampOrMip = mip; |
| 383 | let HasD16 = has_d16; |
| 384 | } |
| 385 | |
| 386 | let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in { |
| 387 | let VDataDwords = 1 in |
| 388 | defm _V1 : MIMG_Store_Addr_Helper <op, asm, VGPR_32, 1>; |
| 389 | let VDataDwords = 2 in |
| 390 | defm _V2 : MIMG_Store_Addr_Helper <op, asm, VReg_64, 0>; |
| 391 | let VDataDwords = 3 in |
| 392 | defm _V3 : MIMG_Store_Addr_Helper <op, asm, VReg_96, 0>; |
| 393 | let VDataDwords = 4 in |
| 394 | defm _V4 : MIMG_Store_Addr_Helper <op, asm, VReg_128, 0>; |
| 395 | } |
| Dmitry Preobrazhensky | 2456ac6 | 2018-03-28 15:44:16 +0000 | [diff] [blame] | 396 | } |
| 397 | |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 398 | class MIMG_Atomic_gfx6789_base <bits<7> op, string asm, RegisterClass data_rc, |
| 399 | RegisterClass addr_rc, string dns=""> |
| 400 | : MIMG_gfx6789 <op, (outs data_rc:$vdst), dns> { |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 401 | let Constraints = "$vdst = $vdata"; |
| 402 | let AsmMatchConverter = "cvtMIMGAtomic"; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 403 | |
| 404 | let InOperandList = (ins data_rc:$vdata, addr_rc:$vaddr, SReg_256:$srsrc, |
| 405 | DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc, |
| Ryan Taylor | 1f334d0 | 2018-08-28 15:07:30 +0000 | [diff] [blame] | 406 | R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da); |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 407 | 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] | 408 | } |
| 409 | |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 410 | class MIMG_Atomic_si<mimg op, string asm, RegisterClass data_rc, |
| 411 | RegisterClass addr_rc, bit enableDasm = 0> |
| 412 | : MIMG_Atomic_gfx6789_base<op.SI_GFX10, asm, data_rc, addr_rc, |
| 413 | !if(enableDasm, "GFX6GFX7", "")> { |
| 414 | let AssemblerPredicates = [isGFX6GFX7]; |
| 415 | } |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 416 | |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 417 | class MIMG_Atomic_vi<mimg op, string asm, RegisterClass data_rc, |
| 418 | RegisterClass addr_rc, bit enableDasm = 0> |
| 419 | : MIMG_Atomic_gfx6789_base<op.VI, asm, data_rc, addr_rc, !if(enableDasm, "GFX8", "")> { |
| 420 | let AssemblerPredicates = [isGFX8GFX9]; |
| 421 | let MIMGEncoding = MIMGEncGfx8; |
| 422 | } |
| 423 | |
| 424 | class MIMG_Atomic_gfx10<mimg op, string opcode, |
| 425 | RegisterClass DataRC, RegisterClass AddrRC, |
| 426 | bit enableDisasm = 0> |
| 427 | : MIMG_gfx10<!cast<int>(op.SI_GFX10), (outs DataRC:$vdst), |
| 428 | !if(enableDisasm, "AMDGPU", "")> { |
| 429 | let Constraints = "$vdst = $vdata"; |
| 430 | let AsmMatchConverter = "cvtMIMGAtomic"; |
| 431 | |
| 432 | let InOperandList = (ins DataRC:$vdata, AddrRC:$vaddr0, SReg_256:$srsrc, |
| 433 | DMask:$dmask, Dim:$dim, UNorm:$unorm, DLC:$dlc, |
| 434 | GLC:$glc, SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe); |
| 435 | let AsmString = opcode#" $vdst, $vaddr0, $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe"; |
| 436 | } |
| 437 | |
| 438 | class MIMG_Atomic_nsa_gfx10<mimg op, string opcode, |
| 439 | RegisterClass DataRC, int num_addrs, |
| 440 | bit enableDisasm = 0> |
| 441 | : MIMG_nsa_gfx10<!cast<int>(op.SI_GFX10), (outs DataRC:$vdst), num_addrs, |
| 442 | !if(enableDisasm, "AMDGPU", "")> { |
| 443 | let Constraints = "$vdst = $vdata"; |
| 444 | let AsmMatchConverter = "cvtMIMGAtomic"; |
| 445 | |
| 446 | let InOperandList = !con((ins DataRC:$vdata), |
| 447 | AddrIns, |
| 448 | (ins SReg_256:$srsrc, DMask:$dmask, |
| 449 | Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc, |
| 450 | SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe)); |
| 451 | let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc$dmask$dim$unorm$dlc$glc$slc$r128$tfe$lwe"; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 452 | } |
| 453 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 454 | multiclass MIMG_Atomic_Addr_Helper_m <mimg op, string asm, |
| Dmitry Preobrazhensky | 0b4eb1e | 2018-01-26 15:43:29 +0000 | [diff] [blame] | 455 | RegisterClass data_rc, |
| Dmitry Preobrazhensky | 0b4eb1e | 2018-01-26 15:43:29 +0000 | [diff] [blame] | 456 | bit enableDasm = 0> { |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 457 | let hasSideEffects = 1, // FIXME: remove this |
| 458 | mayLoad = 1, mayStore = 1, hasPostISelHook = 0, DisableWQM = 1, |
| 459 | ssamp = 0 in { |
| 460 | let VAddrDwords = 1 in { |
| 461 | def _V1_si : MIMG_Atomic_si <op, asm, data_rc, VGPR_32, enableDasm>; |
| 462 | def _V1_vi : MIMG_Atomic_vi <op, asm, data_rc, VGPR_32, enableDasm>; |
| 463 | def _V1_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VGPR_32, enableDasm>; |
| 464 | } |
| 465 | let VAddrDwords = 2 in { |
| 466 | def _V2_si : MIMG_Atomic_si <op, asm, data_rc, VReg_64, 0>; |
| 467 | def _V2_vi : MIMG_Atomic_vi <op, asm, data_rc, VReg_64, 0>; |
| 468 | def _V2_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VReg_64, 0>; |
| 469 | def _V2_nsa_gfx10 : MIMG_Atomic_nsa_gfx10 <op, asm, data_rc, 2, 0>; |
| 470 | } |
| 471 | let VAddrDwords = 3 in { |
| 472 | def _V3_si : MIMG_Atomic_si <op, asm, data_rc, VReg_96, 0>; |
| 473 | def _V3_vi : MIMG_Atomic_vi <op, asm, data_rc, VReg_96, 0>; |
| 474 | def _V3_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VReg_96, 0>; |
| 475 | def _V3_nsa_gfx10 : MIMG_Atomic_nsa_gfx10 <op, asm, data_rc, 3, 0>; |
| 476 | } |
| 477 | let VAddrDwords = 4 in { |
| 478 | def _V4_si : MIMG_Atomic_si <op, asm, data_rc, VReg_128, 0>; |
| 479 | def _V4_vi : MIMG_Atomic_vi <op, asm, data_rc, VReg_128, 0>; |
| 480 | def _V4_gfx10 : MIMG_Atomic_gfx10 <op, asm, data_rc, VReg_128, 0>; |
| 481 | def _V4_nsa_gfx10 : MIMG_Atomic_nsa_gfx10 <op, asm, data_rc, 4, enableDasm>; |
| 482 | } |
| 483 | } |
| Dmitry Preobrazhensky | 0b4eb1e | 2018-01-26 15:43:29 +0000 | [diff] [blame] | 484 | } |
| 485 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 486 | 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] | 487 | def "" : MIMGBaseOpcode { |
| 488 | let Atomic = 1; |
| 489 | let AtomicX2 = isCmpSwap; |
| 490 | } |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 491 | |
| 492 | let BaseOpcode = !cast<MIMGBaseOpcode>(NAME) in { |
| 493 | // _V* variants have different dst size, but the size is encoded implicitly, |
| 494 | // using dmask and tfe. Only 32-bit variant is registered with disassembler. |
| 495 | // Other variants are reconstructed by disassembler using dmask and tfe. |
| 496 | let VDataDwords = !if(isCmpSwap, 2, 1) in |
| 497 | defm _V1 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_64, VGPR_32), 1>; |
| 498 | let VDataDwords = !if(isCmpSwap, 4, 2) in |
| 499 | defm _V2 : MIMG_Atomic_Addr_Helper_m <op, asm, !if(isCmpSwap, VReg_128, VReg_64)>; |
| 500 | } |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 501 | } |
| 502 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 503 | class MIMG_Sampler_Helper <bits<7> op, string asm, RegisterClass dst_rc, |
| 504 | RegisterClass src_rc, string dns=""> |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 505 | : MIMG_gfx6789 <op, (outs dst_rc:$vdata), dns> { |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 506 | let InOperandList = !con((ins src_rc:$vaddr, SReg_256:$srsrc, SReg_128:$ssamp, |
| 507 | DMask:$dmask, UNorm:$unorm, GLC:$glc, SLC:$slc, |
| Ryan Taylor | 1f334d0 | 2018-08-28 15:07:30 +0000 | [diff] [blame] | 508 | R128A16:$r128, TFE:$tfe, LWE:$lwe, DA:$da), |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 509 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 510 | let AsmString = asm#" $vdata, $vaddr, $srsrc, $ssamp$dmask$unorm$glc$slc$r128$tfe$lwe$da" |
| 511 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 512 | } |
| 513 | |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 514 | class MIMG_Sampler_gfx10<int op, string opcode, |
| 515 | RegisterClass DataRC, RegisterClass AddrRC, |
| 516 | string dns=""> |
| 517 | : MIMG_gfx10<op, (outs DataRC:$vdata), dns> { |
| 518 | let InOperandList = !con((ins AddrRC:$vaddr0, SReg_256:$srsrc, SReg_128:$ssamp, |
| 519 | DMask:$dmask, Dim:$dim, UNorm:$unorm, DLC:$dlc, |
| 520 | GLC:$glc, SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe), |
| 521 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 522 | let AsmString = opcode#" $vdata, $vaddr0, $srsrc, $ssamp$dmask$dim$unorm" |
| 523 | #"$dlc$glc$slc$r128$tfe$lwe" |
| 524 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| 525 | } |
| 526 | |
| 527 | class MIMG_Sampler_nsa_gfx10<int op, string opcode, |
| 528 | RegisterClass DataRC, int num_addrs, |
| 529 | string dns=""> |
| 530 | : MIMG_nsa_gfx10<op, (outs DataRC:$vdata), num_addrs, dns> { |
| 531 | let InOperandList = !con(AddrIns, |
| 532 | (ins SReg_256:$srsrc, SReg_128:$ssamp, DMask:$dmask, |
| 533 | Dim:$dim, UNorm:$unorm, DLC:$dlc, GLC:$glc, |
| 534 | SLC:$slc, R128A16:$r128, TFE:$tfe, LWE:$lwe), |
| 535 | !if(BaseOpcode.HasD16, (ins D16:$d16), (ins))); |
| 536 | let AsmString = opcode#" $vdata, "#AddrAsm#", $srsrc, $ssamp$dmask$dim$unorm" |
| 537 | #"$dlc$glc$slc$r128$tfe$lwe" |
| 538 | #!if(BaseOpcode.HasD16, "$d16", ""); |
| 539 | } |
| 540 | |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame] | 541 | class MIMGAddrSize<int dw, bit enable_disasm> { |
| 542 | int NumWords = dw; |
| 543 | |
| 544 | RegisterClass RegClass = !if(!le(NumWords, 0), ?, |
| 545 | !if(!eq(NumWords, 1), VGPR_32, |
| 546 | !if(!eq(NumWords, 2), VReg_64, |
| 547 | !if(!eq(NumWords, 3), VReg_96, |
| 548 | !if(!eq(NumWords, 4), VReg_128, |
| 549 | !if(!le(NumWords, 8), VReg_256, |
| 550 | !if(!le(NumWords, 16), VReg_512, ?))))))); |
| 551 | |
| 552 | // Whether the instruction variant with this vaddr size should be enabled for |
| 553 | // the auto-generated disassembler. |
| 554 | bit Disassemble = enable_disasm; |
| 555 | } |
| 556 | |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 557 | // Return whether x is in lst. |
| 558 | class isIntInList<int x, list<int> lst> { |
| 559 | bit ret = !foldl(0, lst, lhs, y, !or(lhs, !eq(x, y))); |
| 560 | } |
| 561 | |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame] | 562 | // Return whether a value inside the range [min, max] (endpoints inclusive) |
| 563 | // is in the given list. |
| 564 | class isRangeInList<int min, int max, list<int> lst> { |
| 565 | bit ret = !foldl(0, lst, lhs, y, !or(lhs, !and(!le(min, y), !le(y, max)))); |
| 566 | } |
| 567 | |
| 568 | class MIMGAddrSizes_tmp<list<MIMGAddrSize> lst, int min> { |
| 569 | list<MIMGAddrSize> List = lst; |
| 570 | int Min = min; |
| 571 | } |
| 572 | |
| 573 | class MIMG_Sampler_AddrSizes<AMDGPUSampleVariant sample> { |
| 574 | // List of all possible numbers of address words, taking all combinations of |
| 575 | // A16 and image dimension into account (note: no MSAA, since this is for |
| 576 | // sample/gather ops). |
| 577 | list<int> AllNumAddrWords = |
| 578 | !foreach(dw, !if(sample.Gradients, |
| 579 | !if(!eq(sample.LodOrClamp, ""), |
| 580 | [2, 3, 4, 5, 6, 7, 9], |
| 581 | [2, 3, 4, 5, 7, 8, 10]), |
| 582 | !if(!eq(sample.LodOrClamp, ""), |
| 583 | [1, 2, 3], |
| 584 | [1, 2, 3, 4])), |
| 585 | !add(dw, !size(sample.ExtraAddrArgs))); |
| 586 | |
| 587 | // Generate machine instructions based on possible register classes for the |
| 588 | // required numbers of address words. The disassembler defaults to the |
| 589 | // smallest register class. |
| 590 | list<MIMGAddrSize> MachineInstrs = |
| 591 | !foldl(MIMGAddrSizes_tmp<[], 0>, [1, 2, 3, 4, 8, 16], lhs, dw, |
| 592 | !if(isRangeInList<lhs.Min, dw, AllNumAddrWords>.ret, |
| 593 | MIMGAddrSizes_tmp< |
| 594 | !listconcat(lhs.List, [MIMGAddrSize<dw, !empty(lhs.List)>]), |
| 595 | !if(!eq(dw, 3), 3, !add(dw, 1))>, // we still need _V4 for codegen w/ 3 dwords |
| 596 | lhs)).List; |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 597 | |
| 598 | // For NSA, generate machine instructions for all possible numbers of words |
| 599 | // except 1 (which is already covered by the non-NSA case). |
| 600 | // The disassembler defaults to the largest number of arguments among the |
| 601 | // variants with the same number of NSA words, and custom code then derives |
| 602 | // the exact variant based on the sample variant and the image dimension. |
| 603 | list<MIMGAddrSize> NSAInstrs = |
| 604 | !foldl([]<MIMGAddrSize>, [[12, 11, 10], [9, 8, 7, 6], [5, 4, 3, 2]], prev, nsa_group, |
| 605 | !listconcat(prev, |
| 606 | !foldl([]<MIMGAddrSize>, nsa_group, lhs, dw, |
| 607 | !if(isIntInList<dw, AllNumAddrWords>.ret, |
| 608 | !listconcat(lhs, [MIMGAddrSize<dw, !empty(lhs)>]), |
| 609 | lhs)))); |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame] | 610 | } |
| 611 | |
| 612 | multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm, |
| 613 | AMDGPUSampleVariant sample, RegisterClass dst_rc, |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 614 | bit enableDisasm = 0> { |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame] | 615 | foreach addr = MIMG_Sampler_AddrSizes<sample>.MachineInstrs in { |
| Stanislav Mekhanoshin | 692560d | 2019-05-01 16:32:58 +0000 | [diff] [blame] | 616 | let VAddrDwords = addr.NumWords in { |
| 617 | def _V # addr.NumWords |
| 618 | : MIMG_Sampler_Helper <op, asm, dst_rc, addr.RegClass, |
| 619 | !if(!and(enableDisasm, addr.Disassemble), "AMDGPU", "")>; |
| 620 | def _V # addr.NumWords # _gfx10 |
| 621 | : MIMG_Sampler_gfx10 <op, asm, dst_rc, addr.RegClass, |
| 622 | !if(!and(enableDisasm, addr.Disassemble), "AMDGPU", "")>; |
| 623 | } |
| 624 | } |
| 625 | |
| 626 | foreach addr = MIMG_Sampler_AddrSizes<sample>.NSAInstrs in { |
| 627 | let VAddrDwords = addr.NumWords in { |
| 628 | def _V # addr.NumWords # _nsa_gfx10 |
| 629 | : MIMG_Sampler_nsa_gfx10<op, asm, dst_rc, addr.NumWords, |
| 630 | !if(!and(enableDisasm, addr.Disassemble), "AMDGPU", "")>; |
| 631 | } |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame] | 632 | } |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 633 | } |
| 634 | |
| 635 | class MIMG_Sampler_BaseOpcode<AMDGPUSampleVariant sample> |
| 636 | : MIMGBaseOpcode { |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 637 | let Sampler = 1; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 638 | let NumExtraArgs = !size(sample.ExtraAddrArgs); |
| 639 | let Gradients = sample.Gradients; |
| 640 | let LodOrClampOrMip = !ne(sample.LodOrClamp, ""); |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 641 | } |
| 642 | |
| Nicolai Haehnle | 2367f03 | 2018-06-21 13:36:13 +0000 | [diff] [blame] | 643 | multiclass MIMG_Sampler <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0, |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 644 | bit isGetLod = 0, |
| Nicolai Haehnle | 2367f03 | 2018-06-21 13:36:13 +0000 | [diff] [blame] | 645 | string asm = "image_sample"#sample.LowerCaseMod> { |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 646 | def "" : MIMG_Sampler_BaseOpcode<sample> { |
| 647 | let HasD16 = !if(isGetLod, 0, 1); |
| 648 | } |
| 649 | |
| 650 | let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm, |
| 651 | mayLoad = !if(isGetLod, 0, 1) in { |
| 652 | let VDataDwords = 1 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame] | 653 | defm _V1 : MIMG_Sampler_Src_Helper<op, asm, sample, VGPR_32, 1>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 654 | let VDataDwords = 2 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame] | 655 | defm _V2 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_64>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 656 | let VDataDwords = 3 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame] | 657 | defm _V3 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_96>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 658 | let VDataDwords = 4 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame] | 659 | defm _V4 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_128>; |
| Tim Renouf | 6f0191a | 2019-03-22 15:21:11 +0000 | [diff] [blame] | 660 | let VDataDwords = 5 in |
| 661 | defm _V5 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_160>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 662 | } |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 663 | } |
| 664 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 665 | multiclass MIMG_Sampler_WQM <bits<7> op, AMDGPUSampleVariant sample> |
| 666 | : MIMG_Sampler<op, sample, 1>; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 667 | |
| Nicolai Haehnle | 2367f03 | 2018-06-21 13:36:13 +0000 | [diff] [blame] | 668 | multiclass MIMG_Gather <bits<7> op, AMDGPUSampleVariant sample, bit wqm = 0, |
| 669 | string asm = "image_gather4"#sample.LowerCaseMod> { |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 670 | def "" : MIMG_Sampler_BaseOpcode<sample> { |
| 671 | let HasD16 = 1; |
| David Stuttard | f77079f | 2019-01-14 11:55:24 +0000 | [diff] [blame] | 672 | let Gather4 = 1; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 673 | } |
| 674 | |
| 675 | let BaseOpcode = !cast<MIMGBaseOpcode>(NAME), WQM = wqm, |
| 676 | Gather4 = 1, hasPostISelHook = 0 in { |
| 677 | let VDataDwords = 2 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame] | 678 | 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] | 679 | let VDataDwords = 4 in |
| Nicolai Haehnle | 15745ba | 2018-06-21 13:37:55 +0000 | [diff] [blame] | 680 | defm _V4 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_128, 1>; |
| Tim Renouf | 6f0191a | 2019-03-22 15:21:11 +0000 | [diff] [blame] | 681 | let VDataDwords = 5 in |
| 682 | defm _V5 : MIMG_Sampler_Src_Helper<op, asm, sample, VReg_160>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 683 | } |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 684 | } |
| 685 | |
| Nicolai Haehnle | 2367f03 | 2018-06-21 13:36:13 +0000 | [diff] [blame] | 686 | multiclass MIMG_Gather_WQM <bits<7> op, AMDGPUSampleVariant sample> |
| 687 | : MIMG_Gather<op, sample, 1>; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 688 | |
| 689 | //===----------------------------------------------------------------------===// |
| 690 | // MIMG Instructions |
| 691 | //===----------------------------------------------------------------------===// |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 692 | defm IMAGE_LOAD : MIMG_NoSampler <0x00000000, "image_load", 1>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 693 | defm IMAGE_LOAD_MIP : MIMG_NoSampler <0x00000001, "image_load_mip", 1, 1>; |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 694 | defm IMAGE_LOAD_PCK : MIMG_NoSampler <0x00000002, "image_load_pck", 0>; |
| 695 | 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] | 696 | defm IMAGE_LOAD_MIP_PCK : MIMG_NoSampler <0x00000004, "image_load_mip_pck", 0, 1>; |
| 697 | 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] | 698 | defm IMAGE_STORE : MIMG_Store <0x00000008, "image_store", 1>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 699 | defm IMAGE_STORE_MIP : MIMG_Store <0x00000009, "image_store_mip", 1, 1>; |
| Nicolai Haehnle | f267431 | 2018-06-21 13:36:01 +0000 | [diff] [blame] | 700 | defm IMAGE_STORE_PCK : MIMG_Store <0x0000000a, "image_store_pck", 0>; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 701 | 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] | 702 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 703 | 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] | 704 | |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 705 | defm IMAGE_ATOMIC_SWAP : MIMG_Atomic <mimg<0x0f, 0x10>, "image_atomic_swap">; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 706 | 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] | 707 | defm IMAGE_ATOMIC_ADD : MIMG_Atomic <mimg<0x11, 0x12>, "image_atomic_add">; |
| 708 | defm IMAGE_ATOMIC_SUB : MIMG_Atomic <mimg<0x12, 0x13>, "image_atomic_sub">; |
| 709 | //def IMAGE_ATOMIC_RSUB : MIMG_NoPattern_ <"image_atomic_rsub", 0x00000013>; -- not on VI |
| 710 | defm IMAGE_ATOMIC_SMIN : MIMG_Atomic <mimg<0x14>, "image_atomic_smin">; |
| 711 | defm IMAGE_ATOMIC_UMIN : MIMG_Atomic <mimg<0x15>, "image_atomic_umin">; |
| 712 | defm IMAGE_ATOMIC_SMAX : MIMG_Atomic <mimg<0x16>, "image_atomic_smax">; |
| 713 | defm IMAGE_ATOMIC_UMAX : MIMG_Atomic <mimg<0x17>, "image_atomic_umax">; |
| 714 | defm IMAGE_ATOMIC_AND : MIMG_Atomic <mimg<0x18>, "image_atomic_and">; |
| 715 | defm IMAGE_ATOMIC_OR : MIMG_Atomic <mimg<0x19>, "image_atomic_or">; |
| 716 | defm IMAGE_ATOMIC_XOR : MIMG_Atomic <mimg<0x1a>, "image_atomic_xor">; |
| 717 | defm IMAGE_ATOMIC_INC : MIMG_Atomic <mimg<0x1b>, "image_atomic_inc">; |
| 718 | defm IMAGE_ATOMIC_DEC : MIMG_Atomic <mimg<0x1c>, "image_atomic_dec">; |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 719 | //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] | 720 | //def IMAGE_ATOMIC_FMIN : MIMG_NoPattern_ <"image_atomic_fmin", 0x0000001e>; -- not on VI |
| 721 | //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] | 722 | defm IMAGE_SAMPLE : MIMG_Sampler_WQM <0x00000020, AMDGPUSample>; |
| 723 | defm IMAGE_SAMPLE_CL : MIMG_Sampler_WQM <0x00000021, AMDGPUSample_cl>; |
| 724 | defm IMAGE_SAMPLE_D : MIMG_Sampler <0x00000022, AMDGPUSample_d>; |
| 725 | defm IMAGE_SAMPLE_D_CL : MIMG_Sampler <0x00000023, AMDGPUSample_d_cl>; |
| 726 | defm IMAGE_SAMPLE_L : MIMG_Sampler <0x00000024, AMDGPUSample_l>; |
| 727 | defm IMAGE_SAMPLE_B : MIMG_Sampler_WQM <0x00000025, AMDGPUSample_b>; |
| 728 | defm IMAGE_SAMPLE_B_CL : MIMG_Sampler_WQM <0x00000026, AMDGPUSample_b_cl>; |
| 729 | defm IMAGE_SAMPLE_LZ : MIMG_Sampler <0x00000027, AMDGPUSample_lz>; |
| 730 | defm IMAGE_SAMPLE_C : MIMG_Sampler_WQM <0x00000028, AMDGPUSample_c>; |
| 731 | defm IMAGE_SAMPLE_C_CL : MIMG_Sampler_WQM <0x00000029, AMDGPUSample_c_cl>; |
| 732 | defm IMAGE_SAMPLE_C_D : MIMG_Sampler <0x0000002a, AMDGPUSample_c_d>; |
| 733 | defm IMAGE_SAMPLE_C_D_CL : MIMG_Sampler <0x0000002b, AMDGPUSample_c_d_cl>; |
| 734 | defm IMAGE_SAMPLE_C_L : MIMG_Sampler <0x0000002c, AMDGPUSample_c_l>; |
| 735 | defm IMAGE_SAMPLE_C_B : MIMG_Sampler_WQM <0x0000002d, AMDGPUSample_c_b>; |
| 736 | defm IMAGE_SAMPLE_C_B_CL : MIMG_Sampler_WQM <0x0000002e, AMDGPUSample_c_b_cl>; |
| 737 | defm IMAGE_SAMPLE_C_LZ : MIMG_Sampler <0x0000002f, AMDGPUSample_c_lz>; |
| 738 | defm IMAGE_SAMPLE_O : MIMG_Sampler_WQM <0x00000030, AMDGPUSample_o>; |
| 739 | defm IMAGE_SAMPLE_CL_O : MIMG_Sampler_WQM <0x00000031, AMDGPUSample_cl_o>; |
| 740 | defm IMAGE_SAMPLE_D_O : MIMG_Sampler <0x00000032, AMDGPUSample_d_o>; |
| 741 | defm IMAGE_SAMPLE_D_CL_O : MIMG_Sampler <0x00000033, AMDGPUSample_d_cl_o>; |
| 742 | defm IMAGE_SAMPLE_L_O : MIMG_Sampler <0x00000034, AMDGPUSample_l_o>; |
| 743 | defm IMAGE_SAMPLE_B_O : MIMG_Sampler_WQM <0x00000035, AMDGPUSample_b_o>; |
| 744 | defm IMAGE_SAMPLE_B_CL_O : MIMG_Sampler_WQM <0x00000036, AMDGPUSample_b_cl_o>; |
| 745 | defm IMAGE_SAMPLE_LZ_O : MIMG_Sampler <0x00000037, AMDGPUSample_lz_o>; |
| 746 | defm IMAGE_SAMPLE_C_O : MIMG_Sampler_WQM <0x00000038, AMDGPUSample_c_o>; |
| 747 | defm IMAGE_SAMPLE_C_CL_O : MIMG_Sampler_WQM <0x00000039, AMDGPUSample_c_cl_o>; |
| 748 | defm IMAGE_SAMPLE_C_D_O : MIMG_Sampler <0x0000003a, AMDGPUSample_c_d_o>; |
| 749 | defm IMAGE_SAMPLE_C_D_CL_O : MIMG_Sampler <0x0000003b, AMDGPUSample_c_d_cl_o>; |
| 750 | defm IMAGE_SAMPLE_C_L_O : MIMG_Sampler <0x0000003c, AMDGPUSample_c_l_o>; |
| 751 | defm IMAGE_SAMPLE_C_B_CL_O : MIMG_Sampler_WQM <0x0000003e, AMDGPUSample_c_b_cl_o>; |
| 752 | defm IMAGE_SAMPLE_C_B_O : MIMG_Sampler_WQM <0x0000003d, AMDGPUSample_c_b_o>; |
| 753 | defm IMAGE_SAMPLE_C_LZ_O : MIMG_Sampler <0x0000003f, AMDGPUSample_c_lz_o>; |
| 754 | defm IMAGE_GATHER4 : MIMG_Gather_WQM <0x00000040, AMDGPUSample>; |
| 755 | defm IMAGE_GATHER4_CL : MIMG_Gather_WQM <0x00000041, AMDGPUSample_cl>; |
| 756 | defm IMAGE_GATHER4_L : MIMG_Gather <0x00000044, AMDGPUSample_l>; |
| 757 | defm IMAGE_GATHER4_B : MIMG_Gather_WQM <0x00000045, AMDGPUSample_b>; |
| 758 | defm IMAGE_GATHER4_B_CL : MIMG_Gather_WQM <0x00000046, AMDGPUSample_b_cl>; |
| 759 | defm IMAGE_GATHER4_LZ : MIMG_Gather <0x00000047, AMDGPUSample_lz>; |
| 760 | defm IMAGE_GATHER4_C : MIMG_Gather_WQM <0x00000048, AMDGPUSample_c>; |
| 761 | defm IMAGE_GATHER4_C_CL : MIMG_Gather_WQM <0x00000049, AMDGPUSample_c_cl>; |
| 762 | defm IMAGE_GATHER4_C_L : MIMG_Gather <0x0000004c, AMDGPUSample_c_l>; |
| 763 | defm IMAGE_GATHER4_C_B : MIMG_Gather_WQM <0x0000004d, AMDGPUSample_c_b>; |
| 764 | defm IMAGE_GATHER4_C_B_CL : MIMG_Gather_WQM <0x0000004e, AMDGPUSample_c_b_cl>; |
| 765 | defm IMAGE_GATHER4_C_LZ : MIMG_Gather <0x0000004f, AMDGPUSample_c_lz>; |
| 766 | defm IMAGE_GATHER4_O : MIMG_Gather_WQM <0x00000050, AMDGPUSample_o>; |
| 767 | defm IMAGE_GATHER4_CL_O : MIMG_Gather_WQM <0x00000051, AMDGPUSample_cl_o>; |
| 768 | defm IMAGE_GATHER4_L_O : MIMG_Gather <0x00000054, AMDGPUSample_l_o>; |
| 769 | defm IMAGE_GATHER4_B_O : MIMG_Gather_WQM <0x00000055, AMDGPUSample_b_o>; |
| 770 | defm IMAGE_GATHER4_B_CL_O : MIMG_Gather <0x00000056, AMDGPUSample_b_cl_o>; |
| 771 | defm IMAGE_GATHER4_LZ_O : MIMG_Gather <0x00000057, AMDGPUSample_lz_o>; |
| 772 | defm IMAGE_GATHER4_C_O : MIMG_Gather_WQM <0x00000058, AMDGPUSample_c_o>; |
| 773 | defm IMAGE_GATHER4_C_CL_O : MIMG_Gather_WQM <0x00000059, AMDGPUSample_c_cl_o>; |
| 774 | defm IMAGE_GATHER4_C_L_O : MIMG_Gather <0x0000005c, AMDGPUSample_c_l_o>; |
| 775 | defm IMAGE_GATHER4_C_B_O : MIMG_Gather_WQM <0x0000005d, AMDGPUSample_c_b_o>; |
| 776 | defm IMAGE_GATHER4_C_B_CL_O : MIMG_Gather_WQM <0x0000005e, AMDGPUSample_c_b_cl_o>; |
| 777 | 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] | 778 | |
| Nicolai Haehnle | 0ab200b | 2018-06-21 13:36:44 +0000 | [diff] [blame] | 779 | 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] | 780 | |
| Nicolai Haehnle | 2367f03 | 2018-06-21 13:36:13 +0000 | [diff] [blame] | 781 | defm IMAGE_SAMPLE_CD : MIMG_Sampler <0x00000068, AMDGPUSample_cd>; |
| 782 | defm IMAGE_SAMPLE_CD_CL : MIMG_Sampler <0x00000069, AMDGPUSample_cd_cl>; |
| 783 | defm IMAGE_SAMPLE_C_CD : MIMG_Sampler <0x0000006a, AMDGPUSample_c_cd>; |
| 784 | defm IMAGE_SAMPLE_C_CD_CL : MIMG_Sampler <0x0000006b, AMDGPUSample_c_cd_cl>; |
| 785 | defm IMAGE_SAMPLE_CD_O : MIMG_Sampler <0x0000006c, AMDGPUSample_cd_o>; |
| 786 | defm IMAGE_SAMPLE_CD_CL_O : MIMG_Sampler <0x0000006d, AMDGPUSample_cd_cl_o>; |
| 787 | defm IMAGE_SAMPLE_C_CD_O : MIMG_Sampler <0x0000006e, AMDGPUSample_c_cd_o>; |
| 788 | 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] | 789 | //def IMAGE_RSRC256 : MIMG_NoPattern_RSRC256 <"image_rsrc256", 0x0000007e>; |
| 790 | //def IMAGE_SAMPLER : MIMG_NoPattern_ <"image_sampler", 0x0000007f>; |
| Changpeng Fang | b28fe03 | 2016-09-01 17:54:54 +0000 | [diff] [blame] | 791 | |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 792 | /********** ========================================= **********/ |
| 793 | /********** Table of dimension-aware image intrinsics **********/ |
| 794 | /********** ========================================= **********/ |
| Nicolai Haehnle | 2f5a738 | 2018-04-04 10:58:54 +0000 | [diff] [blame] | 795 | |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 796 | class ImageDimIntrinsicInfo<AMDGPUImageDimIntrinsic I> { |
| 797 | Intrinsic Intr = I; |
| 798 | MIMGBaseOpcode BaseOpcode = !cast<MIMGBaseOpcode>(!strconcat("IMAGE_", I.P.OpMod)); |
| 799 | AMDGPUDimProps Dim = I.P.Dim; |
| Nicolai Haehnle | 2f5a738 | 2018-04-04 10:58:54 +0000 | [diff] [blame] | 800 | } |
| 801 | |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 802 | def ImageDimIntrinsicTable : GenericTable { |
| 803 | let FilterClass = "ImageDimIntrinsicInfo"; |
| 804 | let Fields = ["Intr", "BaseOpcode", "Dim"]; |
| 805 | GenericEnum TypeOf_BaseOpcode = MIMGBaseOpcode; |
| 806 | GenericEnum TypeOf_Dim = MIMGDim; |
| Nicolai Haehnle | 2f5a738 | 2018-04-04 10:58:54 +0000 | [diff] [blame] | 807 | |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 808 | let PrimaryKey = ["Intr"]; |
| 809 | let PrimaryKeyName = "getImageDimIntrinsicInfo"; |
| 810 | let PrimaryKeyEarlyOut = 1; |
| Nicolai Haehnle | 2f5a738 | 2018-04-04 10:58:54 +0000 | [diff] [blame] | 811 | } |
| 812 | |
| 813 | foreach intr = !listconcat(AMDGPUImageDimIntrinsics, |
| Nicolai Haehnle | 7a9c03f | 2018-06-21 13:36:57 +0000 | [diff] [blame] | 814 | AMDGPUImageDimAtomicIntrinsics) in { |
| 815 | def : ImageDimIntrinsicInfo<intr>; |
| Nicolai Haehnle | 2f5a738 | 2018-04-04 10:58:54 +0000 | [diff] [blame] | 816 | } |
| Ryan Taylor | 894c8fd | 2018-08-01 12:12:01 +0000 | [diff] [blame] | 817 | |
| 818 | // L to LZ Optimization Mapping |
| 819 | def : MIMGLZMapping<IMAGE_SAMPLE_L, IMAGE_SAMPLE_LZ>; |
| 820 | def : MIMGLZMapping<IMAGE_SAMPLE_C_L, IMAGE_SAMPLE_C_LZ>; |
| 821 | def : MIMGLZMapping<IMAGE_SAMPLE_L_O, IMAGE_SAMPLE_LZ_O>; |
| 822 | def : MIMGLZMapping<IMAGE_SAMPLE_C_L_O, IMAGE_SAMPLE_C_LZ_O>; |
| 823 | def : MIMGLZMapping<IMAGE_GATHER4_L, IMAGE_GATHER4_LZ>; |
| 824 | def : MIMGLZMapping<IMAGE_GATHER4_C_L, IMAGE_GATHER4_C_LZ>; |
| 825 | def : MIMGLZMapping<IMAGE_GATHER4_L_O, IMAGE_GATHER4_LZ_O>; |
| 826 | def : MIMGLZMapping<IMAGE_GATHER4_C_L_O, IMAGE_GATHER4_C_LZ_O>; |
| Piotr Sobczak | 9b11e93 | 2019-06-10 15:58:51 +0000 | [diff] [blame^] | 827 | |
| 828 | // MIP to NONMIP Optimization Mapping |
| 829 | def : MIMGMIPMapping<IMAGE_LOAD_MIP, IMAGE_LOAD>; |
| 830 | def : MIMGMIPMapping<IMAGE_STORE_MIP, IMAGE_STORE>; |