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