[llvm-commits] CVS: llvm/utils/TableGen/RegisterInfoEmitter.cpp

Chris Lattner lattner at cs.uiuc.edu
Thu Sep 29 23:44:57 PDT 2005



Changes in directory llvm/utils/TableGen:

RegisterInfoEmitter.cpp updated: 1.31 -> 1.32
---
Log message:

Compute a preferred spill register class for each callee-save register


---
Diffs of the changes:  (+24 -1)

 RegisterInfoEmitter.cpp |   25 ++++++++++++++++++++++++-
 1 files changed, 24 insertions(+), 1 deletion(-)


Index: llvm/utils/TableGen/RegisterInfoEmitter.cpp
diff -u llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.31 llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.32
--- llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.31	Thu Sep 29 20:33:48 2005
+++ llvm/utils/TableGen/RegisterInfoEmitter.cpp	Fri Sep 30 01:44:45 2005
@@ -59,6 +59,7 @@
      << "  " << ClassName
      << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
      << "  const unsigned* getCalleeSaveRegs() const;\n"
+     << "const TargetRegisterClass* const *getCalleeSaveRegClasses() const;\n"
      << "};\n\n";
 
   const std::vector<CodeGenRegisterClass> &RegisterClasses =
@@ -244,7 +245,7 @@
      << ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n "
      << "                 CallFrameSetupOpcode, CallFrameDestroyOpcode) {}\n\n";
 
-  // Emit the getCalleeSaveRegs method...
+  // Emit the getCalleeSaveRegs method.
   OS << "const unsigned* " << ClassName << "::getCalleeSaveRegs() const {\n"
      << "  static const unsigned CalleeSaveRegs[] = {\n    ";
 
@@ -252,5 +253,27 @@
   for (unsigned i = 0, e = CSR.size(); i != e; ++i)
     OS << getQualifiedName(CSR[i]) << ", ";
   OS << " 0\n  };\n  return CalleeSaveRegs;\n}\n\n";
+  
+  // Emit information about the callee saved register classes.
+  OS << "const TargetRegisterClass* const*\n" << ClassName
+     << "::getCalleeSaveRegClasses() const {\n"
+     << "  static const TargetRegisterClass * const "
+     << "CalleeSaveRegClasses[] = {\n    ";
+  
+  for (unsigned i = 0, e = CSR.size(); i != e; ++i) {
+    Record *R = CSR[i];
+    std::multimap<Record*, const CodeGenRegisterClass*>::iterator I, E;
+    tie(I, E) = RegClassesBelongedTo.equal_range(R);
+    if (I == E)
+      throw "Callee saved register '" + R->getName() +
+            "' must belong to a register class for spilling.\n";
+    const CodeGenRegisterClass *RC = (I++)->second;
+    for (; I != E; ++I)
+      if (RC->SpillSize < I->second->SpillSize)
+        RC = I->second;
+    OS << "&" << getQualifiedName(RC->TheDef) << "RegClass, ";
+  }
+  OS << " 0\n  };\n  return CalleeSaveRegClasses;\n}\n\n";
+
   OS << "} // End llvm namespace \n";
 }






More information about the llvm-commits mailing list