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 @@ -258,6 +258,11 @@ bool isMem() const override { return false; } bool isSystemRegister() const { return Kind == KindTy::SystemRegister; } + bool isGPR() const { + return Kind == KindTy::Register && + RISCVMCRegisterClasses[RISCV::GPRRegClassID].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/RISCVInstrInfoA.td b/llvm/lib/Target/RISCV/RISCVInstrInfoA.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoA.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoA.td @@ -20,7 +20,7 @@ def AtomicMemOpOperand : AsmOperandClass { let Name = "AtomicMemOpOperand"; let RenderMethod = "addRegOperands"; - let PredicateMethod = "isReg"; + let PredicateMethod = "isGPR"; let ParserMethod = "parseAtomicMemOp"; } diff --git a/llvm/test/MC/RISCV/rva-aliases-invalid.s b/llvm/test/MC/RISCV/rva-aliases-invalid.s --- a/llvm/test/MC/RISCV/rva-aliases-invalid.s +++ b/llvm/test/MC/RISCV/rva-aliases-invalid.s @@ -10,6 +10,8 @@ lr.w a1, 1(a0) # CHECK: :[[@LINE]]:10: error: optional integer offset must be 0 lr.w a1, (foo) # CHECK: :[[@LINE]]:11: error: expected register lr.w a1, 0(foo) # CHECK: :[[@LINE]]:12: error: expected register +lr.w a1, (f0) # CHECK: :[[@LINE]]:11: error: invalid operand for instruction +lr.w a1, 0(f0) # CHECK: :[[@LINE]]:12: error: invalid operand for instruction lr.w a1, 0(a0 # CHECK: :[[@LINE]]:17: error: expected ')' lr.w a1, (a0 # CHECK: :[[@LINE]]:17: error: expected ')' @@ -18,6 +20,8 @@ sc.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:14: error: optional integer offset must be 0 sc.w a2, a1, (foo) # CHECK: :[[@LINE]]:15: error: expected register sc.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:16: error: expected register +sc.w a2, a1, (f0) # CHECK: :[[@LINE]]:15: error: invalid operand for instruction +sc.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:16: error: invalid operand for instruction sc.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:21: error: expected ')' sc.w a2, a1, (a0 # CHECK: :[[@LINE]]:21: error: expected ')' @@ -26,6 +30,8 @@ amoswap.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0 amoswap.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register amoswap.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register +amoswap.w a2, a1, (f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction +amoswap.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:21: error: invalid operand for instruction amoswap.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')' amoswap.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')' @@ -34,6 +40,8 @@ amoadd.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0 amoadd.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register amoadd.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register +amoadd.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction +amoadd.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction amoadd.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')' amoadd.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')' @@ -42,6 +50,8 @@ amoxor.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0 amoxor.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register amoxor.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register +amoxor.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction +amoxor.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction amoxor.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')' amoxor.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')' @@ -50,6 +60,8 @@ amoand.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0 amoand.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register amoand.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register +amoand.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction +amoand.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction amoand.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')' amoand.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')' @@ -58,6 +70,8 @@ amoor.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:17: error: optional integer offset must be 0 amoor.w a2, a1, (foo) # CHECK: :[[@LINE]]:18: error: expected register amoor.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:19: error: expected register +amoor.w a2, a1, (f0) # CHECK: :[[@LINE]]:18: error: invalid operand for instruction +amoor.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction amoor.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:24: error: expected ')' amoor.w a2, a1, (a0 # CHECK: :[[@LINE]]:24: error: expected ')' @@ -66,6 +80,8 @@ amomin.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0 amomin.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register amomin.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register +amomin.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction +amomin.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction amomin.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')' amomin.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')' @@ -74,6 +90,8 @@ amomax.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0 amomax.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register amomax.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register +amomax.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction +amomax.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction amomax.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')' amomax.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')' @@ -82,6 +100,8 @@ amominu.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0 amominu.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register amominu.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register +amominu.w a2, a1, (f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction +amominu.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:21: error: invalid operand for instruction amominu.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')' amominu.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')' @@ -90,5 +110,7 @@ amomaxu.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0 amomaxu.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register amomaxu.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register +amomaxu.w a2, a1, (f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction +amomaxu.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:21: error: invalid operand for instruction amomaxu.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')' amomaxu.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')' \ No newline at end of file