@@ -416,7 +416,8 @@ class SystemZAsmParser : public MCTargetAsmParser {
416
416
return static_cast <SystemZTargetStreamer &>(TS);
417
417
}
418
418
419
- bool parseRegister (Register &Reg, bool RestoreOnFailure = false );
419
+ bool parseRegister (Register &Reg, bool RequirePercent,
420
+ bool RestoreOnFailure = false );
420
421
421
422
bool parseIntegerRegister (Register &Reg, RegisterGroup Group);
422
423
@@ -495,7 +496,7 @@ class SystemZAsmParser : public MCTargetAsmParser {
495
496
ParseStatus parseDirective (AsmToken DirectiveID) override ;
496
497
bool parseRegister (MCRegister &Reg, SMLoc &StartLoc, SMLoc &EndLoc) override ;
497
498
bool ParseRegister (MCRegister &RegNo, SMLoc &StartLoc, SMLoc &EndLoc,
498
- bool RestoreOnFailure);
499
+ bool RequirePercent, bool RestoreOnFailure);
499
500
ParseStatus tryParseRegister (MCRegister &Reg, SMLoc &StartLoc,
500
501
SMLoc &EndLoc) override ;
501
502
bool ParseInstruction (ParseInstructionInfo &Info, StringRef Name,
@@ -756,34 +757,40 @@ void SystemZOperand::print(raw_ostream &OS) const {
756
757
}
757
758
758
759
// 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) {
765
762
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
+ }
767
773
768
774
// Expect a register name.
769
775
if (Parser.getTok ().isNot (AsmToken::Identifier)) {
770
- if (RestoreOnFailure)
776
+ if (RestoreOnFailure && HasPercent )
771
777
getLexer ().UnLex (PercentTok);
772
- return Error (Reg.StartLoc , " invalid register" );
778
+ return Error (Reg.StartLoc ,
779
+ HasPercent ? " invalid register" : " register expected" );
773
780
}
774
781
775
782
// Check that there's a prefix.
776
783
StringRef Name = Parser.getTok ().getString ();
777
784
if (Name.size () < 2 ) {
778
- if (RestoreOnFailure)
785
+ if (RestoreOnFailure && HasPercent )
779
786
getLexer ().UnLex (PercentTok);
780
787
return Error (Reg.StartLoc , " invalid register" );
781
788
}
782
789
char Prefix = Name[0 ];
783
790
784
791
// Treat the rest of the register name as a register number.
785
792
if (Name.substr (1 ).getAsInteger (10 , Reg.Num )) {
786
- if (RestoreOnFailure)
793
+ if (RestoreOnFailure && HasPercent )
787
794
getLexer ().UnLex (PercentTok);
788
795
return Error (Reg.StartLoc , " invalid register" );
789
796
}
@@ -800,7 +807,7 @@ bool SystemZAsmParser::parseRegister(Register &Reg, bool RestoreOnFailure) {
800
807
else if (Prefix == ' c' && Reg.Num < 16 )
801
808
Reg.Group = RegCR;
802
809
else {
803
- if (RestoreOnFailure)
810
+ if (RestoreOnFailure && HasPercent )
804
811
getLexer ().UnLex (PercentTok);
805
812
return Error (Reg.StartLoc , " invalid register" );
806
813
}
@@ -842,7 +849,7 @@ ParseStatus SystemZAsmParser::parseRegister(OperandVector &Operands,
842
849
843
850
// Handle register names of the form %<prefix><number>
844
851
if (isParsingATT () && Parser.getTok ().is (AsmToken::Percent)) {
845
- if (parseRegister (Reg))
852
+ if (parseRegister (Reg, /* RequirePercent= */ true ))
846
853
return ParseStatus::Failure;
847
854
848
855
// Check the parsed register group "Reg.Group" with the expected "Group"
@@ -918,7 +925,7 @@ ParseStatus SystemZAsmParser::parseAnyRegister(OperandVector &Operands) {
918
925
return ParseStatus::NoMatch;
919
926
920
927
Register Reg;
921
- if (parseRegister (Reg))
928
+ if (parseRegister (Reg, /* RequirePercent= */ true ))
922
929
return ParseStatus::Failure;
923
930
924
931
if (Reg.Num > 15 )
@@ -1025,7 +1032,7 @@ bool SystemZAsmParser::parseAddress(bool &HaveReg1, Register &Reg1,
1025
1032
if (isParsingATT () && getLexer ().is (AsmToken::Percent)) {
1026
1033
// Parse the first register.
1027
1034
HaveReg1 = true ;
1028
- if (parseRegister (Reg1))
1035
+ if (parseRegister (Reg1, /* RequirePercent= */ true ))
1029
1036
return true ;
1030
1037
}
1031
1038
// 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,
1065
1072
if (parseIntegerRegister (Reg2, RegGR))
1066
1073
return true ;
1067
1074
} else {
1068
- if (isParsingATT () && parseRegister (Reg2))
1075
+ if (isParsingATT () && parseRegister (Reg2, /* RequirePercent= */ true ))
1069
1076
return true ;
1070
1077
}
1071
1078
}
@@ -1355,9 +1362,10 @@ bool SystemZAsmParser::ParseGNUAttribute(SMLoc L) {
1355
1362
}
1356
1363
1357
1364
bool SystemZAsmParser::ParseRegister (MCRegister &RegNo, SMLoc &StartLoc,
1358
- SMLoc &EndLoc, bool RestoreOnFailure) {
1365
+ SMLoc &EndLoc, bool RequirePercent,
1366
+ bool RestoreOnFailure) {
1359
1367
Register Reg;
1360
- if (parseRegister (Reg, RestoreOnFailure))
1368
+ if (parseRegister (Reg, RequirePercent, RestoreOnFailure))
1361
1369
return true ;
1362
1370
if (Reg.Group == RegGR)
1363
1371
RegNo = SystemZMC::GR64Regs[Reg.Num ];
@@ -1376,12 +1384,14 @@ bool SystemZAsmParser::ParseRegister(MCRegister &RegNo, SMLoc &StartLoc,
1376
1384
1377
1385
bool SystemZAsmParser::parseRegister (MCRegister &Reg, SMLoc &StartLoc,
1378
1386
SMLoc &EndLoc) {
1379
- return ParseRegister (Reg, StartLoc, EndLoc, /* RestoreOnFailure=*/ false );
1387
+ return ParseRegister (Reg, StartLoc, EndLoc, /* RequirePercent=*/ false ,
1388
+ /* RestoreOnFailure=*/ false );
1380
1389
}
1381
1390
1382
1391
ParseStatus SystemZAsmParser::tryParseRegister (MCRegister &Reg, SMLoc &StartLoc,
1383
1392
SMLoc &EndLoc) {
1384
- bool Result = ParseRegister (Reg, StartLoc, EndLoc, /* RestoreOnFailure=*/ true );
1393
+ bool Result = ParseRegister (Reg, StartLoc, EndLoc, /* RequirePercent=*/ false ,
1394
+ /* RestoreOnFailure=*/ true );
1385
1395
bool PendingErrors = getParser ().hasPendingError ();
1386
1396
getParser ().clearPendingErrors ();
1387
1397
if (PendingErrors)
@@ -1482,7 +1492,7 @@ bool SystemZAsmParser::parseOperand(OperandVector &Operands,
1482
1492
// the instruction isn't recognized.
1483
1493
if (isParsingATT () && Parser.getTok ().is (AsmToken::Percent)) {
1484
1494
Register Reg;
1485
- if (parseRegister (Reg))
1495
+ if (parseRegister (Reg, /* RequirePercent= */ true ))
1486
1496
return true ;
1487
1497
Operands.push_back (SystemZOperand::createInvalid (Reg.StartLoc , Reg.EndLoc ));
1488
1498
return false ;
0 commit comments