1 //===-- AMDGPUAsmUtils.cpp - AsmParser/InstPrinter common -----------------===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 #include "AMDGPUAsmUtils.h" 9 #include "AMDGPUBaseInfo.h" 10 #include "SIDefines.h" 11 12 namespace llvm::AMDGPU { 13 14 //===----------------------------------------------------------------------===// 15 // Custom Operands. 16 // 17 // A table of custom operands shall describe "primary" operand names first 18 // followed by aliases if any. It is not required but recommended to arrange 19 // operands so that operand encoding match operand position in the table. This 20 // will make getNameFromOperandTable() a bit more efficient. Unused slots in the 21 // table shall have an empty name. 22 // 23 //===----------------------------------------------------------------------===// 24 25 /// Map from the encoding of a sendmsg/hwreg asm operand to it's name. 26 template <size_t N> 27 static StringRef getNameFromOperandTable(const CustomOperand (&Table)[N], 28 unsigned Encoding, 29 const MCSubtargetInfo &STI) { 30 auto isValidIndexForEncoding = [&](size_t Idx) { 31 return Idx < N && Table[Idx].Encoding == Encoding && 32 !Table[Idx].Name.empty() && 33 (!Table[Idx].Cond || Table[Idx].Cond(STI)); 34 }; 35 36 // This is an optimization that should work in most cases. As a side effect, 37 // it may cause selection of an alias instead of a primary operand name in 38 // case of sparse tables. 39 if (isValidIndexForEncoding(Encoding)) 40 return Table[Encoding].Name; 41 42 for (size_t Idx = 0; Idx != N; ++Idx) 43 if (isValidIndexForEncoding(Idx)) 44 return Table[Idx].Name; 45 46 return ""; 47 } 48 49 /// Map from a symbolic name for a sendmsg/hwreg asm operand to it's encoding. 50 template <size_t N> 51 static int64_t getEncodingFromOperandTable(const CustomOperand (&Table)[N], 52 StringRef Name, 53 const MCSubtargetInfo &STI) { 54 int64_t InvalidEncoding = OPR_ID_UNKNOWN; 55 for (const CustomOperand &Entry : Table) { 56 if (Entry.Name != Name) 57 continue; 58 59 if (!Entry.Cond || Entry.Cond(STI)) 60 return Entry.Encoding; 61 62 InvalidEncoding = OPR_ID_UNSUPPORTED; 63 } 64 65 return InvalidEncoding; 66 } 67 68 namespace DepCtr { 69 70 // NOLINTBEGIN 71 const CustomOperandVal DepCtrInfo[] = { 72 // Name max dflt offset width constraint 73 {{"depctr_hold_cnt"}, 1, 1, 7, 1, isGFX10_BEncoding}, 74 {{"depctr_sa_sdst"}, 1, 1, 0, 1}, 75 {{"depctr_va_vdst"}, 15, 15, 12, 4}, 76 {{"depctr_va_sdst"}, 7, 7, 9, 3}, 77 {{"depctr_va_ssrc"}, 1, 1, 8, 1}, 78 {{"depctr_va_vcc"}, 1, 1, 1, 1}, 79 {{"depctr_vm_vsrc"}, 7, 7, 2, 3}, 80 }; 81 // NOLINTEND 82 83 const int DEP_CTR_SIZE = 84 static_cast<int>(sizeof(DepCtrInfo) / sizeof(CustomOperandVal)); 85 86 } // namespace DepCtr 87 88 namespace SendMsg { 89 90 // Disable lint checking here since it makes these tables unreadable. 91 // NOLINTBEGIN 92 // clang-format off 93 94 static constexpr CustomOperand MsgOperands[] = { 95 {{""}}, 96 {{"MSG_INTERRUPT"}, ID_INTERRUPT}, 97 {{"MSG_GS"}, ID_GS_PreGFX11, isNotGFX11Plus}, 98 {{"MSG_GS_DONE"}, ID_GS_DONE_PreGFX11, isNotGFX11Plus}, 99 {{"MSG_SAVEWAVE"}, ID_SAVEWAVE, isGFX8_GFX9_GFX10}, 100 {{"MSG_STALL_WAVE_GEN"}, ID_STALL_WAVE_GEN, isGFX9_GFX10_GFX11}, 101 {{"MSG_HALT_WAVES"}, ID_HALT_WAVES, isGFX9_GFX10_GFX11}, 102 {{"MSG_ORDERED_PS_DONE"}, ID_ORDERED_PS_DONE, isGFX9_GFX10}, 103 {{"MSG_EARLY_PRIM_DEALLOC"}, ID_EARLY_PRIM_DEALLOC, isGFX9_GFX10}, 104 {{"MSG_GS_ALLOC_REQ"}, ID_GS_ALLOC_REQ, isGFX9Plus}, 105 {{"MSG_GET_DOORBELL"}, ID_GET_DOORBELL, isGFX9_GFX10}, 106 {{"MSG_GET_DDID"}, ID_GET_DDID, isGFX10}, 107 {{"MSG_HS_TESSFACTOR"}, ID_HS_TESSFACTOR_GFX11Plus, isGFX11Plus}, 108 {{"MSG_DEALLOC_VGPRS"}, ID_DEALLOC_VGPRS_GFX11Plus, isGFX11Plus}, 109 {{""}}, 110 {{"MSG_SYSMSG"}, ID_SYSMSG}, 111 {{"MSG_RTN_GET_DOORBELL"}, ID_RTN_GET_DOORBELL, isGFX11Plus}, 112 {{"MSG_RTN_GET_DDID"}, ID_RTN_GET_DDID, isGFX11Plus}, 113 {{"MSG_RTN_GET_TMA"}, ID_RTN_GET_TMA, isGFX11Plus}, 114 {{"MSG_RTN_GET_REALTIME"}, ID_RTN_GET_REALTIME, isGFX11Plus}, 115 {{"MSG_RTN_SAVE_WAVE"}, ID_RTN_SAVE_WAVE, isGFX11Plus}, 116 {{"MSG_RTN_GET_TBA"}, ID_RTN_GET_TBA, isGFX11Plus}, 117 {{"MSG_RTN_GET_TBA_TO_PC"}, ID_RTN_GET_TBA_TO_PC, isGFX11Plus}, 118 {{"MSG_RTN_GET_SE_AID_ID"}, ID_RTN_GET_SE_AID_ID, isGFX12Plus}, 119 }; 120 121 static constexpr CustomOperand SysMsgOperands[] = { 122 {{""}}, 123 {{"SYSMSG_OP_ECC_ERR_INTERRUPT"}, OP_SYS_ECC_ERR_INTERRUPT}, 124 {{"SYSMSG_OP_REG_RD"}, OP_SYS_REG_RD}, 125 {{"SYSMSG_OP_HOST_TRAP_ACK"}, OP_SYS_HOST_TRAP_ACK, isNotGFX9Plus}, 126 {{"SYSMSG_OP_TTRACE_PC"}, OP_SYS_TTRACE_PC}, 127 }; 128 129 static constexpr CustomOperand StreamMsgOperands[] = { 130 {{"GS_OP_NOP"}, OP_GS_NOP}, 131 {{"GS_OP_CUT"}, OP_GS_CUT}, 132 {{"GS_OP_EMIT"}, OP_GS_EMIT}, 133 {{"GS_OP_EMIT_CUT"}, OP_GS_EMIT_CUT}, 134 }; 135 136 // clang-format on 137 // NOLINTEND 138 139 int64_t getMsgId(StringRef Name, const MCSubtargetInfo &STI) { 140 return getEncodingFromOperandTable(MsgOperands, Name, STI); 141 } 142 143 StringRef getMsgName(uint64_t Encoding, const MCSubtargetInfo &STI) { 144 return getNameFromOperandTable(MsgOperands, Encoding, STI); 145 } 146 147 int64_t getMsgOpId(int64_t MsgId, StringRef Name, const MCSubtargetInfo &STI) { 148 if (MsgId == ID_SYSMSG) 149 return getEncodingFromOperandTable(SysMsgOperands, Name, STI); 150 return getEncodingFromOperandTable(StreamMsgOperands, Name, STI); 151 } 152 153 StringRef getMsgOpName(int64_t MsgId, uint64_t Encoding, 154 const MCSubtargetInfo &STI) { 155 assert(msgRequiresOp(MsgId, STI) && "must have an operand"); 156 157 if (MsgId == ID_SYSMSG) 158 return getNameFromOperandTable(SysMsgOperands, Encoding, STI); 159 return getNameFromOperandTable(StreamMsgOperands, Encoding, STI); 160 } 161 162 } // namespace SendMsg 163 164 namespace Hwreg { 165 166 // Disable lint checking for this block since it makes the table unreadable. 167 // NOLINTBEGIN 168 // clang-format off 169 static constexpr CustomOperand Operands[] = { 170 {{""}}, 171 {{"HW_REG_MODE"}, ID_MODE}, 172 {{"HW_REG_STATUS"}, ID_STATUS}, 173 {{"HW_REG_TRAPSTS"}, ID_TRAPSTS, isNotGFX12Plus}, 174 {{"HW_REG_HW_ID"}, ID_HW_ID, isNotGFX10Plus}, 175 {{"HW_REG_GPR_ALLOC"}, ID_GPR_ALLOC}, 176 {{"HW_REG_LDS_ALLOC"}, ID_LDS_ALLOC}, 177 {{"HW_REG_IB_STS"}, ID_IB_STS}, 178 {{""}}, 179 {{""}}, 180 {{"HW_REG_PERF_SNAPSHOT_DATA"}, ID_PERF_SNAPSHOT_DATA_gfx12, isGFX12Plus}, 181 {{"HW_REG_PERF_SNAPSHOT_PC_LO"}, ID_PERF_SNAPSHOT_PC_LO_gfx12, isGFX12Plus}, 182 {{"HW_REG_PERF_SNAPSHOT_PC_HI"}, ID_PERF_SNAPSHOT_PC_HI_gfx12, isGFX12Plus}, 183 {{""}}, 184 {{""}}, 185 {{"HW_REG_SH_MEM_BASES"}, ID_MEM_BASES, isGFX9_GFX10_GFX11}, 186 {{"HW_REG_TBA_LO"}, ID_TBA_LO, isGFX9_GFX10}, 187 {{"HW_REG_TBA_HI"}, ID_TBA_HI, isGFX9_GFX10}, 188 {{"HW_REG_TMA_LO"}, ID_TMA_LO, isGFX9_GFX10}, 189 {{"HW_REG_TMA_HI"}, ID_TMA_HI, isGFX9_GFX10}, 190 {{"HW_REG_FLAT_SCR_LO"}, ID_FLAT_SCR_LO, isGFX10_GFX11}, 191 {{"HW_REG_FLAT_SCR_HI"}, ID_FLAT_SCR_HI, isGFX10_GFX11}, 192 {{"HW_REG_XNACK_MASK"}, ID_XNACK_MASK, isGFX10Before1030}, 193 {{"HW_REG_HW_ID1"}, ID_HW_ID1, isGFX10Plus}, 194 {{"HW_REG_HW_ID2"}, ID_HW_ID2, isGFX10Plus}, 195 {{"HW_REG_POPS_PACKER"}, ID_POPS_PACKER, isGFX10}, 196 {{""}}, 197 {{"HW_REG_PERF_SNAPSHOT_DATA"}, ID_PERF_SNAPSHOT_DATA_gfx11, isGFX11}, 198 {{""}}, 199 {{"HW_REG_SHADER_CYCLES"}, ID_SHADER_CYCLES, isGFX10_3_GFX11}, 200 {{"HW_REG_SHADER_CYCLES_HI"}, ID_SHADER_CYCLES_HI, isGFX12Plus}, 201 {{"HW_REG_DVGPR_ALLOC_LO"}, ID_DVGPR_ALLOC_LO, isGFX12Plus}, 202 {{"HW_REG_DVGPR_ALLOC_HI"}, ID_DVGPR_ALLOC_HI, isGFX12Plus}, 203 204 // Register numbers reused in GFX11 205 {{"HW_REG_PERF_SNAPSHOT_PC_LO"}, ID_PERF_SNAPSHOT_PC_LO_gfx11, isGFX11}, 206 {{"HW_REG_PERF_SNAPSHOT_PC_HI"}, ID_PERF_SNAPSHOT_PC_HI_gfx11, isGFX11}, 207 208 // Register numbers reused in GFX12+ 209 {{"HW_REG_STATE_PRIV"}, ID_STATE_PRIV, isGFX12Plus}, 210 {{"HW_REG_PERF_SNAPSHOT_DATA1"}, ID_PERF_SNAPSHOT_DATA1, isGFX12Plus}, 211 {{"HW_REG_PERF_SNAPSHOT_DATA2"}, ID_PERF_SNAPSHOT_DATA2, isGFX12Plus}, 212 {{"HW_REG_EXCP_FLAG_PRIV"}, ID_EXCP_FLAG_PRIV, isGFX12Plus}, 213 {{"HW_REG_EXCP_FLAG_USER"}, ID_EXCP_FLAG_USER, isGFX12Plus}, 214 {{"HW_REG_TRAP_CTRL"}, ID_TRAP_CTRL, isGFX12Plus}, 215 {{"HW_REG_SCRATCH_BASE_LO"}, ID_FLAT_SCR_LO, isGFX12Plus}, 216 {{"HW_REG_SCRATCH_BASE_HI"}, ID_FLAT_SCR_HI, isGFX12Plus}, 217 {{"HW_REG_SHADER_CYCLES_LO"}, ID_SHADER_CYCLES, isGFX12Plus}, 218 219 // GFX940 specific registers 220 {{"HW_REG_XCC_ID"}, ID_XCC_ID, isGFX940}, 221 {{"HW_REG_SQ_PERF_SNAPSHOT_DATA"}, ID_SQ_PERF_SNAPSHOT_DATA, isGFX940}, 222 {{"HW_REG_SQ_PERF_SNAPSHOT_DATA1"}, ID_SQ_PERF_SNAPSHOT_DATA1, isGFX940}, 223 {{"HW_REG_SQ_PERF_SNAPSHOT_PC_LO"}, ID_SQ_PERF_SNAPSHOT_PC_LO, isGFX940}, 224 {{"HW_REG_SQ_PERF_SNAPSHOT_PC_HI"}, ID_SQ_PERF_SNAPSHOT_PC_HI, isGFX940}, 225 226 // Aliases 227 {{"HW_REG_HW_ID"}, ID_HW_ID1, isGFX10}, 228 }; 229 // clang-format on 230 // NOLINTEND 231 232 int64_t getHwregId(StringRef Name, const MCSubtargetInfo &STI) { 233 return getEncodingFromOperandTable(Operands, Name, STI); 234 } 235 236 StringRef getHwreg(uint64_t Encoding, const MCSubtargetInfo &STI) { 237 return getNameFromOperandTable(Operands, Encoding, STI); 238 } 239 240 } // namespace Hwreg 241 242 namespace MTBUFFormat { 243 244 StringLiteral const DfmtSymbolic[] = { 245 "BUF_DATA_FORMAT_INVALID", 246 "BUF_DATA_FORMAT_8", 247 "BUF_DATA_FORMAT_16", 248 "BUF_DATA_FORMAT_8_8", 249 "BUF_DATA_FORMAT_32", 250 "BUF_DATA_FORMAT_16_16", 251 "BUF_DATA_FORMAT_10_11_11", 252 "BUF_DATA_FORMAT_11_11_10", 253 "BUF_DATA_FORMAT_10_10_10_2", 254 "BUF_DATA_FORMAT_2_10_10_10", 255 "BUF_DATA_FORMAT_8_8_8_8", 256 "BUF_DATA_FORMAT_32_32", 257 "BUF_DATA_FORMAT_16_16_16_16", 258 "BUF_DATA_FORMAT_32_32_32", 259 "BUF_DATA_FORMAT_32_32_32_32", 260 "BUF_DATA_FORMAT_RESERVED_15" 261 }; 262 263 StringLiteral const NfmtSymbolicGFX10[] = { 264 "BUF_NUM_FORMAT_UNORM", 265 "BUF_NUM_FORMAT_SNORM", 266 "BUF_NUM_FORMAT_USCALED", 267 "BUF_NUM_FORMAT_SSCALED", 268 "BUF_NUM_FORMAT_UINT", 269 "BUF_NUM_FORMAT_SINT", 270 "", 271 "BUF_NUM_FORMAT_FLOAT" 272 }; 273 274 StringLiteral const NfmtSymbolicSICI[] = { 275 "BUF_NUM_FORMAT_UNORM", 276 "BUF_NUM_FORMAT_SNORM", 277 "BUF_NUM_FORMAT_USCALED", 278 "BUF_NUM_FORMAT_SSCALED", 279 "BUF_NUM_FORMAT_UINT", 280 "BUF_NUM_FORMAT_SINT", 281 "BUF_NUM_FORMAT_SNORM_OGL", 282 "BUF_NUM_FORMAT_FLOAT" 283 }; 284 285 StringLiteral const NfmtSymbolicVI[] = { // VI and GFX9 286 "BUF_NUM_FORMAT_UNORM", 287 "BUF_NUM_FORMAT_SNORM", 288 "BUF_NUM_FORMAT_USCALED", 289 "BUF_NUM_FORMAT_SSCALED", 290 "BUF_NUM_FORMAT_UINT", 291 "BUF_NUM_FORMAT_SINT", 292 "BUF_NUM_FORMAT_RESERVED_6", 293 "BUF_NUM_FORMAT_FLOAT" 294 }; 295 296 StringLiteral const UfmtSymbolicGFX10[] = { 297 "BUF_FMT_INVALID", 298 299 "BUF_FMT_8_UNORM", 300 "BUF_FMT_8_SNORM", 301 "BUF_FMT_8_USCALED", 302 "BUF_FMT_8_SSCALED", 303 "BUF_FMT_8_UINT", 304 "BUF_FMT_8_SINT", 305 306 "BUF_FMT_16_UNORM", 307 "BUF_FMT_16_SNORM", 308 "BUF_FMT_16_USCALED", 309 "BUF_FMT_16_SSCALED", 310 "BUF_FMT_16_UINT", 311 "BUF_FMT_16_SINT", 312 "BUF_FMT_16_FLOAT", 313 314 "BUF_FMT_8_8_UNORM", 315 "BUF_FMT_8_8_SNORM", 316 "BUF_FMT_8_8_USCALED", 317 "BUF_FMT_8_8_SSCALED", 318 "BUF_FMT_8_8_UINT", 319 "BUF_FMT_8_8_SINT", 320 321 "BUF_FMT_32_UINT", 322 "BUF_FMT_32_SINT", 323 "BUF_FMT_32_FLOAT", 324 325 "BUF_FMT_16_16_UNORM", 326 "BUF_FMT_16_16_SNORM", 327 "BUF_FMT_16_16_USCALED", 328 "BUF_FMT_16_16_SSCALED", 329 "BUF_FMT_16_16_UINT", 330 "BUF_FMT_16_16_SINT", 331 "BUF_FMT_16_16_FLOAT", 332 333 "BUF_FMT_10_11_11_UNORM", 334 "BUF_FMT_10_11_11_SNORM", 335 "BUF_FMT_10_11_11_USCALED", 336 "BUF_FMT_10_11_11_SSCALED", 337 "BUF_FMT_10_11_11_UINT", 338 "BUF_FMT_10_11_11_SINT", 339 "BUF_FMT_10_11_11_FLOAT", 340 341 "BUF_FMT_11_11_10_UNORM", 342 "BUF_FMT_11_11_10_SNORM", 343 "BUF_FMT_11_11_10_USCALED", 344 "BUF_FMT_11_11_10_SSCALED", 345 "BUF_FMT_11_11_10_UINT", 346 "BUF_FMT_11_11_10_SINT", 347 "BUF_FMT_11_11_10_FLOAT", 348 349 "BUF_FMT_10_10_10_2_UNORM", 350 "BUF_FMT_10_10_10_2_SNORM", 351 "BUF_FMT_10_10_10_2_USCALED", 352 "BUF_FMT_10_10_10_2_SSCALED", 353 "BUF_FMT_10_10_10_2_UINT", 354 "BUF_FMT_10_10_10_2_SINT", 355 356 "BUF_FMT_2_10_10_10_UNORM", 357 "BUF_FMT_2_10_10_10_SNORM", 358 "BUF_FMT_2_10_10_10_USCALED", 359 "BUF_FMT_2_10_10_10_SSCALED", 360 "BUF_FMT_2_10_10_10_UINT", 361 "BUF_FMT_2_10_10_10_SINT", 362 363 "BUF_FMT_8_8_8_8_UNORM", 364 "BUF_FMT_8_8_8_8_SNORM", 365 "BUF_FMT_8_8_8_8_USCALED", 366 "BUF_FMT_8_8_8_8_SSCALED", 367 "BUF_FMT_8_8_8_8_UINT", 368 "BUF_FMT_8_8_8_8_SINT", 369 370 "BUF_FMT_32_32_UINT", 371 "BUF_FMT_32_32_SINT", 372 "BUF_FMT_32_32_FLOAT", 373 374 "BUF_FMT_16_16_16_16_UNORM", 375 "BUF_FMT_16_16_16_16_SNORM", 376 "BUF_FMT_16_16_16_16_USCALED", 377 "BUF_FMT_16_16_16_16_SSCALED", 378 "BUF_FMT_16_16_16_16_UINT", 379 "BUF_FMT_16_16_16_16_SINT", 380 "BUF_FMT_16_16_16_16_FLOAT", 381 382 "BUF_FMT_32_32_32_UINT", 383 "BUF_FMT_32_32_32_SINT", 384 "BUF_FMT_32_32_32_FLOAT", 385 "BUF_FMT_32_32_32_32_UINT", 386 "BUF_FMT_32_32_32_32_SINT", 387 "BUF_FMT_32_32_32_32_FLOAT" 388 }; 389 390 unsigned const DfmtNfmt2UFmtGFX10[] = { 391 DFMT_INVALID | (NFMT_UNORM << NFMT_SHIFT), 392 393 DFMT_8 | (NFMT_UNORM << NFMT_SHIFT), 394 DFMT_8 | (NFMT_SNORM << NFMT_SHIFT), 395 DFMT_8 | (NFMT_USCALED << NFMT_SHIFT), 396 DFMT_8 | (NFMT_SSCALED << NFMT_SHIFT), 397 DFMT_8 | (NFMT_UINT << NFMT_SHIFT), 398 DFMT_8 | (NFMT_SINT << NFMT_SHIFT), 399 400 DFMT_16 | (NFMT_UNORM << NFMT_SHIFT), 401 DFMT_16 | (NFMT_SNORM << NFMT_SHIFT), 402 DFMT_16 | (NFMT_USCALED << NFMT_SHIFT), 403 DFMT_16 | (NFMT_SSCALED << NFMT_SHIFT), 404 DFMT_16 | (NFMT_UINT << NFMT_SHIFT), 405 DFMT_16 | (NFMT_SINT << NFMT_SHIFT), 406 DFMT_16 | (NFMT_FLOAT << NFMT_SHIFT), 407 408 DFMT_8_8 | (NFMT_UNORM << NFMT_SHIFT), 409 DFMT_8_8 | (NFMT_SNORM << NFMT_SHIFT), 410 DFMT_8_8 | (NFMT_USCALED << NFMT_SHIFT), 411 DFMT_8_8 | (NFMT_SSCALED << NFMT_SHIFT), 412 DFMT_8_8 | (NFMT_UINT << NFMT_SHIFT), 413 DFMT_8_8 | (NFMT_SINT << NFMT_SHIFT), 414 415 DFMT_32 | (NFMT_UINT << NFMT_SHIFT), 416 DFMT_32 | (NFMT_SINT << NFMT_SHIFT), 417 DFMT_32 | (NFMT_FLOAT << NFMT_SHIFT), 418 419 DFMT_16_16 | (NFMT_UNORM << NFMT_SHIFT), 420 DFMT_16_16 | (NFMT_SNORM << NFMT_SHIFT), 421 DFMT_16_16 | (NFMT_USCALED << NFMT_SHIFT), 422 DFMT_16_16 | (NFMT_SSCALED << NFMT_SHIFT), 423 DFMT_16_16 | (NFMT_UINT << NFMT_SHIFT), 424 DFMT_16_16 | (NFMT_SINT << NFMT_SHIFT), 425 DFMT_16_16 | (NFMT_FLOAT << NFMT_SHIFT), 426 427 DFMT_10_11_11 | (NFMT_UNORM << NFMT_SHIFT), 428 DFMT_10_11_11 | (NFMT_SNORM << NFMT_SHIFT), 429 DFMT_10_11_11 | (NFMT_USCALED << NFMT_SHIFT), 430 DFMT_10_11_11 | (NFMT_SSCALED << NFMT_SHIFT), 431 DFMT_10_11_11 | (NFMT_UINT << NFMT_SHIFT), 432 DFMT_10_11_11 | (NFMT_SINT << NFMT_SHIFT), 433 DFMT_10_11_11 | (NFMT_FLOAT << NFMT_SHIFT), 434 435 DFMT_11_11_10 | (NFMT_UNORM << NFMT_SHIFT), 436 DFMT_11_11_10 | (NFMT_SNORM << NFMT_SHIFT), 437 DFMT_11_11_10 | (NFMT_USCALED << NFMT_SHIFT), 438 DFMT_11_11_10 | (NFMT_SSCALED << NFMT_SHIFT), 439 DFMT_11_11_10 | (NFMT_UINT << NFMT_SHIFT), 440 DFMT_11_11_10 | (NFMT_SINT << NFMT_SHIFT), 441 DFMT_11_11_10 | (NFMT_FLOAT << NFMT_SHIFT), 442 443 DFMT_10_10_10_2 | (NFMT_UNORM << NFMT_SHIFT), 444 DFMT_10_10_10_2 | (NFMT_SNORM << NFMT_SHIFT), 445 DFMT_10_10_10_2 | (NFMT_USCALED << NFMT_SHIFT), 446 DFMT_10_10_10_2 | (NFMT_SSCALED << NFMT_SHIFT), 447 DFMT_10_10_10_2 | (NFMT_UINT << NFMT_SHIFT), 448 DFMT_10_10_10_2 | (NFMT_SINT << NFMT_SHIFT), 449 450 DFMT_2_10_10_10 | (NFMT_UNORM << NFMT_SHIFT), 451 DFMT_2_10_10_10 | (NFMT_SNORM << NFMT_SHIFT), 452 DFMT_2_10_10_10 | (NFMT_USCALED << NFMT_SHIFT), 453 DFMT_2_10_10_10 | (NFMT_SSCALED << NFMT_SHIFT), 454 DFMT_2_10_10_10 | (NFMT_UINT << NFMT_SHIFT), 455 DFMT_2_10_10_10 | (NFMT_SINT << NFMT_SHIFT), 456 457 DFMT_8_8_8_8 | (NFMT_UNORM << NFMT_SHIFT), 458 DFMT_8_8_8_8 | (NFMT_SNORM << NFMT_SHIFT), 459 DFMT_8_8_8_8 | (NFMT_USCALED << NFMT_SHIFT), 460 DFMT_8_8_8_8 | (NFMT_SSCALED << NFMT_SHIFT), 461 DFMT_8_8_8_8 | (NFMT_UINT << NFMT_SHIFT), 462 DFMT_8_8_8_8 | (NFMT_SINT << NFMT_SHIFT), 463 464 DFMT_32_32 | (NFMT_UINT << NFMT_SHIFT), 465 DFMT_32_32 | (NFMT_SINT << NFMT_SHIFT), 466 DFMT_32_32 | (NFMT_FLOAT << NFMT_SHIFT), 467 468 DFMT_16_16_16_16 | (NFMT_UNORM << NFMT_SHIFT), 469 DFMT_16_16_16_16 | (NFMT_SNORM << NFMT_SHIFT), 470 DFMT_16_16_16_16 | (NFMT_USCALED << NFMT_SHIFT), 471 DFMT_16_16_16_16 | (NFMT_SSCALED << NFMT_SHIFT), 472 DFMT_16_16_16_16 | (NFMT_UINT << NFMT_SHIFT), 473 DFMT_16_16_16_16 | (NFMT_SINT << NFMT_SHIFT), 474 DFMT_16_16_16_16 | (NFMT_FLOAT << NFMT_SHIFT), 475 476 DFMT_32_32_32 | (NFMT_UINT << NFMT_SHIFT), 477 DFMT_32_32_32 | (NFMT_SINT << NFMT_SHIFT), 478 DFMT_32_32_32 | (NFMT_FLOAT << NFMT_SHIFT), 479 DFMT_32_32_32_32 | (NFMT_UINT << NFMT_SHIFT), 480 DFMT_32_32_32_32 | (NFMT_SINT << NFMT_SHIFT), 481 DFMT_32_32_32_32 | (NFMT_FLOAT << NFMT_SHIFT) 482 }; 483 484 StringLiteral const UfmtSymbolicGFX11[] = { 485 "BUF_FMT_INVALID", 486 487 "BUF_FMT_8_UNORM", 488 "BUF_FMT_8_SNORM", 489 "BUF_FMT_8_USCALED", 490 "BUF_FMT_8_SSCALED", 491 "BUF_FMT_8_UINT", 492 "BUF_FMT_8_SINT", 493 494 "BUF_FMT_16_UNORM", 495 "BUF_FMT_16_SNORM", 496 "BUF_FMT_16_USCALED", 497 "BUF_FMT_16_SSCALED", 498 "BUF_FMT_16_UINT", 499 "BUF_FMT_16_SINT", 500 "BUF_FMT_16_FLOAT", 501 502 "BUF_FMT_8_8_UNORM", 503 "BUF_FMT_8_8_SNORM", 504 "BUF_FMT_8_8_USCALED", 505 "BUF_FMT_8_8_SSCALED", 506 "BUF_FMT_8_8_UINT", 507 "BUF_FMT_8_8_SINT", 508 509 "BUF_FMT_32_UINT", 510 "BUF_FMT_32_SINT", 511 "BUF_FMT_32_FLOAT", 512 513 "BUF_FMT_16_16_UNORM", 514 "BUF_FMT_16_16_SNORM", 515 "BUF_FMT_16_16_USCALED", 516 "BUF_FMT_16_16_SSCALED", 517 "BUF_FMT_16_16_UINT", 518 "BUF_FMT_16_16_SINT", 519 "BUF_FMT_16_16_FLOAT", 520 521 "BUF_FMT_10_11_11_FLOAT", 522 523 "BUF_FMT_11_11_10_FLOAT", 524 525 "BUF_FMT_10_10_10_2_UNORM", 526 "BUF_FMT_10_10_10_2_SNORM", 527 "BUF_FMT_10_10_10_2_UINT", 528 "BUF_FMT_10_10_10_2_SINT", 529 530 "BUF_FMT_2_10_10_10_UNORM", 531 "BUF_FMT_2_10_10_10_SNORM", 532 "BUF_FMT_2_10_10_10_USCALED", 533 "BUF_FMT_2_10_10_10_SSCALED", 534 "BUF_FMT_2_10_10_10_UINT", 535 "BUF_FMT_2_10_10_10_SINT", 536 537 "BUF_FMT_8_8_8_8_UNORM", 538 "BUF_FMT_8_8_8_8_SNORM", 539 "BUF_FMT_8_8_8_8_USCALED", 540 "BUF_FMT_8_8_8_8_SSCALED", 541 "BUF_FMT_8_8_8_8_UINT", 542 "BUF_FMT_8_8_8_8_SINT", 543 544 "BUF_FMT_32_32_UINT", 545 "BUF_FMT_32_32_SINT", 546 "BUF_FMT_32_32_FLOAT", 547 548 "BUF_FMT_16_16_16_16_UNORM", 549 "BUF_FMT_16_16_16_16_SNORM", 550 "BUF_FMT_16_16_16_16_USCALED", 551 "BUF_FMT_16_16_16_16_SSCALED", 552 "BUF_FMT_16_16_16_16_UINT", 553 "BUF_FMT_16_16_16_16_SINT", 554 "BUF_FMT_16_16_16_16_FLOAT", 555 556 "BUF_FMT_32_32_32_UINT", 557 "BUF_FMT_32_32_32_SINT", 558 "BUF_FMT_32_32_32_FLOAT", 559 "BUF_FMT_32_32_32_32_UINT", 560 "BUF_FMT_32_32_32_32_SINT", 561 "BUF_FMT_32_32_32_32_FLOAT" 562 }; 563 564 unsigned const DfmtNfmt2UFmtGFX11[] = { 565 DFMT_INVALID | (NFMT_UNORM << NFMT_SHIFT), 566 567 DFMT_8 | (NFMT_UNORM << NFMT_SHIFT), 568 DFMT_8 | (NFMT_SNORM << NFMT_SHIFT), 569 DFMT_8 | (NFMT_USCALED << NFMT_SHIFT), 570 DFMT_8 | (NFMT_SSCALED << NFMT_SHIFT), 571 DFMT_8 | (NFMT_UINT << NFMT_SHIFT), 572 DFMT_8 | (NFMT_SINT << NFMT_SHIFT), 573 574 DFMT_16 | (NFMT_UNORM << NFMT_SHIFT), 575 DFMT_16 | (NFMT_SNORM << NFMT_SHIFT), 576 DFMT_16 | (NFMT_USCALED << NFMT_SHIFT), 577 DFMT_16 | (NFMT_SSCALED << NFMT_SHIFT), 578 DFMT_16 | (NFMT_UINT << NFMT_SHIFT), 579 DFMT_16 | (NFMT_SINT << NFMT_SHIFT), 580 DFMT_16 | (NFMT_FLOAT << NFMT_SHIFT), 581 582 DFMT_8_8 | (NFMT_UNORM << NFMT_SHIFT), 583 DFMT_8_8 | (NFMT_SNORM << NFMT_SHIFT), 584 DFMT_8_8 | (NFMT_USCALED << NFMT_SHIFT), 585 DFMT_8_8 | (NFMT_SSCALED << NFMT_SHIFT), 586 DFMT_8_8 | (NFMT_UINT << NFMT_SHIFT), 587 DFMT_8_8 | (NFMT_SINT << NFMT_SHIFT), 588 589 DFMT_32 | (NFMT_UINT << NFMT_SHIFT), 590 DFMT_32 | (NFMT_SINT << NFMT_SHIFT), 591 DFMT_32 | (NFMT_FLOAT << NFMT_SHIFT), 592 593 DFMT_16_16 | (NFMT_UNORM << NFMT_SHIFT), 594 DFMT_16_16 | (NFMT_SNORM << NFMT_SHIFT), 595 DFMT_16_16 | (NFMT_USCALED << NFMT_SHIFT), 596 DFMT_16_16 | (NFMT_SSCALED << NFMT_SHIFT), 597 DFMT_16_16 | (NFMT_UINT << NFMT_SHIFT), 598 DFMT_16_16 | (NFMT_SINT << NFMT_SHIFT), 599 DFMT_16_16 | (NFMT_FLOAT << NFMT_SHIFT), 600 601 DFMT_10_11_11 | (NFMT_FLOAT << NFMT_SHIFT), 602 603 DFMT_11_11_10 | (NFMT_FLOAT << NFMT_SHIFT), 604 605 DFMT_10_10_10_2 | (NFMT_UNORM << NFMT_SHIFT), 606 DFMT_10_10_10_2 | (NFMT_SNORM << NFMT_SHIFT), 607 DFMT_10_10_10_2 | (NFMT_UINT << NFMT_SHIFT), 608 DFMT_10_10_10_2 | (NFMT_SINT << NFMT_SHIFT), 609 610 DFMT_2_10_10_10 | (NFMT_UNORM << NFMT_SHIFT), 611 DFMT_2_10_10_10 | (NFMT_SNORM << NFMT_SHIFT), 612 DFMT_2_10_10_10 | (NFMT_USCALED << NFMT_SHIFT), 613 DFMT_2_10_10_10 | (NFMT_SSCALED << NFMT_SHIFT), 614 DFMT_2_10_10_10 | (NFMT_UINT << NFMT_SHIFT), 615 DFMT_2_10_10_10 | (NFMT_SINT << NFMT_SHIFT), 616 617 DFMT_8_8_8_8 | (NFMT_UNORM << NFMT_SHIFT), 618 DFMT_8_8_8_8 | (NFMT_SNORM << NFMT_SHIFT), 619 DFMT_8_8_8_8 | (NFMT_USCALED << NFMT_SHIFT), 620 DFMT_8_8_8_8 | (NFMT_SSCALED << NFMT_SHIFT), 621 DFMT_8_8_8_8 | (NFMT_UINT << NFMT_SHIFT), 622 DFMT_8_8_8_8 | (NFMT_SINT << NFMT_SHIFT), 623 624 DFMT_32_32 | (NFMT_UINT << NFMT_SHIFT), 625 DFMT_32_32 | (NFMT_SINT << NFMT_SHIFT), 626 DFMT_32_32 | (NFMT_FLOAT << NFMT_SHIFT), 627 628 DFMT_16_16_16_16 | (NFMT_UNORM << NFMT_SHIFT), 629 DFMT_16_16_16_16 | (NFMT_SNORM << NFMT_SHIFT), 630 DFMT_16_16_16_16 | (NFMT_USCALED << NFMT_SHIFT), 631 DFMT_16_16_16_16 | (NFMT_SSCALED << NFMT_SHIFT), 632 DFMT_16_16_16_16 | (NFMT_UINT << NFMT_SHIFT), 633 DFMT_16_16_16_16 | (NFMT_SINT << NFMT_SHIFT), 634 DFMT_16_16_16_16 | (NFMT_FLOAT << NFMT_SHIFT), 635 636 DFMT_32_32_32 | (NFMT_UINT << NFMT_SHIFT), 637 DFMT_32_32_32 | (NFMT_SINT << NFMT_SHIFT), 638 DFMT_32_32_32 | (NFMT_FLOAT << NFMT_SHIFT), 639 DFMT_32_32_32_32 | (NFMT_UINT << NFMT_SHIFT), 640 DFMT_32_32_32_32 | (NFMT_SINT << NFMT_SHIFT), 641 DFMT_32_32_32_32 | (NFMT_FLOAT << NFMT_SHIFT) 642 }; 643 644 } // namespace MTBUFFormat 645 646 namespace Swizzle { 647 648 // This must be in sync with llvm::AMDGPU::Swizzle::Id enum members, see SIDefines.h. 649 const char* const IdSymbolic[] = { 650 "QUAD_PERM", 651 "BITMASK_PERM", 652 "SWAP", 653 "REVERSE", 654 "BROADCAST", 655 }; 656 657 } // namespace Swizzle 658 659 namespace VGPRIndexMode { 660 661 // This must be in sync with llvm::AMDGPU::VGPRIndexMode::Id enum members, see SIDefines.h. 662 const char* const IdSymbolic[] = { 663 "SRC0", 664 "SRC1", 665 "SRC2", 666 "DST", 667 }; 668 669 } // namespace VGPRIndexMode 670 671 namespace UCVersion { 672 673 ArrayRef<GFXVersion> getGFXVersions() { 674 // GFX6, GFX8 and GFX9 don't support s_version and there are no 675 // UC_VERSION_GFX* codes for them. 676 static const GFXVersion Versions[] = {{"UC_VERSION_GFX7", 0}, 677 {"UC_VERSION_GFX10", 4}, 678 {"UC_VERSION_GFX11", 6}, 679 {"UC_VERSION_GFX12", 9}}; 680 681 return Versions; 682 } 683 684 } // namespace UCVersion 685 686 } // namespace llvm::AMDGPU 687