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 @@ -2419,6 +2419,8 @@ // pseudoinstruction: vmsge{u}.vx vd, va, x, v0.t, vt // expansion: vmslt{u}.vx vt, va, x; vmandnot.mm vt, v0, vt; vmandnot.mm vd, // vd, v0; vmor.mm vd, vt, vd + assert(Inst.getOperand(1).getReg() != RISCV::V0 && + "The temporary vector register should not be V0."); emitToStreamer(Out, MCInstBuilder(Opcode) .addOperand(Inst.getOperand(1)) .addOperand(Inst.getOperand(2)) 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 @@ -663,10 +663,10 @@ def PseudoVMSGE_VX_M : Pseudo<(outs VRNoV0:$vd), (ins VR:$vs2, GPR:$rs1, VMaskOp:$vm), [], "vmsge.vx", "$vd, $vs2, $rs1$vm">; -def PseudoVMSGEU_VX_M_T : Pseudo<(outs VR:$vd, VR:$scratch), +def PseudoVMSGEU_VX_M_T : Pseudo<(outs VR:$vd, VRNoV0:$scratch), (ins VR:$vs2, GPR:$rs1, VMaskOp:$vm), [], "vmsgeu.vx", "$vd, $vs2, $rs1$vm, $scratch">; -def PseudoVMSGE_VX_M_T : Pseudo<(outs VR:$vd, VR:$scratch), +def PseudoVMSGE_VX_M_T : Pseudo<(outs VR:$vd, VRNoV0:$scratch), (ins VR:$vs2, GPR:$rs1, VMaskOp:$vm), [], "vmsge.vx", "$vd, $vs2, $rs1$vm, $scratch">; } 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 @@ -661,3 +661,8 @@ vs8r.v v7, (a0) # CHECK-ERROR: invalid operand for instruction +vmsge.vx v2, v4, a0, v0.t, v0 +# CHECK-ERROR: invalid operand for instruction + +vmsgeu.vx v2, v4, a0, v0.t, v0 +# CHECK-ERROR: invalid operand for instruction