// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include "common/enum.h"
#include "common/types.h"

namespace Shader::Gcn {

enum class OpcodeSOP2 : u32 {
    S_ADD_U32 = 0,
    S_SUB_U32 = 1,
    S_ADD_I32 = 2,
    S_SUB_I32 = 3,
    S_ADDC_U32 = 4,
    S_SUBB_U32 = 5,
    S_MIN_I32 = 6,
    S_MIN_U32 = 7,
    S_MAX_I32 = 8,
    S_MAX_U32 = 9,
    S_CSELECT_B32 = 10,
    S_CSELECT_B64 = 11,
    S_AND_B32 = 14,
    S_AND_B64 = 15,
    S_OR_B32 = 16,
    S_OR_B64 = 17,
    S_XOR_B32 = 18,
    S_XOR_B64 = 19,
    S_ANDN2_B32 = 20,
    S_ANDN2_B64 = 21,
    S_ORN2_B32 = 22,
    S_ORN2_B64 = 23,
    S_NAND_B32 = 24,
    S_NAND_B64 = 25,
    S_NOR_B32 = 26,
    S_NOR_B64 = 27,
    S_XNOR_B32 = 28,
    S_XNOR_B64 = 29,
    S_LSHL_B32 = 30,
    S_LSHL_B64 = 31,
    S_LSHR_B32 = 32,
    S_LSHR_B64 = 33,
    S_ASHR_I32 = 34,
    S_ASHR_I64 = 35,
    S_BFM_B32 = 36,
    S_BFM_B64 = 37,
    S_MUL_I32 = 38,
    S_BFE_U32 = 39,
    S_BFE_I32 = 40,
    S_BFE_U64 = 41,
    S_BFE_I64 = 42,
    S_CBRANCH_G_FORK = 43,
    S_ABSDIFF_I32 = 44,

    OP_RANGE_SOP2 = S_ABSDIFF_I32 + 1,
};

enum class OpcodeSOPK : u32 {
    S_MOVK_I32 = 0,
    S_CMOVK_I32 = 2,
    S_CMPK_EQ_I32 = 3,
    S_CMPK_LG_I32 = 4,
    S_CMPK_GT_I32 = 5,
    S_CMPK_GE_I32 = 6,
    S_CMPK_LT_I32 = 7,
    S_CMPK_LE_I32 = 8,
    S_CMPK_EQ_U32 = 9,
    S_CMPK_LG_U32 = 10,
    S_CMPK_GT_U32 = 11,
    S_CMPK_GE_U32 = 12,
    S_CMPK_LT_U32 = 13,
    S_CMPK_LE_U32 = 14,
    S_ADDK_I32 = 15,
    S_MULK_I32 = 16,
    S_CBRANCH_I_FORK = 17,
    S_GETREG_B32 = 18,
    S_SETREG_B32 = 19,
    S_GETREG_REGRD_B32 = 20,
    S_SETREG_IMM32_B32 = 21,

    OP_RANGE_SOPK = S_SETREG_IMM32_B32 + 1,
};

enum class OpcodeSOP1 : u32 {
    S_MOV_B32 = 3,
    S_MOV_B64 = 4,
    S_CMOV_B32 = 5,
    S_CMOV_B64 = 6,
    S_NOT_B32 = 7,
    S_NOT_B64 = 8,
    S_WQM_B32 = 9,
    S_WQM_B64 = 10,
    S_BREV_B32 = 11,
    S_BREV_B64 = 12,
    S_BCNT0_I32_B32 = 13,
    S_BCNT0_I32_B64 = 14,
    S_BCNT1_I32_B32 = 15,
    S_BCNT1_I32_B64 = 16,
    S_FF0_I32_B32 = 17,
    S_FF0_I32_B64 = 18,
    S_FF1_I32_B32 = 19,
    S_FF1_I32_B64 = 20,
    S_FLBIT_I32_B32 = 21,
    S_FLBIT_I32_B64 = 22,
    S_FLBIT_I32 = 23,
    S_FLBIT_I32_I64 = 24,
    S_SEXT_I32_I8 = 25,
    S_SEXT_I32_I16 = 26,
    S_BITSET0_B32 = 27,
    S_BITSET0_B64 = 28,
    S_BITSET1_B32 = 29,
    S_BITSET1_B64 = 30,
    S_GETPC_B64 = 31,
    S_SETPC_B64 = 32,
    S_SWAPPC_B64 = 33,
    S_RFE_B64 = 34,
    S_AND_SAVEEXEC_B64 = 36,
    S_OR_SAVEEXEC_B64 = 37,
    S_XOR_SAVEEXEC_B64 = 38,
    S_ANDN2_SAVEEXEC_B64 = 39,
    S_ORN2_SAVEEXEC_B64 = 40,
    S_NAND_SAVEEXEC_B64 = 41,
    S_NOR_SAVEEXEC_B64 = 42,
    S_XNOR_SAVEEXEC_B64 = 43,
    S_QUADMASK_B32 = 44,
    S_QUADMASK_B64 = 45,
    S_MOVRELS_B32 = 46,
    S_MOVRELS_B64 = 47,
    S_MOVRELD_B32 = 48,
    S_MOVRELD_B64 = 49,
    S_CBRANCH_JOIN = 50,
    S_MOV_REGRD_B32 = 51,
    S_ABS_I32 = 52,
    S_MOV_FED_B32 = 53,

    OP_RANGE_SOP1 = S_MOV_FED_B32 + 1,
};

enum class OpcodeSOPC : u32 {
    S_CMP_EQ_I32 = 0,
    S_CMP_LG_I32 = 1,
    S_CMP_GT_I32 = 2,
    S_CMP_GE_I32 = 3,
    S_CMP_LT_I32 = 4,
    S_CMP_LE_I32 = 5,
    S_CMP_EQ_U32 = 6,
    S_CMP_LG_U32 = 7,
    S_CMP_GT_U32 = 8,
    S_CMP_GE_U32 = 9,
    S_CMP_LT_U32 = 10,
    S_CMP_LE_U32 = 11,
    S_BITCMP0_B32 = 12,
    S_BITCMP1_B32 = 13,
    S_BITCMP0_B64 = 14,
    S_BITCMP1_B64 = 15,
    S_SETVSKIP = 16,

    OP_RANGE_SOPC = S_SETVSKIP + 1,
};

enum class OpcodeSOPP : u32 {
    S_NOP = 0,
    S_ENDPGM = 1,
    S_BRANCH = 2,
    S_CBRANCH_SCC0 = 4,
    S_CBRANCH_SCC1 = 5,
    S_CBRANCH_VCCZ = 6,
    S_CBRANCH_VCCNZ = 7,
    S_CBRANCH_EXECZ = 8,
    S_CBRANCH_EXECNZ = 9,
    S_BARRIER = 10,
    S_SETKILL = 11,
    S_WAITCNT = 12,
    S_SETHALT = 13,
    S_SLEEP = 14,
    S_SETPRIO = 15,
    S_SENDMSG = 16,
    S_SENDMSGHALT = 17,
    S_TRAP = 18,
    S_ICACHE_INV = 19,
    S_INCPERFLEVEL = 20,
    S_DECPERFLEVEL = 21,
    S_TTRACEDATA = 22,
    S_CBRANCH_CDBGSYS = 23,
    S_CBRANCH_CDBGUSER = 24,
    S_CBRANCH_CDBGSYS_OR_USER = 25,
    S_CBRANCH_CDBGSYS_AND_USER = 26,

    OP_RANGE_SOPP = S_CBRANCH_CDBGSYS_AND_USER + 1,
};

enum class OpcodeSMRD : u32 {
    S_LOAD_DWORD = 0,
    S_LOAD_DWORDX2 = 1,
    S_LOAD_DWORDX4 = 2,
    S_LOAD_DWORDX8 = 3,
    S_LOAD_DWORDX16 = 4,
    S_BUFFER_LOAD_DWORD = 8,
    S_BUFFER_LOAD_DWORDX2 = 9,
    S_BUFFER_LOAD_DWORDX4 = 10,
    S_BUFFER_LOAD_DWORDX8 = 11,
    S_BUFFER_LOAD_DWORDX16 = 12,
    S_DCACHE_INV_VOL = 29,
    S_MEMTIME = 30,
    S_DCACHE_INV = 31,

    OP_RANGE_SMRD = S_DCACHE_INV + 1,
};

enum class OpcodeVOP2 : u32 {
    V_CNDMASK_B32 = 0,
    V_READLANE_B32 = 1,
    V_WRITELANE_B32 = 2,
    V_ADD_F32 = 3,
    V_SUB_F32 = 4,
    V_SUBREV_F32 = 5,
    V_MAC_LEGACY_F32 = 6,
    V_MUL_LEGACY_F32 = 7,
    V_MUL_F32 = 8,
    V_MUL_I32_I24 = 9,
    V_MUL_HI_I32_I24 = 10,
    V_MUL_U32_U24 = 11,
    V_MUL_HI_U32_U24 = 12,
    V_MIN_LEGACY_F32 = 13,
    V_MAX_LEGACY_F32 = 14,
    V_MIN_F32 = 15,
    V_MAX_F32 = 16,
    V_MIN_I32 = 17,
    V_MAX_I32 = 18,
    V_MIN_U32 = 19,
    V_MAX_U32 = 20,
    V_LSHR_B32 = 21,
    V_LSHRREV_B32 = 22,
    V_ASHR_I32 = 23,
    V_ASHRREV_I32 = 24,
    V_LSHL_B32 = 25,
    V_LSHLREV_B32 = 26,
    V_AND_B32 = 27,
    V_OR_B32 = 28,
    V_XOR_B32 = 29,
    V_BFM_B32 = 30,
    V_MAC_F32 = 31,
    V_MADMK_F32 = 32,
    V_MADAK_F32 = 33,
    V_BCNT_U32_B32 = 34,
    V_MBCNT_LO_U32_B32 = 35,
    V_MBCNT_HI_U32_B32 = 36,
    V_ADD_I32 = 37,
    V_SUB_I32 = 38,
    V_SUBREV_I32 = 39,
    V_ADDC_U32 = 40,
    V_SUBB_U32 = 41,
    V_SUBBREV_U32 = 42,
    V_LDEXP_F32 = 43,
    V_CVT_PKACCUM_U8_F32 = 44,
    V_CVT_PKNORM_I16_F32 = 45,
    V_CVT_PKNORM_U16_F32 = 46,
    V_CVT_PKRTZ_F16_F32 = 47,
    V_CVT_PK_U16_U32 = 48,
    V_CVT_PK_I16_I32 = 49,

