2 #include "CodeEmitterGen.h"
5 void CodeEmitterGen::createEmitter(std::ostream &o) {
6 std::vector<Record*> Insts;
8 const std::map<std::string, Record*> &Defs = Records.getDefs();
9 Record *Inst = Records.getClass("Instruction");
10 assert(Inst && "Couldn't find Instruction class!");
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);
17 std::string Namespace = "V9::";
18 std::string ClassName = "SparcV9CodeEmitter::";
20 //const std::string &Namespace = Inst->getValue("Namespace")->getName();
21 o << "unsigned " << ClassName
22 << "getBinaryCodeForInstr(MachineInstr &MI) {\n"
23 << " unsigned Value = 0;\n"
24 << " std::cerr << MI;\n"
25 << " switch (MI.getOpcode()) {\n";
26 for (std::vector<Record*>::iterator I = Insts.begin(), E = Insts.end();
30 o << " case " << Namespace << R->getName() << ": {\n"
31 << " std::cerr << \"Emitting " << R->getName() << "\\n\";\n";
33 const RecordVal *InstVal = R->getValue("Inst");
34 Init *InitVal = InstVal->getValue();
36 assert(dynamic_cast<BitsInit*>(InitVal) &&
37 "Can only handle undefined bits<> types!");
38 BitsInit *BI = (BitsInit*)InitVal;
41 const std::vector<RecordVal> &Vals = R->getValues();
43 o << " // prefilling: ";
44 // Start by filling in fixed values...
45 for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) {
46 if (BitInit *B = dynamic_cast<BitInit*>(BI->getBit(e-i-1))) {
47 Value |= B->getValue() << (e-i-1);
55 o << " // " << *InstVal << "\n";
56 o << " Value = " << Value << "U;\n\n";
58 // Loop over all of the fields in the instruction adding in any
59 // contributions to this value (due to bit references).
62 std::map<const std::string,unsigned> OpOrder;
63 for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
64 if (Vals[i].getName() != "Inst" &&
65 !Vals[i].getValue()->isComplete() &&
66 /* ignore annul and predict bits since no one sets them yet */
67 Vals[i].getName() != "annul" &&
68 Vals[i].getName() != "predict")
70 o << " // op" << op << ": " << Vals[i].getName() << "\n"
71 << " int64_t op" << op
72 <<" = getMachineOpValue(MI, MI.getOperand("<<op<<"));\n";
73 //<< " MachineOperand &op" << op <<" = MI.getOperand("<<op<<");\n";
74 OpOrder[Vals[i].getName()] = op++;
79 for (int f = Vals.size()-1; f >= 0; --f) {
80 if (Vals[f].getPrefix()) {
81 BitsInit *FieldInitializer = (BitsInit*)Vals[f].getValue();
83 // Scan through the field looking for bit initializers of the current
85 for (int i = FieldInitializer->getNumBits()-1; i >= 0; --i) {
86 if (BitInit *BI=dynamic_cast<BitInit*>(FieldInitializer->getBit(i))){
88 } else if (UnsetInit *UI =
89 dynamic_cast<UnsetInit*>(FieldInitializer->getBit(i))) {
91 } else if (VarBitInit *VBI =
92 dynamic_cast<VarBitInit*>(FieldInitializer->getBit(i))) {
93 TypedInit *TI = VBI->getVariable();
94 if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
95 o << " Value |= getValueBit(op" << OpOrder[VI->getName()]
96 << ", " << VBI->getBitNum()
97 << ")" << " << " << Offset << ";\n";
99 } else if (FieldInit *FI = dynamic_cast<FieldInit*>(TI)) {
100 // FIXME: implement this!
101 o << "FIELD INIT not implemented yet!\n";
103 o << "Error: UNIMPLEMENTED\n";
108 // ignore annul and predict bits since no one sets them yet
109 if (Vals[f].getName() == "annul" || Vals[f].getName() == "predict")
118 << " std::cerr << \"Not supported instr: \" << MI << \"\\n\";\n"
121 << " return Value;\n"