Skip to content

Commit f404826

Browse files
authored
[RISCV] Don't allow '-' after 'ra' in Zcmp/Xqccmp register list. (#134182)
Move the parsing of '-' under the check that we parsed a comma. Unfortunately, this leads to a poor error, but I still have more known issues in this code and may end up with an overall restructuring and want to think about wording.
1 parent 3ea7902 commit f404826

File tree

2 files changed

+36
-33
lines changed

2 files changed

+36
-33
lines changed

llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2604,46 +2604,46 @@ ParseStatus RISCVAsmParser::parseRegListCommon(OperandVector &Operands,
26042604
return Error(getLoc(),
26052605
"continuous register list must start from 's0' or 'x8'");
26062606
getLexer().Lex(); // eat reg
2607-
}
2608-
2609-
// parse case like -s1
2610-
if (parseOptionalToken(AsmToken::Minus)) {
2611-
StringRef EndName = getLexer().getTok().getIdentifier();
2612-
// FIXME: the register mapping and checks of RVE is wrong
2613-
RegEnd = matchRegisterNameHelper(EndName);
2614-
if (!(RegEnd == RISCV::X9 ||
2615-
(RegEnd >= RISCV::X18 && RegEnd <= RISCV::X27)))
2616-
return Error(getLoc(), "invalid register");
2617-
getLexer().Lex();
2618-
}
26192607

2620-
// parse extra part like ', x18[-x20]' for XRegList
2621-
if (parseOptionalToken(AsmToken::Comma)) {
2622-
if (RegEnd != RISCV::X9)
2623-
return Error(
2624-
getLoc(),
2625-
"first contiguous registers pair of register list must be 'x8-x9'");
2608+
// parse case like -s1
2609+
if (parseOptionalToken(AsmToken::Minus)) {
2610+
StringRef EndName = getLexer().getTok().getIdentifier();
2611+
// FIXME: the register mapping and checks of RVE is wrong
2612+
RegEnd = matchRegisterNameHelper(EndName);
2613+
if (!(RegEnd == RISCV::X9 ||
2614+
(RegEnd >= RISCV::X18 && RegEnd <= RISCV::X27)))
2615+
return Error(getLoc(), "invalid register");
2616+
getLexer().Lex();
2617+
}
26262618

2627-
// parse ', x18' for extra part
2628-
if (getLexer().isNot(AsmToken::Identifier) || IsRVE)
2629-
return Error(getLoc(), "invalid register");
2630-
StringRef EndName = getLexer().getTok().getIdentifier();
2631-
RegEnd = MatchRegisterName(EndName);
2632-
if (RegEnd != RISCV::X18)
2633-
return Error(getLoc(),
2634-
"second contiguous registers pair of register list "
2635-
"must start from 'x18'");
2636-
getLexer().Lex();
2619+
// parse extra part like ', x18[-x20]' for XRegList
2620+
if (parseOptionalToken(AsmToken::Comma)) {
2621+
if (RegEnd != RISCV::X9)
2622+
return Error(
2623+
getLoc(),
2624+
"first contiguous registers pair of register list must be 'x8-x9'");
26372625

2638-
// parse '-x20' for extra part
2639-
if (parseOptionalToken(AsmToken::Minus)) {
2626+
// parse ', x18' for extra part
26402627
if (getLexer().isNot(AsmToken::Identifier) || IsRVE)
26412628
return Error(getLoc(), "invalid register");
2642-
EndName = getLexer().getTok().getIdentifier();
2629+
StringRef EndName = getLexer().getTok().getIdentifier();
26432630
RegEnd = MatchRegisterName(EndName);
2644-
if (!(RegEnd >= RISCV::X19 && RegEnd <= RISCV::X27))
2645-
return Error(getLoc(), "invalid register");
2631+
if (RegEnd != RISCV::X18)
2632+
return Error(getLoc(),
2633+
"second contiguous registers pair of register list "
2634+
"must start from 'x18'");
26462635
getLexer().Lex();
2636+
2637+
// parse '-x20' for extra part
2638+
if (parseOptionalToken(AsmToken::Minus)) {
2639+
if (getLexer().isNot(AsmToken::Identifier) || IsRVE)
2640+
return Error(getLoc(), "invalid register");
2641+
EndName = getLexer().getTok().getIdentifier();
2642+
RegEnd = MatchRegisterName(EndName);
2643+
if (!(RegEnd >= RISCV::X19 && RegEnd <= RISCV::X27))
2644+
return Error(getLoc(), "invalid register");
2645+
getLexer().Lex();
2646+
}
26472647
}
26482648
}
26492649

llvm/test/MC/RISCV/rv64zcmp-invalid.s

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,6 @@ cm.pop {ra}, -x1
5454

5555
# CHECK-ERROR: :[[@LINE+1]]:15: error: stack adjustment is invalid for this instruction and register list
5656
cm.push {ra}, x1
57+
58+
# CHECK-ERROR: :[[@LINE+1]]:12: error: register list must end with '}'
59+
cm.push {x1-x9}, -32

0 commit comments

Comments
 (0)