    OP_RANGE_VOP2 = V_CVT_PK_I16_I32 + 1,
};

enum class OpcodeVOP3 : u32 {
    V_CMP_F_F32 = 0,
    V_CMP_LT_F32 = 1,
    V_CMP_EQ_F32 = 2,
    V_CMP_LE_F32 = 3,
    V_CMP_GT_F32 = 4,
    V_CMP_LG_F32 = 5,
    V_CMP_GE_F32 = 6,
    V_CMP_O_F32 = 7,
    V_CMP_U_F32 = 8,
    V_CMP_NGE_F32 = 9,
    V_CMP_NLG_F32 = 10,
    V_CMP_NGT_F32 = 11,
    V_CMP_NLE_F32 = 12,
    V_CMP_NEQ_F32 = 13,
    V_CMP_NLT_F32 = 14,
    V_CMP_TRU_F32 = 15,
    V_CMP_T_F32 = 15,
    V_CMPX_F_F32 = 16,
    V_CMPX_LT_F32 = 17,
    V_CMPX_EQ_F32 = 18,
    V_CMPX_LE_F32 = 19,
    V_CMPX_GT_F32 = 20,
    V_CMPX_LG_F32 = 21,
    V_CMPX_GE_F32 = 22,
    V_CMPX_O_F32 = 23,
    V_CMPX_U_F32 = 24,
    V_CMPX_NGE_F32 = 25,
    V_CMPX_NLG_F32 = 26,
    V_CMPX_NGT_F32 = 27,
    V_CMPX_NLE_F32 = 28,
    V_CMPX_NEQ_F32 = 29,
    V_CMPX_NLT_F32 = 30,
    V_CMPX_TRU_F32 = 31,
    V_CMPX_T_F32 = 31,
    V_CMP_F_F64 = 32,
    V_CMP_LT_F64 = 33,
    V_CMP_EQ_F64 = 34,
    V_CMP_LE_F64 = 35,
    V_CMP_GT_F64 = 36,
    V_CMP_LG_F64 = 37,
    V_CMP_GE_F64 = 38,
    V_CMP_O_F64 = 39,
    V_CMP_U_F64 = 40,
    V_CMP_NGE_F64 = 41,
    V_CMP_NLG_F64 = 42,
    V_CMP_NGT_F64 = 43,
    V_CMP_NLE_F64 = 44,
    V_CMP_NEQ_F64 = 45,
    V_CMP_NLT_F64 = 46,
    V_CMP_TRU_F64 = 47,
    V_CMP_T_F64 = 47,
    V_CMPX_F_F64 = 48,
    V_CMPX_LT_F64 = 49,
    V_CMPX_EQ_F64 = 50,
    V_CMPX_LE_F64 = 51,
    V_CMPX_GT_F64 = 52,
    V_CMPX_LG_F64 = 53,
    V_CMPX_GE_F64 = 54,
    V_CMPX_O_F64 = 55,
    V_CMPX_U_F64 = 56,
    V_CMPX_NGE_F64 = 57,
    V_CMPX_NLG_F64 = 58,
    V_CMPX_NGT_F64 = 59,
    V_CMPX_NLE_F64 = 60,
    V_CMPX_NEQ_F64 = 61,
    V_CMPX_NLT_F64 = 62,
    V_CMPX_TRU_F64 = 63,
    V_CMPX_T_F64 = 63,
    V_CMPS_F_F32 = 64,
    V_CMPS_LT_F32 = 65,
    V_CMPS_EQ_F32 = 66,
    V_CMPS_LE_F32 = 67,
    V_CMPS_GT_F32 = 68,
    V_CMPS_LG_F32 = 69,
    V_CMPS_GE_F32 = 70,
    V_CMPS_O_F32 = 71,
    V_CMPS_U_F32 = 72,
    V_CMPS_NGE_F32 = 73,
    V_CMPS_NLG_F32 = 74,
    V_CMPS_NGT_F32 = 75,
    V_CMPS_NLE_F32 = 76,
    V_CMPS_NEQ_F32 = 77,
    V_CMPS_NLT_F32 = 78,
    V_CMPS_TRU_F32 = 79,
    V_CMPS_T_F32 = 79,
    V_CMPSX_F_F32 = 80,
    V_CMPSX_LT_F32 = 81,
    V_CMPSX_EQ_F32 = 82,
    V_CMPSX_LE_F32 = 83,
    V_CMPSX_GT_F32 = 84,
    V_CMPSX_LG_F32 = 85,
    V_CMPSX_GE_F32 = 86,
    V_CMPSX_O_F32 = 87,
    V_CMPSX_U_F32 = 88,
    V_CMPSX_NGE_F32 = 89,
    V_CMPSX_NLG_F32 = 90,
    V_CMPSX_NGT_F32 = 91,
    V_CMPSX_NLE_F32 = 92,
    V_CMPSX_NEQ_F32 = 93,
    V_CMPSX_NLT_F32 = 94,
    V_CMPSX_TRU_F32 = 95,
    V_CMPSX_T_F32 = 95,
    V_CMPS_F_F64 = 96,
    V_CMPS_LT_F64 = 97,
    V_CMPS_EQ_F64 = 98,
    V_CMPS_LE_F64 = 99,
    V_CMPS_GT_F64 = 100,
    V_CMPS_LG_F64 = 101,
    V_CMPS_GE_F64 = 102,
    V_CMPS_O_F64 = 103,
    V_CMPS_U_F64 = 104,
    V_CMPS_NGE_F64 = 105,
    V_CMPS_NLG_F64 = 106,
    V_CMPS_NGT_F64 = 107,
    V_CMPS_NLE_F64 = 108,
    V_CMPS_NEQ_F64 = 109,
    V_CMPS_NLT_F64 = 110,
    V_CMPS_TRU_F64 = 111,
    V_CMPS_T_F64 = 111,
    V_CMPSX_F_F64 = 112,
    V_CMPSX_LT_F64 = 113,
    V_CMPSX_EQ_F64 = 114,
    V_CMPSX_LE_F64 = 115,
    V_CMPSX_GT_F64 = 116,
    V_CMPSX_LG_F64 = 117,
    V_CMPSX_GE_F64 = 118,
    V_CMPSX_O_F64 = 119,
    V_CMPSX_U_F64 = 120,
    V_CMPSX_NGE_F64 = 121,
    V_CMPSX_NLG_F64 = 122,
    V_CMPSX_NGT_F64 = 123,
    V_CMPSX_NLE_F64 = 124,
    V_CMPSX_NEQ_F64 = 125,
    V_CMPSX_NLT_F64 = 126,
    V_CMPSX_TRU_F64 = 127,
    V_CMPSX_T_F64 = 127,
    V_CMP_F_I32 = 128,
    V_CMP_LT_I32 = 129,
    V_CMP_EQ_I32 = 130,
    V_CMP_LE_I32 = 131,
    V_CMP_GT_I32 = 132,
    V_CMP_LG_I32 = 133,
    V_CMP_NE_I32 = 133,
    V_CMP_GE_I32 = 134,
    V_CMP_TRU_I32 = 135,
    V_CMP_T_I32 = 135,
    V_CMP_CLASS_F32 = 136,
    V_CMPX_F_I32 = 144,
    V_CMPX_LT_I32 = 145,
    V_CMPX_EQ_I32 = 146,
    V_CMPX_LE_I32 = 147,
    V_CMPX_GT_I32 = 148,
    V_CMPX_LG_I32 = 149,
    V_CMPX_NE_I32 = 149,
    V_CMPX_GE_I32 = 150,
    V_CMPX_TRU_I32 = 151,
    V_CMPX_T_I32 = 151,
    V_CMPX_CLASS_F32 = 152,
    V_CMP_F_I64 = 160,
    V_CMP_LT_I64 = 161,
    V_CMP_EQ_I64 = 162,
    V_CMP_LE_I64 = 163,
    V_CMP_GT_I64 = 164,
    V_CMP_LG_I64 = 165,
    V_CMP_NE_I64 = 165,
    V_CMP_GE_I64 = 166,
    V_CMP_TRU_I64 = 167,
    V_CMP_T_I64 = 167,
    V_CMP_CLASS_F64 = 168,
    V_CMPX_F_I64 = 176,
    V_CMPX_LT_I64 = 177,
    V_CMPX_EQ_I64 = 178,
    V_CMPX_LE_I64 = 179,
    V_CMPX_GT_I64 = 180,
    V_CMPX_LG_I64 = 181,
    V_CMPX_NE_I64 = 181,
    V_CMPX_GE_I64 = 182,
    V_CMPX_TRU_I64 = 183,
    V_CMPX_T_I64 = 183,
    V_CMPX_CLASS_F64 = 184,
    V_CMP_F_U32 = 192,
    V_CMP_LT_U32 = 193,
    V_CMP_EQ_U32 = 194,
    V_CMP_LE_U32 = 195,
    V_CMP_GT_U32 = 196,
    V_CMP_LG_U32 = 197,
    V_CMP_NE_U32 = 197,
    V_CMP_GE_U32 = 198,
    V_CMP_TRU_U32 = 199,
    V_CMP_T_U32 = 199,
    V_CMPX_F_U32 = 208,
    V_CMPX_LT_U32 = 209,
    V_CMPX_EQ_U32 = 210,
    V_CMPX_LE_U32 = 211,
    V_CMPX_GT_U32 = 212,
    V_CMPX_LG_U32 = 213,
    V_CMPX_NE_U32 = 213,
    V_CMPX_GE_U32 = 214,
    V_CMPX_TRU_U32 = 215,
    V_CMPX_T_U32 = 215,
    V_CMP_F_U64 = 224,
    V_CMP_LT_U64 = 225,
    V_CMP_EQ_U64 = 226,
    V_CMP_LE_U64 = 227,
    V_CMP_GT_U64 = 228,
    V_CMP_LG_U64 = 229,
    V_CMP_NE_U64 = 229,
    V_CMP_GE_U64 = 230,
    V_CMP_TRU_U64 = 231,
    V_CMP_T_U64 = 231,
    V_CMPX_F_U64 = 240,
    V_CMPX_LT_U64 = 241,
    V_CMPX_EQ_U64 = 242,
    V_CMPX_LE_U64 = 243,
    V_CMPX_GT_U64 = 244,
    V_CMPX_LG_U64 = 245,
    V_CMPX_NE_U64 = 245,
    V_CMPX_GE_U64 = 246,
    V_CMPX_TRU_U64 = 247,
    V_CMPX_T_U64 = 247,
    V_CNDMASK_B32 = 256,
    V_READLANE_B32 = 257,
    V_WRITELANE_B32 = 258,
    V_ADD_F32 = 259,
    V_SUB_F32 = 260,
    V_SUBREV_F32 = 261,
    V_MAC_LEGACY_F32 = 262,
    V_MUL_LEGACY_F32 = 263,
    V_MUL_F32 = 264,
    V_MUL_I32_I24 = 265,
    V_MUL_HI_I32_I24 = 266,
    V_MUL_U32_U24 = 267,
    V_MUL_HI_U32_U24 = 268,
    V_MIN_LEGACY_F32 = 269,
    V_MAX_LEGACY_F32 = 270,
    V_MIN_F32 = 271,
    V_MAX_F32 = 272,
    V_MIN_I32 = 273,
    V_MAX_I32 = 274,
    V_MIN_U32 = 275,
    V_MAX_U32 = 276,
    V_LSHR_B32 = 277,
    V_LSHRREV_B32 = 278,
    V_ASHR_I32 = 279,
    V_ASHRREV_I32 = 280,
    V_LSHL_B32 = 281,
    V_LSHLREV_B32 = 282,
    V_AND_B32 = 283,
    V_OR_B32 = 284,
    V_XOR_B32 = 285,
    V_BFM_B32 = 286,
    V_MAC_F32 = 287,
    V_MADMK_F32 = 288,
    V_MADAK_F32 = 289,
    V_BCNT_U32_B32 = 290,
    V_MBCNT_LO_U32_B32 = 291,
    V_MBCNT_HI_U32_B32 = 292,
    V_ADD_I32 = 293,
    V_SUB_I32 = 294,
    V_SUBREV_I32 = 295,
    V_ADDC_U32 = 296,
    V_SUBB_U32 = 297,
    V_SUBBREV_U32 = 298,
    V_LDEXP_F32 = 299,
    V_CVT_PKACCUM_U8_F32 = 300,
    V_CVT_PKNORM_I16_F32 = 301,
    V_CVT_PKNORM_U16_F32 = 302,
    V_CVT_PKRTZ_F16_F32 = 303,
    V_CVT_PK_U16_U32 = 304,
    V_CVT_PK_I16_I32 = 305,
    V_MAD_LEGACY_F32 = 320,
    V_MAD_F32 = 321,
    V_MAD_I32_I24 = 322,
    V_MAD_U32_U24 = 323,
    V_CUBEID_F32 = 324,
    V_CUBESC_F32 = 325,
    V_CUBETC_F32 = 326,
    V_CUBEMA_F32 = 327,
    V_BFE_U32 = 328,
    V_BFE_I32 = 329,
    V_BFI_B32 = 330,
    V_FMA_F32 = 331,
    V_FMA_F64 = 332,
    V_LERP_U8 = 333,
    V_ALIGNBIT_B32 = 334,
    V_ALIGNBYTE_B32 = 335,
    V_MULLIT_F32 = 336,
    V_MIN3_F32 = 337,
    V_MIN3_I32 = 338,
    V_MIN3_U32 = 339,
    V_MAX3_F32 = 340,
    V_MAX3_I32 = 341,
    V_MAX3_U32 = 342,
    V_MED3_F32 = 343,
    V_MED3_I32 = 344,
    V_MED3_U32 = 345,
    V_SAD_U8 = 346,
    V_SAD_HI_U8 = 347,
    V_SAD_U16 = 348,
    V_SAD_U32 = 349,
    V_CVT_PK_U8_F32 = 350,
    V_DIV_FIXUP_F32 = 351,
    V_DIV_FIXUP_F64 = 352,
    V_LSHL_B64 = 353,
    V_LSHR_B64 = 354,
    V_ASHR_I64 = 355,
    V_ADD_F64 = 356,
    V_MUL_F64 = 357,
    V_MIN_F64 = 358,
    V_MAX_F64 = 359,
    V_LDEXP_F64 = 360,
    V_MUL_LO_U32 = 361,
    V_MUL_HI_U32 = 362,
    V_MUL_LO_I32 = 363,
    V_MUL_HI_I32 = 364,
    V_DIV_SCALE_F32 = 365,
    V_DIV_SCALE_F64 = 366,
    V_DIV_FMAS_F32 = 367,
    V_DIV_FMAS_F64 = 368,
    V_MSAD_U8 = 369,
    V_QSAD_U8 = 370,
    V_QSAD_PK_U16_U8 = 370,
    V_MQSAD_U8 = 371,
    V_MQSAD_PK_U16_U8 = 371,
    V_TRIG_PREOP_F64 = 372,
    V_MQSAD_U32_U8 = 373,
    V_MAD_U64_U32 = 374,
    V_MAD_I64_I32 = 375,
    V_NOP = 384,
    V_MOV_B32 = 385,
    V_READFIRSTLANE_B32 = 386,
    V_CVT_I32_F64 = 387,
    V_CVT_F64_I32 = 388,
    V_CVT_F32_I32 = 389,
    V_CVT_F32_U32 = 390,
    V_CVT_U32_F32 = 391,
    V_CVT_I32_F32 = 392,
    V_MOV_FED_B32 = 393,
    V_CVT_F16_F32 = 394,
    V_CVT_F32_F16 = 395,
    V_CVT_RPI_I32_F32 = 396,
    V_CVT_FLR_I32_F32 = 397,
    V_CVT_OFF_F32_I4 = 398,
    V_CVT_F32_F64 = 399,
    V_CVT_F64_F32 = 400,
    V_CVT_F32_UBYTE0 = 401,
    V_CVT_F32_UBYTE1 = 402,
    V_CVT_F32_UBYTE2 = 403,
    V_CVT_F32_UBYTE3 = 404,
    V_CVT_U32_F64 = 405,
    V_CVT_F64_U32 = 406,
    V_TRUNC_F64 = 407,
    V_CEIL_F64 = 408,
    V_RNDNE_F64 = 409,
    V_FLOOR_F64 = 410,
    V_FRACT_F32 = 416,
    V_TRUNC_F32 = 417,
    V_CEIL_F32 = 418,
    V_RNDNE_F32 = 419,
    V_FLOOR_F32 = 420,
    V_EXP_F32 = 421,
    V_LOG_CLAMP_F32 = 422,
    V_LOG_F32 = 423,
    V_RCP_CLAMP_F32 = 424,
    V_RCP_LEGACY_F32 = 425,
    V_RCP_F32 = 426,
    V_RCP_IFLAG_F32 = 427,
    V_RSQ_CLAMP_F32 = 428,
    V_RSQ_LEGACY_F32 = 429,
    V_RSQ_F32 = 430,
    V_RCP_F64 = 431,
    V_RCP_CLAMP_F64 = 432,
    V_RSQ_F64 = 433,
    V_RSQ_CLAMP_F64 = 434,
    V_SQRT_F32 = 435,
    V_SQRT_F64 = 436,
    V_SIN_F32 = 437,
    V_COS_F32 = 438,
    V_NOT_B32 = 439,
    V_BFREV_B32 = 440,
    V_FFBH_U32 = 441,
    V_FFBL_B32 = 442,
    V_FFBH_I32 = 443,
    V_FREXP_EXP_I32_F64 = 444,
    V_FREXP_MANT_F64 = 445,
    V_FRACT_F64 = 446,
    V_FREXP_EXP_I32_F32 = 447,
    V_FREXP_MANT_F32 = 448,
    V_CLREXCP = 449,
    V_MOVRELD_B32 = 450,
    V_MOVRELS_B32 = 451,
    V_MOVRELSD_B32 = 452,
    V_LOG_LEGACY_F32 = 453,
    V_EXP_LEGACY_F32 = 454,

