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

#include "common/assert.h"
#include "shader_recompiler/frontend/decode.h"

namespace Shader::Gcn {

constexpr std::array<InstFormat, 45> InstructionFormatSOP2 = {{
    // 0 = S_ADD_U32
    {InstClass::ScalarArith, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 1 = S_SUB_U32
    {InstClass::ScalarArith, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 2 = S_ADD_I32
    {InstClass::ScalarArith, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 3 = S_SUB_I32
    {InstClass::ScalarArith, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 4 = S_ADDC_U32
    {InstClass::ScalarArith, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 5 = S_SUBB_U32
    {InstClass::ScalarArith, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 6 = S_MIN_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 7 = S_MIN_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 8 = S_MAX_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 9 = S_MAX_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 10 = S_CSELECT_B32
    {InstClass::ScalarSelect, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 11 = S_CSELECT_B64
    {InstClass::ScalarSelect, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    {},
    {},
    // 14 = S_AND_B32
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 15 = S_AND_B64
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 16 = S_OR_B32
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 17 = S_OR_B64
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 18 = S_XOR_B32
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 19 = S_XOR_B64
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 20 = S_ANDN2_B32
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 21 = S_ANDN2_B64
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 22 = S_ORN2_B32
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 23 = S_ORN2_B64
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 24 = S_NAND_B32
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 25 = S_NAND_B64
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 26 = S_NOR_B32
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 27 = S_NOR_B64
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 28 = S_XNOR_B32
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 29 = S_XNOR_B64
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 30 = S_LSHL_B32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 31 = S_LSHL_B64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 32 = S_LSHR_B32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 33 = S_LSHR_B64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 34 = S_ASHR_I32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 35 = S_ASHR_I64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 2, 1, ScalarType::Sint64,
     ScalarType::Sint64},
    // 36 = S_BFM_B32
    {InstClass::ScalarBitField, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 37 = S_BFM_B64
    {InstClass::ScalarBitField, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 38 = S_MUL_I32
    {InstClass::ScalarArith, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 39 = S_BFE_U32
    {InstClass::ScalarBitField, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 40 = S_BFE_I32
    {InstClass::ScalarBitField, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 41 = S_BFE_U64
    {InstClass::ScalarBitField, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 42 = S_BFE_I64
    {InstClass::ScalarBitField, InstCategory::ScalarALU, 2, 1, ScalarType::Sint64,
     ScalarType::Sint64},
    // 43 = S_CBRANCH_G_FORK
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 2, 1, ScalarType::Undefined,
     ScalarType::Undefined},
    // 44 = S_ABSDIFF_I32
    {InstClass::ScalarAbs, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
}};

constexpr std::array<InstFormat, 22> InstructionFormatSOPK = {{
    // 0 = S_MOVK_I32
    {InstClass::ScalarMov, InstCategory::ScalarALU, 0, 1, ScalarType::Sint32, ScalarType::Sint32},
    {},
    // 2 = S_CMOVK_I32
    {InstClass::ScalarMov, InstCategory::ScalarALU, 0, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 3 = S_CMPK_EQ_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 4 = S_CMPK_LI32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 5 = S_CMPK_GT_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 6 = S_CMPK_GE_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 7 = S_CMPK_LT_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 8 = S_CMPK_LE_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 9 = S_CMPK_EQ_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 10 = S_CMPK_LG_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 11 = S_CMPK_GT_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 12 = S_CMPK_GE_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 13 = S_CMPK_LT_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 14 = S_CMPK_LE_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 0, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 15 = S_ADDK_I32
    {InstClass::ScalarArith, InstCategory::ScalarALU, 0, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 16 = S_MULK_I32
    {InstClass::ScalarArith, InstCategory::ScalarALU, 0, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 17 = S_CBRANCH_I_FORK
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Undefined,
     ScalarType::Undefined},
    // 18 = S_GETREG_B32
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 19 = S_SETREG_B32
    {InstClass::ScalarRegAccess, InstCategory::FlowControl, 0, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    {},
    // 21 = S_SETREIMM32_B32
    {InstClass::ScalarRegAccess, InstCategory::FlowControl, 0, 1, ScalarType::Uint32,
     ScalarType::Uint32},
}};

constexpr std::array<InstFormat, 54> InstructionFormatSOP1 = {{
    {},
    {},
    {},
    // 3 = S_MOV_B32
    {InstClass::ScalarMov, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 4 = S_MOV_B64
    {InstClass::ScalarMov, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64, ScalarType::Uint64},
    // 5 = S_CMOV_B32
    {InstClass::ScalarMov, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 6 = S_CMOV_B64
    {InstClass::ScalarMov, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64, ScalarType::Uint64},
    // 7 = S_NOT_B32
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 8 = S_NOT_B64
    {InstClass::ScalarBitLogic, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 9 = S_WQM_B32
    {InstClass::ScalarQuadMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 10 = S_WQM_B64
    {InstClass::ScalarQuadMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 11 = S_BREV_B32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 12 = S_BREV_B64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 13 = S_BCNT0_I32_B32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Sint32},
    // 14 = S_BCNT0_I32_B64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Sint32},
    // 15 = S_BCNT1_I32_B32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Sint32},
    // 16 = S_BCNT1_I32_B64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Sint32},
    // 17 = S_FF0_I32_B32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Sint32},
    // 18 = S_FF0_I32_B64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Sint32},
    // 19 = S_FF1_I32_B32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Sint32},
    // 20 = S_FF1_I32_B64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Sint32},
    // 21 = S_FLBIT_I32_B32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Sint32},
    // 22 = S_FLBIT_I32_B64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Sint32},
    // 23 = S_FLBIT_I32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 24 = S_FLBIT_I32_I64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Sint64,
     ScalarType::Sint32},
    // 25 = S_SEXT_I32_I8
    {InstClass::ScalarConv, InstCategory::ScalarALU, 1, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 26 = S_SEXT_I32_I16
    {InstClass::ScalarConv, InstCategory::ScalarALU, 1, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 27 = S_BITSET0_B32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 28 = S_BITSET0_B64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 29 = S_BITSET1_B32
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 30 = S_BITSET1_B64
    {InstClass::ScalarBitManip, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 31 = S_GETPC_B64
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 32 = S_SETPC_B64
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 33 = S_SWAPPC_B64
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 34 = S_RFE_B64
    {InstClass::Undefined, InstCategory::Undefined, 1, 1, ScalarType::Uint64, ScalarType::Uint64},
    {},
    // 36 = S_AND_SAVEEXEC_B64
    {InstClass::ScalarExecMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 37 = S_OR_SAVEEXEC_B64
    {InstClass::ScalarExecMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 38 = S_XOR_SAVEEXEC_B64
    {InstClass::ScalarExecMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 39 = S_ANDN2_SAVEEXEC_B64
    {InstClass::ScalarExecMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 40 = S_ORN2_SAVEEXEC_B64
    {InstClass::ScalarExecMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 41 = S_NAND_SAVEEXEC_B64
    {InstClass::ScalarExecMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 42 = S_NOR_SAVEEXEC_B64
    {InstClass::ScalarExecMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 43 = S_XNOR_SAVEEXEC_B64
    {InstClass::ScalarExecMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 44 = S_QUADMASK_B32
    {InstClass::ScalarQuadMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 45 = S_QUADMASK_B64
    {InstClass::ScalarQuadMask, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 46 = S_MOVRELS_B32
    {InstClass::ScalarMovRel, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 47 = S_MOVRELS_B64
    {InstClass::ScalarMovRel, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 48 = S_MOVRELD_B32
    {InstClass::ScalarMovRel, InstCategory::ScalarALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 49 = S_MOVRELD_B64
    {InstClass::ScalarMovRel, InstCategory::ScalarALU, 1, 1, ScalarType::Uint64,
     ScalarType::Uint64},
    // 50 = S_CBRANCH_JOIN
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 1, 1, ScalarType::Undefined,
     ScalarType::Undefined},
    {},
    // 52 = S_ABS_I32
    {InstClass::ScalarAbs, InstCategory::ScalarALU, 1, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 53 = S_MOV_FED_B32
    {InstClass::Undefined, InstCategory::Undefined, 1, 1, ScalarType::Uint32, ScalarType::Uint32},
}};

constexpr std::array<InstFormat, 17> InstructionFormatSOPC = {{
    // 0 = S_CMP_EQ_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 1 = S_CMP_LI32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 2 = S_CMP_GT_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 3 = S_CMP_GE_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 4 = S_CMP_LT_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 5 = S_CMP_LE_I32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 6 = S_CMP_EQ_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 7 = S_CMP_LG_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 8 = S_CMP_GT_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 9 = S_CMP_GE_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 10 = S_CMP_LT_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 11 = S_CMP_LE_U32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 12 = S_BITCMP0_B32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 13 = S_BITCMP1_B32
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 14 = S_BITCMP0_B64
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64, ScalarType::Uint64},
    // 15 = S_BITCMP1_B64
    {InstClass::ScalarCmp, InstCategory::ScalarALU, 2, 1, ScalarType::Uint64, ScalarType::Uint64},
    // 16 = S_SETVSKIP
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 2, 1, ScalarType::Undefined,
     ScalarType::Undefined},
}};

constexpr std::array<InstFormat, 27> InstructionFormatSOPP = {{
    // 0 = S_NOP
    {InstClass::ScalarWait, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 1 = S_ENDPGM
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 2 = S_BRANCH
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    {},
    // 4 = S_CBRANCH_SCC0
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 5 = S_CBRANCH_SCC1
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 6 = S_CBRANCH_VCCZ
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 7 = S_CBRANCH_VCCNZ
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 8 = S_CBRANCH_EXECZ
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 9 = S_CBRANCH_EXECNZ
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 10 = S_BARRIER
    {InstClass::ScalarSync, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    {},
    // 12 = S_WAITCNT
    {InstClass::ScalarSync, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 13 = S_SETHALT
    {InstClass::Undefined, InstCategory::Undefined, 0, 1, ScalarType::Any, ScalarType::Any},
    // 14 = S_SLEEP
    {InstClass::ScalarSync, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 15 = S_SETPRIO
    {InstClass::ScalarSync, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 16 = S_SENDMSG
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 17 = S_SENDMSGHALT
    {InstClass::ScalarProgFlow, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 18 = S_TRAP
    {InstClass::Undefined, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 19 = S_ICACHE_INV
    {InstClass::ScalarCache, InstCategory::FlowControl, 0, 1, ScalarType::Any, ScalarType::Any},
    // 20 = S_INCPERFLEVEL
    {InstClass::DbgProf, InstCategory::DebugProfile, 0, 1, ScalarType::Any, ScalarType::Any},
    // 21 = S_DECPERFLEVEL
    {InstClass::DbgProf, InstCategory::DebugProfile, 0, 1, ScalarType::Any, ScalarType::Any},
    // 22 = S_TTRACEDATA
    {InstClass::DbgProf, InstCategory::DebugProfile, 0, 1, ScalarType::Any, ScalarType::Any},
    // 23 = S_CBRANCH_CDBGSYS
    {InstClass::Undefined, InstCategory::Undefined, 0, 1, ScalarType::Any, ScalarType::Any},
    // 24 = S_CBRANCH_CDBGUSER
    {InstClass::Undefined, InstCategory::Undefined, 0, 1, ScalarType::Any, ScalarType::Any},
    // 25 = S_CBRANCH_CDBGSYS_OR_USER
    {InstClass::Undefined, InstCategory::Undefined, 0, 1, ScalarType::Any, ScalarType::Any},
    // 26 = S_CBRANCH_CDBGSYS_AND_USER
    {InstClass::Undefined, InstCategory::Undefined, 0, 1, ScalarType::Any, ScalarType::Any},
}};

constexpr std::array<InstFormat, 32> InstructionFormatSMRD = {{
    // 0 = S_LOAD_DWORD
    {InstClass::ScalarMemRd, InstCategory::ScalarMemory, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 1 = S_LOAD_DWORDX2
    {InstClass::ScalarMemRd, InstCategory::ScalarMemory, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 2 = S_LOAD_DWORDX4
    {InstClass::ScalarMemRd, InstCategory::ScalarMemory, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 3 = S_LOAD_DWORDX8
    {InstClass::ScalarMemRd, InstCategory::ScalarMemory, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 4 = S_LOAD_DWORDX16
    {InstClass::ScalarMemRd, InstCategory::ScalarMemory, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    {},
    {},
    {},
    // 8 = S_BUFFER_LOAD_DWORD
    {InstClass::ScalarMemRd, InstCategory::ScalarMemory, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 9 = S_BUFFER_LOAD_DWORDX2
    {InstClass::ScalarMemRd, InstCategory::ScalarMemory, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 10 = S_BUFFER_LOAD_DWORDX4
    {InstClass::ScalarMemRd, InstCategory::ScalarMemory, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 11 = S_BUFFER_LOAD_DWORDX8
    {InstClass::ScalarMemRd, InstCategory::ScalarMemory, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 12 = S_BUFFER_LOAD_DWORDX16
    {InstClass::ScalarMemRd, InstCategory::ScalarMemory, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    // 29 = S_DCACHE_INV_VOL
    {InstClass::ScalarMemUt, InstCategory::ScalarMemory, 1, 1, ScalarType::Undefined,
     ScalarType::Undefined},
    // 30 = S_MEMTIME
    {InstClass::ScalarMemUt, InstCategory::ScalarMemory, 1, 1, ScalarType::Undefined,
     ScalarType::Undefined},
    // 31 = S_DCACHE_INV
    {InstClass::ScalarMemUt, InstCategory::ScalarMemory, 1, 1, ScalarType::Undefined,
     ScalarType::Undefined},
}};

constexpr std::array<InstFormat, 59> InstructionFormatVOP2 = {{
    // 0 = V_CNDMASK_B32
    {InstClass::VectorThreadMask, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 1 = V_READLANE_B32
    {InstClass::VectorLane, InstCategory::VectorALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 2 = V_WRITELANE_B32
    {InstClass::VectorLane, InstCategory::VectorALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 3 = V_ADD_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 4 = V_SUB_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 5 = V_SUBREV_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 6 = V_MAC_LEGACY_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 7 = V_MUL_LEGACY_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 8 = V_MUL_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 9 = V_MUL_I32_I24
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 10 = V_MUL_HI_I32_I24
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 11 = V_MUL_U32_U24
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 12 = V_MUL_HI_U32_U24
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 13 = V_MIN_LEGACY_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 14 = V_MAX_LEGACY_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 15 = V_MIN_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 16 = V_MAX_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 17 = V_MIN_I32
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 18 = V_MAX_I32
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 19 = V_MIN_U32
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 20 = V_MAX_U32
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 21 = V_LSHR_B32
    {InstClass::VectorBitField32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 22 = V_LSHRREV_B32
    {InstClass::VectorBitField32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 23 = V_ASHR_I32
    {InstClass::VectorBitField32, InstCategory::VectorALU, 2, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 24 = V_ASHRREV_I32
    {InstClass::VectorBitField32, InstCategory::VectorALU, 2, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 25 = V_LSHL_B32
    {InstClass::VectorBitField32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 26 = V_LSHLREV_B32
    {InstClass::VectorBitField32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 27 = V_AND_B32
    {InstClass::VectorBitLogic, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 28 = V_OR_B32
    {InstClass::VectorBitLogic, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 29 = V_XOR_B32
    {InstClass::VectorBitLogic, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 30 = V_BFM_B32
    {InstClass::VectorBitField32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 31 = V_MAC_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 32 = V_MADMK_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 33 = V_MADAK_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 34 = V_BCNT_U32_B32
    {InstClass::VectorThreadMask, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 35 = V_MBCNT_LO_U32_B32
    {InstClass::VectorThreadMask, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 36 = V_MBCNT_HI_U32_B32
    {InstClass::VectorThreadMask, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 37 = V_ADD_I32
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 38 = V_SUB_I32
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 39 = V_SUBREV_I32
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 40 = V_ADDC_U32
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 41 = V_SUBB_U32
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 42 = V_SUBBREV_U32
    {InstClass::VectorIntArith32, InstCategory::VectorALU, 2, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 43 = V_LDEXP_F32
    {InstClass::VectorFpField32, InstCategory::VectorALU, 2, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 44 = V_CVT_PKACCUM_U8_F32
    {InstClass::VectorConv, InstCategory::VectorALU, 2, 1, ScalarType::Float32, ScalarType::Uint32},
    // 45 = V_CVT_PKNORM_I16_F32
    {InstClass::VectorConv, InstCategory::VectorALU, 2, 1, ScalarType::Float32, ScalarType::Sint32},
    // 46 = V_CVT_PKNORM_U16_F32
    {InstClass::VectorConv, InstCategory::VectorALU, 2, 1, ScalarType::Float32, ScalarType::Uint32},
    // 47 = V_CVT_PKRTZ_F16_F32
    {InstClass::VectorConv, InstCategory::VectorALU, 2, 1, ScalarType::Float32, ScalarType::Uint32},
    // 48 = V_CVT_PK_U16_U32
    {InstClass::VectorConv, InstCategory::VectorALU, 2, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 49 = V_CVT_PK_I16_I32
    {InstClass::VectorConv, InstCategory::VectorALU, 2, 1, ScalarType::Sint32, ScalarType::Sint32},
    // 50 = V_ADD_F16
    {InstClass::VectorFpArith16, InstCategory::VectorALU, 2, 1, ScalarType::Float16,
     ScalarType::Float16},
    // 51 = V_SUB_F16
    {InstClass::VectorFpArith16, InstCategory::VectorALU, 2, 1, ScalarType::Float16,
     ScalarType::Float16},
    {},
    // 53 = V_MUL_F16
    {InstClass::VectorFpArith16, InstCategory::VectorALU, 2, 1, ScalarType::Float16,
     ScalarType::Float16},
    {},
    {},
    {},
    // 57 = V_MAX_F16
    {InstClass::VectorFpArith16, InstCategory::VectorALU, 2, 1, ScalarType::Float16,
     ScalarType::Float16},
    // 58 = V_MIN_F16
    {InstClass::VectorFpArith16, InstCategory::VectorALU, 2, 1, ScalarType::Float16,
     ScalarType::Float16},
}};

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

constexpr std::array<InstFormat, 35> InstructionFormatVOP3P = {{
    // 0 = V_PK_MAD_I16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 3, 1, ScalarType::Sint16,
     ScalarType::Sint16},
    // 1 = V_PK_MUL_LO_U16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Uint16,
     ScalarType::Uint16},
    // 2 = V_PK_ADD_I16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Sint16,
     ScalarType::Sint16},
    // 3 = V_PK_SUB_I16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Sint16,
     ScalarType::Sint16},
    // 4 = V_PK_LSHLREV_B16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Uint16,
     ScalarType::Uint16},
    // 5 = V_PK_LSHRREV_B16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Uint16,
     ScalarType::Uint16},
    // 6 = V_PK_ASHRREV_I16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Sint16,
     ScalarType::Uint16},
    // 7 = V_PK_MAX_I16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Sint16,
     ScalarType::Sint16},
    // 8 = V_PK_MIN_I16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Sint16,
     ScalarType::Sint16},
    // 9 = V_PK_MAD_U16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 3, 1, ScalarType::Uint16,
     ScalarType::Uint16},
    // 10 = V_PK_ADD_U16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Uint16,
     ScalarType::Uint16},
    // 11 = V_PK_SUB_U16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Uint16,
     ScalarType::Uint16},
    // 12 = V_PK_MAX_U16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Uint16,
     ScalarType::Uint16},
    // 13 = V_PK_MIN_U16
    {InstClass::VectorIntArith16, InstCategory::VectorALU, 2, 1, ScalarType::Uint16,
     ScalarType::Uint16},
    // 14 = V_PK_FMA_F16
    {InstClass::VectorFpArith16, InstCategory::VectorALU, 3, 1, ScalarType::Float16,
     ScalarType::Float16},
    // 15 = V_PK_ADD_F16
    {InstClass::VectorFpArith16, InstCategory::VectorALU, 2, 1, ScalarType::Float16,
     ScalarType::Float16},
    // 16 = V_PK_MUL_F16
    {InstClass::VectorFpArith16, InstCategory::VectorALU, 2, 1, ScalarType::Float16,
     ScalarType::Float16},
    // 17 = V_PK_MIN_F16
    {InstClass::VectorFpArith16, InstCategory::VectorALU, 2, 1, ScalarType::Float16,
     ScalarType::Float16},
    // 18 = V_PK_MAX_F16
    {InstClass::VectorFpArith16, InstCategory::VectorALU, 2, 1, ScalarType::Float16,
     ScalarType::Float16},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    // 32 = V_MAD_MIX_F32
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 3, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 33 = V_MAD_MIXLO_F16
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 3, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 34 = V_MAD_MIXHI_F16
    {InstClass::VectorFpArith32, InstCategory::VectorALU, 3, 1, ScalarType::Float32,
     ScalarType::Float32},
}};

constexpr std::array<InstFormat, 86> InstructionFormatVOP1 = {{
    // 0 = V_NOP
    {InstClass::VectorMisc, InstCategory::VectorALU, 0, 1, ScalarType::Any, ScalarType::Any},
    // 1 = V_MOV_B32
    {InstClass::VectorRegMov, InstCategory::VectorALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 2 = V_READFIRSTLANE_B32
    {InstClass::VectorLane, InstCategory::VectorALU, 1, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 3 = V_CVT_I32_F64
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float64, ScalarType::Sint32},
    // 4 = V_CVT_F64_I32
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Sint32, ScalarType::Float64},
    // 5 = V_CVT_F32_I32
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Sint32, ScalarType::Float32},
    // 6 = V_CVT_F32_U32
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Uint32, ScalarType::Float32},
    // 7 = V_CVT_U32_F32
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float32, ScalarType::Uint32},
    // 8 = V_CVT_I32_F32
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float32, ScalarType::Sint32},
    // 9 = V_MOV_FED_B32
    {InstClass::Undefined, InstCategory::Undefined, 1, 1, ScalarType::Uint32, ScalarType::Uint32},
    // 10 = V_CVT_F16_F32
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float16},
    // 11 = V_CVT_F32_F16
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float16,
     ScalarType::Float32},
    // 12 = V_CVT_RPI_I32_F32
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float32, ScalarType::Sint32},
    // 13 = V_CVT_FLR_I32_F32
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float32, ScalarType::Sint32},
    // 14 = V_CVT_OFF_F32_I4
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Sint32, ScalarType::Float32},
    // 15 = V_CVT_F32_F64
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float32},
    // 16 = V_CVT_F64_F32
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float64},
    // 17 = V_CVT_F32_UBYTE0
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Uint32, ScalarType::Float32},
    // 18 = V_CVT_F32_UBYTE1
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Uint32, ScalarType::Float32},
    // 19 = V_CVT_F32_UBYTE2
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Uint32, ScalarType::Float32},
    // 20 = V_CVT_F32_UBYTE3
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Uint32, ScalarType::Float32},
    // 21 = V_CVT_U32_F64
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float64, ScalarType::Uint32},
    // 22 = V_CVT_F64_U32
    {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Uint32, ScalarType::Float64},
    // 23 = V_TRUNC_F64
    {InstClass::VectorFpRound64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float64},
    // 24 = V_CEIL_F64
    {InstClass::VectorFpRound64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float64},
    // 25 = V_RNDNE_F64
    {InstClass::VectorFpRound64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float64},
    // 26 = V_FLOOR_F64
    {InstClass::VectorFpRound64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float64},
    {},
    {},
    {},
    {},
    {},
    // 32 = V_FRACT_F32
    {InstClass::VectorFpRound32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 33 = V_TRUNC_F32
    {InstClass::VectorFpRound32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 34 = V_CEIL_F32
    {InstClass::VectorFpRound32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 35 = V_RNDNE_F32
    {InstClass::VectorFpRound32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 36 = V_FLOOR_F32
    {InstClass::VectorFpRound32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 37 = V_EXP_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 38 = V_LOG_CLAMP_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 39 = V_LOG_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 40 = V_RCP_CLAMP_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 41 = V_RCP_LEGACY_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 42 = V_RCP_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 43 = V_RCP_IFLAG_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 44 = V_RSQ_CLAMP_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 45 = V_RSQ_LEGACY_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 46 = V_RSQ_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 47 = V_RCP_F64
    {InstClass::VectorFpTran64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float64},
    // 48 = V_RCP_CLAMP_F64
    {InstClass::VectorFpTran64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float64},
    // 49 = V_RSQ_F64
    {InstClass::VectorFpTran64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float64},
    // 50 = V_RSQ_CLAMP_F64
    {InstClass::VectorFpTran64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float64},
    // 51 = V_SQRT_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 52 = V_SQRT_F64
    {InstClass::VectorFpTran64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float64},
    // 53 = V_SIN_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 54 = V_COS_F32
    {InstClass::VectorFpTran32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 55 = V_NOT_B32
    {InstClass::VectorBitLogic, InstCategory::VectorALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 56 = V_BFREV_B32
    {InstClass::VectorBitField32, InstCategory::VectorALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 57 = V_FFBH_U32
    {InstClass::VectorBitField32, InstCategory::VectorALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 58 = V_FFBL_B32
    {InstClass::VectorBitField32, InstCategory::VectorALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 59 = V_FFBH_I32
    {InstClass::VectorBitField32, InstCategory::VectorALU, 1, 1, ScalarType::Sint32,
     ScalarType::Sint32},
    // 60 = V_FREXP_EXP_I32_F64
    {InstClass::VectorFpField64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Sint32},
    // 61 = V_FREXP_MANT_F64
    {InstClass::VectorFpField64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float64},
    // 62 = V_FRACT_F64
    {InstClass::VectorFpRound64, InstCategory::VectorALU, 1, 1, ScalarType::Float64,
     ScalarType::Float64},
    // 63 = V_FREXP_EXP_I32_F32
    {InstClass::VectorFpField32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Sint32},
    // 64 = V_FREXP_MANT_F32
    {InstClass::VectorFpField32, InstCategory::VectorALU, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 65 = V_CLREXCP
    {InstClass::Undefined, InstCategory::Undefined, 0, 1, ScalarType::Undefined,
     ScalarType::Undefined},
    // 66 = V_MOVRELD_B32
    {InstClass::VectorMovRel, InstCategory::VectorALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 67 = V_MOVRELS_B32
    {InstClass::VectorMovRel, InstCategory::VectorALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    // 68 = V_MOVRELSD_B32
    {InstClass::VectorMovRel, InstCategory::VectorALU, 1, 1, ScalarType::Uint32,
     ScalarType::Uint32},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    {},
    // 84 = V_RCP_F16
    {InstClass::VectorFpTran16, InstCategory::VectorALU, 1, 1, ScalarType::Float16,
     ScalarType::Float16},
    // 85 = V_SQRT_F16
    {InstClass::VectorFpTran16, InstCategory::VectorALU, 1, 1, ScalarType::Float16,
     ScalarType::Float16},
}};

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

constexpr std::array<InstFormat, 3> InstructionFormatVINTRP = {{
    // 0 = V_INTERP_P1_F32
    {InstClass::VectorInterpFpCache, InstCategory::VectorInterpolation, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 1 = V_INTERP_P2_F32
    {InstClass::VectorInterpFpCache, InstCategory::VectorInterpolation, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
    // 2 = V_INTERP_MOV_F32
    {InstClass::VectorInterpFpCache, InstCategory::VectorInterpolation, 1, 1, ScalarType::Float32,
     ScalarType::Float32},
}};

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

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

constexpr std::array<InstFormat, 8> InstructionFormatMTBUF = {{
    // 0 = TBUFFER_LOAD_FORMAT_X
    {InstClass::VectorMemBufFmt, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32,
     ScalarType::Float32},
    // 1 = TBUFFER_LOAD_FORMAT_XY
    {InstClass::VectorMemBufFmt, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32,
     ScalarType::Float32},
    // 2 = TBUFFER_LOAD_FORMAT_XYZ
    {InstClass::VectorMemBufFmt, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32,
     ScalarType::Float32},
    // 3 = TBUFFER_LOAD_FORMAT_XYZW
    {InstClass::VectorMemBufFmt, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32,
     ScalarType::Float32},
    // 4 = TBUFFER_STORE_FORMAT_X
    {InstClass::VectorMemBufFmt, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32,
     ScalarType::Float32},
    // 5 = TBUFFER_STORE_FORMAT_XY
    {InstClass::VectorMemBufFmt, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32,
     ScalarType::Float32},
    // 6 = TBUFFER_STORE_FORMAT_XYZ
    {InstClass::VectorMemBufFmt, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32,
     ScalarType::Float32},
    // 7 = TBUFFER_STORE_FORMAT_XYZW
    {InstClass::VectorMemBufFmt, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32,
     ScalarType::Float32},
}};

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

constexpr std::array<InstFormat, 1> InstructionFormatEXP = {{
    {InstClass::Exp, InstCategory::Export, 4, 1, ScalarType::Float32, ScalarType::Any},
}};

InstFormat InstructionFormat(InstEncoding encoding, uint32_t opcode) {
    switch (encoding) {
    case InstEncoding::SOP1:
        return InstructionFormatSOP1[opcode];
    case InstEncoding::SOPP:
        return InstructionFormatSOPP[opcode];
    case InstEncoding::SOPC:
        return InstructionFormatSOPC[opcode];
    case InstEncoding::VOP1:
        return InstructionFormatVOP1[opcode];
    case InstEncoding::VOPC:
        return InstructionFormatVOPC[opcode];
    case InstEncoding::VOP3:
        return InstructionFormatVOP3[opcode];
    case InstEncoding::VOP3P:
        return InstructionFormatVOP3P[opcode];
    case InstEncoding::EXP:
        return InstructionFormatEXP[opcode];
    case InstEncoding::VINTRP:
        return InstructionFormatVINTRP[opcode];
    case InstEncoding::DS:
        return InstructionFormatDS[opcode];
    case InstEncoding::MUBUF:
        return InstructionFormatMUBUF[opcode];
    case InstEncoding::MTBUF:
        return InstructionFormatMTBUF[opcode];
    case InstEncoding::MIMG:
        return InstructionFormatMIMG[opcode];
    case InstEncoding::SMRD:
        return InstructionFormatSMRD[opcode];
    case InstEncoding::SOPK:
        return InstructionFormatSOPK[opcode];
    case InstEncoding::SOP2:
        return InstructionFormatSOP2[opcode];
    case InstEncoding::VOP2:
        return InstructionFormatVOP2[opcode];
    default:
        UNREACHABLE();
    }
    return {};
}

} // namespace Shader::Gcn
