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

Jim Laskey jlaskey at apple.com
Wed Jul 12 12:15:55 PDT 2006



Changes in directory llvm/utils/TableGen:

CodeEmitterGen.cpp updated: 1.45 -> 1.46
---
Log message:

Move base value of instruction to lookup table to prepare for case reduction.


---
Diffs of the changes:  (+37 -17)

 CodeEmitterGen.cpp |   54 ++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 37 insertions(+), 17 deletions(-)


Index: llvm/utils/TableGen/CodeEmitterGen.cpp
diff -u llvm/utils/TableGen/CodeEmitterGen.cpp:1.45 llvm/utils/TableGen/CodeEmitterGen.cpp:1.46
--- llvm/utils/TableGen/CodeEmitterGen.cpp:1.45	Mon Jul 10 20:25:59 2006
+++ llvm/utils/TableGen/CodeEmitterGen.cpp	Wed Jul 12 14:15:43 2006
@@ -77,21 +77,30 @@
 
   EmitSourceFileHeader("Machine Code Emitter", o);
   std::string Namespace = Insts[0]->getValueAsString("Namespace") + "::";
+  
+  std::vector<const CodeGenInstruction*> NumberedInstructions;
+  Target.getInstructionsByEnumValue(NumberedInstructions);
 
   // Emit function declaration
   o << "unsigned " << Target.getName() << "CodeEmitter::"
-    << "getBinaryCodeForInstr(MachineInstr &MI) {\n"
-    << "  unsigned Value = 0;\n"
-    << "  switch (MI.getOpcode()) {\n";
+    << "getBinaryCodeForInstr(MachineInstr &MI) {\n";
 
-  // Emit a case statement for each opcode
-  for (std::vector<Record*>::iterator I = Insts.begin(), E = Insts.end();
-       I != E; ++I) {
-    Record *R = *I;
-    if (R->getName() == "PHI" || R->getName() == "INLINEASM") continue;
+  // Emit instruction base values
+  o << "  static const unsigned InstBits[] = {\n";
+  for (std::vector<const CodeGenInstruction*>::iterator
+          IN = NumberedInstructions.begin(),
+          EN = NumberedInstructions.end();
+       IN != EN; ++IN) {
+    const CodeGenInstruction *CGI = *IN;
+    Record *R = CGI->TheDef;
+    
+    if (IN != NumberedInstructions.begin()) o << ",\n";
+    
+    if (R->getName() == "PHI" || R->getName() == "INLINEASM") {
+      o << "    0U";
+      continue;
+    }
     
-    o << "    case " << Namespace << R->getName() << ": {\n";
-
     BitsInit *BI = R->getValueAsBitsInit("Inst");
 
     // For little-endian instruction bit encodings, reverse the bit order
@@ -119,20 +128,31 @@
     unsigned Value = 0;
     const std::vector<RecordVal> &Vals = R->getValues();
 
-    DEBUG(o << "      // prefilling: ");
     // Start by filling in fixed values...
     for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) {
       if (BitInit *B = dynamic_cast<BitInit*>(BI->getBit(e-i-1))) {
         Value |= B->getValue() << (e-i-1);
-        DEBUG(o << B->getValue());
-      } else {
-        DEBUG(o << "0");
       }
     }
-    DEBUG(o << "\n");
+    o << "    " << Value << "U";
+  }
+  o << "\n  };\n";
 
-    DEBUG(o << "      // " << *R->getValue("Inst") << "\n");
-    o << "      Value = " << Value << "U;\n\n";
+  // Emit initial function code
+  o << "  const unsigned opcode = MI.getOpcode();\n"
+    << "  unsigned Value = InstBits[opcode];\n"
+    << "  switch (opcode) {\n";
+
+  // Emit a case statement for each opcode
+  for (std::vector<Record*>::iterator I = Insts.begin(), E = Insts.end();
+       I != E; ++I) {
+    Record *R = *I;
+    if (R->getName() == "PHI" || R->getName() == "INLINEASM") continue;
+    
+    o << "    case " << Namespace << R->getName() << ": {\n";
+
+    BitsInit *BI = R->getValueAsBitsInit("Inst");
+    const std::vector<RecordVal> &Vals = R->getValues();
 
     // Loop over all of the fields in the instruction, determining which are the
     // operands to the instruction.






More information about the llvm-commits mailing list