summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorValery Pykhtin <Valery.Pykhtin@amd.com>2016-03-14 07:43:42 +0000
committerValery Pykhtin <Valery.Pykhtin@amd.com>2016-03-14 07:43:42 +0000
commit0f97f17152840ca0f3d5ea124984ba45bb04edbd (patch)
tree1bbdb789847d012e0ca2aa4bcd51603c2d2117b1
parentae6d694ae7a1685b81c3924a3756b246f79cfb24 (diff)
downloadbcm5719-llvm-0f97f17152840ca0f3d5ea124984ba45bb04edbd.tar.gz
bcm5719-llvm-0f97f17152840ca0f3d5ea124984ba45bb04edbd.zip
[AMDGPU] AsmParser: Factor out parseRegister. NFC.
llvm-svn: 263411
-rw-r--r--llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp64
1 files changed, 40 insertions, 24 deletions
diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
index e9c1c2d811f..bcb427cac40 100644
--- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
+++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
@@ -493,6 +493,7 @@ public:
return ForcedEncodingSize == 64;
}
+ std::unique_ptr<AMDGPUOperand> parseRegister();
bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override;
unsigned checkTargetMatchPredicate(MCInst &Inst) override;
bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
@@ -614,22 +615,35 @@ static unsigned getRegForName(StringRef RegName) {
}
bool AMDGPUAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) {
- const AsmToken Tok = Parser.getTok();
- StartLoc = Tok.getLoc();
- EndLoc = Tok.getEndLoc();
+ auto R = parseRegister();
+ if (!R) return true;
+ assert(R->isReg());
+ RegNo = R->getReg();
+ StartLoc = R->getStartLoc();
+ EndLoc = R->getEndLoc();
+ return false;
+}
+
+std::unique_ptr<AMDGPUOperand> AMDGPUAsmParser::parseRegister() {
+ const AsmToken &Tok = Parser.getTok();
+ SMLoc StartLoc = Tok.getLoc();
+ SMLoc EndLoc = Tok.getEndLoc();
const MCRegisterInfo *TRI = getContext().getRegisterInfo();
StringRef RegName = Tok.getString();
- RegNo = getRegForName(RegName);
+ unsigned RegNo = getRegForName(RegName);
if (RegNo) {
Parser.Lex();
- return !subtargetHasRegister(*TRI, RegNo);
+ if (!subtargetHasRegister(*TRI, RegNo))
+ return nullptr;
+ return AMDGPUOperand::CreateReg(RegNo, StartLoc, EndLoc,
+ TRI, &getSTI(), false);
}
// Match vgprs and sgprs
if (RegName[0] != 's' && RegName[0] != 'v')
- return true;
+ return nullptr;
bool IsVgpr = RegName[0] == 'v';
unsigned RegWidth;
@@ -638,7 +652,7 @@ bool AMDGPUAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &End
// We have a 32-bit register
RegWidth = 1;
if (RegName.substr(1).getAsInteger(10, RegIndexInClass))
- return true;
+ return nullptr;
Parser.Lex();
} else {
// We have a register greater than 32-bits.
@@ -646,21 +660,21 @@ bool AMDGPUAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &End
int64_t RegLo, RegHi;
Parser.Lex();
if (getLexer().isNot(AsmToken::LBrac))
- return true;
+ return nullptr;
Parser.Lex();
if (getParser().parseAbsoluteExpression(RegLo))
- return true;
+ return nullptr;
if (getLexer().isNot(AsmToken::Colon))
- return true;
+ return nullptr;
Parser.Lex();
if (getParser().parseAbsoluteExpression(RegHi))
- return true;
+ return nullptr;
if (getLexer().isNot(AsmToken::RBrac))
- return true;
+ return nullptr;
Parser.Lex();
RegWidth = (RegHi - RegLo) + 1;
@@ -671,7 +685,7 @@ bool AMDGPUAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &End
// SGPR registers are aligned. Max alignment is 4 dwords.
unsigned Size = std::min(RegWidth, 4u);
if (RegLo % Size != 0)
- return true;
+ return nullptr;
RegIndexInClass = RegLo / Size;
}
@@ -679,14 +693,18 @@ bool AMDGPUAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &End
int RCID = getRegClass(IsVgpr, RegWidth);
if (RCID == -1)
- return true;
+ return nullptr;
const MCRegisterClass RC = TRI->getRegClass(RCID);
if (RegIndexInClass >= RC.getNumRegs())
- return true;
+ return nullptr;
RegNo = RC.getRegister(RegIndexInClass);
- return !subtargetHasRegister(*TRI, RegNo);
+ if (!subtargetHasRegister(*TRI, RegNo))
+ return nullptr;
+
+ return AMDGPUOperand::CreateReg(RegNo, StartLoc, EndLoc,
+ TRI, &getSTI(), false);
}
unsigned AMDGPUAsmParser::checkTargetMatchPredicate(MCInst &Inst) {
@@ -1085,9 +1103,7 @@ AMDGPUAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
return MatchOperand_Success;
}
case AsmToken::Identifier: {
- SMLoc S, E;
- unsigned RegNo;
- if (!ParseRegister(RegNo, S, E)) {
+ if (auto R = parseRegister()) {
unsigned Modifiers = 0;
if (Negate)
@@ -1106,9 +1122,8 @@ AMDGPUAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
Parser.Lex();
Modifiers |= 0x2;
}
- auto R = AMDGPUOperand::CreateReg(RegNo, S, E,
- getContext().getRegisterInfo(),
- &getSTI(), isForcedVOP3());
+ assert(R->isReg());
+ R->Reg.IsForcedVOP3 = isForcedVOP3();
if (Modifiers) {
R->setModifiers(Modifiers);
}
@@ -1116,8 +1131,9 @@ AMDGPUAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
} else {
ResTy = parseVOP3OptionalOps(Operands);
if (ResTy == MatchOperand_NoMatch) {
- Operands.push_back(AMDGPUOperand::CreateToken(Parser.getTok().getString(),
- S));
+ const auto &Tok = Parser.getTok();
+ Operands.push_back(AMDGPUOperand::CreateToken(Tok.getString(),
+ Tok.getLoc()));
Parser.Lex();
}
}
OpenPOWER on IntegriCloud