summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-04-18 04:28:57 +0000
committerChris Lattner <sabre@nondot.org>2006-04-18 04:28:57 +0000
commit96d50487c943adfe8a04bd44ee2427747d5ae943 (patch)
treef61c6a20812877106a5923aa2052e54a66049d2f /llvm
parentd6d82aa8894212d0b665de478ebd277d56b98d2c (diff)
downloadbcm5719-llvm-96d50487c943adfe8a04bd44ee2427747d5ae943.tar.gz
bcm5719-llvm-96d50487c943adfe8a04bd44ee2427747d5ae943.zip
Use vmladduhm to do v8i16 multiplies which is faster and simpler than doing
even/odd halves. Thanks to Nate telling me what's what. llvm-svn: 27793
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/PowerPC/PPCISelLowering.cpp21
1 files changed, 3 insertions, 18 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index b70b3cccd88..1c6fcd73600 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -1602,25 +1602,10 @@ static SDOperand LowerMUL(SDOperand Op, SelectionDAG &DAG) {
} else if (Op.getValueType() == MVT::v8i16) {
SDOperand LHS = Op.getOperand(0), RHS = Op.getOperand(1);
- // Multiply the even 16-bit parts, producing 32-bit sums.
- SDOperand EvenParts = BuildIntrinsicOp(Intrinsic::ppc_altivec_vmuleuh,
- LHS, RHS, DAG, MVT::v4i32);
- EvenParts = DAG.getNode(ISD::BIT_CONVERT, MVT::v8i16, EvenParts);
-
- // Multiply the odd 16-bit parts, producing 32-bit sums.
- SDOperand OddParts = BuildIntrinsicOp(Intrinsic::ppc_altivec_vmulouh,
- LHS, RHS, DAG, MVT::v4i32);
- OddParts = DAG.getNode(ISD::BIT_CONVERT, MVT::v8i16, OddParts);
+ SDOperand Zero = BuildSplatI(0, 1, MVT::v8i16, DAG);
- // Merge the results together.
- std::vector<SDOperand> Ops;
- for (unsigned i = 0; i != 4; ++i) {
- Ops.push_back(DAG.getConstant(2*i+1, MVT::i16));
- Ops.push_back(DAG.getConstant(2*i+1+8, MVT::i16));
- }
-
- return DAG.getNode(ISD::VECTOR_SHUFFLE, MVT::v8i16, EvenParts, OddParts,
- DAG.getNode(ISD::BUILD_VECTOR, MVT::v8i16, Ops));
+ return BuildIntrinsicOp(Intrinsic::ppc_altivec_vmladduhm,
+ LHS, RHS, Zero, DAG);
} else if (Op.getValueType() == MVT::v16i8) {
SDOperand LHS = Op.getOperand(0), RHS = Op.getOperand(1);
OpenPOWER on IntegriCloud