diff options
author | Rasmus Munk Larsen <rmlarsen@google.com> | 2020-10-08 22:45:20 +0000 |
---|---|---|
committer | Rasmus Munk Larsen <rmlarsen@google.com> | 2020-10-08 22:45:20 +0000 |
commit | 183a208212353ccf81a664d25dc7660b6269acdd (patch) | |
tree | a2cb6ae550605f0cab1b120f619cb3c4a7ecf51d | |
parent | 8f8d77b516855289184b8947080abf82535dcb66 (diff) |
Implement generic bitwise logical packet ops that work for all types.
-rw-r--r-- | Eigen/src/Core/GenericPacketMath.h | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h index b5eb1cf99..7a84841fa 100644 --- a/Eigen/src/Core/GenericPacketMath.h +++ b/Eigen/src/Core/GenericPacketMath.h @@ -304,17 +304,38 @@ EIGEN_DEVICE_FUNC inline std::complex<RealScalar> ptrue(const std::complex<RealS return std::complex<RealScalar>(b, b); } +template <typename Packet, typename Op> +Packet bitwise_helper(const Packet& a, const Packet& b, Op op) { + const unsigned char* a_ptr = reinterpret_cast<const unsigned char*>(&a); + const unsigned char* b_ptr = reinterpret_cast<const unsigned char*>(&b); + Packet c; + unsigned char* c_ptr = reinterpret_cast<unsigned char*>(&c); + for (size_t i = 0; i < sizeof(Packet); ++i) { + *c_ptr++ = op(*a_ptr++, *b_ptr++); + } + return c; +} + /** \internal \returns the bitwise and of \a a and \a b */ template<typename Packet> EIGEN_DEVICE_FUNC inline Packet -pand(const Packet& a, const Packet& b) { return a & b; } +pand(const Packet& a, const Packet& b) { + EIGEN_USING_STD(bit_and); + return bitwise_helper(a ,b, bit_and<unsigned char>()); +} /** \internal \returns the bitwise or of \a a and \a b */ template<typename Packet> EIGEN_DEVICE_FUNC inline Packet -por(const Packet& a, const Packet& b) { return a | b; } +por(const Packet& a, const Packet& b) { + EIGEN_USING_STD(bit_or); + return bitwise_helper(a ,b, bit_or<unsigned char>()); +} /** \internal \returns the bitwise xor of \a a and \a b */ template<typename Packet> EIGEN_DEVICE_FUNC inline Packet -pxor(const Packet& a, const Packet& b) { return a ^ b; } +pxor(const Packet& a, const Packet& b) { + EIGEN_USING_STD(bit_xor); + return bitwise_helper(a ,b, bit_xor<unsigned char>()); +} /** \internal \returns the bitwise and of \a a and not \a b */ template<typename Packet> EIGEN_DEVICE_FUNC inline Packet |