Merge some tables in generated RegisterInfo file. Store indices into larger table...
authorCraig Topper <craig.topper@gmail.com>
Tue, 21 Feb 2012 06:22:36 +0000 (06:22 +0000)
committerCraig Topper <craig.topper@gmail.com>
Tue, 21 Feb 2012 06:22:36 +0000 (06:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151038 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCRegisterInfo.h

index 4d4e9f66d73b0689e5ae4289053a36aeace19403..2bf754ed9a91e92405edae21eee6b93a8819f129 100644 (file)
@@ -105,10 +105,10 @@ public:
 /// of AX.
 ///
 struct MCRegisterDesc {
-  const char     *Name;         // Printable name for the reg (for debugging)
-  const unsigned *Overlaps;     // Overlapping registers, described above
-  const unsigned *SubRegs;      // Sub-register set, described above
-  const unsigned *SuperRegs;    // Super-register set, described above
+  const char *Name;         // Printable name for the reg (for debugging)
+  int        Overlaps;      // Overlapping registers, described above
+  int        SubRegs;       // Sub-register set, described above
+  int        SuperRegs;     // Super-register set, described above
 };
 
 /// MCRegisterInfo base class - We assume that the target defines a static
@@ -132,6 +132,9 @@ private:
   unsigned RAReg;                             // Return address register
   const MCRegisterClass *Classes;             // Pointer to the regclass array
   unsigned NumClasses;                        // Number of entries in the array
+  const unsigned *Overlaps;                   // Pointer to the overlaps array
+  const unsigned *SubRegs;                    // Pointer to the subregs array
+  const unsigned *SuperRegs;                  // Pointer to the superregs array
   DenseMap<unsigned, int> L2DwarfRegs;        // LLVM to Dwarf regs mapping
   DenseMap<unsigned, int> EHL2DwarfRegs;      // LLVM to Dwarf regs mapping EH
   DenseMap<unsigned, unsigned> Dwarf2LRegs;   // Dwarf to LLVM regs mapping
@@ -142,11 +145,16 @@ public:
   /// InitMCRegisterInfo - Initialize MCRegisterInfo, called by TableGen
   /// auto-generated routines. *DO NOT USE*.
   void InitMCRegisterInfo(const MCRegisterDesc *D, unsigned NR, unsigned RA,
-                          const MCRegisterClass *C, unsigned NC) {
+                          const MCRegisterClass *C, unsigned NC,
+                          const unsigned *O, const unsigned *Sub,
+                          const unsigned *Super) {
     Desc = D;
     NumRegs = NR;
     RAReg = RA;
     Classes = C;
+    Overlaps = O;
+    SubRegs = Sub;
+    SuperRegs = Super;
     NumClasses = NC;
   }
 
@@ -204,7 +212,8 @@ public:
   ///
   const unsigned *getAliasSet(unsigned RegNo) const {
     // The Overlaps set always begins with Reg itself.
-    return get(RegNo).Overlaps + 1;
+    if (get(RegNo).Overlaps < 0) return 0;
+    return Overlaps + get(RegNo).Overlaps + 1;
   }
 
   /// getOverlaps - Return a list of registers that overlap Reg, including
@@ -213,7 +222,8 @@ public:
   /// These are exactly the registers in { x | regsOverlap(x, Reg) }.
   ///
   const unsigned *getOverlaps(unsigned RegNo) const {
-    return get(RegNo).Overlaps;
+    if (get(RegNo).Overlaps < 0) return 0;
+    return Overlaps + get(RegNo).Overlaps;
   }
 
   /// getSubRegisters - Return the list of registers that are sub-registers of
@@ -222,7 +232,8 @@ public:
   /// relations. e.g. X86::RAX's sub-register list is EAX, AX, AL, AH.
   ///
   const unsigned *getSubRegisters(unsigned RegNo) const {
-    return get(RegNo).SubRegs;
+    if (get(RegNo).SubRegs < 0) return 0;
+    return SubRegs + get(RegNo).SubRegs;
   }
 
   /// getSuperRegisters - Return the list of registers that are super-registers
@@ -231,7 +242,8 @@ public:
   /// relations. e.g. X86::AL's super-register list is AX, EAX, RAX.
   ///
   const unsigned *getSuperRegisters(unsigned RegNo) const {
-    return get(RegNo).SuperRegs;
+    if (get(RegNo).SuperRegs < 0) return 0;
+    return SuperRegs + get(RegNo).SuperRegs;
   }
 
   /// getName - Return the human-readable symbolic target-specific name for the