mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-04 03:00:39 +08:00
Remove custom unaligned loads for SSE. They were only useful for core2 CPU.
This commit is contained in:
parent
d039c88096
commit
f32ad79b41
@ -235,63 +235,27 @@ template<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int* from) { E
|
|||||||
return _mm_loadu_ps(from);
|
return _mm_loadu_ps(from);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
template<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm_loadu_pd(from); }
|
|
||||||
template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm_loadu_si128(reinterpret_cast<const Packet4i*>(from)); }
|
|
||||||
#else
|
#else
|
||||||
// Fast unaligned loads. Note that here we cannot directly use intrinsics: this would
|
|
||||||
// require pointer casting to incompatible pointer types and leads to invalid code
|
|
||||||
// because of the strict aliasing rule. The "dummy" stuff are required to enforce
|
|
||||||
// a correct instruction dependency.
|
|
||||||
// TODO: do the same for MSVC (ICC is compatible)
|
|
||||||
// NOTE: with the code below, MSVC's compiler crashes!
|
// NOTE: with the code below, MSVC's compiler crashes!
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined(__i386__)
|
|
||||||
// bug 195: gcc/i386 emits weird x87 fldl/fstpl instructions for _mm_load_sd
|
|
||||||
#define EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS 1
|
|
||||||
#elif defined(__clang__)
|
|
||||||
// bug 201: Segfaults in __mm_loadh_pd with clang 2.8
|
|
||||||
#define EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS 1
|
|
||||||
#else
|
|
||||||
#define EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from)
|
template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from)
|
||||||
{
|
{
|
||||||
EIGEN_DEBUG_UNALIGNED_LOAD
|
EIGEN_DEBUG_UNALIGNED_LOAD
|
||||||
#if EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS
|
|
||||||
return _mm_loadu_ps(from);
|
return _mm_loadu_ps(from);
|
||||||
#else
|
|
||||||
__m128d res;
|
|
||||||
res = _mm_load_sd((const double*)(from)) ;
|
|
||||||
res = _mm_loadh_pd(res, (const double*)(from+2)) ;
|
|
||||||
return _mm_castpd_ps(res);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
template<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from)
|
template<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from)
|
||||||
{
|
{
|
||||||
EIGEN_DEBUG_UNALIGNED_LOAD
|
EIGEN_DEBUG_UNALIGNED_LOAD
|
||||||
#if EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS
|
|
||||||
return _mm_loadu_pd(from);
|
return _mm_loadu_pd(from);
|
||||||
#else
|
|
||||||
__m128d res;
|
|
||||||
res = _mm_load_sd(from) ;
|
|
||||||
res = _mm_loadh_pd(res,from+1);
|
|
||||||
return res;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)
|
template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)
|
||||||
{
|
{
|
||||||
EIGEN_DEBUG_UNALIGNED_LOAD
|
EIGEN_DEBUG_UNALIGNED_LOAD
|
||||||
#if EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS
|
return _mm_loadu_si128(reinterpret_cast<const __m128i*>(from));
|
||||||
return _mm_loadu_si128(reinterpret_cast<const Packet4i*>(from));
|
|
||||||
#else
|
|
||||||
__m128d res;
|
|
||||||
res = _mm_load_sd((const double*)(from)) ;
|
|
||||||
res = _mm_loadh_pd(res, (const double*)(from+2)) ;
|
|
||||||
return _mm_castpd_si128(res);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from)
|
template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user