aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/packetmath.cpp
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2018-12-08 14:27:48 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2018-12-08 14:27:48 +0100
commit81c27325ae3b5b8cbc72762f74ecb7b82cd031f5 (patch)
tree90844d875b39328e34f7779c4add5a6cc945cc65 /test/packetmath.cpp
parent426bce7529f148bbec3fd386ddf6d6c4880de347 (diff)
bug #1641: fix testing of pandnot and fix pandnot for complex on SSE/AVX/AVX512
Diffstat (limited to 'test/packetmath.cpp')
-rw-r--r--test/packetmath.cpp26
1 files changed, 20 insertions, 6 deletions
diff --git a/test/packetmath.cpp b/test/packetmath.cpp
index 60c9dbc36..916b37bef 100644
--- a/test/packetmath.cpp
+++ b/test/packetmath.cpp
@@ -64,6 +64,10 @@ struct bit_andnot{
operator()(T a, T b) const { return a & (~b); }
};
EIGEN_TEST_MAKE_BITWISE(andnot, bit_andnot())
+template<typename T>
+bool biteq(T a, T b) {
+ return (bits(a) == bits(b)).all();
+}
}
}
@@ -92,7 +96,7 @@ template<typename Scalar> bool areApprox(const Scalar* a, const Scalar* b, int s
{
for (int i=0; i<size; ++i)
{
- if (a[i]!=b[i] && !internal::isApprox(a[i],b[i]))
+ if ((!internal::biteq(a[i],b[i])) && a[i]!=b[i] && !internal::isApprox(a[i],b[i]))
{
std::cout << "ref: [" << Map<const Matrix<Scalar,1,Dynamic> >(a,size) << "]" << " != vec: [" << Map<const Matrix<Scalar,1,Dynamic> >(b,size) << "]\n";
return false;
@@ -344,11 +348,6 @@ template<typename Scalar,typename Packet> void packetmath()
}
}
- CHECK_CWISE2_IF(true, internal::por, internal::por);
- CHECK_CWISE2_IF(true, internal::pxor, internal::pxor);
- CHECK_CWISE2_IF(true, internal::pand, internal::pand);
- CHECK_CWISE2_IF(true, internal::pandnot, internal::pandnot);
-
if (PacketTraits::HasBlend) {
Packet thenPacket = internal::pload<Packet>(data1);
Packet elsePacket = internal::pload<Packet>(data2);
@@ -384,6 +383,21 @@ template<typename Scalar,typename Packet> void packetmath()
internal::pstore(data2, internal::pinsertlast(internal::pload<Packet>(data1),s));
VERIFY(areApprox(ref, data2, PacketSize) && "internal::pinsertlast");
}
+
+ {
+ for (int i=0; i<PacketSize; ++i)
+ {
+ data1[i] = internal::random<Scalar>();
+ unsigned char v = internal::random<bool>() ? 0xff : 0;
+ char* bytes = (char*)(data1+PacketSize+i);
+ for(int k=0; k<int(sizeof(Scalar)); ++k)
+ bytes[k] = v;
+ }
+ CHECK_CWISE2_IF(true, internal::por, internal::por);
+ CHECK_CWISE2_IF(true, internal::pxor, internal::pxor);
+ CHECK_CWISE2_IF(true, internal::pand, internal::pand);
+ CHECK_CWISE2_IF(true, internal::pandnot, internal::pandnot);
+ }
}
template<typename Scalar,typename Packet> void packetmath_real()