[llvm-commits] CVS: llvm/utils/TableGen/CodeEmitterGen.cpp CodeEmitterGen.h
Misha Brukman
brukman at cs.uiuc.edu
Fri May 23 19:17:01 PDT 2003
Changes in directory llvm/utils/TableGen:
CodeEmitterGen.cpp added (r1.1)
CodeEmitterGen.h added (r1.1)
---
Log message:
First cut at the Code Generator using the TableGen methodology.
---
Diffs of the changes:
Index: llvm/utils/TableGen/CodeEmitterGen.cpp
diff -c /dev/null llvm/utils/TableGen/CodeEmitterGen.cpp:1.1
*** /dev/null Fri May 23 19:16:03 2003
--- llvm/utils/TableGen/CodeEmitterGen.cpp Fri May 23 19:15:53 2003
***************
*** 0 ****
--- 1,105 ----
+ #include "Record.h"
+ #include "CodeEmitterGen.h"
+ #include <ostream>
+
+ void CodeEmitterGen::createEmitter(std::ostream &o) {
+ std::vector<Record*> Insts;
+
+ const std::map<std::string, Record*> &Defs = Records.getDefs();
+ Record *Inst = Records.getClass("Instruction");
+ assert(Inst && "Couldn't find Instruction class!");
+
+ for (std::map<std::string, Record*>::const_iterator I = Defs.begin(),
+ E = Defs.end(); I != E; ++I)
+ if (I->second->isSubClassOf(Inst))
+ Insts.push_back(I->second);
+
+ std::string Namespace = "V9::";
+ std::string ClassName = "SparcV9CodeEmitter::";
+
+ //const std::string &Namespace = Inst->getValue("Namespace")->getName();
+ o << "unsigned " << ClassName
+ << "getBinaryCodeForInstr(MachineInstr &MI) {\n"
+ << " unsigned Value = 0;\n"
+ << " switch (MI.getOpcode()) {\n";
+ for (std::vector<Record*>::iterator I = Insts.begin(), E = Insts.end();
+ I != E; ++I)
+ {
+ Record *R = *I;
+ o << " case " << Namespace << R->getName() << ": {\n";
+
+ const RecordVal *InstVal = R->getValue("Inst");
+ Init *InitVal = InstVal->getValue();
+
+ assert(dynamic_cast<BitsInit*>(InitVal) &&
+ "Can only handle undefined bits<> types!");
+ BitsInit *BI = (BitsInit*)InitVal;
+
+ unsigned Value = 0;
+ const std::vector<RecordVal> &Vals = R->getValues();
+
+ // Start by filling in fixed values...
+ for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i)
+ if (BitInit *B = dynamic_cast<BitInit*>(BI->getBit(i)))
+ Value |= B->getValue() << i;
+
+ o << " Value = " << Value << "U;\n";
+ o << " // " << *InstVal << "\n";
+
+ // Loop over all of the fields in the instruction adding in any
+ // contributions to this value (due to bit references).
+ //
+ unsigned Offset = 31, opNum=0;
+ std::map<const std::string,unsigned> OpOrder;
+ for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
+ if (Vals[i].getName() != "Inst" &&
+ !Vals[i].getValue()->isComplete() &&
+ Vals[i].getName() != "annul" &&
+ Vals[i].getName() != "cc" &&
+ Vals[i].getName() != "predict")
+ {
+ o << " // " << opNum << ": " << Vals[i].getName() << "\n";
+ OpOrder[Vals[i].getName()] = opNum++;
+ }
+ }
+
+ for (int f = Vals.size()-1; f >= 0; --f) {
+ if (Vals[f].getPrefix()) {
+ BitsInit *FieldInitializer = (BitsInit*)Vals[f].getValue();
+
+ // Scan through the field looking for bit initializers of the current
+ // variable...
+ for (int i = FieldInitializer->getNumBits()-1; i >= 0; --i) {
+
+ if (BitInit *BI=dynamic_cast<BitInit*>(FieldInitializer->getBit(i))){
+ --Offset;
+ } else if (UnsetInit *UI =
+ dynamic_cast<UnsetInit*>(FieldInitializer->getBit(i))) {
+ --Offset;
+ } else if (VarBitInit *VBI =
+ dynamic_cast<VarBitInit*>(FieldInitializer->getBit(i))) {
+ TypedInit *TI = VBI->getVariable();
+ if (VarInit *VI = dynamic_cast<VarInit*>(TI)) {
+ o << " Value |= getValueBit(MI.getOperand("
+ << OpOrder[VI->getName()]
+ << "), " << VBI->getBitNum()
+ << ")" << " << " << Offset << ";\n";
+ --Offset;
+ } else if (FieldInit *FI = dynamic_cast<FieldInit*>(TI)) {
+ // FIXME: implement this!
+ o << "FIELD INIT not implemented yet!\n";
+ } else {
+ o << "something else\n";
+ }
+ }
+ }
+ }
+ }
+
+ o << " break;\n"
+ << " }\n";
+ }
+ o << " }\n"
+ << " return Value;\n"
+ << "}\n";
+ }
Index: llvm/utils/TableGen/CodeEmitterGen.h
diff -c /dev/null llvm/utils/TableGen/CodeEmitterGen.h:1.1
*** /dev/null Fri May 23 19:16:03 2003
--- llvm/utils/TableGen/CodeEmitterGen.h Fri May 23 19:15:53 2003
***************
*** 0 ****
--- 1,23 ----
+ //===- CodeEmitterGen.h - Code Emitter Generator ----------------*- C++ -*-===//
+ //
+ //
+ //===----------------------------------------------------------------------===//
+
+ #ifndef CODEMITTERGEN_H
+ #define CODEMITTERGEN_H
+
+ #include "Record.h"
+ #include <ostream>
+
+ struct CodeEmitterGen {
+ RecordKeeper &Records;
+
+ public:
+ CodeEmitterGen(RecordKeeper &R) : Records(R) {}
+
+ void createEmitter(std::ostream &o);
+ void emitMachineOpEmitter(std::ostream &o, const std::string &Namespace);
+ void emitGetValueBit(std::ostream &o, const std::string &Namespace);
+ };
+
+ #endif
More information about the llvm-commits
mailing list