diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2006-04-05 06:07:11 +0000 |
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2006-04-05 06:07:11 +0000 |
| commit | 9fa8959dce47f947276eae161e2d238ffac6e6db (patch) | |
| tree | b6ba012485faf9570db50217190274e12a487f8e /llvm | |
| parent | 8f21ca7effd419f293f36defb7b0f77ea5f3f3ff (diff) | |
| download | bcm5719-llvm-9fa8959dce47f947276eae161e2d238ffac6e6db.tar.gz bcm5719-llvm-9fa8959dce47f947276eae161e2d238ffac6e6db.zip | |
Exapnd a VECTOR_SHUFFLE to a BUILD_VECTOR if target asks for it to be expanded
or custom lowering fails.
llvm-svn: 27432
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 1d624dbc147..b0d0b37aa64 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -933,9 +933,37 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { "vector shuffle should not be created if not legal!"); break; case TargetLowering::Custom: - Tmp1 = TLI.LowerOperation(Result, DAG); - if (Tmp1.Val) Result = Tmp1; + Tmp3 = TLI.LowerOperation(Result, DAG); + if (Tmp3.Val) { + Result = Tmp3; + break; + } + // FALLTHROUGH + case TargetLowering::Expand: { + MVT::ValueType VT = Node->getValueType(0); + MVT::ValueType EltVT = MVT::getVectorBaseType(VT); + MVT::ValueType PtrVT = TLI.getPointerTy(); + SDOperand Mask = Node->getOperand(2); + unsigned NumElems = Mask.getNumOperands(); + std::vector<SDOperand> Ops; + for (unsigned i = 0; i != NumElems; ++i) { + SDOperand Arg = Mask.getOperand(i); + if (Arg.getOpcode() == ISD::UNDEF) { + Ops.push_back(DAG.getNode(ISD::UNDEF, EltVT)); + } else { + assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!"); + unsigned Idx = cast<ConstantSDNode>(Arg)->getValue(); + if (Idx < NumElems) + Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, EltVT, Tmp1, + DAG.getConstant(Idx, PtrVT))); + else + Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, EltVT, Tmp2, + DAG.getConstant(Idx - NumElems, PtrVT))); + } + } + Result = DAG.getNode(ISD::BUILD_VECTOR, VT, Ops); break; + } case TargetLowering::Promote: { // Change base type to a different vector type. MVT::ValueType OVT = Node->getValueType(0); |

