2 #include "CodeEmitterGen.h"
4 void CodeEmitterGen::createEmitter(std::ostream &o) {
5 std::vector<Record*> Insts;
7 const std::map<std::string, Record*> &Defs = Records.getDefs();
8 Record *Inst = Records.getClass("Instruction");
9 assert(Inst && "Couldn't find Instruction class!");
11 for (std::map<std::string, Record*>::const_iterator I = Defs.begin(),
12 E = Defs.end(); I != E; ++I)
13 if (I->second->isSubClassOf(Inst))
14 Insts.push_back(I->second);
16 std::string Namespace = "V9::";
17 std::string ClassName = "SparcV9CodeEmitter::";
19 //const std::string &Namespace = Inst->getValue("Namespace")->getName();
20 o << "unsigned " << ClassName
21 << "getBinaryCodeForInstr(MachineInstr &MI) {\n"
22 << " unsigned Value = 0;\n"
23 << " DEBUG(std::cerr << MI);\n"
24 << " switch (MI.getOpcode()) {\n";
25 for (std::vector<Record*>::iterator I = Insts.begin(), E = Insts.end();
29 o << " case " << Namespace << R->getName() << ": {\n"
30 << " DEBUG(std::cerr << \"Emitting " << R->getName() << "\\n\");\n";
32 const RecordVal *InstVal = R->getValue("Inst");
33 Init *InitVal = InstVal->getValue();
35 assert(dynamic_cast<BitsInit*>(InitVal) &&
36 "Can only handle undefined bits<> types!");
37 BitsInit *BI = (BitsInit*)InitVal;
40 const std::vector<RecordVal> &Vals = R->getValues();
42 o << " // prefilling: ";
43 // Start by filling in fixed values...
44 for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) {
45 if (BitInit *B = dynamic_cast<BitInit*>(BI->getBit(e-i-1))) {
46 Value |= B->getValue() << (e-i-1);
54 o << " // " << *InstVal << "\n";
55 o << " Value = " << Value << "U;\n\n";
57 // Loop over all of the fields in the instruction adding in any
58 // contributions to this value (due to bit references).
61 std::map<const std::string,unsigned> OpOrder;
62 for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
63 if (Vals[i].getName() != "Inst" &&
64 !Vals[i].getValue()->isComplete() &&
65 /* ignore annul and predict bits since no one sets them yet */
66 Vals[i].getName() != "annul" &&
67 Vals[i].getName() != "predict")
69 o << " // op" << op << ": " << Vals[i].getName() << "\n"
70 << " int64_t op" << op
71 <<" = getMachineOpValue(MI, MI.getOperand("<<op<<"));\n";
72 //<< " MachineOperand &op" << op <<" = MI.getOperand("<<op<<");\n";
73 OpOrder[Vals[i].getName()] = op++;
77 for (unsigned f = 0, e = Vals.size(); f != e; ++f) {
78 if (Vals[f].getPrefix()) {
79 BitsInit *FieldInitializer = (BitsInit*)Vals[f].getValue();
81 // Scan through the field looking for bit initializers of the current
83 for (int i = FieldInitializer->getNumBits()-1; i >= 0; --i) {
84 if (BitInit *BI=dynamic_cast<BitInit*>(FieldInitializer->getBit(i))){
85 o << " // bit init: f: " << f << ", i: " << i << "\n";
86 } else if (UnsetInit *UI =
87 dynamic_cast<UnsetInit*>(FieldInitializer->getBit(i))) {
88 o << " // unset init: f: " << f << ", i: " << i << "\n";
89 } else if (VarBitInit *VBI =
90 dynamic_cast<VarBitInit*>(FieldInitializer->getBit(i))) {
91 TypedInit *TI = VBI->getVariable();
92 if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
93 o << " Value |= getValueBit(op" << OpOrder[VI->getName()]
94 << ", " << VBI->getBitNum()
95 << ")" << " << " << i << ";\n";
96 } else if (FieldInit *FI = dynamic_cast<FieldInit*>(TI)) {
97 // FIXME: implement this!
98 o << "FIELD INIT not implemented yet!\n";
100 o << "Error: UNIMPLEMENTED\n";
105 // ignore annul and predict bits since no one sets them yet
106 if (Vals[f].getName() == "annul" || Vals[f].getName() == "predict") {
107 o << " // found " << Vals[f].getName() << "\n";
116 << " DEBUG(std::cerr << \"Not supported instr: \" << MI << \"\\n\");\n"
119 << " return Value;\n"