    OP_RANGE_VOP3 = V_EXP_LEGACY_F32 + 1,
};

enum class OpcodeVOP1 : u32 {
    V_NOP = 0,
    V_MOV_B32 = 1,
    V_READFIRSTLANE_B32 = 2,
    V_CVT_I32_F64 = 3,
    V_CVT_F64_I32 = 4,
    V_CVT_F32_I32 = 5,
    V_CVT_F32_U32 = 6,
    V_CVT_U32_F32 = 7,
    V_CVT_I32_F32 = 8,
    V_MOV_FED_B32 = 9,
    V_CVT_F16_F32 = 10,
    V_CVT_F32_F16 = 11,
    V_CVT_RPI_I32_F32 = 12,
    V_CVT_FLR_I32_F32 = 13,
    V_CVT_OFF_F32_I4 = 14,
    V_CVT_F32_F64 = 15,
    V_CVT_F64_F32 = 16,
    V_CVT_F32_UBYTE0 = 17,
    V_CVT_F32_UBYTE1 = 18,
    V_CVT_F32_UBYTE2 = 19,
    V_CVT_F32_UBYTE3 = 20,
    V_CVT_U32_F64 = 21,
    V_CVT_F64_U32 = 22,
    V_TRUNC_F64 = 23,
    V_CEIL_F64 = 24,
    V_RNDNE_F64 = 25,
    V_FLOOR_F64 = 26,
    V_FRACT_F32 = 32,
    V_TRUNC_F32 = 33,
    V_CEIL_F32 = 34,
    V_RNDNE_F32 = 35,
    V_FLOOR_F32 = 36,
    V_EXP_F32 = 37,
    V_LOG_CLAMP_F32 = 38,
    V_LOG_F32 = 39,
    V_RCP_CLAMP_F32 = 40,
    V_RCP_LEGACY_F32 = 41,
    V_RCP_F32 = 42,
    V_RCP_IFLAG_F32 = 43,
    V_RSQ_CLAMP_F32 = 44,
    V_RSQ_LEGACY_F32 = 45,
    V_RSQ_F32 = 46,
    V_RCP_F64 = 47,
    V_RCP_CLAMP_F64 = 48,
    V_RSQ_F64 = 49,
    V_RSQ_CLAMP_F64 = 50,
    V_SQRT_F32 = 51,
    V_SQRT_F64 = 52,
    V_SIN_F32 = 53,
    V_COS_F32 = 54,
    V_NOT_B32 = 55,
    V_BFREV_B32 = 56,
    V_FFBH_U32 = 57,
    V_FFBL_B32 = 58,
    V_FFBH_I32 = 59,
    V_FREXP_EXP_I32_F64 = 60,
    V_FREXP_MANT_F64 = 61,
    V_FRACT_F64 = 62,
    V_FREXP_EXP_I32_F32 = 63,
    V_FREXP_MANT_F32 = 64,
    V_CLREXCP = 65,
    V_MOVRELD_B32 = 66,
    V_MOVRELS_B32 = 67,
    V_MOVRELSD_B32 = 68,
    V_LOG_LEGACY_F32 = 69,
    V_EXP_LEGACY_F32 = 70,

    OP_RANGE_VOP1 = V_EXP_LEGACY_F32 + 1,
};

enum class OpcodeVOPC : u32 {
    V_CMP_F_F32 = 0,
    V_CMP_LT_F32 = 1,
    V_CMP_EQ_F32 = 2,
    V_CMP_LE_F32 = 3,
    V_CMP_GT_F32 = 4,
    V_CMP_LG_F32 = 5,
    V_CMP_GE_F32 = 6,
    V_CMP_O_F32 = 7,
    V_CMP_U_F32 = 8,
    V_CMP_NGE_F32 = 9,
    V_CMP_NLG_F32 = 10,
    V_CMP_NGT_F32 = 11,
    V_CMP_NLE_F32 = 12,
    V_CMP_NEQ_F32 = 13,
    V_CMP_NLT_F32 = 14,
    V_CMP_TRU_F32 = 15,
    V_CMP_T_F32 = 15,
    V_CMPX_F_F32 = 16,
    V_CMPX_LT_F32 = 17,
    V_CMPX_EQ_F32 = 18,
    V_CMPX_LE_F32 = 19,
    V_CMPX_GT_F32 = 20,
    V_CMPX_LG_F32 = 21,
    V_CMPX_GE_F32 = 22,
    V_CMPX_O_F32 = 23,
    V_CMPX_U_F32 = 24,
    V_CMPX_NGE_F32 = 25,
    V_CMPX_NLG_F32 = 26,
    V_CMPX_NGT_F32 = 27,
    V_CMPX_NLE_F32 = 28,
    V_CMPX_NEQ_F32 = 29,
    V_CMPX_NLT_F32 = 30,
    V_CMPX_TRU_F32 = 31,
    V_CMPX_T_F32 = 31,
    V_CMP_F_F64 = 32,
    V_CMP_LT_F64 = 33,
    V_CMP_EQ_F64 = 34,
    V_CMP_LE_F64 = 35,
    V_CMP_GT_F64 = 36,
    V_CMP_LG_F64 = 37,
    V_CMP_GE_F64 = 38,
    V_CMP_O_F64 = 39,
    V_CMP_U_F64 = 40,
    V_CMP_NGE_F64 = 41,
    V_CMP_NLG_F64 = 42,
    V_CMP_NGT_F64 = 43,
    V_CMP_NLE_F64 = 44,
    V_CMP_NEQ_F64 = 45,
    V_CMP_NLT_F64 = 46,
    V_CMP_TRU_F64 = 47,
    V_CMP_T_F64 = 47,
    V_CMPX_F_F64 = 48,
    V_CMPX_LT_F64 = 49,
    V_CMPX_EQ_F64 = 50,
    V_CMPX_LE_F64 = 51,
    V_CMPX_GT_F64 = 52,
    V_CMPX_LG_F64 = 53,
    V_CMPX_GE_F64 = 54,
    V_CMPX_O_F64 = 55,
    V_CMPX_U_F64 = 56,
    V_CMPX_NGE_F64 = 57,
    V_CMPX_NLG_F64 = 58,
    V_CMPX_NGT_F64 = 59,
    V_CMPX_NLE_F64 = 60,
    V_CMPX_NEQ_F64 = 61,
    V_CMPX_NLT_F64 = 62,
    V_CMPX_TRU_F64 = 63,
    V_CMPX_T_F64 = 63,
    V_CMPS_F_F32 = 64,
    V_CMPS_LT_F32 = 65,
    V_CMPS_EQ_F32 = 66,
    V_CMPS_LE_F32 = 67,
    V_CMPS_GT_F32 = 68,
    V_CMPS_LG_F32 = 69,
    V_CMPS_GE_F32 = 70,
    V_CMPS_O_F32 = 71,
    V_CMPS_U_F32 = 72,
    V_CMPS_NGE_F32 = 73,
    V_CMPS_NLG_F32 = 74,
    V_CMPS_NGT_F32 = 75,
    V_CMPS_NLE_F32 = 76,
    V_CMPS_NEQ_F32 = 77,
    V_CMPS_NLT_F32 = 78,
    V_CMPS_TRU_F32 = 79,
    V_CMPS_T_F32 = 79,
    V_CMPSX_F_F32 = 80,
    V_CMPSX_LT_F32 = 81,
    V_CMPSX_EQ_F32 = 82,
    V_CMPSX_LE_F32 = 83,
    V_CMPSX_GT_F32 = 84,
    V_CMPSX_LG_F32 = 85,
    V_CMPSX_GE_F32 = 86,
    V_CMPSX_O_F32 = 87,
    V_CMPSX_U_F32 = 88,
    V_CMPSX_NGE_F32 = 89,
    V_CMPSX_NLG_F32 = 90,
    V_CMPSX_NGT_F32 = 91,
    V_CMPSX_NLE_F32 = 92,
    V_CMPSX_NEQ_F32 = 93,
    V_CMPSX_NLT_F32 = 94,
    V_CMPSX_TRU_F32 = 95,
    V_CMPSX_T_F32 = 95,
    V_CMPS_F_F64 = 96,
    V_CMPS_LT_F64 = 97,
    V_CMPS_EQ_F64 = 98,
    V_CMPS_LE_F64 = 99,
    V_CMPS_GT_F64 = 100,
    V_CMPS_LG_F64 = 101,
    V_CMPS_GE_F64 = 102,
    V_CMPS_O_F64 = 103,
    V_CMPS_U_F64 = 104,
    V_CMPS_NGE_F64 = 105,
    V_CMPS_NLG_F64 = 106,
    V_CMPS_NGT_F64 = 107,
    V_CMPS_NLE_F64 = 108,
    V_CMPS_NEQ_F64 = 109,
    V_CMPS_NLT_F64 = 110,
    V_CMPS_TRU_F64 = 111,
    V_CMPS_T_F64 = 111,
    V_CMPSX_F_F64 = 112,
    V_CMPSX_LT_F64 = 113,
    V_CMPSX_EQ_F64 = 114,
    V_CMPSX_LE_F64 = 115,
    V_CMPSX_GT_F64 = 116,
    V_CMPSX_LG_F64 = 117,
    V_CMPSX_GE_F64 = 118,
    V_CMPSX_O_F64 = 119,
    V_CMPSX_U_F64 = 120,
    V_CMPSX_NGE_F64 = 121,
    V_CMPSX_NLG_F64 = 122,
    V_CMPSX_NGT_F64 = 123,
    V_CMPSX_NLE_F64 = 124,
    V_CMPSX_NEQ_F64 = 125,
    V_CMPSX_NLT_F64 = 126,
    V_CMPSX_TRU_F64 = 127,
    V_CMPSX_T_F64 = 127,
    V_CMP_F_I32 = 128,
    V_CMP_LT_I32 = 129,
    V_CMP_EQ_I32 = 130,
    V_CMP_LE_I32 = 131,
    V_CMP_GT_I32 = 132,
    V_CMP_LG_I32 = 133,
    V_CMP_NE_I32 = 133,
    V_CMP_GE_I32 = 134,
    V_CMP_TRU_I32 = 135,
    V_CMP_T_I32 = 135,
    V_CMP_CLASS_F32 = 136,
    V_CMPX_F_I32 = 144,
    V_CMPX_LT_I32 = 145,
    V_CMPX_EQ_I32 = 146,
    V_CMPX_LE_I32 = 147,
    V_CMPX_GT_I32 = 148,
    V_CMPX_LG_I32 = 149,
    V_CMPX_NE_I32 = 149,
    V_CMPX_GE_I32 = 150,
    V_CMPX_TRU_I32 = 151,
    V_CMPX_T_I32 = 151,
    V_CMPX_CLASS_F32 = 152,
    V_CMP_F_I64 = 160,
    V_CMP_LT_I64 = 161,
    V_CMP_EQ_I64 = 162,
    V_CMP_LE_I64 = 163,
    V_CMP_GT_I64 = 164,
    V_CMP_LG_I64 = 165,
    V_CMP_NE_I64 = 165,
    V_CMP_GE_I64 = 166,
    V_CMP_TRU_I64 = 167,
    V_CMP_T_I64 = 167,
    V_CMP_CLASS_F64 = 168,
    V_CMPX_F_I64 = 176,
    V_CMPX_LT_I64 = 177,
    V_CMPX_EQ_I64 = 178,
    V_CMPX_LE_I64 = 179,
    V_CMPX_GT_I64 = 180,
    V_CMPX_LG_I64 = 181,
    V_CMPX_NE_I64 = 181,
    V_CMPX_GE_I64 = 182,
    V_CMPX_TRU_I64 = 183,
    V_CMPX_T_I64 = 183,
    V_CMPX_CLASS_F64 = 184,
    V_CMP_F_U32 = 192,
    V_CMP_LT_U32 = 193,
    V_CMP_EQ_U32 = 194,
    V_CMP_LE_U32 = 195,
    V_CMP_GT_U32 = 196,
    V_CMP_LG_U32 = 197,
    V_CMP_NE_U32 = 197,
    V_CMP_GE_U32 = 198,
    V_CMP_TRU_U32 = 199,
    V_CMP_T_U32 = 199,
    V_CMPX_F_U32 = 208,
    V_CMPX_LT_U32 = 209,
    V_CMPX_EQ_U32 = 210,
    V_CMPX_LE_U32 = 211,
    V_CMPX_GT_U32 = 212,
    V_CMPX_LG_U32 = 213,
    V_CMPX_NE_U32 = 213,
    V_CMPX_GE_U32 = 214,
    V_CMPX_TRU_U32 = 215,
    V_CMPX_T_U32 = 215,
    V_CMP_F_U64 = 224,
    V_CMP_LT_U64 = 225,
    V_CMP_EQ_U64 = 226,
    V_CMP_LE_U64 = 227,
    V_CMP_GT_U64 = 228,
    V_CMP_LG_U64 = 229,
    V_CMP_NE_U64 = 229,
    V_CMP_GE_U64 = 230,
    V_CMP_TRU_U64 = 231,
    V_CMP_T_U64 = 231,
    V_CMPX_F_U64 = 240,
    V_CMPX_LT_U64 = 241,
    V_CMPX_EQ_U64 = 242,
    V_CMPX_LE_U64 = 243,
    V_CMPX_GT_U64 = 244,
    V_CMPX_LG_U64 = 245,
    V_CMPX_NE_U64 = 245,
    V_CMPX_GE_U64 = 246,
    V_CMPX_TRU_U64 = 247,
    V_CMPX_T_U64 = 247,

