1*71db0c75SAndroid Build Coastguard Worker //===-- Utility class to test sqrt[f|l] -------------------------*- C++ -*-===// 2*71db0c75SAndroid Build Coastguard Worker // 3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information. 5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*71db0c75SAndroid Build Coastguard Worker // 7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 8*71db0c75SAndroid Build Coastguard Worker 9*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FEnvSafeTest.h" 10*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FPMatcher.h" 11*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h" 12*71db0c75SAndroid Build Coastguard Worker #include "utils/MPFRWrapper/MPFRUtils.h" 13*71db0c75SAndroid Build Coastguard Worker 14*71db0c75SAndroid Build Coastguard Worker namespace mpfr = LIBC_NAMESPACE::testing::mpfr; 15*71db0c75SAndroid Build Coastguard Worker 16*71db0c75SAndroid Build Coastguard Worker template <typename OutType, typename InType> 17*71db0c75SAndroid Build Coastguard Worker class SqrtTest : public LIBC_NAMESPACE::testing::FEnvSafeTest { 18*71db0c75SAndroid Build Coastguard Worker 19*71db0c75SAndroid Build Coastguard Worker DECLARE_SPECIAL_CONSTANTS(InType) 20*71db0c75SAndroid Build Coastguard Worker 21*71db0c75SAndroid Build Coastguard Worker static constexpr StorageType HIDDEN_BIT = 22*71db0c75SAndroid Build Coastguard Worker StorageType(1) << LIBC_NAMESPACE::fputil::FPBits<InType>::FRACTION_LEN; 23*71db0c75SAndroid Build Coastguard Worker 24*71db0c75SAndroid Build Coastguard Worker public: 25*71db0c75SAndroid Build Coastguard Worker using SqrtFunc = OutType (*)(InType); 26*71db0c75SAndroid Build Coastguard Worker test_denormal_values(SqrtFunc func)27*71db0c75SAndroid Build Coastguard Worker void test_denormal_values(SqrtFunc func) { 28*71db0c75SAndroid Build Coastguard Worker for (StorageType mant = 1; mant < HIDDEN_BIT; mant <<= 1) { 29*71db0c75SAndroid Build Coastguard Worker FPBits denormal(zero); 30*71db0c75SAndroid Build Coastguard Worker denormal.set_mantissa(mant); 31*71db0c75SAndroid Build Coastguard Worker InType x = denormal.get_val(); 32*71db0c75SAndroid Build Coastguard Worker EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Sqrt, x, func(x), 0.5); 33*71db0c75SAndroid Build Coastguard Worker } 34*71db0c75SAndroid Build Coastguard Worker 35*71db0c75SAndroid Build Coastguard Worker constexpr StorageType COUNT = 200'001; 36*71db0c75SAndroid Build Coastguard Worker constexpr StorageType STEP = HIDDEN_BIT / COUNT; 37*71db0c75SAndroid Build Coastguard Worker for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) { 38*71db0c75SAndroid Build Coastguard Worker InType x = FPBits(i).get_val(); 39*71db0c75SAndroid Build Coastguard Worker EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Sqrt, x, func(x), 0.5); 40*71db0c75SAndroid Build Coastguard Worker } 41*71db0c75SAndroid Build Coastguard Worker } 42*71db0c75SAndroid Build Coastguard Worker 43*71db0c75SAndroid Build Coastguard Worker void test_normal_range(SqrtFunc func) { 44*71db0c75SAndroid Build Coastguard Worker constexpr StorageType COUNT = 200'001; 45*71db0c75SAndroid Build Coastguard Worker constexpr StorageType STEP = STORAGE_MAX / COUNT; 46*71db0c75SAndroid Build Coastguard Worker for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) { 47*71db0c75SAndroid Build Coastguard Worker FPBits x_bits(v); 48*71db0c75SAndroid Build Coastguard Worker InType x = x_bits.get_val(); 49*71db0c75SAndroid Build Coastguard Worker if (x_bits.is_nan() || (x < 0)) 50*71db0c75SAndroid Build Coastguard Worker continue; 51*71db0c75SAndroid Build Coastguard Worker EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Sqrt, x, func(x), 0.5); 52*71db0c75SAndroid Build Coastguard Worker } 53*71db0c75SAndroid Build Coastguard Worker } 54*71db0c75SAndroid Build Coastguard Worker }; 55*71db0c75SAndroid Build Coastguard Worker 56*71db0c75SAndroid Build Coastguard Worker #define LIST_SQRT_TESTS(T, func) \ 57*71db0c75SAndroid Build Coastguard Worker using LlvmLibcSqrtTest = SqrtTest<T, T>; \ 58*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcSqrtTest, DenormalValues) { test_denormal_values(&func); } \ 59*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcSqrtTest, NormalRange) { test_normal_range(&func); } 60*71db0c75SAndroid Build Coastguard Worker 61*71db0c75SAndroid Build Coastguard Worker #define LIST_NARROWING_SQRT_TESTS(OutType, InType, func) \ 62*71db0c75SAndroid Build Coastguard Worker using LlvmLibcSqrtTest = SqrtTest<OutType, InType>; \ 63*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcSqrtTest, DenormalValues) { test_denormal_values(&func); } \ 64*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcSqrtTest, NormalRange) { test_normal_range(&func); } 65