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 @@ -1622,6 +1622,8 @@ return MatchOperand_NoMatch; if (Lmul != 1 && Lmul != 2 && Lmul != 4 && Lmul != 8) return MatchOperand_NoMatch; + if (Fractional && Lmul == 1) + return MatchOperand_NoMatch; getLexer().Lex(); if (!getLexer().is(AsmToken::Comma)) @@ -1631,9 +1633,9 @@ Name = getLexer().getTok().getIdentifier(); // ta or tu bool TailAgnostic; - if (Name.consume_front("ta")) + if (Name == "ta") TailAgnostic = true; - else if (Name.consume_front("tu")) + else if (Name == "tu") TailAgnostic = false; else return MatchOperand_NoMatch; @@ -1646,9 +1648,9 @@ Name = getLexer().getTok().getIdentifier(); // ma or mu bool MaskedoffAgnostic; - if (Name.consume_front("ma")) + if (Name == "ma") MaskedoffAgnostic = true; - else if (Name.consume_front("mu")) + else if (Name == "mu") MaskedoffAgnostic = false; else return MatchOperand_NoMatch; 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,15 @@ vsetvli a2, a0, e8,m1z,tu,mu # CHECK-ERROR: operand must be e[8|16|32|64|128|256|512|1024],m[1|2|4|8|f2|f4|f8],[ta|tu],[ma|mu] +vsetvli a2, a0, e8,mf1,tu,mu +# CHECK-ERROR: operand must be e[8|16|32|64|128|256|512|1024],m[1|2|4|8|f2|f4|f8],[ta|tu],[ma|mu] + +vsetvli a2, a0, e8,m1,tu,mut +# CHECK-ERROR: operand must be e[8|16|32|64|128|256|512|1024],m[1|2|4|8|f2|f4|f8],[ta|tu],[ma|mu] + +vsetvli a2, a0, e8,m1,tut,mu +# CHECK-ERROR: operand must be e[8|16|32|64|128|256|512|1024],m[1|2|4|8|f2|f4|f8],[ta|tu],[ma|mu] + vadd.vv v1, v3, v2, v4.t # CHECK-ERROR: operand must be v0.t