    OP_RANGE_VOPC = V_CMPX_T_U64 + 1,
};

enum class OpcodeVINTRP : u32 {
    V_INTERP_P1_F32 = 0,
    V_INTERP_P2_F32 = 1,
    V_INTERP_MOV_F32 = 2,

    OP_RANGE_VINTRP = V_INTERP_MOV_F32 + 1,
};

enum class OpcodeDS : u32 {
    DS_ADD_U32 = 0,
    DS_SUB_U32 = 1,
    DS_RSUB_U32 = 2,
    DS_INC_U32 = 3,
    DS_DEC_U32 = 4,
    DS_MIN_I32 = 5,
    DS_MAX_I32 = 6,
    DS_MIN_U32 = 7,
    DS_MAX_U32 = 8,
    DS_AND_B32 = 9,
    DS_OR_B32 = 10,
    DS_XOR_B32 = 11,
    DS_MSKOR_B32 = 12,
    DS_WRITE_B32 = 13,
    DS_WRITE2_B32 = 14,
    DS_WRITE2ST64_B32 = 15,
    DS_CMPST_B32 = 16,
    DS_CMPST_F32 = 17,
    DS_MIN_F32 = 18,
    DS_MAX_F32 = 19,
    DS_NOP = 20,
    DS_GWS_SEMA_RELEASE_ALL = 24,
    DS_GWS_INIT = 25,
    DS_GWS_SEMA_V = 26,
    DS_GWS_SEMA_BR = 27,
    DS_GWS_SEMA_P = 28,
    DS_GWS_BARRIER = 29,
    DS_WRITE_B8 = 30,
    DS_WRITE_B16 = 31,
    DS_ADD_RTN_U32 = 32,
    DS_SUB_RTN_U32 = 33,
    DS_RSUB_RTN_U32 = 34,
    DS_INC_RTN_U32 = 35,
    DS_DEC_RTN_U32 = 36,
    DS_MIN_RTN_I32 = 37,
    DS_MAX_RTN_I32 = 38,
    DS_MIN_RTN_U32 = 39,
    DS_MAX_RTN_U32 = 40,
    DS_AND_RTN_B32 = 41,
    DS_OR_RTN_B32 = 42,
    DS_XOR_RTN_B32 = 43,
    DS_MSKOR_RTN_B32 = 44,
    DS_WRXCHG_RTN_B32 = 45,
    DS_WRXCHG2_RTN_B32 = 46,
    DS_WRXCHG2ST64_RTN_B32 = 47,
    DS_CMPST_RTN_B32 = 48,
    DS_CMPST_RTN_F32 = 49,
    DS_MIN_RTN_F32 = 50,
    DS_MAX_RTN_F32 = 51,
    DS_WRAP_RTN_B32 = 52,
    DS_SWIZZLE_B32 = 53,
    DS_READ_B32 = 54,
    DS_READ2_B32 = 55,
    DS_READ2ST64_B32 = 56,
    DS_READ_I8 = 57,
    DS_READ_U8 = 58,
    DS_READ_I16 = 59,
    DS_READ_U16 = 60,
    DS_CONSUME = 61,
    DS_APPEND = 62,
    DS_ORDERED_COUNT = 63,
    DS_ADD_U64 = 64,
    DS_SUB_U64 = 65,
    DS_RSUB_U64 = 66,
    DS_INC_U64 = 67,
    DS_DEC_U64 = 68,
    DS_MIN_I64 = 69,
    DS_MAX_I64 = 70,
    DS_MIN_U64 = 71,
    DS_MAX_U64 = 72,
    DS_AND_B64 = 73,
    DS_OR_B64 = 74,
    DS_XOR_B64 = 75,
    DS_MSKOR_B64 = 76,
    DS_WRITE_B64 = 77,
    DS_WRITE2_B64 = 78,
    DS_WRITE2ST64_B64 = 79,
    DS_CMPST_B64 = 80,
    DS_CMPST_F64 = 81,
    DS_MIN_F64 = 82,
    DS_MAX_F64 = 83,
    DS_ADD_RTN_U64 = 96,
    DS_SUB_RTN_U64 = 97,
    DS_RSUB_RTN_U64 = 98,
    DS_INC_RTN_U64 = 99,
    DS_DEC_RTN_U64 = 100,
    DS_MIN_RTN_I64 = 101,
    DS_MAX_RTN_I64 = 102,
    DS_MIN_RTN_U64 = 103,
    DS_MAX_RTN_U64 = 104,
    DS_AND_RTN_B64 = 105,
    DS_OR_RTN_B64 = 106,
    DS_XOR_RTN_B64 = 107,
    DS_MSKOR_RTN_B64 = 108,
    DS_WRXCHG_RTN_B64 = 109,
    DS_WRXCHG2_RTN_B64 = 110,
    DS_WRXCHG2ST64_RTN_B64 = 111,
    DS_CMPST_RTN_B64 = 112,
    DS_CMPST_RTN_F64 = 113,
    DS_MIN_RTN_F64 = 114,
    DS_MAX_RTN_F64 = 115,
    DS_READ_B64 = 118,
    DS_READ2_B64 = 119,
    DS_READ2ST64_B64 = 120,
    DS_CONDXCHG32_RTN_B64 = 126,
    DS_ADD_SRC2_U32 = 128,
    DS_SUB_SRC2_U32 = 129,
    DS_RSUB_SRC2_U32 = 130,
    DS_INC_SRC2_U32 = 131,
    DS_DEC_SRC2_U32 = 132,
    DS_MIN_SRC2_I32 = 133,
    DS_MAX_SRC2_I32 = 134,
    DS_MIN_SRC2_U32 = 135,
    DS_MAX_SRC2_U32 = 136,
    DS_AND_SRC2_B32 = 137,
    DS_OR_SRC2_B32 = 138,
    DS_XOR_SRC2_B32 = 139,
    DS_WRITE_SRC2_B32 = 141,
    DS_MIN_SRC2_F32 = 146,
    DS_MAX_SRC2_F32 = 147,
    DS_ADD_SRC2_U64 = 192,
    DS_SUB_SRC2_U64 = 193,
    DS_RSUB_SRC2_U64 = 194,
    DS_INC_SRC2_U64 = 195,
    DS_DEC_SRC2_U64 = 196,
    DS_MIN_SRC2_I64 = 197,
    DS_MAX_SRC2_I64 = 198,
    DS_MIN_SRC2_U64 = 199,
    DS_MAX_SRC2_U64 = 200,
    DS_AND_SRC2_B64 = 201,
    DS_OR_SRC2_B64 = 202,
    DS_XOR_SRC2_B64 = 203,
    DS_WRITE_SRC2_B64 = 205,
    DS_MIN_SRC2_F64 = 210,
    DS_MAX_SRC2_F64 = 211,
    DS_WRITE_B96 = 222,
    DS_WRITE_B128 = 223,
    DS_CONDXCHG32_RTN_B128 = 253,
    DS_READ_B96 = 254,
    DS_READ_B128 = 255,

    OP_RANGE_DS = DS_READ_B128 + 1,
};

enum class OpcodeMUBUF : u32 {
    BUFFER_LOAD_FORMAT_X = 0,
    BUFFER_LOAD_FORMAT_XY = 1,
    BUFFER_LOAD_FORMAT_XYZ = 2,
    BUFFER_LOAD_FORMAT_XYZW = 3,
    BUFFER_STORE_FORMAT_X = 4,
    BUFFER_STORE_FORMAT_XY = 5,
    BUFFER_STORE_FORMAT_XYZ = 6,
    BUFFER_STORE_FORMAT_XYZW = 7,
    BUFFER_LOAD_UBYTE = 8,
    BUFFER_LOAD_SBYTE = 9,
    BUFFER_LOAD_USHORT = 10,
    BUFFER_LOAD_SSHORT = 11,
    BUFFER_LOAD_DWORD = 12,
    BUFFER_LOAD_DWORDX2 = 13,
    BUFFER_LOAD_DWORDX4 = 14,
    BUFFER_LOAD_DWORDX3 = 15,
    BUFFER_STORE_BYTE = 24,
    BUFFER_STORE_SHORT = 26,
    BUFFER_STORE_DWORD = 28,
    BUFFER_STORE_DWORDX2 = 29,
    BUFFER_STORE_DWORDX4 = 30,
    BUFFER_STORE_DWORDX3 = 31,
    BUFFER_ATOMIC_SWAP = 48,
    BUFFER_ATOMIC_CMPSWAP = 49,
    BUFFER_ATOMIC_ADD = 50,
    BUFFER_ATOMIC_SUB = 51,
    BUFFER_ATOMIC_SMIN = 53,
    BUFFER_ATOMIC_UMIN = 54,
    BUFFER_ATOMIC_SMAX = 55,
    BUFFER_ATOMIC_UMAX = 56,
    BUFFER_ATOMIC_AND = 57,
    BUFFER_ATOMIC_OR = 58,
    BUFFER_ATOMIC_XOR = 59,
    BUFFER_ATOMIC_INC = 60,
    BUFFER_ATOMIC_DEC = 61,
    BUFFER_ATOMIC_FCMPSWAP = 62,
    BUFFER_ATOMIC_FMIN = 63,
    BUFFER_ATOMIC_FMAX = 64,
    BUFFER_ATOMIC_SWAP_X2 = 80,
    BUFFER_ATOMIC_CMPSWAP_X2 = 81,
    BUFFER_ATOMIC_ADD_X2 = 82,
    BUFFER_ATOMIC_SUB_X2 = 83,
    BUFFER_ATOMIC_SMIN_X2 = 85,
    BUFFER_ATOMIC_UMIN_X2 = 86,
    BUFFER_ATOMIC_SMAX_X2 = 87,
    BUFFER_ATOMIC_UMAX_X2 = 88,
    BUFFER_ATOMIC_AND_X2 = 89,
    BUFFER_ATOMIC_OR_X2 = 90,
    BUFFER_ATOMIC_XOR_X2 = 91,
    BUFFER_ATOMIC_INC_X2 = 92,
    BUFFER_ATOMIC_DEC_X2 = 93,
    BUFFER_ATOMIC_FCMPSWAP_X2 = 94,
    BUFFER_ATOMIC_FMIN_X2 = 95,
    BUFFER_ATOMIC_FMAX_X2 = 96,
    BUFFER_WBINVL1_SC = 112,
    BUFFER_WBINVL1 = 113,

    OP_RANGE_MUBUF = BUFFER_WBINVL1 + 1,
};

enum class OpcodeMTBUF : u32 {
    TBUFFER_LOAD_FORMAT_X = 0,
    TBUFFER_LOAD_FORMAT_XY = 1,
    TBUFFER_LOAD_FORMAT_XYZ = 2,
    TBUFFER_LOAD_FORMAT_XYZW = 3,
    TBUFFER_STORE_FORMAT_X = 4,
    TBUFFER_STORE_FORMAT_XY = 5,
    TBUFFER_STORE_FORMAT_XYZ = 6,
    TBUFFER_STORE_FORMAT_XYZW = 7,

