@@ -157,7 +157,8 @@ class AArch64AsmParser : public MCTargetAsmParser {
157
157
158
158
bool parseSysAlias (StringRef Name, SMLoc NameLoc, OperandVector &Operands);
159
159
void createSysAlias (uint16_t Encoding, OperandVector &Operands, SMLoc S);
160
- AArch64CC::CondCode parseCondCodeString (StringRef Cond);
160
+ AArch64CC::CondCode parseCondCodeString (StringRef Cond,
161
+ std::string &Suggestion);
161
162
bool parseCondCode (OperandVector &Operands, bool invertCondCode);
162
163
unsigned matchRegisterNameAlias (StringRef Name, RegKind Kind);
163
164
bool parseRegister (OperandVector &Operands);
@@ -3029,8 +3030,10 @@ AArch64AsmParser::tryParseImmWithOptionalShift(OperandVector &Operands) {
3029
3030
return MatchOperand_Success;
3030
3031
}
3031
3032
3032
- // / parseCondCodeString - Parse a Condition Code string.
3033
- AArch64CC::CondCode AArch64AsmParser::parseCondCodeString (StringRef Cond) {
3033
+ // / parseCondCodeString - Parse a Condition Code string, optionally returning a
3034
+ // / suggestion to help common typos.
3035
+ AArch64CC::CondCode
3036
+ AArch64AsmParser::parseCondCodeString (StringRef Cond, std::string &Suggestion) {
3034
3037
AArch64CC::CondCode CC = StringSwitch<AArch64CC::CondCode>(Cond.lower ())
3035
3038
.Case (" eq" , AArch64CC::EQ)
3036
3039
.Case (" ne" , AArch64CC::NE)
@@ -3053,7 +3056,7 @@ AArch64CC::CondCode AArch64AsmParser::parseCondCodeString(StringRef Cond) {
3053
3056
.Default (AArch64CC::Invalid);
3054
3057
3055
3058
if (CC == AArch64CC::Invalid &&
3056
- getSTI ().getFeatureBits ()[AArch64::FeatureSVE])
3059
+ getSTI ().getFeatureBits ()[AArch64::FeatureSVE]) {
3057
3060
CC = StringSwitch<AArch64CC::CondCode>(Cond.lower ())
3058
3061
.Case (" none" , AArch64CC::EQ)
3059
3062
.Case (" any" , AArch64CC::NE)
@@ -3067,6 +3070,9 @@ AArch64CC::CondCode AArch64AsmParser::parseCondCodeString(StringRef Cond) {
3067
3070
.Case (" tstop" , AArch64CC::LT)
3068
3071
.Default (AArch64CC::Invalid);
3069
3072
3073
+ if (CC == AArch64CC::Invalid && Cond.lower () == " nfirst" )
3074
+ Suggestion = " nfrst" ;
3075
+ }
3070
3076
return CC;
3071
3077
}
3072
3078
@@ -3078,9 +3084,14 @@ bool AArch64AsmParser::parseCondCode(OperandVector &Operands,
3078
3084
assert (Tok.is (AsmToken::Identifier) && " Token is not an Identifier" );
3079
3085
3080
3086
StringRef Cond = Tok.getString ();
3081
- AArch64CC::CondCode CC = parseCondCodeString (Cond);
3082
- if (CC == AArch64CC::Invalid)
3083
- return TokError (" invalid condition code" );
3087
+ std::string Suggestion;
3088
+ AArch64CC::CondCode CC = parseCondCodeString (Cond, Suggestion);
3089
+ if (CC == AArch64CC::Invalid) {
3090
+ std::string Msg = " invalid condition code" ;
3091
+ if (!Suggestion.empty ())
3092
+ Msg += " , did you mean " + Suggestion + " ?" ;
3093
+ return TokError (Msg);
3094
+ }
3084
3095
Lex (); // Eat identifier token.
3085
3096
3086
3097
if (invertCondCode) {
@@ -4545,9 +4556,14 @@ bool AArch64AsmParser::ParseInstruction(ParseInstructionInfo &Info,
4545
4556
4546
4557
SMLoc SuffixLoc = SMLoc::getFromPointer (NameLoc.getPointer () +
4547
4558
(Head.data () - Name.data ()));
4548
- AArch64CC::CondCode CC = parseCondCodeString (Head);
4549
- if (CC == AArch64CC::Invalid)
4550
- return Error (SuffixLoc, " invalid condition code" );
4559
+ std::string Suggestion;
4560
+ AArch64CC::CondCode CC = parseCondCodeString (Head, Suggestion);
4561
+ if (CC == AArch64CC::Invalid) {
4562
+ std::string Msg = " invalid condition code" ;
4563
+ if (!Suggestion.empty ())
4564
+ Msg += " , did you mean " + Suggestion + " ?" ;
4565
+ return Error (SuffixLoc, Msg);
4566
+ }
4551
4567
Operands.push_back (AArch64Operand::CreateToken (" ." , SuffixLoc, getContext (),
4552
4568
/* IsSuffix=*/ true ));
4553
4569
Operands.push_back (
0 commit comments