xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AMDGPU/SIDefines.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===-- SIDefines.h - SI Helper Macros ----------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric /// \file
80b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric 
100b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_SIDEFINES_H
110b57cec5SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_SIDEFINES_H
120b57cec5SDimitry Andric 
13349cc55cSDimitry Andric #include "llvm/MC/MCInstrDesc.h"
14349cc55cSDimitry Andric 
150b57cec5SDimitry Andric namespace llvm {
160b57cec5SDimitry Andric 
17349cc55cSDimitry Andric // This needs to be kept in sync with the field bits in SIRegisterClass.
18349cc55cSDimitry Andric enum SIRCFlags : uint8_t {
1906c3fb27SDimitry Andric   RegTupleAlignUnitsWidth = 2,
2006c3fb27SDimitry Andric   HasVGPRBit = RegTupleAlignUnitsWidth,
2106c3fb27SDimitry Andric   HasAGPRBit,
2206c3fb27SDimitry Andric   HasSGPRbit,
2306c3fb27SDimitry Andric 
2406c3fb27SDimitry Andric   HasVGPR = 1 << HasVGPRBit,
2506c3fb27SDimitry Andric   HasAGPR = 1 << HasAGPRBit,
2606c3fb27SDimitry Andric   HasSGPR = 1 << HasSGPRbit,
2706c3fb27SDimitry Andric 
2806c3fb27SDimitry Andric   RegTupleAlignUnitsMask = (1 << RegTupleAlignUnitsWidth) - 1,
2906c3fb27SDimitry Andric   RegKindMask = (HasVGPR | HasAGPR | HasSGPR)
3006c3fb27SDimitry Andric }; // enum SIRCFlagsr
3106c3fb27SDimitry Andric 
3206c3fb27SDimitry Andric namespace SIEncodingFamily {
3306c3fb27SDimitry Andric // This must be kept in sync with the SIEncodingFamily class in SIInstrInfo.td
3406c3fb27SDimitry Andric // and the columns of the getMCOpcodeGen table.
3506c3fb27SDimitry Andric enum {
3606c3fb27SDimitry Andric   SI = 0,
3706c3fb27SDimitry Andric   VI = 1,
3806c3fb27SDimitry Andric   SDWA = 2,
3906c3fb27SDimitry Andric   SDWA9 = 3,
4006c3fb27SDimitry Andric   GFX80 = 4,
4106c3fb27SDimitry Andric   GFX9 = 5,
4206c3fb27SDimitry Andric   GFX10 = 6,
4306c3fb27SDimitry Andric   SDWA10 = 7,
4406c3fb27SDimitry Andric   GFX90A = 8,
4506c3fb27SDimitry Andric   GFX940 = 9,
4606c3fb27SDimitry Andric   GFX11 = 10,
475f757f3fSDimitry Andric   GFX12 = 11,
4806c3fb27SDimitry Andric };
4906c3fb27SDimitry Andric }
50349cc55cSDimitry Andric 
510b57cec5SDimitry Andric namespace SIInstrFlags {
520b57cec5SDimitry Andric // This needs to be kept in sync with the field bits in InstSI.
530b57cec5SDimitry Andric enum : uint64_t {
540b57cec5SDimitry Andric   // Low bits - basic encoding information.
550b57cec5SDimitry Andric   SALU = 1 << 0,
560b57cec5SDimitry Andric   VALU = 1 << 1,
570b57cec5SDimitry Andric 
580b57cec5SDimitry Andric   // SALU instruction formats.
590b57cec5SDimitry Andric   SOP1 = 1 << 2,
600b57cec5SDimitry Andric   SOP2 = 1 << 3,
610b57cec5SDimitry Andric   SOPC = 1 << 4,
620b57cec5SDimitry Andric   SOPK = 1 << 5,
630b57cec5SDimitry Andric   SOPP = 1 << 6,
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric   // VALU instruction formats.
660b57cec5SDimitry Andric   VOP1 = 1 << 7,
670b57cec5SDimitry Andric   VOP2 = 1 << 8,
680b57cec5SDimitry Andric   VOPC = 1 << 9,
690b57cec5SDimitry Andric 
700b57cec5SDimitry Andric   // TODO: Should this be spilt into VOP3 a and b?
710b57cec5SDimitry Andric   VOP3 = 1 << 10,
720b57cec5SDimitry Andric   VOP3P = 1 << 12,
730b57cec5SDimitry Andric 
740b57cec5SDimitry Andric   VINTRP = 1 << 13,
750b57cec5SDimitry Andric   SDWA = 1 << 14,
760b57cec5SDimitry Andric   DPP = 1 << 15,
77e8d8bef9SDimitry Andric   TRANS = 1 << 16,
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric   // Memory instruction formats.
80e8d8bef9SDimitry Andric   MUBUF = 1 << 17,
81e8d8bef9SDimitry Andric   MTBUF = 1 << 18,
82e8d8bef9SDimitry Andric   SMRD = 1 << 19,
83e8d8bef9SDimitry Andric   MIMG = 1 << 20,
845f757f3fSDimitry Andric   VIMAGE = 1 << 21,
855f757f3fSDimitry Andric   VSAMPLE = 1 << 22,
865f757f3fSDimitry Andric   EXP = 1 << 23,
875f757f3fSDimitry Andric   FLAT = 1 << 24,
885f757f3fSDimitry Andric   DS = 1 << 25,
890b57cec5SDimitry Andric 
90*0fca6ea1SDimitry Andric   // Combined SGPR/VGPR Spill bit
91*0fca6ea1SDimitry Andric   // Logic to separate them out is done in isSGPRSpill and isVGPRSpill
92*0fca6ea1SDimitry Andric   Spill = 1 << 26,
930b57cec5SDimitry Andric 
9481ad6265SDimitry Andric   // LDSDIR instruction format.
955f757f3fSDimitry Andric   LDSDIR = 1 << 28,
9681ad6265SDimitry Andric 
9781ad6265SDimitry Andric   // VINTERP instruction format.
985f757f3fSDimitry Andric   VINTERP = 1 << 29,
9981ad6265SDimitry Andric 
1000b57cec5SDimitry Andric   // High bits - other information.
1010b57cec5SDimitry Andric   VM_CNT = UINT64_C(1) << 32,
1020b57cec5SDimitry Andric   EXP_CNT = UINT64_C(1) << 33,
1030b57cec5SDimitry Andric   LGKM_CNT = UINT64_C(1) << 34,
1040b57cec5SDimitry Andric 
1050b57cec5SDimitry Andric   WQM = UINT64_C(1) << 35,
1060b57cec5SDimitry Andric   DisableWQM = UINT64_C(1) << 36,
1070b57cec5SDimitry Andric   Gather4 = UINT64_C(1) << 37,
108*0fca6ea1SDimitry Andric 
109*0fca6ea1SDimitry Andric   // Reserved, must be 0.
110*0fca6ea1SDimitry Andric   Reserved0 = UINT64_C(1) << 38,
111*0fca6ea1SDimitry Andric 
1120b57cec5SDimitry Andric   SCALAR_STORE = UINT64_C(1) << 39,
1130b57cec5SDimitry Andric   FIXED_SIZE = UINT64_C(1) << 40,
114*0fca6ea1SDimitry Andric 
115*0fca6ea1SDimitry Andric   // Reserved, must be 0.
116*0fca6ea1SDimitry Andric   Reserved1 = UINT64_C(1) << 41,
117*0fca6ea1SDimitry Andric 
1180b57cec5SDimitry Andric   VOP3_OPSEL = UINT64_C(1) << 42,
1190b57cec5SDimitry Andric   maybeAtomic = UINT64_C(1) << 43,
1200b57cec5SDimitry Andric   renamedInGFX9 = UINT64_C(1) << 44,
1210b57cec5SDimitry Andric 
1220b57cec5SDimitry Andric   // Is a clamp on FP type.
1230b57cec5SDimitry Andric   FPClamp = UINT64_C(1) << 45,
1240b57cec5SDimitry Andric 
1250b57cec5SDimitry Andric   // Is an integer clamp
1260b57cec5SDimitry Andric   IntClamp = UINT64_C(1) << 46,
1270b57cec5SDimitry Andric 
1280b57cec5SDimitry Andric   // Clamps lo component of register.
1290b57cec5SDimitry Andric   ClampLo = UINT64_C(1) << 47,
1300b57cec5SDimitry Andric 
1310b57cec5SDimitry Andric   // Clamps hi component of register.
1320b57cec5SDimitry Andric   // ClampLo and ClampHi set for packed clamp.
1330b57cec5SDimitry Andric   ClampHi = UINT64_C(1) << 48,
1340b57cec5SDimitry Andric 
1350b57cec5SDimitry Andric   // Is a packed VOP3P instruction.
1360b57cec5SDimitry Andric   IsPacked = UINT64_C(1) << 49,
1370b57cec5SDimitry Andric 
1380b57cec5SDimitry Andric   // Is a D16 buffer instruction.
1390b57cec5SDimitry Andric   D16Buf = UINT64_C(1) << 50,
1400b57cec5SDimitry Andric 
141e8d8bef9SDimitry Andric   // FLAT instruction accesses FLAT_GLBL segment.
142fe6060f1SDimitry Andric   FlatGlobal = UINT64_C(1) << 51,
1430b57cec5SDimitry Andric 
1440b57cec5SDimitry Andric   // Uses floating point double precision rounding mode
1450b57cec5SDimitry Andric   FPDPRounding = UINT64_C(1) << 52,
1460b57cec5SDimitry Andric 
1470b57cec5SDimitry Andric   // Instruction is FP atomic.
1480b57cec5SDimitry Andric   FPAtomic = UINT64_C(1) << 53,
1490b57cec5SDimitry Andric 
1500b57cec5SDimitry Andric   // Is a MFMA instruction.
1518bcb0991SDimitry Andric   IsMAI = UINT64_C(1) << 54,
1528bcb0991SDimitry Andric 
1538bcb0991SDimitry Andric   // Is a DOT instruction.
154e8d8bef9SDimitry Andric   IsDOT = UINT64_C(1) << 55,
155e8d8bef9SDimitry Andric 
156e8d8bef9SDimitry Andric   // FLAT instruction accesses FLAT_SCRATCH segment.
157fe6060f1SDimitry Andric   FlatScratch = UINT64_C(1) << 56,
158fe6060f1SDimitry Andric 
159fe6060f1SDimitry Andric   // Atomic without return.
160fe6060f1SDimitry Andric   IsAtomicNoRet = UINT64_C(1) << 57,
161fe6060f1SDimitry Andric 
162fe6060f1SDimitry Andric   // Atomic with return.
16381ad6265SDimitry Andric   IsAtomicRet = UINT64_C(1) << 58,
16481ad6265SDimitry Andric 
16581ad6265SDimitry Andric   // Is a WMMA instruction.
16681ad6265SDimitry Andric   IsWMMA = UINT64_C(1) << 59,
167bdd1243dSDimitry Andric 
168bdd1243dSDimitry Andric   // Whether tied sources will be read.
169bdd1243dSDimitry Andric   TiedSourceNotRead = UINT64_C(1) << 60,
17006c3fb27SDimitry Andric 
17106c3fb27SDimitry Andric   // Is never uniform.
17206c3fb27SDimitry Andric   IsNeverUniform = UINT64_C(1) << 61,
1735f757f3fSDimitry Andric 
1745f757f3fSDimitry Andric   // ds_gws_* instructions.
1755f757f3fSDimitry Andric   GWS = UINT64_C(1) << 62,
176b3edf446SDimitry Andric 
177b3edf446SDimitry Andric   // Is a SWMMAC instruction.
178b3edf446SDimitry Andric   IsSWMMAC = UINT64_C(1) << 63,
1790b57cec5SDimitry Andric };
1800b57cec5SDimitry Andric 
1810b57cec5SDimitry Andric // v_cmp_class_* etc. use a 10-bit mask for what operation is checked.
1820b57cec5SDimitry Andric // The result is true if any of these tests are true.
1830b57cec5SDimitry Andric enum ClassFlags : unsigned {
1840b57cec5SDimitry Andric   S_NAN = 1 << 0,        // Signaling NaN
1850b57cec5SDimitry Andric   Q_NAN = 1 << 1,        // Quiet NaN
1860b57cec5SDimitry Andric   N_INFINITY = 1 << 2,   // Negative infinity
1870b57cec5SDimitry Andric   N_NORMAL = 1 << 3,     // Negative normal
1880b57cec5SDimitry Andric   N_SUBNORMAL = 1 << 4,  // Negative subnormal
1890b57cec5SDimitry Andric   N_ZERO = 1 << 5,       // Negative zero
1900b57cec5SDimitry Andric   P_ZERO = 1 << 6,       // Positive zero
1910b57cec5SDimitry Andric   P_SUBNORMAL = 1 << 7,  // Positive subnormal
1920b57cec5SDimitry Andric   P_NORMAL = 1 << 8,     // Positive normal
1930b57cec5SDimitry Andric   P_INFINITY = 1 << 9    // Positive infinity
1940b57cec5SDimitry Andric };
1950b57cec5SDimitry Andric }
1960b57cec5SDimitry Andric 
1970b57cec5SDimitry Andric namespace AMDGPU {
1980b57cec5SDimitry Andric enum OperandType : unsigned {
1990b57cec5SDimitry Andric   /// Operands with register or 32-bit immediate
2000b57cec5SDimitry Andric   OPERAND_REG_IMM_INT32 = MCOI::OPERAND_FIRST_TARGET,
2010b57cec5SDimitry Andric   OPERAND_REG_IMM_INT64,
2020b57cec5SDimitry Andric   OPERAND_REG_IMM_INT16,
2030b57cec5SDimitry Andric   OPERAND_REG_IMM_FP32,
2040b57cec5SDimitry Andric   OPERAND_REG_IMM_FP64,
205*0fca6ea1SDimitry Andric   OPERAND_REG_IMM_BF16,
2060b57cec5SDimitry Andric   OPERAND_REG_IMM_FP16,
207*0fca6ea1SDimitry Andric   OPERAND_REG_IMM_BF16_DEFERRED,
208349cc55cSDimitry Andric   OPERAND_REG_IMM_FP16_DEFERRED,
209349cc55cSDimitry Andric   OPERAND_REG_IMM_FP32_DEFERRED,
210*0fca6ea1SDimitry Andric   OPERAND_REG_IMM_V2BF16,
2110b57cec5SDimitry Andric   OPERAND_REG_IMM_V2FP16,
2120b57cec5SDimitry Andric   OPERAND_REG_IMM_V2INT16,
213fe6060f1SDimitry Andric   OPERAND_REG_IMM_V2INT32,
214fe6060f1SDimitry Andric   OPERAND_REG_IMM_V2FP32,
2150b57cec5SDimitry Andric 
2160b57cec5SDimitry Andric   /// Operands with register or inline constant
2170b57cec5SDimitry Andric   OPERAND_REG_INLINE_C_INT16,
2180b57cec5SDimitry Andric   OPERAND_REG_INLINE_C_INT32,
2190b57cec5SDimitry Andric   OPERAND_REG_INLINE_C_INT64,
220*0fca6ea1SDimitry Andric   OPERAND_REG_INLINE_C_BF16,
2210b57cec5SDimitry Andric   OPERAND_REG_INLINE_C_FP16,
2220b57cec5SDimitry Andric   OPERAND_REG_INLINE_C_FP32,
2230b57cec5SDimitry Andric   OPERAND_REG_INLINE_C_FP64,
2240b57cec5SDimitry Andric   OPERAND_REG_INLINE_C_V2INT16,
225*0fca6ea1SDimitry Andric   OPERAND_REG_INLINE_C_V2BF16,
226fe6060f1SDimitry Andric   OPERAND_REG_INLINE_C_V2FP16,
227fe6060f1SDimitry Andric   OPERAND_REG_INLINE_C_V2INT32,
228fe6060f1SDimitry Andric   OPERAND_REG_INLINE_C_V2FP32,
2290b57cec5SDimitry Andric 
2305f757f3fSDimitry Andric   // Operand for split barrier inline constant
2315f757f3fSDimitry Andric   OPERAND_INLINE_SPLIT_BARRIER_INT32,
2325f757f3fSDimitry Andric 
233349cc55cSDimitry Andric   /// Operand with 32-bit immediate that uses the constant bus.
234349cc55cSDimitry Andric   OPERAND_KIMM32,
235349cc55cSDimitry Andric   OPERAND_KIMM16,
236349cc55cSDimitry Andric 
2370b57cec5SDimitry Andric   /// Operands with an AccVGPR register or inline constant
2380b57cec5SDimitry Andric   OPERAND_REG_INLINE_AC_INT16,
2390b57cec5SDimitry Andric   OPERAND_REG_INLINE_AC_INT32,
240*0fca6ea1SDimitry Andric   OPERAND_REG_INLINE_AC_BF16,
2410b57cec5SDimitry Andric   OPERAND_REG_INLINE_AC_FP16,
2420b57cec5SDimitry Andric   OPERAND_REG_INLINE_AC_FP32,
243fe6060f1SDimitry Andric   OPERAND_REG_INLINE_AC_FP64,
2440b57cec5SDimitry Andric   OPERAND_REG_INLINE_AC_V2INT16,
245*0fca6ea1SDimitry Andric   OPERAND_REG_INLINE_AC_V2BF16,
246fe6060f1SDimitry Andric   OPERAND_REG_INLINE_AC_V2FP16,
247fe6060f1SDimitry Andric   OPERAND_REG_INLINE_AC_V2INT32,
248fe6060f1SDimitry Andric   OPERAND_REG_INLINE_AC_V2FP32,
2490b57cec5SDimitry Andric 
250bdd1243dSDimitry Andric   // Operand for source modifiers for VOP instructions
251bdd1243dSDimitry Andric   OPERAND_INPUT_MODS,
252bdd1243dSDimitry Andric 
253bdd1243dSDimitry Andric   // Operand for SDWA instructions
254bdd1243dSDimitry Andric   OPERAND_SDWA_VOPC_DST,
255bdd1243dSDimitry Andric 
2560b57cec5SDimitry Andric   OPERAND_REG_IMM_FIRST = OPERAND_REG_IMM_INT32,
257fe6060f1SDimitry Andric   OPERAND_REG_IMM_LAST = OPERAND_REG_IMM_V2FP32,
2580b57cec5SDimitry Andric 
2590b57cec5SDimitry Andric   OPERAND_REG_INLINE_C_FIRST = OPERAND_REG_INLINE_C_INT16,
260fe6060f1SDimitry Andric   OPERAND_REG_INLINE_C_LAST = OPERAND_REG_INLINE_AC_V2FP32,
2610b57cec5SDimitry Andric 
2620b57cec5SDimitry Andric   OPERAND_REG_INLINE_AC_FIRST = OPERAND_REG_INLINE_AC_INT16,
263fe6060f1SDimitry Andric   OPERAND_REG_INLINE_AC_LAST = OPERAND_REG_INLINE_AC_V2FP32,
2640b57cec5SDimitry Andric 
2650b57cec5SDimitry Andric   OPERAND_SRC_FIRST = OPERAND_REG_IMM_INT32,
2660b57cec5SDimitry Andric   OPERAND_SRC_LAST = OPERAND_REG_INLINE_C_LAST,
2670b57cec5SDimitry Andric 
268bdd1243dSDimitry Andric   OPERAND_KIMM_FIRST = OPERAND_KIMM32,
269bdd1243dSDimitry Andric   OPERAND_KIMM_LAST = OPERAND_KIMM16
2700b57cec5SDimitry Andric 
2710b57cec5SDimitry Andric };
272*0fca6ea1SDimitry Andric 
273*0fca6ea1SDimitry Andric // Should be in sync with the OperandSemantics defined in SIRegisterInfo.td
274*0fca6ea1SDimitry Andric enum OperandSemantics : unsigned {
275*0fca6ea1SDimitry Andric   INT = 0,
276*0fca6ea1SDimitry Andric   FP16 = 1,
277*0fca6ea1SDimitry Andric   BF16 = 2,
278*0fca6ea1SDimitry Andric   FP32 = 3,
279*0fca6ea1SDimitry Andric   FP64 = 4,
280*0fca6ea1SDimitry Andric };
2810b57cec5SDimitry Andric }
2820b57cec5SDimitry Andric 
2830b57cec5SDimitry Andric // Input operand modifiers bit-masks
2840b57cec5SDimitry Andric // NEG and SEXT share same bit-mask because they can't be set simultaneously.
2850b57cec5SDimitry Andric namespace SISrcMods {
2860b57cec5SDimitry Andric   enum : unsigned {
28706c3fb27SDimitry Andric    NONE = 0,
2880b57cec5SDimitry Andric    NEG = 1 << 0,   // Floating-point negate modifier
2890b57cec5SDimitry Andric    ABS = 1 << 1,   // Floating-point absolute modifier
2900b57cec5SDimitry Andric    SEXT = 1 << 0,  // Integer sign-extend modifier
2910b57cec5SDimitry Andric    NEG_HI = ABS,   // Floating-point negate high packed component modifier.
2920b57cec5SDimitry Andric    OP_SEL_0 = 1 << 2,
2930b57cec5SDimitry Andric    OP_SEL_1 = 1 << 3,
2940b57cec5SDimitry Andric    DST_OP_SEL = 1 << 3 // VOP3 dst op_sel (share mask with OP_SEL_1)
2950b57cec5SDimitry Andric   };
2960b57cec5SDimitry Andric }
2970b57cec5SDimitry Andric 
2980b57cec5SDimitry Andric namespace SIOutMods {
2990b57cec5SDimitry Andric   enum : unsigned {
3000b57cec5SDimitry Andric     NONE = 0,
3010b57cec5SDimitry Andric     MUL2 = 1,
3020b57cec5SDimitry Andric     MUL4 = 2,
3030b57cec5SDimitry Andric     DIV2 = 3
3040b57cec5SDimitry Andric   };
3050b57cec5SDimitry Andric }
3060b57cec5SDimitry Andric 
3070b57cec5SDimitry Andric namespace AMDGPU {
3080b57cec5SDimitry Andric namespace VGPRIndexMode {
3090b57cec5SDimitry Andric 
3100b57cec5SDimitry Andric enum Id : unsigned { // id of symbolic names
3110b57cec5SDimitry Andric   ID_SRC0 = 0,
3120b57cec5SDimitry Andric   ID_SRC1,
3130b57cec5SDimitry Andric   ID_SRC2,
3140b57cec5SDimitry Andric   ID_DST,
3150b57cec5SDimitry Andric 
3160b57cec5SDimitry Andric   ID_MIN = ID_SRC0,
3170b57cec5SDimitry Andric   ID_MAX = ID_DST
3180b57cec5SDimitry Andric };
3190b57cec5SDimitry Andric 
3200b57cec5SDimitry Andric enum EncBits : unsigned {
3210b57cec5SDimitry Andric   OFF = 0,
3220b57cec5SDimitry Andric   SRC0_ENABLE = 1 << ID_SRC0,
3230b57cec5SDimitry Andric   SRC1_ENABLE = 1 << ID_SRC1,
3240b57cec5SDimitry Andric   SRC2_ENABLE = 1 << ID_SRC2,
3250b57cec5SDimitry Andric   DST_ENABLE = 1 << ID_DST,
326e8d8bef9SDimitry Andric   ENABLE_MASK = SRC0_ENABLE | SRC1_ENABLE | SRC2_ENABLE | DST_ENABLE,
327e8d8bef9SDimitry Andric   UNDEF = 0xFFFF
3280b57cec5SDimitry Andric };
3290b57cec5SDimitry Andric 
3300b57cec5SDimitry Andric } // namespace VGPRIndexMode
3310b57cec5SDimitry Andric } // namespace AMDGPU
3320b57cec5SDimitry Andric 
3330b57cec5SDimitry Andric namespace AMDGPUAsmVariants {
3340b57cec5SDimitry Andric   enum : unsigned {
3350b57cec5SDimitry Andric     DEFAULT = 0,
3360b57cec5SDimitry Andric     VOP3 = 1,
3370b57cec5SDimitry Andric     SDWA = 2,
3380b57cec5SDimitry Andric     SDWA9 = 3,
33981ad6265SDimitry Andric     DPP = 4,
34081ad6265SDimitry Andric     VOP3_DPP = 5
3410b57cec5SDimitry Andric   };
34281ad6265SDimitry Andric } // namespace AMDGPUAsmVariants
3430b57cec5SDimitry Andric 
3440b57cec5SDimitry Andric namespace AMDGPU {
3450b57cec5SDimitry Andric namespace EncValues { // Encoding values of enum9/8/7 operands
3460b57cec5SDimitry Andric 
3470b57cec5SDimitry Andric enum : unsigned {
3480b57cec5SDimitry Andric   SGPR_MIN = 0,
3490b57cec5SDimitry Andric   SGPR_MAX_SI = 101,
3500b57cec5SDimitry Andric   SGPR_MAX_GFX10 = 105,
3510b57cec5SDimitry Andric   TTMP_VI_MIN = 112,
3520b57cec5SDimitry Andric   TTMP_VI_MAX = 123,
353e8d8bef9SDimitry Andric   TTMP_GFX9PLUS_MIN = 108,
354e8d8bef9SDimitry Andric   TTMP_GFX9PLUS_MAX = 123,
3550b57cec5SDimitry Andric   INLINE_INTEGER_C_MIN = 128,
3560b57cec5SDimitry Andric   INLINE_INTEGER_C_POSITIVE_MAX = 192, // 64
3570b57cec5SDimitry Andric   INLINE_INTEGER_C_MAX = 208,
3580b57cec5SDimitry Andric   INLINE_FLOATING_C_MIN = 240,
3590b57cec5SDimitry Andric   INLINE_FLOATING_C_MAX = 248,
3600b57cec5SDimitry Andric   LITERAL_CONST = 255,
3610b57cec5SDimitry Andric   VGPR_MIN = 256,
36281ad6265SDimitry Andric   VGPR_MAX = 511,
3635f757f3fSDimitry Andric   IS_VGPR = 256, // Indicates VGPR or AGPR
3640b57cec5SDimitry Andric };
3650b57cec5SDimitry Andric 
3660b57cec5SDimitry Andric } // namespace EncValues
3670b57cec5SDimitry Andric 
3685f757f3fSDimitry Andric // Register codes as defined in the TableGen's HWEncoding field.
3695f757f3fSDimitry Andric namespace HWEncoding {
3705f757f3fSDimitry Andric enum : unsigned {
3715f757f3fSDimitry Andric   REG_IDX_MASK = 0xff,
3725f757f3fSDimitry Andric   IS_VGPR_OR_AGPR = 1 << 8,
3735f757f3fSDimitry Andric   IS_HI = 1 << 9, // High 16-bit register.
3745f757f3fSDimitry Andric };
3755f757f3fSDimitry Andric } // namespace HWEncoding
3765f757f3fSDimitry Andric 
377fe6060f1SDimitry Andric namespace CPol {
378fe6060f1SDimitry Andric 
379fe6060f1SDimitry Andric enum CPol {
380fe6060f1SDimitry Andric   GLC = 1,
381fe6060f1SDimitry Andric   SLC = 2,
382fe6060f1SDimitry Andric   DLC = 4,
383fe6060f1SDimitry Andric   SCC = 16,
38481ad6265SDimitry Andric   SC0 = GLC,
38581ad6265SDimitry Andric   SC1 = SCC,
38681ad6265SDimitry Andric   NT = SLC,
3875f757f3fSDimitry Andric   ALL_pregfx12 = GLC | SLC | DLC | SCC,
3885f757f3fSDimitry Andric   SWZ_pregfx12 = 8,
3895f757f3fSDimitry Andric 
3905f757f3fSDimitry Andric   // Below are GFX12+ cache policy bits
3915f757f3fSDimitry Andric 
3925f757f3fSDimitry Andric   // Temporal hint
3935f757f3fSDimitry Andric   TH = 0x7,      // All TH bits
3945f757f3fSDimitry Andric   TH_RT = 0,     // regular
3955f757f3fSDimitry Andric   TH_NT = 1,     // non-temporal
3965f757f3fSDimitry Andric   TH_HT = 2,     // high-temporal
3975f757f3fSDimitry Andric   TH_LU = 3,     // last use
3985f757f3fSDimitry Andric   TH_RT_WB = 3,  // regular (CU, SE), high-temporal with write-back (MALL)
3995f757f3fSDimitry Andric   TH_NT_RT = 4,  // non-temporal (CU, SE), regular (MALL)
4005f757f3fSDimitry Andric   TH_RT_NT = 5,  // regular (CU, SE), non-temporal (MALL)
4015f757f3fSDimitry Andric   TH_NT_HT = 6,  // non-temporal (CU, SE), high-temporal (MALL)
4025f757f3fSDimitry Andric   TH_NT_WB = 7,  // non-temporal (CU, SE), high-temporal with write-back (MALL)
4035f757f3fSDimitry Andric   TH_BYPASS = 3, // only to be used with scope = 3
4045f757f3fSDimitry Andric 
4055f757f3fSDimitry Andric   TH_RESERVED = 7, // unused value for load insts
4065f757f3fSDimitry Andric 
4075f757f3fSDimitry Andric   // Bits of TH for atomics
4085f757f3fSDimitry Andric   TH_ATOMIC_RETURN = GLC, // Returning vs non-returning
4095f757f3fSDimitry Andric   TH_ATOMIC_NT = SLC,     // Non-temporal vs regular
4105f757f3fSDimitry Andric   TH_ATOMIC_CASCADE = 4,  // Cascading vs regular
4115f757f3fSDimitry Andric 
4125f757f3fSDimitry Andric   // Scope
4135f757f3fSDimitry Andric   SCOPE = 0x3 << 3, // All Scope bits
4145f757f3fSDimitry Andric   SCOPE_CU = 0 << 3,
4155f757f3fSDimitry Andric   SCOPE_SE = 1 << 3,
4165f757f3fSDimitry Andric   SCOPE_DEV = 2 << 3,
4175f757f3fSDimitry Andric   SCOPE_SYS = 3 << 3,
4185f757f3fSDimitry Andric 
4195f757f3fSDimitry Andric   SWZ = 1 << 6, // Swizzle bit
4205f757f3fSDimitry Andric 
4215f757f3fSDimitry Andric   ALL = TH | SCOPE,
4225f757f3fSDimitry Andric 
4235f757f3fSDimitry Andric   // Helper bits
4245f757f3fSDimitry Andric   TH_TYPE_LOAD = 1 << 7,    // TH_LOAD policy
4255f757f3fSDimitry Andric   TH_TYPE_STORE = 1 << 8,   // TH_STORE policy
4265f757f3fSDimitry Andric   TH_TYPE_ATOMIC = 1 << 9,  // TH_ATOMIC policy
4275f757f3fSDimitry Andric   TH_REAL_BYPASS = 1 << 10, // is TH=3 bypass policy or not
4287a6dacacSDimitry Andric 
4297a6dacacSDimitry Andric   // Volatile (used to preserve/signal operation volatility for buffer
4307a6dacacSDimitry Andric   // operations not a real instruction bit)
4317a6dacacSDimitry Andric   VOLATILE = 1 << 31,
432fe6060f1SDimitry Andric };
433fe6060f1SDimitry Andric 
434fe6060f1SDimitry Andric } // namespace CPol
435fe6060f1SDimitry Andric 
4360b57cec5SDimitry Andric namespace SendMsg { // Encoding of SIMM16 used in s_sendmsg* insns.
4370b57cec5SDimitry Andric 
4380b57cec5SDimitry Andric enum Id { // Message ID, width(4) [3:0].
4390b57cec5SDimitry Andric   ID_INTERRUPT = 1,
44081ad6265SDimitry Andric 
44181ad6265SDimitry Andric   ID_GS_PreGFX11 = 2,      // replaced in GFX11
44281ad6265SDimitry Andric   ID_GS_DONE_PreGFX11 = 3, // replaced in GFX11
44381ad6265SDimitry Andric 
44481ad6265SDimitry Andric   ID_HS_TESSFACTOR_GFX11Plus = 2, // reused in GFX11
44581ad6265SDimitry Andric   ID_DEALLOC_VGPRS_GFX11Plus = 3, // reused in GFX11
44681ad6265SDimitry Andric 
44781ad6265SDimitry Andric   ID_SAVEWAVE = 4,           // added in GFX8, removed in GFX11
4485f757f3fSDimitry Andric   ID_STALL_WAVE_GEN = 5,     // added in GFX9, removed in GFX12
4495f757f3fSDimitry Andric   ID_HALT_WAVES = 6,         // added in GFX9, removed in GFX12
45006c3fb27SDimitry Andric   ID_ORDERED_PS_DONE = 7,    // added in GFX9, removed in GFX11
451fe6060f1SDimitry Andric   ID_EARLY_PRIM_DEALLOC = 8, // added in GFX9, removed in GFX10
452fe6060f1SDimitry Andric   ID_GS_ALLOC_REQ = 9,       // added in GFX9
45381ad6265SDimitry Andric   ID_GET_DOORBELL = 10,      // added in GFX9, removed in GFX11
45481ad6265SDimitry Andric   ID_GET_DDID = 11,          // added in GFX10, removed in GFX11
4550b57cec5SDimitry Andric   ID_SYSMSG = 15,
45681ad6265SDimitry Andric 
45781ad6265SDimitry Andric   ID_RTN_GET_DOORBELL = 128,
45881ad6265SDimitry Andric   ID_RTN_GET_DDID = 129,
45981ad6265SDimitry Andric   ID_RTN_GET_TMA = 130,
46081ad6265SDimitry Andric   ID_RTN_GET_REALTIME = 131,
46181ad6265SDimitry Andric   ID_RTN_SAVE_WAVE = 132,
46281ad6265SDimitry Andric   ID_RTN_GET_TBA = 133,
463*0fca6ea1SDimitry Andric   ID_RTN_GET_TBA_TO_PC = 134,
464*0fca6ea1SDimitry Andric   ID_RTN_GET_SE_AID_ID = 135,
46581ad6265SDimitry Andric 
46681ad6265SDimitry Andric   ID_MASK_PreGFX11_ = 0xF,
46781ad6265SDimitry Andric   ID_MASK_GFX11Plus_ = 0xFF
4680b57cec5SDimitry Andric };
4690b57cec5SDimitry Andric 
4700b57cec5SDimitry Andric enum Op { // Both GS and SYS operation IDs.
4710b57cec5SDimitry Andric   OP_SHIFT_ = 4,
4720b57cec5SDimitry Andric   OP_NONE_ = 0,
4730b57cec5SDimitry Andric   // Bits used for operation encoding
4740b57cec5SDimitry Andric   OP_WIDTH_ = 3,
4750b57cec5SDimitry Andric   OP_MASK_ = (((1 << OP_WIDTH_) - 1) << OP_SHIFT_),
4760b57cec5SDimitry Andric   // GS operations are encoded in bits 5:4
4770b57cec5SDimitry Andric   OP_GS_NOP = 0,
478fe6060f1SDimitry Andric   OP_GS_CUT = 1,
479fe6060f1SDimitry Andric   OP_GS_EMIT = 2,
480fe6060f1SDimitry Andric   OP_GS_EMIT_CUT = 3,
4810b57cec5SDimitry Andric   OP_GS_FIRST_ = OP_GS_NOP,
4820b57cec5SDimitry Andric   // SYS operations are encoded in bits 6:4
4830b57cec5SDimitry Andric   OP_SYS_ECC_ERR_INTERRUPT = 1,
484fe6060f1SDimitry Andric   OP_SYS_REG_RD = 2,
485fe6060f1SDimitry Andric   OP_SYS_HOST_TRAP_ACK = 3,
486fe6060f1SDimitry Andric   OP_SYS_TTRACE_PC = 4,
4870b57cec5SDimitry Andric   OP_SYS_FIRST_ = OP_SYS_ECC_ERR_INTERRUPT,
4880b57cec5SDimitry Andric };
4890b57cec5SDimitry Andric 
4900b57cec5SDimitry Andric enum StreamId : unsigned { // Stream ID, (2) [9:8].
4910b57cec5SDimitry Andric   STREAM_ID_NONE_ = 0,
4920b57cec5SDimitry Andric   STREAM_ID_DEFAULT_ = 0,
4930b57cec5SDimitry Andric   STREAM_ID_LAST_ = 4,
4940b57cec5SDimitry Andric   STREAM_ID_FIRST_ = STREAM_ID_DEFAULT_,
4950b57cec5SDimitry Andric   STREAM_ID_SHIFT_ = 8,
4960b57cec5SDimitry Andric   STREAM_ID_WIDTH_=  2,
4970b57cec5SDimitry Andric   STREAM_ID_MASK_ = (((1 << STREAM_ID_WIDTH_) - 1) << STREAM_ID_SHIFT_)
4980b57cec5SDimitry Andric };
4990b57cec5SDimitry Andric 
5000b57cec5SDimitry Andric } // namespace SendMsg
5010b57cec5SDimitry Andric 
5020b57cec5SDimitry Andric namespace Hwreg { // Encoding of SIMM16 used in s_setreg/getreg* insns.
5030b57cec5SDimitry Andric 
5040b57cec5SDimitry Andric enum Id { // HwRegCode, (6) [5:0]
5050b57cec5SDimitry Andric   ID_MODE = 1,
5060b57cec5SDimitry Andric   ID_STATUS = 2,
5070b57cec5SDimitry Andric   ID_TRAPSTS = 3,
5080b57cec5SDimitry Andric   ID_HW_ID = 4,
5090b57cec5SDimitry Andric   ID_GPR_ALLOC = 5,
5100b57cec5SDimitry Andric   ID_LDS_ALLOC = 6,
5110b57cec5SDimitry Andric   ID_IB_STS = 7,
5125f757f3fSDimitry Andric   ID_PERF_SNAPSHOT_DATA_gfx12 = 10,
5135f757f3fSDimitry Andric   ID_PERF_SNAPSHOT_PC_LO_gfx12 = 11,
5145f757f3fSDimitry Andric   ID_PERF_SNAPSHOT_PC_HI_gfx12 = 12,
5150b57cec5SDimitry Andric   ID_MEM_BASES = 15,
5160b57cec5SDimitry Andric   ID_TBA_LO = 16,
5170b57cec5SDimitry Andric   ID_TBA_HI = 17,
5180b57cec5SDimitry Andric   ID_TMA_LO = 18,
5190b57cec5SDimitry Andric   ID_TMA_HI = 19,
5200b57cec5SDimitry Andric   ID_FLAT_SCR_LO = 20,
5210b57cec5SDimitry Andric   ID_FLAT_SCR_HI = 21,
5220b57cec5SDimitry Andric   ID_XNACK_MASK = 22,
52304eeddc0SDimitry Andric   ID_HW_ID1 = 23,
52404eeddc0SDimitry Andric   ID_HW_ID2 = 24,
5250b57cec5SDimitry Andric   ID_POPS_PACKER = 25,
5265f757f3fSDimitry Andric   ID_PERF_SNAPSHOT_DATA_gfx11 = 27,
5275ffd83dbSDimitry Andric   ID_SHADER_CYCLES = 29,
5285f757f3fSDimitry Andric   ID_SHADER_CYCLES_HI = 30,
5295f757f3fSDimitry Andric   ID_DVGPR_ALLOC_LO = 31,
5305f757f3fSDimitry Andric   ID_DVGPR_ALLOC_HI = 32,
53181ad6265SDimitry Andric 
5325f757f3fSDimitry Andric   // Register numbers reused in GFX11
5335f757f3fSDimitry Andric   ID_PERF_SNAPSHOT_PC_LO_gfx11 = 18,
5345f757f3fSDimitry Andric   ID_PERF_SNAPSHOT_PC_HI_gfx11 = 19,
5355f757f3fSDimitry Andric 
5365f757f3fSDimitry Andric   // Register numbers reused in GFX12+
5375f757f3fSDimitry Andric   ID_STATE_PRIV = 4,
5385f757f3fSDimitry Andric   ID_PERF_SNAPSHOT_DATA1 = 15,
5395f757f3fSDimitry Andric   ID_PERF_SNAPSHOT_DATA2 = 16,
5405f757f3fSDimitry Andric   ID_EXCP_FLAG_PRIV = 17,
5415f757f3fSDimitry Andric   ID_EXCP_FLAG_USER = 18,
5425f757f3fSDimitry Andric   ID_TRAP_CTRL = 19,
54306c3fb27SDimitry Andric 
54406c3fb27SDimitry Andric   // GFX940 specific registers
54506c3fb27SDimitry Andric   ID_XCC_ID = 20,
54606c3fb27SDimitry Andric   ID_SQ_PERF_SNAPSHOT_DATA = 21,
54706c3fb27SDimitry Andric   ID_SQ_PERF_SNAPSHOT_DATA1 = 22,
54806c3fb27SDimitry Andric   ID_SQ_PERF_SNAPSHOT_PC_LO = 23,
54906c3fb27SDimitry Andric   ID_SQ_PERF_SNAPSHOT_PC_HI = 24,
5500b57cec5SDimitry Andric };
5510b57cec5SDimitry Andric 
5520b57cec5SDimitry Andric enum Offset : unsigned { // Offset, (5) [10:6]
5530b57cec5SDimitry Andric   OFFSET_MEM_VIOL = 8,
5540b57cec5SDimitry Andric };
5550b57cec5SDimitry Andric 
5565ffd83dbSDimitry Andric enum ModeRegisterMasks : uint32_t {
5575ffd83dbSDimitry Andric   FP_ROUND_MASK = 0xf << 0,  // Bits 0..3
5585ffd83dbSDimitry Andric   FP_DENORM_MASK = 0xf << 4, // Bits 4..7
5595ffd83dbSDimitry Andric   DX10_CLAMP_MASK = 1 << 8,
5605ffd83dbSDimitry Andric   IEEE_MODE_MASK = 1 << 9,
5615ffd83dbSDimitry Andric   LOD_CLAMP_MASK = 1 << 10,
5625ffd83dbSDimitry Andric   DEBUG_MASK = 1 << 11,
5635ffd83dbSDimitry Andric 
5645ffd83dbSDimitry Andric   // EXCP_EN fields.
5655ffd83dbSDimitry Andric   EXCP_EN_INVALID_MASK = 1 << 12,
5665ffd83dbSDimitry Andric   EXCP_EN_INPUT_DENORMAL_MASK = 1 << 13,
5675ffd83dbSDimitry Andric   EXCP_EN_FLOAT_DIV0_MASK = 1 << 14,
5685ffd83dbSDimitry Andric   EXCP_EN_OVERFLOW_MASK = 1 << 15,
5695ffd83dbSDimitry Andric   EXCP_EN_UNDERFLOW_MASK = 1 << 16,
5705ffd83dbSDimitry Andric   EXCP_EN_INEXACT_MASK = 1 << 17,
5715ffd83dbSDimitry Andric   EXCP_EN_INT_DIV0_MASK = 1 << 18,
5725ffd83dbSDimitry Andric 
5735ffd83dbSDimitry Andric   GPR_IDX_EN_MASK = 1 << 27,
5745ffd83dbSDimitry Andric   VSKIP_MASK = 1 << 28,
5755ffd83dbSDimitry Andric   CSP_MASK = 0x7u << 29 // Bits 29..31
5765ffd83dbSDimitry Andric };
5775ffd83dbSDimitry Andric 
5780b57cec5SDimitry Andric } // namespace Hwreg
5790b57cec5SDimitry Andric 
580e8d8bef9SDimitry Andric namespace MTBUFFormat {
581e8d8bef9SDimitry Andric 
582e8d8bef9SDimitry Andric enum DataFormat : int64_t {
583e8d8bef9SDimitry Andric   DFMT_INVALID = 0,
584e8d8bef9SDimitry Andric   DFMT_8,
585e8d8bef9SDimitry Andric   DFMT_16,
586e8d8bef9SDimitry Andric   DFMT_8_8,
587e8d8bef9SDimitry Andric   DFMT_32,
588e8d8bef9SDimitry Andric   DFMT_16_16,
589e8d8bef9SDimitry Andric   DFMT_10_11_11,
590e8d8bef9SDimitry Andric   DFMT_11_11_10,
591e8d8bef9SDimitry Andric   DFMT_10_10_10_2,
592e8d8bef9SDimitry Andric   DFMT_2_10_10_10,
593e8d8bef9SDimitry Andric   DFMT_8_8_8_8,
594e8d8bef9SDimitry Andric   DFMT_32_32,
595e8d8bef9SDimitry Andric   DFMT_16_16_16_16,
596e8d8bef9SDimitry Andric   DFMT_32_32_32,
597e8d8bef9SDimitry Andric   DFMT_32_32_32_32,
598e8d8bef9SDimitry Andric   DFMT_RESERVED_15,
599e8d8bef9SDimitry Andric 
600e8d8bef9SDimitry Andric   DFMT_MIN = DFMT_INVALID,
601e8d8bef9SDimitry Andric   DFMT_MAX = DFMT_RESERVED_15,
602e8d8bef9SDimitry Andric 
603e8d8bef9SDimitry Andric   DFMT_UNDEF = -1,
604e8d8bef9SDimitry Andric   DFMT_DEFAULT = DFMT_8,
605e8d8bef9SDimitry Andric 
606e8d8bef9SDimitry Andric   DFMT_SHIFT = 0,
607e8d8bef9SDimitry Andric   DFMT_MASK = 0xF
608e8d8bef9SDimitry Andric };
609e8d8bef9SDimitry Andric 
610e8d8bef9SDimitry Andric enum NumFormat : int64_t {
611e8d8bef9SDimitry Andric   NFMT_UNORM = 0,
612e8d8bef9SDimitry Andric   NFMT_SNORM,
613e8d8bef9SDimitry Andric   NFMT_USCALED,
614e8d8bef9SDimitry Andric   NFMT_SSCALED,
615e8d8bef9SDimitry Andric   NFMT_UINT,
616e8d8bef9SDimitry Andric   NFMT_SINT,
617e8d8bef9SDimitry Andric   NFMT_RESERVED_6,                    // VI and GFX9
618e8d8bef9SDimitry Andric   NFMT_SNORM_OGL = NFMT_RESERVED_6,   // SI and CI only
619e8d8bef9SDimitry Andric   NFMT_FLOAT,
620e8d8bef9SDimitry Andric 
621e8d8bef9SDimitry Andric   NFMT_MIN = NFMT_UNORM,
622e8d8bef9SDimitry Andric   NFMT_MAX = NFMT_FLOAT,
623e8d8bef9SDimitry Andric 
624e8d8bef9SDimitry Andric   NFMT_UNDEF = -1,
625e8d8bef9SDimitry Andric   NFMT_DEFAULT = NFMT_UNORM,
626e8d8bef9SDimitry Andric 
627e8d8bef9SDimitry Andric   NFMT_SHIFT = 4,
628e8d8bef9SDimitry Andric   NFMT_MASK = 7
629e8d8bef9SDimitry Andric };
630e8d8bef9SDimitry Andric 
631e8d8bef9SDimitry Andric enum MergedFormat : int64_t {
632e8d8bef9SDimitry Andric   DFMT_NFMT_UNDEF = -1,
633e8d8bef9SDimitry Andric   DFMT_NFMT_DEFAULT = ((DFMT_DEFAULT & DFMT_MASK) << DFMT_SHIFT) |
634e8d8bef9SDimitry Andric                       ((NFMT_DEFAULT & NFMT_MASK) << NFMT_SHIFT),
635e8d8bef9SDimitry Andric 
636e8d8bef9SDimitry Andric 
637e8d8bef9SDimitry Andric   DFMT_NFMT_MASK = (DFMT_MASK << DFMT_SHIFT) | (NFMT_MASK << NFMT_SHIFT),
638e8d8bef9SDimitry Andric 
639e8d8bef9SDimitry Andric   DFMT_NFMT_MAX = DFMT_NFMT_MASK
640e8d8bef9SDimitry Andric };
641e8d8bef9SDimitry Andric 
64281ad6265SDimitry Andric enum UnifiedFormatCommon : int64_t {
64381ad6265SDimitry Andric   UFMT_MAX = 127,
64481ad6265SDimitry Andric   UFMT_UNDEF = -1,
64581ad6265SDimitry Andric   UFMT_DEFAULT = 1
64681ad6265SDimitry Andric };
64781ad6265SDimitry Andric 
64881ad6265SDimitry Andric } // namespace MTBUFFormat
64981ad6265SDimitry Andric 
65081ad6265SDimitry Andric namespace UfmtGFX10 {
651e8d8bef9SDimitry Andric enum UnifiedFormat : int64_t {
652e8d8bef9SDimitry Andric   UFMT_INVALID = 0,
653e8d8bef9SDimitry Andric 
654e8d8bef9SDimitry Andric   UFMT_8_UNORM,
655e8d8bef9SDimitry Andric   UFMT_8_SNORM,
656e8d8bef9SDimitry Andric   UFMT_8_USCALED,
657e8d8bef9SDimitry Andric   UFMT_8_SSCALED,
658e8d8bef9SDimitry Andric   UFMT_8_UINT,
659e8d8bef9SDimitry Andric   UFMT_8_SINT,
660e8d8bef9SDimitry Andric 
661e8d8bef9SDimitry Andric   UFMT_16_UNORM,
662e8d8bef9SDimitry Andric   UFMT_16_SNORM,
663e8d8bef9SDimitry Andric   UFMT_16_USCALED,
664e8d8bef9SDimitry Andric   UFMT_16_SSCALED,
665e8d8bef9SDimitry Andric   UFMT_16_UINT,
666e8d8bef9SDimitry Andric   UFMT_16_SINT,
667e8d8bef9SDimitry Andric   UFMT_16_FLOAT,
668e8d8bef9SDimitry Andric 
669e8d8bef9SDimitry Andric   UFMT_8_8_UNORM,
670e8d8bef9SDimitry Andric   UFMT_8_8_SNORM,
671e8d8bef9SDimitry Andric   UFMT_8_8_USCALED,
672e8d8bef9SDimitry Andric   UFMT_8_8_SSCALED,
673e8d8bef9SDimitry Andric   UFMT_8_8_UINT,
674e8d8bef9SDimitry Andric   UFMT_8_8_SINT,
675e8d8bef9SDimitry Andric 
676e8d8bef9SDimitry Andric   UFMT_32_UINT,
677e8d8bef9SDimitry Andric   UFMT_32_SINT,
678e8d8bef9SDimitry Andric   UFMT_32_FLOAT,
679e8d8bef9SDimitry Andric 
680e8d8bef9SDimitry Andric   UFMT_16_16_UNORM,
681e8d8bef9SDimitry Andric   UFMT_16_16_SNORM,
682e8d8bef9SDimitry Andric   UFMT_16_16_USCALED,
683e8d8bef9SDimitry Andric   UFMT_16_16_SSCALED,
684e8d8bef9SDimitry Andric   UFMT_16_16_UINT,
685e8d8bef9SDimitry Andric   UFMT_16_16_SINT,
686e8d8bef9SDimitry Andric   UFMT_16_16_FLOAT,
687e8d8bef9SDimitry Andric 
688e8d8bef9SDimitry Andric   UFMT_10_11_11_UNORM,
689e8d8bef9SDimitry Andric   UFMT_10_11_11_SNORM,
690e8d8bef9SDimitry Andric   UFMT_10_11_11_USCALED,
691e8d8bef9SDimitry Andric   UFMT_10_11_11_SSCALED,
692e8d8bef9SDimitry Andric   UFMT_10_11_11_UINT,
693e8d8bef9SDimitry Andric   UFMT_10_11_11_SINT,
694e8d8bef9SDimitry Andric   UFMT_10_11_11_FLOAT,
695e8d8bef9SDimitry Andric 
696e8d8bef9SDimitry Andric   UFMT_11_11_10_UNORM,
697e8d8bef9SDimitry Andric   UFMT_11_11_10_SNORM,
698e8d8bef9SDimitry Andric   UFMT_11_11_10_USCALED,
699e8d8bef9SDimitry Andric   UFMT_11_11_10_SSCALED,
700e8d8bef9SDimitry Andric   UFMT_11_11_10_UINT,
701e8d8bef9SDimitry Andric   UFMT_11_11_10_SINT,
702e8d8bef9SDimitry Andric   UFMT_11_11_10_FLOAT,
703e8d8bef9SDimitry Andric 
704e8d8bef9SDimitry Andric   UFMT_10_10_10_2_UNORM,
705e8d8bef9SDimitry Andric   UFMT_10_10_10_2_SNORM,
706e8d8bef9SDimitry Andric   UFMT_10_10_10_2_USCALED,
707e8d8bef9SDimitry Andric   UFMT_10_10_10_2_SSCALED,
708e8d8bef9SDimitry Andric   UFMT_10_10_10_2_UINT,
709e8d8bef9SDimitry Andric   UFMT_10_10_10_2_SINT,
710e8d8bef9SDimitry Andric 
711e8d8bef9SDimitry Andric   UFMT_2_10_10_10_UNORM,
712e8d8bef9SDimitry Andric   UFMT_2_10_10_10_SNORM,
713e8d8bef9SDimitry Andric   UFMT_2_10_10_10_USCALED,
714e8d8bef9SDimitry Andric   UFMT_2_10_10_10_SSCALED,
715e8d8bef9SDimitry Andric   UFMT_2_10_10_10_UINT,
716e8d8bef9SDimitry Andric   UFMT_2_10_10_10_SINT,
717e8d8bef9SDimitry Andric 
718e8d8bef9SDimitry Andric   UFMT_8_8_8_8_UNORM,
719e8d8bef9SDimitry Andric   UFMT_8_8_8_8_SNORM,
720e8d8bef9SDimitry Andric   UFMT_8_8_8_8_USCALED,
721e8d8bef9SDimitry Andric   UFMT_8_8_8_8_SSCALED,
722e8d8bef9SDimitry Andric   UFMT_8_8_8_8_UINT,
723e8d8bef9SDimitry Andric   UFMT_8_8_8_8_SINT,
724e8d8bef9SDimitry Andric 
725e8d8bef9SDimitry Andric   UFMT_32_32_UINT,
726e8d8bef9SDimitry Andric   UFMT_32_32_SINT,
727e8d8bef9SDimitry Andric   UFMT_32_32_FLOAT,
728e8d8bef9SDimitry Andric 
729e8d8bef9SDimitry Andric   UFMT_16_16_16_16_UNORM,
730e8d8bef9SDimitry Andric   UFMT_16_16_16_16_SNORM,
731e8d8bef9SDimitry Andric   UFMT_16_16_16_16_USCALED,
732e8d8bef9SDimitry Andric   UFMT_16_16_16_16_SSCALED,
733e8d8bef9SDimitry Andric   UFMT_16_16_16_16_UINT,
734e8d8bef9SDimitry Andric   UFMT_16_16_16_16_SINT,
735e8d8bef9SDimitry Andric   UFMT_16_16_16_16_FLOAT,
736e8d8bef9SDimitry Andric 
737e8d8bef9SDimitry Andric   UFMT_32_32_32_UINT,
738e8d8bef9SDimitry Andric   UFMT_32_32_32_SINT,
739e8d8bef9SDimitry Andric   UFMT_32_32_32_FLOAT,
740e8d8bef9SDimitry Andric   UFMT_32_32_32_32_UINT,
741e8d8bef9SDimitry Andric   UFMT_32_32_32_32_SINT,
742e8d8bef9SDimitry Andric   UFMT_32_32_32_32_FLOAT,
743e8d8bef9SDimitry Andric 
744e8d8bef9SDimitry Andric   UFMT_FIRST = UFMT_INVALID,
745e8d8bef9SDimitry Andric   UFMT_LAST = UFMT_32_32_32_32_FLOAT,
746e8d8bef9SDimitry Andric };
747e8d8bef9SDimitry Andric 
74881ad6265SDimitry Andric } // namespace UfmtGFX10
74981ad6265SDimitry Andric 
75081ad6265SDimitry Andric namespace UfmtGFX11 {
75181ad6265SDimitry Andric enum UnifiedFormat : int64_t {
75281ad6265SDimitry Andric   UFMT_INVALID = 0,
75381ad6265SDimitry Andric 
75481ad6265SDimitry Andric   UFMT_8_UNORM,
75581ad6265SDimitry Andric   UFMT_8_SNORM,
75681ad6265SDimitry Andric   UFMT_8_USCALED,
75781ad6265SDimitry Andric   UFMT_8_SSCALED,
75881ad6265SDimitry Andric   UFMT_8_UINT,
75981ad6265SDimitry Andric   UFMT_8_SINT,
76081ad6265SDimitry Andric 
76181ad6265SDimitry Andric   UFMT_16_UNORM,
76281ad6265SDimitry Andric   UFMT_16_SNORM,
76381ad6265SDimitry Andric   UFMT_16_USCALED,
76481ad6265SDimitry Andric   UFMT_16_SSCALED,
76581ad6265SDimitry Andric   UFMT_16_UINT,
76681ad6265SDimitry Andric   UFMT_16_SINT,
76781ad6265SDimitry Andric   UFMT_16_FLOAT,
76881ad6265SDimitry Andric 
76981ad6265SDimitry Andric   UFMT_8_8_UNORM,
77081ad6265SDimitry Andric   UFMT_8_8_SNORM,
77181ad6265SDimitry Andric   UFMT_8_8_USCALED,
77281ad6265SDimitry Andric   UFMT_8_8_SSCALED,
77381ad6265SDimitry Andric   UFMT_8_8_UINT,
77481ad6265SDimitry Andric   UFMT_8_8_SINT,
77581ad6265SDimitry Andric 
77681ad6265SDimitry Andric   UFMT_32_UINT,
77781ad6265SDimitry Andric   UFMT_32_SINT,
77881ad6265SDimitry Andric   UFMT_32_FLOAT,
77981ad6265SDimitry Andric 
78081ad6265SDimitry Andric   UFMT_16_16_UNORM,
78181ad6265SDimitry Andric   UFMT_16_16_SNORM,
78281ad6265SDimitry Andric   UFMT_16_16_USCALED,
78381ad6265SDimitry Andric   UFMT_16_16_SSCALED,
78481ad6265SDimitry Andric   UFMT_16_16_UINT,
78581ad6265SDimitry Andric   UFMT_16_16_SINT,
78681ad6265SDimitry Andric   UFMT_16_16_FLOAT,
78781ad6265SDimitry Andric 
78881ad6265SDimitry Andric   UFMT_10_11_11_FLOAT,
78981ad6265SDimitry Andric 
79081ad6265SDimitry Andric   UFMT_11_11_10_FLOAT,
79181ad6265SDimitry Andric 
79281ad6265SDimitry Andric   UFMT_10_10_10_2_UNORM,
79381ad6265SDimitry Andric   UFMT_10_10_10_2_SNORM,
79481ad6265SDimitry Andric   UFMT_10_10_10_2_UINT,
79581ad6265SDimitry Andric   UFMT_10_10_10_2_SINT,
79681ad6265SDimitry Andric 
79781ad6265SDimitry Andric   UFMT_2_10_10_10_UNORM,
79881ad6265SDimitry Andric   UFMT_2_10_10_10_SNORM,
79981ad6265SDimitry Andric   UFMT_2_10_10_10_USCALED,
80081ad6265SDimitry Andric   UFMT_2_10_10_10_SSCALED,
80181ad6265SDimitry Andric   UFMT_2_10_10_10_UINT,
80281ad6265SDimitry Andric   UFMT_2_10_10_10_SINT,
80381ad6265SDimitry Andric 
80481ad6265SDimitry Andric   UFMT_8_8_8_8_UNORM,
80581ad6265SDimitry Andric   UFMT_8_8_8_8_SNORM,
80681ad6265SDimitry Andric   UFMT_8_8_8_8_USCALED,
80781ad6265SDimitry Andric   UFMT_8_8_8_8_SSCALED,
80881ad6265SDimitry Andric   UFMT_8_8_8_8_UINT,
80981ad6265SDimitry Andric   UFMT_8_8_8_8_SINT,
81081ad6265SDimitry Andric 
81181ad6265SDimitry Andric   UFMT_32_32_UINT,
81281ad6265SDimitry Andric   UFMT_32_32_SINT,
81381ad6265SDimitry Andric   UFMT_32_32_FLOAT,
81481ad6265SDimitry Andric 
81581ad6265SDimitry Andric   UFMT_16_16_16_16_UNORM,
81681ad6265SDimitry Andric   UFMT_16_16_16_16_SNORM,
81781ad6265SDimitry Andric   UFMT_16_16_16_16_USCALED,
81881ad6265SDimitry Andric   UFMT_16_16_16_16_SSCALED,
81981ad6265SDimitry Andric   UFMT_16_16_16_16_UINT,
82081ad6265SDimitry Andric   UFMT_16_16_16_16_SINT,
82181ad6265SDimitry Andric   UFMT_16_16_16_16_FLOAT,
82281ad6265SDimitry Andric 
82381ad6265SDimitry Andric   UFMT_32_32_32_UINT,
82481ad6265SDimitry Andric   UFMT_32_32_32_SINT,
82581ad6265SDimitry Andric   UFMT_32_32_32_FLOAT,
82681ad6265SDimitry Andric   UFMT_32_32_32_32_UINT,
82781ad6265SDimitry Andric   UFMT_32_32_32_32_SINT,
82881ad6265SDimitry Andric   UFMT_32_32_32_32_FLOAT,
82981ad6265SDimitry Andric 
83081ad6265SDimitry Andric   UFMT_FIRST = UFMT_INVALID,
83181ad6265SDimitry Andric   UFMT_LAST = UFMT_32_32_32_32_FLOAT,
83281ad6265SDimitry Andric };
83381ad6265SDimitry Andric 
83481ad6265SDimitry Andric } // namespace UfmtGFX11
835e8d8bef9SDimitry Andric 
8360b57cec5SDimitry Andric namespace Swizzle { // Encoding of swizzle macro used in ds_swizzle_b32.
8370b57cec5SDimitry Andric 
8380b57cec5SDimitry Andric enum Id : unsigned { // id of symbolic names
8390b57cec5SDimitry Andric   ID_QUAD_PERM = 0,
8400b57cec5SDimitry Andric   ID_BITMASK_PERM,
8410b57cec5SDimitry Andric   ID_SWAP,
8420b57cec5SDimitry Andric   ID_REVERSE,
8430b57cec5SDimitry Andric   ID_BROADCAST
8440b57cec5SDimitry Andric };
8450b57cec5SDimitry Andric 
8460b57cec5SDimitry Andric enum EncBits : unsigned {
8470b57cec5SDimitry Andric 
8480b57cec5SDimitry Andric   // swizzle mode encodings
8490b57cec5SDimitry Andric 
8500b57cec5SDimitry Andric   QUAD_PERM_ENC         = 0x8000,
8510b57cec5SDimitry Andric   QUAD_PERM_ENC_MASK    = 0xFF00,
8520b57cec5SDimitry Andric 
8530b57cec5SDimitry Andric   BITMASK_PERM_ENC      = 0x0000,
8540b57cec5SDimitry Andric   BITMASK_PERM_ENC_MASK = 0x8000,
8550b57cec5SDimitry Andric 
8560b57cec5SDimitry Andric   // QUAD_PERM encodings
8570b57cec5SDimitry Andric 
8580b57cec5SDimitry Andric   LANE_MASK             = 0x3,
8590b57cec5SDimitry Andric   LANE_MAX              = LANE_MASK,
8600b57cec5SDimitry Andric   LANE_SHIFT            = 2,
8610b57cec5SDimitry Andric   LANE_NUM              = 4,
8620b57cec5SDimitry Andric 
8630b57cec5SDimitry Andric   // BITMASK_PERM encodings
8640b57cec5SDimitry Andric 
8650b57cec5SDimitry Andric   BITMASK_MASK          = 0x1F,
8660b57cec5SDimitry Andric   BITMASK_MAX           = BITMASK_MASK,
8670b57cec5SDimitry Andric   BITMASK_WIDTH         = 5,
8680b57cec5SDimitry Andric 
8690b57cec5SDimitry Andric   BITMASK_AND_SHIFT     = 0,
8700b57cec5SDimitry Andric   BITMASK_OR_SHIFT      = 5,
8710b57cec5SDimitry Andric   BITMASK_XOR_SHIFT     = 10
8720b57cec5SDimitry Andric };
8730b57cec5SDimitry Andric 
8740b57cec5SDimitry Andric } // namespace Swizzle
8750b57cec5SDimitry Andric 
8760b57cec5SDimitry Andric namespace SDWA {
8770b57cec5SDimitry Andric 
8780b57cec5SDimitry Andric enum SdwaSel : unsigned {
8790b57cec5SDimitry Andric   BYTE_0 = 0,
8800b57cec5SDimitry Andric   BYTE_1 = 1,
8810b57cec5SDimitry Andric   BYTE_2 = 2,
8820b57cec5SDimitry Andric   BYTE_3 = 3,
8830b57cec5SDimitry Andric   WORD_0 = 4,
8840b57cec5SDimitry Andric   WORD_1 = 5,
8850b57cec5SDimitry Andric   DWORD = 6,
8860b57cec5SDimitry Andric };
8870b57cec5SDimitry Andric 
8880b57cec5SDimitry Andric enum DstUnused : unsigned {
8890b57cec5SDimitry Andric   UNUSED_PAD = 0,
8900b57cec5SDimitry Andric   UNUSED_SEXT = 1,
8910b57cec5SDimitry Andric   UNUSED_PRESERVE = 2,
8920b57cec5SDimitry Andric };
8930b57cec5SDimitry Andric 
8940b57cec5SDimitry Andric enum SDWA9EncValues : unsigned {
8950b57cec5SDimitry Andric   SRC_SGPR_MASK = 0x100,
8960b57cec5SDimitry Andric   SRC_VGPR_MASK = 0xFF,
8970b57cec5SDimitry Andric   VOPC_DST_VCC_MASK = 0x80,
8980b57cec5SDimitry Andric   VOPC_DST_SGPR_MASK = 0x7F,
8990b57cec5SDimitry Andric 
9000b57cec5SDimitry Andric   SRC_VGPR_MIN = 0,
9010b57cec5SDimitry Andric   SRC_VGPR_MAX = 255,
9020b57cec5SDimitry Andric   SRC_SGPR_MIN = 256,
9030b57cec5SDimitry Andric   SRC_SGPR_MAX_SI = 357,
9040b57cec5SDimitry Andric   SRC_SGPR_MAX_GFX10 = 361,
9050b57cec5SDimitry Andric   SRC_TTMP_MIN = 364,
9060b57cec5SDimitry Andric   SRC_TTMP_MAX = 379,
9070b57cec5SDimitry Andric };
9080b57cec5SDimitry Andric 
9090b57cec5SDimitry Andric } // namespace SDWA
9100b57cec5SDimitry Andric 
9110b57cec5SDimitry Andric namespace DPP {
9120b57cec5SDimitry Andric 
913fe6060f1SDimitry Andric // clang-format off
9140b57cec5SDimitry Andric enum DppCtrl : unsigned {
9150b57cec5SDimitry Andric   QUAD_PERM_FIRST   = 0,
9168bcb0991SDimitry Andric   QUAD_PERM_ID      = 0xE4, // identity permutation
9170b57cec5SDimitry Andric   QUAD_PERM_LAST    = 0xFF,
9180b57cec5SDimitry Andric   DPP_UNUSED1       = 0x100,
9190b57cec5SDimitry Andric   ROW_SHL0          = 0x100,
9200b57cec5SDimitry Andric   ROW_SHL_FIRST     = 0x101,
9210b57cec5SDimitry Andric   ROW_SHL_LAST      = 0x10F,
9220b57cec5SDimitry Andric   DPP_UNUSED2       = 0x110,
9230b57cec5SDimitry Andric   ROW_SHR0          = 0x110,
9240b57cec5SDimitry Andric   ROW_SHR_FIRST     = 0x111,
9250b57cec5SDimitry Andric   ROW_SHR_LAST      = 0x11F,
9260b57cec5SDimitry Andric   DPP_UNUSED3       = 0x120,
9270b57cec5SDimitry Andric   ROW_ROR0          = 0x120,
9280b57cec5SDimitry Andric   ROW_ROR_FIRST     = 0x121,
9290b57cec5SDimitry Andric   ROW_ROR_LAST      = 0x12F,
9300b57cec5SDimitry Andric   WAVE_SHL1         = 0x130,
9310b57cec5SDimitry Andric   DPP_UNUSED4_FIRST = 0x131,
9320b57cec5SDimitry Andric   DPP_UNUSED4_LAST  = 0x133,
9330b57cec5SDimitry Andric   WAVE_ROL1         = 0x134,
9340b57cec5SDimitry Andric   DPP_UNUSED5_FIRST = 0x135,
9350b57cec5SDimitry Andric   DPP_UNUSED5_LAST  = 0x137,
9360b57cec5SDimitry Andric   WAVE_SHR1         = 0x138,
9370b57cec5SDimitry Andric   DPP_UNUSED6_FIRST = 0x139,
9380b57cec5SDimitry Andric   DPP_UNUSED6_LAST  = 0x13B,
9390b57cec5SDimitry Andric   WAVE_ROR1         = 0x13C,
9400b57cec5SDimitry Andric   DPP_UNUSED7_FIRST = 0x13D,
9410b57cec5SDimitry Andric   DPP_UNUSED7_LAST  = 0x13F,
9420b57cec5SDimitry Andric   ROW_MIRROR        = 0x140,
9430b57cec5SDimitry Andric   ROW_HALF_MIRROR   = 0x141,
9440b57cec5SDimitry Andric   BCAST15           = 0x142,
9450b57cec5SDimitry Andric   BCAST31           = 0x143,
9460b57cec5SDimitry Andric   DPP_UNUSED8_FIRST = 0x144,
9470b57cec5SDimitry Andric   DPP_UNUSED8_LAST  = 0x14F,
948fe6060f1SDimitry Andric   ROW_NEWBCAST_FIRST= 0x150,
949fe6060f1SDimitry Andric   ROW_NEWBCAST_LAST = 0x15F,
950fe6060f1SDimitry Andric   ROW_SHARE0        = 0x150,
9510b57cec5SDimitry Andric   ROW_SHARE_FIRST   = 0x150,
9520b57cec5SDimitry Andric   ROW_SHARE_LAST    = 0x15F,
953fe6060f1SDimitry Andric   ROW_XMASK0        = 0x160,
9540b57cec5SDimitry Andric   ROW_XMASK_FIRST   = 0x160,
9550b57cec5SDimitry Andric   ROW_XMASK_LAST    = 0x16F,
9560b57cec5SDimitry Andric   DPP_LAST          = ROW_XMASK_LAST
9570b57cec5SDimitry Andric };
958fe6060f1SDimitry Andric // clang-format on
9590b57cec5SDimitry Andric 
9600b57cec5SDimitry Andric enum DppFiMode {
9610b57cec5SDimitry Andric   DPP_FI_0  = 0,
9620b57cec5SDimitry Andric   DPP_FI_1  = 1,
9630b57cec5SDimitry Andric   DPP8_FI_0 = 0xE9,
9640b57cec5SDimitry Andric   DPP8_FI_1 = 0xEA,
9650b57cec5SDimitry Andric };
9660b57cec5SDimitry Andric 
9670b57cec5SDimitry Andric } // namespace DPP
968e8d8bef9SDimitry Andric 
969e8d8bef9SDimitry Andric namespace Exp {
970e8d8bef9SDimitry Andric 
971e8d8bef9SDimitry Andric enum Target : unsigned {
972e8d8bef9SDimitry Andric   ET_MRT0 = 0,
973e8d8bef9SDimitry Andric   ET_MRT7 = 7,
974e8d8bef9SDimitry Andric   ET_MRTZ = 8,
97581ad6265SDimitry Andric   ET_NULL = 9,             // Pre-GFX11
976e8d8bef9SDimitry Andric   ET_POS0 = 12,
977e8d8bef9SDimitry Andric   ET_POS3 = 15,
978e8d8bef9SDimitry Andric   ET_POS4 = 16,            // GFX10+
979e8d8bef9SDimitry Andric   ET_POS_LAST = ET_POS4,   // Highest pos used on any subtarget
980e8d8bef9SDimitry Andric   ET_PRIM = 20,            // GFX10+
98181ad6265SDimitry Andric   ET_DUAL_SRC_BLEND0 = 21, // GFX11+
98281ad6265SDimitry Andric   ET_DUAL_SRC_BLEND1 = 22, // GFX11+
98381ad6265SDimitry Andric   ET_PARAM0 = 32,          // Pre-GFX11
98481ad6265SDimitry Andric   ET_PARAM31 = 63,         // Pre-GFX11
985e8d8bef9SDimitry Andric 
986e8d8bef9SDimitry Andric   ET_NULL_MAX_IDX = 0,
987e8d8bef9SDimitry Andric   ET_MRTZ_MAX_IDX = 0,
988e8d8bef9SDimitry Andric   ET_PRIM_MAX_IDX = 0,
989e8d8bef9SDimitry Andric   ET_MRT_MAX_IDX = 7,
990e8d8bef9SDimitry Andric   ET_POS_MAX_IDX = 4,
99181ad6265SDimitry Andric   ET_DUAL_SRC_BLEND_MAX_IDX = 1,
992e8d8bef9SDimitry Andric   ET_PARAM_MAX_IDX = 31,
993e8d8bef9SDimitry Andric 
994e8d8bef9SDimitry Andric   ET_INVALID = 255,
995e8d8bef9SDimitry Andric };
996e8d8bef9SDimitry Andric 
997e8d8bef9SDimitry Andric } // namespace Exp
998fe6060f1SDimitry Andric 
999fe6060f1SDimitry Andric namespace VOP3PEncoding {
1000fe6060f1SDimitry Andric 
1001fe6060f1SDimitry Andric enum OpSel : uint64_t {
1002fe6060f1SDimitry Andric   OP_SEL_HI_0 = UINT64_C(1) << 59,
1003fe6060f1SDimitry Andric   OP_SEL_HI_1 = UINT64_C(1) << 60,
1004fe6060f1SDimitry Andric   OP_SEL_HI_2 = UINT64_C(1) << 14,
1005fe6060f1SDimitry Andric };
1006fe6060f1SDimitry Andric 
1007fe6060f1SDimitry Andric } // namespace VOP3PEncoding
1008fe6060f1SDimitry Andric 
100981ad6265SDimitry Andric namespace ImplicitArg {
101081ad6265SDimitry Andric // Implicit kernel argument offset for code object version 5.
101181ad6265SDimitry Andric enum Offset_COV5 : unsigned {
101281ad6265SDimitry Andric   HOSTCALL_PTR_OFFSET = 80,
101381ad6265SDimitry Andric   MULTIGRID_SYNC_ARG_OFFSET = 88,
101481ad6265SDimitry Andric   HEAP_PTR_OFFSET = 96,
1015bdd1243dSDimitry Andric 
1016bdd1243dSDimitry Andric   DEFAULT_QUEUE_OFFSET = 104,
1017bdd1243dSDimitry Andric   COMPLETION_ACTION_OFFSET = 112,
1018bdd1243dSDimitry Andric 
101981ad6265SDimitry Andric   PRIVATE_BASE_OFFSET = 192,
102081ad6265SDimitry Andric   SHARED_BASE_OFFSET = 196,
102181ad6265SDimitry Andric   QUEUE_PTR_OFFSET = 200,
102281ad6265SDimitry Andric };
102381ad6265SDimitry Andric 
102481ad6265SDimitry Andric } // namespace ImplicitArg
102506c3fb27SDimitry Andric 
102606c3fb27SDimitry Andric namespace VirtRegFlag {
102706c3fb27SDimitry Andric // Virtual register flags used for various target specific handlings during
102806c3fb27SDimitry Andric // codegen.
102906c3fb27SDimitry Andric enum Register_Flag : uint8_t {
103006c3fb27SDimitry Andric   // Register operand in a whole-wave mode operation.
103106c3fb27SDimitry Andric   WWM_REG = 1 << 0,
103206c3fb27SDimitry Andric };
103306c3fb27SDimitry Andric 
103406c3fb27SDimitry Andric } // namespace VirtRegFlag
103506c3fb27SDimitry Andric 
10360b57cec5SDimitry Andric } // namespace AMDGPU
10370b57cec5SDimitry Andric 
10385f757f3fSDimitry Andric namespace AMDGPU {
10395f757f3fSDimitry Andric namespace Barrier {
10405f757f3fSDimitry Andric enum Type { TRAP = -2, WORKGROUP = -1 };
10415f757f3fSDimitry Andric } // namespace Barrier
10425f757f3fSDimitry Andric } // namespace AMDGPU
10435f757f3fSDimitry Andric 
10445f757f3fSDimitry Andric // clang-format off
10455f757f3fSDimitry Andric 
10460b57cec5SDimitry Andric #define R_00B028_SPI_SHADER_PGM_RSRC1_PS                                0x00B028
1047e8d8bef9SDimitry Andric #define   S_00B028_VGPRS(x)                                           (((x) & 0x3F) << 0)
1048e8d8bef9SDimitry Andric #define   S_00B028_SGPRS(x)                                           (((x) & 0x0F) << 6)
1049e8d8bef9SDimitry Andric #define   S_00B028_MEM_ORDERED(x)                                     (((x) & 0x1) << 25)
1050e8d8bef9SDimitry Andric #define   G_00B028_MEM_ORDERED(x)                                     (((x) >> 25) & 0x1)
1051e8d8bef9SDimitry Andric #define   C_00B028_MEM_ORDERED                                        0xFDFFFFFF
1052e8d8bef9SDimitry Andric 
10530b57cec5SDimitry Andric #define R_00B02C_SPI_SHADER_PGM_RSRC2_PS                                0x00B02C
10540b57cec5SDimitry Andric #define   S_00B02C_EXTRA_LDS_SIZE(x)                                  (((x) & 0xFF) << 8)
10550b57cec5SDimitry Andric #define R_00B128_SPI_SHADER_PGM_RSRC1_VS                                0x00B128
1056e8d8bef9SDimitry Andric #define   S_00B128_MEM_ORDERED(x)                                     (((x) & 0x1) << 27)
1057e8d8bef9SDimitry Andric #define   G_00B128_MEM_ORDERED(x)                                     (((x) >> 27) & 0x1)
1058e8d8bef9SDimitry Andric #define   C_00B128_MEM_ORDERED                                        0xF7FFFFFF
1059e8d8bef9SDimitry Andric 
10600b57cec5SDimitry Andric #define R_00B228_SPI_SHADER_PGM_RSRC1_GS                                0x00B228
1061e8d8bef9SDimitry Andric #define   S_00B228_WGP_MODE(x)                                        (((x) & 0x1) << 27)
1062e8d8bef9SDimitry Andric #define   G_00B228_WGP_MODE(x)                                        (((x) >> 27) & 0x1)
1063e8d8bef9SDimitry Andric #define   C_00B228_WGP_MODE                                           0xF7FFFFFF
1064e8d8bef9SDimitry Andric #define   S_00B228_MEM_ORDERED(x)                                     (((x) & 0x1) << 25)
1065e8d8bef9SDimitry Andric #define   G_00B228_MEM_ORDERED(x)                                     (((x) >> 25) & 0x1)
1066e8d8bef9SDimitry Andric #define   C_00B228_MEM_ORDERED                                        0xFDFFFFFF
1067e8d8bef9SDimitry Andric 
10680b57cec5SDimitry Andric #define R_00B328_SPI_SHADER_PGM_RSRC1_ES                                0x00B328
10690b57cec5SDimitry Andric #define R_00B428_SPI_SHADER_PGM_RSRC1_HS                                0x00B428
1070e8d8bef9SDimitry Andric #define   S_00B428_WGP_MODE(x)                                        (((x) & 0x1) << 26)
1071e8d8bef9SDimitry Andric #define   G_00B428_WGP_MODE(x)                                        (((x) >> 26) & 0x1)
1072e8d8bef9SDimitry Andric #define   C_00B428_WGP_MODE                                           0xFBFFFFFF
1073e8d8bef9SDimitry Andric #define   S_00B428_MEM_ORDERED(x)                                     (((x) & 0x1) << 24)
1074e8d8bef9SDimitry Andric #define   G_00B428_MEM_ORDERED(x)                                     (((x) >> 24) & 0x1)
1075e8d8bef9SDimitry Andric #define   C_00B428_MEM_ORDERED                                        0xFEFFFFFF
1076e8d8bef9SDimitry Andric 
10770b57cec5SDimitry Andric #define R_00B528_SPI_SHADER_PGM_RSRC1_LS                                0x00B528
10780b57cec5SDimitry Andric 
10790b57cec5SDimitry Andric #define R_00B84C_COMPUTE_PGM_RSRC2                                      0x00B84C
10800b57cec5SDimitry Andric #define   S_00B84C_SCRATCH_EN(x)                                      (((x) & 0x1) << 0)
10810b57cec5SDimitry Andric #define   G_00B84C_SCRATCH_EN(x)                                      (((x) >> 0) & 0x1)
10820b57cec5SDimitry Andric #define   C_00B84C_SCRATCH_EN                                         0xFFFFFFFE
10830b57cec5SDimitry Andric #define   S_00B84C_USER_SGPR(x)                                       (((x) & 0x1F) << 1)
10840b57cec5SDimitry Andric #define   G_00B84C_USER_SGPR(x)                                       (((x) >> 1) & 0x1F)
10850b57cec5SDimitry Andric #define   C_00B84C_USER_SGPR                                          0xFFFFFFC1
10860b57cec5SDimitry Andric #define   S_00B84C_TRAP_HANDLER(x)                                    (((x) & 0x1) << 6)
10870b57cec5SDimitry Andric #define   G_00B84C_TRAP_HANDLER(x)                                    (((x) >> 6) & 0x1)
10880b57cec5SDimitry Andric #define   C_00B84C_TRAP_HANDLER                                       0xFFFFFFBF
10890b57cec5SDimitry Andric #define   S_00B84C_TGID_X_EN(x)                                       (((x) & 0x1) << 7)
10900b57cec5SDimitry Andric #define   G_00B84C_TGID_X_EN(x)                                       (((x) >> 7) & 0x1)
10910b57cec5SDimitry Andric #define   C_00B84C_TGID_X_EN                                          0xFFFFFF7F
10920b57cec5SDimitry Andric #define   S_00B84C_TGID_Y_EN(x)                                       (((x) & 0x1) << 8)
10930b57cec5SDimitry Andric #define   G_00B84C_TGID_Y_EN(x)                                       (((x) >> 8) & 0x1)
10940b57cec5SDimitry Andric #define   C_00B84C_TGID_Y_EN                                          0xFFFFFEFF
10950b57cec5SDimitry Andric #define   S_00B84C_TGID_Z_EN(x)                                       (((x) & 0x1) << 9)
10960b57cec5SDimitry Andric #define   G_00B84C_TGID_Z_EN(x)                                       (((x) >> 9) & 0x1)
10970b57cec5SDimitry Andric #define   C_00B84C_TGID_Z_EN                                          0xFFFFFDFF
10980b57cec5SDimitry Andric #define   S_00B84C_TG_SIZE_EN(x)                                      (((x) & 0x1) << 10)
10990b57cec5SDimitry Andric #define   G_00B84C_TG_SIZE_EN(x)                                      (((x) >> 10) & 0x1)
11000b57cec5SDimitry Andric #define   C_00B84C_TG_SIZE_EN                                         0xFFFFFBFF
11010b57cec5SDimitry Andric #define   S_00B84C_TIDIG_COMP_CNT(x)                                  (((x) & 0x03) << 11)
11020b57cec5SDimitry Andric #define   G_00B84C_TIDIG_COMP_CNT(x)                                  (((x) >> 11) & 0x03)
11030b57cec5SDimitry Andric #define   C_00B84C_TIDIG_COMP_CNT                                     0xFFFFE7FF
11040b57cec5SDimitry Andric /* CIK */
11050b57cec5SDimitry Andric #define   S_00B84C_EXCP_EN_MSB(x)                                     (((x) & 0x03) << 13)
11060b57cec5SDimitry Andric #define   G_00B84C_EXCP_EN_MSB(x)                                     (((x) >> 13) & 0x03)
11070b57cec5SDimitry Andric #define   C_00B84C_EXCP_EN_MSB                                        0xFFFF9FFF
11080b57cec5SDimitry Andric /*     */
11090b57cec5SDimitry Andric #define   S_00B84C_LDS_SIZE(x)                                        (((x) & 0x1FF) << 15)
11100b57cec5SDimitry Andric #define   G_00B84C_LDS_SIZE(x)                                        (((x) >> 15) & 0x1FF)
11110b57cec5SDimitry Andric #define   C_00B84C_LDS_SIZE                                           0xFF007FFF
11120b57cec5SDimitry Andric #define   S_00B84C_EXCP_EN(x)                                         (((x) & 0x7F) << 24)
11130b57cec5SDimitry Andric #define   G_00B84C_EXCP_EN(x)                                         (((x) >> 24) & 0x7F)
1114*0fca6ea1SDimitry Andric #define   C_00B84C_EXCP_EN                                            0x80FFFFFF
11150b57cec5SDimitry Andric 
11160b57cec5SDimitry Andric #define R_0286CC_SPI_PS_INPUT_ENA                                       0x0286CC
11170b57cec5SDimitry Andric #define R_0286D0_SPI_PS_INPUT_ADDR                                      0x0286D0
11180b57cec5SDimitry Andric 
11190b57cec5SDimitry Andric #define R_00B848_COMPUTE_PGM_RSRC1                                      0x00B848
11200b57cec5SDimitry Andric #define   S_00B848_VGPRS(x)                                           (((x) & 0x3F) << 0)
11210b57cec5SDimitry Andric #define   G_00B848_VGPRS(x)                                           (((x) >> 0) & 0x3F)
11220b57cec5SDimitry Andric #define   C_00B848_VGPRS                                              0xFFFFFFC0
11230b57cec5SDimitry Andric #define   S_00B848_SGPRS(x)                                           (((x) & 0x0F) << 6)
11240b57cec5SDimitry Andric #define   G_00B848_SGPRS(x)                                           (((x) >> 6) & 0x0F)
11250b57cec5SDimitry Andric #define   C_00B848_SGPRS                                              0xFFFFFC3F
11260b57cec5SDimitry Andric #define   S_00B848_PRIORITY(x)                                        (((x) & 0x03) << 10)
11270b57cec5SDimitry Andric #define   G_00B848_PRIORITY(x)                                        (((x) >> 10) & 0x03)
11280b57cec5SDimitry Andric #define   C_00B848_PRIORITY                                           0xFFFFF3FF
11290b57cec5SDimitry Andric #define   S_00B848_FLOAT_MODE(x)                                      (((x) & 0xFF) << 12)
11300b57cec5SDimitry Andric #define   G_00B848_FLOAT_MODE(x)                                      (((x) >> 12) & 0xFF)
11310b57cec5SDimitry Andric #define   C_00B848_FLOAT_MODE                                         0xFFF00FFF
11320b57cec5SDimitry Andric #define   S_00B848_PRIV(x)                                            (((x) & 0x1) << 20)
11330b57cec5SDimitry Andric #define   G_00B848_PRIV(x)                                            (((x) >> 20) & 0x1)
11340b57cec5SDimitry Andric #define   C_00B848_PRIV                                               0xFFEFFFFF
11350b57cec5SDimitry Andric #define   S_00B848_DX10_CLAMP(x)                                      (((x) & 0x1) << 21)
11360b57cec5SDimitry Andric #define   G_00B848_DX10_CLAMP(x)                                      (((x) >> 21) & 0x1)
11370b57cec5SDimitry Andric #define   C_00B848_DX10_CLAMP                                         0xFFDFFFFF
11385f757f3fSDimitry Andric #define   S_00B848_RR_WG_MODE(x)                                      (((x) & 0x1) << 21)
11395f757f3fSDimitry Andric #define   G_00B848_RR_WG_MODE(x)                                      (((x) >> 21) & 0x1)
11405f757f3fSDimitry Andric #define   C_00B848_RR_WG_MODE                                         0xFFDFFFFF
11410b57cec5SDimitry Andric #define   S_00B848_DEBUG_MODE(x)                                      (((x) & 0x1) << 22)
11420b57cec5SDimitry Andric #define   G_00B848_DEBUG_MODE(x)                                      (((x) >> 22) & 0x1)
11430b57cec5SDimitry Andric #define   C_00B848_DEBUG_MODE                                         0xFFBFFFFF
11440b57cec5SDimitry Andric #define   S_00B848_IEEE_MODE(x)                                       (((x) & 0x1) << 23)
11450b57cec5SDimitry Andric #define   G_00B848_IEEE_MODE(x)                                       (((x) >> 23) & 0x1)
11460b57cec5SDimitry Andric #define   C_00B848_IEEE_MODE                                          0xFF7FFFFF
11470b57cec5SDimitry Andric #define   S_00B848_WGP_MODE(x)                                        (((x) & 0x1) << 29)
11480b57cec5SDimitry Andric #define   G_00B848_WGP_MODE(x)                                        (((x) >> 29) & 0x1)
11490b57cec5SDimitry Andric #define   C_00B848_WGP_MODE                                           0xDFFFFFFF
11500b57cec5SDimitry Andric #define   S_00B848_MEM_ORDERED(x)                                     (((x) & 0x1) << 30)
11510b57cec5SDimitry Andric #define   G_00B848_MEM_ORDERED(x)                                     (((x) >> 30) & 0x1)
11520b57cec5SDimitry Andric #define   C_00B848_MEM_ORDERED                                        0xBFFFFFFF
11530b57cec5SDimitry Andric #define   S_00B848_FWD_PROGRESS(x)                                    (((x) & 0x1) << 31)
11540b57cec5SDimitry Andric #define   G_00B848_FWD_PROGRESS(x)                                    (((x) >> 31) & 0x1)
11550b57cec5SDimitry Andric #define   C_00B848_FWD_PROGRESS                                       0x7FFFFFFF
11560b57cec5SDimitry Andric 
11570b57cec5SDimitry Andric // Helpers for setting FLOAT_MODE
11580b57cec5SDimitry Andric #define FP_ROUND_ROUND_TO_NEAREST 0
11590b57cec5SDimitry Andric #define FP_ROUND_ROUND_TO_INF 1
11600b57cec5SDimitry Andric #define FP_ROUND_ROUND_TO_NEGINF 2
11610b57cec5SDimitry Andric #define FP_ROUND_ROUND_TO_ZERO 3
11620b57cec5SDimitry Andric 
11630b57cec5SDimitry Andric // Bits 3:0 control rounding mode. 1:0 control single precision, 3:2 double
11640b57cec5SDimitry Andric // precision.
11650b57cec5SDimitry Andric #define FP_ROUND_MODE_SP(x) ((x) & 0x3)
11660b57cec5SDimitry Andric #define FP_ROUND_MODE_DP(x) (((x) & 0x3) << 2)
11670b57cec5SDimitry Andric 
11680b57cec5SDimitry Andric #define FP_DENORM_FLUSH_IN_FLUSH_OUT 0
11690b57cec5SDimitry Andric #define FP_DENORM_FLUSH_OUT 1
11700b57cec5SDimitry Andric #define FP_DENORM_FLUSH_IN 2
11710b57cec5SDimitry Andric #define FP_DENORM_FLUSH_NONE 3
11720b57cec5SDimitry Andric 
11730b57cec5SDimitry Andric 
11740b57cec5SDimitry Andric // Bits 7:4 control denormal handling. 5:4 control single precision, 6:7 double
11750b57cec5SDimitry Andric // precision.
11760b57cec5SDimitry Andric #define FP_DENORM_MODE_SP(x) (((x) & 0x3) << 4)
11770b57cec5SDimitry Andric #define FP_DENORM_MODE_DP(x) (((x) & 0x3) << 6)
11780b57cec5SDimitry Andric 
11790b57cec5SDimitry Andric #define R_00B860_COMPUTE_TMPRING_SIZE                                   0x00B860
118081ad6265SDimitry Andric #define   S_00B860_WAVESIZE_PreGFX11(x)                               (((x) & 0x1FFF) << 12)
11817a6dacacSDimitry Andric #define   S_00B860_WAVESIZE_GFX11(x)                                  (((x) & 0x7FFF) << 12)
11827a6dacacSDimitry Andric #define   S_00B860_WAVESIZE_GFX12Plus(x)                              (((x) & 0x3FFFF) << 12)
11830b57cec5SDimitry Andric 
11840b57cec5SDimitry Andric #define R_0286E8_SPI_TMPRING_SIZE                                       0x0286E8
118581ad6265SDimitry Andric #define   S_0286E8_WAVESIZE_PreGFX11(x)                               (((x) & 0x1FFF) << 12)
11867a6dacacSDimitry Andric #define   S_0286E8_WAVESIZE_GFX11(x)                                  (((x) & 0x7FFF) << 12)
11877a6dacacSDimitry Andric #define   S_0286E8_WAVESIZE_GFX12Plus(x)                              (((x) & 0x3FFFF) << 12)
11880b57cec5SDimitry Andric 
11890b57cec5SDimitry Andric #define R_028B54_VGT_SHADER_STAGES_EN                                 0x028B54
11900b57cec5SDimitry Andric #define   S_028B54_HS_W32_EN(x)                                       (((x) & 0x1) << 21)
11910b57cec5SDimitry Andric #define   S_028B54_GS_W32_EN(x)                                       (((x) & 0x1) << 22)
11920b57cec5SDimitry Andric #define   S_028B54_VS_W32_EN(x)                                       (((x) & 0x1) << 23)
11930b57cec5SDimitry Andric #define R_0286D8_SPI_PS_IN_CONTROL                                    0x0286D8
11940b57cec5SDimitry Andric #define   S_0286D8_PS_W32_EN(x)                                       (((x) & 0x1) << 15)
11950b57cec5SDimitry Andric #define R_00B800_COMPUTE_DISPATCH_INITIATOR                           0x00B800
11960b57cec5SDimitry Andric #define   S_00B800_CS_W32_EN(x)                                       (((x) & 0x1) << 15)
11970b57cec5SDimitry Andric 
11980b57cec5SDimitry Andric #define R_SPILLED_SGPRS         0x4
11990b57cec5SDimitry Andric #define R_SPILLED_VGPRS         0x8
12005f757f3fSDimitry Andric 
12015f757f3fSDimitry Andric // clang-format on
12025f757f3fSDimitry Andric 
12030b57cec5SDimitry Andric } // End namespace llvm
12040b57cec5SDimitry Andric 
12050b57cec5SDimitry Andric #endif
1206