@@ -908,6 +908,8 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
908
908
bool ParseAMDGPURegister (RegisterKind& RegKind, unsigned & Reg,
909
909
unsigned & RegNum, unsigned & RegWidth,
910
910
unsigned *DwordRegIndex);
911
+ bool isRegister ();
912
+ bool isRegister (const AsmToken &Token, const AsmToken &NextToken) const ;
911
913
Optional<StringRef> getGprCountSymbolName (RegisterKind RegKind);
912
914
void initializeGprCountSymbol (RegisterKind RegKind);
913
915
bool updateGprCountSymbols (RegisterKind RegKind, unsigned DwordRegIndex,
@@ -1125,11 +1127,19 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
1125
1127
bool isInlineConstant (const MCInst &Inst, unsigned OpIdx) const ;
1126
1128
unsigned findImplicitSGPRReadInVOP (const MCInst &Inst) const ;
1127
1129
1130
+ bool isId (const StringRef Id) const ;
1131
+ bool isId (const AsmToken &Token, const StringRef Id) const ;
1132
+ bool isToken (const AsmToken::TokenKind Kind) const ;
1128
1133
bool trySkipId (const StringRef Id);
1129
1134
bool trySkipToken (const AsmToken::TokenKind Kind);
1130
1135
bool skipToken (const AsmToken::TokenKind Kind, const StringRef ErrMsg);
1131
1136
bool parseString (StringRef &Val, const StringRef ErrMsg = " expected a string" );
1137
+ AsmToken::TokenKind getTokenKind () const ;
1132
1138
bool parseExpr (int64_t &Imm);
1139
+ AsmToken peekToken ();
1140
+ AsmToken getToken () const ;
1141
+ SMLoc getLoc () const ;
1142
+ void lex ();
1133
1143
1134
1144
public:
1135
1145
OperandMatchResultTy parseOptionalOperand (OperandVector &Operands);
@@ -1748,6 +1758,51 @@ bool AMDGPUAsmParser::AddNextRegisterToList(unsigned &Reg, unsigned &RegWidth,
1748
1758
}
1749
1759
}
1750
1760
1761
+ static const StringRef Registers[] = {
1762
+ { " v" },
1763
+ { " s" },
1764
+ { " ttmp" },
1765
+ };
1766
+
1767
+ bool
1768
+ AMDGPUAsmParser::isRegister (const AsmToken &Token,
1769
+ const AsmToken &NextToken) const {
1770
+
1771
+ // A list of consecutive registers: [s0,s1,s2,s3]
1772
+ if (Token.is (AsmToken::LBrac))
1773
+ return true ;
1774
+
1775
+ if (!Token.is (AsmToken::Identifier))
1776
+ return false ;
1777
+
1778
+ // A single register like s0 or a range of registers like s[0:1]
1779
+
1780
+ StringRef RegName = Token.getString ();
1781
+
1782
+ for (StringRef Reg : Registers) {
1783
+ if (RegName.startswith (Reg)) {
1784
+ if (Reg.size () < RegName.size ()) {
1785
+ unsigned RegNum;
1786
+ // A single register with an index: rXX
1787
+ if (!RegName.substr (Reg.size ()).getAsInteger (10 , RegNum))
1788
+ return true ;
1789
+ } else {
1790
+ // A range of registers: r[XX:YY].
1791
+ if (NextToken.is (AsmToken::LBrac))
1792
+ return true ;
1793
+ }
1794
+ }
1795
+ }
1796
+
1797
+ return getSpecialRegForName (RegName);
1798
+ }
1799
+
1800
+ bool
1801
+ AMDGPUAsmParser::isRegister ()
1802
+ {
1803
+ return isRegister (getToken (), peekToken ());
1804
+ }
1805
+
1751
1806
bool AMDGPUAsmParser::ParseAMDGPURegister (RegisterKind &RegKind, unsigned &Reg,
1752
1807
unsigned &RegNum, unsigned &RegWidth,
1753
1808
unsigned *DwordRegIndex) {
@@ -1933,6 +1988,8 @@ std::unique_ptr<AMDGPUOperand> AMDGPUAsmParser::parseRegister() {
1933
1988
unsigned Reg, RegNum, RegWidth, DwordRegIndex;
1934
1989
1935
1990
if (!ParseAMDGPURegister (RegKind, Reg, RegNum, RegWidth, &DwordRegIndex)) {
1991
+ // FIXME: improve error messages (bug 41303).
1992
+ Error (StartLoc, " not a valid operand." );
1936
1993
return nullptr ;
1937
1994
}
1938
1995
if (AMDGPU::IsaInfo::hasCodeObjectV3 (&getSTI ())) {
@@ -2012,23 +2069,24 @@ AMDGPUAsmParser::parseImm(OperandVector &Operands, bool AbsMod) {
2012
2069
2013
2070
OperandMatchResultTy
2014
2071
AMDGPUAsmParser::parseReg (OperandVector &Operands) {
2072
+ if (!isRegister ())
2073
+ return MatchOperand_NoMatch;
2074
+
2015
2075
if (auto R = parseRegister ()) {
2016
2076
assert (R->isReg ());
2017
2077
R->Reg .IsForcedVOP3 = isForcedVOP3 ();
2018
2078
Operands.push_back (std::move (R));
2019
2079
return MatchOperand_Success;
2020
2080
}
2021
- return MatchOperand_NoMatch ;
2081
+ return MatchOperand_ParseFail ;
2022
2082
}
2023
2083
2024
2084
OperandMatchResultTy
2025
2085
AMDGPUAsmParser::parseRegOrImm (OperandVector &Operands, bool AbsMod) {
2026
- auto res = parseImm (Operands, AbsMod);
2027
- if (res != MatchOperand_NoMatch) {
2028
- return res;
2029
- }
2030
-
2031
- return parseReg (Operands);
2086
+ auto res = parseReg (Operands);
2087
+ return (res == MatchOperand_NoMatch)?
2088
+ parseImm (Operands, AbsMod) :
2089
+ res;
2032
2090
}
2033
2091
2034
2092
OperandMatchResultTy
@@ -2195,21 +2253,24 @@ AMDGPUAsmParser::parseRegWithIntInputMods(OperandVector &Operands) {
2195
2253
}
2196
2254
2197
2255
OperandMatchResultTy AMDGPUAsmParser::parseVReg32OrOff (OperandVector &Operands) {
2256
+ auto Loc = getLoc ();
2257
+ if (trySkipId (" off" )) {
2258
+ Operands.push_back (AMDGPUOperand::CreateImm (this , 0 , Loc,
2259
+ AMDGPUOperand::ImmTyOff, false ));
2260
+ return MatchOperand_Success;
2261
+ }
2262
+
2263
+ if (!isRegister ())
2264
+ return MatchOperand_NoMatch;
2265
+
2198
2266
std::unique_ptr<AMDGPUOperand> Reg = parseRegister ();
2199
2267
if (Reg) {
2200
2268
Operands.push_back (std::move (Reg));
2201
2269
return MatchOperand_Success;
2202
2270
}
2203
2271
2204
- const AsmToken &Tok = Parser.getTok ();
2205
- if (Tok.getString () == " off" ) {
2206
- Operands.push_back (AMDGPUOperand::CreateImm (this , 0 , Tok.getLoc (),
2207
- AMDGPUOperand::ImmTyOff, false ));
2208
- Parser.Lex ();
2209
- return MatchOperand_Success;
2210
- }
2272
+ return MatchOperand_ParseFail;
2211
2273
2212
- return MatchOperand_NoMatch;
2213
2274
}
2214
2275
2215
2276
unsigned AMDGPUAsmParser::checkTargetMatchPredicate (MCInst &Inst) {
@@ -3520,7 +3581,7 @@ AMDGPUAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
3520
3581
3521
3582
ResTy = parseRegOrImm (Operands);
3522
3583
3523
- if (ResTy == MatchOperand_Success)
3584
+ if (ResTy == MatchOperand_Success || ResTy == MatchOperand_ParseFail )
3524
3585
return ResTy;
3525
3586
3526
3587
const auto &Tok = Parser.getTok ();
@@ -4491,20 +4552,34 @@ bool AMDGPUOperand::isSendMsg() const {
4491
4552
// parser helpers
4492
4553
// ===----------------------------------------------------------------------===//
4493
4554
4555
+ bool
4556
+ AMDGPUAsmParser::isId (const AsmToken &Token, const StringRef Id) const {
4557
+ return Token.is (AsmToken::Identifier) && Token.getString () == Id;
4558
+ }
4559
+
4560
+ bool
4561
+ AMDGPUAsmParser::isId (const StringRef Id) const {
4562
+ return isId (getToken (), Id);
4563
+ }
4564
+
4565
+ bool
4566
+ AMDGPUAsmParser::isToken (const AsmToken::TokenKind Kind) const {
4567
+ return getTokenKind () == Kind;
4568
+ }
4569
+
4494
4570
bool
4495
4571
AMDGPUAsmParser::trySkipId (const StringRef Id) {
4496
- if (getLexer ().getKind () == AsmToken::Identifier &&
4497
- Parser.getTok ().getString () == Id) {
4498
- Parser.Lex ();
4572
+ if (isId (Id)) {
4573
+ lex ();
4499
4574
return true ;
4500
4575
}
4501
4576
return false ;
4502
4577
}
4503
4578
4504
4579
bool
4505
4580
AMDGPUAsmParser::trySkipToken (const AsmToken::TokenKind Kind) {
4506
- if (getLexer (). getKind () == Kind) {
4507
- Parser. Lex ();
4581
+ if (isToken ( Kind) ) {
4582
+ lex ();
4508
4583
return true ;
4509
4584
}
4510
4585
return false ;
@@ -4514,7 +4589,7 @@ bool
4514
4589
AMDGPUAsmParser::skipToken (const AsmToken::TokenKind Kind,
4515
4590
const StringRef ErrMsg) {
4516
4591
if (!trySkipToken (Kind)) {
4517
- Error (Parser. getTok (). getLoc (), ErrMsg);
4592
+ Error (getLoc (), ErrMsg);
4518
4593
return false ;
4519
4594
}
4520
4595
return true ;
@@ -4527,17 +4602,41 @@ AMDGPUAsmParser::parseExpr(int64_t &Imm) {
4527
4602
4528
4603
bool
4529
4604
AMDGPUAsmParser::parseString (StringRef &Val, const StringRef ErrMsg) {
4530
- SMLoc S = Parser.getTok ().getLoc ();
4531
- if (getLexer ().getKind () == AsmToken::String) {
4532
- Val = Parser.getTok ().getStringContents ();
4533
- Parser.Lex ();
4605
+ if (isToken (AsmToken::String)) {
4606
+ Val = getToken ().getStringContents ();
4607
+ lex ();
4534
4608
return true ;
4535
4609
} else {
4536
- Error (S , ErrMsg);
4610
+ Error (getLoc () , ErrMsg);
4537
4611
return false ;
4538
4612
}
4539
4613
}
4540
4614
4615
+ AsmToken
4616
+ AMDGPUAsmParser::getToken () const {
4617
+ return Parser.getTok ();
4618
+ }
4619
+
4620
+ AsmToken
4621
+ AMDGPUAsmParser::peekToken () {
4622
+ return getLexer ().peekTok ();
4623
+ }
4624
+
4625
+ AsmToken::TokenKind
4626
+ AMDGPUAsmParser::getTokenKind () const {
4627
+ return getLexer ().getKind ();
4628
+ }
4629
+
4630
+ SMLoc
4631
+ AMDGPUAsmParser::getLoc () const {
4632
+ return getToken ().getLoc ();
4633
+ }
4634
+
4635
+ void
4636
+ AMDGPUAsmParser::lex () {
4637
+ Parser.Lex ();
4638
+ }
4639
+
4541
4640
// ===----------------------------------------------------------------------===//
4542
4641
// swizzle
4543
4642
// ===----------------------------------------------------------------------===//
0 commit comments