CodeEmitterGen.cpp revision c86516f35ccc64ad33acdd79c89aa4c4e33c6e70
1f6e5217b54441866dec596c1be20747036440cd4Misha Brukman#include "Support/Statistic.h"
29fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman#include "Record.h"
39fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman#include "CodeEmitterGen.h"
49fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
59fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukmanvoid CodeEmitterGen::createEmitter(std::ostream &o) {
69fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  std::vector<Record*> Insts;
79fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
89fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  const std::map<std::string, Record*> &Defs = Records.getDefs();
99fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  Record *Inst = Records.getClass("Instruction");
109fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  assert(Inst && "Couldn't find Instruction class!");
119fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
129fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  for (std::map<std::string, Record*>::const_iterator I = Defs.begin(),
139fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman	 E = Defs.end(); I != E; ++I)
149fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    if (I->second->isSubClassOf(Inst))
159fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      Insts.push_back(I->second);
169fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
179fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  std::string Namespace = "V9::";
189fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  std::string ClassName = "SparcV9CodeEmitter::";
199fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
209fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  //const std::string &Namespace = Inst->getValue("Namespace")->getName();
21b9dd8154b6f0c64c7e6703b11fa5d25e1375a8dfMisha Brukman  o << "unsigned " << ClassName
229fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "getBinaryCodeForInstr(MachineInstr &MI) {\n"
239fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "  unsigned Value = 0;\n"
24f4ef4c881f851ae019f9f48d5473f9f1586d1dbcMisha Brukman    << "  DEBUG(std::cerr << MI);\n"
259fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "  switch (MI.getOpcode()) {\n";
269fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  for (std::vector<Record*>::iterator I = Insts.begin(), E = Insts.end();
279fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman       I != E; ++I)
289fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  {
299fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    Record *R = *I;
30ecc7fd3c56f482ecb4ea42d2cf83e54f73dfb69aMisha Brukman    o << "    case " << Namespace << R->getName() << ": {\n"
31f4ef4c881f851ae019f9f48d5473f9f1586d1dbcMisha Brukman      << "      DEBUG(std::cerr << \"Emitting " << R->getName() << "\\n\");\n";
329fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
339fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    const RecordVal *InstVal = R->getValue("Inst");
349fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    Init *InitVal = InstVal->getValue();
359fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
369fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    assert(dynamic_cast<BitsInit*>(InitVal) &&
379fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman           "Can only handle undefined bits<> types!");
389fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    BitsInit *BI = (BitsInit*)InitVal;
399fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
409fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    unsigned Value = 0;
419fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    const std::vector<RecordVal> &Vals = R->getValues();
429fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
43f6e5217b54441866dec596c1be20747036440cd4Misha Brukman    DEBUG(o << "      // prefilling: ");
449fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    // Start by filling in fixed values...
45cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) {
46cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      if (BitInit *B = dynamic_cast<BitInit*>(BI->getBit(e-i-1))) {
47cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        Value |= B->getValue() << (e-i-1);
48f6e5217b54441866dec596c1be20747036440cd4Misha Brukman        DEBUG(o << B->getValue());
49cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      } else {
50f6e5217b54441866dec596c1be20747036440cd4Misha Brukman        DEBUG(o << "0");
51cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      }
52cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    }
53f6e5217b54441866dec596c1be20747036440cd4Misha Brukman    DEBUG(o << "\n");
549fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
55f6e5217b54441866dec596c1be20747036440cd4Misha Brukman    DEBUG(o << "      // " << *InstVal << "\n");
56cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    o << "      Value = " << Value << "U;\n\n";
579fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
589fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    // Loop over all of the fields in the instruction adding in any
599fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    // contributions to this value (due to bit references).
609fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    //
61cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    unsigned op = 0;
629fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    std::map<const std::string,unsigned> OpOrder;
637eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman    std::map<const std::string,bool> OpContinuous;
649fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
659fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      if (Vals[i].getName() != "Inst" &&
669fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          !Vals[i].getValue()->isComplete() &&
673d194ac26bd61968ac9ed8de5bde42e902724d19Misha Brukman          /* ignore annul and predict bits since no one sets them yet */
689fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          Vals[i].getName() != "annul" &&
699fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          Vals[i].getName() != "predict")
709fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      {
71cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        o << "      // op" << op << ": " << Vals[i].getName() << "\n"
72cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman          << "      int64_t op" << op
73e7800b5458674fcfc6054d7c94c4d4a5e1b8fd2fMisha Brukman          <<" = getMachineOpValue(MI, MI.getOperand("<<op<<"));\n";
74cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        //<< "      MachineOperand &op" << op <<" = MI.getOperand("<<op<<");\n";
75cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        OpOrder[Vals[i].getName()] = op++;
767eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
777eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        // Is the operand continuous? If so, we can just mask and OR it in
787eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        // instead of doing it bit-by-bit, saving a lot in runtime cost.
797eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        const BitsInit *InstInit = BI;
807eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        int beginBitInVar = -1, endBitInVar = -1,
817eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          beginBitInInst = -1, endBitInInst = -1;
827eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        bool continuous = true;
837eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
847eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        for (int bit = InstInit->getNumBits()-1; bit >= 0; --bit) {
857eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (VarBitInit *VBI =
867eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              dynamic_cast<VarBitInit*>(InstInit->getBit(bit))) {
877eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            TypedInit *TI = VBI->getVariable();
887eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
897eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // only process the current variable
907eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (VI->getName() != Vals[i].getName())
917eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                continue;
927eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
937eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (beginBitInVar == -1)
947eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                beginBitInVar = VBI->getBitNum();
957eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
967eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (endBitInVar == -1)
977eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                endBitInVar = VBI->getBitNum();
987eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              else {
997eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                if (endBitInVar == (int)VBI->getBitNum() + 1)
1007eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  endBitInVar = VBI->getBitNum();
1017eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                else {
1027eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  continuous = false;
1037eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  break;
1047eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                }
1057eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1067eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1077eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (beginBitInInst == -1)
1087eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                beginBitInInst = bit;
1097eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (endBitInInst == -1)
1107eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                endBitInInst = bit;
1117eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              else {
1127eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                if (endBitInInst == bit + 1)
1137eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  endBitInInst = bit;
1147eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                else {
1157eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  continuous = false;
1167eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  break;
1177eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                }
1187eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1197eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1207eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // maintain same distance between bits in field and bits in
1217eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // instruction. if the relative distances stay the same
1227eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // throughout,
1237eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if ((beginBitInVar - (int)VBI->getBitNum()) !=
1247eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  (beginBitInInst - bit))
1257eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              {
1267eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                continuous = false;
1277eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                break;
1287eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1297eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            }
1307eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          }
1317eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
1327eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
133f6e5217b54441866dec596c1be20747036440cd4Misha Brukman        DEBUG(o << "      // Var: begin = " << beginBitInVar
134f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                << ", end = " << endBitInVar
135f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                << "; Inst: begin = " << beginBitInInst
136f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                << ", end = " << endBitInInst << "\n");
137f6e5217b54441866dec596c1be20747036440cd4Misha Brukman
1387eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        if (continuous) {
139c86516f35ccc64ad33acdd79c89aa4c4e33c6e70Misha Brukman          DEBUG(o << "      // continuous: op" << OpOrder[Vals[i].getName()]
140c86516f35ccc64ad33acdd79c89aa4c4e33c6e70Misha Brukman                  << "\n");
1417eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1427eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Mask off the right bits
1437eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Low mask (ie. shift, if necessary)
1447eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (endBitInVar != 0) {
1457eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            o << "      op" << OpOrder[Vals[i].getName()]
146f6e5217b54441866dec596c1be20747036440cd4Misha Brukman              << " >>= " << endBitInVar << ";\n";
1477eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            beginBitInVar -= endBitInVar;
1487eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            endBitInVar = 0;
1497eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          }
1507eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1517eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // High mask
1527eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          o << "      op" << OpOrder[Vals[i].getName()]
1537eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            << " &= (1<<" << beginBitInVar+1 << ") - 1;\n";
1547eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1557eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Shift the value to the correct place (according to place in instr)
1567eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (endBitInInst != 0)
1577eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            o << "      op" << OpOrder[Vals[i].getName()]
1587eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              << " <<= " << endBitInInst << ";\n";
1597eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1607eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          // Just OR in the result
1617eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          o << "      Value |= op" << OpOrder[Vals[i].getName()] << ";\n";
1627eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
1637eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1647eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        // otherwise, will be taken care of in the loop below using this value:
1657eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        OpContinuous[Vals[i].getName()] = continuous;
1669fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      }
1679fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    }
1689fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
16948aa8242799b639526b8b696260045be0c0c0139Misha Brukman    for (unsigned f = 0, e = Vals.size(); f != e; ++f) {
1709fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      if (Vals[f].getPrefix()) {
1719fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        BitsInit *FieldInitializer = (BitsInit*)Vals[f].getValue();
1729fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
1739fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        // Scan through the field looking for bit initializers of the current
1749fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        // variable...
1759fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        for (int i = FieldInitializer->getNumBits()-1; i >= 0; --i) {
1767eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          if (BitInit *BI=dynamic_cast<BitInit*>(FieldInitializer->getBit(i)))
1777eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          {
178f6e5217b54441866dec596c1be20747036440cd4Misha Brukman            DEBUG(o << "      // bit init: f: " << f << ", i: " << i << "\n");
1797eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          } else if (UnsetInit *UI =
1809fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman                     dynamic_cast<UnsetInit*>(FieldInitializer->getBit(i))) {
181f6e5217b54441866dec596c1be20747036440cd4Misha Brukman            DEBUG(o << "      // unset init: f: " << f << ", i: " << i << "\n");
1829fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          } else if (VarBitInit *VBI =
1839fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman                     dynamic_cast<VarBitInit*>(FieldInitializer->getBit(i))) {
1849fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            TypedInit *TI = VBI->getVariable();
1859fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
1867eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // If the bits of the field are laid out consecutively in the
1877eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // instruction, then instead of separately ORing in bits, just
1887eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // mask and shift the entire field for efficiency.
1897eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (OpContinuous[VI->getName()]) {
1907eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // already taken care of in the loop above, thus there is no
1917eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // need to individually OR in the bits
1927eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1937eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // for debugging, output the regular version anyway, commented
194f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                DEBUG(o << "      // Value |= getValueBit(op"
195f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                        << OpOrder[VI->getName()] << ", " << VBI->getBitNum()
196f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                        << ")" << " << " << i << ";\n");
1977eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              } else {
1987eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                o << "      Value |= getValueBit(op" << OpOrder[VI->getName()]
1997eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  << ", " << VBI->getBitNum()
2007eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  << ")" << " << " << i << ";\n";
2017eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
2029fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            } else if (FieldInit *FI = dynamic_cast<FieldInit*>(TI)) {
2039fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman              // FIXME: implement this!
2049fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman              o << "FIELD INIT not implemented yet!\n";
2059fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            } else {
206cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman              o << "Error: UNIMPLEMENTED\n";
2079fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            }
2089fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          }
2097eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
210cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      } else {
2113d194ac26bd61968ac9ed8de5bde42e902724d19Misha Brukman        // ignore annul and predict bits since no one sets them yet
21248aa8242799b639526b8b696260045be0c0c0139Misha Brukman        if (Vals[f].getName() == "annul" || Vals[f].getName() == "predict") {
21348aa8242799b639526b8b696260045be0c0c0139Misha Brukman          o << "      // found " << Vals[f].getName() << "\n";
21448aa8242799b639526b8b696260045be0c0c0139Misha Brukman        }
2159fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      }
2169fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    }
2179fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
2189fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    o << "      break;\n"
2199fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      << "    }\n";
2209fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  }
2217eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
222cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman  o << "  default:\n"
223f4ef4c881f851ae019f9f48d5473f9f1586d1dbcMisha Brukman    << "    DEBUG(std::cerr << \"Not supported instr: \" << MI << \"\\n\");\n"
224cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    << "    abort();\n"
225cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    << "  }\n"
2269fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "  return Value;\n"
2279fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "}\n";
2289fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman}
229