Skip to content

Commit c5f150c

Browse files
committed
[RISCV] Don't allow '-' after 'ra' in Zcmp/Xqccmp register list.
Move the parsing of minus 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 ffed176 commit c5f150c

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
@@ -2612,46 +2612,46 @@ ParseStatus RISCVAsmParser::parseRegListCommon(OperandVector &Operands,
26122612
return Error(getLoc(),
26132613
"continuous register list must start from 's0' or 'x8'");
26142614
getLexer().Lex(); // eat reg
2615-
}
2616-
2617-
// parse case like -s1
2618-
if (parseOptionalToken(AsmToken::Minus)) {
2619-
StringRef EndName = getLexer().getTok().getIdentifier();
2620-
// FIXME: the register mapping and checks of RVE is wrong
2621-
RegEnd = matchRegisterNameHelper(EndName);
2622-
if (!(RegEnd == RISCV::X9 ||
2623-
(RegEnd >= RISCV::X18 && RegEnd <= RISCV::X27)))
2624-
return Error(getLoc(), "invalid register");
2625-
getLexer().Lex();
2626-
}
26272615

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

2635-
// parse ', x18' for extra part
2636-
if (getLexer().isNot(AsmToken::Identifier) || IsRVE)
2637-
return Error(getLoc(), "invalid register");
2638-
StringRef EndName = getLexer().getTok().getIdentifier();
2639-
RegEnd = MatchRegisterName(EndName);
2640-
if (RegEnd != RISCV::X18)
2641-
return Error(getLoc(),
2642-
"second contiguous registers pair of register list "
2643-
"must start from 'x18'");
2644-
getLexer().Lex();
2627+
// parse extra part like ', x18[-x20]' for XRegList
2628+
if (parseOptionalToken(AsmToken::Comma)) {
2629+
if (RegEnd != RISCV::X9)
2630+
return Error(
2631+
getLoc(),
2632+
"first contiguous registers pair of register list must be 'x8-x9'");
26452633

2646-
// parse '-x20' for extra part
2647-
if (parseOptionalToken(AsmToken::Minus)) {
2634+
// parse ', x18' for extra part
26482635
if (getLexer().isNot(AsmToken::Identifier) || IsRVE)
26492636
return Error(getLoc(), "invalid register");
2650-
EndName = getLexer().getTok().getIdentifier();
2637+
StringRef EndName = getLexer().getTok().getIdentifier();
26512638
RegEnd = MatchRegisterName(EndName);
2652-
if (!(RegEnd >= RISCV::X19 && RegEnd <= RISCV::X27))
2653-
return Error(getLoc(), "invalid register");
2639+
if (RegEnd != RISCV::X18)
2640+
return Error(getLoc(),
2641+
"second contiguous registers pair of register list "
2642+
"must start from 'x18'");
26542643
getLexer().Lex();
2644+
2645+
// parse '-x20' for extra part
2646+
if (parseOptionalToken(AsmToken::Minus)) {
2647+
if (getLexer().isNot(AsmToken::Identifier) || IsRVE)
2648+
return Error(getLoc(), "invalid register");
2649+
EndName = getLexer().getTok().getIdentifier();
2650+
RegEnd = MatchRegisterName(EndName);
2651+
if (!(RegEnd >= RISCV::X19 && RegEnd <= RISCV::X27))
2652+
return Error(getLoc(), "invalid register");
2653+
getLexer().Lex();
2654+
}
26552655
}
26562656
}
26572657

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)