[PATCH] D20233: Consider Predicates attached to InstAlias
Sjoerd Meijer via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 3 06:20:52 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL271665: Currently AsmWriterEmiter.cpp (used by tblgen -gen-asm-writer) does not (authored by SjoerdMeijer).
Changed prior to commit:
http://reviews.llvm.org/D20233?vs=57160&id=59541#toc
Repository:
rL LLVM
http://reviews.llvm.org/D20233
Files:
llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp
Index: llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp
===================================================================
--- llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp
+++ llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp
@@ -601,7 +601,6 @@
class IAPrinter {
std::vector<std::string> Conds;
std::map<StringRef, std::pair<int, int>> OpMap;
- SmallVector<Record*, 4> ReqFeatures;
std::string Result;
std::string AsmString;
@@ -648,7 +647,7 @@
}
void print(raw_ostream &O) {
- if (Conds.empty() && ReqFeatures.empty()) {
+ if (Conds.empty()) {
O.indent(6) << "return true;\n";
return;
}
@@ -798,6 +797,18 @@
IAPrinter IAP(CGA.Result->getAsString(), CGA.AsmString);
+ std::string Namespace = Target.getName();
+ std::vector<Record *> ReqFeatures;
+ if (PassSubtarget) {
+ // We only consider ReqFeatures predicates if PassSubtarget
+ std::vector<Record *> RF =
+ CGA.TheDef->getValueAsListOfDefs("Predicates");
+ std::copy_if(RF.begin(), RF.end(), std::back_inserter(ReqFeatures),
+ [](Record *R) {
+ return R->getValueAsBit("AssemblerMatcherPredicate");
+ });
+ }
+
unsigned NumMIOps = 0;
for (auto &Operand : CGA.ResultOperands)
NumMIOps += Operand.getMINumOperands();
@@ -902,6 +913,27 @@
}
if (CantHandle) continue;
+
+ for (auto I = ReqFeatures.cbegin(); I != ReqFeatures.cend(); I++) {
+ Record *R = *I;
+ std::string AsmCondString = R->getValueAsString("AssemblerCondString");
+
+ // AsmCondString has syntax [!]F(,[!]F)*
+ SmallVector<StringRef, 4> Ops;
+ SplitString(AsmCondString, Ops, ",");
+ assert(!Ops.empty() && "AssemblerCondString cannot be empty");
+
+ for (auto &Op : Ops) {
+ assert(!Op.empty() && "Empty operator");
+ if (Op[0] == '!')
+ Cond = "!STI.getFeatureBits()[" + Namespace + "::" +
+ Op.substr(1).str() + "]";
+ else
+ Cond = "STI.getFeatureBits()[" + Namespace + "::" + Op.str() + "]";
+ IAP.addCond(Cond);
+ }
+ }
+
IAPrinterMap[Aliases.first].push_back(std::move(IAP));
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D20233.59541.patch
Type: text/x-patch
Size: 2276 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160603/c9ec40a5/attachment.bin>
More information about the llvm-commits
mailing list