mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-06-04 18:54:00 +08:00
Tests added and AVX512 bug fixed for pcmp_lt_or_nan
This commit is contained in:
parent
1115f5462e
commit
d87648a6be
@ -487,7 +487,7 @@ template<> EIGEN_STRONG_INLINE Packet16f pcmp_lt(const Packet16f& a, const Packe
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<> EIGEN_STRONG_INLINE Packet16f pcmp_lt_or_nan(const Packet16f& a, const Packet16f& b) {
|
template<> EIGEN_STRONG_INLINE Packet16f pcmp_lt_or_nan(const Packet16f& a, const Packet16f& b) {
|
||||||
__mmask16 mask = _mm512_cmp_ps_mask(a, b, _CMP_NGT_UQ);
|
__mmask16 mask = _mm512_cmp_ps_mask(a, b, _CMP_NGE_UQ);
|
||||||
return _mm512_castsi512_ps(
|
return _mm512_castsi512_ps(
|
||||||
_mm512_mask_set1_epi32(_mm512_set1_epi32(0), mask, 0xffffffffu));
|
_mm512_mask_set1_epi32(_mm512_set1_epi32(0), mask, 0xffffffffu));
|
||||||
}
|
}
|
||||||
@ -518,7 +518,7 @@ EIGEN_STRONG_INLINE Packet8d pcmp_lt(const Packet8d& a, const Packet8d& b) {
|
|||||||
}
|
}
|
||||||
template <>
|
template <>
|
||||||
EIGEN_STRONG_INLINE Packet8d pcmp_lt_or_nan(const Packet8d& a, const Packet8d& b) {
|
EIGEN_STRONG_INLINE Packet8d pcmp_lt_or_nan(const Packet8d& a, const Packet8d& b) {
|
||||||
__mmask8 mask = _mm512_cmp_pd_mask(a, b, _CMP_NGT_UQ);
|
__mmask8 mask = _mm512_cmp_pd_mask(a, b, _CMP_NGE_UQ);
|
||||||
return _mm512_castsi512_pd(
|
return _mm512_castsi512_pd(
|
||||||
_mm512_mask_set1_epi64(_mm512_set1_epi64(0), mask, 0xffffffffffffffffu));
|
_mm512_mask_set1_epi64(_mm512_set1_epi64(0), mask, 0xffffffffffffffffu));
|
||||||
}
|
}
|
||||||
|
@ -279,6 +279,36 @@ void packetmath_boolean_mask_ops() {
|
|||||||
CHECK_CWISE2_IF(true, internal::pcmp_eq, internal::pcmp_eq);
|
CHECK_CWISE2_IF(true, internal::pcmp_eq, internal::pcmp_eq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Scalar, typename Packet>
|
||||||
|
void packetmath_boolean_mask_ops_real() {
|
||||||
|
const int PacketSize = internal::unpacket_traits<Packet>::size;
|
||||||
|
const int size = 2 * PacketSize;
|
||||||
|
EIGEN_ALIGN_MAX Scalar data1[size];
|
||||||
|
EIGEN_ALIGN_MAX Scalar data2[size];
|
||||||
|
EIGEN_ALIGN_MAX Scalar ref[size];
|
||||||
|
|
||||||
|
for (int i = 0; i < PacketSize; ++i) {
|
||||||
|
data1[i] = internal::random<Scalar>();
|
||||||
|
data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
CHECK_CWISE2_IF(true, internal::pcmp_lt_or_nan, internal::pcmp_lt_or_nan);
|
||||||
|
|
||||||
|
//Test (-0) <=/< (0) for signed operations
|
||||||
|
for (int i = 0; i < PacketSize; ++i) {
|
||||||
|
data1[i] = Scalar(-0.0);
|
||||||
|
data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0);
|
||||||
|
}
|
||||||
|
CHECK_CWISE2_IF(true, internal::pcmp_lt_or_nan, internal::pcmp_lt_or_nan);
|
||||||
|
|
||||||
|
//Test NaN
|
||||||
|
for (int i = 0; i < PacketSize; ++i) {
|
||||||
|
data1[i] = NumTraits<Scalar>::quiet_NaN();
|
||||||
|
data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0);
|
||||||
|
}
|
||||||
|
CHECK_CWISE2_IF(true, internal::pcmp_lt_or_nan, internal::pcmp_lt_or_nan);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Scalar, typename Packet>
|
template <typename Scalar, typename Packet>
|
||||||
void packetmath_boolean_mask_ops_notcomplex() {
|
void packetmath_boolean_mask_ops_notcomplex() {
|
||||||
const int PacketSize = internal::unpacket_traits<Packet>::size;
|
const int PacketSize = internal::unpacket_traits<Packet>::size;
|
||||||
@ -610,6 +640,8 @@ void packetmath_real() {
|
|||||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasFloor, numext::floor, internal::pfloor);
|
CHECK_CWISE1_EXACT_IF(PacketTraits::HasFloor, numext::floor, internal::pfloor);
|
||||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRint, numext::rint, internal::print);
|
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRint, numext::rint, internal::print);
|
||||||
|
|
||||||
|
packetmath_boolean_mask_ops_real<Scalar,Packet>();
|
||||||
|
|
||||||
// Rounding edge cases.
|
// Rounding edge cases.
|
||||||
if (PacketTraits::HasRound || PacketTraits::HasCeil || PacketTraits::HasFloor || PacketTraits::HasRint) {
|
if (PacketTraits::HasRound || PacketTraits::HasCeil || PacketTraits::HasFloor || PacketTraits::HasRint) {
|
||||||
typedef typename internal::make_integer<Scalar>::type IntType;
|
typedef typename internal::make_integer<Scalar>::type IntType;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user