diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2009-06-07 09:41:57 +0000 |
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2009-06-07 09:41:57 +0000 |
| commit | 516479d6e7fa39333f45c73684dda59f319a10fe (patch) | |
| tree | 7a89c07064250a306bef77517d279ad68eda2bc2 /llvm/lib/CodeGen/SelectionDAG | |
| parent | e9ff1914590bf6a9601717e14d471ee26af83edc (diff) | |
| download | bcm5719-llvm-516479d6e7fa39333f45c73684dda59f319a10fe.tar.gz bcm5719-llvm-516479d6e7fa39333f45c73684dda59f319a10fe.zip | |
Tweak the expansion code for BIT_CONVERT to generate better code
converting from an MMX vector to an i64.
llvm-svn: 73024
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp index e8ff3fc9efb..b7d7818d6e0 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp @@ -92,6 +92,26 @@ void DAGTypeLegalizer::ExpandRes_BIT_CONVERT(SDNode *N, SDValue &Lo, } } + if (InVT.isVector() && OutVT.isInteger()) { + // Handle cases like i64 = BIT_CONVERT v1i64 on x86, where the operand + // is legal but the result is not. + MVT NVT = MVT::getVectorVT(TLI.getTypeToTransformTo(OutVT), 2); + + if (isTypeLegal(NVT)) { + SDValue CastInOp = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, InOp); + MVT EltNVT = NVT.getVectorElementType(); + Lo = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltNVT, CastInOp, + DAG.getIntPtrConstant(0)); + Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltNVT, CastInOp, + DAG.getIntPtrConstant(1)); + + if (TLI.isBigEndian()) + std::swap(Lo, Hi); + + return; + } + } + // Lower the bit-convert to a store/load from the stack. assert(NOutVT.isByteSized() && "Expanded type not byte sized!"); |

