diff options
| author | Valery Pykhtin <Valery.Pykhtin@amd.com> | 2016-03-14 07:43:42 +0000 |
|---|---|---|
| committer | Valery Pykhtin <Valery.Pykhtin@amd.com> | 2016-03-14 07:43:42 +0000 |
| commit | 0f97f17152840ca0f3d5ea124984ba45bb04edbd (patch) | |
| tree | 1bbdb789847d012e0ca2aa4bcd51603c2d2117b1 | |
| parent | ae6d694ae7a1685b81c3924a3756b246f79cfb24 (diff) | |
| download | bcm5719-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.cpp | 64 |
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(); } } |

