diff options
author | Joel Holdsworth <joel@airwebreathe.org.uk> | 2020-03-19 17:24:06 +0000 |
---|---|---|
committer | Rasmus Munk Larsen <rmlarsen@google.com> | 2020-03-19 17:24:06 +0000 |
commit | 232f9040821db526d28b9d93aaeb45c907dbf06b (patch) | |
tree | ef6385880742496420cb4718e11d84baeacfed5f /Eigen/src/Core/GenericPacketMath.h | |
parent | 54aa8fa186e84bc6985f70f9aa43490709f345b7 (diff) |
Add shift_left<N> and shift_right<N> coefficient-wise unary Array functions
Diffstat (limited to 'Eigen/src/Core/GenericPacketMath.h')
-rw-r--r-- | Eigen/src/Core/GenericPacketMath.h | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h index 146d34fb5..42d1eb077 100644 --- a/Eigen/src/Core/GenericPacketMath.h +++ b/Eigen/src/Core/GenericPacketMath.h @@ -44,19 +44,20 @@ struct default_packet_traits enum { HasHalfPacket = 0, - HasAdd = 1, - HasSub = 1, - HasMul = 1, - HasNegate = 1, - HasAbs = 1, - HasArg = 0, - HasAbs2 = 1, - HasMin = 1, - HasMax = 1, - HasConj = 1, + HasAdd = 1, + HasSub = 1, + HasShift = 1, + HasMul = 1, + HasNegate = 1, + HasAbs = 1, + HasArg = 0, + HasAbs2 = 1, + HasMin = 1, + HasMax = 1, + HasConj = 1, HasSetLinear = 1, - HasBlend = 0, - HasReduxp = 1, + HasBlend = 0, + HasReduxp = 1, HasDiv = 0, HasSqrt = 0, @@ -230,17 +231,23 @@ EIGEN_DEVICE_FUNC inline std::complex<RealScalar> ptrue(const std::complex<RealS template <typename Packet> EIGEN_DEVICE_FUNC inline Packet pnot(const Packet& a) { return pxor(ptrue(a), a);} -/** \internal \returns \a a shifted by N bits to the right */ +/** \internal \returns \a a logically shifted by N bits to the right */ template<int N> EIGEN_DEVICE_FUNC inline int -pshiftright(const int& a) { return a >> N; } +parithmetic_shift_right(const int& a) { return a >> N; } template<int N> EIGEN_DEVICE_FUNC inline long int -pshiftright(const long int& a) { return a >> N; } +parithmetic_shift_right(const long int& a) { return a >> N; } + +/** \internal \returns \a a arithmetically shifted by N bits to the right */ +template<int N> EIGEN_DEVICE_FUNC inline int +plogical_shift_right(const int& a) { return static_cast<int>(static_cast<unsigned int>(a) >> N); } +template<int N> EIGEN_DEVICE_FUNC inline long int +plogical_shift_right(const long int& a) { return static_cast<long>(static_cast<unsigned long>(a) >> N); } /** \internal \returns \a a shifted by N bits to the left */ template<int N> EIGEN_DEVICE_FUNC inline int -pshiftleft(const int& a) { return a << N; } +plogical_shift_left(const int& a) { return a << N; } template<int N> EIGEN_DEVICE_FUNC inline long int -pshiftleft(const long int& a) { return a << N; } +plogical_shift_left(const long int& a) { return a << N; } /** \internal \returns the significant and exponent of the underlying floating point numbers * See https://en.cppreference.com/w/cpp/numeric/math/frexp |