diff --git a/Eigen/src/Core/arch/SSE/TypeCasting.h b/Eigen/src/Core/arch/SSE/TypeCasting.h index 09a69660f..e75df2bfa 100644 --- a/Eigen/src/Core/arch/SSE/TypeCasting.h +++ b/Eigen/src/Core/arch/SSE/TypeCasting.h @@ -71,10 +71,21 @@ template<> EIGEN_STRONG_INLINE Packet2d pcast(const Packet4f template<> EIGEN_STRONG_INLINE Packet2l pcast(const Packet2d& a) { return _mm_set_epi64x(int64_t(a[1]), int64_t(a[0])); - } +} -template<> EIGEN_STRONG_INLINE Packet2d pcast(const Packet2l& a) { - return _mm_set_pd(double(_mm_cvtsi128_si64(_mm_unpackhi_epi64(a, a))), double(_mm_cvtsi128_si64(a))); +template <> +EIGEN_STRONG_INLINE Packet2d pcast(const Packet2l& a) { +#ifdef EIGEN_VECTORIZE_SSE4_1 + int64_t a0 = _mm_extract_epi64(a, 0); + int64_t a1 = _mm_extract_epi64(a, 1); +#elif EIGEN_ARCH_x86_64 + int64_t a0 = _mm_cvtsi128_si64(a); + int64_t a1 = _mm_cvtsi128_si64(_mm_unpackhi_epi64(a, a)); +#else + int64_t a0 = a.m_val[0]; + int64_t a1 = a.m_val[1]; +#endif + return _mm_set_pd(static_cast(a1), static_cast(a0)); } template<> EIGEN_STRONG_INLINE Packet4i preinterpret(const Packet4f& a) {