diff options
author | Rasmus Munk Larsen <rmlarsen@google.com> | 2019-01-07 16:53:36 -0800 |
---|---|---|
committer | Rasmus Munk Larsen <rmlarsen@google.com> | 2019-01-07 16:53:36 -0800 |
commit | 055f0b73dbdd3b6e32ab10f8c3538b360124627f (patch) | |
tree | 3c26fe6f4bbe8a2a397e9ce7cc5a9f1f273f3e9d /Eigen/src/Core/GenericPacketMath.h | |
parent | 190d053e41ef8cb77e08e42a37b7e72f9c1d6d43 (diff) |
Add support for pcmp_eq and pnot, including for complex types.
Diffstat (limited to 'Eigen/src/Core/GenericPacketMath.h')
-rw-r--r-- | Eigen/src/Core/GenericPacketMath.h | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h index 2b2ee9e2c..883c35d2c 100644 --- a/Eigen/src/Core/GenericPacketMath.h +++ b/Eigen/src/Core/GenericPacketMath.h @@ -214,6 +214,18 @@ pxor(const Packet& a, const Packet& b) { return a ^ b; } template<typename Packet> EIGEN_DEVICE_FUNC inline Packet pandnot(const Packet& a, const Packet& b) { return a & (~b); } +/** \internal \returns a packet with constant coefficients \a a, e.g.: (a,a,a,a) */ +template<typename Packet> EIGEN_DEVICE_FUNC inline Packet +pset1(const typename unpacket_traits<Packet>::type& a) { return a; } + +/** \internal \returns the bitwise not of \a a */ +template<typename Packet> EIGEN_DEVICE_FUNC inline Packet +pnot(const Packet& a) { + typedef typename unpacket_traits<Packet>::type Scalar; + Packet ones = pset1<Packet>(Scalar(1)); + return pandnot(ones, a); +} + /** \internal \returns \a a shifted by N bits to the right */ template<int N> EIGEN_DEVICE_FUNC inline int pshiftright(const int& a) { return a >> N; } @@ -258,7 +270,12 @@ pcmp_lt(const Packet& a, const Packet& b); /* { return a<b ? pnot(pxor(a,a)) : /** \internal \returns a == b as a bit mask */ template<typename Packet> EIGEN_DEVICE_FUNC inline Packet -pcmp_eq(const Packet& a, const Packet& b); /* { return a==b ? pnot(pxor(a,a)) : pxor(a,a); } */ +pcmp_eq(const Packet& a, const Packet& b) +{ + typedef typename unpacket_traits<Packet>::type Scalar; + Packet zeros = pset1<Packet>(Scalar(0)); + return a==b ? pnot(zeros) : zeros; +} /** \internal \returns a < b or a==NaN or b==NaN as a bit mask */ template<typename Packet> EIGEN_DEVICE_FUNC inline Packet @@ -272,10 +289,6 @@ pload(const typename unpacket_traits<Packet>::type* from) { return *from; } template<typename Packet> EIGEN_DEVICE_FUNC inline Packet ploadu(const typename unpacket_traits<Packet>::type* from) { return *from; } -/** \internal \returns a packet with constant coefficients \a a, e.g.: (a,a,a,a) */ -template<typename Packet> EIGEN_DEVICE_FUNC inline Packet -pset1(const typename unpacket_traits<Packet>::type& a) { return a; } - /** \internal \returns a packet with constant coefficients set from bits */ template<typename Packet,typename BitsType> EIGEN_DEVICE_FUNC inline Packet pset1frombits(BitsType a); |