CodeEmitterGen.cpp revision 1a55180238dbcf11113f610aea010447e51f595b
1c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner//===- CodeEmitterGen.cpp - Code Emitter Generator ------------------------===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// The LLVM Compiler Infrastructure 401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// 53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source 63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===// 9c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner// 104e4f8631f68862cfd725de66422bb867bda0efdfMisha Brukman// CodeEmitterGen uses the descriptions of instructions and their fields to 114e4f8631f68862cfd725de66422bb867bda0efdfMisha Brukman// construct an automated code emitter: a function that, given a MachineInstr, 124e4f8631f68862cfd725de66422bb867bda0efdfMisha Brukman// returns the (currently, 32-bit unsigned) value of the instruction. 13c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner// 14c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner//===----------------------------------------------------------------------===// 15c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner 169fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman#include "CodeEmitterGen.h" 17d7a5b2826cbef9d980893a41f39bab6948e9c852Misha Brukman#include "CodeGenTarget.h" 18c9670ef17d43a6c20fcc0f6765988216754419a0Chris Lattner#include "Record.h" 19f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey#include "llvm/ADT/StringExtras.h" 20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/Debug.h" 212082ebe8b3a5db302748828ab4f79a36d239c1d9Chris Lattnerusing namespace llvm; 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 23f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskeyvoid CodeEmitterGen::reverseBits(std::vector<Record*> &Insts) { 24f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey for (std::vector<Record*>::iterator I = Insts.begin(), E = Insts.end(); 25f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey I != E; ++I) { 26f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey Record *R = *I; 27a683f9ba1356e92a5e7243d9f80fe8a8b6f737c8Jim Laskey if (R->getName() == "PHI" || 28a683f9ba1356e92a5e7243d9f80fe8a8b6f737c8Jim Laskey R->getName() == "INLINEASM" || 294406604047423576e36657c7ede266ca42e79642Dan Gohman R->getName() == "DBG_LABEL" || 304406604047423576e36657c7ede266ca42e79642Dan Gohman R->getName() == "EH_LABEL" || 314406604047423576e36657c7ede266ca42e79642Dan Gohman R->getName() == "GC_LABEL" || 32a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng R->getName() == "DECLARE" || 3308d52071bae2f8cc2e9aa6a451118b83d043813bChristopher Lamb R->getName() == "EXTRACT_SUBREG" || 34da47e6e0d003c873da960361549e57ee4617c301Evan Cheng R->getName() == "INSERT_SUBREG" || 35c9298235251b014e86a7368d92b589d093acb64aChristopher Lamb R->getName() == "IMPLICIT_DEF" || 36f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman R->getName() == "SUBREG_TO_REG" || 3788c7af096b09ad26cbcebfdf40151e04094b7460Dan Gohman R->getName() == "COPY_TO_REGCLASS") continue; 38f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman 39f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey BitsInit *BI = R->getValueAsBitsInit("Inst"); 4028eefa5464ca6415fcee577d5c47f739535d7e6cMisha Brukman 41f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey unsigned numBits = BI->getNumBits(); 42f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey BitsInit *NewBI = new BitsInit(numBits); 43f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey for (unsigned bit = 0, end = numBits / 2; bit != end; ++bit) { 44f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey unsigned bitSwapIdx = numBits - bit - 1; 45f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey Init *OrigBit = BI->getBit(bit); 46f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey Init *BitSwap = BI->getBit(bitSwapIdx); 47f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey NewBI->setBit(bit, BitSwap); 48f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey NewBI->setBit(bitSwapIdx, OrigBit); 49f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey } 50f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey if (numBits % 2) { 51f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey unsigned middle = (numBits + 1) / 2; 52f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey NewBI->setBit(middle, BI->getBit(middle)); 5328eefa5464ca6415fcee577d5c47f739535d7e6cMisha Brukman } 54f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 55f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey // Update the bits in reversed order so that emitInstrOpBits will get the 56f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey // correct endianness. 57f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey R->getValue("Inst")->setValue(NewBI); 5828eefa5464ca6415fcee577d5c47f739535d7e6cMisha Brukman } 5928eefa5464ca6415fcee577d5c47f739535d7e6cMisha Brukman} 6028eefa5464ca6415fcee577d5c47f739535d7e6cMisha Brukman 6128eefa5464ca6415fcee577d5c47f739535d7e6cMisha Brukman 62cb129031479dfb5583cce6d77fcbb0b68098693aJim Laskey// If the VarBitInit at position 'bit' matches the specified variable then 63cb129031479dfb5583cce6d77fcbb0b68098693aJim Laskey// return the variable bit position. Otherwise return -1. 64cb129031479dfb5583cce6d77fcbb0b68098693aJim Laskeyint CodeEmitterGen::getVariableBit(const std::string &VarName, 65cb129031479dfb5583cce6d77fcbb0b68098693aJim Laskey BitsInit *BI, int bit) { 66f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey if (VarBitInit *VBI = dynamic_cast<VarBitInit*>(BI->getBit(bit))) { 67f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey TypedInit *TI = VBI->getVariable(); 68f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 69f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey if (VarInit *VI = dynamic_cast<VarInit*>(TI)) { 70f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey if (VI->getName() == VarName) return VBI->getBitNum(); 71f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey } 72f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey } 73f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 74f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey return -1; 75f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey} 76f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 77f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 781a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarvoid CodeEmitterGen::run(raw_ostream &o) { 79e2ba7787ba84513178611a0d44ca11494be62f51Misha Brukman CodeGenTarget Target; 80048c00db1cd05bbbd616e0eff71756eebd45f6b4Chris Lattner std::vector<Record*> Insts = Records.getAllDerivedDefinitions("Instruction"); 81f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 82f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey // For little-endian instruction bit encodings, reverse the bit order 83f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey if (Target.isLittleEndianEncoding()) reverseBits(Insts); 849fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman 850e5e49e6888c354ff95fc9e56d0881af78cb4269Chris Lattner EmitSourceFileHeader("Machine Code Emitter", o); 86e2ba7787ba84513178611a0d44ca11494be62f51Misha Brukman std::string Namespace = Insts[0]->getValueAsString("Namespace") + "::"; 87ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey 88ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey std::vector<const CodeGenInstruction*> NumberedInstructions; 89ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey Target.getInstructionsByEnumValue(NumberedInstructions); 909fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman 91ad346ad17058d9e1463ab1fe5bfa78444e5d3e9cMisha Brukman // Emit function declaration 92e2ba7787ba84513178611a0d44ca11494be62f51Misha Brukman o << "unsigned " << Target.getName() << "CodeEmitter::" 93acff339e391d23e748b69f61ae5c27fd5620c69fEvan Cheng << "getBinaryCodeForInstr(const MachineInstr &MI) {\n"; 94ad346ad17058d9e1463ab1fe5bfa78444e5d3e9cMisha Brukman 95ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey // Emit instruction base values 96ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey o << " static const unsigned InstBits[] = {\n"; 97ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey for (std::vector<const CodeGenInstruction*>::iterator 98ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey IN = NumberedInstructions.begin(), 99ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey EN = NumberedInstructions.end(); 100ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey IN != EN; ++IN) { 101ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey const CodeGenInstruction *CGI = *IN; 102ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey Record *R = CGI->TheDef; 103ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey 104a683f9ba1356e92a5e7243d9f80fe8a8b6f737c8Jim Laskey if (R->getName() == "PHI" || 105a683f9ba1356e92a5e7243d9f80fe8a8b6f737c8Jim Laskey R->getName() == "INLINEASM" || 1064406604047423576e36657c7ede266ca42e79642Dan Gohman R->getName() == "DBG_LABEL" || 1074406604047423576e36657c7ede266ca42e79642Dan Gohman R->getName() == "EH_LABEL" || 1084406604047423576e36657c7ede266ca42e79642Dan Gohman R->getName() == "GC_LABEL" || 109a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng R->getName() == "DECLARE" || 11008d52071bae2f8cc2e9aa6a451118b83d043813bChristopher Lamb R->getName() == "EXTRACT_SUBREG" || 111da47e6e0d003c873da960361549e57ee4617c301Evan Cheng R->getName() == "INSERT_SUBREG" || 112c9298235251b014e86a7368d92b589d093acb64aChristopher Lamb R->getName() == "IMPLICIT_DEF" || 113f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman R->getName() == "SUBREG_TO_REG" || 11488c7af096b09ad26cbcebfdf40151e04094b7460Dan Gohman R->getName() == "COPY_TO_REGCLASS") { 115bc95b23156058ab3820d03c56709308e604a981bEvan Cheng o << " 0U,\n"; 116ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey continue; 117ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey } 118188454ae2b36e9130ab01e2e5649e3805edb8154Chris Lattner 1196f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner BitsInit *BI = R->getValueAsBitsInit("Inst"); 1209fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman 1219fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman // Start by filling in fixed values... 122fa3e3b9427a643dae2a54f5b2869eb09ad705831Reid Spencer unsigned Value = 0; 123cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) { 124cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman if (BitInit *B = dynamic_cast<BitInit*>(BI->getBit(e-i-1))) { 125cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman Value |= B->getValue() << (e-i-1); 126cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman } 127cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman } 128bc95b23156058ab3820d03c56709308e604a981bEvan Cheng o << " " << Value << "U," << '\t' << "// " << R->getName() << "\n"; 129ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey } 130bc95b23156058ab3820d03c56709308e604a981bEvan Cheng o << " 0U\n };\n"; 131f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 132f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey // Map to accumulate all the cases. 133f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey std::map<std::string, std::vector<std::string> > CaseMap; 134f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 135f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey // Construct all cases statement for each opcode 136f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey for (std::vector<Record*>::iterator IC = Insts.begin(), EC = Insts.end(); 137f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey IC != EC; ++IC) { 138f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey Record *R = *IC; 139f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey const std::string &InstName = R->getName(); 140f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey std::string Case(""); 141f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 142a683f9ba1356e92a5e7243d9f80fe8a8b6f737c8Jim Laskey if (InstName == "PHI" || 143a683f9ba1356e92a5e7243d9f80fe8a8b6f737c8Jim Laskey InstName == "INLINEASM" || 1444406604047423576e36657c7ede266ca42e79642Dan Gohman InstName == "DBG_LABEL"|| 1454406604047423576e36657c7ede266ca42e79642Dan Gohman InstName == "EH_LABEL"|| 1464406604047423576e36657c7ede266ca42e79642Dan Gohman InstName == "GC_LABEL"|| 147a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng InstName == "DECLARE"|| 14808d52071bae2f8cc2e9aa6a451118b83d043813bChristopher Lamb InstName == "EXTRACT_SUBREG" || 149da47e6e0d003c873da960361549e57ee4617c301Evan Cheng InstName == "INSERT_SUBREG" || 150c9298235251b014e86a7368d92b589d093acb64aChristopher Lamb InstName == "IMPLICIT_DEF" || 151f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman InstName == "SUBREG_TO_REG" || 15288c7af096b09ad26cbcebfdf40151e04094b7460Dan Gohman InstName == "COPY_TO_REGCLASS") continue; 153f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman 154ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey BitsInit *BI = R->getValueAsBitsInit("Inst"); 155ed393433d2fd0d680ac5c18ad78e6ebe9afda034Jim Laskey const std::vector<RecordVal> &Vals = R->getValues(); 156f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner CodeGenInstruction &CGI = Target.getInstruction(InstName); 157f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner 15828eefa5464ca6415fcee577d5c47f739535d7e6cMisha Brukman // Loop over all of the fields in the instruction, determining which are the 1593da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman // operands to the instruction. 160cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman unsigned op = 0; 1619fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman for (unsigned i = 0, e = Vals.size(); i != e; ++i) { 16228eefa5464ca6415fcee577d5c47f739535d7e6cMisha Brukman if (!Vals[i].getPrefix() && !Vals[i].getValue()->isComplete()) { 1637eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman // Is the operand continuous? If so, we can just mask and OR it in 1643da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman // instead of doing it bit-by-bit, saving a lot in runtime cost. 165f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey const std::string &VarName = Vals[i].getName(); 166f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey bool gotOp = false; 167f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 168f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey for (int bit = BI->getNumBits()-1; bit >= 0; ) { 169f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey int varBit = getVariableBit(VarName, BI, bit); 170f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 171f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey if (varBit == -1) { 172f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey --bit; 173f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey } else { 174f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey int beginInstBit = bit; 175f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey int beginVarBit = varBit; 176f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey int N = 1; 177f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 178f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey for (--bit; bit >= 0;) { 179f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey varBit = getVariableBit(VarName, BI, bit); 180f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey if (varBit == -1 || varBit != (beginVarBit - N)) break; 181f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey ++N; 182f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey --bit; 183f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey } 1847eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman 185f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey if (!gotOp) { 186f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// If this operand is not supposed to be emitted by the generated 187f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner /// emitter, skip it. 188f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner while (CGI.isFlatOperandNotEmitted(op)) 189f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner ++op; 190f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner 191f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey Case += " // op: " + VarName + "\n" 192f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey + " op = getMachineOpValue(MI, MI.getOperand(" 193f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner + utostr(op++) + "));\n"; 194f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey gotOp = true; 195f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey } 196f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 1971cfa0776c3053b894bcc8c74610e09118340aad3Chris Lattner unsigned opMask = ~0U >> (32-N); 198f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey int opShift = beginVarBit - N + 1; 199f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey opMask <<= opShift; 200f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey opShift = beginInstBit - beginVarBit; 201f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey 202f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey if (opShift > 0) { 203f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey Case += " Value |= (op & " + utostr(opMask) + "U) << " 204f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey + itostr(opShift) + ";\n"; 205f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey } else if (opShift < 0) { 206f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey Case += " Value |= (op & " + utostr(opMask) + "U) >> " 207f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey + itostr(-opShift) + ";\n"; 208f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey } else { 209f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey Case += " Value |= op & " + utostr(opMask) + "U;\n"; 2107eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman } 2117eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman } 2127eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman } 213f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey } 214f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey } 2157eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman 216f64f9a4b75d07819866bfcf918b922a76d3e1600Chris Lattner std::vector<std::string> &InstList = CaseMap[Case]; 217f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey InstList.push_back(InstName); 218f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey } 2193da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 2203da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 221f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey // Emit initial function code 222f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey o << " const unsigned opcode = MI.getOpcode();\n" 223f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey << " unsigned Value = InstBits[opcode];\n" 224e3e36263384a7f4662f2eafa090507602a5c391eEvan Cheng << " unsigned op = 0;\n" 225acff339e391d23e748b69f61ae5c27fd5620c69fEvan Cheng << " op = op; // suppress warning\n" 226f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey << " switch (opcode) {\n"; 2273da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 228f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey // Emit each case statement 229f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey std::map<std::string, std::vector<std::string> >::iterator IE, EE; 230f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey for (IE = CaseMap.begin(), EE = CaseMap.end(); IE != EE; ++IE) { 231f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey const std::string &Case = IE->first; 232f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey std::vector<std::string> &InstList = IE->second; 2333da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 234f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey for (int i = 0, N = InstList.size(); i < N; i++) { 235f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey if (i) o << "\n"; 236f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey o << " case " << Namespace << InstList[i] << ":"; 2379fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman } 238f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey o << " {\n"; 239f1b05bf755c3a083944f03fbf6a83892bc051065Jim Laskey o << Case; 2409fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman o << " break;\n" 2419fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman << " }\n"; 2429fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman } 2437eac4766b156ad2965125a7ee3f1f4834dfbb00bMisha Brukman 24428eefa5464ca6415fcee577d5c47f739535d7e6cMisha Brukman // Default case: unhandled opcode 245cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman o << " default:\n" 246f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling << " cerr << \"Not supported instr: \" << MI << \"\\n\";\n" 247cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman << " abort();\n" 248cbfde0a6128bd7049433e03bba69911d55288fb1Misha Brukman << " }\n" 2499fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman << " return Value;\n" 25028eefa5464ca6415fcee577d5c47f739535d7e6cMisha Brukman << "}\n\n"; 2519fff7e194a2d8aa3abe92efa506b1fbe83583f53Misha Brukman} 252