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 | a2caab9866b62cc33c90aa819a82a9f802feea39 (patch) | |
tree | e7cfa9ef1cec2daf5445a2a27064da11ac353ce1 /lib | |
parent | a5102b8d0bc32af78e281429dded1a6e7613c41b (diff) | |
download | external_llvm-a2caab9866b62cc33c90aa819a82a9f802feea39.zip external_llvm-a2caab9866b62cc33c90aa819a82a9f802feea39.tar.gz external_llvm-a2caab9866b62cc33c90aa819a82a9f802feea39.tar.bz2 |
Tweak the expansion code for BIT_CONVERT to generate better code
converting from an MMX vector to an i64.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73024 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp index e8ff3fc..b7d7818 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp +++ b/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!"); |