CodeEmitterGen.cpp revision 048c00db1cd05bbbd616e0eff71756eebd45f6b4
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
299fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    const RecordVal *InstVal = R->getValue("Inst");
30048c00db1cd05bbbd616e0eff71756eebd45f6b4Chris Lattner    if (!InstVal)
31048c00db1cd05bbbd616e0eff71756eebd45f6b4Chris Lattner      throw std::string("No 'Inst' record found in target description file!");
329fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
3330709543d2463948d2b6e30a4411a29940cfde69Chris Lattner    Init *InitVal = InstVal->getValue();
349fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    assert(dynamic_cast<BitsInit*>(InitVal) &&
359fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman           "Can only handle undefined bits<> types!");
369fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    BitsInit *BI = (BitsInit*)InitVal;
379fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
389fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    unsigned Value = 0;
399fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    const std::vector<RecordVal> &Vals = R->getValues();
409fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
41f6e5217b54441866dec596c1be20747036440cd4Misha Brukman    DEBUG(o << "      // prefilling: ");
429fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    // Start by filling in fixed values...
43cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) {
44cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      if (BitInit *B = dynamic_cast<BitInit*>(BI->getBit(e-i-1))) {
45cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        Value |= B->getValue() << (e-i-1);
46f6e5217b54441866dec596c1be20747036440cd4Misha Brukman        DEBUG(o << B->getValue());
47cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      } else {
48f6e5217b54441866dec596c1be20747036440cd4Misha Brukman        DEBUG(o << "0");
49cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      }
50cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    }
51f6e5217b54441866dec596c1be20747036440cd4Misha Brukman    DEBUG(o << "\n");
529fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
53f6e5217b54441866dec596c1be20747036440cd4Misha Brukman    DEBUG(o << "      // " << *InstVal << "\n");
54cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    o << "      Value = " << Value << "U;\n\n";
559fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
569fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    // Loop over all of the fields in the instruction adding in any
579fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    // contributions to this value (due to bit references).
589fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    //
59cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    unsigned op = 0;
609fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    std::map<const std::string,unsigned> OpOrder;
617eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman    std::map<const std::string,bool> OpContinuous;
629fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
639fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      if (Vals[i].getName() != "Inst" &&
649fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          !Vals[i].getValue()->isComplete() &&
653d194ac26bd61968ac9ed8de5bde42e902724d19Misha Brukman          /* ignore annul and predict bits since no one sets them yet */
669fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          Vals[i].getName() != "annul" &&
679fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          Vals[i].getName() != "predict")
689fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      {
69cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        o << "      // op" << op << ": " << Vals[i].getName() << "\n"
70cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman          << "      int64_t op" << op
71e7800b5458674fcfc6054d7c94c4d4a5e1b8fd2fMisha Brukman          <<" = getMachineOpValue(MI, MI.getOperand("<<op<<"));\n";
72cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        //<< "      MachineOperand &op" << op <<" = MI.getOperand("<<op<<");\n";
73cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        OpOrder[Vals[i].getName()] = op++;
747eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
757eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        // Is the operand continuous? If so, we can just mask and OR it in
767eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        // instead of doing it bit-by-bit, saving a lot in runtime cost.
777eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        const BitsInit *InstInit = BI;
787eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        int beginBitInVar = -1, endBitInVar = -1,
797eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          beginBitInInst = -1, endBitInInst = -1;
807eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        bool continuous = true;
817eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
827eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        for (int bit = InstInit->getNumBits()-1; bit >= 0; --bit) {
837eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (VarBitInit *VBI =
847eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              dynamic_cast<VarBitInit*>(InstInit->getBit(bit))) {
857eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            TypedInit *TI = VBI->getVariable();
867eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
877eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // only process the current variable
887eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (VI->getName() != Vals[i].getName())
897eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                continue;
907eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
917eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (beginBitInVar == -1)
927eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                beginBitInVar = VBI->getBitNum();
937eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
947eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (endBitInVar == -1)
957eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                endBitInVar = VBI->getBitNum();
967eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              else {
977eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                if (endBitInVar == (int)VBI->getBitNum() + 1)
987eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  endBitInVar = VBI->getBitNum();
997eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                else {
1007eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  continuous = false;
1017eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  break;
1027eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                }
1037eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1047eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1057eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (beginBitInInst == -1)
1067eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                beginBitInInst = bit;
1077eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (endBitInInst == -1)
1087eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                endBitInInst = bit;
1097eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              else {
1107eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                if (endBitInInst == bit + 1)
1117eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  endBitInInst = bit;
1127eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                else {
1137eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  continuous = false;
1147eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  break;
1157eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                }
1167eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1177eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1187eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // maintain same distance between bits in field and bits in
1197eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // instruction. if the relative distances stay the same
1207eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // throughout,
1217eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if ((beginBitInVar - (int)VBI->getBitNum()) !=
1227eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  (beginBitInInst - bit))
1237eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              {
1247eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                continuous = false;
1257eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                break;
1267eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1277eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            }
1287eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          }
1297eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
1307eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
131f6e5217b54441866dec596c1be20747036440cd4Misha Brukman        DEBUG(o << "      // Var: begin = " << beginBitInVar
132f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                << ", end = " << endBitInVar
133f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                << "; Inst: begin = " << beginBitInInst
134f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                << ", end = " << endBitInInst << "\n");
135f6e5217b54441866dec596c1be20747036440cd4Misha Brukman
1367eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        if (continuous) {
137c86516f35ccc64ad33acdd79c89aa4c4e33c6e70Misha Brukman          DEBUG(o << "      // continuous: op" << OpOrder[Vals[i].getName()]
138c86516f35ccc64ad33acdd79c89aa4c4e33c6e70Misha Brukman                  << "\n");
1397eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1407eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Mask off the right bits
1417eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Low mask (ie. shift, if necessary)
1427eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (endBitInVar != 0) {
1437eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            o << "      op" << OpOrder[Vals[i].getName()]
144f6e5217b54441866dec596c1be20747036440cd4Misha Brukman              << " >>= " << endBitInVar << ";\n";
1457eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            beginBitInVar -= endBitInVar;
1467eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            endBitInVar = 0;
1477eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          }
1487eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1497eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // High mask
1507eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          o << "      op" << OpOrder[Vals[i].getName()]
1517eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            << " &= (1<<" << beginBitInVar+1 << ") - 1;\n";
1527eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1537eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Shift the value to the correct place (according to place in instr)
1547eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (endBitInInst != 0)
1557eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            o << "      op" << OpOrder[Vals[i].getName()]
1567eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              << " <<= " << endBitInInst << ";\n";
1577eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1587eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Just OR in the result
1597eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          o << "      Value |= op" << OpOrder[Vals[i].getName()] << ";\n";
1607eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
1617eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1627eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        // otherwise, will be taken care of in the loop below using this value:
1637eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        OpContinuous[Vals[i].getName()] = continuous;
1649fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      }
1659fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    }
1669fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
16748aa8242799b639526b8b696260045be0c0c0139Misha Brukman    for (unsigned f = 0, e = Vals.size(); f != e; ++f) {
1689fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      if (Vals[f].getPrefix()) {
1699fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        BitsInit *FieldInitializer = (BitsInit*)Vals[f].getValue();
1709fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
1719fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        // Scan through the field looking for bit initializers of the current
1729fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        // variable...
1739fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        for (int i = FieldInitializer->getNumBits()-1; i >= 0; --i) {
1747eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (BitInit *BI=dynamic_cast<BitInit*>(FieldInitializer->getBit(i)))
1757eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          {
176f6e5217b54441866dec596c1be20747036440cd4Misha Brukman            DEBUG(o << "      // bit init: f: " << f << ", i: " << i << "\n");
1777eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          } else if (UnsetInit *UI =
1789fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman                     dynamic_cast<UnsetInit*>(FieldInitializer->getBit(i))) {
179f6e5217b54441866dec596c1be20747036440cd4Misha Brukman            DEBUG(o << "      // unset init: f: " << f << ", i: " << i << "\n");
1809fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          } else if (VarBitInit *VBI =
1819fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman                     dynamic_cast<VarBitInit*>(FieldInitializer->getBit(i))) {
1829fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            TypedInit *TI = VBI->getVariable();
1839fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
1847eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // If the bits of the field are laid out consecutively in the
1857eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // instruction, then instead of separately ORing in bits, just
1867eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // mask and shift the entire field for efficiency.
1877eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (OpContinuous[VI->getName()]) {
1887eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // already taken care of in the loop above, thus there is no
1897eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // need to individually OR in the bits
1907eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1917eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // for debugging, output the regular version anyway, commented
192f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                DEBUG(o << "      // Value |= getValueBit(op"
193f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                        << OpOrder[VI->getName()] << ", " << VBI->getBitNum()
194f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                        << ")" << " << " << i << ";\n");
1957eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              } else {
1967eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                o << "      Value |= getValueBit(op" << OpOrder[VI->getName()]
1977eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  << ", " << VBI->getBitNum()
1987eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  << ")" << " << " << i << ";\n";
1997eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
2009fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            } else if (FieldInit *FI = dynamic_cast<FieldInit*>(TI)) {
2019fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman              // FIXME: implement this!
2029fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman              o << "FIELD INIT not implemented yet!\n";
2039fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            } else {
204cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman              o << "Error: UNIMPLEMENTED\n";
2059fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            }
2069fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          }
2077eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
208cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      } else {
2093d194ac26bd61968ac9ed8de5bde42e902724d19Misha Brukman        // ignore annul and predict bits since no one sets them yet
21048aa8242799b639526b8b696260045be0c0c0139Misha Brukman        if (Vals[f].getName() == "annul" || Vals[f].getName() == "predict") {
21148aa8242799b639526b8b696260045be0c0c0139Misha Brukman          o << "      // found " << Vals[f].getName() << "\n";
21248aa8242799b639526b8b696260045be0c0c0139Misha Brukman        }
2139fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      }
2149fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    }
2159fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
2169fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    o << "      break;\n"
2179fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      << "    }\n";
2189fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  }
2197eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
220cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman  o << "  default:\n"
221f4ef4c881f851ae019f9f48d5473f9f1586d1dbcMisha Brukman    << "    DEBUG(std::cerr << \"Not supported instr: \" << MI << \"\\n\");\n"
222cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    << "    abort();\n"
223cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    << "  }\n"
2249fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "  return Value;\n"
2259fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "}\n";
2269fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman}
227