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. _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits