CodeEmitterGen.cpp revision 6f334ad8f5c9319b334e2ba68b89d0dd46156788
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"
9c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner#include "Support/Statistic.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
499fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    // Loop over all of the fields in the instruction adding in any
509fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    // contributions to this value (due to bit references).
519fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    //
52cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    unsigned op = 0;
539fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    std::map<const std::string,unsigned> OpOrder;
547eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman    std::map<const std::string,bool> OpContinuous;
559fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
569fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      if (Vals[i].getName() != "Inst" &&
579fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          !Vals[i].getValue()->isComplete() &&
583d194ac26bd61968ac9ed8de5bde42e902724d19Misha Brukman          /* ignore annul and predict bits since no one sets them yet */
599fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          Vals[i].getName() != "annul" &&
609fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          Vals[i].getName() != "predict")
619fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      {
62cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        o << "      // op" << op << ": " << Vals[i].getName() << "\n"
63cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman          << "      int64_t op" << op
64e7800b5458674fcfc6054d7c94c4d4a5e1b8fd2fMisha Brukman          <<" = getMachineOpValue(MI, MI.getOperand("<<op<<"));\n";
65cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        //<< "      MachineOperand &op" << op <<" = MI.getOperand("<<op<<");\n";
66cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        OpOrder[Vals[i].getName()] = op++;
677eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
687eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        // Is the operand continuous? If so, we can just mask and OR it in
697eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        // instead of doing it bit-by-bit, saving a lot in runtime cost.
707eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        const BitsInit *InstInit = BI;
717eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        int beginBitInVar = -1, endBitInVar = -1,
727eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          beginBitInInst = -1, endBitInInst = -1;
737eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        bool continuous = true;
747eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
757eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        for (int bit = InstInit->getNumBits()-1; bit >= 0; --bit) {
767eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (VarBitInit *VBI =
777eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              dynamic_cast<VarBitInit*>(InstInit->getBit(bit))) {
787eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            TypedInit *TI = VBI->getVariable();
797eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
807eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // only process the current variable
817eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (VI->getName() != Vals[i].getName())
827eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                continue;
837eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
847eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (beginBitInVar == -1)
857eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                beginBitInVar = VBI->getBitNum();
867eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
877eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (endBitInVar == -1)
887eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                endBitInVar = VBI->getBitNum();
897eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              else {
907eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                if (endBitInVar == (int)VBI->getBitNum() + 1)
917eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  endBitInVar = VBI->getBitNum();
927eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                else {
937eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  continuous = false;
947eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  break;
957eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                }
967eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
977eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
987eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (beginBitInInst == -1)
997eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                beginBitInInst = bit;
1007eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (endBitInInst == -1)
1017eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                endBitInInst = bit;
1027eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              else {
1037eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                if (endBitInInst == bit + 1)
1047eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  endBitInInst = bit;
1057eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                else {
1067eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  continuous = false;
1077eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  break;
1087eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                }
1097eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1107eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1117eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // maintain same distance between bits in field and bits in
1127eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // instruction. if the relative distances stay the same
1137eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // throughout,
1147eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if ((beginBitInVar - (int)VBI->getBitNum()) !=
1157eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  (beginBitInInst - bit))
1167eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              {
1177eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                continuous = false;
1187eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                break;
1197eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1207eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            }
1217eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          }
1227eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
1237eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
124f6e5217b54441866dec596c1be20747036440cd4Misha Brukman        DEBUG(o << "      // Var: begin = " << beginBitInVar
125f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                << ", end = " << endBitInVar
126f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                << "; Inst: begin = " << beginBitInInst
127f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                << ", end = " << endBitInInst << "\n");
128f6e5217b54441866dec596c1be20747036440cd4Misha Brukman
1297eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        if (continuous) {
130c86516f35ccc64ad33acdd79c89aa4c4e33c6e70Misha Brukman          DEBUG(o << "      // continuous: op" << OpOrder[Vals[i].getName()]
131c86516f35ccc64ad33acdd79c89aa4c4e33c6e70Misha Brukman                  << "\n");
1327eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1337eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Mask off the right bits
1347eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Low mask (ie. shift, if necessary)
1357eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (endBitInVar != 0) {
1367eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            o << "      op" << OpOrder[Vals[i].getName()]
137f6e5217b54441866dec596c1be20747036440cd4Misha Brukman              << " >>= " << endBitInVar << ";\n";
1387eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            beginBitInVar -= endBitInVar;
1397eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            endBitInVar = 0;
1407eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          }
1417eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1427eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // High mask
1437eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          o << "      op" << OpOrder[Vals[i].getName()]
1447eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            << " &= (1<<" << beginBitInVar+1 << ") - 1;\n";
1457eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1467eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Shift the value to the correct place (according to place in instr)
1477eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (endBitInInst != 0)
1487eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            o << "      op" << OpOrder[Vals[i].getName()]
1497eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              << " <<= " << endBitInInst << ";\n";
1507eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1517eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Just OR in the result
1527eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          o << "      Value |= op" << OpOrder[Vals[i].getName()] << ";\n";
1537eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
1547eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1557eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        // otherwise, will be taken care of in the loop below using this value:
1567eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        OpContinuous[Vals[i].getName()] = continuous;
1579fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      }
1589fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    }
1599fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
16048aa8242799b639526b8b696260045be0c0c0139Misha Brukman    for (unsigned f = 0, e = Vals.size(); f != e; ++f) {
1619fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      if (Vals[f].getPrefix()) {
1629fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        BitsInit *FieldInitializer = (BitsInit*)Vals[f].getValue();
1639fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
1649fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        // Scan through the field looking for bit initializers of the current
1659fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        // variable...
1669fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        for (int i = FieldInitializer->getNumBits()-1; i >= 0; --i) {
1677eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (BitInit *BI=dynamic_cast<BitInit*>(FieldInitializer->getBit(i)))
1687eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          {
169f6e5217b54441866dec596c1be20747036440cd4Misha Brukman            DEBUG(o << "      // bit init: f: " << f << ", i: " << i << "\n");
1707eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          } else if (UnsetInit *UI =
1719fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman                     dynamic_cast<UnsetInit*>(FieldInitializer->getBit(i))) {
172f6e5217b54441866dec596c1be20747036440cd4Misha Brukman            DEBUG(o << "      // unset init: f: " << f << ", i: " << i << "\n");
1739fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          } else if (VarBitInit *VBI =
1749fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman                     dynamic_cast<VarBitInit*>(FieldInitializer->getBit(i))) {
1759fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            TypedInit *TI = VBI->getVariable();
1769fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
1777eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // If the bits of the field are laid out consecutively in the
1787eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // instruction, then instead of separately ORing in bits, just
1797eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // mask and shift the entire field for efficiency.
1807eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (OpContinuous[VI->getName()]) {
1817eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // already taken care of in the loop above, thus there is no
1827eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // need to individually OR in the bits
1837eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1847eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // for debugging, output the regular version anyway, commented
185f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                DEBUG(o << "      // Value |= getValueBit(op"
186f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                        << OpOrder[VI->getName()] << ", " << VBI->getBitNum()
187f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                        << ")" << " << " << i << ";\n");
1887eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              } else {
1897eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                o << "      Value |= getValueBit(op" << OpOrder[VI->getName()]
1907eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  << ", " << VBI->getBitNum()
1917eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  << ")" << " << " << i << ";\n";
1927eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1939fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            } else if (FieldInit *FI = dynamic_cast<FieldInit*>(TI)) {
1949fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman              // FIXME: implement this!
1959fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman              o << "FIELD INIT not implemented yet!\n";
1969fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            } else {
197cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman              o << "Error: UNIMPLEMENTED\n";
1989fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            }
1999fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          }
2007eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
201cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      } else {
2023d194ac26bd61968ac9ed8de5bde42e902724d19Misha Brukman        // ignore annul and predict bits since no one sets them yet
20348aa8242799b639526b8b696260045be0c0c0139Misha Brukman        if (Vals[f].getName() == "annul" || Vals[f].getName() == "predict") {
20448aa8242799b639526b8b696260045be0c0c0139Misha Brukman          o << "      // found " << Vals[f].getName() << "\n";
20548aa8242799b639526b8b696260045be0c0c0139Misha Brukman        }
2069fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      }
2079fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    }
2089fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
2099fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    o << "      break;\n"
2109fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      << "    }\n";
2119fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  }
2127eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
213cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman  o << "  default:\n"
214f4ef4c881f851ae019f9f48d5473f9f1586d1dbcMisha Brukman    << "    DEBUG(std::cerr << \"Not supported instr: \" << MI << \"\\n\");\n"
215cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    << "    abort();\n"
216cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    << "  }\n"
2179fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "  return Value;\n"
2189fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "}\n";
2199fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman}
220