Add missing bool SSE2 PacketMath comparison

This commit is contained in:
Sergiu Deitsch 2025-09-20 23:03:52 +02:00
parent 6ef18340a1
commit ea869e183b
No known key found for this signature in database
2 changed files with 30 additions and 2 deletions

View File

@ -287,7 +287,7 @@ struct packet_traits<bool> : 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<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
return _mm_andnot_si128(b, a);
}
template <>
EIGEN_STRONG_INLINE Packet16b pandnot<Packet16b>(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);
}

View File

@ -296,6 +296,23 @@ void checkOptimalTraversal() {
checkOptimalTraversal_impl<UnrollRowMajor, true>(UnrollRowMajor(Rows, Cols));
checkOptimalTraversal_impl<DynamicColMajor, true>(DynamicColMajor(rows, cols));
checkOptimalTraversal_impl<DynamicRowMajor, true>(DynamicRowMajor(rows, cols));
const Eigen::Array<bool, Eigen::Dynamic, 1> a = Eigen::Array<bool, 2, 1>{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) {