Changeset View
Changeset View
Standalone View
Standalone View
llvm/utils/TableGen/SubtargetFeatureInfo.cpp
Show First 20 Lines • Show All 113 Lines • ▼ Show 20 Lines | void SubtargetFeatureInfo::emitComputeAssemblerAvailableFeatures( | ||||
SubtargetFeatureInfoMap &SubtargetFeatures, raw_ostream &OS) { | SubtargetFeatureInfoMap &SubtargetFeatures, raw_ostream &OS) { | ||||
OS << "FeatureBitset " << TargetName << ClassName << "::\n" | OS << "FeatureBitset " << TargetName << ClassName << "::\n" | ||||
<< FuncName << "(const FeatureBitset& FB) const {\n"; | << FuncName << "(const FeatureBitset& FB) const {\n"; | ||||
OS << " FeatureBitset Features;\n"; | OS << " FeatureBitset Features;\n"; | ||||
for (const auto &SF : SubtargetFeatures) { | for (const auto &SF : SubtargetFeatures) { | ||||
const SubtargetFeatureInfo &SFI = SF.second; | const SubtargetFeatureInfo &SFI = SF.second; | ||||
OS << " if ("; | OS << " if ("; | ||||
std::string CondStorage = | |||||
std::string(SFI.TheDef->getValueAsString("AssemblerCondString")); | |||||
StringRef Conds = CondStorage; | |||||
std::pair<StringRef, StringRef> Comma = Conds.split(','); | |||||
bool First = true; | |||||
do { | |||||
if (!First) | |||||
OS << " && "; | |||||
bool Neg = false; | const DagInit *D = SFI.TheDef->getValueAsDag("AssemblerCondDag"); | ||||
StringRef Cond = Comma.first; | StringRef CombineType = D->getOperator()->getAsString(); | ||||
luismarques: Better to put something that indicates that this isn't currently implemented, but could be… | |||||
if (Cond[0] == '!') { | if (CombineType != "any_of" && CombineType != "all_of") | ||||
Neg = true; | PrintFatalError(SFI.TheDef->getLoc(), "Invalid AssemblerCondDag!"); | ||||
Cond = Cond.substr(1); | if (D->getNumArgs() == 0) | ||||
} | PrintFatalError(SFI.TheDef->getLoc(), "Invalid AssemblerCondDag!"); | ||||
bool IsOr = CombineType == "any_of"; | |||||
if (IsOr) | |||||
OS << "("; | OS << "("; | ||||
if (Neg) | |||||
OS << "!"; | |||||
OS << "FB[" << TargetName << "::" << Cond << "])"; | |||||
if (Comma.second.empty()) | bool First = true; | ||||
break; | for (auto *Arg : D->getArgs()) { | ||||
if (!First) { | |||||
if (IsOr) | |||||
OS << " || "; | |||||
else | |||||
OS << " && "; | |||||
} | |||||
if (auto *NotArg = dyn_cast<DagInit>(Arg)) { | |||||
if (NotArg->getOperator()->getAsString() != "not" || | |||||
NotArg->getNumArgs() != 1) | |||||
PrintFatalError(SFI.TheDef->getLoc(), "Invalid AssemblerCondDag!"); | |||||
Arg = NotArg->getArg(0); | |||||
OS << "!"; | |||||
} | |||||
if (!isa<DefInit>(Arg) || | |||||
!cast<DefInit>(Arg)->getDef()->isSubClassOf("SubtargetFeature")) | |||||
PrintFatalError(SFI.TheDef->getLoc(), "Invalid AssemblerCondDag!"); | |||||
OS << "FB[" << TargetName << "::" << Arg->getAsString() << "]"; | |||||
First = false; | First = false; | ||||
Comma = Comma.second.split(','); | } | ||||
} while (true); | |||||
if (IsOr) | |||||
OS << ")"; | |||||
OS << ")\n"; | OS << ")\n"; | ||||
OS << " Features.set(" << SFI.getEnumBitName() << ");\n"; | OS << " Features.set(" << SFI.getEnumBitName() << ");\n"; | ||||
} | } | ||||
OS << " return Features;\n"; | OS << " return Features;\n"; | ||||
OS << "}\n\n"; | OS << "}\n\n"; | ||||
} | } |
Better to put something that indicates that this isn't currently implemented, but could be supported.