CodeEmitterGen.cpp revision d0fde30ce850b78371fd1386338350591f9ff494
1c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner//===- CodeEmitterGen.cpp - Code Emitter Generator ------------------------===//
201d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//
301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//                     The LLVM Compiler Infrastructure
401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//
501d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// This file was developed by the LLVM research group and is distributed under
601d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
701d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//
801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===//
9c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner//
10c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner// FIXME: Document.
11c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner//
12c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner//===----------------------------------------------------------------------===//
13c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner
149fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman#include "CodeEmitterGen.h"
15c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner#include "Record.h"
16c648dabf65c67d20c208ed0b39b9622387e636c7Chris Lattner#include "Support/Debug.h"
179fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
18d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
19d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
20048c00db1cd05bbbd616e0eff71756eebd45f6b4Chris Lattnervoid CodeEmitterGen::run(std::ostream &o) {
21048c00db1cd05bbbd616e0eff71756eebd45f6b4Chris Lattner  std::vector<Record*> Insts = Records.getAllDerivedDefinitions("Instruction");
229fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
230e5e49e6888c354ff95fc9e56d0881af78cb4269Chris Lattner  EmitSourceFileHeader("Machine Code Emitter", o);
240e5e49e6888c354ff95fc9e56d0881af78cb4269Chris Lattner
259fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  std::string Namespace = "V9::";
269fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  std::string ClassName = "SparcV9CodeEmitter::";
279fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
289fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  //const std::string &Namespace = Inst->getValue("Namespace")->getName();
29b9dd8154b6f0c64c7e6703b11fa5d25e1375a8dfMisha Brukman  o << "unsigned " << ClassName
309fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "getBinaryCodeForInstr(MachineInstr &MI) {\n"
319fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "  unsigned Value = 0;\n"
32f4ef4c881f851ae019f9f48d5473f9f1586d1dbcMisha Brukman    << "  DEBUG(std::cerr << MI);\n"
339fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "  switch (MI.getOpcode()) {\n";
349fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  for (std::vector<Record*>::iterator I = Insts.begin(), E = Insts.end();
35cf1b5853127352096ea6c2f8ec130f809168da2fChris Lattner       I != E; ++I) {
369fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    Record *R = *I;
37ecc7fd3c56f482ecb4ea42d2cf83e54f73dfb69aMisha Brukman    o << "    case " << Namespace << R->getName() << ": {\n"
38f4ef4c881f851ae019f9f48d5473f9f1586d1dbcMisha Brukman      << "      DEBUG(std::cerr << \"Emitting " << R->getName() << "\\n\");\n";
399fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
406f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner    BitsInit *BI = R->getValueAsBitsInit("Inst");
419fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
429fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    unsigned Value = 0;
439fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    const std::vector<RecordVal> &Vals = R->getValues();
449fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
45f6e5217b54441866dec596c1be20747036440cd4Misha Brukman    DEBUG(o << "      // prefilling: ");
469fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    // Start by filling in fixed values...
47cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) {
48cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      if (BitInit *B = dynamic_cast<BitInit*>(BI->getBit(e-i-1))) {
49cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman        Value |= B->getValue() << (e-i-1);
50f6e5217b54441866dec596c1be20747036440cd4Misha Brukman        DEBUG(o << B->getValue());
51cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      } else {
52f6e5217b54441866dec596c1be20747036440cd4Misha Brukman        DEBUG(o << "0");
53cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman      }
54cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    }
55f6e5217b54441866dec596c1be20747036440cd4Misha Brukman    DEBUG(o << "\n");
569fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
576f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner    DEBUG(o << "      // " << *R->getValue("Inst") << "\n");
58cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    o << "      Value = " << Value << "U;\n\n";
599fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
60d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner    // Loop over all of the fields in the instruction determining which are the
61d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner    // operands to the instruction.
629fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    //
63cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    unsigned op = 0;
64d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner    std::map<std::string, unsigned> OpOrder;
65d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner    std::map<std::string, bool> OpContinuous;
669fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
67d88ba5a861f400116ec4343a0542e0c58ba0e6a5Misha Brukman      if (!Vals[i].getPrefix() &&  !Vals[i].getValue()->isComplete()) {
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;
71d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner        int beginBitInVar = -1, endBitInVar = -1;
72d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner        int 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,
114d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              if (beginBitInVar - (int)VBI->getBitNum() !=
115d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                  beginBitInInst - bit) {
1167eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                continuous = false;
1177eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                break;
1187eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
1197eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            }
1207eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          }
1217eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
1227eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
123ffaee3755604e8227cefb209d4741f108ae16b0eChris Lattner        // If we have found no bit in "Inst" which comes from this field, then
124ffaee3755604e8227cefb209d4741f108ae16b0eChris Lattner        // this is not an operand!!
125d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner        if (beginBitInInst != -1) {
126d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          o << "      // op" << op << ": " << Vals[i].getName() << "\n"
127d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            << "      int64_t op" << op
128d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            <<" = getMachineOpValue(MI, MI.getOperand("<<op<<"));\n";
129d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          //<< "   MachineOperand &op" << op <<" = MI.getOperand("<<op<<");\n";
130d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          OpOrder[Vals[i].getName()] = op++;
1317eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
132d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          DEBUG(o << "      // Var: begin = " << beginBitInVar
133d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                  << ", end = " << endBitInVar
134d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                  << "; Inst: begin = " << beginBitInInst
135d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                  << ", end = " << endBitInInst << "\n");
136d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
137d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          if (continuous) {
138d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            DEBUG(o << "      // continuous: op" << OpOrder[Vals[i].getName()]
139d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                    << "\n");
140d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
141d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            // Mask off the right bits
142d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            // Low mask (ie. shift, if necessary)
143dfd414ab770a389d29b7294f20e38cbf74c9f9a9Misha Brukman            assert(endBitInVar >= 0 && "Negative shift amount in masking!");
144d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            if (endBitInVar != 0) {
145d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              o << "      op" << OpOrder[Vals[i].getName()]
146d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner                << " >>= " << endBitInVar << ";\n";
147d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              beginBitInVar -= endBitInVar;
148d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              endBitInVar = 0;
149d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            }
150d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
151d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            // High mask
1527eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman            o << "      op" << OpOrder[Vals[i].getName()]
153d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              << " &= (1<<" << beginBitInVar+1 << ") - 1;\n";
154d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
155d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            // Shift the value to the correct place (according to place in inst)
156dfd414ab770a389d29b7294f20e38cbf74c9f9a9Misha Brukman            assert(endBitInInst >= 0 && "Negative shift amount in inst position!");
157d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            if (endBitInInst != 0)
158d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner              o << "      op" << OpOrder[Vals[i].getName()]
1597eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              << " <<= " << endBitInInst << ";\n";
160d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
161d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            // Just OR in the result
162d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner            o << "      Value |= op" << OpOrder[Vals[i].getName()] << ";\n";
163d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          }
164d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner
165d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          // otherwise, will be taken care of in the loop below using this
166d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          // value:
167d7efef9d1481a96425e09b8a37114c815ab5da1cChris Lattner          OpContinuous[Vals[i].getName()] = continuous;
1687eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
1699fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      }
1709fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    }
1719fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
17248aa8242799b639526b8b696260045be0c0c0139Misha Brukman    for (unsigned f = 0, e = Vals.size(); f != e; ++f) {
1739fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      if (Vals[f].getPrefix()) {
1749fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        BitsInit *FieldInitializer = (BitsInit*)Vals[f].getValue();
1759fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
1769fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        // Scan through the field looking for bit initializers of the current
1779fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        // variable...
1789fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman        for (int i = FieldInitializer->getNumBits()-1; i >= 0; --i) {
179ffaee3755604e8227cefb209d4741f108ae16b0eChris Lattner          if (BitInit *BI = dynamic_cast<BitInit*>(FieldInitializer->getBit(i)))
1807eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          {
181f6e5217b54441866dec596c1be20747036440cd4Misha Brukman            DEBUG(o << "      // bit init: f: " << f << ", i: " << i << "\n");
1827eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman          } else if (UnsetInit *UI =
1839fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman                     dynamic_cast<UnsetInit*>(FieldInitializer->getBit(i))) {
184f6e5217b54441866dec596c1be20747036440cd4Misha Brukman            DEBUG(o << "      // unset init: f: " << f << ", i: " << i << "\n");
1859fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          } else if (VarBitInit *VBI =
1869fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman                     dynamic_cast<VarBitInit*>(FieldInitializer->getBit(i))) {
1879fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            TypedInit *TI = VBI->getVariable();
1889fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
1897eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // If the bits of the field are laid out consecutively in the
1907eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // instruction, then instead of separately ORing in bits, just
1917eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              // mask and shift the entire field for efficiency.
1927eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              if (OpContinuous[VI->getName()]) {
1937eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // already taken care of in the loop above, thus there is no
1947eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // need to individually OR in the bits
1957eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
1967eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                // for debugging, output the regular version anyway, commented
197f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                DEBUG(o << "      // Value |= getValueBit(op"
198f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                        << OpOrder[VI->getName()] << ", " << VBI->getBitNum()
199f6e5217b54441866dec596c1be20747036440cd4Misha Brukman                        << ")" << " << " << i << ";\n");
2007eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              } else {
2017eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                o << "      Value |= getValueBit(op" << OpOrder[VI->getName()]
2027eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  << ", " << VBI->getBitNum()
2037eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman                  << ")" << " << " << i << ";\n";
2047eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman              }
2059fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            } else if (FieldInit *FI = dynamic_cast<FieldInit*>(TI)) {
2069fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman              // FIXME: implement this!
2079fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman              o << "FIELD INIT not implemented yet!\n";
2089fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            } else {
209cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman              o << "Error: UNIMPLEMENTED\n";
2109fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman            }
2119fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman          }
2127eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman        }
2139fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      }
2149fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    }
2159fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman
2169fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    o << "      break;\n"
2179fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman      << "    }\n";
2189fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman  }
2197eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman
220cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman  o << "  default:\n"
2210bb806bd9a707358261ab83ee025c7b969c2edf0Misha Brukman    << "    std::cerr << \"Not supported instr: \" << MI << \"\\n\";\n"
222cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    << "    abort();\n"
223cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman    << "  }\n"
2249fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "  return Value;\n"
2259fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman    << "}\n";
226d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
227d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke  EmitSourceFileTail(o);
2289fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman}
229d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
230d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
231