mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 02:29:18 +00:00
Emit itinerary class in instruction info.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24122 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
10b1dd99f3
commit
b5a0c0ee05
@ -76,6 +76,8 @@ static std::vector<Record*> GetOperandInfo(const CodeGenInstruction &Inst) {
|
|||||||
|
|
||||||
// run - Emit the main instruction description records for the target...
|
// run - Emit the main instruction description records for the target...
|
||||||
void InstrInfoEmitter::run(std::ostream &OS) {
|
void InstrInfoEmitter::run(std::ostream &OS) {
|
||||||
|
GatherItinClasses();
|
||||||
|
|
||||||
EmitSourceFileHeader("Target Instruction Descriptors", OS);
|
EmitSourceFileHeader("Target Instruction Descriptors", OS);
|
||||||
OS << "namespace llvm {\n\n";
|
OS << "namespace llvm {\n\n";
|
||||||
|
|
||||||
@ -168,7 +170,13 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
|
|||||||
OS << Inst.TheDef->getName();
|
OS << Inst.TheDef->getName();
|
||||||
else
|
else
|
||||||
OS << Inst.Name;
|
OS << Inst.Name;
|
||||||
OS << "\",\t" << NumOperands << ", -1, 0, false, 0, 0, 0, 0";
|
|
||||||
|
unsigned ItinClass = !IsItineraries ? 0 :
|
||||||
|
ItinClassNumber(Inst.TheDef->getValueAsDef("Itinerary")->getName());
|
||||||
|
|
||||||
|
OS << "\",\t" << NumOperands << ", -1, 0, false, 0, 0, "
|
||||||
|
<< ItinClass
|
||||||
|
<< ", 0";
|
||||||
|
|
||||||
// Emit all of the target indepedent flags...
|
// Emit all of the target indepedent flags...
|
||||||
if (Inst.isReturn) OS << "|M_RET_FLAG";
|
if (Inst.isReturn) OS << "|M_RET_FLAG";
|
||||||
@ -222,6 +230,30 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
|
|||||||
OS << " }, // Inst #" << Num << " = " << Inst.TheDef->getName() << "\n";
|
OS << " }, // Inst #" << Num << " = " << Inst.TheDef->getName() << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct LessRecord {
|
||||||
|
bool operator()(const Record *Rec1, const Record *Rec2) const {
|
||||||
|
return Rec1->getName() < Rec2->getName();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
void InstrInfoEmitter::GatherItinClasses() {
|
||||||
|
std::vector<Record*> DefList =
|
||||||
|
Records.getAllDerivedDefinitions("InstrItinClass");
|
||||||
|
IsItineraries = !DefList.empty();
|
||||||
|
|
||||||
|
if (!IsItineraries) return;
|
||||||
|
|
||||||
|
sort(DefList.begin(), DefList.end(), LessRecord());
|
||||||
|
|
||||||
|
for (unsigned i = 0, N = DefList.size(); i < N; i++) {
|
||||||
|
Record *Def = DefList[i];
|
||||||
|
ItinClassMap[Def->getName()] = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned InstrInfoEmitter::ItinClassNumber(std::string ItinName) {
|
||||||
|
return ItinClassMap[ItinName];
|
||||||
|
}
|
||||||
|
|
||||||
void InstrInfoEmitter::emitShiftedValue(Record *R, StringInit *Val,
|
void InstrInfoEmitter::emitShiftedValue(Record *R, StringInit *Val,
|
||||||
IntInit *ShiftInt, std::ostream &OS) {
|
IntInit *ShiftInt, std::ostream &OS) {
|
||||||
if (Val == 0 || ShiftInt == 0)
|
if (Val == 0 || ShiftInt == 0)
|
||||||
|
@ -28,8 +28,11 @@ struct CodeGenInstruction;
|
|||||||
|
|
||||||
class InstrInfoEmitter : public TableGenBackend {
|
class InstrInfoEmitter : public TableGenBackend {
|
||||||
RecordKeeper &Records;
|
RecordKeeper &Records;
|
||||||
|
bool IsItineraries;
|
||||||
|
std::map<std::string, unsigned> ItinClassMap;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
InstrInfoEmitter(RecordKeeper &R) : Records(R) {}
|
InstrInfoEmitter(RecordKeeper &R) : Records(R), IsItineraries(false) {}
|
||||||
|
|
||||||
// run - Output the instruction set description, returning true on failure.
|
// run - Output the instruction set description, returning true on failure.
|
||||||
void run(std::ostream &OS);
|
void run(std::ostream &OS);
|
||||||
@ -44,6 +47,8 @@ private:
|
|||||||
std::map<std::vector<Record*>, unsigned> &EL,
|
std::map<std::vector<Record*>, unsigned> &EL,
|
||||||
std::map<std::vector<Record*>, unsigned> &OpInfo,
|
std::map<std::vector<Record*>, unsigned> &OpInfo,
|
||||||
std::ostream &OS);
|
std::ostream &OS);
|
||||||
|
void GatherItinClasses();
|
||||||
|
unsigned ItinClassNumber(std::string ItinName);
|
||||||
void emitShiftedValue(Record *R, StringInit *Val, IntInit *Shift,
|
void emitShiftedValue(Record *R, StringInit *Val, IntInit *Shift,
|
||||||
std::ostream &OS);
|
std::ostream &OS);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user