    OP_RANGE_MTBUF = TBUFFER_STORE_FORMAT_XYZW + 1,
};

enum class OpcodeMIMG : u32 {
    IMAGE_LOAD = 0,
    IMAGE_LOAD_MIP = 1,
    IMAGE_LOAD_PCK = 2,
    IMAGE_LOAD_PCK_SGN = 3,
    IMAGE_LOAD_MIP_PCK = 4,
    IMAGE_LOAD_MIP_PCK_SGN = 5,
    IMAGE_STORE = 8,
    IMAGE_STORE_MIP = 9,
    IMAGE_STORE_PCK = 10,
    IMAGE_STORE_MIP_PCK = 11,
    IMAGE_GET_RESINFO = 14,
    IMAGE_ATOMIC_SWAP = 15,
    IMAGE_ATOMIC_CMPSWAP = 16,
    IMAGE_ATOMIC_ADD = 17,
    IMAGE_ATOMIC_SUB = 18,
    IMAGE_ATOMIC_SMIN = 20,
    IMAGE_ATOMIC_UMIN = 21,
    IMAGE_ATOMIC_SMAX = 22,
    IMAGE_ATOMIC_UMAX = 23,
    IMAGE_ATOMIC_AND = 24,
    IMAGE_ATOMIC_OR = 25,
    IMAGE_ATOMIC_XOR = 26,
    IMAGE_ATOMIC_INC = 27,
    IMAGE_ATOMIC_DEC = 28,
    IMAGE_ATOMIC_FCMPSWAP = 29,
    IMAGE_ATOMIC_FMIN = 30,
    IMAGE_ATOMIC_FMAX = 31,
    IMAGE_SAMPLE = 32,
    IMAGE_SAMPLE_CL = 33,
    IMAGE_SAMPLE_D = 34,
    IMAGE_SAMPLE_D_CL = 35,
    IMAGE_SAMPLE_L = 36,
    IMAGE_SAMPLE_B = 37,
    IMAGE_SAMPLE_B_CL = 38,
    IMAGE_SAMPLE_LZ = 39,
    IMAGE_SAMPLE_C = 40,
    IMAGE_SAMPLE_C_CL = 41,
    IMAGE_SAMPLE_C_D = 42,
    IMAGE_SAMPLE_C_D_CL = 43,
    IMAGE_SAMPLE_C_L = 44,
    IMAGE_SAMPLE_C_B = 45,
    IMAGE_SAMPLE_C_B_CL = 46,
    IMAGE_SAMPLE_C_LZ = 47,
    IMAGE_SAMPLE_O = 48,
    IMAGE_SAMPLE_CL_O = 49,
    IMAGE_SAMPLE_D_O = 50,
    IMAGE_SAMPLE_D_CL_O = 51,
    IMAGE_SAMPLE_L_O = 52,
    IMAGE_SAMPLE_B_O = 53,
    IMAGE_SAMPLE_B_CL_O = 54,
    IMAGE_SAMPLE_LZ_O = 55,
    IMAGE_SAMPLE_C_O = 56,
    IMAGE_SAMPLE_C_CL_O = 57,
    IMAGE_SAMPLE_C_D_O = 58,
    IMAGE_SAMPLE_C_D_CL_O = 59,
    IMAGE_SAMPLE_C_L_O = 60,
    IMAGE_SAMPLE_C_B_O = 61,
    IMAGE_SAMPLE_C_B_CL_O = 62,
    IMAGE_SAMPLE_C_LZ_O = 63,
    IMAGE_GATHER4 = 64,
    IMAGE_GATHER4_CL = 65,
    IMAGE_GATHER4_L = 68,
    IMAGE_GATHER4_B = 69,
    IMAGE_GATHER4_B_CL = 70,
    IMAGE_GATHER4_LZ = 71,
    IMAGE_GATHER4_C = 72,
    IMAGE_GATHER4_C_CL = 73,
    IMAGE_GATHER4_C_L = 76,
    IMAGE_GATHER4_C_B = 77,
    IMAGE_GATHER4_C_B_CL = 78,
    IMAGE_GATHER4_C_LZ = 79,
    IMAGE_GATHER4_O = 80,
    IMAGE_GATHER4_CL_O = 81,
    IMAGE_GATHER4_L_O = 84,
    IMAGE_GATHER4_B_O = 85,
    IMAGE_GATHER4_B_CL_O = 86,
    IMAGE_GATHER4_LZ_O = 87,
    IMAGE_GATHER4_C_O = 88,
    IMAGE_GATHER4_C_CL_O = 89,
    IMAGE_GATHER4_C_L_O = 92,
    IMAGE_GATHER4_C_B_O = 93,
    IMAGE_GATHER4_C_B_CL_O = 94,
    IMAGE_GATHER4_C_LZ_O = 95,
    IMAGE_GET_LOD = 96,
    IMAGE_SAMPLE_CD = 104,
    IMAGE_SAMPLE_CD_CL = 105,
    IMAGE_SAMPLE_C_CD = 106,
    IMAGE_SAMPLE_C_CD_CL = 107,
    IMAGE_SAMPLE_CD_O = 108,
    IMAGE_SAMPLE_CD_CL_O = 109,
    IMAGE_SAMPLE_C_CD_O = 110,
    IMAGE_SAMPLE_C_CD_CL_O = 111,

    OP_RANGE_MIMG = IMAGE_SAMPLE_C_CD_CL_O + 1,
};

enum class OpcodeEXP : u32 {
    EXP = 0,

