xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/Utils/AMDGPUAsmUtils.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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>
getNameFromOperandTable(const CustomOperand (& Table)[N],unsigned Encoding,const MCSubtargetInfo & STI)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>
getEncodingFromOperandTable(const CustomOperand (& Table)[N],StringRef Name,const MCSubtargetInfo & STI)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 
getMsgId(StringRef Name,const MCSubtargetInfo & STI)139 int64_t getMsgId(StringRef Name, const MCSubtargetInfo &STI) {
140   return getEncodingFromOperandTable(MsgOperands, Name, STI);
141 }
142 
getMsgName(uint64_t Encoding,const MCSubtargetInfo & STI)143 StringRef getMsgName(uint64_t Encoding, const MCSubtargetInfo &STI) {
144   return getNameFromOperandTable(MsgOperands, Encoding, STI);
145 }
146 
getMsgOpId(int64_t MsgId,StringRef Name,const MCSubtargetInfo & STI)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 
getMsgOpName(int64_t MsgId,uint64_t Encoding,const MCSubtargetInfo & STI)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 
getHwregId(StringRef Name,const MCSubtargetInfo & STI)232 int64_t getHwregId(StringRef Name, const MCSubtargetInfo &STI) {
233   return getEncodingFromOperandTable(Operands, Name, STI);
234 }
235 
getHwreg(uint64_t Encoding,const MCSubtargetInfo & STI)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 
getGFXVersions()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