diff options
author | Duncan Sands <baldrick@free.fr> | 2008-02-20 17:38:09 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2008-02-20 17:38:09 +0000 |
commit | f83b1f63ddf27aaba791393940f37709ebbda33b (patch) | |
tree | eb1afeab9425b383c511324b79f3186c4472ea46 /lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp | |
parent | 91dc17ba4991e971c7e89e07642b10817aa28055 (diff) |
LegalizeTypes support for scalarizing a vector store
and splitting extract_subvector. This fixes nine
"make check" testcases, for example
2008-02-04-ExtractSubvector.ll and (partially)
CodeGen/Generic/vector.ll.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47384 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp index 549afe9c6f..489aea4c64 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeTypesSplit.cpp @@ -339,6 +339,8 @@ bool DAGTypeLegalizer::SplitOperand(SDNode *N, unsigned OpNo) { abort(); case ISD::STORE: Res = SplitOp_STORE(cast<StoreSDNode>(N), OpNo); break; case ISD::RET: Res = SplitOp_RET(N, OpNo); break; + + case ISD::EXTRACT_SUBVECTOR: Res = SplitOp_EXTRACT_SUBVECTOR(N); break; } } @@ -399,3 +401,24 @@ SDOperand DAGTypeLegalizer::SplitOp_RET(SDNode *N, unsigned OpNo) { return DAG.getNode(ISD::RET, MVT::Other, Chain, Lo, Sign, Hi, Sign); } + +SDOperand DAGTypeLegalizer::SplitOp_EXTRACT_SUBVECTOR(SDNode *N) { + // We know that the extracted result type is legal. For now, assume the index + // is a constant. + MVT::ValueType SubVT = N->getValueType(0); + SDOperand Idx = N->getOperand(1); + SDOperand Lo, Hi; + GetSplitOp(N->getOperand(0), Lo, Hi); + + uint64_t LoElts = MVT::getVectorNumElements(Lo.getValueType()); + uint64_t IdxVal = cast<ConstantSDNode>(Idx)->getValue(); + + if (IdxVal < LoElts) { + assert(IdxVal + MVT::getVectorNumElements(SubVT) <= LoElts && + "Extracted subvector crosses vector split!"); + return DAG.getNode(ISD::EXTRACT_SUBVECTOR, SubVT, Lo, Idx); + } else { + return DAG.getNode(ISD::EXTRACT_SUBVECTOR, SubVT, Hi, + DAG.getConstant(IdxVal - LoElts, Idx.getValueType())); + } +} |