[llvm] r263411 - [AMDGPU] AsmParser: Factor out parseRegister. NFC.

Valery Pykhtin via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 14 00:43:43 PDT 2016


Author: vpykhtin
Date: Mon Mar 14 02:43:42 2016
New Revision: 263411

URL: http://llvm.org/viewvc/llvm-project?rev=263411&view=rev
Log:
[AMDGPU] AsmParser: Factor out parseRegister. NFC.

Modified:
    llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp

Modified: llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp?rev=263411&r1=263410&r2=263411&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp (original)
+++ llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp Mon Mar 14 02:43:42 2016
@@ -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
 }
 
 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(unsi
     // 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(unsi
     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(unsi
       // 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(unsi
 
   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(OperandVec
       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(OperandVec
           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(OperandVec
       } 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();
         }
       }




More information about the llvm-commits mailing list