diff --git a/Eigen/src/Core/arch/SSE/PacketMath.h b/Eigen/src/Core/arch/SSE/PacketMath.h index b66a4db7c..129e1be39 100644 --- a/Eigen/src/Core/arch/SSE/PacketMath.h +++ b/Eigen/src/Core/arch/SSE/PacketMath.h @@ -287,7 +287,7 @@ struct packet_traits : default_packet_traits { AlignedOnScalar = 1, size = 16, - HasCmp = 1, // note -- only pcmp_eq is defined + HasCmp = 1, HasShift = 0, HasAbs = 0, HasAbs2 = 0, @@ -883,7 +883,14 @@ template <> EIGEN_STRONG_INLINE Packet4ui pandnot(const Packet4ui& a, const Packet4ui& b) { return _mm_andnot_si128(b, a); } - +template <> +EIGEN_STRONG_INLINE Packet16b pandnot(const Packet16b& a, const Packet16b& b) { + return _mm_andnot_si128(b, a); +} +template <> +EIGEN_STRONG_INLINE Packet16b pcmp_lt(const Packet16b& a, const Packet16b& b) { + return _mm_andnot_si128(a, b); +} template <> EIGEN_STRONG_INLINE Packet4f pcmp_le(const Packet4f& a, const Packet4f& b) { return _mm_cmple_ps(a, b); @@ -963,6 +970,10 @@ EIGEN_STRONG_INLINE Packet16b pcmp_eq(const Packet16b& a, const Packet16b& b) { return _mm_and_si128(_mm_cmpeq_epi8(a, b), kBoolMask); } template <> +EIGEN_STRONG_INLINE Packet16b pcmp_le(const Packet16b& a, const Packet16b& b) { + return por(pcmp_lt(a, b), pcmp_eq(a, b)); +} +template <> EIGEN_STRONG_INLINE Packet4ui pcmp_eq(const Packet4ui& a, const Packet4ui& b) { return _mm_cmpeq_epi32(a, b); } diff --git a/test/visitor.cpp b/test/visitor.cpp index a94e96a44..7c6d4ff19 100644 --- a/test/visitor.cpp +++ b/test/visitor.cpp @@ -296,6 +296,23 @@ void checkOptimalTraversal() { checkOptimalTraversal_impl(UnrollRowMajor(Rows, Cols)); checkOptimalTraversal_impl(DynamicColMajor(rows, cols)); checkOptimalTraversal_impl(DynamicRowMajor(rows, cols)); + + const Eigen::Array a = Eigen::Array{false, true}; + Eigen::Index i = -1; + + VERIFY(!a.minCoeff(&i)); + VERIFY(i == 0); + + VERIFY(!(!a).minCoeff(&i)); + VERIFY(i == 1); + + Eigen::Index j = -1; + + VERIFY(a.maxCoeff(&j)); + VERIFY(j == 1); + + VERIFY((!a).maxCoeff(&j)); + VERIFY(j == 0); } EIGEN_DECLARE_TEST(visitor) {