From 5529db7524b93208f3d97f5fadc53aff1de70190 Mon Sep 17 00:00:00 2001 From: Antonio Sanchez Date: Thu, 25 Feb 2021 14:29:49 -0800 Subject: Fix SSE/NEON pfloor/pceil for saturated values. The original will saturate if the input does not fit into an integer type. Here we fix this, returning the input if it doesn't have enough precision to have a fractional part. Also added `pceil` for NEON. Fixes #1969. --- test/packetmath.cpp | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) (limited to 'test') diff --git a/test/packetmath.cpp b/test/packetmath.cpp index 94a83c008..f355af491 100644 --- a/test/packetmath.cpp +++ b/test/packetmath.cpp @@ -546,14 +546,43 @@ void packetmath_real() { CHECK_CWISE1_IF(PacketTraits::HasCeil, numext::ceil, internal::pceil); CHECK_CWISE1_IF(PacketTraits::HasFloor, numext::floor, internal::pfloor); CHECK_CWISE1_IF(PacketTraits::HasRint, numext::rint, internal::print); - - // See bug 1785. - for (int i = 0; i < size; ++i) { - data1[i] = Scalar(-1.5 + i); - data2[i] = Scalar(-1.5 + i); + + // Rounding edge cases. + if (PacketTraits::HasRound || PacketTraits::HasCeil || PacketTraits::HasFloor || PacketTraits::HasRint) { + typedef typename internal::make_integer::type IntType; + // Start with values that cannot fit inside an integer, work down to less than one. + Scalar val = Scalar(2) * static_cast(NumTraits::highest()); + std::vector values; + while (val > Scalar(0.25)) { + // Cover both even and odd, positive and negative cases. + values.push_back(val); + values.push_back(val + Scalar(0.3)); + values.push_back(val + Scalar(0.5)); + values.push_back(val + Scalar(0.8)); + values.push_back(val + Scalar(1)); + values.push_back(val + Scalar(1.3)); + values.push_back(val + Scalar(1.5)); + values.push_back(val + Scalar(1.8)); + values.push_back(-val); + values.push_back(-val - Scalar(0.3)); + values.push_back(-val - Scalar(0.5)); + values.push_back(-val - Scalar(0.8)); + values.push_back(-val - Scalar(1)); + values.push_back(-val - Scalar(1.3)); + values.push_back(-val - Scalar(1.5)); + values.push_back(-val - Scalar(1.8)); + values.push_back(Scalar(-1.5) + val); // Bug 1785. + val = val / Scalar(2); + } + + for (size_t k=0; k(-1, 1)); -- cgit v1.2.3