diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -357,6 +357,11 @@ RISCVMCRegisterClasses[RISCV::GPRRegClassID].contains(Reg.RegNum); } + bool isVR() const { + return Kind == KindTy::Register && + RISCVMCRegisterClasses[RISCV::VRRegClassID].contains(Reg.RegNum); + } + static bool evaluateConstantImm(const MCExpr *Expr, int64_t &Imm, RISCVMCExpr::VariantKind &VK) { if (auto *RE = dyn_cast(Expr)) { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td @@ -34,7 +34,7 @@ def VRegAsmOperand : AsmOperandClass { let Name = "RVVRegOpOperand"; let RenderMethod = "addRegOperands"; - let PredicateMethod = "isReg"; + let PredicateMethod = "isVR"; let ParserMethod = "parseRegister"; } diff --git a/llvm/test/MC/RISCV/rvv/invalid.s b/llvm/test/MC/RISCV/rvv/invalid.s --- a/llvm/test/MC/RISCV/rvv/invalid.s +++ b/llvm/test/MC/RISCV/rvv/invalid.s @@ -37,6 +37,9 @@ vadd.vv v1, v3, v2, v0 # CHECK-ERROR: expected '.t' suffix +vadd.vv v1, v3, a0 +# CHECK-ERROR: invalid operand for instruction + vmslt.vi v1, v2, -16 # CHECK-ERROR: immediate must be in the range [-15, 16]