diff options
author | Bill Wendling <isanbard@gmail.com> | 2010-11-06 19:56:04 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2010-11-06 19:56:04 +0000 |
commit | 8d5acb7007decaf0c30bf4a3d4c55e5cc2cce0a7 (patch) | |
tree | 6cd1843fd1373f4a178f757fade8ae6f43da13ea | |
parent | 98c870f87b7f0c996a9ba67003d88d434d6dbcd0 (diff) |
Add a RegList (register list) object to ARMOperand. It will be used soon to hold
(surprise!) a list of registers. Register lists are consecutive, so we only need
to record the start register plus the number of registers.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118351 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 8b16d63ead..86a1bb679a 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -42,7 +42,6 @@ class ARMAsmParser : public TargetAsmParser { MCAsmParser &Parser; TargetMachine &TM; -private: MCAsmParser &getParser() const { return Parser; } MCAsmLexer &getLexer() const { return Parser.getLexer(); } @@ -118,6 +117,7 @@ public: Immediate, Memory, Register, + RegisterList, Token } Kind; @@ -138,6 +138,11 @@ public: bool Writeback; } Reg; + struct { + unsigned RegStart; + unsigned Number; + } RegList; + struct { const MCExpr *Val; } Imm; @@ -174,6 +179,9 @@ public: case Register: Reg = o.Reg; break; + case RegisterList: + RegList = o.RegList; + break; case Immediate: Imm = o.Imm; break; @@ -203,6 +211,11 @@ public: return Reg.RegNum; } + std::pair<unsigned, unsigned> getRegList() const { + assert(Kind == RegisterList && "Invalid access!"); + return std::make_pair(RegList.RegStart, RegList.Number); + } + const MCExpr *getImm() const { assert(Kind == Immediate && "Invalid access!"); return Imm.Val; @@ -211,6 +224,7 @@ public: bool isCondCode() const { return Kind == CondCode; } bool isImm() const { return Kind == Immediate; } bool isReg() const { return Kind == Register; } + bool isRegList() const { return Kind == RegisterList; } bool isToken() const { return Kind == Token; } bool isMemory() const { return Kind == Memory; } @@ -312,6 +326,16 @@ public: return Op; } + static ARMOperand *CreateRegList(unsigned RegStart, unsigned Number, + SMLoc S, SMLoc E) { + ARMOperand *Op = new ARMOperand(RegisterList); + Op->RegList.RegStart = RegStart; + Op->RegList.Number = Number; + Op->StartLoc = S; + Op->EndLoc = E; + return Op; + } + static ARMOperand *CreateImm(const MCExpr *Val, SMLoc S, SMLoc E) { ARMOperand *Op = new ARMOperand(Immediate); Op->Imm.Val = Val; @@ -364,6 +388,19 @@ void ARMOperand::dump(raw_ostream &OS) const { case Register: OS << "<register " << getReg() << ">"; break; + case RegisterList: { + OS << "<register_list "; + std::pair<unsigned, unsigned> List = getRegList(); + unsigned RegEnd = List.first + List.second; + + for (unsigned Idx = List.first; Idx < RegEnd; ) { + OS << Idx; + if (++Idx < RegEnd) OS << ", "; + } + + OS << ">"; + break; + } case Token: OS << "'" << getToken() << "'"; break; |