diff --git a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp index 6a2beeed41dfd..8651ddc89dce2 100644 --- a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp +++ b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp @@ -146,17 +146,22 @@ static DecodeStatus decodeDpp8FI(MCInst &Inst, unsigned Val, uint64_t Addr, return addOperand(Inst, DAsm->DecoderName(Imm)); \ } -// Decoder for registers, decode directly using RegClassID. Imm(8-bit) is -// number of register. Used by VGPR only and AGPR only operands. +// Decoder for registers, decode directly using RegClassID. Imm(8-bit) is number +// of register. Used by VGPR only and AGPR only operands. +template +static DecodeStatus decodeRegisterClassImpl(MCInst &Inst, unsigned Imm, + uint64_t /*Addr*/, + const MCDisassembler *Decoder) { + assert(Imm < (1 << 8) && "8-bit encoding"); + auto DAsm = static_cast(Decoder); + return addOperand(Inst, DAsm->createRegOperand(RegClassID, Imm)); +} + +using RegClassDecoder = decltype(&decodeRegisterClassImpl<0>); + #define DECODE_OPERAND_REG_8(RegClass) \ - static DecodeStatus Decode##RegClass##RegisterClass( \ - MCInst &Inst, unsigned Imm, uint64_t /*Addr*/, \ - const MCDisassembler *Decoder) { \ - assert(Imm < (1 << 8) && "8-bit encoding"); \ - auto DAsm = static_cast(Decoder); \ - return addOperand( \ - Inst, DAsm->createRegOperand(AMDGPU::RegClass##RegClassID, Imm)); \ - } + static const constexpr RegClassDecoder Decode##RegClass##RegisterClass = \ + decodeRegisterClassImpl; #define DECODE_SrcOp(Name, EncSize, OpWidth, EncImm) \ static DecodeStatus Name(MCInst &Inst, unsigned Imm, uint64_t /*Addr*/, \