Add immediate sub-registers.
authorEvan Cheng <evan.cheng@apple.com>
Tue, 26 Jun 2007 20:59:16 +0000 (20:59 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 26 Jun 2007 20:59:16 +0000 (20:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37738 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/MRegisterInfo.h
utils/TableGen/RegisterInfoEmitter.cpp

index ea10c1cc47bfb91d87102a8dba73c225adca1ff9..d6d3fb4e50071c4b2c018605de2a51370d161206 100644 (file)
@@ -48,6 +48,7 @@ struct TargetRegisterDesc {
   const char     *Name;         // Assembly language name for the register
   const unsigned *AliasSet;     // Register Alias Set, described above
   const unsigned *SubRegs;      // Sub-register set, described above
+  const unsigned *ImmSubRegs;   // Immediate sub-register set, described above
   const unsigned *SuperRegs;    // Super-register set, described above
 };
 
@@ -326,6 +327,14 @@ public:
     return get(RegNo).SubRegs;
   }
 
+  /// getImmediateSubRegisters - Return the set of registers that are immediate
+  /// sub-registers of the specified register, or a null list of there are none.
+  /// The list returned is zero terminated.
+  ///
+  const unsigned *getImmediateSubRegisters(unsigned RegNo) const {
+    return get(RegNo).ImmSubRegs;
+  }
+
   /// getSuperRegisters - Return the set of registers that are super-registers
   /// of the specified register, or a null list of there are none. The list
   /// returned is zero terminated.
index a2269a83fc719870fe3f985847f24eeb4d2729b7..9a1ef8594b9c08fdebd8536eaa7f2971838c65cd 100644 (file)
@@ -359,6 +359,7 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
   OS << "  };\n";
 
   // Emit register sub-registers / super-registers, aliases...
+  std::map<Record*, std::set<Record*> > RegisterImmSubRegs;
   std::map<Record*, std::set<Record*> > RegisterSubRegs;
   std::map<Record*, std::set<Record*> > RegisterSuperRegs;
   std::map<Record*, std::set<Record*> > RegisterAliases;
@@ -397,6 +398,7 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
         cerr << "Warning: register " << getQualifiedName(SubReg)
              << " specified as a sub-register of " << getQualifiedName(R)
              << " multiple times!\n";
+      RegisterImmSubRegs[R].insert(SubReg);
       addSubSuperReg(R, SubReg, RegisterSubRegs, RegisterSuperRegs,
                      RegisterAliases, *this);
     }
@@ -434,6 +436,21 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
     OS << "0 };\n";
   }
 
+  if (!RegisterImmSubRegs.empty())
+    OS << "\n\n  // Register Immediate Sub-registers Sets...\n";
+
+  // Loop over all of the registers which have sub-registers, emitting the
+  // sub-registers list to memory.
+  for (std::map<Record*, std::set<Record*> >::iterator
+         I = RegisterImmSubRegs.begin(), E = RegisterImmSubRegs.end();
+       I != E; ++I) {
+    OS << "  const unsigned " << I->first->getName() << "_ImmSubRegsSet[] = { ";
+    for (std::set<Record*>::iterator ASI = I->second.begin(),
+           E = I->second.end(); ASI != E; ++ASI)
+      OS << getQualifiedName(*ASI) << ", ";
+    OS << "0 };\n";
+  }
+
   if (!RegisterSuperRegs.empty())
     OS << "\n\n  // Register Super-registers Sets...\n";
 
@@ -472,6 +489,10 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
       OS << Reg.getName() << "_SubRegsSet,\t";
     else
       OS << "Empty_SubRegsSet,\t";
+    if (RegisterImmSubRegs.count(Reg.TheDef))
+      OS << Reg.getName() << "_ImmSubRegsSet,\t";
+    else
+      OS << "Empty_SubRegsSet,\t";
     if (RegisterSuperRegs.count(Reg.TheDef))
       OS << Reg.getName() << "_SuperRegsSet },\n";
     else