aboutsummaryrefslogtreecommitdiff
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
commit9789aaad632f5a75fc8b8e70fd27aaa92199f3bb (patch)
treedc6a6e0b135910f0723dd045573c1470a6fc78be
parent18667c45458352e4d7d5f7f0147232a9ca4a7928 (diff)
Fix an optional in flag bug.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25590 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--utils/TableGen/DAGISelEmitter.cpp83
1 files changed, 64 insertions, 19 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp
index 5e63042c90..e76dd8fd55 100644
--- a/utils/TableGen/DAGISelEmitter.cpp
+++ b/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++) {