From bc70cf8be95f33f9aa30c8c3d0fd79e3fa636360 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 2 Apr 2006 03:57:31 +0000 Subject: [PATCH] Implement the Expand action for binary vector operations to break the binop into elements and operate on each piece. This allows generic vector integer multiplies to work on PPC, though the generated code is horrible. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27347 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index f3d2fdfce4c..27afe117e6f 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -1916,12 +1916,29 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { - default: assert(0 && "Operation not supported"); + default: assert(0 && "BinOp legalize operation not supported"); case TargetLowering::Legal: break; case TargetLowering::Custom: Tmp1 = TLI.LowerOperation(Result, DAG); if (Tmp1.Val) Result = Tmp1; break; + case TargetLowering::Expand: { + assert(MVT::isVector(Node->getValueType(0)) && + "Cannot expand this binary operator!"); + // Expand the operation into a bunch of nasty scalar code. + std::vector Ops; + MVT::ValueType EltVT = MVT::getVectorBaseType(Node->getValueType(0)); + MVT::ValueType PtrVT = TLI.getPointerTy(); + for (unsigned i = 0, e = MVT::getVectorNumElements(Node->getValueType(0)); + i != e; ++i) { + SDOperand Idx = DAG.getConstant(i, PtrVT); + SDOperand LHS = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, EltVT, Tmp1, Idx); + SDOperand RHS = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, EltVT, Tmp2, Idx); + Ops.push_back(DAG.getNode(Node->getOpcode(), EltVT, LHS, RHS)); + } + Result = DAG.getNode(ISD::BUILD_VECTOR, Node->getValueType(0), Ops); + break; + } } break; -- 2.34.1