    OP_RANGE_EXP = EXP + 1,
};

// Use to map VOP3 opcodes into VOP1, VOP2, VOPC
enum class OpMapVOP3VOPX : u32 {
    VOP3_TO_VOPC = 0,
    VOP3_TO_VOP2 = 256,
    VOP3_TO_VOP1 = 384,
};

// Use to map all opcodes into a single enum
enum class OpcodeMap : u32 {
    OP_MAP_SOP2 = 0,
    OP_MAP_SOPK = OP_MAP_SOP2 + (u32)OpcodeSOP2::OP_RANGE_SOP2,
    OP_MAP_SOP1 = OP_MAP_SOPK + (u32)OpcodeSOPK::OP_RANGE_SOPK,
    OP_MAP_SOPC = OP_MAP_SOP1 + (u32)OpcodeSOP1::OP_RANGE_SOP1,
    OP_MAP_SOPP = OP_MAP_SOPC + (u32)OpcodeSOPC::OP_RANGE_SOPC,
    OP_MAP_VOPC = OP_MAP_SOPP + (u32)OpcodeSOPP::OP_RANGE_SOPP,
    OP_MAP_VOP2 = OP_MAP_VOPC + (u32)OpcodeVOPC::OP_RANGE_VOPC,
    OP_MAP_VOP1 = OP_MAP_VOP2 + (u32)OpcodeVOP2::OP_RANGE_VOP2,
    OP_MAP_VOP3 = OP_MAP_VOP1 + (u32)OpcodeVOP1::OP_RANGE_VOP1,
    OP_MAP_VINTRP = OP_MAP_VOP3 + (u32)OpcodeVOP3::OP_RANGE_VOP3,
    OP_MAP_SMRD = OP_MAP_VINTRP + (u32)OpcodeVINTRP::OP_RANGE_VINTRP,
    OP_MAP_DS = OP_MAP_SMRD + (u32)OpcodeSMRD::OP_RANGE_SMRD,
    OP_MAP_MUBUF = OP_MAP_DS + (u32)OpcodeDS::OP_RANGE_DS,
    OP_MAP_MTBUF = OP_MAP_MUBUF + (u32)OpcodeMUBUF::OP_RANGE_MUBUF,
    OP_MAP_MIMG = OP_MAP_MTBUF + (u32)OpcodeMTBUF::OP_RANGE_MTBUF,
    OP_MAP_EXP = OP_MAP_MIMG + (u32)OpcodeMIMG::OP_RANGE_MIMG,
};

enum class Opcode : u32 {
    // SOP2
    S_ADD_U32 = 0 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_SUB_U32 = 1 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_ADD_I32 = 2 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_SUB_I32 = 3 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_ADDC_U32 = 4 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_SUBB_U32 = 5 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_MIN_I32 = 6 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_MIN_U32 = 7 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_MAX_I32 = 8 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_MAX_U32 = 9 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_CSELECT_B32 = 10 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_CSELECT_B64 = 11 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_AND_B32 = 14 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_AND_B64 = 15 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_OR_B32 = 16 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_OR_B64 = 17 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_XOR_B32 = 18 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_XOR_B64 = 19 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_ANDN2_B32 = 20 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_ANDN2_B64 = 21 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_ORN2_B32 = 22 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_ORN2_B64 = 23 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_NAND_B32 = 24 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_NAND_B64 = 25 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_NOR_B32 = 26 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_NOR_B64 = 27 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_XNOR_B32 = 28 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_XNOR_B64 = 29 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_LSHL_B32 = 30 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_LSHL_B64 = 31 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_LSHR_B32 = 32 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_LSHR_B64 = 33 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_ASHR_I32 = 34 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_ASHR_I64 = 35 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_BFM_B32 = 36 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_BFM_B64 = 37 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_MUL_I32 = 38 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_BFE_U32 = 39 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_BFE_I32 = 40 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_BFE_U64 = 41 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_BFE_I64 = 42 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_CBRANCH_G_FORK = 43 + (u32)OpcodeMap::OP_MAP_SOP2,
    S_ABSDIFF_I32 = 44 + (u32)OpcodeMap::OP_MAP_SOP2,
    // SOPK
    S_MOVK_I32 = 0 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMOVK_I32 = 2 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_EQ_I32 = 3 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_LG_I32 = 4 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_GT_I32 = 5 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_GE_I32 = 6 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_LT_I32 = 7 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_LE_I32 = 8 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_EQ_U32 = 9 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_LG_U32 = 10 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_GT_U32 = 11 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_GE_U32 = 12 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_LT_U32 = 13 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CMPK_LE_U32 = 14 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_ADDK_I32 = 15 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_MULK_I32 = 16 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_CBRANCH_I_FORK = 17 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_GETREG_B32 = 18 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_SETREG_B32 = 19 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_GETREG_REGRD_B32 = 20 + (u32)OpcodeMap::OP_MAP_SOPK,
    S_SETREG_IMM32_B32 = 21 + (u32)OpcodeMap::OP_MAP_SOPK,
    // SOP1
    S_MOV_B32 = 3 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_MOV_B64 = 4 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_CMOV_B32 = 5 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_CMOV_B64 = 6 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_NOT_B32 = 7 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_NOT_B64 = 8 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_WQM_B32 = 9 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_WQM_B64 = 10 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_BREV_B32 = 11 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_BREV_B64 = 12 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_BCNT0_I32_B32 = 13 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_BCNT0_I32_B64 = 14 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_BCNT1_I32_B32 = 15 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_BCNT1_I32_B64 = 16 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_FF0_I32_B32 = 17 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_FF0_I32_B64 = 18 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_FF1_I32_B32 = 19 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_FF1_I32_B64 = 20 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_FLBIT_I32_B32 = 21 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_FLBIT_I32_B64 = 22 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_FLBIT_I32 = 23 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_FLBIT_I32_I64 = 24 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_SEXT_I32_I8 = 25 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_SEXT_I32_I16 = 26 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_BITSET0_B32 = 27 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_BITSET0_B64 = 28 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_BITSET1_B32 = 29 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_BITSET1_B64 = 30 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_GETPC_B64 = 31 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_SETPC_B64 = 32 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_SWAPPC_B64 = 33 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_RFE_B64 = 34 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_AND_SAVEEXEC_B64 = 36 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_OR_SAVEEXEC_B64 = 37 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_XOR_SAVEEXEC_B64 = 38 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_ANDN2_SAVEEXEC_B64 = 39 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_ORN2_SAVEEXEC_B64 = 40 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_NAND_SAVEEXEC_B64 = 41 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_NOR_SAVEEXEC_B64 = 42 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_XNOR_SAVEEXEC_B64 = 43 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_QUADMASK_B32 = 44 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_QUADMASK_B64 = 45 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_MOVRELS_B32 = 46 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_MOVRELS_B64 = 47 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_MOVRELD_B32 = 48 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_MOVRELD_B64 = 49 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_CBRANCH_JOIN = 50 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_MOV_REGRD_B32 = 51 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_ABS_I32 = 52 + (u32)OpcodeMap::OP_MAP_SOP1,
    S_MOV_FED_B32 = 53 + (u32)OpcodeMap::OP_MAP_SOP1,
    // SOPC
    S_CMP_EQ_I32 = 0 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_CMP_LG_I32 = 1 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_CMP_GT_I32 = 2 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_CMP_GE_I32 = 3 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_CMP_LT_I32 = 4 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_CMP_LE_I32 = 5 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_CMP_EQ_U32 = 6 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_CMP_LG_U32 = 7 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_CMP_GT_U32 = 8 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_CMP_GE_U32 = 9 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_CMP_LT_U32 = 10 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_CMP_LE_U32 = 11 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_BITCMP0_B32 = 12 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_BITCMP1_B32 = 13 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_BITCMP0_B64 = 14 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_BITCMP1_B64 = 15 + (u32)OpcodeMap::OP_MAP_SOPC,
    S_SETVSKIP = 16 + (u32)OpcodeMap::OP_MAP_SOPC,
    // SOPP
    S_NOP = 0 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_ENDPGM = 1 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_BRANCH = 2 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_CBRANCH_SCC0 = 4 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_CBRANCH_SCC1 = 5 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_CBRANCH_VCCZ = 6 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_CBRANCH_VCCNZ = 7 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_CBRANCH_EXECZ = 8 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_CBRANCH_EXECNZ = 9 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_BARRIER = 10 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_SETKILL = 11 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_WAITCNT = 12 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_SETHALT = 13 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_SLEEP = 14 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_SETPRIO = 15 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_SENDMSG = 16 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_SENDMSGHALT = 17 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_TRAP = 18 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_ICACHE_INV = 19 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_INCPERFLEVEL = 20 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_DECPERFLEVEL = 21 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_TTRACEDATA = 22 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_CBRANCH_CDBGSYS = 23 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_CBRANCH_CDBGUSER = 24 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_CBRANCH_CDBGSYS_OR_USER = 25 + (u32)OpcodeMap::OP_MAP_SOPP,
    S_CBRANCH_CDBGSYS_AND_USER = 26 + (u32)OpcodeMap::OP_MAP_SOPP,
    // VOPC
    V_CMP_F_F32 = 0 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LT_F32 = 1 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_EQ_F32 = 2 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LE_F32 = 3 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GT_F32 = 4 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LG_F32 = 5 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GE_F32 = 6 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_O_F32 = 7 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_U_F32 = 8 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NGE_F32 = 9 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NLG_F32 = 10 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NGT_F32 = 11 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NLE_F32 = 12 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NEQ_F32 = 13 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NLT_F32 = 14 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_TRU_F32 = 15 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_T_F32 = 15 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_F_F32 = 16 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LT_F32 = 17 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_EQ_F32 = 18 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LE_F32 = 19 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GT_F32 = 20 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LG_F32 = 21 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GE_F32 = 22 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_O_F32 = 23 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_U_F32 = 24 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NGE_F32 = 25 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NLG_F32 = 26 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NGT_F32 = 27 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NLE_F32 = 28 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NEQ_F32 = 29 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NLT_F32 = 30 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_TRU_F32 = 31 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_T_F32 = 31 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_F_F64 = 32 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LT_F64 = 33 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_EQ_F64 = 34 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LE_F64 = 35 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GT_F64 = 36 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LG_F64 = 37 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GE_F64 = 38 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_O_F64 = 39 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_U_F64 = 40 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NGE_F64 = 41 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NLG_F64 = 42 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NGT_F64 = 43 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NLE_F64 = 44 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NEQ_F64 = 45 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NLT_F64 = 46 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_TRU_F64 = 47 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_T_F64 = 47 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_F_F64 = 48 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LT_F64 = 49 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_EQ_F64 = 50 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LE_F64 = 51 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GT_F64 = 52 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LG_F64 = 53 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GE_F64 = 54 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_O_F64 = 55 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_U_F64 = 56 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NGE_F64 = 57 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NLG_F64 = 58 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NGT_F64 = 59 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NLE_F64 = 60 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NEQ_F64 = 61 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NLT_F64 = 62 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_TRU_F64 = 63 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_T_F64 = 63 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_F_F32 = 64 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_LT_F32 = 65 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_EQ_F32 = 66 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_LE_F32 = 67 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_GT_F32 = 68 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_LG_F32 = 69 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_GE_F32 = 70 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_O_F32 = 71 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_U_F32 = 72 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NGE_F32 = 73 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NLG_F32 = 74 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NGT_F32 = 75 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NLE_F32 = 76 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NEQ_F32 = 77 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NLT_F32 = 78 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_TRU_F32 = 79 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_T_F32 = 79 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_F_F32 = 80 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_LT_F32 = 81 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_EQ_F32 = 82 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_LE_F32 = 83 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_GT_F32 = 84 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_LG_F32 = 85 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_GE_F32 = 86 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_O_F32 = 87 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_U_F32 = 88 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NGE_F32 = 89 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NLG_F32 = 90 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NGT_F32 = 91 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NLE_F32 = 92 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NEQ_F32 = 93 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NLT_F32 = 94 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_TRU_F32 = 95 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_T_F32 = 95 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_F_F64 = 96 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_LT_F64 = 97 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_EQ_F64 = 98 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_LE_F64 = 99 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_GT_F64 = 100 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_LG_F64 = 101 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_GE_F64 = 102 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_O_F64 = 103 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_U_F64 = 104 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NGE_F64 = 105 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NLG_F64 = 106 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NGT_F64 = 107 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NLE_F64 = 108 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NEQ_F64 = 109 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_NLT_F64 = 110 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_TRU_F64 = 111 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPS_T_F64 = 111 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_F_F64 = 112 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_LT_F64 = 113 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_EQ_F64 = 114 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_LE_F64 = 115 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_GT_F64 = 116 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_LG_F64 = 117 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_GE_F64 = 118 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_O_F64 = 119 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_U_F64 = 120 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NGE_F64 = 121 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NLG_F64 = 122 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NGT_F64 = 123 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NLE_F64 = 124 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NEQ_F64 = 125 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_NLT_F64 = 126 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_TRU_F64 = 127 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPSX_T_F64 = 127 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_F_I32 = 128 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LT_I32 = 129 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_EQ_I32 = 130 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LE_I32 = 131 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GT_I32 = 132 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NE_I32 = 133 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GE_I32 = 134 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_TRU_I32 = 135 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_T_I32 = 135 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_CLASS_F32 = 136 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_F_I32 = 144 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LT_I32 = 145 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_EQ_I32 = 146 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LE_I32 = 147 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GT_I32 = 148 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LG_I32 = 149 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NE_I32 = 149 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GE_I32 = 150 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_TRU_I32 = 151 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_T_I32 = 151 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_CLASS_F32 = 152 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_F_I64 = 160 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LT_I64 = 161 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_EQ_I64 = 162 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LE_I64 = 163 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GT_I64 = 164 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LG_I64 = 165 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NE_I64 = 165 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GE_I64 = 166 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_TRU_I64 = 167 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_T_I64 = 167 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_CLASS_F64 = 168 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_F_I64 = 176 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LT_I64 = 177 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_EQ_I64 = 178 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LE_I64 = 179 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GT_I64 = 180 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LG_I64 = 181 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NE_I64 = 181 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GE_I64 = 182 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_TRU_I64 = 183 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_T_I64 = 183 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_CLASS_F64 = 184 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_F_U32 = 192 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LT_U32 = 193 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_EQ_U32 = 194 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LE_U32 = 195 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GT_U32 = 196 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NE_U32 = 197 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GE_U32 = 198 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_TRU_U32 = 199 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_T_U32 = 199 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_F_U32 = 208 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LT_U32 = 209 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_EQ_U32 = 210 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LE_U32 = 211 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GT_U32 = 212 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NE_U32 = 213 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GE_U32 = 214 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_TRU_U32 = 215 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_T_U32 = 215 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_F_U64 = 224 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LT_U64 = 225 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_EQ_U64 = 226 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LE_U64 = 227 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GT_U64 = 228 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_LG_U64 = 229 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_NE_U64 = 229 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_GE_U64 = 230 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_TRU_U64 = 231 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMP_T_U64 = 231 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_F_U64 = 240 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LT_U64 = 241 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_EQ_U64 = 242 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LE_U64 = 243 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GT_U64 = 244 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_LG_U64 = 245 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_NE_U64 = 245 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_GE_U64 = 246 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_TRU_U64 = 247 + (u32)OpcodeMap::OP_MAP_VOPC,
    V_CMPX_T_U64 = 247 + (u32)OpcodeMap::OP_MAP_VOPC,
    // VOP2
    V_CNDMASK_B32 = 0 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_READLANE_B32 = 1 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_WRITELANE_B32 = 2 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_ADD_F32 = 3 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_SUB_F32 = 4 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_SUBREV_F32 = 5 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MAC_LEGACY_F32 = 6 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MUL_LEGACY_F32 = 7 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MUL_F32 = 8 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MUL_I32_I24 = 9 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MUL_HI_I32_I24 = 10 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MUL_U32_U24 = 11 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MUL_HI_U32_U24 = 12 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MIN_LEGACY_F32 = 13 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MAX_LEGACY_F32 = 14 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MIN_F32 = 15 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MAX_F32 = 16 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MIN_I32 = 17 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MAX_I32 = 18 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MIN_U32 = 19 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MAX_U32 = 20 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_LSHR_B32 = 21 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_LSHRREV_B32 = 22 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_ASHR_I32 = 23 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_ASHRREV_I32 = 24 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_LSHL_B32 = 25 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_LSHLREV_B32 = 26 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_AND_B32 = 27 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_OR_B32 = 28 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_XOR_B32 = 29 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_BFM_B32 = 30 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MAC_F32 = 31 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MADMK_F32 = 32 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MADAK_F32 = 33 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_BCNT_U32_B32 = 34 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MBCNT_LO_U32_B32 = 35 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_MBCNT_HI_U32_B32 = 36 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_ADD_I32 = 37 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_SUB_I32 = 38 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_SUBREV_I32 = 39 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_ADDC_U32 = 40 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_SUBB_U32 = 41 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_SUBBREV_U32 = 42 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_LDEXP_F32 = 43 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_CVT_PKACCUM_U8_F32 = 44 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_CVT_PKNORM_I16_F32 = 45 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_CVT_PKNORM_U16_F32 = 46 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_CVT_PKRTZ_F16_F32 = 47 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_CVT_PK_U16_U32 = 48 + (u32)OpcodeMap::OP_MAP_VOP2,
    V_CVT_PK_I16_I32 = 49 + (u32)OpcodeMap::OP_MAP_VOP2,
    // VOP1
    V_NOP = 0 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_MOV_B32 = 1 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_READFIRSTLANE_B32 = 2 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_I32_F64 = 3 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F64_I32 = 4 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F32_I32 = 5 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F32_U32 = 6 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_U32_F32 = 7 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_I32_F32 = 8 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_MOV_FED_B32 = 9 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F16_F32 = 10 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F32_F16 = 11 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_RPI_I32_F32 = 12 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_FLR_I32_F32 = 13 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_OFF_F32_I4 = 14 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F32_F64 = 15 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F64_F32 = 16 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F32_UBYTE0 = 17 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F32_UBYTE1 = 18 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F32_UBYTE2 = 19 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F32_UBYTE3 = 20 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_U32_F64 = 21 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CVT_F64_U32 = 22 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_TRUNC_F64 = 23 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CEIL_F64 = 24 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RNDNE_F64 = 25 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_FLOOR_F64 = 26 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_FRACT_F32 = 32 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_TRUNC_F32 = 33 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CEIL_F32 = 34 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RNDNE_F32 = 35 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_FLOOR_F32 = 36 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_EXP_F32 = 37 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_LOG_CLAMP_F32 = 38 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_LOG_F32 = 39 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RCP_CLAMP_F32 = 40 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RCP_LEGACY_F32 = 41 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RCP_F32 = 42 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RCP_IFLAG_F32 = 43 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RSQ_CLAMP_F32 = 44 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RSQ_LEGACY_F32 = 45 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RSQ_F32 = 46 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RCP_F64 = 47 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RCP_CLAMP_F64 = 48 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RSQ_F64 = 49 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_RSQ_CLAMP_F64 = 50 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_SQRT_F32 = 51 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_SQRT_F64 = 52 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_SIN_F32 = 53 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_COS_F32 = 54 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_NOT_B32 = 55 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_BFREV_B32 = 56 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_FFBH_U32 = 57 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_FFBL_B32 = 58 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_FFBH_I32 = 59 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_FREXP_EXP_I32_F64 = 60 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_FREXP_MANT_F64 = 61 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_FRACT_F64 = 62 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_FREXP_EXP_I32_F32 = 63 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_FREXP_MANT_F32 = 64 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_CLREXCP = 65 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_MOVRELD_B32 = 66 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_MOVRELS_B32 = 67 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_MOVRELSD_B32 = 68 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_LOG_LEGACY_F32 = 69 + (u32)OpcodeMap::OP_MAP_VOP1,
    V_EXP_LEGACY_F32 = 70 + (u32)OpcodeMap::OP_MAP_VOP1,
    // VOP3
    V_MAD_LEGACY_F32 = 320 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MAD_F32 = 321 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MAD_I32_I24 = 322 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MAD_U32_U24 = 323 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_CUBEID_F32 = 324 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_CUBESC_F32 = 325 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_CUBETC_F32 = 326 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_CUBEMA_F32 = 327 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_BFE_U32 = 328 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_BFE_I32 = 329 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_BFI_B32 = 330 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_FMA_F32 = 331 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_FMA_F64 = 332 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_LERP_U8 = 333 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_ALIGNBIT_B32 = 334 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_ALIGNBYTE_B32 = 335 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MULLIT_F32 = 336 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MIN3_F32 = 337 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MIN3_I32 = 338 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MIN3_U32 = 339 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MAX3_F32 = 340 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MAX3_I32 = 341 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MAX3_U32 = 342 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MED3_F32 = 343 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MED3_I32 = 344 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MED3_U32 = 345 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_SAD_U8 = 346 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_SAD_HI_U8 = 347 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_SAD_U16 = 348 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_SAD_U32 = 349 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_CVT_PK_U8_F32 = 350 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_DIV_FIXUP_F32 = 351 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_DIV_FIXUP_F64 = 352 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_LSHL_B64 = 353 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_LSHR_B64 = 354 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_ASHR_I64 = 355 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_ADD_F64 = 356 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MUL_F64 = 357 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MIN_F64 = 358 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MAX_F64 = 359 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_LDEXP_F64 = 360 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MUL_LO_U32 = 361 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MUL_HI_U32 = 362 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MUL_LO_I32 = 363 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MUL_HI_I32 = 364 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_DIV_SCALE_F32 = 365 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_DIV_SCALE_F64 = 366 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_DIV_FMAS_F32 = 367 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_DIV_FMAS_F64 = 368 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MSAD_U8 = 369 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_QSAD_U8 = 370 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_QSAD_PK_U16_U8 = 370 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MQSAD_U8 = 371 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MQSAD_PK_U16_U8 = 371 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_TRIG_PREOP_F64 = 372 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MQSAD_U32_U8 = 373 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MAD_U64_U32 = 374 + (u32)OpcodeMap::OP_MAP_VOP3,
    V_MAD_I64_I32 = 375 + (u32)OpcodeMap::OP_MAP_VOP3,
    // VINTRP
    V_INTERP_P1_F32 = 0 + (u32)OpcodeMap::OP_MAP_VINTRP,
    V_INTERP_P2_F32 = 1 + (u32)OpcodeMap::OP_MAP_VINTRP,
    V_INTERP_MOV_F32 = 2 + (u32)OpcodeMap::OP_MAP_VINTRP,
    // SMRD
    S_LOAD_DWORD = 0 + (u32)OpcodeMap::OP_MAP_SMRD,
    S_LOAD_DWORDX2 = 1 + (u32)OpcodeMap::OP_MAP_SMRD,
    S_LOAD_DWORDX4 = 2 + (u32)OpcodeMap::OP_MAP_SMRD,
    S_LOAD_DWORDX8 = 3 + (u32)OpcodeMap::OP_MAP_SMRD,
    S_LOAD_DWORDX16 = 4 + (u32)OpcodeMap::OP_MAP_SMRD,
    S_BUFFER_LOAD_DWORD = 8 + (u32)OpcodeMap::OP_MAP_SMRD,
    S_BUFFER_LOAD_DWORDX2 = 9 + (u32)OpcodeMap::OP_MAP_SMRD,
    S_BUFFER_LOAD_DWORDX4 = 10 + (u32)OpcodeMap::OP_MAP_SMRD,
    S_BUFFER_LOAD_DWORDX8 = 11 + (u32)OpcodeMap::OP_MAP_SMRD,
    S_BUFFER_LOAD_DWORDX16 = 12 + (u32)OpcodeMap::OP_MAP_SMRD,
    S_MEMTIME = 30 + (u32)OpcodeMap::OP_MAP_SMRD,
    S_DCACHE_INV = 31 + (u32)OpcodeMap::OP_MAP_SMRD,
    // DS
    DS_ADD_U32 = 0 + (u32)OpcodeMap::OP_MAP_DS,
    DS_SUB_U32 = 1 + (u32)OpcodeMap::OP_MAP_DS,
    DS_RSUB_U32 = 2 + (u32)OpcodeMap::OP_MAP_DS,
    DS_INC_U32 = 3 + (u32)OpcodeMap::OP_MAP_DS,
    DS_DEC_U32 = 4 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_I32 = 5 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_I32 = 6 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_U32 = 7 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_U32 = 8 + (u32)OpcodeMap::OP_MAP_DS,
    DS_AND_B32 = 9 + (u32)OpcodeMap::OP_MAP_DS,
    DS_OR_B32 = 10 + (u32)OpcodeMap::OP_MAP_DS,
    DS_XOR_B32 = 11 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MSKOR_B32 = 12 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE_B32 = 13 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE2_B32 = 14 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE2ST64_B32 = 15 + (u32)OpcodeMap::OP_MAP_DS,
    DS_CMPST_B32 = 16 + (u32)OpcodeMap::OP_MAP_DS,
    DS_CMPST_F32 = 17 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_F32 = 18 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_F32 = 19 + (u32)OpcodeMap::OP_MAP_DS,
    DS_NOP = 20 + (u32)OpcodeMap::OP_MAP_DS,
    DS_GWS_SEMA_RELEASE_ALL = 24 + (u32)OpcodeMap::OP_MAP_DS,
    DS_GWS_INIT = 25 + (u32)OpcodeMap::OP_MAP_DS,
    DS_GWS_SEMA_V = 26 + (u32)OpcodeMap::OP_MAP_DS,
    DS_GWS_SEMA_BR = 27 + (u32)OpcodeMap::OP_MAP_DS,
    DS_GWS_SEMA_P = 28 + (u32)OpcodeMap::OP_MAP_DS,
    DS_GWS_BARRIER = 29 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE_B8 = 30 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE_B16 = 31 + (u32)OpcodeMap::OP_MAP_DS,
    DS_ADD_RTN_U32 = 32 + (u32)OpcodeMap::OP_MAP_DS,
    DS_SUB_RTN_U32 = 33 + (u32)OpcodeMap::OP_MAP_DS,
    DS_RSUB_RTN_U32 = 34 + (u32)OpcodeMap::OP_MAP_DS,
    DS_INC_RTN_U32 = 35 + (u32)OpcodeMap::OP_MAP_DS,
    DS_DEC_RTN_U32 = 36 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_RTN_I32 = 37 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_RTN_I32 = 38 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_RTN_U32 = 39 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_RTN_U32 = 40 + (u32)OpcodeMap::OP_MAP_DS,
    DS_AND_RTN_B32 = 41 + (u32)OpcodeMap::OP_MAP_DS,
    DS_OR_RTN_B32 = 42 + (u32)OpcodeMap::OP_MAP_DS,
    DS_XOR_RTN_B32 = 43 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MSKOR_RTN_B32 = 44 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRXCHG_RTN_B32 = 45 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRXCHG2_RTN_B32 = 46 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRXCHG2ST64_RTN_B32 = 47 + (u32)OpcodeMap::OP_MAP_DS,
    DS_CMPST_RTN_B32 = 48 + (u32)OpcodeMap::OP_MAP_DS,
    DS_CMPST_RTN_F32 = 49 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_RTN_F32 = 50 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_RTN_F32 = 51 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRAP_RTN_B32 = 52 + (u32)OpcodeMap::OP_MAP_DS,
    DS_SWIZZLE_B32 = 53 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ_B32 = 54 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ2_B32 = 55 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ2ST64_B32 = 56 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ_I8 = 57 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ_U8 = 58 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ_I16 = 59 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ_U16 = 60 + (u32)OpcodeMap::OP_MAP_DS,
    DS_CONSUME = 61 + (u32)OpcodeMap::OP_MAP_DS,
    DS_APPEND = 62 + (u32)OpcodeMap::OP_MAP_DS,
    DS_ORDERED_COUNT = 63 + (u32)OpcodeMap::OP_MAP_DS,
    DS_ADD_U64 = 64 + (u32)OpcodeMap::OP_MAP_DS,
    DS_SUB_U64 = 65 + (u32)OpcodeMap::OP_MAP_DS,
    DS_RSUB_U64 = 66 + (u32)OpcodeMap::OP_MAP_DS,
    DS_INC_U64 = 67 + (u32)OpcodeMap::OP_MAP_DS,
    DS_DEC_U64 = 68 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_I64 = 69 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_I64 = 70 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_U64 = 71 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_U64 = 72 + (u32)OpcodeMap::OP_MAP_DS,
    DS_AND_B64 = 73 + (u32)OpcodeMap::OP_MAP_DS,
    DS_OR_B64 = 74 + (u32)OpcodeMap::OP_MAP_DS,
    DS_XOR_B64 = 75 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MSKOR_B64 = 76 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE_B64 = 77 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE2_B64 = 78 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE2ST64_B64 = 79 + (u32)OpcodeMap::OP_MAP_DS,
    DS_CMPST_B64 = 80 + (u32)OpcodeMap::OP_MAP_DS,
    DS_CMPST_F64 = 81 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_F64 = 82 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_F64 = 83 + (u32)OpcodeMap::OP_MAP_DS,
    DS_ADD_RTN_U64 = 96 + (u32)OpcodeMap::OP_MAP_DS,
    DS_SUB_RTN_U64 = 97 + (u32)OpcodeMap::OP_MAP_DS,
    DS_RSUB_RTN_U64 = 98 + (u32)OpcodeMap::OP_MAP_DS,
    DS_INC_RTN_U64 = 99 + (u32)OpcodeMap::OP_MAP_DS,
    DS_DEC_RTN_U64 = 100 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_RTN_I64 = 101 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_RTN_I64 = 102 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_RTN_U64 = 103 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_RTN_U64 = 104 + (u32)OpcodeMap::OP_MAP_DS,
    DS_AND_RTN_B64 = 105 + (u32)OpcodeMap::OP_MAP_DS,
    DS_OR_RTN_B64 = 106 + (u32)OpcodeMap::OP_MAP_DS,
    DS_XOR_RTN_B64 = 107 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MSKOR_RTN_B64 = 108 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRXCHG_RTN_B64 = 109 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRXCHG2_RTN_B64 = 110 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRXCHG2ST64_RTN_B64 = 111 + (u32)OpcodeMap::OP_MAP_DS,
    DS_CMPST_RTN_B64 = 112 + (u32)OpcodeMap::OP_MAP_DS,
    DS_CMPST_RTN_F64 = 113 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_RTN_F64 = 114 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_RTN_F64 = 115 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ_B64 = 118 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ2_B64 = 119 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ2ST64_B64 = 120 + (u32)OpcodeMap::OP_MAP_DS,
    DS_CONDXCHG32_RTN_B64 = 126 + (u32)OpcodeMap::OP_MAP_DS,
    DS_ADD_SRC2_U32 = 128 + (u32)OpcodeMap::OP_MAP_DS,
    DS_SUB_SRC2_U32 = 129 + (u32)OpcodeMap::OP_MAP_DS,
    DS_RSUB_SRC2_U32 = 130 + (u32)OpcodeMap::OP_MAP_DS,
    DS_INC_SRC2_U32 = 131 + (u32)OpcodeMap::OP_MAP_DS,
    DS_DEC_SRC2_U32 = 132 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_SRC2_I32 = 133 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_SRC2_I32 = 134 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_SRC2_U32 = 135 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_SRC2_U32 = 136 + (u32)OpcodeMap::OP_MAP_DS,
    DS_AND_SRC2_B32 = 137 + (u32)OpcodeMap::OP_MAP_DS,
    DS_OR_SRC2_B32 = 138 + (u32)OpcodeMap::OP_MAP_DS,
    DS_XOR_SRC2_B32 = 139 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE_SRC2_B32 = 141 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_SRC2_F32 = 146 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_SRC2_F32 = 147 + (u32)OpcodeMap::OP_MAP_DS,
    DS_ADD_SRC2_U64 = 192 + (u32)OpcodeMap::OP_MAP_DS,
    DS_SUB_SRC2_U64 = 193 + (u32)OpcodeMap::OP_MAP_DS,
    DS_RSUB_SRC2_U64 = 194 + (u32)OpcodeMap::OP_MAP_DS,
    DS_INC_SRC2_U64 = 195 + (u32)OpcodeMap::OP_MAP_DS,
    DS_DEC_SRC2_U64 = 196 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_SRC2_I64 = 197 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_SRC2_I64 = 198 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_SRC2_U64 = 199 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_SRC2_U64 = 200 + (u32)OpcodeMap::OP_MAP_DS,
    DS_AND_SRC2_B64 = 201 + (u32)OpcodeMap::OP_MAP_DS,
    DS_OR_SRC2_B64 = 202 + (u32)OpcodeMap::OP_MAP_DS,
    DS_XOR_SRC2_B64 = 203 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE_SRC2_B64 = 205 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MIN_SRC2_F64 = 210 + (u32)OpcodeMap::OP_MAP_DS,
    DS_MAX_SRC2_F64 = 211 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE_B96 = 222 + (u32)OpcodeMap::OP_MAP_DS,
    DS_WRITE_B128 = 223 + (u32)OpcodeMap::OP_MAP_DS,
    DS_CONDXCHG32_RTN_B128 = 253 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ_B96 = 254 + (u32)OpcodeMap::OP_MAP_DS,
    DS_READ_B128 = 255 + (u32)OpcodeMap::OP_MAP_DS,
    // MUBUF
    BUFFER_LOAD_FORMAT_X = 0 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_LOAD_FORMAT_XY = 1 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_LOAD_FORMAT_XYZ = 2 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_LOAD_FORMAT_XYZW = 3 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_STORE_FORMAT_X = 4 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_STORE_FORMAT_XY = 5 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_STORE_FORMAT_XYZ = 6 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_STORE_FORMAT_XYZW = 7 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_LOAD_UBYTE = 8 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_LOAD_SBYTE = 9 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_LOAD_USHORT = 10 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_LOAD_SSHORT = 11 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_LOAD_DWORD = 12 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_LOAD_DWORDX2 = 13 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_LOAD_DWORDX4 = 14 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_LOAD_DWORDX3 = 15 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_STORE_BYTE = 24 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_STORE_SHORT = 26 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_STORE_DWORD = 28 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_STORE_DWORDX2 = 29 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_STORE_DWORDX4 = 30 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_STORE_DWORDX3 = 31 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_SWAP = 48 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_CMPSWAP = 49 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_ADD = 50 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_SUB = 51 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_SMIN = 53 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_UMIN = 54 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_SMAX = 55 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_UMAX = 56 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_AND = 57 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_OR = 58 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_XOR = 59 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_INC = 60 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_DEC = 61 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_FCMPSWAP = 62 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_FMIN = 63 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_FMAX = 64 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_SWAP_X2 = 80 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_CMPSWAP_X2 = 81 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_ADD_X2 = 82 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_SUB_X2 = 83 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_SMIN_X2 = 85 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_UMIN_X2 = 86 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_SMAX_X2 = 87 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_UMAX_X2 = 88 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_AND_X2 = 89 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_OR_X2 = 90 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_XOR_X2 = 91 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_INC_X2 = 92 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_DEC_X2 = 93 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_FCMPSWAP_X2 = 94 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_FMIN_X2 = 95 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_ATOMIC_FMAX_X2 = 96 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_WBINVL1_SC = 112 + (u32)OpcodeMap::OP_MAP_MUBUF,
    BUFFER_WBINVL1 = 113 + (u32)OpcodeMap::OP_MAP_MUBUF,
    // MTBUF
    TBUFFER_LOAD_FORMAT_X = 0 + (u32)OpcodeMap::OP_MAP_MTBUF,
    TBUFFER_LOAD_FORMAT_XY = 1 + (u32)OpcodeMap::OP_MAP_MTBUF,
    TBUFFER_LOAD_FORMAT_XYZ = 2 + (u32)OpcodeMap::OP_MAP_MTBUF,
    TBUFFER_LOAD_FORMAT_XYZW = 3 + (u32)OpcodeMap::OP_MAP_MTBUF,
    TBUFFER_STORE_FORMAT_X = 4 + (u32)OpcodeMap::OP_MAP_MTBUF,
    TBUFFER_STORE_FORMAT_XY = 5 + (u32)OpcodeMap::OP_MAP_MTBUF,
    TBUFFER_STORE_FORMAT_XYZ = 6 + (u32)OpcodeMap::OP_MAP_MTBUF,
    TBUFFER_STORE_FORMAT_XYZW = 7 + (u32)OpcodeMap::OP_MAP_MTBUF,
    // MIMG
    IMAGE_LOAD = 0 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_LOAD_MIP = 1 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_LOAD_PCK = 2 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_LOAD_PCK_SGN = 3 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_LOAD_MIP_PCK = 4 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_LOAD_MIP_PCK_SGN = 5 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_STORE = 8 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_STORE_MIP = 9 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_STORE_PCK = 10 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_STORE_MIP_PCK = 11 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GET_RESINFO = 14 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_SWAP = 15 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_CMPSWAP = 16 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_ADD = 17 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_SUB = 18 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_SMIN = 20 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_UMIN = 21 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_SMAX = 22 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_UMAX = 23 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_AND = 24 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_OR = 25 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_XOR = 26 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_INC = 27 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_DEC = 28 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_FCMPSWAP = 29 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_FMIN = 30 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_ATOMIC_FMAX = 31 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE = 32 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_CL = 33 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_D = 34 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_D_CL = 35 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_L = 36 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_B = 37 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_B_CL = 38 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_LZ = 39 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C = 40 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_CL = 41 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_D = 42 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_D_CL = 43 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_L = 44 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_B = 45 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_B_CL = 46 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_LZ = 47 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_O = 48 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_CL_O = 49 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_D_O = 50 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_D_CL_O = 51 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_L_O = 52 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_B_O = 53 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_B_CL_O = 54 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_LZ_O = 55 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_O = 56 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_CL_O = 57 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_D_O = 58 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_D_CL_O = 59 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_L_O = 60 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_B_O = 61 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_B_CL_O = 62 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_LZ_O = 63 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4 = 64 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_CL = 65 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_L = 68 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_B = 69 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_B_CL = 70 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_LZ = 71 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C = 72 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C_CL = 73 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C_L = 76 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C_B = 77 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C_B_CL = 78 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C_LZ = 79 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_O = 80 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_CL_O = 81 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_L_O = 84 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_B_O = 85 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_B_CL_O = 86 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_LZ_O = 87 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C_O = 88 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C_CL_O = 89 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C_L_O = 92 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C_B_O = 93 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C_B_CL_O = 94 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GATHER4_C_LZ_O = 95 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_GET_LOD = 96 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_CD = 104 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_CD_CL = 105 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_CD = 106 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_CD_CL = 107 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_CD_O = 108 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_CD_CL_O = 109 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_CD_O = 110 + (u32)OpcodeMap::OP_MAP_MIMG,
    IMAGE_SAMPLE_C_CD_CL_O = 111 + (u32)OpcodeMap::OP_MAP_MIMG,
    // EXP
    EXP = 0 + (u32)OpcodeMap::OP_MAP_EXP,
};

enum class EncodingMask : u32 {
    MASK_9bit = 0x000001FFULL << 23,
    MASK_7bit = 0x0000007FULL << 25,
    MASK_6bit = 0x0000003FULL << 26,
    MASK_5bit = 0x0000001FULL << 27,
    MASK_4bit = 0x0000000FULL << 28,
    MASK_2bit = 0x00000003ULL << 30,
    MASK_1bit = 0x00000001ULL << 31
};

enum class InstEncoding : u32 {
    /// InstructionEncodingMask_9bit
    /// bits [31:23] - (1 0 1 1 1 1 1 0 1)
    SOP1 = 0x0000017Du << 23,
    /// bits [31:23] - (1 0 1 1 1 1 1 1 1)
    SOPP = 0x0000017Fu << 23,
    /// bits [31:23] - (1 0 1 1 1 1 1 1 0)
    SOPC = 0x0000017Eu << 23,
    /// InstructionEncodingMask_7bit
    /// bits [31:25] - (0 1 1 1 1 1 1)
    VOP1 = 0x0000003Fu << 25,
    /// bits [31:25] - (0 1 1 1 1 1 0)
    VOPC = 0x0000003Eu << 25,
    /// InstructionEncodingMask_6bit
    /// bits [31:26] - (1 1 0 1 0 0)
    VOP3 = 0x00000034u << 26,
    /// bits [31:26] - (1 1 1 1 1 0)
    EXP = 0x0000003Eu << 26,
    /// bits [31:26] - (1 1 0 0 1 0)
    VINTRP = 0x00000032u << 26,
    /// bits [31:26] - (1 1 0 1 1 0)
    DS = 0x00000036u << 26,
    /// bits [31:26] - (1 1 1 0 0 0)
    MUBUF = 0x00000038u << 26,
    /// bits [31:26] - (1 1 1 0 1 0)
    MTBUF = 0x0000003Au << 26,
    /// bits [31:26] - (1 1 1 1 0 0)
    MIMG = 0x0000003Cu << 26,
    /// InstructionEncodingMask_5bit
    /// bits [31:27] - (1 1 0 0 0)
    SMRD = 0x00000018u << 27,
    /// InstructionEncodingMask_4bit
    /// bits [31:28] - (1 0 1 1)
    SOPK = 0x0000000Bu << 28,
    /// InstructionEncodingMask_2bit
    /// bits [31:30] - (1 0)
    SOP2 = 0x00000002u << 30,
    /// InstructionEncodingMask_1bit
    /// bits [31:31] - (0)
    VOP2 = 0x00000000u << 31,

