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
@@ -335,12 +335,9 @@ EIGEN_DEVICE_FUNC inline Packet psub(const Packet& a, const Packet& b) {
|
||||
/** \internal \returns -a (coeff-wise) */
|
||||
template <typename Packet>
|
||||
EIGEN_DEVICE_FUNC inline Packet pnegate(const Packet& a) {
|
||||
return -a;
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_DEVICE_FUNC inline bool pnegate(const bool& a) {
|
||||
return !a;
|
||||
EIGEN_STATIC_ASSERT((!is_same<typename unpacket_traits<Packet>::type, bool>::value),
|
||||
NEGATE IS NOT DEFINED FOR BOOLEAN TYPES)
|
||||
return numext::negate(a);
|
||||
}
|
||||
|
||||
/** \internal \returns conj(a) (coeff-wise) */
|
||||
@@ -1117,8 +1114,9 @@ EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog10(const Packet&
|
||||
/** \internal \returns the log10 of \a a (coeff-wise) */
|
||||
template <typename Packet>
|
||||
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog2(const Packet& a) {
|
||||
typedef typename internal::unpacket_traits<Packet>::type Scalar;
|
||||
return pmul(pset1<Packet>(Scalar(EIGEN_LOG2E)), plog(a));
|
||||
using Scalar = typename internal::unpacket_traits<Packet>::type;
|
||||
using RealScalar = typename NumTraits<Scalar>::Real;
|
||||
return pmul(pset1<Packet>(Scalar(RealScalar(EIGEN_LOG2E))), plog(a));
|
||||
}
|
||||
|
||||
/** \internal \returns the square-root of \a a (coeff-wise) */
|
||||
@@ -1403,6 +1401,12 @@ EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet, 1>& /*kernel*/) {
|
||||
template <size_t N>
|
||||
struct Selector {
|
||||
bool select[N];
|
||||
template <typename MaskType = int>
|
||||
EIGEN_DEVICE_FUNC inline MaskType mask(size_t begin = 0, size_t end = N) const {
|
||||
MaskType res = 0;
|
||||
for (size_t i = begin; i < end; i++) res |= (static_cast<MaskType>(select[i]) << i);
|
||||
return res;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Packet>
|
||||
|
||||
@@ -861,6 +861,25 @@ struct sign_retval {
|
||||
typedef Scalar type;
|
||||
};
|
||||
|
||||
// suppress "unary minus operator applied to unsigned type, result still unsigned" warnings on MSVC
|
||||
// note: `0 - a` is distinct from `-a` when Scalar is a floating point type and `a` is zero
|
||||
|
||||
template <typename Scalar, bool IsInteger = NumTraits<Scalar>::IsInteger>
|
||||
struct negate_impl {
|
||||
static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar run(const Scalar& a) { return -a; }
|
||||
};
|
||||
|
||||
template <typename Scalar>
|
||||
struct negate_impl<Scalar, true> {
|
||||
EIGEN_STATIC_ASSERT((!is_same<Scalar, bool>::value), NEGATE IS NOT DEFINED FOR BOOLEAN TYPES)
|
||||
static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar run(const Scalar& a) { return Scalar(0) - a; }
|
||||
};
|
||||
|
||||
template <typename Scalar>
|
||||
struct negate_retval {
|
||||
typedef Scalar type;
|
||||
};
|
||||
|
||||
template <typename Scalar, bool IsInteger = NumTraits<typename unpacket_traits<Scalar>::type>::IsInteger>
|
||||
struct nearest_integer_impl {
|
||||
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_floor(const Scalar& x) {
|
||||
@@ -1066,6 +1085,11 @@ EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(sign, Scalar) sign(const Scalar&
|
||||
return EIGEN_MATHFUNC_IMPL(sign, Scalar)::run(x);
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(negate, Scalar) negate(const Scalar& x) {
|
||||
return EIGEN_MATHFUNC_IMPL(negate, Scalar)::run(x);
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(const Scalar& x) {
|
||||
return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);
|
||||
|
||||
@@ -2147,20 +2147,13 @@ EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet16i, 4>& kernel) {
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE Packet16f pblend(const Selector<16>& ifPacket, const Packet16f& thenPacket,
|
||||
const Packet16f& elsePacket) {
|
||||
__mmask16 m = (ifPacket.select[0]) | (ifPacket.select[1] << 1) | (ifPacket.select[2] << 2) |
|
||||
(ifPacket.select[3] << 3) | (ifPacket.select[4] << 4) | (ifPacket.select[5] << 5) |
|
||||
(ifPacket.select[6] << 6) | (ifPacket.select[7] << 7) | (ifPacket.select[8] << 8) |
|
||||
(ifPacket.select[9] << 9) | (ifPacket.select[10] << 10) | (ifPacket.select[11] << 11) |
|
||||
(ifPacket.select[12] << 12) | (ifPacket.select[13] << 13) | (ifPacket.select[14] << 14) |
|
||||
(ifPacket.select[15] << 15);
|
||||
__mmask16 m = ifPacket.mask<__mmask16>();
|
||||
return _mm512_mask_blend_ps(m, elsePacket, thenPacket);
|
||||
}
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE Packet8d pblend(const Selector<8>& ifPacket, const Packet8d& thenPacket,
|
||||
const Packet8d& elsePacket) {
|
||||
__mmask8 m = (ifPacket.select[0]) | (ifPacket.select[1] << 1) | (ifPacket.select[2] << 2) |
|
||||
(ifPacket.select[3] << 3) | (ifPacket.select[4] << 4) | (ifPacket.select[5] << 5) |
|
||||
(ifPacket.select[6] << 6) | (ifPacket.select[7] << 7);
|
||||
__mmask8 m = ifPacket.mask<__mmask8>();
|
||||
return _mm512_mask_blend_pd(m, elsePacket, thenPacket);
|
||||
}
|
||||
|
||||
|
||||
@@ -296,6 +296,7 @@ struct packet_traits<bool> : default_packet_traits {
|
||||
HasMax = 0,
|
||||
HasConj = 0,
|
||||
HasSqrt = 1,
|
||||
HasNegate = 0,
|
||||
HasSign = 0 // Don't try to vectorize psign<bool> = identity.
|
||||
};
|
||||
};
|
||||
@@ -601,11 +602,6 @@ EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) {
|
||||
return psub(pzero(a), a);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE Packet16b pnegate(const Packet16b& a) {
|
||||
return a;
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE Packet4f pconj(const Packet4f& a) {
|
||||
return a;
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace internal {
|
||||
*/
|
||||
template <typename Scalar>
|
||||
struct scalar_opposite_op {
|
||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return -a; }
|
||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::negate(a); }
|
||||
template <typename Packet>
|
||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
|
||||
return internal::pnegate(a);
|
||||
@@ -455,8 +455,9 @@ struct functor_traits<scalar_log10_op<Scalar>> {
|
||||
*/
|
||||
template <typename Scalar>
|
||||
struct scalar_log2_op {
|
||||
using RealScalar = typename NumTraits<Scalar>::Real;
|
||||
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const {
|
||||
return Scalar(EIGEN_LOG2E) * numext::log(a);
|
||||
return Scalar(RealScalar(EIGEN_LOG2E)) * numext::log(a);
|
||||
}
|
||||
template <typename Packet>
|
||||
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
||||
|
||||
Reference in New Issue
Block a user