summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-01-24 20:46:50 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-01-24 20:46:50 +0000
commitc5c228fa5967f986b6010b37ea0978b8e18427b3 (patch)
treea710477076ba36d50477984ea425f3fc718dbef4
parent295e19655865a195ccaa337bacfb262465bc40f4 (diff)
downloadbcm5719-llvm-c5c228fa5967f986b6010b37ea0978b8e18427b3.tar.gz
bcm5719-llvm-c5c228fa5967f986b6010b37ea0978b8e18427b3.zip
Fix an optional in flag bug.
llvm-svn: 25590
-rw-r--r--llvm/utils/TableGen/DAGISelEmitter.cpp83
1 files changed, 64 insertions, 19 deletions
diff --git a/llvm/utils/TableGen/DAGISelEmitter.cpp b/llvm/utils/TableGen/DAGISelEmitter.cpp
index 5e63042c90f..e76dd8fd554 100644
--- a/llvm/utils/TableGen/DAGISelEmitter.cpp
+++ b/llvm/utils/TableGen/DAGISelEmitter.cpp
@@ -2206,26 +2206,71 @@ public:
<< NumResults << ");\n";
}
} else if (HasChain || HasOutFlag) {
- OS << " SDOperand Result = CurDAG->getTargetNode("
- << II.Namespace << "::" << II.TheDef->getName();
-
- // Output order: results, chain, flags
- // Result types.
- if (NumResults > 0) {
- if (N->getTypeNum(0) != MVT::isVoid)
- OS << ", MVT::" << getEnumName(N->getTypeNum(0));
+ if (HasOptInFlag) {
+ OS << " SDOperand Result = SDOperand(0, 0);\n";
+ unsigned FlagNo = (unsigned) NodeHasChain + Pattern->getNumChildren();
+ OS << " if (N.getNumOperands() == " << FlagNo+1 << ")\n";
+ OS << " Result = CurDAG->getTargetNode("
+ << II.Namespace << "::" << II.TheDef->getName();
+
+ // Output order: results, chain, flags
+ // Result types.
+ if (NumResults > 0) {
+ if (N->getTypeNum(0) != MVT::isVoid)
+ OS << ", MVT::" << getEnumName(N->getTypeNum(0));
+ }
+ if (HasChain)
+ OS << ", MVT::Other";
+ if (HasOutFlag)
+ OS << ", MVT::Flag";
+
+ // Inputs.
+ for (unsigned i = 0, e = Ops.size(); i != e; ++i)
+ OS << ", Tmp" << Ops[i];
+ if (HasChain) OS << ", Chain";
+ OS << ", InFlag);\n";
+
+ OS << " else\n";
+ OS << " Result = CurDAG->getTargetNode("
+ << II.Namespace << "::" << II.TheDef->getName();
+
+ // Output order: results, chain, flags
+ // Result types.
+ if (NumResults > 0) {
+ if (N->getTypeNum(0) != MVT::isVoid)
+ OS << ", MVT::" << getEnumName(N->getTypeNum(0));
+ }
+ if (HasChain)
+ OS << ", MVT::Other";
+ if (HasOutFlag)
+ OS << ", MVT::Flag";
+
+ // Inputs.
+ for (unsigned i = 0, e = Ops.size(); i != e; ++i)
+ OS << ", Tmp" << Ops[i];
+ if (HasChain) OS << ", Chain);\n";
+ } else {
+ OS << " SDOperand Result = CurDAG->getTargetNode("
+ << II.Namespace << "::" << II.TheDef->getName();
+
+ // Output order: results, chain, flags
+ // Result types.
+ if (NumResults > 0) {
+ if (N->getTypeNum(0) != MVT::isVoid)
+ OS << ", MVT::" << getEnumName(N->getTypeNum(0));
+ }
+ if (HasChain)
+ OS << ", MVT::Other";
+ if (HasOutFlag)
+ OS << ", MVT::Flag";
+
+ // Inputs.
+ for (unsigned i = 0, e = Ops.size(); i != e; ++i)
+ OS << ", Tmp" << Ops[i];
+ if (HasChain) OS << ", Chain";
+ if (HasInFlag || HasImpInputs) OS << ", InFlag";
+ OS << ");\n";
}
- if (HasChain)
- OS << ", MVT::Other";
- if (HasOutFlag)
- OS << ", MVT::Flag";
-
- // Inputs.
- for (unsigned i = 0, e = Ops.size(); i != e; ++i)
- OS << ", Tmp" << Ops[i];
- if (HasChain) OS << ", Chain";
- if (HasInFlag || HasOptInFlag || HasImpInputs) OS << ", InFlag";
- OS << ");\n";
unsigned ValNo = 0;
for (unsigned i = 0; i < NumResults; i++) {
OpenPOWER on IntegriCloud