Add immediate sub-registers.
[oota-llvm.git] / utils / TableGen / RegisterInfoEmitter.cpp
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