diff options
author | Chris Lattner <sabre@nondot.org> | 2007-11-19 21:16:54 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-11-19 21:16:54 +0000 |
commit | 6fa95ec19d7cea3abe841a268b5c5f89b3df6ba9 (patch) | |
tree | b8184b662458a2e4886deb77c79babc820b25072 /llvm/lib | |
parent | aad83c8ee57a69868636a81236ba807d82e007fe (diff) | |
download | bcm5719-llvm-6fa95ec19d7cea3abe841a268b5c5f89b3df6ba9.tar.gz bcm5719-llvm-6fa95ec19d7cea3abe841a268b5c5f89b3df6ba9.zip |
Implement vector expand support for shuffle_vector. This fixes PR1811.
llvm-svn: 44242
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index e343a0e5de5..a2f4827870a 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -6286,6 +6286,41 @@ void SelectionDAGLegalize::SplitVectorOp(SDOperand Op, SDOperand &Lo, TLI.getPointerTy())); break; } + case ISD::VECTOR_SHUFFLE: { + // Build the low part. + SDOperand Mask = Node->getOperand(2); + SmallVector<SDOperand, 8> Ops; + MVT::ValueType PtrVT = TLI.getPointerTy(); + + // Insert all of the elements from the input that are needed. We use + // buildvector of extractelement here because the input vectors will have + // to be legalized, so this makes the code simpler. + for (unsigned i = 0; i != NewNumElts_Lo; ++i) { + unsigned Idx = cast<ConstantSDNode>(Mask.getOperand(i))->getValue(); + SDOperand InVec = Node->getOperand(0); + if (Idx >= NumElements) { + InVec = Node->getOperand(1); + Idx -= NumElements; + } + Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, NewEltVT, InVec, + DAG.getConstant(Idx, PtrVT))); + } + Lo = DAG.getNode(ISD::BUILD_VECTOR, NewVT_Lo, &Ops[0], Ops.size()); + Ops.clear(); + + for (unsigned i = NewNumElts_Lo; i != NumElements; ++i) { + unsigned Idx = cast<ConstantSDNode>(Mask.getOperand(i))->getValue(); + SDOperand InVec = Node->getOperand(0); + if (Idx >= NumElements) { + InVec = Node->getOperand(1); + Idx -= NumElements; + } + Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, NewEltVT, InVec, + DAG.getConstant(Idx, PtrVT))); + } + Hi = DAG.getNode(ISD::BUILD_VECTOR, NewVT_Lo, &Ops[0], Ops.size()); + break; + } case ISD::BUILD_VECTOR: { SmallVector<SDOperand, 8> LoOps(Node->op_begin(), Node->op_begin()+NewNumElts_Lo); |