@@ -441,7 +441,7 @@ class ARMAsmParser : public MCTargetAsmParser {
441
441
bool validatetSTMRegList (const MCInst &Inst, const OperandVector &Operands,
442
442
unsigned MnemonicOpsEndInd, unsigned ListIndex);
443
443
444
- int tryParseRegister (bool AllowOutofBoundReg = false );
444
+ MCRegister tryParseRegister (bool AllowOutofBoundReg = false );
445
445
bool tryParseRegisterWithWriteBack (OperandVector &);
446
446
int tryParseShiftRegister (OperandVector &);
447
447
std::optional<ARM_AM::ShiftOpc> tryParseShiftToken ();
@@ -4205,7 +4205,7 @@ bool ARMAsmParser::parseRegister(MCRegister &Reg, SMLoc &StartLoc,
4205
4205
EndLoc = Tok.getEndLoc ();
4206
4206
Reg = tryParseRegister ();
4207
4207
4208
- return Reg == ( unsigned )- 1 ;
4208
+ return ! Reg;
4209
4209
}
4210
4210
4211
4211
ParseStatus ARMAsmParser::tryParseRegister (MCRegister &Reg, SMLoc &StartLoc,
@@ -4216,59 +4216,59 @@ ParseStatus ARMAsmParser::tryParseRegister(MCRegister &Reg, SMLoc &StartLoc,
4216
4216
}
4217
4217
4218
4218
// / Try to parse a register name. The token must be an Identifier when called,
4219
- // / and if it is a register name the token is eaten and the register number is
4220
- // / returned. Otherwise return -1 .
4221
- int ARMAsmParser::tryParseRegister (bool AllowOutOfBoundReg) {
4219
+ // / and if it is a register name the token is eaten and the register is
4220
+ // / returned. Otherwise return an invalid MCRegister .
4221
+ MCRegister ARMAsmParser::tryParseRegister (bool AllowOutOfBoundReg) {
4222
4222
MCAsmParser &Parser = getParser ();
4223
4223
const AsmToken &Tok = Parser.getTok ();
4224
- if (Tok.isNot (AsmToken::Identifier)) return -1 ;
4224
+ if (Tok.isNot (AsmToken::Identifier))
4225
+ return MCRegister ();
4225
4226
4226
4227
std::string lowerCase = Tok.getString ().lower ();
4227
- unsigned RegNum = MatchRegisterName (lowerCase);
4228
- if (!RegNum ) {
4229
- RegNum = StringSwitch<unsigned >(lowerCase)
4230
- .Case (" r13" , ARM::SP)
4231
- .Case (" r14" , ARM::LR)
4232
- .Case (" r15" , ARM::PC)
4233
- .Case (" ip" , ARM::R12)
4234
- // Additional register name aliases for 'gas' compatibility.
4235
- .Case (" a1" , ARM::R0)
4236
- .Case (" a2" , ARM::R1)
4237
- .Case (" a3" , ARM::R2)
4238
- .Case (" a4" , ARM::R3)
4239
- .Case (" v1" , ARM::R4)
4240
- .Case (" v2" , ARM::R5)
4241
- .Case (" v3" , ARM::R6)
4242
- .Case (" v4" , ARM::R7)
4243
- .Case (" v5" , ARM::R8)
4244
- .Case (" v6" , ARM::R9)
4245
- .Case (" v7" , ARM::R10)
4246
- .Case (" v8" , ARM::R11)
4247
- .Case (" sb" , ARM::R9)
4248
- .Case (" sl" , ARM::R10)
4249
- .Case (" fp" , ARM::R11)
4250
- .Default (0 );
4251
- }
4252
- if (!RegNum ) {
4228
+ MCRegister Reg = MatchRegisterName (lowerCase);
4229
+ if (!Reg ) {
4230
+ Reg = StringSwitch<MCRegister >(lowerCase)
4231
+ .Case (" r13" , ARM::SP)
4232
+ .Case (" r14" , ARM::LR)
4233
+ .Case (" r15" , ARM::PC)
4234
+ .Case (" ip" , ARM::R12)
4235
+ // Additional register name aliases for 'gas' compatibility.
4236
+ .Case (" a1" , ARM::R0)
4237
+ .Case (" a2" , ARM::R1)
4238
+ .Case (" a3" , ARM::R2)
4239
+ .Case (" a4" , ARM::R3)
4240
+ .Case (" v1" , ARM::R4)
4241
+ .Case (" v2" , ARM::R5)
4242
+ .Case (" v3" , ARM::R6)
4243
+ .Case (" v4" , ARM::R7)
4244
+ .Case (" v5" , ARM::R8)
4245
+ .Case (" v6" , ARM::R9)
4246
+ .Case (" v7" , ARM::R10)
4247
+ .Case (" v8" , ARM::R11)
4248
+ .Case (" sb" , ARM::R9)
4249
+ .Case (" sl" , ARM::R10)
4250
+ .Case (" fp" , ARM::R11)
4251
+ .Default (MCRegister () );
4252
+ }
4253
+ if (!Reg ) {
4253
4254
// Check for aliases registered via .req. Canonicalize to lower case.
4254
4255
// That's more consistent since register names are case insensitive, and
4255
4256
// it's how the original entry was passed in from MC/MCParser/AsmParser.
4256
4257
auto Entry = RegisterReqs.find (lowerCase);
4257
4258
// If no match, return failure.
4258
4259
if (Entry == RegisterReqs.end ())
4259
- return - 1 ;
4260
+ return MCRegister () ;
4260
4261
Parser.Lex (); // Eat identifier token.
4261
4262
return Entry->getValue ();
4262
4263
}
4263
4264
4264
4265
// Some FPUs only have 16 D registers, so D16-D31 are invalid
4265
- if (!AllowOutOfBoundReg && !hasD32 () && RegNum >= ARM::D16 &&
4266
- RegNum <= ARM::D31)
4267
- return -1 ;
4266
+ if (!AllowOutOfBoundReg && !hasD32 () && Reg >= ARM::D16 && Reg <= ARM::D31)
4267
+ return MCRegister ();
4268
4268
4269
4269
Parser.Lex (); // Eat identifier token.
4270
4270
4271
- return RegNum ;
4271
+ return Reg ;
4272
4272
}
4273
4273
4274
4274
std::optional<ARM_AM::ShiftOpc> ARMAsmParser::tryParseShiftToken () {
@@ -4356,7 +4356,7 @@ int ARMAsmParser::tryParseShiftRegister(OperandVector &Operands) {
4356
4356
SMLoc L = Parser.getTok ().getLoc ();
4357
4357
EndLoc = Parser.getTok ().getEndLoc ();
4358
4358
ShiftReg = tryParseRegister ();
4359
- if (ShiftReg == - 1 ) {
4359
+ if (! ShiftReg) {
4360
4360
Error (L, " expected immediate or register in shift operand" );
4361
4361
return -1 ;
4362
4362
}
@@ -4387,12 +4387,11 @@ bool ARMAsmParser::tryParseRegisterWithWriteBack(OperandVector &Operands) {
4387
4387
MCAsmParser &Parser = getParser ();
4388
4388
SMLoc RegStartLoc = Parser.getTok ().getLoc ();
4389
4389
SMLoc RegEndLoc = Parser.getTok ().getEndLoc ();
4390
- int RegNo = tryParseRegister ();
4391
- if (RegNo == - 1 )
4390
+ MCRegister Reg = tryParseRegister ();
4391
+ if (!Reg )
4392
4392
return true ;
4393
4393
4394
- Operands.push_back (
4395
- ARMOperand::CreateReg (RegNo, RegStartLoc, RegEndLoc, *this ));
4394
+ Operands.push_back (ARMOperand::CreateReg (Reg, RegStartLoc, RegEndLoc, *this ));
4396
4395
4397
4396
const AsmToken &ExclaimTok = Parser.getTok ();
4398
4397
if (ExclaimTok.is (AsmToken::Exclaim)) {
@@ -4619,8 +4618,8 @@ bool ARMAsmParser::parseRegisterList(OperandVector &Operands, bool EnforceOrder,
4619
4618
4620
4619
// Check the first register in the list to see what register class
4621
4620
// this is a list of.
4622
- int Reg = tryParseRegister ();
4623
- if (Reg == - 1 )
4621
+ MCRegister Reg = tryParseRegister ();
4622
+ if (! Reg)
4624
4623
return Error (RegLoc, " register expected" );
4625
4624
if (!AllowRAAC && Reg == ARM::RA_AUTH_CODE)
4626
4625
return Error (RegLoc, " pseudo-register not allowed" );
@@ -4634,7 +4633,7 @@ bool ARMAsmParser::parseRegisterList(OperandVector &Operands, bool EnforceOrder,
4634
4633
Reg = getDRegFromQReg (Reg);
4635
4634
EReg = MRI->getEncodingValue (Reg);
4636
4635
Registers.emplace_back (EReg, Reg);
4637
- ++ Reg;
4636
+ Reg = Reg + 1 ;
4638
4637
}
4639
4638
const MCRegisterClass *RC;
4640
4639
if (Reg == ARM::RA_AUTH_CODE ||
@@ -4663,8 +4662,8 @@ bool ARMAsmParser::parseRegisterList(OperandVector &Operands, bool EnforceOrder,
4663
4662
return Error (RegLoc, " pseudo-register not allowed" );
4664
4663
Parser.Lex (); // Eat the minus.
4665
4664
SMLoc AfterMinusLoc = Parser.getTok ().getLoc ();
4666
- int EndReg = tryParseRegister (AllowOutOfBoundReg);
4667
- if (EndReg == - 1 )
4665
+ MCRegister EndReg = tryParseRegister (AllowOutOfBoundReg);
4666
+ if (! EndReg)
4668
4667
return Error (AfterMinusLoc, " register expected" );
4669
4668
if (EndReg == ARM::RA_AUTH_CODE)
4670
4669
return Error (AfterMinusLoc, " pseudo-register not allowed" );
@@ -4696,10 +4695,10 @@ bool ARMAsmParser::parseRegisterList(OperandVector &Operands, bool EnforceOrder,
4696
4695
}
4697
4696
Parser.Lex (); // Eat the comma.
4698
4697
RegLoc = Parser.getTok ().getLoc ();
4699
- int OldReg = Reg;
4698
+ MCRegister OldReg = Reg;
4700
4699
const AsmToken RegTok = Parser.getTok ();
4701
4700
Reg = tryParseRegister (AllowOutOfBoundReg);
4702
- if (Reg == - 1 )
4701
+ if (! Reg)
4703
4702
return Error (RegLoc, " register expected" );
4704
4703
if (!AllowRAAC && Reg == ARM::RA_AUTH_CODE)
4705
4704
return Error (RegLoc, " pseudo-register not allowed" );
@@ -4755,7 +4754,8 @@ bool ARMAsmParser::parseRegisterList(OperandVector &Operands, bool EnforceOrder,
4755
4754
" ) in register list" );
4756
4755
}
4757
4756
if (isQReg) {
4758
- EReg = MRI->getEncodingValue (++Reg);
4757
+ Reg = Reg + 1 ;
4758
+ EReg = MRI->getEncodingValue (Reg);
4759
4759
Registers.emplace_back (EReg, Reg);
4760
4760
}
4761
4761
}
@@ -4835,8 +4835,8 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
4835
4835
// use the custom matcher to convert to list if necessary
4836
4836
if (!hasMVE () && Parser.getTok ().is (AsmToken::Identifier)) {
4837
4837
SMLoc E = Parser.getTok ().getEndLoc ();
4838
- int Reg = tryParseRegister ();
4839
- if (Reg == - 1 )
4838
+ MCRegister Reg = tryParseRegister ();
4839
+ if (! Reg)
4840
4840
return ParseStatus::NoMatch;
4841
4841
if (ARMMCRegisterClasses[ARM::DPRRegClassID].contains (Reg)) {
4842
4842
ParseStatus Res = parseVectorLane (LaneKind, LaneIndex, E);
@@ -4889,12 +4889,12 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
4889
4889
Parser.Lex (); // Eat '{' token.
4890
4890
SMLoc RegLoc = Parser.getTok ().getLoc ();
4891
4891
4892
- int Reg = tryParseRegister ();
4893
- if (Reg == - 1 )
4892
+ MCRegister Reg = tryParseRegister ();
4893
+ if (! Reg)
4894
4894
return Error (RegLoc, " register expected" );
4895
4895
unsigned Count = 1 ;
4896
4896
int Spacing = 0 ;
4897
- unsigned FirstReg = Reg;
4897
+ MCRegister FirstReg = Reg;
4898
4898
4899
4899
if (hasMVE () && !ARMMCRegisterClasses[ARM::MQPRRegClassID].contains (Reg))
4900
4900
return Error (Parser.getTok ().getLoc (),
@@ -4905,7 +4905,7 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
4905
4905
FirstReg = Reg = getDRegFromQReg (Reg);
4906
4906
Spacing = 1 ; // double-spacing requires explicit D registers, otherwise
4907
4907
// it's ambiguous with four-register single spaced.
4908
- ++ Reg;
4908
+ Reg = Reg + 1 ;
4909
4909
++Count;
4910
4910
}
4911
4911
@@ -4923,8 +4923,8 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
4923
4923
" sequential registers in double spaced list" );
4924
4924
Parser.Lex (); // Eat the minus.
4925
4925
SMLoc AfterMinusLoc = Parser.getTok ().getLoc ();
4926
- int EndReg = tryParseRegister ();
4927
- if (EndReg == - 1 )
4926
+ MCRegister EndReg = tryParseRegister ();
4927
+ if (! EndReg)
4928
4928
return Error (AfterMinusLoc, " register expected" );
4929
4929
// Allow Q regs and just interpret them as the two D sub-registers.
4930
4930
if (!hasMVE () && ARMMCRegisterClasses[ARM::QPRRegClassID].contains (EndReg))
@@ -4957,9 +4957,9 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
4957
4957
}
4958
4958
Parser.Lex (); // Eat the comma.
4959
4959
RegLoc = Parser.getTok ().getLoc ();
4960
- int OldReg = Reg;
4960
+ MCRegister OldReg = Reg;
4961
4961
Reg = tryParseRegister ();
4962
- if (Reg == - 1 )
4962
+ if (! Reg)
4963
4963
return Error (RegLoc, " register expected" );
4964
4964
4965
4965
if (hasMVE ()) {
@@ -4983,7 +4983,7 @@ ParseStatus ARMAsmParser::parseVectorList(OperandVector &Operands) {
4983
4983
Reg = getDRegFromQReg (Reg);
4984
4984
if (Reg != OldReg + 1 )
4985
4985
return Error (RegLoc, " non-contiguous register range" );
4986
- ++ Reg;
4986
+ Reg = Reg + 1 ;
4987
4987
Count += 2 ;
4988
4988
// Parse the lane specifier if present.
4989
4989
VectorLaneTy NextLaneKind;
@@ -5674,8 +5674,8 @@ ParseStatus ARMAsmParser::parsePostIdxReg(OperandVector &Operands) {
5674
5674
}
5675
5675
5676
5676
SMLoc E = Parser.getTok ().getEndLoc ();
5677
- int Reg = tryParseRegister ();
5678
- if (Reg == - 1 ) {
5677
+ MCRegister Reg = tryParseRegister ();
5678
+ if (! Reg) {
5679
5679
if (!haveEaten)
5680
5680
return ParseStatus::NoMatch;
5681
5681
return Error (Parser.getTok ().getLoc (), " register expected" );
@@ -5752,8 +5752,8 @@ ParseStatus ARMAsmParser::parseAM3Offset(OperandVector &Operands) {
5752
5752
}
5753
5753
5754
5754
Tok = Parser.getTok ();
5755
- int Reg = tryParseRegister ();
5756
- if (Reg == - 1 ) {
5755
+ MCRegister Reg = tryParseRegister ();
5756
+ if (! Reg) {
5757
5757
if (!haveEaten)
5758
5758
return ParseStatus::NoMatch;
5759
5759
return Error (Tok.getLoc (), " register expected" );
@@ -5935,8 +5935,8 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
5935
5935
Parser.Lex (); // Eat left bracket token.
5936
5936
5937
5937
const AsmToken &BaseRegTok = Parser.getTok ();
5938
- int BaseRegNum = tryParseRegister ();
5939
- if (BaseRegNum == - 1 )
5938
+ MCRegister BaseReg = tryParseRegister ();
5939
+ if (!BaseReg )
5940
5940
return Error (BaseRegTok.getLoc (), " register expected" );
5941
5941
5942
5942
// The next token must either be a comma, a colon or a closing bracket.
@@ -5950,7 +5950,7 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
5950
5950
Parser.Lex (); // Eat right bracket token.
5951
5951
5952
5952
Operands.push_back (ARMOperand::CreateMem (
5953
- BaseRegNum , nullptr , 0 , ARM_AM::no_shift, 0 , 0 , false , S, E, *this ));
5953
+ BaseReg , nullptr , 0 , ARM_AM::no_shift, 0 , 0 , false , S, E, *this ));
5954
5954
5955
5955
// If there's a pre-indexing writeback marker, '!', just add it as a token
5956
5956
// operand. It's rather odd, but syntactically valid.
@@ -6006,7 +6006,7 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
6006
6006
6007
6007
// Don't worry about range checking the value here. That's handled by
6008
6008
// the is*() predicates.
6009
- Operands.push_back (ARMOperand::CreateMem (BaseRegNum , nullptr , 0 ,
6009
+ Operands.push_back (ARMOperand::CreateMem (BaseReg , nullptr , 0 ,
6010
6010
ARM_AM::no_shift, 0 , Align, false ,
6011
6011
S, E, *this , AlignmentLoc));
6012
6012
@@ -6050,7 +6050,7 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
6050
6050
AdjustedOffset = CE;
6051
6051
} else
6052
6052
AdjustedOffset = Offset;
6053
- Operands.push_back (ARMOperand::CreateMem (BaseRegNum , AdjustedOffset, 0 ,
6053
+ Operands.push_back (ARMOperand::CreateMem (BaseReg , AdjustedOffset, 0 ,
6054
6054
ARM_AM::no_shift, 0 , 0 , false , S,
6055
6055
E, *this ));
6056
6056
@@ -6082,8 +6082,8 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
6082
6082
}
6083
6083
6084
6084
E = Parser.getTok ().getLoc ();
6085
- int OffsetRegNum = tryParseRegister ();
6086
- if (OffsetRegNum == - 1 )
6085
+ MCRegister OffsetReg = tryParseRegister ();
6086
+ if (!OffsetReg )
6087
6087
return Error (E, " register expected" );
6088
6088
6089
6089
// If there's a shift operator, handle it.
@@ -6101,7 +6101,7 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
6101
6101
E = Parser.getTok ().getEndLoc ();
6102
6102
Parser.Lex (); // Eat right bracket token.
6103
6103
6104
- Operands.push_back (ARMOperand::CreateMem (BaseRegNum , nullptr , OffsetRegNum ,
6104
+ Operands.push_back (ARMOperand::CreateMem (BaseReg , nullptr , OffsetReg ,
6105
6105
ShiftType, ShiftImm, 0 , isNegative,
6106
6106
S, E, *this ));
6107
6107
@@ -12077,16 +12077,16 @@ bool ARMAsmParser::parseDirectiveSetFP(SMLoc L) {
12077
12077
12078
12078
// Parse fpreg
12079
12079
SMLoc FPRegLoc = Parser.getTok ().getLoc ();
12080
- int FPReg = tryParseRegister ();
12080
+ MCRegister FPReg = tryParseRegister ();
12081
12081
12082
- if (check (FPReg == - 1 , FPRegLoc, " frame pointer register expected" ) ||
12082
+ if (check (! FPReg, FPRegLoc, " frame pointer register expected" ) ||
12083
12083
Parser.parseComma ())
12084
12084
return true ;
12085
12085
12086
12086
// Parse spreg
12087
12087
SMLoc SPRegLoc = Parser.getTok ().getLoc ();
12088
- int SPReg = tryParseRegister ();
12089
- if (check (SPReg == - 1 , SPRegLoc, " stack pointer register expected" ) ||
12088
+ MCRegister SPReg = tryParseRegister ();
12089
+ if (check (! SPReg, SPRegLoc, " stack pointer register expected" ) ||
12090
12090
check (SPReg != ARM::SP && SPReg != UC.getFPReg (), SPRegLoc,
12091
12091
" register should be either $sp or the latest fp register" ))
12092
12092
return true ;
@@ -12404,8 +12404,8 @@ bool ARMAsmParser::parseDirectiveMovSP(SMLoc L) {
12404
12404
return Error (L, " unexpected .movsp directive" );
12405
12405
12406
12406
SMLoc SPRegLoc = Parser.getTok ().getLoc ();
12407
- int SPReg = tryParseRegister ();
12408
- if (SPReg == - 1 )
12407
+ MCRegister SPReg = tryParseRegister ();
12408
+ if (! SPReg)
12409
12409
return Error (SPRegLoc, " register expected" );
12410
12410
if (SPReg == ARM::SP || SPReg == ARM::PC)
12411
12411
return Error (SPRegLoc, " sp and pc are not permitted in .movsp directive" );
@@ -12542,8 +12542,8 @@ bool ARMAsmParser::parseDirectiveSEHSaveRegs(SMLoc L, bool Wide) {
12542
12542
// / parseDirectiveSEHSaveSP
12543
12543
// / ::= .seh_save_sp
12544
12544
bool ARMAsmParser::parseDirectiveSEHSaveSP (SMLoc L) {
12545
- int Reg = tryParseRegister ();
12546
- if (Reg == - 1 || !MRI->getRegClass (ARM::GPRRegClassID).contains (Reg))
12545
+ MCRegister Reg = tryParseRegister ();
12546
+ if (! Reg || !MRI->getRegClass (ARM::GPRRegClassID).contains (Reg))
12547
12547
return Error (L, " expected GPR" );
12548
12548
unsigned Index = MRI->getEncodingValue (Reg);
12549
12549
if (Index > 14 || Index == 13 )
0 commit comments