1*71db0c75SAndroid Build Coastguard Worker //===-- Utility class to test different flavors of hypot ------------------===// 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 #ifndef LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_H 10*71db0c75SAndroid Build Coastguard Worker #define LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_H 11*71db0c75SAndroid Build Coastguard Worker 12*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/properties/architectures.h" 13*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FPMatcher.h" 14*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h" 15*71db0c75SAndroid Build Coastguard Worker 16*71db0c75SAndroid Build Coastguard Worker template <typename T> 17*71db0c75SAndroid Build Coastguard Worker struct HypotTestTemplate : public LIBC_NAMESPACE::testing::Test { 18*71db0c75SAndroid Build Coastguard Worker using Func = T (*)(T, T); 19*71db0c75SAndroid Build Coastguard Worker DECLARE_SPECIAL_CONSTANTSHypotTestTemplate20*71db0c75SAndroid Build Coastguard Worker DECLARE_SPECIAL_CONSTANTS(T) 21*71db0c75SAndroid Build Coastguard Worker 22*71db0c75SAndroid Build Coastguard Worker void test_special_numbers(Func func) { 23*71db0c75SAndroid Build Coastguard Worker constexpr int N = 4; 24*71db0c75SAndroid Build Coastguard Worker // Pythagorean triples. 25*71db0c75SAndroid Build Coastguard Worker constexpr T PYT[N][3] = {{3, 4, 5}, {5, 12, 13}, {8, 15, 17}, {7, 24, 25}}; 26*71db0c75SAndroid Build Coastguard Worker 27*71db0c75SAndroid Build Coastguard Worker #ifndef LIBC_TARGET_ARCH_IS_NVPTX 28*71db0c75SAndroid Build Coastguard Worker // TODO: Investigate why sNaN tests are failing on nVidia. 29*71db0c75SAndroid Build Coastguard Worker // https://github.com/llvm/llvm-project/issues/99706. 30*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(func(inf, sNaN), aNaN); 31*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(func(sNaN, neg_inf), aNaN); 32*71db0c75SAndroid Build Coastguard Worker #endif // !LIBC_TARGET_ARCH_IS_NVPTX 33*71db0c75SAndroid Build Coastguard Worker 34*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(func(inf, aNaN), inf); 35*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(func(aNaN, neg_inf), inf); 36*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(func(aNaN, aNaN), aNaN); 37*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(func(aNaN, zero), aNaN); 38*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ(func(neg_zero, aNaN), aNaN); 39*71db0c75SAndroid Build Coastguard Worker 40*71db0c75SAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) { 41*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(PYT[i][2], func(PYT[i][0], PYT[i][1])); 42*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(PYT[i][2], func(-PYT[i][0], PYT[i][1])); 43*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(PYT[i][2], func(PYT[i][0], -PYT[i][1])); 44*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(PYT[i][2], func(-PYT[i][0], -PYT[i][1])); 45*71db0c75SAndroid Build Coastguard Worker 46*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(PYT[i][2], func(PYT[i][1], PYT[i][0])); 47*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(PYT[i][2], func(-PYT[i][1], PYT[i][0])); 48*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(PYT[i][2], func(PYT[i][1], -PYT[i][0])); 49*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(PYT[i][2], func(-PYT[i][1], -PYT[i][0])); 50*71db0c75SAndroid Build Coastguard Worker } 51*71db0c75SAndroid Build Coastguard Worker } 52*71db0c75SAndroid Build Coastguard Worker }; 53*71db0c75SAndroid Build Coastguard Worker 54*71db0c75SAndroid Build Coastguard Worker #endif // LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_H 55