| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,61 @@ | ||
| ! RUN: %flang -target x86_64-linux-gnu -fopenmp=libomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-OPENMP | ||
| ! RUN: %flang -target x86_64-linux-gnu -fopenmp=libgomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-NO-OPENMP | ||
| ! RUN: %flang -target x86_64-linux-gnu -fopenmp=libiomp5 -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-OPENMP | ||
| ! RUN: %flang -target x86_64-apple-darwin -fopenmp=libomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-OPENMP | ||
| ! RUN: %flang -target x86_64-apple-darwin -fopenmp=libgomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-NO-OPENMP | ||
| ! RUN: %flang -target x86_64-apple-darwin -fopenmp=libiomp5 -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-OPENMP | ||
| ! RUN: %flang -target x86_64-freebsd -fopenmp=libomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-OPENMP | ||
| ! RUN: %flang -target x86_64-freebsd -fopenmp=libgomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-NO-OPENMP | ||
| ! RUN: %flang -target x86_64-freebsd -fopenmp=libiomp5 -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-OPENMP | ||
| ! RUN: %flang -target x86_64-windows-gnu -fopenmp=libomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-OPENMP | ||
| ! RUN: %flang -target x86_64-windows-gnu -fopenmp=libgomp -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-NO-OPENMP --check-prefix=CHECK-WARNING | ||
| ! RUN: %flang -target x86_64-windows-gnu -fopenmp=libiomp5 -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-FC1-OPENMP | ||
|
|
||
| ! CHECK-FC1-OPENMP: "-fc1" | ||
| ! CHECK-FC1-OPENMP: "-fopenmp" | ||
| ! | ||
| ! CHECK-WARNING: warning: The library '-fopenmp=={{.*}}' is not supported, openmp is not be enabled | ||
| ! CHECK-FC1-NO-OPENMP: "-fc1" | ||
| ! CHECK-FC1-NO-OPENMP-NOT: "-fopenmp" | ||
| ! | ||
| ! RUN: %flang -target x86_64-linux-gnu -fopenmp=libomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-OMP | ||
| ! RUN: %flang -target x86_64-linux-gnu -fopenmp=libgomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-GOMP --check-prefix=CHECK-LD-GOMP-RT | ||
| ! RUN: %flang -target x86_64-linux-gnu -fopenmp=libiomp5 %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-IOMP5 | ||
| ! | ||
| ! RUN: %flang -target x86_64-darwin -fopenmp=libomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-OMP | ||
| ! RUN: %flang -target x86_64-darwin -fopenmp=libgomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-GOMP --check-prefix=CHECK-LD-GOMP-NO-RT | ||
| ! RUN: %flang -target x86_64-darwin -fopenmp=libiomp5 %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-IOMP5 | ||
| ! | ||
| ! RUN: %flang -target x86_64-freebsd -fopenmp=libomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-OMP | ||
| ! RUN: %flang -target x86_64-freebsd -fopenmp=libgomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-GOMP --check-prefix=CHECK-LD-GOMP-NO-RT | ||
| ! RUN: %flang -target x86_64-freebsd -fopenmp=libiomp5 %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-IOMP5 | ||
| ! | ||
| ! RUN: %flang -target x86_64-windows-gnu -fopenmp=libomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-OMP | ||
| ! RUN: %flang -target x86_64-windows-gnu -fopenmp=libgomp %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-GOMP --check-prefix=CHECK-LD-GOMP-NO-RT | ||
| ! RUN: %flang -target x86_64-windows-gnu -fopenmp=libiomp5 %s -o %t -### 2>&1 | FileCheck %s --check-prefix=CHECK-LD-IOMP5MD | ||
| ! | ||
| ! CHECK-LD-OMP: "{{.*}}ld{{(.exe)?}}" | ||
| ! CHECK-LD-OMP: "-lomp" | ||
| ! | ||
| ! CHECK-LD-GOMP: "{{.*}}ld{{(.exe)?}}" | ||
| ! CHECK-LD-GOMP: "-lgomp" | ||
| ! CHECK-LD-GOMP-RT: "-lrt" | ||
| ! CHECK-LD-GOMP-NO-RT-NOT: "-lrt" | ||
| ! | ||
| ! CHECK-LD-IOMP5: "{{.*}}ld{{(.exe)?}}" | ||
| ! CHECK-LD-IOMP5: "-liomp5" | ||
| ! | ||
| ! CHECK-LD-IOMP5MD: "{{.*}}ld{{(.exe)?}}" | ||
| ! CHECK-LD-IOMP5MD: "-liomp5md" | ||
| ! | ||
| ! We'd like to check that the default is sane, but until we have the ability | ||
| ! to *always* semantically analyze OpenMP without always generating runtime | ||
| ! calls (in the event of an unsupported runtime), we don't have a good way to | ||
| ! test the CC1 invocation. Instead, just ensure we do eventually link *some* | ||
| ! OpenMP runtime. | ||
| ! | ||
| ! CHECK-LD-ANY: "{{.*}}ld{{(.exe)?}}" | ||
| ! CHECK-LD-ANY: "-l{{(omp|gomp|iomp5)}}" | ||
| ! | ||
| ! CHECK-LD-ANYMD: "{{.*}}ld{{(.exe)?}}" | ||
| ! CHECK-LD-ANYMD: "-l{{(omp|gomp|iomp5md)}}" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -54,7 +54,7 @@ Additions: | |
| * pown* | ||
| * powr* | ||
| * rootn* | ||
| * roundeven* |check| | ||
| * fromfp* | ||
| * ufromfp* | ||
| * fromfpx* | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| //===-- Implementation of roundeven function ------------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #include "src/math/roundeven.h" | ||
| #include "src/__support/FPUtil/NearestIntegerOperations.h" | ||
| #include "src/__support/common.h" | ||
|
|
||
| namespace LIBC_NAMESPACE { | ||
|
|
||
| LLVM_LIBC_FUNCTION(double, roundeven, (double x)) { | ||
| return fputil::round_using_specific_rounding_mode(x, FP_INT_TONEAREST); | ||
| } | ||
|
|
||
| } // namespace LIBC_NAMESPACE |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| //===-- Implementation of roundevenf function -----------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #include "src/math/roundevenf.h" | ||
| #include "src/__support/FPUtil/NearestIntegerOperations.h" | ||
| #include "src/__support/common.h" | ||
|
|
||
| namespace LIBC_NAMESPACE { | ||
|
|
||
| LLVM_LIBC_FUNCTION(float, roundevenf, (float x)) { | ||
| return fputil::round_using_specific_rounding_mode(x, FP_INT_TONEAREST); | ||
| } | ||
|
|
||
| } // namespace LIBC_NAMESPACE |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| //===-- Implementation of roundevenf128 function --------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #include "src/math/roundevenf128.h" | ||
| #include "src/__support/FPUtil/NearestIntegerOperations.h" | ||
| #include "src/__support/common.h" | ||
|
|
||
| namespace LIBC_NAMESPACE { | ||
|
|
||
| LLVM_LIBC_FUNCTION(float128, roundevenf128, (float128 x)) { | ||
| return fputil::round_using_specific_rounding_mode(x, FP_INT_TONEAREST); | ||
| } | ||
|
|
||
| } // namespace LIBC_NAMESPACE |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| //===-- Implementation of roundevenl function -----------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #include "src/math/roundevenl.h" | ||
| #include "src/__support/FPUtil/NearestIntegerOperations.h" | ||
| #include "src/__support/common.h" | ||
|
|
||
| namespace LIBC_NAMESPACE { | ||
|
|
||
| LLVM_LIBC_FUNCTION(long double, roundevenl, (long double x)) { | ||
| return fputil::round_using_specific_rounding_mode(x, FP_INT_TONEAREST); | ||
| } | ||
|
|
||
| } // namespace LIBC_NAMESPACE |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| //===-- Implementation header for roundeven ---------------------*- C++ -*-===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #ifndef LLVM_LIBC_SRC_MATH_ROUNDEVEN_H | ||
| #define LLVM_LIBC_SRC_MATH_ROUNDEVEN_H | ||
|
|
||
| namespace LIBC_NAMESPACE { | ||
|
|
||
| double roundeven(double x); | ||
|
|
||
| } // namespace LIBC_NAMESPACE | ||
|
|
||
| #endif // LLVM_LIBC_SRC_MATH_ROUNDEVEN_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| //===-- Implementation header for roundevenf --------------------*- C++ -*-===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #ifndef LLVM_LIBC_SRC_MATH_ROUNDEVENF_H | ||
| #define LLVM_LIBC_SRC_MATH_ROUNDEVENF_H | ||
|
|
||
| namespace LIBC_NAMESPACE { | ||
|
|
||
| float roundevenf(float x); | ||
|
|
||
| } // namespace LIBC_NAMESPACE | ||
|
|
||
| #endif // LLVM_LIBC_SRC_MATH_ROUNDEVENF_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| //===-- Implementation header for roundevenf128 -----------------*- C++ -*-===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #ifndef LLVM_LIBC_SRC_MATH_ROUNDEVENF128_H | ||
| #define LLVM_LIBC_SRC_MATH_ROUNDEVENF128_H | ||
|
|
||
| #include "src/__support/macros/properties/types.h" | ||
|
|
||
| namespace LIBC_NAMESPACE { | ||
|
|
||
| float128 roundevenf128(float128 x); | ||
|
|
||
| } // namespace LIBC_NAMESPACE | ||
|
|
||
| #endif // LLVM_LIBC_SRC_MATH_ROUNDEVENF128_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| //===-- Implementation header for roundevenl --------------------*- C++ -*-===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #ifndef LLVM_LIBC_SRC_MATH_ROUNDEVENL_H | ||
| #define LLVM_LIBC_SRC_MATH_ROUNDEVENL_H | ||
|
|
||
| namespace LIBC_NAMESPACE { | ||
|
|
||
| long double roundevenl(long double x); | ||
|
|
||
| } // namespace LIBC_NAMESPACE | ||
|
|
||
| #endif // LLVM_LIBC_SRC_MATH_ROUNDEVENL_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| //===-- Utility class to test roundeven[f|l] --------------------*- C++ -*-===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #ifndef LLVM_LIBC_TEST_SRC_MATH_ROUNDEVENTEST_H | ||
| #define LLVM_LIBC_TEST_SRC_MATH_ROUNDEVENTEST_H | ||
|
|
||
| #include "test/UnitTest/FPMatcher.h" | ||
| #include "test/UnitTest/Test.h" | ||
| #include "utils/MPFRWrapper/MPFRUtils.h" | ||
|
|
||
| #include "include/llvm-libc-macros/math-macros.h" | ||
|
|
||
| namespace mpfr = LIBC_NAMESPACE::testing::mpfr; | ||
|
|
||
| template <typename T> | ||
| class RoundEvenTest : public LIBC_NAMESPACE::testing::Test { | ||
|
|
||
| DECLARE_SPECIAL_CONSTANTS(T) | ||
|
|
||
| public: | ||
| typedef T (*RoundEvenFunc)(T); | ||
|
|
||
| void testSpecialNumbers(RoundEvenFunc func) { | ||
| EXPECT_FP_EQ(zero, func(zero)); | ||
| EXPECT_FP_EQ(neg_zero, func(neg_zero)); | ||
|
|
||
| EXPECT_FP_EQ(inf, func(inf)); | ||
| EXPECT_FP_EQ(neg_inf, func(neg_inf)); | ||
|
|
||
| EXPECT_FP_EQ(aNaN, func(aNaN)); | ||
| } | ||
|
|
||
| void testRoundedNumbers(RoundEvenFunc func) { | ||
| EXPECT_FP_EQ(T(1.0), func(T(1.0))); | ||
| EXPECT_FP_EQ(T(-1.0), func(T(-1.0))); | ||
| EXPECT_FP_EQ(T(10.0), func(T(10.0))); | ||
| EXPECT_FP_EQ(T(-10.0), func(T(-10.0))); | ||
| EXPECT_FP_EQ(T(1234.0), func(T(1234.0))); | ||
| EXPECT_FP_EQ(T(-1234.0), func(T(-1234.0))); | ||
| } | ||
|
|
||
| void testFractions(RoundEvenFunc func) { | ||
| EXPECT_FP_EQ(T(0.0), func(T(0.5))); | ||
| EXPECT_FP_EQ(T(-0.0), func(T(-0.5))); | ||
| EXPECT_FP_EQ(T(0.0), func(T(0.115))); | ||
| EXPECT_FP_EQ(T(-0.0), func(T(-0.115))); | ||
| EXPECT_FP_EQ(T(1.0), func(T(0.715))); | ||
| EXPECT_FP_EQ(T(-1.0), func(T(-0.715))); | ||
| EXPECT_FP_EQ(T(1.0), func(T(1.3))); | ||
| EXPECT_FP_EQ(T(-1.0), func(T(-1.3))); | ||
| EXPECT_FP_EQ(T(2.0), func(T(1.5))); | ||
| EXPECT_FP_EQ(T(-2.0), func(T(-1.5))); | ||
| EXPECT_FP_EQ(T(2.0), func(T(1.75))); | ||
| EXPECT_FP_EQ(T(-2.0), func(T(-1.75))); | ||
| EXPECT_FP_EQ(T(11.0), func(T(10.65))); | ||
| EXPECT_FP_EQ(T(-11.0), func(T(-10.65))); | ||
| EXPECT_FP_EQ(T(1233.0), func(T(1233.25))); | ||
| EXPECT_FP_EQ(T(1234.0), func(T(1233.50))); | ||
| EXPECT_FP_EQ(T(1234.0), func(T(1233.75))); | ||
| EXPECT_FP_EQ(T(-1233.0), func(T(-1233.25))); | ||
| EXPECT_FP_EQ(T(-1234.0), func(T(-1233.50))); | ||
| EXPECT_FP_EQ(T(-1234.0), func(T(-1233.75))); | ||
| EXPECT_FP_EQ(T(1234.0), func(T(1234.50))); | ||
| EXPECT_FP_EQ(T(-1234.0), func(T(-1234.50))); | ||
| } | ||
|
|
||
| void testRange(RoundEvenFunc func) { | ||
| constexpr StorageType COUNT = 100'000; | ||
| constexpr StorageType STEP = STORAGE_MAX / COUNT; | ||
| for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) { | ||
| T x = FPBits(v).get_val(); | ||
| if (isnan(x) || isinf(x)) | ||
| continue; | ||
|
|
||
| ASSERT_MPFR_MATCH(mpfr::Operation::RoundEven, x, func(x), 0.0); | ||
| } | ||
| } | ||
| }; | ||
|
|
||
| #define LIST_ROUNDEVEN_TESTS(T, func) \ | ||
| using LlvmLibcRoundEvenTest = RoundEvenTest<T>; \ | ||
| TEST_F(LlvmLibcRoundEvenTest, SpecialNumbers) { testSpecialNumbers(&func); } \ | ||
| TEST_F(LlvmLibcRoundEvenTest, RoundedNubmers) { testRoundedNumbers(&func); } \ | ||
| TEST_F(LlvmLibcRoundEvenTest, Fractions) { testFractions(&func); } \ | ||
| TEST_F(LlvmLibcRoundEvenTest, Range) { testRange(&func); } | ||
|
|
||
| #endif // LLVM_LIBC_TEST_SRC_MATH_ROUNDEVENTEST_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| //===-- Unittests for roundeven -------------------------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #include "RoundEvenTest.h" | ||
|
|
||
| #include "src/math/roundeven.h" | ||
|
|
||
| LIST_ROUNDEVEN_TESTS(double, LIBC_NAMESPACE::roundeven) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| //===-- Unittests for roundevenf ------------------------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #include "RoundEvenTest.h" | ||
|
|
||
| #include "src/math/roundevenf.h" | ||
|
|
||
| LIST_ROUNDEVEN_TESTS(float, LIBC_NAMESPACE::roundevenf) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| //===-- Unittests for roundevenl ------------------------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #include "RoundEvenTest.h" | ||
|
|
||
| #include "src/math/roundevenl.h" | ||
|
|
||
| LIST_ROUNDEVEN_TESTS(long double, LIBC_NAMESPACE::roundevenl) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,72 @@ | ||
| //===-- Utility class to test roundeven[f|l] --------------------*- C++ -*-===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #ifndef LLVM_LIBC_TEST_SRC_MATH_SMOKE_ROUNDEVENTEST_H | ||
| #define LLVM_LIBC_TEST_SRC_MATH_SMOKE_ROUNDEVENTEST_H | ||
|
|
||
| #include "test/UnitTest/FPMatcher.h" | ||
| #include "test/UnitTest/Test.h" | ||
|
|
||
| #include "include/llvm-libc-macros/math-macros.h" | ||
|
|
||
| template <typename T> | ||
| class RoundEvenTest : public LIBC_NAMESPACE::testing::Test { | ||
|
|
||
| DECLARE_SPECIAL_CONSTANTS(T) | ||
|
|
||
| public: | ||
| typedef T (*RoundEvenFunc)(T); | ||
|
|
||
| void testSpecialNumbers(RoundEvenFunc func) { | ||
| EXPECT_FP_EQ(zero, func(zero)); | ||
| EXPECT_FP_EQ(neg_zero, func(neg_zero)); | ||
|
|
||
| EXPECT_FP_EQ(inf, func(inf)); | ||
| EXPECT_FP_EQ(neg_inf, func(neg_inf)); | ||
|
|
||
| EXPECT_FP_EQ(aNaN, func(aNaN)); | ||
| } | ||
|
|
||
| void testRoundedNumbers(RoundEvenFunc func) { | ||
| EXPECT_FP_EQ(T(1.0), func(T(1.0))); | ||
| EXPECT_FP_EQ(T(-1.0), func(T(-1.0))); | ||
| EXPECT_FP_EQ(T(10.0), func(T(10.0))); | ||
| EXPECT_FP_EQ(T(-10.0), func(T(-10.0))); | ||
| EXPECT_FP_EQ(T(1234.0), func(T(1234.0))); | ||
| EXPECT_FP_EQ(T(-1234.0), func(T(-1234.0))); | ||
| } | ||
|
|
||
| void testFractions(RoundEvenFunc func) { | ||
| EXPECT_FP_EQ(T(0.0), func(T(0.5))); | ||
| EXPECT_FP_EQ(T(-0.0), func(T(-0.5))); | ||
| EXPECT_FP_EQ(T(0.0), func(T(0.115))); | ||
| EXPECT_FP_EQ(T(-0.0), func(T(-0.115))); | ||
| EXPECT_FP_EQ(T(1.0), func(T(0.715))); | ||
| EXPECT_FP_EQ(T(-1.0), func(T(-0.715))); | ||
| EXPECT_FP_EQ(T(2.0), func(T(1.5))); | ||
| EXPECT_FP_EQ(T(-2.0), func(T(-1.5))); | ||
| EXPECT_FP_EQ(T(2.0), func(T(1.75))); | ||
| EXPECT_FP_EQ(T(-2.0), func(T(-1.75))); | ||
| EXPECT_FP_EQ(T(10.0), func(T(10.50))); | ||
| EXPECT_FP_EQ(T(-10.0), func(T(-10.50))); | ||
| EXPECT_FP_EQ(T(11.0), func(T(10.65))); | ||
| EXPECT_FP_EQ(T(-11.0), func(T(-10.65))); | ||
| EXPECT_FP_EQ(T(1234.0), func(T(1234.50))); | ||
| EXPECT_FP_EQ(T(-1234.0), func(T(-1234.50))); | ||
| EXPECT_FP_EQ(T(1236.0), func(T(1235.50))); | ||
| EXPECT_FP_EQ(T(-1236.0), func(T(-1235.50))); | ||
| } | ||
| }; | ||
|
|
||
| #define LIST_ROUNDEVEN_TESTS(T, func) \ | ||
| using LlvmLibcRoundEvenTest = RoundEvenTest<T>; \ | ||
| TEST_F(LlvmLibcRoundEvenTest, SpecialNumbers) { testSpecialNumbers(&func); } \ | ||
| TEST_F(LlvmLibcRoundEvenTest, RoundedNubmers) { testRoundedNumbers(&func); } \ | ||
| TEST_F(LlvmLibcRoundEvenTest, Fractions) { testFractions(&func); } | ||
|
|
||
| #endif // LLVM_LIBC_TEST_SRC_MATH_SMOKE_ROUNDEVENTEST_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| //===-- Unittests for roundeven -------------------------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #include "RoundEvenTest.h" | ||
| #include "src/math/roundeven.h" | ||
|
|
||
| LIST_ROUNDEVEN_TESTS(double, LIBC_NAMESPACE::roundeven) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| //===-- Unittests for roundevenf128 ---------------------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #include "RoundEvenTest.h" | ||
| #include "src/math/roundevenf128.h" | ||
|
|
||
| LIST_ROUNDEVEN_TESTS(float128, LIBC_NAMESPACE::roundevenf128) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| //===-- Unittests for roundevenf ------------------------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #include "RoundEvenTest.h" | ||
| #include "src/math/roundevenf.h" | ||
|
|
||
| LIST_ROUNDEVEN_TESTS(float, LIBC_NAMESPACE::roundevenf) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| //===-- Unittests for roundevenf ------------------------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #include "RoundEvenTest.h" | ||
| #include "src/math/roundevenl.h" | ||
|
|
||
| LIST_ROUNDEVEN_TESTS(long double, LIBC_NAMESPACE::roundevenl) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -49,6 +49,7 @@ enum class Operation : int { | |
| ModPIOver2, | ||
| ModPIOver4, | ||
| Round, | ||
| RoundEven, | ||
| Sin, | ||
| Sinh, | ||
| Sqrt, | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,10 +1,5 @@ | ||
| add_subdirectory(Default) | ||
| if (CMAKE_SYSTEM_NAME MATCHES "Darwin") | ||
| add_subdirectory(DebugSymbols) | ||
| endif() | ||
| add_subdirectory(Debuginfod) |