[llvm] [RISCV] Use DecoderMethod and a template function to reduce the amount of boilerplate for decodings a register class. NFC (PR #177296)
Alexander Richardson via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 21 18:50:10 PST 2026
================
@@ -78,44 +78,23 @@ LLVMInitializeRISCVDisassembler() {
createRISCVDisassembler);
}
-static DecodeStatus DecodeGPRRegisterClass(MCInst &Inst, uint32_t RegNo,
- uint64_t Address,
- const MCDisassembler *Decoder) {
- bool IsRVE = Decoder->getSubtargetInfo().hasFeature(RISCV::FeatureStdExtE);
-
- if (RegNo >= 32 || (IsRVE && RegNo >= 16))
- return MCDisassembler::Fail;
-
- MCRegister Reg = RISCV::X0 + RegNo;
- Inst.addOperand(MCOperand::createReg(Reg));
- return MCDisassembler::Success;
-}
-
-static DecodeStatus DecodeGPRF16RegisterClass(MCInst &Inst, uint32_t RegNo,
+template <unsigned FirstReg, unsigned NumRegsInClass, bool CheckRVE = false>
+static DecodeStatus DecodeSimpleRegisterClass(MCInst &Inst, uint32_t RegNo,
uint64_t Address,
const MCDisassembler *Decoder) {
- bool IsRVE = Decoder->getSubtargetInfo().hasFeature(RISCV::FeatureStdExtE);
+ bool IsRVE =
+ CheckRVE && Decoder->getSubtargetInfo().hasFeature(RISCV::FeatureStdExtE);
- if (RegNo >= 32 || (IsRVE && RegNo >= 16))
+ if (RegNo >= NumRegsInClass || (IsRVE && RegNo >= 16))
return MCDisassembler::Fail;
- MCRegister Reg = RISCV::X0_H + RegNo;
+ MCRegister Reg = FirstReg + RegNo;
Inst.addOperand(MCOperand::createReg(Reg));
return MCDisassembler::Success;
}
-static DecodeStatus DecodeGPRF32RegisterClass(MCInst &Inst, uint32_t RegNo,
- uint64_t Address,
- const MCDisassembler *Decoder) {
- bool IsRVE = Decoder->getSubtargetInfo().hasFeature(RISCV::FeatureStdExtE);
-
- if (RegNo >= 32 || (IsRVE && RegNo >= 16))
- return MCDisassembler::Fail;
-
- MCRegister Reg = RISCV::X0_W + RegNo;
- Inst.addOperand(MCOperand::createReg(Reg));
- return MCDisassembler::Success;
-}
+constexpr auto DecodeGPRRegisterClass =
----------------
arichardson wrote:
The reason this was not just done in tablegen is that it's called elsewhere as well, right?
https://github.com/llvm/llvm-project/pull/177296
More information about the llvm-commits
mailing list