fix pexp_complex_test
diff --git a/test/packetmath.cpp b/test/packetmath.cpp index c5e4897..e6f4a67 100644 --- a/test/packetmath.cpp +++ b/test/packetmath.cpp
@@ -1332,6 +1332,52 @@ VERIFY(test::areApprox(ref, pval, PacketSize) && "conj_helper pmadd"); } +template <typename Scalar, typename Packet, bool HasExp = internal::packet_traits<Scalar>::HasExp> +struct exp_complex_test_impl { + typedef typename Scalar::value_type RealScalar; + static void run(Scalar* data1, Scalar* data2, Scalar* ref, Index size) { + const int PacketSize = internal::unpacket_traits<Packet>::size; + + for (int i = 0; i < size; ++i) { + data1[i] = Scalar(internal::random<RealScalar>(), internal::random<RealScalar>()); + } + CHECK_CWISE1_N(std::exp, internal::pexp, size); + + // Test misc. corner cases. + const RealScalar zero = RealScalar(0); + const RealScalar one = RealScalar(1); + const RealScalar inf = std::numeric_limits<RealScalar>::infinity(); + const RealScalar nan = std::numeric_limits<RealScalar>::quiet_NaN(); + for (RealScalar x : {zero, one, inf}) { + for (RealScalar y : {zero, one, inf}) { + data1[0] = Scalar(x, y); + data1[1] = Scalar(-x, y); + data1[2] = Scalar(x, -y); + data1[3] = Scalar(-x, -y); + CHECK_CWISE1_N(std::exp, internal::pexp, 4); + } + } + for (RealScalar x : {zero, one, inf}) { + data1[0] = Scalar(x, nan); + data1[1] = Scalar(-x, nan); + data1[2] = Scalar(nan, x); + data1[3] = Scalar(nan, -x); + CHECK_CWISE1_N(std::exp, internal::pexp, 4); + } + } +}; + +template <typename Scalar, typename Packet> +struct exp_complex_test_impl<Scalar, Packet, false> { + typedef typename Scalar::value_type RealScalar; + static void run(Scalar*, Scalar*, Scalar*, Index){}; +}; + +template <typename Scalar, typename Packet> +void exp_complex_test(Scalar* data1, Scalar* data2, Scalar* ref, Index size) { + exp_complex_test_impl<Scalar, Packet>::run(data1, data2, ref, size); +} + template <typename Scalar, typename Packet> void packetmath_complex() { typedef internal::packet_traits<Scalar> PacketTraits; @@ -1447,35 +1493,7 @@ data1[3] = Scalar(nan, -inf); CHECK_CWISE1_IM1ULP_N(std::log, internal::plog, 4); } - - if (PacketTraits::HasExp) { - for (int i = 0; i < size; ++i) { - data1[i] = Scalar(internal::random<RealScalar>(), internal::random<RealScalar>()); - } - CHECK_CWISE1_N(std::exp, internal::pexp, size); - - // Test misc. corner cases. - const RealScalar zero = RealScalar(0); - const RealScalar one = RealScalar(1); - const RealScalar inf = std::numeric_limits<RealScalar>::infinity(); - const RealScalar nan = std::numeric_limits<RealScalar>::quiet_NaN(); - for (RealScalar x : {zero, one, inf}) { - for (RealScalar y : {zero, one, inf}) { - data1[0] = Scalar(x, y); - data1[1] = Scalar(-x, y); - data1[2] = Scalar(x, -y); - data1[3] = Scalar(-x, -y); - CHECK_CWISE1_N(std::exp, internal::pexp, 4); - } - } - for (RealScalar x : {zero, one, inf}) { - data1[0] = Scalar(x, nan); - data1[1] = Scalar(-x, nan); - data1[2] = Scalar(nan, x); - data1[3] = Scalar(nan, -x); - CHECK_CWISE1_N(std::exp, internal::pexp, 4); - } - } + exp_complex_test<Scalar, Packet>(data1, data2, ref, size); } template <typename Scalar, typename Packet>