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