From 183a208212353ccf81a664d25dc7660b6269acdd Mon Sep 17 00:00:00 2001 From: Rasmus Munk Larsen Date: Thu, 8 Oct 2020 22:45:20 +0000 Subject: [PATCH] Implement generic bitwise logical packet ops that work for all types. --- Eigen/src/Core/GenericPacketMath.h | 27 ++++++++++++++++++++++++--- 1 file 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 ptrue(const std::complex(b, b); } +template +Packet bitwise_helper(const Packet& a, const Packet& b, Op op) { + const unsigned char* a_ptr = reinterpret_cast(&a); + const unsigned char* b_ptr = reinterpret_cast(&b); + Packet c; + unsigned char* c_ptr = reinterpret_cast(&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 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()); +} /** \internal \returns the bitwise or of \a a and \a b */ template 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()); +} /** \internal \returns the bitwise xor of \a a and \a b */ template 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()); +} /** \internal \returns the bitwise and of \a a and not \a b */ template EIGEN_DEVICE_FUNC inline Packet