diff --git a/Eigen/src/Core/arch/SSE/PacketMath.h b/Eigen/src/Core/arch/SSE/PacketMath.h index ce0d0ab13..37f6048e7 100644 --- a/Eigen/src/Core/arch/SSE/PacketMath.h +++ b/Eigen/src/Core/arch/SSE/PacketMath.h @@ -1230,13 +1230,13 @@ EIGEN_STRONG_INLINE Packet4ui plogical_shift_left(const Packet4ui& a) { template <> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a) { - const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF)); - return _mm_and_ps(a, mask); + const __m128i mask = _mm_setr_epi32(0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF); + return _mm_castsi128_ps(_mm_and_si128(mask, _mm_castps_si128(a))); } template <> EIGEN_STRONG_INLINE Packet2d pabs(const Packet2d& a) { - const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF)); - return _mm_and_pd(a, mask); + const __m128i mask = _mm_setr_epi32(0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF); + return _mm_castsi128_pd(_mm_and_si128(mask, _mm_castpd_si128(a))); } template <> EIGEN_STRONG_INLINE Packet2l pabs(const Packet2l& a) { diff --git a/Eigen/src/Geometry/arch/Geometry_SIMD.h b/Eigen/src/Geometry/arch/Geometry_SIMD.h index e8b210e70..80d61d3f9 100644 --- a/Eigen/src/Geometry/arch/Geometry_SIMD.h +++ b/Eigen/src/Geometry/arch/Geometry_SIMD.h @@ -73,8 +73,12 @@ struct cross3_impl { Packet4f b = rhs_eval.template packet(0); Packet4f mul1 = pmul(vec4f_swizzle1(a, 1, 2, 0, 3), vec4f_swizzle1(b, 2, 0, 1, 3)); Packet4f mul2 = pmul(vec4f_swizzle1(a, 2, 0, 1, 3), vec4f_swizzle1(b, 1, 2, 0, 3)); + a = psub(mul1, mul2); + // Zero-out last component in case of inf/nan. + const __m128i mask = _mm_setr_epi32(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0); + a = _mm_castsi128_ps(_mm_and_si128(mask, _mm_castps_si128(a))); DstPlainType res; - pstoret(&res.x(), psub(mul1, mul2)); + pstoret(res.data(), a); return res; } }; diff --git a/test/product.h b/test/product.h index 74f01b050..f8eb5df85 100644 --- a/test/product.h +++ b/test/product.h @@ -188,8 +188,10 @@ void product(const MatrixType& m) { VERIFY(areNotApprox(res2, square2 + m2.transpose() * m1, not_approx_epsilon)); } - VERIFY_IS_APPROX(res.col(r).noalias() = square.adjoint() * square.col(r), (square.adjoint() * square.col(r)).eval()); - VERIFY_IS_APPROX(res.col(r).noalias() = square * square.col(r), (square * square.col(r)).eval()); + res.col(r).noalias() = square.adjoint() * square.col(r); + VERIFY_IS_APPROX(res.col(r), (square.adjoint() * square.col(r)).eval()); + res.col(r).noalias() = square * square.col(r); + VERIFY_IS_APPROX(res.col(r), (square * square.col(r)).eval()); // vector at runtime (see bug 1166) {