aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Rasmus Munk Larsen <rmlarsen@google.com>2020-10-08 22:45:20 +0000
committerGravatar Rasmus Munk Larsen <rmlarsen@google.com>2020-10-08 22:45:20 +0000
commit183a208212353ccf81a664d25dc7660b6269acdd (patch)
treea2cb6ae550605f0cab1b120f619cb3c4a7ecf51d
parent8f8d77b516855289184b8947080abf82535dcb66 (diff)
Implement generic bitwise logical packet ops that work for all types.
-rw-r--r--Eigen/src/Core/GenericPacketMath.h27
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