aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Lenharth <andrewl@lenharth.org>2006-01-23 21:51:14 +0000
committerAndrew Lenharth <andrewl@lenharth.org>2006-01-23 21:51:14 +0000
commit7cf11b4ab248d6ab7fb0d9df0b72baf158201abe (patch)
tree3443e59fb3ac7bef88c5f432e9c4d024c93e9646
parent87076054e6292c2018676a175e05359c28881e10 (diff)
another couple selects
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25551 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/CodeGen/SelectionDAG.h20
-rw-r--r--include/llvm/CodeGen/SelectionDAGNodes.h18
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAG.cpp22
3 files changed, 60 insertions, 0 deletions
diff --git a/include/llvm/CodeGen/SelectionDAG.h b/include/llvm/CodeGen/SelectionDAG.h
index 1991cd3efe..f9d7172672 100644
--- a/include/llvm/CodeGen/SelectionDAG.h
+++ b/include/llvm/CodeGen/SelectionDAG.h
@@ -318,6 +318,10 @@ public:
SDOperand Op1, SDOperand Op2, SDOperand Op3,
SDOperand Op4, SDOperand Op5, SDOperand Op6,
SDOperand Op7);
+ SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT,
+ SDOperand Op1, SDOperand Op2, SDOperand Op3,
+ SDOperand Op4, SDOperand Op5, SDOperand Op6,
+ SDOperand Op7, SDOperand Op8);
SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
MVT::ValueType VT2, SDOperand Op1, SDOperand Op2);
SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
@@ -384,6 +388,22 @@ public:
return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops);
}
SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
+ SDOperand Op1, SDOperand Op2, SDOperand Op3,
+ SDOperand Op4, SDOperand Op5, SDOperand Op6,
+ SDOperand Op7, SDOperand Op8) {
+ std::vector<SDOperand> Ops;
+ Ops.reserve(8);
+ Ops.push_back(Op1);
+ Ops.push_back(Op2);
+ Ops.push_back(Op3);
+ Ops.push_back(Op4);
+ Ops.push_back(Op5);
+ Ops.push_back(Op6);
+ Ops.push_back(Op7);
+ Ops.push_back(Op8);
+ return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops);
+ }
+ SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
std::vector<SDOperand> &Ops) {
return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops);
}
diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h
index 7b42429031..5cb2d1c9dc 100644
--- a/include/llvm/CodeGen/SelectionDAGNodes.h
+++ b/include/llvm/CodeGen/SelectionDAGNodes.h
@@ -856,6 +856,24 @@ protected:
Op4.Val->Uses.push_back(this); Op5.Val->Uses.push_back(this);
Op6.Val->Uses.push_back(this);
}
+ void setOperands(SDOperand Op0, SDOperand Op1, SDOperand Op2, SDOperand Op3,
+ SDOperand Op4, SDOperand Op5, SDOperand Op6, SDOperand Op7) {
+ assert(NumOperands == 0 && "Should not have operands yet!");
+ OperandList = new SDOperand[8];
+ OperandList[0] = Op0;
+ OperandList[1] = Op1;
+ OperandList[2] = Op2;
+ OperandList[3] = Op3;
+ OperandList[4] = Op4;
+ OperandList[5] = Op5;
+ OperandList[6] = Op6;
+ OperandList[7] = Op7;
+ NumOperands = 8;
+ Op0.Val->Uses.push_back(this); Op1.Val->Uses.push_back(this);
+ Op2.Val->Uses.push_back(this); Op3.Val->Uses.push_back(this);
+ Op4.Val->Uses.push_back(this); Op5.Val->Uses.push_back(this);
+ Op6.Val->Uses.push_back(this); Op7.Val->Uses.push_back(this);
+ }
void addUser(SDNode *User) {
Uses.push_back(User);
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 3165fc1d65..c1ba5ebc4a 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -1671,6 +1671,28 @@ SDOperand SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
ON = N; // Memoize the new node.
return SDOperand(N, 0);
}
+SDOperand SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
+ MVT::ValueType VT, SDOperand Op1,
+ SDOperand Op2, SDOperand Op3,SDOperand Op4,
+ SDOperand Op5, SDOperand Op6,
+ SDOperand Op7, SDOperand Op8) {
+ // If an identical node already exists, use it.
+ std::vector<SDOperand> OpList;
+ OpList.push_back(Op1); OpList.push_back(Op2); OpList.push_back(Op3);
+ OpList.push_back(Op4); OpList.push_back(Op5); OpList.push_back(Op6);
+ OpList.push_back(Op7); OpList.push_back(Op8);
+ SDNode *&ON = OneResultNodes[std::make_pair(ISD::BUILTIN_OP_END+TargetOpc,
+ std::make_pair(VT, OpList))];
+ if (ON) return SDOperand(ON, 0);
+
+ RemoveNodeFromCSEMaps(N);
+ N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
+ N->setValueTypes(VT);
+ N->setOperands(Op1, Op2, Op3, Op4, Op5, Op6, Op7, Op8);
+
+ ON = N; // Memoize the new node.
+ return SDOperand(N, 0);
+}
SDOperand SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
MVT::ValueType VT1, MVT::ValueType VT2,