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