diff --git a/Eigen/src/Core/arch/SSE/PacketMath.h b/Eigen/src/Core/arch/SSE/PacketMath.h index 8a49dcaae..be64acc18 100644 --- a/Eigen/src/Core/arch/SSE/PacketMath.h +++ b/Eigen/src/Core/arch/SSE/PacketMath.h @@ -37,6 +37,10 @@ template<> struct ei_unpacket_traits<__m128> { typedef float type; enum {size= template<> struct ei_unpacket_traits<__m128d> { typedef double type; enum {size=2}; }; template<> struct ei_unpacket_traits<__m128i> { typedef int type; enum {size=4}; }; +template<> EIGEN_STRONG_INLINE __m128 ei_pset1(const float& from) { return _mm_set1_ps(from); } +template<> EIGEN_STRONG_INLINE __m128d ei_pset1(const double& from) { return _mm_set1_pd(from); } +template<> EIGEN_STRONG_INLINE __m128i ei_pset1(const int& from) { return _mm_set1_epi32(from); } + template<> EIGEN_STRONG_INLINE __m128 ei_padd<__m128>(const __m128& a, const __m128& b) { return _mm_add_ps(a,b); } template<> EIGEN_STRONG_INLINE __m128d ei_padd<__m128d>(const __m128d& a, const __m128d& b) { return _mm_add_pd(a,b); } template<> EIGEN_STRONG_INLINE __m128i ei_padd<__m128i>(const __m128i& a, const __m128i& b) { return _mm_add_epi32(a,b); } @@ -63,7 +67,7 @@ template<> EIGEN_STRONG_INLINE __m128 ei_pdiv<__m128>(const __m128& a, const _ template<> EIGEN_STRONG_INLINE __m128d ei_pdiv<__m128d>(const __m128d& a, const __m128d& b) { return _mm_div_pd(a,b); } template<> EIGEN_STRONG_INLINE __m128i ei_pdiv<__m128i>(const __m128i& /*a*/, const __m128i& /*b*/) { ei_assert(false && "packet integer division are not supported by SSE"); - __m128i dummy; + __m128i dummy = ei_pset1(0); return dummy; } @@ -102,10 +106,6 @@ template<> EIGEN_STRONG_INLINE __m128 ei_ploadu(const float* from) { r template<> EIGEN_STRONG_INLINE __m128d ei_ploadu(const double* from) { return _mm_loadu_pd(from); } template<> EIGEN_STRONG_INLINE __m128i ei_ploadu(const int* from) { return _mm_loadu_si128(reinterpret_cast(from)); } -template<> EIGEN_STRONG_INLINE __m128 ei_pset1(const float& from) { return _mm_set1_ps(from); } -template<> EIGEN_STRONG_INLINE __m128d ei_pset1(const double& from) { return _mm_set1_pd(from); } -template<> EIGEN_STRONG_INLINE __m128i ei_pset1(const int& from) { return _mm_set1_epi32(from); } - template<> EIGEN_STRONG_INLINE void ei_pstore(float* to, const __m128& from) { _mm_store_ps(to, from); } template<> EIGEN_STRONG_INLINE void ei_pstore(double* to, const __m128d& from) { _mm_store_pd(to, from); } template<> EIGEN_STRONG_INLINE void ei_pstore(int* to, const __m128i& from) { _mm_store_si128(reinterpret_cast<__m128i*>(to), from); } diff --git a/test/lu.cpp b/test/lu.cpp index fdc10e246..6147419fd 100644 --- a/test/lu.cpp +++ b/test/lu.cpp @@ -28,9 +28,10 @@ template void doSomeRankPreservingOperations(Eigen::MatrixBase& m) { + typedef typename Derived::RealScalar RealScalar; for(int a = 0; a < 3*(m.rows()+m.cols()); a++) { - double d = Eigen::ei_random(-1,1); + RealScalar d = Eigen::ei_random(-1,1); int i = Eigen::ei_random(0,m.rows()-1); // i is a random row number int j; do { diff --git a/test/meta.cpp b/test/meta.cpp index 864d806e8..e77e46ba4 100644 --- a/test/meta.cpp +++ b/test/meta.cpp @@ -45,9 +45,7 @@ void test_meta() VERIFY(( ei_is_same_type::type >::ret)); VERIFY(( ei_is_same_type::type >::ret)); - VERIFY(( ei_is_same_type::type >::ret)); VERIFY(( ei_is_same_type::type >::ret)); - VERIFY(( ei_is_same_type::type >::ret)); VERIFY(( ei_is_same_type::type >::ret)); VERIFY(( ei_is_same_type::type >::ret)); diff --git a/test/nomalloc.cpp b/test/nomalloc.cpp index 82119e9b3..5497ca339 100644 --- a/test/nomalloc.cpp +++ b/test/nomalloc.cpp @@ -24,7 +24,9 @@ // Eigen. If not, see . // this hack is needed to make this file compiles with -pedantic (gcc) +#ifdef __GNUC__ #define throw(X) +#endif // discard stack allocation as that too bypasses malloc #define EIGEN_STACK_ALLOCATION_LIMIT 0 // any heap allocation will raise an assert diff --git a/test/sum.cpp b/test/sum.cpp index c13651853..fe707e9b2 100644 --- a/test/sum.cpp +++ b/test/sum.cpp @@ -34,7 +34,7 @@ template void matrixSum(const MatrixType& m) MatrixType m1 = MatrixType::Random(rows, cols); VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows, cols).sum(), Scalar(1)); - VERIFY_IS_APPROX(MatrixType::Ones(rows, cols).sum(), Scalar(rows*cols)); + VERIFY_IS_APPROX(MatrixType::Ones(rows, cols).sum(), Scalar(float(rows*cols))); // the float() here to shut up excessive MSVC warning about int->complex conversion being lossy Scalar x = Scalar(0); for(int i = 0; i < rows; i++) for(int j = 0; j < cols; j++) x += m1(i,j); VERIFY_IS_APPROX(m1.sum(), x);