    ILLEGAL
};

enum class InstClass : u32 {
    Undefined,

    ScalarArith,
    ScalarAbs,
    ScalarMov,
    ScalarMovRel,
    ScalarCmp,
    ScalarSelect,
    ScalarBitLogic,
    ScalarBitManip,
    ScalarBitField,
    ScalarConv,
    ScalarExecMask,
    ScalarQuadMask,

    VectorRegMov,
    VectorMovRel,
    VectorLane,
    VectorBitLogic,
    VectorBitField32,
    VectorThreadMask,
    VectorBitField64,
    VectorFpArith32,
    VectorFpRound32,
    VectorFpField32,
    VectorFpTran32,
    VectorFpCmp32,
    VectorFpArith64,
    VectorFpRound64,
    VectorFpField64,
    VectorFpTran64,
    VectorFpCmp64,
    VectorIntArith32,
    VectorIntArith64,
    VectorIntCmp32,
    VectorIntCmp64,
    VectorConv,
    VectorFpGraph32,
    VectorIntGraph,
    VectorMisc,

    ScalarProgFlow,
    ScalarSync,
    ScalarWait,
    ScalarCache,
    ScalarPrior,
    ScalarRegAccess,
    ScalarMsg,

    ScalarMemRd,
    ScalarMemUt,

