0d378871e8c432daa6c18b769a612bb8fa320397
[oota-llvm.git] / utils / TableGen / CodeEmitterGen.cpp
1 #include "Record.h"
2 #include "CodeEmitterGen.h"
3 #include <ostream>
4
5 void CodeEmitterGen::createEmitter(std::ostream &o) {
6   std::vector<Record*> Insts;
7
8   const std::map<std::string, Record*> &Defs = Records.getDefs();
9   Record *Inst = Records.getClass("Instruction");
10   assert(Inst && "Couldn't find Instruction class!");
11
12   for (std::map<std::string, Record*>::const_iterator I = Defs.begin(),
13          E = Defs.end(); I != E; ++I)
14     if (I->second->isSubClassOf(Inst))
15       Insts.push_back(I->second);
16
17   std::string Namespace = "V9::";
18   std::string ClassName = "SparcV9CodeEmitter::";
19
20   //const std::string &Namespace = Inst->getValue("Namespace")->getName();
21   o << "unsigned " << ClassName
22     << "getBinaryCodeForInstr(MachineInstr &MI) {\n"
23     << "  unsigned Value = 0;\n"
24     << "  switch (MI.getOpcode()) {\n";
25   for (std::vector<Record*>::iterator I = Insts.begin(), E = Insts.end();
26        I != E; ++I)
27   {
28     Record *R = *I;
29     o << "    case " << Namespace << R->getName() << ": {\n";
30
31     const RecordVal *InstVal = R->getValue("Inst");
32     Init *InitVal = InstVal->getValue();
33
34     assert(dynamic_cast<BitsInit*>(InitVal) &&
35            "Can only handle undefined bits<> types!");
36     BitsInit *BI = (BitsInit*)InitVal;
37
38     unsigned Value = 0;
39     const std::vector<RecordVal> &Vals = R->getValues();
40
41     // Start by filling in fixed values...
42     for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i)
43       if (BitInit *B = dynamic_cast<BitInit*>(BI->getBit(i)))
44         Value |= B->getValue() << i;
45
46     o << "      Value = " << Value << "U;\n";
47     o << "      // " << *InstVal << "\n";
48     
49     // Loop over all of the fields in the instruction adding in any
50     // contributions to this value (due to bit references).
51     //
52     unsigned Offset = 31, opNum=0;
53     std::map<const std::string,unsigned> OpOrder;
54     for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
55       if (Vals[i].getName() != "Inst" && 
56           !Vals[i].getValue()->isComplete() &&
57           Vals[i].getName() != "annul" && 
58           Vals[i].getName() != "cc" &&
59           Vals[i].getName() != "predict")
60       {
61         o << "      // " << opNum << ": " << Vals[i].getName() << "\n";
62         OpOrder[Vals[i].getName()] = opNum++;
63       }
64     }
65
66     for (int f = Vals.size()-1; f >= 0; --f) {
67       if (Vals[f].getPrefix()) {
68         BitsInit *FieldInitializer = (BitsInit*)Vals[f].getValue();
69
70         // Scan through the field looking for bit initializers of the current
71         // variable...
72         for (int i = FieldInitializer->getNumBits()-1; i >= 0; --i) {
73           
74           if (BitInit *BI=dynamic_cast<BitInit*>(FieldInitializer->getBit(i))){
75             --Offset;
76           } else if (UnsetInit *UI = 
77                      dynamic_cast<UnsetInit*>(FieldInitializer->getBit(i))) {
78             --Offset;
79           } else if (VarBitInit *VBI =
80                      dynamic_cast<VarBitInit*>(FieldInitializer->getBit(i))) {
81             TypedInit *TI = VBI->getVariable();
82             if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
83               o << "      Value |= getValueBit(MI.getOperand(" 
84                 << OpOrder[VI->getName()]
85                 << "), " << VBI->getBitNum()
86                 << ")" << " << " << Offset << ";\n";
87               --Offset;
88             } else if (FieldInit *FI = dynamic_cast<FieldInit*>(TI)) {
89               // FIXME: implement this!
90               o << "FIELD INIT not implemented yet!\n";
91             } else {
92               o << "something else\n";
93             }
94           }
95         }
96       }
97     }
98
99     o << "      break;\n"
100       << "    }\n";
101   }
102   o << "  }\n"
103     << "  return Value;\n"
104     << "}\n";
105 }