forked from OSchip/llvm-project
TableGen subtarget emitter. Generate resolveSchedClass generated hook for resolving instruction variants.
llvm-svn: 164095
This commit is contained in:
parent
1188e439b2
commit
c6c88151bb
|
|
@ -87,6 +87,7 @@ class SubtargetEmitter {
|
||||||
void EmitSchedClassTables(SchedClassTables &SchedTables, raw_ostream &OS);
|
void EmitSchedClassTables(SchedClassTables &SchedTables, raw_ostream &OS);
|
||||||
void EmitProcessorModels(raw_ostream &OS);
|
void EmitProcessorModels(raw_ostream &OS);
|
||||||
void EmitProcessorLookup(raw_ostream &OS);
|
void EmitProcessorLookup(raw_ostream &OS);
|
||||||
|
void EmitSchedModelHelpers(std::string ClassName, raw_ostream &OS);
|
||||||
void EmitSchedModel(raw_ostream &OS);
|
void EmitSchedModel(raw_ostream &OS);
|
||||||
void ParseFeaturesFunction(raw_ostream &OS, unsigned NumFeatures,
|
void ParseFeaturesFunction(raw_ostream &OS, unsigned NumFeatures,
|
||||||
unsigned NumProcs);
|
unsigned NumProcs);
|
||||||
|
|
@ -1109,6 +1110,85 @@ void SubtargetEmitter::EmitSchedModel(raw_ostream &OS) {
|
||||||
OS << "#undef DBGFIELD";
|
OS << "#undef DBGFIELD";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SubtargetEmitter::EmitSchedModelHelpers(std::string ClassName,
|
||||||
|
raw_ostream &OS) {
|
||||||
|
OS << "unsigned " << ClassName
|
||||||
|
<< "\n::resolveSchedClass(unsigned SchedClass, const MachineInstr *MI,"
|
||||||
|
<< " const TargetSchedModel *SchedModel) const {\n";
|
||||||
|
|
||||||
|
std::vector<Record*> Prologs = Records.getAllDerivedDefinitions("PredicateProlog");
|
||||||
|
std::sort(Prologs.begin(), Prologs.end(), LessRecord());
|
||||||
|
for (std::vector<Record*>::const_iterator
|
||||||
|
PI = Prologs.begin(), PE = Prologs.end(); PI != PE; ++PI) {
|
||||||
|
OS << (*PI)->getValueAsString("Code") << '\n';
|
||||||
|
}
|
||||||
|
IdxVec VariantClasses;
|
||||||
|
for (CodeGenSchedModels::SchedClassIter SCI = SchedModels.schedClassBegin(),
|
||||||
|
SCE = SchedModels.schedClassEnd(); SCI != SCE; ++SCI) {
|
||||||
|
if (SCI->Transitions.empty())
|
||||||
|
continue;
|
||||||
|
VariantClasses.push_back(SCI - SchedModels.schedClassBegin());
|
||||||
|
}
|
||||||
|
if (!VariantClasses.empty()) {
|
||||||
|
OS << " switch (SchedClass) {\n";
|
||||||
|
for (IdxIter VCI = VariantClasses.begin(), VCE = VariantClasses.end();
|
||||||
|
VCI != VCE; ++VCI) {
|
||||||
|
const CodeGenSchedClass &SC = SchedModels.getSchedClass(*VCI);
|
||||||
|
OS << " case " << *VCI << ": // " << SC.Name << '\n';
|
||||||
|
IdxVec ProcIndices;
|
||||||
|
for (std::vector<CodeGenSchedTransition>::const_iterator
|
||||||
|
TI = SC.Transitions.begin(), TE = SC.Transitions.end();
|
||||||
|
TI != TE; ++TI) {
|
||||||
|
IdxVec PI;
|
||||||
|
std::set_union(TI->ProcIndices.begin(), TI->ProcIndices.end(),
|
||||||
|
ProcIndices.begin(), ProcIndices.end(),
|
||||||
|
std::back_inserter(PI));
|
||||||
|
ProcIndices.swap(PI);
|
||||||
|
}
|
||||||
|
for (IdxIter PI = ProcIndices.begin(), PE = ProcIndices.end();
|
||||||
|
PI != PE; ++PI) {
|
||||||
|
OS << " ";
|
||||||
|
if (*PI != 0)
|
||||||
|
OS << "if (SchedModel->getProcessorID() == " << *PI << ") ";
|
||||||
|
OS << "{ // " << (SchedModels.procModelBegin() + *PI)->ModelName
|
||||||
|
<< '\n';
|
||||||
|
for (std::vector<CodeGenSchedTransition>::const_iterator
|
||||||
|
TI = SC.Transitions.begin(), TE = SC.Transitions.end();
|
||||||
|
TI != TE; ++TI) {
|
||||||
|
OS << " if (";
|
||||||
|
if (*PI != 0 && !std::count(TI->ProcIndices.begin(),
|
||||||
|
TI->ProcIndices.end(), *PI)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (RecIter RI = TI->PredTerm.begin(), RE = TI->PredTerm.end();
|
||||||
|
RI != RE; ++RI) {
|
||||||
|
if (RI != TI->PredTerm.begin())
|
||||||
|
OS << "\n && ";
|
||||||
|
OS << "(" << (*RI)->getValueAsString("Predicate") << ")";
|
||||||
|
}
|
||||||
|
OS << ")\n"
|
||||||
|
<< " return " << TI->ToClassIdx << "; // "
|
||||||
|
<< SchedModels.getSchedClass(TI->ToClassIdx).Name << '\n';
|
||||||
|
}
|
||||||
|
OS << " }\n";
|
||||||
|
if (*PI == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
unsigned SCIdx = 0;
|
||||||
|
if (SC.ItinClassDef)
|
||||||
|
SCIdx = SchedModels.getSchedClassIdxForItin(SC.ItinClassDef);
|
||||||
|
else
|
||||||
|
SCIdx = SchedModels.findSchedClassIdx(SC.Writes, SC.Reads);
|
||||||
|
if (SCIdx != *VCI)
|
||||||
|
OS << " return " << SCIdx << ";\n";
|
||||||
|
OS << " break;\n";
|
||||||
|
}
|
||||||
|
OS << " };\n";
|
||||||
|
}
|
||||||
|
OS << " report_fatal_error(\"Expected a variant SchedClass\");\n"
|
||||||
|
<< "} // " << ClassName << "::resolveSchedClass\n";
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// ParseFeaturesFunction - Produces a subtarget specific function for parsing
|
// ParseFeaturesFunction - Produces a subtarget specific function for parsing
|
||||||
// the subtarget features string.
|
// the subtarget features string.
|
||||||
|
|
@ -1238,6 +1318,8 @@ void SubtargetEmitter::run(raw_ostream &OS) {
|
||||||
<< " explicit " << ClassName << "(StringRef TT, StringRef CPU, "
|
<< " explicit " << ClassName << "(StringRef TT, StringRef CPU, "
|
||||||
<< "StringRef FS);\n"
|
<< "StringRef FS);\n"
|
||||||
<< "public:\n"
|
<< "public:\n"
|
||||||
|
<< " unsigned resolveSchedClass(unsigned SchedClass, const MachineInstr *DefMI,"
|
||||||
|
<< " const TargetSchedModel *SchedModel) const;\n"
|
||||||
<< " DFAPacketizer *createDFAPacketizer(const InstrItineraryData *IID)"
|
<< " DFAPacketizer *createDFAPacketizer(const InstrItineraryData *IID)"
|
||||||
<< " const;\n"
|
<< " const;\n"
|
||||||
<< "};\n";
|
<< "};\n";
|
||||||
|
|
@ -1292,6 +1374,8 @@ void SubtargetEmitter::run(raw_ostream &OS) {
|
||||||
OS << "0, 0, 0, ";
|
OS << "0, 0, 0, ";
|
||||||
OS << NumFeatures << ", " << NumProcs << ");\n}\n\n";
|
OS << NumFeatures << ", " << NumProcs << ");\n}\n\n";
|
||||||
|
|
||||||
|
EmitSchedModelHelpers(ClassName, OS);
|
||||||
|
|
||||||
OS << "} // End llvm namespace \n";
|
OS << "} // End llvm namespace \n";
|
||||||
|
|
||||||
OS << "#endif // GET_SUBTARGETINFO_CTOR\n\n";
|
OS << "#endif // GET_SUBTARGETINFO_CTOR\n\n";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue