[libc-commits] [libc] [libc][math][c23] Add MPFR unit tests for {rint, lrint, llrint, lround, llround}f16 (PR #94473)
via libc-commits
libc-commits at lists.llvm.org
Wed Jun 5 07:17:25 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libc
Author: OverMighty (overmighty)
<details>
<summary>Changes</summary>
---
Patch is 20.32 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/94473.diff
9 Files Affected:
- (modified) libc/test/src/math/CMakeLists.txt (+115-18)
- (modified) libc/test/src/math/RIntTest.h (+12-8)
- (modified) libc/test/src/math/RoundToIntegerTest.h (+20-9)
- (added) libc/test/src/math/llrintf16_test.cpp (+14)
- (added) libc/test/src/math/llroundf16_test.cpp (+13)
- (added) libc/test/src/math/lrintf16_test.cpp (+13)
- (added) libc/test/src/math/lroundf16_test.cpp (+13)
- (added) libc/test/src/math/rintf16_test.cpp (+13)
- (modified) libc/utils/MPFRWrapper/MPFRUtils.cpp (+50-4)
``````````diff
diff --git a/libc/test/src/math/CMakeLists.txt b/libc/test/src/math/CMakeLists.txt
index 102188c332e40..10da42ccf6a20 100644
--- a/libc/test/src/math/CMakeLists.txt
+++ b/libc/test/src/math/CMakeLists.txt
@@ -350,11 +350,11 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
+ libc.hdr.fenv_macros
libc.src.errno.errno
- libc.src.fenv.feclearexcept
- libc.src.fenv.feraiseexcept
- libc.src.fenv.fetestexcept
libc.src.math.lround
+ libc.src.__support.CPP.algorithm
+ libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -368,11 +368,11 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
+ libc.hdr.fenv_macros
libc.src.errno.errno
- libc.src.fenv.feclearexcept
- libc.src.fenv.feraiseexcept
- libc.src.fenv.fetestexcept
libc.src.math.lroundf
+ libc.src.__support.CPP.algorithm
+ libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -386,11 +386,29 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
+ libc.hdr.fenv_macros
libc.src.errno.errno
- libc.src.fenv.feclearexcept
- libc.src.fenv.feraiseexcept
- libc.src.fenv.fetestexcept
libc.src.math.lroundl
+ libc.src.__support.CPP.algorithm
+ libc.src.__support.FPUtil.fenv_impl
+ libc.src.__support.FPUtil.fp_bits
+)
+
+add_fp_unittest(
+ lroundf16_test
+ NEED_MPFR
+ SUITE
+ libc-math-unittests
+ SRCS
+ lroundf16_test.cpp
+ HDRS
+ RoundToIntegerTest.h
+ DEPENDS
+ libc.hdr.fenv_macros
+ libc.src.errno.errno
+ libc.src.math.lroundf16
+ libc.src.__support.CPP.algorithm
+ libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -404,11 +422,11 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
+ libc.hdr.fenv_macros
libc.src.errno.errno
- libc.src.fenv.feclearexcept
- libc.src.fenv.feraiseexcept
- libc.src.fenv.fetestexcept
libc.src.math.llround
+ libc.src.__support.CPP.algorithm
+ libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -422,11 +440,11 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
+ libc.hdr.fenv_macros
libc.src.errno.errno
- libc.src.fenv.feclearexcept
- libc.src.fenv.feraiseexcept
- libc.src.fenv.fetestexcept
libc.src.math.llroundf
+ libc.src.__support.CPP.algorithm
+ libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -440,11 +458,29 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
+ libc.hdr.fenv_macros
libc.src.errno.errno
- libc.src.fenv.feclearexcept
- libc.src.fenv.feraiseexcept
- libc.src.fenv.fetestexcept
libc.src.math.llroundl
+ libc.src.__support.CPP.algorithm
+ libc.src.__support.FPUtil.fenv_impl
+ libc.src.__support.FPUtil.fp_bits
+)
+
+add_fp_unittest(
+ llroundf16_test
+ NEED_MPFR
+ SUITE
+ libc-math-unittests
+ SRCS
+ llroundf16_test.cpp
+ HDRS
+ RoundToIntegerTest.h
+ DEPENDS
+ libc.hdr.fenv_macros
+ libc.src.errno.errno
+ libc.src.math.llroundf16
+ libc.src.__support.CPP.algorithm
+ libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -458,7 +494,9 @@ add_fp_unittest(
HDRS
RIntTest.h
DEPENDS
+ libc.hdr.fenv_macros
libc.src.math.rint
+ libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -473,7 +511,9 @@ add_fp_unittest(
HDRS
RIntTest.h
DEPENDS
+ libc.hdr.fenv_macros
libc.src.math.rintf
+ libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -488,7 +528,26 @@ add_fp_unittest(
HDRS
RIntTest.h
DEPENDS
+ libc.hdr.fenv_macros
libc.src.math.rintl
+ libc.src.__support.CPP.algorithm
+ libc.src.__support.FPUtil.fenv_impl
+ libc.src.__support.FPUtil.fp_bits
+)
+
+add_fp_unittest(
+ rintf16_test
+ NEED_MPFR
+ SUITE
+ libc-math-unittests
+ SRCS
+ rintf16_test.cpp
+ HDRS
+ RIntTest.h
+ DEPENDS
+ libc.hdr.fenv_macros
+ libc.src.math.rintf16
+ libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -504,6 +563,7 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.lrint
+ libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -519,6 +579,7 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.lrintf
+ libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -534,6 +595,23 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.lrintl
+ libc.src.__support.CPP.algorithm
+ libc.src.__support.FPUtil.fenv_impl
+ libc.src.__support.FPUtil.fp_bits
+)
+
+add_fp_unittest(
+ lrintf16_test
+ NEED_MPFR
+ SUITE
+ libc-math-unittests
+ SRCS
+ lrintf16_test.cpp
+ HDRS
+ RoundToIntegerTest.h
+ DEPENDS
+ libc.src.math.lrintf16
+ libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -549,6 +627,7 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.llrint
+ libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -564,6 +643,7 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.llrintf
+ libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
@@ -579,6 +659,23 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.llrintl
+ libc.src.__support.CPP.algorithm
+ libc.src.__support.FPUtil.fenv_impl
+ libc.src.__support.FPUtil.fp_bits
+)
+
+add_fp_unittest(
+ llrintf16_test
+ NEED_MPFR
+ SUITE
+ libc-math-unittests
+ SRCS
+ llrintf16_test.cpp
+ HDRS
+ RoundToIntegerTest.h
+ DEPENDS
+ libc.src.math.llrintf16
+ libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
diff --git a/libc/test/src/math/RIntTest.h b/libc/test/src/math/RIntTest.h
index 007b50427ba34..d31bf743f1a37 100644
--- a/libc/test/src/math/RIntTest.h
+++ b/libc/test/src/math/RIntTest.h
@@ -9,6 +9,7 @@
#ifndef LLVM_LIBC_TEST_SRC_MATH_RINTTEST_H
#define LLVM_LIBC_TEST_SRC_MATH_RINTTEST_H
+#include "src/__support/CPP/algorithm.h"
#include "src/__support/FPUtil/FEnvImpl.h"
#include "src/__support/FPUtil/FPBits.h"
#include "test/UnitTest/FEnvSafeTest.h"
@@ -18,7 +19,6 @@
#include "hdr/fenv_macros.h"
#include "hdr/math_macros.h"
-#include <stdio.h>
namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
@@ -101,8 +101,10 @@ class RIntTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
}
void testSubnormalRange(RIntFunc func) {
- constexpr StorageType COUNT = 100'001;
- constexpr StorageType STEP = (MAX_SUBNORMAL - MIN_SUBNORMAL) / COUNT;
+ constexpr int COUNT = 100'001;
+ constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max(
+ static_cast<StorageType>((MAX_SUBNORMAL - MIN_SUBNORMAL) / COUNT),
+ StorageType(1));
for (StorageType i = MIN_SUBNORMAL; i <= MAX_SUBNORMAL; i += STEP) {
T x = FPBits(i).get_val();
for (int mode : ROUNDING_MODES) {
@@ -114,15 +116,17 @@ class RIntTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
}
void testNormalRange(RIntFunc func) {
- constexpr StorageType COUNT = 100'001;
- constexpr StorageType STEP = (MAX_NORMAL - MIN_NORMAL) / COUNT;
+ constexpr int COUNT = 100'001;
+ constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max(
+ static_cast<StorageType>((MAX_NORMAL - MIN_NORMAL) / COUNT),
+ StorageType(1));
for (StorageType i = MIN_NORMAL; i <= MAX_NORMAL; i += STEP) {
- T x = FPBits(i).get_val();
+ FPBits xbits(i);
+ T x = xbits.get_val();
// In normal range on x86 platforms, the long double implicit 1 bit can be
// zero making the numbers NaN. We will skip them.
- if (isnan(x)) {
+ if (xbits.is_nan())
continue;
- }
for (int mode : ROUNDING_MODES) {
LIBC_NAMESPACE::fputil::set_round(mode);
diff --git a/libc/test/src/math/RoundToIntegerTest.h b/libc/test/src/math/RoundToIntegerTest.h
index d40e15080087c..bb7e8643973c3 100644
--- a/libc/test/src/math/RoundToIntegerTest.h
+++ b/libc/test/src/math/RoundToIntegerTest.h
@@ -9,6 +9,7 @@
#ifndef LLVM_LIBC_TEST_SRC_MATH_ROUNDTOINTEGERTEST_H
#define LLVM_LIBC_TEST_SRC_MATH_ROUNDTOINTEGERTEST_H
+#include "src/__support/CPP/algorithm.h"
#include "src/__support/FPUtil/FEnvImpl.h"
#include "src/__support/FPUtil/FPBits.h"
#include "test/UnitTest/FEnvSafeTest.h"
@@ -136,10 +137,13 @@ class RoundToIntegerTestTemplate
return;
constexpr int EXPONENT_LIMIT = sizeof(I) * 8 - 1;
+ constexpr int BIASED_EXPONENT_LIMIT = EXPONENT_LIMIT + FPBits::EXP_BIAS;
+ if (BIASED_EXPONENT_LIMIT > FPBits::MAX_BIASED_EXPONENT)
+ return;
// We start with 1.0 so that the implicit bit for x86 long doubles
// is set.
FPBits bits(F(1.0));
- bits.set_biased_exponent(EXPONENT_LIMIT + FPBits::EXP_BIAS);
+ bits.set_biased_exponent(BIASED_EXPONENT_LIMIT);
bits.set_sign(Sign::NEG);
bits.set_mantissa(0);
@@ -200,10 +204,13 @@ class RoundToIntegerTestTemplate
return;
constexpr int EXPONENT_LIMIT = sizeof(I) * 8 - 1;
+ constexpr int BIASED_EXPONENT_LIMIT = EXPONENT_LIMIT + FPBits::EXP_BIAS;
+ if (BIASED_EXPONENT_LIMIT > FPBits::MAX_BIASED_EXPONENT)
+ return;
// We start with 1.0 so that the implicit bit for x86 long doubles
// is set.
FPBits bits(F(1.0));
- bits.set_biased_exponent(EXPONENT_LIMIT + FPBits::EXP_BIAS);
+ bits.set_biased_exponent(BIASED_EXPONENT_LIMIT);
bits.set_sign(Sign::NEG);
bits.set_mantissa(FPBits::FRACTION_MASK);
@@ -226,8 +233,10 @@ class RoundToIntegerTestTemplate
}
void testSubnormalRange(RoundToIntegerFunc func) {
- constexpr StorageType COUNT = 1'000'001;
- constexpr StorageType STEP = (MAX_SUBNORMAL - MIN_SUBNORMAL) / COUNT;
+ constexpr int COUNT = 1'000'001;
+ constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max(
+ static_cast<StorageType>((MAX_SUBNORMAL - MIN_SUBNORMAL) / COUNT),
+ StorageType(1));
for (StorageType i = MIN_SUBNORMAL; i <= MAX_SUBNORMAL; i += STEP) {
F x = FPBits(i).get_val();
if (x == F(0.0))
@@ -268,15 +277,17 @@ class RoundToIntegerTestTemplate
if (sizeof(I) > sizeof(long))
return;
- constexpr StorageType COUNT = 1'000'001;
- constexpr StorageType STEP = (MAX_NORMAL - MIN_NORMAL) / COUNT;
+ constexpr int COUNT = 1'000'001;
+ constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max(
+ static_cast<StorageType>((MAX_NORMAL - MIN_NORMAL) / COUNT),
+ StorageType(1));
for (StorageType i = MIN_NORMAL; i <= MAX_NORMAL; i += STEP) {
- F x = FPBits(i).get_val();
+ FPBits xbits(i);
+ F x = xbits.get_val();
// In normal range on x86 platforms, the long double implicit 1 bit can be
// zero making the numbers NaN. We will skip them.
- if (isnan(x)) {
+ if (xbits.is_nan())
continue;
- }
if (TestModes) {
for (int m : ROUNDING_MODES) {
diff --git a/libc/test/src/math/llrintf16_test.cpp b/libc/test/src/math/llrintf16_test.cpp
new file mode 100644
index 0000000000000..d16bd8f38b052
--- /dev/null
+++ b/libc/test/src/math/llrintf16_test.cpp
@@ -0,0 +1,14 @@
+//===-- Unittests for llrintf16 -------------------------------------------===//
+//
+// 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 "RoundToIntegerTest.h"
+
+#include "src/math/llrintf16.h"
+
+LIST_ROUND_TO_INTEGER_TESTS_WITH_MODES(float16, long long,
+ LIBC_NAMESPACE::llrintf16)
diff --git a/libc/test/src/math/llroundf16_test.cpp b/libc/test/src/math/llroundf16_test.cpp
new file mode 100644
index 0000000000000..9342b24fd5d04
--- /dev/null
+++ b/libc/test/src/math/llroundf16_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for llroundf16 ------------------------------------------===//
+//
+// 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 "RoundToIntegerTest.h"
+
+#include "src/math/llroundf16.h"
+
+LIST_ROUND_TO_INTEGER_TESTS(float16, long long, LIBC_NAMESPACE::llroundf16)
diff --git a/libc/test/src/math/lrintf16_test.cpp b/libc/test/src/math/lrintf16_test.cpp
new file mode 100644
index 0000000000000..28b1a1cb888d7
--- /dev/null
+++ b/libc/test/src/math/lrintf16_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for lrintf16 --------------------------------------------===//
+//
+// 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 "RoundToIntegerTest.h"
+
+#include "src/math/lrintf16.h"
+
+LIST_ROUND_TO_INTEGER_TESTS_WITH_MODES(float16, long, LIBC_NAMESPACE::lrintf16)
diff --git a/libc/test/src/math/lroundf16_test.cpp b/libc/test/src/math/lroundf16_test.cpp
new file mode 100644
index 0000000000000..3077134d58f91
--- /dev/null
+++ b/libc/test/src/math/lroundf16_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for lroundf16 -------------------------------------------===//
+//
+// 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 "RoundToIntegerTest.h"
+
+#include "src/math/lroundf16.h"
+
+LIST_ROUND_TO_INTEGER_TESTS(float16, long, LIBC_NAMESPACE::lroundf16)
diff --git a/libc/test/src/math/rintf16_test.cpp b/libc/test/src/math/rintf16_test.cpp
new file mode 100644
index 0000000000000..2adf2560bae1f
--- /dev/null
+++ b/libc/test/src/math/rintf16_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for rintf16 ---------------------------------------------===//
+//
+// 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 "RIntTest.h"
+
+#include "src/math/rintf16.h"
+
+LIST_RINT_TESTS(float16, LIBC_NAMESPACE::rintf16)
diff --git a/libc/utils/MPFRWrapper/MPFRUtils.cpp b/libc/utils/MPFRWrapper/MPFRUtils.cpp
index 18a8ac044a9bb..a0cdf79e29355 100644
--- a/libc/utils/MPFRWrapper/MPFRUtils.cpp
+++ b/libc/utils/MPFRWrapper/MPFRUtils.cpp
@@ -12,6 +12,7 @@
#include "src/__support/CPP/string_view.h"
#include "src/__support/FPUtil/FPBits.h"
#include "src/__support/FPUtil/fpbits_str.h"
+#include "src/__support/macros/properties/types.h"
#include "test/UnitTest/FPMatcher.h"
#include "hdr/math_macros.h"
@@ -30,6 +31,12 @@ namespace mpfr {
// precision compared to the floating point precision.
template <typename T> struct ExtraPrecision;
+#ifdef LIBC_TYPES_HAS_FLOAT16
+template <> struct ExtraPrecision<float16> {
+ static constexpr unsigned int VALUE = 128;
+};
+#endif
+
template <> struct ExtraPrecision<float> {
static constexpr unsigned int VALUE = 128;
};
@@ -85,9 +92,16 @@ class MPFRNumber {
// We use explicit EnableIf specializations to disallow implicit
// conversions. Implicit conversions can potentially lead to loss of
- // precision.
+ // precision. We exceptionally allow implicit conversions from float16
+ // to float, as the MPFR API does not support float16, thus requiring
+ // conversion to a higher-precision format.
template <typename XType,
- cpp::enable_if_t<cpp::is_same_v<float, XType>, int> = 0>
+ cpp::enable_if_t<cpp::is_same_v<float, XType>
+#ifdef LIBC_TYPES_HAS_FLOAT16
+ || cpp::is_same_v<float16, XType>
+#endif
+ ,
+ int> = 0>
explicit MPFRNumber(XType x,
unsigned int precision = ExtraPrecision<XType>::VALUE,
RoundingMode rounding = RoundingMode::Nearest)
@@ -529,8 +543,14 @@ class MPFRNumber {
// If the control reaches here, it means that this number and input are
// of the same sign but different exponent. In such a case, ULP error is
// calculated as sum of two parts.
- thisAsT = std::abs(thisAsT);
- input = std::abs(input);
+#ifdef LIBC_TYPES_HAS_FLOAT16
+ // TODO: This will no longer be needed once std::abs supports float16.
+ using U = cpp::conditional_t<cpp::is_same_v<T, float16>, float, T>;
+#else
+ using U = T;
+#endif
+ thisAsT = std::abs(static_cast<U>(thisAsT));
+ input = std::abs(static_cast<U>(input));
T min = thisAsT > input ? input : thisAsT;
T max = thisAsT > input ? thisAsT : input;
int minExponent = FPBits<T>(min).get_exponent();
@@ -585,6 +605,14 @@ template <> long double MPFRNumber::as<long double>() const {
return mpfr_get_ld(value, mpfr_rounding);
}
+#ifdef LIBC_TYPES_HAS_FLOAT16
+template <> float16 MPFRNumber::as<float16>() const {
+ // TODO: Either prove that this cast won't cause double-rounding errors, or
+ // find a better way to get a float16.
+ return static_cast<float16>(mpfr_get_d(value, mpfr_rounding));
+}
+#endif
+
namespace internal {
template <typename InputType>
@@ -763,6 +791,10 @@ template void explain_unary_operation_single_output_error<double>(
Operation op, double, double, double, RoundingMode);
template void explain_unary_operation_single_output_error<long double>(
Operation op, long double, long double, double, RoundingMode);
+#ifdef LIBC_TYPES_HAS_FLOAT16
+template void explain_unary_operation_single_output_error<float16>(
+ Operation op, float16, float16, double, RoundingMode);
+#endif
template <typename T>
void explain_unary_operation_two_outputs_error(
@@ -942,6 +974,11 @@ template bool compare_unary_operation_single_output<double>(Operation, double,
RoundingMode);
template bool compare_unary_operation_single_output<long double>(
Operation, long double, long double, double, RoundingMode);
+#ifdef LIBC_TYPES_HAS_FLOAT16
+template bool compare_unary_operation_single_output<float16>(Operation, float16,
+ float16, double,
+ RoundingMode);
+#endif
template <typename T>
bool compare_unary_operation_two_outputs(Operation op, T input,
@@ -1054,6 +1091,9 @@ template <typename T> bool round_to_long(T x, long &result) {
template bool round_to_long<float>(float, long &);
template bool round_to_long<double>(double, long &);
template bool round_to_long<long double>(long double, long &);
+#ifdef LIBC_TYPES_HAS_FLOAT16
+template bool round_to_long<float16>(float16, long &);
+#endif
template <typename T> bool round_to_long(T x, RoundingMode mode, long &result) {
MPFRNumber mpfr(x);
@@ -1063,6 +1103,9 @@ template <typename T> bool round_to_long(T x, RoundingMode mode, long &result) {
template bool round_to_long<float>(float, RoundingMode, long &);
template bool round_to_long<double>(double, RoundingMode, long &);
template bool round_to_long<long double>(long double, RoundingMode, long &);
+#ifdef LIBC_TYPES_HAS_FLOAT16
+template bool round_to_long<float16>(float16, RoundingMode, long &);
+#endif
template <typename T> T round(T x, RoundingMode mode) {
MPFRNumber mpfr(x);
@@ -1073,6 +1116,9 @@ template <typename T> T round(T x, RoundingMode...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/94473
More information about the libc-commits
mailing list