    VectorMemBufNoFmt,
    VectorMemBufFmt,
    VectorMemBufAtomic,
    VectorMemImgNoSmp,
    VectorMemImgSmp,
    VectorMemImgUt,
    VectorMemL1Cache,

    DsIdxRd,
    DsIdxWr,
    DsIdxWrXchg,
    DsIdxCondXchg,
    DsIdxWrap,
    DsAtomicArith32,
    DsAtomicArith64,
    DsAtomicMinMax32,
    DsAtomicMinMax64,
    DsAtomicCmpSt32,
    DsAtomicCmpSt64,
    DsAtomicLogic32,
    DsAtomicLogic64,
    DsAppendCon,
    DsDataShareUt,
    DsDataShareMisc,
    GdsSync,
    GdsOrdCnt,

    VectorInterpFpCache,

    Exp,

    DbgProf
};

enum class InstCategory : u32 {
    Undefined,
    /// Scalar ALU Operation
    ScalarALU,
    /// Scalar Instruction Memory
    ScalarMemory,
    /// Vector ALU Operation
    VectorALU,
    /// Vector Instruction Memory Read
    VectorMemory,
    /// Scalar Program Flow Control and Special Operations
    FlowControl,
    /// LDS and GDS
    DataShare,
    /// Vector Interpolation Operations
    VectorInterpolation,
    /// Export
    Export,
    /// Debug and Profiling Operations
    DebugProfile,
};

enum class ScalarType : u32 {
    Undefined,
    Any,
    Uint32,
    Uint64,
    Sint32,
    Sint64,
    Float16,
    Float32,
    Float64,
    Bool,
};

/// Instruction's action when GPU thread is not active.
enum class DivergentAction : u32 { Nop, ZeroScalar, Execute };

enum class OperandField : u32 {
    ScalarGPR = 0,
    VccLo = 106,
    VccHi,
    M0 = 124,
    ExecLo = 126,
    ExecHi,
    ConstZero,
    SignedConstIntPos = 129,
    SignedConstIntNeg = 193,
    ConstFloatPos_0_5 = 240,
    ConstFloatNeg_0_5,
    ConstFloatPos_1_0,
    ConstFloatNeg_1_0,
    ConstFloatPos_2_0,
    ConstFloatNeg_2_0,
    ConstFloatPos_4_0,
    ConstFloatNeg_4_0,
    VccZ = 251,
    ExecZ = 252,
    Scc = 253,
    LdsDirect = 254,
    LiteralConst = 255,
    VectorGPR,

    Undefined = 0xFFFFFFFF,
};

enum class SystemValue : u32 {
    None = 0,
    Position = 1,
    ClipDistance = 2,
    CullDistance = 3,
    RenderTargetId = 4,
    ViewportId = 5,
    VertexId = 6,
    PrimitiveId = 7,
    InstanceId = 8,
    IsFrontFace = 9,
    SampleIndex = 10,
    FinalQuadUeq0EdgeTessFactor = 11,
    FinalQuadVeq0EdgeTessFactor = 12,
    FinalQuadUeq1EdgeTessFactor = 13,
    FinalQuadVeq1EdgeTessFactor = 14,
    FinalQuadUInsideTessFactor = 15,
    FinalQuadVInsideTessFactor = 16,
    FinalTriUeq0EdgeTessFactor = 17,
    FinalTriVeq0EdgeTessFactor = 18,
    FinalTriWeq0EdgeTessFactor = 19,
    FinalTriInsideTessFactor = 20,
    FinalLineDetailTessFactor = 21,
    FinalLineDensityTessFactor = 22,
    GlobalInvocationId = 23,
    WorkgroupId = 24,
    LocalInvocationId = 25,
    LocalInvocationIndex = 26,
    Target = 64,
    Depth = 65,
    Coverage = 66,
    DepthGe = 67,
    DepthLe = 68,
    NumSubgroups = 70,
    SubgroupID = 71,
    SubgroupSize = 72,
    SubgroupInvocationID = 73,
    SubgroupEqMask = 74,
    SubgroupGeMask = 75,
    SubgroupGtMask = 76,
    SubgroupLeMask = 77,
    SubgroupLtMask = 78,
};

enum class InterpolationMode : u32 {
    Undefined = 0,
    Constant = 1,
    Linear = 2,
    LinearCentroid = 3,
    LinearNoPerspective = 4,
    LinearNoPerspectiveCentroid = 5,
    LinearSample = 6,
    LinearNoPerspectiveSample = 7,
};

enum class MimgModifier : u32 {
    Lod,              /// LOD is used instead of TA computed LOD.
    LodBias,          /// Add this BIAS to the LOD TA computes.
    LodClamp,         /// Clamp the LOD to be no larger than this value.
    Derivative,       /// Send dx/dv, dx/dy, etc. slopes to TA for it to used in LOD computation.
    CoarseDerivative, /// Send dx/dv, dx/dy, etc. slopes to TA for it to used in LOD computation.
    Level0,           /// Force use of MIP level 0.
    Pcf,              /// Percentage closer filtering.
    Offset            /// Send X, Y, Z integer offsets (packed into 1 Dword) to offset XYZ address.
};
using MimgModifierFlags = Common::Flags<MimgModifier>;

enum class ImageResComponent : u32 { Width, Height, Depth, MipCount };
using ImageResFlags = Common::Flags<ImageResComponent>;

enum class ImageAddrComponent : u32 {
    Offsets,
    Bias,
    Zpcf,
    DxDh,
    DyDh,
    DzDh,
    DxDv,
    DyDv,
    DzDv,
    X,
    Y,
    Z,
    Slice,
    FaceId,
    FragId,
    Lod,
    Clamp,
};

struct SendMsgSimm {
    enum class Message : u32 {
        Interrupt = 1,
        Gs = 2,
        GsDone = 3,
        System = 15,
    };

    enum class GsOp : u32 {
        Nop = 0,
        Cut = 1,
        Emit = 2,
        EmitCut = 3,
    };

    Message msg : 4;
    GsOp op : 2;
};

} // namespace Shader::Gcn
