CodeEmitterGen.cpp revision ffaee3755604e8227cefb209d4741f108ae16b0e
1c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner//===- CodeEmitterGen.cpp - Code Emitter Generator ------------------------===//
2c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner//
3c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner// FIXME: Document.
4c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner//
5c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner//===----------------------------------------------------------------------===//
6c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner
79fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman#include "CodeEmitterGen.h"
8c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner#include "Record.h"
9c648dabf65c67d20c208ed0b39b9622387e636c7Chris Lattner#include "Support/Debug.h"
109fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
11048c00db1cd05bbbd616e0eff71756eebd45f6b4Chris Lattnervoid CodeEmitterGen::run(std::ostream &o) {
12048c00db1cd05bbbd616e0eff71756eebd45f6b4Chris Lattner  std::vector<Record*> Insts = Records.getAllDerivedDefinitions("Instruction");
139fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
149fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  std::string Namespace = "V9::";
159fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  std::string ClassName = "SparcV9CodeEmitter::";
169fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
179fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  //const std::string &Namespace = Inst->getValue("Namespace")->getName();
18b9dd8154b6f0c64c7e6703b11fa5d25e1375a8dfMisha Brukman  o << "unsigned " << ClassName
199fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "getBinaryCodeForInstr(MachineInstr &MI) {\n"
209fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "  unsigned Value = 0;\n"
21f4ef4c881f851ae019f9f48d5473f9f1586d1dbcMisha Brukman    << "  DEBUG(std::cerr << MI);\n"
229fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "  switch (MI.getOpcode()) {\n";
239fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  for (std::vector<Record*>::iterator I = Insts.begin(), E = Insts.end();
24cf1b5853127352096ea6c2f8ec130f809168da2fChris Lattner       I != E; ++I) {
259fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    Record *R = *I;
26ecc7fd3c56f482ecb4ea42d2cf83e54f73dfb69aMisha Brukman    o << "    case " << Namespace << R->getName() << ": {\n"
27f4ef4c881f851ae019f9f48d5473f9f1586d1dbcMisha Brukman      << "      DEBUG(std::cerr << \"Emitting " << R->getName() << "\\n\");\n";
289fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
296f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner    BitsInit *BI = R->getValueAsBitsInit("Inst");
309fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
319fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    unsigned Value = 0;
329fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    const std::vector<RecordVal> &Vals = R->getValues();
339fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
34f6e5217b54441866dec596c1be20747036440cd4Misha Brukman    DEBUG(o << "      // prefilling: ");
359fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    // Start by filling in fixed values...
36cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) {
37cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      if (BitInit *B = dynamic_cast<BitInit*>(BI->getBit(e-i-1))) {
38cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        Value |= B->getValue() << (e-i-1);
39f6e5217b54441866dec596c1be20747036440cd4Misha Brukman        DEBUG(o << B->getValue());
40cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      } else {
41f6e5217b54441866dec596c1be20747036440cd4Misha Brukman        DEBUG(o << "0");
42cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      }
43cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    }
44f6e5217b54441866dec596c1be20747036440cd4Misha Brukman    DEBUG(o << "\n");
459fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
466f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner    DEBUG(o << "      // " << *R->getValue("Inst") << "\n");
47cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    o << "      Value = " << Value << "U;\n\n";
489fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
49d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner    // Loop over all of the fields in the instruction determining which are the
50d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner    // operands to the instruction.
519fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    //
52cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    unsigned op = 0;
53d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner    std::map<std::string, unsigned> OpOrder;
54d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner    std::map<std::string, bool> OpContinuous;
559fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
56d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner      if (!Vals[i].getPrefix() &&  !Vals[i].getValue()->isComplete() &&
57ffaee3755604e8227cefb209d4741f108ae16b0eChris Lattner          // ignore annul and predict bits since no one sets them yet
58ffaee3755604e8227cefb209d4741f108ae16b0eChris Lattner          Vals[i].getName() != "annul" && Vals[i].getName() != "predict") {
597eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        // Is the operand continuous? If so, we can just mask and OR it in
607eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        // instead of doing it bit-by-bit, saving a lot in runtime cost.
617eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        const BitsInit *InstInit = BI;
62d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner        int beginBitInVar = -1, endBitInVar = -1;
63d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner        int beginBitInInst = -1, endBitInInst = -1;
647eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        bool continuous = true;
657eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
667eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        for (int bit = InstInit->getNumBits()-1; bit >= 0; --bit) {
677eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (VarBitInit *VBI =
687eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              dynamic_cast<VarBitInit*>(InstInit->getBit(bit))) {
697eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            TypedInit *TI = VBI->getVariable();
707eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
717eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // only process the current variable
727eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (VI->getName() != Vals[i].getName())
737eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                continue;
747eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
757eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (beginBitInVar == -1)
767eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                beginBitInVar = VBI->getBitNum();
777eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
787eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (endBitInVar == -1)
797eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                endBitInVar = VBI->getBitNum();
807eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              else {
817eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                if (endBitInVar == (int)VBI->getBitNum() + 1)
827eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  endBitInVar = VBI->getBitNum();
837eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                else {
847eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  continuous = false;
857eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  break;
867eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                }
877eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
887eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
897eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (beginBitInInst == -1)
907eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                beginBitInInst = bit;
917eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (endBitInInst == -1)
927eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                endBitInInst = bit;
937eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              else {
947eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                if (endBitInInst == bit + 1)
957eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  endBitInInst = bit;
967eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                else {
977eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  continuous = false;
987eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  break;
997eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                }
1007eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1017eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1027eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // maintain same distance between bits in field and bits in
1037eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // instruction. if the relative distances stay the same
1047eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // throughout,
105d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              if (beginBitInVar - (int)VBI->getBitNum() !=
106d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                  beginBitInInst - bit) {
1077eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                continuous = false;
1087eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                break;
1097eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1107eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            }
1117eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          }
1127eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
1137eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
114ffaee3755604e8227cefb209d4741f108ae16b0eChris Lattner        // If we have found no bit in "Inst" which comes from this field, then
115ffaee3755604e8227cefb209d4741f108ae16b0eChris Lattner        // this is not an operand!!
116d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner        if (beginBitInInst != -1) {
117d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          o << "      // op" << op << ": " << Vals[i].getName() << "\n"
118d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            << "      int64_t op" << op
119d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            <<" = getMachineOpValue(MI, MI.getOperand("<<op<<"));\n";
120d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          //<< "   MachineOperand &op" << op <<" = MI.getOperand("<<op<<");\n";
121d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          OpOrder[Vals[i].getName()] = op++;
1227eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
123d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          DEBUG(o << "      // Var: begin = " << beginBitInVar
124d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                  << ", end = " << endBitInVar
125d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                  << "; Inst: begin = " << beginBitInInst
126d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                  << ", end = " << endBitInInst << "\n");
127d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
128d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          if (continuous) {
129d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            DEBUG(o << "      // continuous: op" << OpOrder[Vals[i].getName()]
130d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                    << "\n");
131d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
132d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            // Mask off the right bits
133d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            // Low mask (ie. shift, if necessary)
134d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            if (endBitInVar != 0) {
135d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              o << "      op" << OpOrder[Vals[i].getName()]
136d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                << " >>= " << endBitInVar << ";\n";
137d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              beginBitInVar -= endBitInVar;
138d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              endBitInVar = 0;
139d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            }
140d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
141d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            // High mask
1427eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            o << "      op" << OpOrder[Vals[i].getName()]
143d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              << " &= (1<<" << beginBitInVar+1 << ") - 1;\n";
144d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
145d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            // Shift the value to the correct place (according to place in inst)
146d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            if (endBitInInst != 0)
147d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              o << "      op" << OpOrder[Vals[i].getName()]
1487eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              << " <<= " << endBitInInst << ";\n";
149d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
150d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            // Just OR in the result
151d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            o << "      Value |= op" << OpOrder[Vals[i].getName()] << ";\n";
152d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          }
153d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
154d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          // otherwise, will be taken care of in the loop below using this
155d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          // value:
156d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          OpContinuous[Vals[i].getName()] = continuous;
1577eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
1589fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      }
1599fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    }
1609fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
16148aa8242799b639526b8b696260045be0c0c0139Misha Brukman    for (unsigned f = 0, e = Vals.size(); f != e; ++f) {
1629fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      if (Vals[f].getPrefix()) {
1639fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        BitsInit *FieldInitializer = (BitsInit*)Vals[f].getValue();
1649fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
1659fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        // Scan through the field looking for bit initializers of the current
1669fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        // variable...
1679fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        for (int i = FieldInitializer->getNumBits()-1; i >= 0; --i) {
168ffaee3755604e8227cefb209d4741f108ae16b0eChris Lattner          if (BitInit *BI = dynamic_cast<BitInit*>(FieldInitializer->getBit(i)))
1697eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          {
170f6e5217b54441866dec596c1be20747036440cd4Misha Brukman            DEBUG(o << "      // bit init: f: " << f << ", i: " << i << "\n");
1717eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          } else if (UnsetInit *UI =
1729fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman                     dynamic_cast<UnsetInit*>(FieldInitializer->getBit(i))) {
173f6e5217b54441866dec596c1be20747036440cd4Misha Brukman            DEBUG(o << "      // unset init: f: " << f << ", i: " << i << "\n");
1749fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          } else if (VarBitInit *VBI =
1759fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman                     dynamic_cast<VarBitInit*>(FieldInitializer->getBit(i))) {
1769fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            TypedInit *TI = VBI->getVariable();
1779fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
1787eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // If the bits of the field are laid out consecutively in the
1797eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // instruction, then instead of separately ORing in bits, just
1807eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // mask and shift the entire field for efficiency.
1817eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (OpContinuous[VI->getName()]) {
1827eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // already taken care of in the loop above, thus there is no
1837eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // need to individually OR in the bits
1847eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1857eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // for debugging, output the regular version anyway, commented
186f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                DEBUG(o << "      // Value |= getValueBit(op"
187f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                        << OpOrder[VI->getName()] << ", " << VBI->getBitNum()
188f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                        << ")" << " << " << i << ";\n");
1897eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              } else {
1907eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                o << "      Value |= getValueBit(op" << OpOrder[VI->getName()]
1917eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  << ", " << VBI->getBitNum()
1927eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  << ")" << " << " << i << ";\n";
1937eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1949fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            } else if (FieldInit *FI = dynamic_cast<FieldInit*>(TI)) {
1959fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman              // FIXME: implement this!
1969fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman              o << "FIELD INIT not implemented yet!\n";
1979fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            } else {
198cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman              o << "Error: UNIMPLEMENTED\n";
1999fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            }
2009fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          }
2017eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
202cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      } else {
2033d194ac26bd61968ac9ed8de5bde42e902724d19Misha Brukman        // ignore annul and predict bits since no one sets them yet
20448aa8242799b639526b8b696260045be0c0c0139Misha Brukman        if (Vals[f].getName() == "annul" || Vals[f].getName() == "predict") {
20548aa8242799b639526b8b696260045be0c0c0139Misha Brukman          o << "      // found " << Vals[f].getName() << "\n";
20648aa8242799b639526b8b696260045be0c0c0139Misha Brukman        }
2079fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      }
2089fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    }
2099fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
2109fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    o << "      break;\n"
2119fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      << "    }\n";
2129fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  }
2137eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
214cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman  o << "  default:\n"
215f4ef4c881f851ae019f9f48d5473f9f1586d1dbcMisha Brukman    << "    DEBUG(std::cerr << \"Not supported instr: \" << MI << \"\\n\");\n"
216cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    << "    abort();\n"
217cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    << "  }\n"
2189fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "  return Value;\n"
2199fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "}\n";
2209fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman}
221