@@ -416,7 +416,8 @@ class SystemZAsmParser : public MCTargetAsmParser {
416416 return static_cast <SystemZTargetStreamer &>(TS);
417417 }
418418
419- bool parseRegister (Register &Reg, bool RestoreOnFailure = false );
419+ bool parseRegister (Register &Reg, bool RequirePercent,
420+ bool RestoreOnFailure = false );
420421
421422 bool parseIntegerRegister (Register &Reg, RegisterGroup Group);
422423
@@ -495,7 +496,7 @@ class SystemZAsmParser : public MCTargetAsmParser {
495496 ParseStatus parseDirective (AsmToken DirectiveID) override ;
496497 bool parseRegister (MCRegister &Reg, SMLoc &StartLoc, SMLoc &EndLoc) override ;
497498 bool ParseRegister (MCRegister &RegNo, SMLoc &StartLoc, SMLoc &EndLoc,
498- bool RestoreOnFailure);
499+ bool RequirePercent, bool RestoreOnFailure);
499500 ParseStatus tryParseRegister (MCRegister &Reg, SMLoc &StartLoc,
500501 SMLoc &EndLoc) override ;
501502 bool ParseInstruction (ParseInstructionInfo &Info, StringRef Name,
@@ -756,34 +757,40 @@ void SystemZOperand::print(raw_ostream &OS) const {
756757}
757758
758759// Parse one register of the form %<prefix><number>.
759- bool SystemZAsmParser::parseRegister (Register &Reg, bool RestoreOnFailure) {
760- Reg.StartLoc = Parser.getTok ().getLoc ();
761-
762- // Eat the % prefix.
763- if (Parser.getTok ().isNot (AsmToken::Percent))
764- return Error (Parser.getTok ().getLoc (), " register expected" );
760+ bool SystemZAsmParser::parseRegister (Register &Reg, bool RequirePercent,
761+ bool RestoreOnFailure) {
765762 const AsmToken &PercentTok = Parser.getTok ();
766- Parser.Lex ();
763+ bool HasPercent = PercentTok.is (AsmToken::Percent);
764+
765+ Reg.StartLoc = PercentTok.getLoc ();
766+
767+ if (RequirePercent && PercentTok.isNot (AsmToken::Percent))
768+ return Error (PercentTok.getLoc (), " register expected" );
769+
770+ if (HasPercent) {
771+ Parser.Lex (); // Eat percent token.
772+ }
767773
768774 // Expect a register name.
769775 if (Parser.getTok ().isNot (AsmToken::Identifier)) {
770- if (RestoreOnFailure)
776+ if (RestoreOnFailure && HasPercent )
771777 getLexer ().UnLex (PercentTok);
772- return Error (Reg.StartLoc , " invalid register" );
778+ return Error (Reg.StartLoc ,
779+ HasPercent ? " invalid register" : " register expected" );
773780 }
774781
775782 // Check that there's a prefix.
776783 StringRef Name = Parser.getTok ().getString ();
777784 if (Name.size () < 2 ) {
778- if (RestoreOnFailure)
785+ if (RestoreOnFailure && HasPercent )
779786 getLexer ().UnLex (PercentTok);
780787 return Error (Reg.StartLoc , " invalid register" );
781788 }
782789 char Prefix = Name[0 ];
783790
784791 // Treat the rest of the register name as a register number.
785792 if (Name.substr (1 ).getAsInteger (10 , Reg.Num )) {
786- if (RestoreOnFailure)
793+ if (RestoreOnFailure && HasPercent )
787794 getLexer ().UnLex (PercentTok);
788795 return Error (Reg.StartLoc , " invalid register" );
789796 }
@@ -800,7 +807,7 @@ bool SystemZAsmParser::parseRegister(Register &Reg, bool RestoreOnFailure) {
800807 else if (Prefix == ' c' && Reg.Num < 16 )
801808 Reg.Group = RegCR;
802809 else {
803- if (RestoreOnFailure)
810+ if (RestoreOnFailure && HasPercent )
804811 getLexer ().UnLex (PercentTok);
805812 return Error (Reg.StartLoc , " invalid register" );
806813 }
@@ -842,7 +849,7 @@ ParseStatus SystemZAsmParser::parseRegister(OperandVector &Operands,
842849
843850 // Handle register names of the form %<prefix><number>
844851 if (isParsingATT () && Parser.getTok ().is (AsmToken::Percent)) {
845- if (parseRegister (Reg))
852+ if (parseRegister (Reg, /* RequirePercent= */ true ))
846853 return ParseStatus::Failure;
847854
848855 // Check the parsed register group "Reg.Group" with the expected "Group"
@@ -918,7 +925,7 @@ ParseStatus SystemZAsmParser::parseAnyRegister(OperandVector &Operands) {
918925 return ParseStatus::NoMatch;
919926
920927 Register Reg;
921- if (parseRegister (Reg))
928+ if (parseRegister (Reg, /* RequirePercent= */ true ))
922929 return ParseStatus::Failure;
923930
924931 if (Reg.Num > 15 )
@@ -1025,7 +1032,7 @@ bool SystemZAsmParser::parseAddress(bool &HaveReg1, Register &Reg1,
10251032 if (isParsingATT () && getLexer ().is (AsmToken::Percent)) {
10261033 // Parse the first register.
10271034 HaveReg1 = true ;
1028- if (parseRegister (Reg1))
1035+ if (parseRegister (Reg1, /* RequirePercent= */ true ))
10291036 return true ;
10301037 }
10311038 // So if we have an integer as the first token in ([tok1], ..), it could:
@@ -1065,7 +1072,7 @@ bool SystemZAsmParser::parseAddress(bool &HaveReg1, Register &Reg1,
10651072 if (parseIntegerRegister (Reg2, RegGR))
10661073 return true ;
10671074 } else {
1068- if (isParsingATT () && parseRegister (Reg2))
1075+ if (isParsingATT () && parseRegister (Reg2, /* RequirePercent= */ true ))
10691076 return true ;
10701077 }
10711078 }
@@ -1355,9 +1362,10 @@ bool SystemZAsmParser::ParseGNUAttribute(SMLoc L) {
13551362}
13561363
13571364bool SystemZAsmParser::ParseRegister (MCRegister &RegNo, SMLoc &StartLoc,
1358- SMLoc &EndLoc, bool RestoreOnFailure) {
1365+ SMLoc &EndLoc, bool RequirePercent,
1366+ bool RestoreOnFailure) {
13591367 Register Reg;
1360- if (parseRegister (Reg, RestoreOnFailure))
1368+ if (parseRegister (Reg, RequirePercent, RestoreOnFailure))
13611369 return true ;
13621370 if (Reg.Group == RegGR)
13631371 RegNo = SystemZMC::GR64Regs[Reg.Num ];
@@ -1376,12 +1384,14 @@ bool SystemZAsmParser::ParseRegister(MCRegister &RegNo, SMLoc &StartLoc,
13761384
13771385bool SystemZAsmParser::parseRegister (MCRegister &Reg, SMLoc &StartLoc,
13781386 SMLoc &EndLoc) {
1379- return ParseRegister (Reg, StartLoc, EndLoc, /* RestoreOnFailure=*/ false );
1387+ return ParseRegister (Reg, StartLoc, EndLoc, /* RequirePercent=*/ false ,
1388+ /* RestoreOnFailure=*/ false );
13801389}
13811390
13821391ParseStatus SystemZAsmParser::tryParseRegister (MCRegister &Reg, SMLoc &StartLoc,
13831392 SMLoc &EndLoc) {
1384- bool Result = ParseRegister (Reg, StartLoc, EndLoc, /* RestoreOnFailure=*/ true );
1393+ bool Result = ParseRegister (Reg, StartLoc, EndLoc, /* RequirePercent=*/ false ,
1394+ /* RestoreOnFailure=*/ true );
13851395 bool PendingErrors = getParser ().hasPendingError ();
13861396 getParser ().clearPendingErrors ();
13871397 if (PendingErrors)
@@ -1482,7 +1492,7 @@ bool SystemZAsmParser::parseOperand(OperandVector &Operands,
14821492 // the instruction isn't recognized.
14831493 if (isParsingATT () && Parser.getTok ().is (AsmToken::Percent)) {
14841494 Register Reg;
1485- if (parseRegister (Reg))
1495+ if (parseRegister (Reg, /* RequirePercent= */ true ))
14861496 return true ;
14871497 Operands.push_back (SystemZOperand::createInvalid (Reg.StartLoc , Reg.EndLoc ));
14881498 return false ;
0 commit comments