mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Fix "unary minus operator applied to unsigned type, result still unsigned" on MSVC and other stupid warnings
This commit is contained in:
committed by
Rasmus Munk Larsen
parent
dcdb0233c1
commit
122befe54c
@@ -34,11 +34,11 @@ inline T REF_MSUB(const T& a, const T& b, const T& c) {
|
||||
}
|
||||
template <typename T>
|
||||
inline T REF_NMADD(const T& a, const T& b, const T& c) {
|
||||
return (-a * b) + c;
|
||||
return c - a * b;
|
||||
}
|
||||
template <typename T>
|
||||
inline T REF_NMSUB(const T& a, const T& b, const T& c) {
|
||||
return (-a * b) - c;
|
||||
return test::negate(a * b + c);
|
||||
}
|
||||
template <typename T>
|
||||
inline T REF_DIV(const T& a, const T& b) {
|
||||
@@ -427,6 +427,32 @@ struct eigen_optimization_barrier_test<
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Scalar, typename Packet, bool HasNegate = internal::packet_traits<Scalar>::HasNegate>
|
||||
struct negate_test_impl {
|
||||
static void run_negate(Scalar* data1, Scalar* data2, Scalar* ref, int PacketSize) {
|
||||
CHECK_CWISE1_IF(HasNegate, test::negate, internal::pnegate);
|
||||
}
|
||||
static void run_nmsub(Scalar* data1, Scalar* data2, Scalar* ref, int PacketSize) {
|
||||
CHECK_CWISE3_IF(HasNegate, REF_NMSUB, internal::pnmsub);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Scalar, typename Packet>
|
||||
struct negate_test_impl<Scalar, Packet, false> {
|
||||
static void run_negate(Scalar*, Scalar*, Scalar*, int) {}
|
||||
static void run_nmsub(Scalar*, Scalar*, Scalar*, int) {}
|
||||
};
|
||||
|
||||
template <typename Scalar, typename Packet>
|
||||
void negate_test(Scalar* data1, Scalar* data2, Scalar* ref, int size) {
|
||||
negate_test_impl<Scalar, Packet>::run_negate(data1, data2, ref, size);
|
||||
}
|
||||
|
||||
template <typename Scalar, typename Packet>
|
||||
void nmsub_test(Scalar* data1, Scalar* data2, Scalar* ref, int size) {
|
||||
negate_test_impl<Scalar, Packet>::run_negate(data1, data2, ref, size);
|
||||
}
|
||||
|
||||
template <typename Scalar, typename Packet>
|
||||
void packetmath() {
|
||||
typedef internal::packet_traits<Scalar> PacketTraits;
|
||||
@@ -533,7 +559,7 @@ void packetmath() {
|
||||
CHECK_CWISE2_IF(PacketTraits::HasMul, REF_MUL, internal::pmul);
|
||||
CHECK_CWISE2_IF(PacketTraits::HasDiv, REF_DIV, internal::pdiv);
|
||||
|
||||
CHECK_CWISE1_IF(PacketTraits::HasNegate, test::negate, internal::pnegate);
|
||||
negate_test<Scalar, Packet>(data1, data2, ref, PacketSize);
|
||||
CHECK_CWISE1_IF(PacketTraits::HasReciprocal, REF_RECIPROCAL, internal::preciprocal);
|
||||
CHECK_CWISE1(numext::conj, internal::pconj);
|
||||
CHECK_CWISE1_IF(PacketTraits::HasSign, numext::sign, internal::psign);
|
||||
@@ -689,7 +715,7 @@ void packetmath() {
|
||||
CHECK_CWISE1_IF(PacketTraits::HasRsqrt, numext::rsqrt, internal::prsqrt);
|
||||
CHECK_CWISE3_IF(true, REF_MADD, internal::pmadd);
|
||||
if (!std::is_same<Scalar, bool>::value && NumTraits<Scalar>::IsSigned) {
|
||||
CHECK_CWISE3_IF(PacketTraits::HasNegate, REF_NMSUB, internal::pnmsub);
|
||||
nmsub_test<Scalar, Packet>(data1, data2, ref, PacketSize);
|
||||
}
|
||||
|
||||
// For pmsub, pnmadd, the values can cancel each other to become near zero,
|
||||
@@ -698,11 +724,11 @@ void packetmath() {
|
||||
for (int i = 0; i < PacketSize; ++i) {
|
||||
data1[i] = numext::abs(internal::random<Scalar>());
|
||||
data1[i + PacketSize] = numext::abs(internal::random<Scalar>());
|
||||
data1[i + 2 * PacketSize] = -numext::abs(internal::random<Scalar>());
|
||||
data1[i + 2 * PacketSize] = Scalar(0) - numext::abs(internal::random<Scalar>());
|
||||
}
|
||||
if (!std::is_same<Scalar, bool>::value && NumTraits<Scalar>::IsSigned) {
|
||||
CHECK_CWISE3_IF(true, REF_MSUB, internal::pmsub);
|
||||
CHECK_CWISE3_IF(PacketTraits::HasNegate, REF_NMADD, internal::pnmadd);
|
||||
CHECK_CWISE3_IF(true, REF_NMADD, internal::pnmadd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user