diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 9c6d54e62b16c..d984f39321a6e 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -368,6 +368,12 @@ struct RISCVOperand final : public MCParsedAsmOperand { bool isV0Reg() const { return Kind == KindTy::Register && Reg.RegNum == RISCV::V0; } + bool isAnyReg() const { + return Kind == KindTy::Register && + (RISCVMCRegisterClasses[RISCV::GPRRegClassID].contains(Reg.RegNum) || + RISCVMCRegisterClasses[RISCV::FPR64RegClassID].contains(Reg.RegNum) || + RISCVMCRegisterClasses[RISCV::VRRegClassID].contains(Reg.RegNum)); + } bool isImm() const override { return Kind == KindTy::Immediate; } bool isMem() const override { return false; } bool isSystemRegister() const { return Kind == KindTy::SystemRegister; } diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index ab8a8a4cc9935..85c3082dce64f 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -1090,6 +1090,17 @@ def : InstAlias<"zext.b $rd, $rs", (ANDI GPR:$rd, GPR:$rs, 0xFF), 0>; // .insn directive instructions //===----------------------------------------------------------------------===// +def AnyRegOperand : AsmOperandClass { + let Name = "AnyRegOperand"; + let RenderMethod = "addRegOperands"; + let PredicateMethod = "isAnyReg"; +} + +def AnyReg : Operand { + let OperandType = "OPERAND_REGISTER"; + let ParserMatchClass = AnyRegOperand; +} + // isCodeGenOnly = 1 to hide them from the tablegened assembly parser. let isCodeGenOnly = 1, hasSideEffects = 1, mayLoad = 1, mayStore = 1, hasNoSchedulingInfo = 1 in { diff --git a/llvm/lib/Target/RISCV/RISCVRegisterInfo.td b/llvm/lib/Target/RISCV/RISCVRegisterInfo.td index 7e91441e91f47..d06453c82739e 100644 --- a/llvm/lib/Target/RISCV/RISCVRegisterInfo.td +++ b/llvm/lib/Target/RISCV/RISCVRegisterInfo.td @@ -578,15 +578,3 @@ foreach m = LMULList.m in { // Special registers def FFLAGS : RISCVReg<0, "fflags">; def FRM : RISCVReg<0, "frm">; - -// Any type register. Used for .insn directives when we don't know what the -// register types could be. -// NOTE: The alignment and size are bogus values. The Size needs to be non-zero -// or tablegen will use "untyped" to determine the size which will assert. -let isAllocatable = 0 in -def AnyReg : RegisterClass<"RISCV", [untyped], 32, - (add (sequence "X%u", 0, 31), - (sequence "F%u_D", 0, 31), - (sequence "V%u", 0, 31))> { - let Size = 32; -}