From 8a9ca87fda767b0463be195665690208a1f26377 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Tue, 8 Jul 2025 02:56:22 +0300 Subject: [PATCH 1/9] [libc][math] Refactor expf16 implementation to header-only in src/__support/math folder. --- libc/shared/math.h | 1 + libc/shared/math/expf16.h | 23 ++++ libc/src/__support/math/CMakeLists.txt | 28 +++++ .../__support/math/exp_float16_constants.h | 38 ++++++ libc/src/__support/math/expf16.h | 116 ++++++++++++++++++ libc/src/math/generic/CMakeLists.txt | 14 +-- libc/src/math/generic/expf16.cpp | 115 +---------------- .../llvm-project-overlay/libc/BUILD.bazel | 29 +++++ 8 files changed, 239 insertions(+), 125 deletions(-) create mode 100644 libc/shared/math/expf16.h create mode 100644 libc/src/__support/math/exp_float16_constants.h create mode 100644 libc/src/__support/math/expf16.h diff --git a/libc/shared/math.h b/libc/shared/math.h index 4ddc29c7ae834..9db53b69041d0 100644 --- a/libc/shared/math.h +++ b/libc/shared/math.h @@ -12,5 +12,6 @@ #include "libc_common.h" #include "math/expf.h" +#include "math/expf16.h" #endif // LLVM_LIBC_SHARED_MATH_H diff --git a/libc/shared/math/expf16.h b/libc/shared/math/expf16.h new file mode 100644 index 0000000000000..4e6ab78b26467 --- /dev/null +++ b/libc/shared/math/expf16.h @@ -0,0 +1,23 @@ +//===-- Shared expf16 function ----------------------------------*- 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_SHARED_MATH_EXPF16_H +#define LLVM_LIBC_SHARED_MATH_EXPF16_H + +#include "shared/libc_common.h" +#include "src/__support/math/expf16.h" + +namespace LIBC_NAMESPACE_DECL { +namespace shared { + +using math::expf16; + +} // namespace shared +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SHARED_MATH_EXPF16_H diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt index 66c1d19a1cab0..6d4d548f2e48f 100644 --- a/libc/src/__support/math/CMakeLists.txt +++ b/libc/src/__support/math/CMakeLists.txt @@ -22,3 +22,31 @@ add_header_library( libc.src.__support.macros.config libc.src.__support.macros.optimization ) + +add_header_library( + exp_float16_constants + HDRS + exp_float16_constants.h + DEPENDS + libc.src.__support.FPUtil.except_value_utils +) + +add_header_library( + expf16 + HDRS + expf16.h + DEPENDS + .expxf16 + libc.hdr.errno_macros + libc.hdr.fenv_macros + libc.src.__support.CPP.array + libc.src.__support.FPUtil.cast + libc.src.__support.FPUtil.except_value_utils + libc.src.__support.FPUtil.fenv_impl + libc.src.__support.FPUtil.fp_bits + libc.src.__support.FPUtil.multiply_add + libc.src.__support.FPUtil.nearest_integer + libc.src.__support.FPUtil.polyeval + libc.src.__support.FPUtil.rounding_mode + libc.src.__support.macros.optimization +) diff --git a/libc/src/__support/math/exp_float16_constants.h b/libc/src/__support/math/exp_float16_constants.h new file mode 100644 index 0000000000000..9c3aa05e9551c --- /dev/null +++ b/libc/src/__support/math/exp_float16_constants.h @@ -0,0 +1,38 @@ +//===-- High and Low Excepts for expf16 functions ---------------*- 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___SUPPORT_MATH_EXP_FLOAT16_CONSTANTS_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_EXP_FLOAT16_CONSTANTS_H + +#include "src/__support/FPUtil/except_value_utils.h" + +namespace LIBC_NAMESPACE_DECL { + +#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS +static constexpr fputil::ExceptValues EXPF16_EXCEPTS_LO = {{ + // (input, RZ output, RU offset, RD offset, RN offset) + // x = 0x1.de4p-8, expf16(x) = 0x1.01cp+0 (RZ) + {0x1f79U, 0x3c07U, 1U, 0U, 0U}, + // x = 0x1.73cp-6, expf16(x) = 0x1.05cp+0 (RZ) + {0x25cfU, 0x3c17U, 1U, 0U, 0U}, +}}; + +static constexpr fputil::ExceptValues EXPF16_EXCEPTS_HI = {{ + // (input, RZ output, RU offset, RD offset, RN offset) + // x = 0x1.c34p+0, expf16(x) = 0x1.74cp+2 (RZ) + {0x3f0dU, 0x45d3U, 1U, 0U, 1U}, + // x = -0x1.488p-5, expf16(x) = 0x1.ebcp-1 (RZ) + {0xa922U, 0x3bafU, 1U, 0U, 0U}, + // x = -0x1.55p-5, expf16(x) = 0x1.ebp-1 (RZ) + {0xa954U, 0x3bacU, 1U, 0U, 0U}, +}}; +#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXP_FLOAT16_CONSTANTS_H diff --git a/libc/src/__support/math/expf16.h b/libc/src/__support/math/expf16.h new file mode 100644 index 0000000000000..29a8e44d373f5 --- /dev/null +++ b/libc/src/__support/math/expf16.h @@ -0,0 +1,116 @@ +//===-- Implementation header for expf16 ------------------------*- 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___SUPPORT_MATH_EXPF16_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_H + +#include "exp_float16_constants.h" + +#include "hdr/errno_macros.h" +#include "src/math/generic/expxf16.h" +#include "hdr/fenv_macros.h" +#include "src/__support/common.h" +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/PolyEval.h" +#include "src/__support/FPUtil/cast.h" +#include "src/__support/FPUtil/rounding_mode.h" +#include "src/__support/macros/optimization.h" +#include "src/__support/macros/config.h" +#include "src/__support/FPUtil/except_value_utils.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace math { + +static constexpr float16 expf16(float16 x) { + using FPBits = fputil::FPBits; + FPBits x_bits(x); + + uint16_t x_u = x_bits.uintval(); + uint16_t x_abs = x_u & 0x7fffU; + + // When 0 < |x| <= 2^(-5), or |x| >= 12, or x is NaN. + if (LIBC_UNLIKELY(x_abs <= 0x2800U || x_abs >= 0x4a00U)) { + // exp(NaN) = NaN + if (x_bits.is_nan()) { + if (x_bits.is_signaling_nan()) { + fputil::raise_except_if_required(FE_INVALID); + return FPBits::quiet_nan().get_val(); + } + + return x; + } + + // When x >= 12. + if (x_bits.is_pos() && x_abs >= 0x4a00U) { + // exp(+inf) = +inf + if (x_bits.is_inf()) + return FPBits::inf().get_val(); + + switch (fputil::quick_get_round()) { + case FE_TONEAREST: + case FE_UPWARD: + fputil::set_errno_if_required(ERANGE); + fputil::raise_except_if_required(FE_OVERFLOW); + return FPBits::inf().get_val(); + default: + return FPBits::max_normal().get_val(); + } + } + + // When x <= -18. + if (x_u >= 0xcc80U) { + // exp(-inf) = +0 + if (x_bits.is_inf()) + return FPBits::zero().get_val(); + + fputil::set_errno_if_required(ERANGE); + fputil::raise_except_if_required(FE_UNDERFLOW | FE_INEXACT); + + switch (fputil::quick_get_round()) { + case FE_UPWARD: + return FPBits::min_subnormal().get_val(); + default: + return FPBits::zero().get_val(); + } + } + + // When 0 < |x| <= 2^(-5). + if (x_abs <= 0x2800U && !x_bits.is_zero()) { +#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS + if (auto r = EXPF16_EXCEPTS_LO.lookup(x_u); LIBC_UNLIKELY(r.has_value())) + return r.value(); +#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS + + float xf = x; + // Degree-3 minimax polynomial generated by Sollya with the following + // commands: + // > display = hexadecimal; + // > P = fpminimax(expm1(x)/x, 2, [|SG...|], [-2^-5, 2^-5]); + // > 1 + x * P; + return fputil::cast( + fputil::polyeval(xf, 0x1p+0f, 0x1p+0f, 0x1.0004p-1f, 0x1.555778p-3f)); + } + } + +#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS + if (auto r = EXPF16_EXCEPTS_HI.lookup(x_u); LIBC_UNLIKELY(r.has_value())) + return r.value(); +#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS + + // exp(x) = exp(hi + mid) * exp(lo) + auto [exp_hi_mid, exp_lo] = exp_range_reduction(x); + return fputil::cast(exp_hi_mid * exp_lo); +} + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_H diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index fd1e6c0d648aa..8d15c2879a8bf 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -1332,19 +1332,7 @@ add_entrypoint_object( HDRS ../expf16.h DEPENDS - .expxf16 - libc.hdr.errno_macros - libc.hdr.fenv_macros - libc.src.__support.CPP.array - libc.src.__support.FPUtil.cast - libc.src.__support.FPUtil.except_value_utils - libc.src.__support.FPUtil.fenv_impl - libc.src.__support.FPUtil.fp_bits - libc.src.__support.FPUtil.multiply_add - libc.src.__support.FPUtil.nearest_integer - libc.src.__support.FPUtil.polyeval - libc.src.__support.FPUtil.rounding_mode - libc.src.__support.macros.optimization + libc.src.__support.math.expf ) add_entrypoint_object( diff --git a/libc/src/math/generic/expf16.cpp b/libc/src/math/generic/expf16.cpp index 1af9b3ec9ad6e..ad213e237f021 100644 --- a/libc/src/math/generic/expf16.cpp +++ b/libc/src/math/generic/expf16.cpp @@ -7,120 +7,11 @@ //===----------------------------------------------------------------------===// #include "src/math/expf16.h" -#include "expxf16.h" -#include "hdr/errno_macros.h" -#include "hdr/fenv_macros.h" -#include "src/__support/FPUtil/FEnvImpl.h" -#include "src/__support/FPUtil/FPBits.h" -#include "src/__support/FPUtil/PolyEval.h" -#include "src/__support/FPUtil/cast.h" -#include "src/__support/FPUtil/except_value_utils.h" -#include "src/__support/FPUtil/rounding_mode.h" -#include "src/__support/common.h" -#include "src/__support/macros/config.h" -#include "src/__support/macros/optimization.h" -namespace LIBC_NAMESPACE_DECL { - -#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS -static constexpr fputil::ExceptValues EXPF16_EXCEPTS_LO = {{ - // (input, RZ output, RU offset, RD offset, RN offset) - // x = 0x1.de4p-8, expf16(x) = 0x1.01cp+0 (RZ) - {0x1f79U, 0x3c07U, 1U, 0U, 0U}, - // x = 0x1.73cp-6, expf16(x) = 0x1.05cp+0 (RZ) - {0x25cfU, 0x3c17U, 1U, 0U, 0U}, -}}; - -static constexpr fputil::ExceptValues EXPF16_EXCEPTS_HI = {{ - // (input, RZ output, RU offset, RD offset, RN offset) - // x = 0x1.c34p+0, expf16(x) = 0x1.74cp+2 (RZ) - {0x3f0dU, 0x45d3U, 1U, 0U, 1U}, - // x = -0x1.488p-5, expf16(x) = 0x1.ebcp-1 (RZ) - {0xa922U, 0x3bafU, 1U, 0U, 0U}, - // x = -0x1.55p-5, expf16(x) = 0x1.ebp-1 (RZ) - {0xa954U, 0x3bacU, 1U, 0U, 0U}, -}}; -#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS - -LLVM_LIBC_FUNCTION(float16, expf16, (float16 x)) { - using FPBits = fputil::FPBits; - FPBits x_bits(x); - - uint16_t x_u = x_bits.uintval(); - uint16_t x_abs = x_u & 0x7fffU; - - // When 0 < |x| <= 2^(-5), or |x| >= 12, or x is NaN. - if (LIBC_UNLIKELY(x_abs <= 0x2800U || x_abs >= 0x4a00U)) { - // exp(NaN) = NaN - if (x_bits.is_nan()) { - if (x_bits.is_signaling_nan()) { - fputil::raise_except_if_required(FE_INVALID); - return FPBits::quiet_nan().get_val(); - } - - return x; - } - - // When x >= 12. - if (x_bits.is_pos() && x_abs >= 0x4a00U) { - // exp(+inf) = +inf - if (x_bits.is_inf()) - return FPBits::inf().get_val(); +#include "src/__support/math/expf16.h" - switch (fputil::quick_get_round()) { - case FE_TONEAREST: - case FE_UPWARD: - fputil::set_errno_if_required(ERANGE); - fputil::raise_except_if_required(FE_OVERFLOW); - return FPBits::inf().get_val(); - default: - return FPBits::max_normal().get_val(); - } - } - - // When x <= -18. - if (x_u >= 0xcc80U) { - // exp(-inf) = +0 - if (x_bits.is_inf()) - return FPBits::zero().get_val(); - - fputil::set_errno_if_required(ERANGE); - fputil::raise_except_if_required(FE_UNDERFLOW | FE_INEXACT); - - switch (fputil::quick_get_round()) { - case FE_UPWARD: - return FPBits::min_subnormal().get_val(); - default: - return FPBits::zero().get_val(); - } - } - - // When 0 < |x| <= 2^(-5). - if (x_abs <= 0x2800U && !x_bits.is_zero()) { -#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS - if (auto r = EXPF16_EXCEPTS_LO.lookup(x_u); LIBC_UNLIKELY(r.has_value())) - return r.value(); -#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS - - float xf = x; - // Degree-3 minimax polynomial generated by Sollya with the following - // commands: - // > display = hexadecimal; - // > P = fpminimax(expm1(x)/x, 2, [|SG...|], [-2^-5, 2^-5]); - // > 1 + x * P; - return fputil::cast( - fputil::polyeval(xf, 0x1p+0f, 0x1p+0f, 0x1.0004p-1f, 0x1.555778p-3f)); - } - } - -#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS - if (auto r = EXPF16_EXCEPTS_HI.lookup(x_u); LIBC_UNLIKELY(r.has_value())) - return r.value(); -#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS +namespace LIBC_NAMESPACE_DECL { - // exp(x) = exp(hi + mid) * exp(lo) - auto [exp_hi_mid, exp_lo] = exp_range_reduction(x); - return fputil::cast(exp_hi_mid * exp_lo); -} +LLVM_LIBC_FUNCTION(float16, expf16, (float16 x)) { return math::expf16(x); } } // namespace LIBC_NAMESPACE_DECL diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel index 2484a2f1e2bd7..efba1eb640eb8 100644 --- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel @@ -2096,6 +2096,34 @@ libc_support_library( ], ) +libc_support_library( + name = "__support_math_exp_float16_constants", + hdrs = ["src/__support/math/exp_float16_constants.h"], + deps = [ + ":__support_FPUtil_except_value_utils" + ], +) + +libc_support_library( + name = "__support_math_expf16", + hdrs = ["src/__support/math/expf16.h"], + deps = [ + ":__support_common", + ":hdr_errno_macros", + ":hdr_fenv_macros", + ":__support_cpp_array", + ":__support_fputil_cast", + ":__support_fputil_except_value_utils", + ":__support_fputil_fenv_impl", + ":__support_fputil_fp_bits", + ":__support_fputil_multiply_add", + ":__support_fputil_nearest_integer", + ":__support_fputil_polyeval", + ":__support_fputil_rounding_mode", + ":__support_macros_optimization", + ], +) + ############################### complex targets ################################ libc_function( @@ -2701,6 +2729,7 @@ libc_math_function( libc_math_function( name = "expf16", additional_deps = [ + ":__support_math_expf16", ":expxf16", ], ) From b22f973fbd649092b582649b684ed791a8464e39 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Tue, 8 Jul 2025 03:11:39 +0300 Subject: [PATCH 2/9] fix code style --- libc/src/__support/math/expf16.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libc/src/__support/math/expf16.h b/libc/src/__support/math/expf16.h index 29a8e44d373f5..7fd8ce0173f59 100644 --- a/libc/src/__support/math/expf16.h +++ b/libc/src/__support/math/expf16.h @@ -12,24 +12,24 @@ #include "exp_float16_constants.h" #include "hdr/errno_macros.h" -#include "src/math/generic/expxf16.h" #include "hdr/fenv_macros.h" -#include "src/__support/common.h" #include "src/__support/FPUtil/FEnvImpl.h" #include "src/__support/FPUtil/FPBits.h" #include "src/__support/FPUtil/PolyEval.h" #include "src/__support/FPUtil/cast.h" +#include "src/__support/FPUtil/except_value_utils.h" #include "src/__support/FPUtil/rounding_mode.h" -#include "src/__support/macros/optimization.h" +#include "src/__support/common.h" #include "src/__support/macros/config.h" -#include "src/__support/FPUtil/except_value_utils.h" +#include "src/__support/macros/optimization.h" +#include "src/math/generic/expxf16.h" namespace LIBC_NAMESPACE_DECL { namespace math { static constexpr float16 expf16(float16 x) { - using FPBits = fputil::FPBits; + using FPBits = fputil::FPBits; FPBits x_bits(x); uint16_t x_u = x_bits.uintval(); From d48dbb5aeeb43ab36ffbc8a0ae22a4a3d8b7f933 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Tue, 8 Jul 2025 05:00:58 +0300 Subject: [PATCH 3/9] fix dependency --- libc/src/math/generic/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 8d15c2879a8bf..884d29c90fe72 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -1332,7 +1332,7 @@ add_entrypoint_object( HDRS ../expf16.h DEPENDS - libc.src.__support.math.expf + libc.src.__support.math.expf16 ) add_entrypoint_object( From 8437b69e453db2facd0f850cf2bc678df4596952 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Tue, 8 Jul 2025 19:09:42 +0300 Subject: [PATCH 4/9] Remove `expf16_constants.h` --- libc/src/__support/math/CMakeLists.txt | 8 ---- .../__support/math/exp_float16_constants.h | 38 ------------------- libc/src/__support/math/expf16.h | 24 ++++++++++-- .../llvm-project-overlay/libc/BUILD.bazel | 8 ---- 4 files changed, 21 insertions(+), 57 deletions(-) delete mode 100644 libc/src/__support/math/exp_float16_constants.h diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt index 6d4d548f2e48f..a26782b6867c7 100644 --- a/libc/src/__support/math/CMakeLists.txt +++ b/libc/src/__support/math/CMakeLists.txt @@ -23,14 +23,6 @@ add_header_library( libc.src.__support.macros.optimization ) -add_header_library( - exp_float16_constants - HDRS - exp_float16_constants.h - DEPENDS - libc.src.__support.FPUtil.except_value_utils -) - add_header_library( expf16 HDRS diff --git a/libc/src/__support/math/exp_float16_constants.h b/libc/src/__support/math/exp_float16_constants.h deleted file mode 100644 index 9c3aa05e9551c..0000000000000 --- a/libc/src/__support/math/exp_float16_constants.h +++ /dev/null @@ -1,38 +0,0 @@ -//===-- High and Low Excepts for expf16 functions ---------------*- 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___SUPPORT_MATH_EXP_FLOAT16_CONSTANTS_H -#define LLVM_LIBC_SRC___SUPPORT_MATH_EXP_FLOAT16_CONSTANTS_H - -#include "src/__support/FPUtil/except_value_utils.h" - -namespace LIBC_NAMESPACE_DECL { - -#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS -static constexpr fputil::ExceptValues EXPF16_EXCEPTS_LO = {{ - // (input, RZ output, RU offset, RD offset, RN offset) - // x = 0x1.de4p-8, expf16(x) = 0x1.01cp+0 (RZ) - {0x1f79U, 0x3c07U, 1U, 0U, 0U}, - // x = 0x1.73cp-6, expf16(x) = 0x1.05cp+0 (RZ) - {0x25cfU, 0x3c17U, 1U, 0U, 0U}, -}}; - -static constexpr fputil::ExceptValues EXPF16_EXCEPTS_HI = {{ - // (input, RZ output, RU offset, RD offset, RN offset) - // x = 0x1.c34p+0, expf16(x) = 0x1.74cp+2 (RZ) - {0x3f0dU, 0x45d3U, 1U, 0U, 1U}, - // x = -0x1.488p-5, expf16(x) = 0x1.ebcp-1 (RZ) - {0xa922U, 0x3bafU, 1U, 0U, 0U}, - // x = -0x1.55p-5, expf16(x) = 0x1.ebp-1 (RZ) - {0xa954U, 0x3bacU, 1U, 0U, 0U}, -}}; -#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS - -} // namespace LIBC_NAMESPACE_DECL - -#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXP_FLOAT16_CONSTANTS_H diff --git a/libc/src/__support/math/expf16.h b/libc/src/__support/math/expf16.h index 7fd8ce0173f59..37ada30e1ae0a 100644 --- a/libc/src/__support/math/expf16.h +++ b/libc/src/__support/math/expf16.h @@ -9,8 +9,6 @@ #ifndef LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_H #define LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_H -#include "exp_float16_constants.h" - #include "hdr/errno_macros.h" #include "hdr/fenv_macros.h" #include "src/__support/FPUtil/FEnvImpl.h" @@ -28,7 +26,27 @@ namespace LIBC_NAMESPACE_DECL { namespace math { -static constexpr float16 expf16(float16 x) { +LIBC_INLINE static constexpr float16 expf16(float16 x) { +#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS + constexpr fputil::ExceptValues EXPF16_EXCEPTS_LO = {{ + // (input, RZ output, RU offset, RD offset, RN offset) + // x = 0x1.de4p-8, expf16(x) = 0x1.01cp+0 (RZ) + {0x1f79U, 0x3c07U, 1U, 0U, 0U}, + // x = 0x1.73cp-6, expf16(x) = 0x1.05cp+0 (RZ) + {0x25cfU, 0x3c17U, 1U, 0U, 0U}, + }}; + + constexpr fputil::ExceptValues EXPF16_EXCEPTS_HI = {{ + // (input, RZ output, RU offset, RD offset, RN offset) + // x = 0x1.c34p+0, expf16(x) = 0x1.74cp+2 (RZ) + {0x3f0dU, 0x45d3U, 1U, 0U, 1U}, + // x = -0x1.488p-5, expf16(x) = 0x1.ebcp-1 (RZ) + {0xa922U, 0x3bafU, 1U, 0U, 0U}, + // x = -0x1.55p-5, expf16(x) = 0x1.ebp-1 (RZ) + {0xa954U, 0x3bacU, 1U, 0U, 0U}, + }}; +#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS + using FPBits = fputil::FPBits; FPBits x_bits(x); diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel index efba1eb640eb8..01fa6107ebf07 100644 --- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel @@ -2096,14 +2096,6 @@ libc_support_library( ], ) -libc_support_library( - name = "__support_math_exp_float16_constants", - hdrs = ["src/__support/math/exp_float16_constants.h"], - deps = [ - ":__support_FPUtil_except_value_utils" - ], -) - libc_support_library( name = "__support_math_expf16", hdrs = ["src/__support/math/expf16.h"], From 87159aec4eee2587d583abc5421afbb935a00346 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Tue, 8 Jul 2025 19:19:49 +0300 Subject: [PATCH 5/9] remove `LIBC_INLINE` --- libc/src/__support/math/expf16.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libc/src/__support/math/expf16.h b/libc/src/__support/math/expf16.h index 37ada30e1ae0a..6df5f6bb790e9 100644 --- a/libc/src/__support/math/expf16.h +++ b/libc/src/__support/math/expf16.h @@ -26,7 +26,7 @@ namespace LIBC_NAMESPACE_DECL { namespace math { -LIBC_INLINE static constexpr float16 expf16(float16 x) { +static constexpr float16 expf16(float16 x) { #ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS constexpr fputil::ExceptValues EXPF16_EXCEPTS_LO = {{ // (input, RZ output, RU offset, RD offset, RN offset) From 858a29c696face099e568b61feb9aaef1418829d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Wed, 9 Jul 2025 22:44:42 +0300 Subject: [PATCH 6/9] apply requested changes --- libc/shared/math/expf16.h | 7 +++++++ libc/src/__support/math/expf16.h | 8 ++++++++ libc/src/math/generic/CMakeLists.txt | 1 + utils/bazel/llvm-project-overlay/libc/BUILD.bazel | 3 +-- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/libc/shared/math/expf16.h b/libc/shared/math/expf16.h index 4e6ab78b26467..15b9045616a70 100644 --- a/libc/shared/math/expf16.h +++ b/libc/shared/math/expf16.h @@ -11,6 +11,11 @@ #include "shared/libc_common.h" #include "src/__support/math/expf16.h" +#include "include/llvm-libc-macros/float16-macros.h" + +#ifndef LIBC_TYPES_HAS_FLOAT16 +#error unsupported +#else namespace LIBC_NAMESPACE_DECL { namespace shared { @@ -20,4 +25,6 @@ using math::expf16; } // namespace shared } // namespace LIBC_NAMESPACE_DECL +#endif // LIBC_TYPES_HAS_FLOAT16 + #endif // LLVM_LIBC_SHARED_MATH_EXPF16_H diff --git a/libc/src/__support/math/expf16.h b/libc/src/__support/math/expf16.h index 6df5f6bb790e9..6ba208841e003 100644 --- a/libc/src/__support/math/expf16.h +++ b/libc/src/__support/math/expf16.h @@ -9,6 +9,12 @@ #ifndef LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_H #define LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_H +#include "include/llvm-libc-macros/float16-macros.h" + +#ifndef LIBC_TYPES_HAS_FLOAT16 +#error unsupported +#else + #include "hdr/errno_macros.h" #include "hdr/fenv_macros.h" #include "src/__support/FPUtil/FEnvImpl.h" @@ -131,4 +137,6 @@ static constexpr float16 expf16(float16 x) { } // namespace LIBC_NAMESPACE_DECL +#endif // LIBC_TYPES_HAS_FLOAT16 + #endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_H diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 884d29c90fe72..a77db5262c51a 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -1333,6 +1333,7 @@ add_entrypoint_object( ../expf16.h DEPENDS libc.src.__support.math.expf16 + libc.src.errno.errno ) add_entrypoint_object( diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel index 01fa6107ebf07..6e9ce06b6b1c1 100644 --- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel @@ -2101,8 +2101,7 @@ libc_support_library( hdrs = ["src/__support/math/expf16.h"], deps = [ ":__support_common", - ":hdr_errno_macros", - ":hdr_fenv_macros", + ":__support_libc_errno", ":__support_cpp_array", ":__support_fputil_cast", ":__support_fputil_except_value_utils", From 0a2e3a788d185e0a7ddf11c4d8c6bf6027071895 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Wed, 9 Jul 2025 22:48:38 +0300 Subject: [PATCH 7/9] fix styles --- libc/shared/math/expf16.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libc/shared/math/expf16.h b/libc/shared/math/expf16.h index 15b9045616a70..8bbdab4f6e83f 100644 --- a/libc/shared/math/expf16.h +++ b/libc/shared/math/expf16.h @@ -9,9 +9,9 @@ #ifndef LLVM_LIBC_SHARED_MATH_EXPF16_H #define LLVM_LIBC_SHARED_MATH_EXPF16_H +#include "include/llvm-libc-macros/float16-macros.h" #include "shared/libc_common.h" #include "src/__support/math/expf16.h" -#include "include/llvm-libc-macros/float16-macros.h" #ifndef LIBC_TYPES_HAS_FLOAT16 #error unsupported From b9522a3bad8aa4b4cca2a1263a6eccfd7bfc9875 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Wed, 9 Jul 2025 23:54:57 +0300 Subject: [PATCH 8/9] fix type check --- libc/shared/math/expf16.h | 4 +--- libc/src/__support/math/expf16.h | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/libc/shared/math/expf16.h b/libc/shared/math/expf16.h index 8bbdab4f6e83f..f5b99158d59e2 100644 --- a/libc/shared/math/expf16.h +++ b/libc/shared/math/expf16.h @@ -13,9 +13,7 @@ #include "shared/libc_common.h" #include "src/__support/math/expf16.h" -#ifndef LIBC_TYPES_HAS_FLOAT16 -#error unsupported -#else +#ifdef LIBC_TYPES_HAS_FLOAT16 namespace LIBC_NAMESPACE_DECL { namespace shared { diff --git a/libc/src/__support/math/expf16.h b/libc/src/__support/math/expf16.h index 6ba208841e003..e1fadae78cf16 100644 --- a/libc/src/__support/math/expf16.h +++ b/libc/src/__support/math/expf16.h @@ -11,9 +11,7 @@ #include "include/llvm-libc-macros/float16-macros.h" -#ifndef LIBC_TYPES_HAS_FLOAT16 -#error unsupported -#else +#ifdef LIBC_TYPES_HAS_FLOAT16 #include "hdr/errno_macros.h" #include "hdr/fenv_macros.h" From b48349ad425c7dd69d8136fc927164ed570223e7 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 10 Jul 2025 06:19:38 +0300 Subject: [PATCH 9/9] redo f16 checks --- libc/shared/math/expf16.h | 3 +- libc/src/__support/math/CMakeLists.txt | 15 +++- libc/src/__support/math/expf16.h | 3 +- libc/src/__support/math/expf16_utils.h | 89 +++++++++++++++++++ libc/src/math/generic/CMakeLists.txt | 3 +- libc/src/math/generic/expxf16.h | 66 +------------- .../llvm-project-overlay/libc/BUILD.bazel | 17 +++- 7 files changed, 125 insertions(+), 71 deletions(-) create mode 100644 libc/src/__support/math/expf16_utils.h diff --git a/libc/shared/math/expf16.h b/libc/shared/math/expf16.h index f5b99158d59e2..a6a3e89e680d4 100644 --- a/libc/shared/math/expf16.h +++ b/libc/shared/math/expf16.h @@ -11,10 +11,11 @@ #include "include/llvm-libc-macros/float16-macros.h" #include "shared/libc_common.h" -#include "src/__support/math/expf16.h" #ifdef LIBC_TYPES_HAS_FLOAT16 +#include "src/__support/math/expf16.h" + namespace LIBC_NAMESPACE_DECL { namespace shared { diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt index a26782b6867c7..4c73fba6613fa 100644 --- a/libc/src/__support/math/CMakeLists.txt +++ b/libc/src/__support/math/CMakeLists.txt @@ -23,12 +23,24 @@ add_header_library( libc.src.__support.macros.optimization ) +add_header_library( + expf16_utils + HDRS + expf16_utils.h + DEPENDS + libc.src.__support.CPP.array + libc.src.__support.FPUtil.nearest_integer + libc.src.__support.FPUtil.polyeval + libc.src.__support.macros.attributes + libc.include.llvm-libc-macros.float16_macros +) + add_header_library( expf16 HDRS expf16.h DEPENDS - .expxf16 + .expf16_utils libc.hdr.errno_macros libc.hdr.fenv_macros libc.src.__support.CPP.array @@ -41,4 +53,5 @@ add_header_library( libc.src.__support.FPUtil.polyeval libc.src.__support.FPUtil.rounding_mode libc.src.__support.macros.optimization + libc.include.llvm-libc-macros.float16_macros ) diff --git a/libc/src/__support/math/expf16.h b/libc/src/__support/math/expf16.h index e1fadae78cf16..ded28c7dba500 100644 --- a/libc/src/__support/math/expf16.h +++ b/libc/src/__support/math/expf16.h @@ -24,7 +24,8 @@ #include "src/__support/common.h" #include "src/__support/macros/config.h" #include "src/__support/macros/optimization.h" -#include "src/math/generic/expxf16.h" + +#include "expf16_utils.h" namespace LIBC_NAMESPACE_DECL { diff --git a/libc/src/__support/math/expf16_utils.h b/libc/src/__support/math/expf16_utils.h new file mode 100644 index 0000000000000..bebb72b09b886 --- /dev/null +++ b/libc/src/__support/math/expf16_utils.h @@ -0,0 +1,89 @@ +//===-- Common utils for expf16 functions -----------------------*- 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___SUPPORT_MATH_EXPF16_UTILS_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_UTILS_H + +#include "include/llvm-libc-macros/float16-macros.h" + +#ifdef LIBC_TYPES_HAS_FLOAT16 + +#include "src/__support/CPP/array.h" +#include "src/__support/FPUtil/PolyEval.h" +#include "src/__support/FPUtil/nearest_integer.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +// Generated by Sollya with the following commands: +// > display = hexadecimal; +// > for i from -18 to 12 do print(round(exp(i), SG, RN)); +static constexpr cpp::array EXP_HI = { + 0x1.05a628p-26f, 0x1.639e32p-25f, 0x1.e355bcp-24f, 0x1.4875cap-22f, + 0x1.be6c7p-21f, 0x1.2f6054p-19f, 0x1.9c54c4p-18f, 0x1.183542p-16f, + 0x1.7cd79cp-15f, 0x1.02cf22p-13f, 0x1.5fc21p-12f, 0x1.de16bap-11f, + 0x1.44e52p-9f, 0x1.b993fep-8f, 0x1.2c155cp-6f, 0x1.97db0cp-5f, + 0x1.152aaap-3f, 0x1.78b564p-2f, 0x1p+0f, 0x1.5bf0a8p+1f, + 0x1.d8e64cp+2f, 0x1.415e5cp+4f, 0x1.b4c902p+5f, 0x1.28d38ap+7f, + 0x1.936dc6p+8f, 0x1.122886p+10f, 0x1.749ea8p+11f, 0x1.fa7158p+12f, + 0x1.5829dcp+14f, 0x1.d3c448p+15f, 0x1.3de166p+17f, +}; + +// Generated by Sollya with the following commands: +// > display = hexadecimal; +// > for i from 0 to 7 do print(round(exp(i * 2^-3), SG, RN)); +static constexpr cpp::array EXP_MID = { + 0x1p+0f, 0x1.221604p+0f, 0x1.48b5e4p+0f, 0x1.747a52p+0f, + 0x1.a61298p+0f, 0x1.de455ep+0f, 0x1.0ef9dcp+1f, 0x1.330e58p+1f, +}; + +struct ExpRangeReduction { + float exp_hi_mid; + float exp_lo; +}; + +static constexpr ExpRangeReduction exp_range_reduction(float16 x) { + // For -18 < x < 12, to compute exp(x), we perform the following range + // reduction: find hi, mid, lo, such that: + // x = hi + mid + lo, in which + // hi is an integer, + // mid * 2^3 is an integer, + // -2^(-4) <= lo < 2^(-4). + // In particular, + // hi + mid = round(x * 2^3) * 2^(-3). + // Then, + // exp(x) = exp(hi + mid + lo) = exp(hi) * exp(mid) * exp(lo). + // We store exp(hi) and exp(mid) in the lookup tables EXP_HI and EXP_MID + // respectively. exp(lo) is computed using a degree-3 minimax polynomial + // generated by Sollya. + + float xf = x; + float kf = fputil::nearest_integer(xf * 0x1.0p+3f); + int x_hi_mid = static_cast(kf); + int x_hi = x_hi_mid >> 3; + int x_mid = x_hi_mid & 0x7; + // lo = x - (hi + mid) = round(x * 2^3) * (-2^(-3)) + x + float lo = fputil::multiply_add(kf, -0x1.0p-3f, xf); + + float exp_hi = EXP_HI[x_hi + 18]; + float exp_mid = EXP_MID[x_mid]; + // Degree-3 minimax polynomial generated by Sollya with the following + // commands: + // > display = hexadecimal; + // > P = fpminimax(expm1(x)/x, 2, [|SG...|], [-2^-4, 2^-4]); + // > 1 + x * P; + float exp_lo = + fputil::polyeval(lo, 0x1p+0f, 0x1p+0f, 0x1.001p-1f, 0x1.555ddep-3f); + return {exp_hi * exp_mid, exp_lo}; +} + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TYPES_HAS_FLOAT16 + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXPF16_UTILS_H diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index a77db5262c51a..6c3f28f423c7b 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -5064,11 +5064,10 @@ add_header_library( HDRS expxf16.h DEPENDS - libc.src.__support.CPP.array libc.src.__support.FPUtil.cast libc.src.__support.FPUtil.fp_bits libc.src.__support.FPUtil.multiply_add libc.src.__support.FPUtil.nearest_integer - libc.src.__support.FPUtil.polyeval libc.src.__support.macros.attributes + libc.src.__support.math.expf16_utils ) diff --git a/libc/src/math/generic/expxf16.h b/libc/src/math/generic/expxf16.h index 67bb248307519..05ac95d586823 100644 --- a/libc/src/math/generic/expxf16.h +++ b/libc/src/math/generic/expxf16.h @@ -9,9 +9,7 @@ #ifndef LLVM_LIBC_SRC_MATH_GENERIC_EXPXF16_H #define LLVM_LIBC_SRC_MATH_GENERIC_EXPXF16_H -#include "src/__support/CPP/array.h" #include "src/__support/FPUtil/FPBits.h" -#include "src/__support/FPUtil/PolyEval.h" #include "src/__support/FPUtil/cast.h" #include "src/__support/FPUtil/multiply_add.h" #include "src/__support/FPUtil/nearest_integer.h" @@ -19,69 +17,9 @@ #include "src/__support/macros/config.h" #include -namespace LIBC_NAMESPACE_DECL { - -// Generated by Sollya with the following commands: -// > display = hexadecimal; -// > for i from -18 to 12 do print(round(exp(i), SG, RN)); -static constexpr cpp::array EXP_HI = { - 0x1.05a628p-26f, 0x1.639e32p-25f, 0x1.e355bcp-24f, 0x1.4875cap-22f, - 0x1.be6c7p-21f, 0x1.2f6054p-19f, 0x1.9c54c4p-18f, 0x1.183542p-16f, - 0x1.7cd79cp-15f, 0x1.02cf22p-13f, 0x1.5fc21p-12f, 0x1.de16bap-11f, - 0x1.44e52p-9f, 0x1.b993fep-8f, 0x1.2c155cp-6f, 0x1.97db0cp-5f, - 0x1.152aaap-3f, 0x1.78b564p-2f, 0x1p+0f, 0x1.5bf0a8p+1f, - 0x1.d8e64cp+2f, 0x1.415e5cp+4f, 0x1.b4c902p+5f, 0x1.28d38ap+7f, - 0x1.936dc6p+8f, 0x1.122886p+10f, 0x1.749ea8p+11f, 0x1.fa7158p+12f, - 0x1.5829dcp+14f, 0x1.d3c448p+15f, 0x1.3de166p+17f, -}; - -// Generated by Sollya with the following commands: -// > display = hexadecimal; -// > for i from 0 to 7 do print(round(exp(i * 2^-3), SG, RN)); -static constexpr cpp::array EXP_MID = { - 0x1p+0f, 0x1.221604p+0f, 0x1.48b5e4p+0f, 0x1.747a52p+0f, - 0x1.a61298p+0f, 0x1.de455ep+0f, 0x1.0ef9dcp+1f, 0x1.330e58p+1f, -}; - -struct ExpRangeReduction { - float exp_hi_mid; - float exp_lo; -}; +#include "src/__support/math/expf16_utils.h" -LIBC_INLINE ExpRangeReduction exp_range_reduction(float16 x) { - // For -18 < x < 12, to compute exp(x), we perform the following range - // reduction: find hi, mid, lo, such that: - // x = hi + mid + lo, in which - // hi is an integer, - // mid * 2^3 is an integer, - // -2^(-4) <= lo < 2^(-4). - // In particular, - // hi + mid = round(x * 2^3) * 2^(-3). - // Then, - // exp(x) = exp(hi + mid + lo) = exp(hi) * exp(mid) * exp(lo). - // We store exp(hi) and exp(mid) in the lookup tables EXP_HI and EXP_MID - // respectively. exp(lo) is computed using a degree-3 minimax polynomial - // generated by Sollya. - - float xf = x; - float kf = fputil::nearest_integer(xf * 0x1.0p+3f); - int x_hi_mid = static_cast(kf); - int x_hi = x_hi_mid >> 3; - int x_mid = x_hi_mid & 0x7; - // lo = x - (hi + mid) = round(x * 2^3) * (-2^(-3)) + x - float lo = fputil::multiply_add(kf, -0x1.0p-3f, xf); - - float exp_hi = EXP_HI[x_hi + 18]; - float exp_mid = EXP_MID[x_mid]; - // Degree-3 minimax polynomial generated by Sollya with the following - // commands: - // > display = hexadecimal; - // > P = fpminimax(expm1(x)/x, 2, [|SG...|], [-2^-4, 2^-4]); - // > 1 + x * P; - float exp_lo = - fputil::polyeval(lo, 0x1p+0f, 0x1p+0f, 0x1.001p-1f, 0x1.555ddep-3f); - return {exp_hi * exp_mid, exp_lo}; -} +namespace LIBC_NAMESPACE_DECL { // Generated by Sollya with the following commands: // > display = hexadecimal; diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel index 6e9ce06b6b1c1..639d6b34699c8 100644 --- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel @@ -2062,11 +2062,10 @@ libc_support_library( name = "expxf16", hdrs = ["src/math/generic/expxf16.h"], deps = [ - ":__support_cpp_array", ":__support_fputil_cast", ":__support_fputil_fp_bits", ":__support_fputil_nearest_integer", - ":__support_fputil_polyeval", + ":__support_math_expf16_utils", ], ) @@ -2096,6 +2095,18 @@ libc_support_library( ], ) +libc_support_library( + name = "__support_math_expf16_utils", + hdrs = ["src/__support/math/expf16_utils.h"], + deps = [ + ":__support_cpp_array", + ":__support_fputil_nearest_integer", + ":__support_fputil_polyeval", + ":__support_macros_attributes", + ":llvm_libc_macros_float16_macros" + ], +) + libc_support_library( name = "__support_math_expf16", hdrs = ["src/__support/math/expf16.h"], @@ -2112,6 +2123,8 @@ libc_support_library( ":__support_fputil_polyeval", ":__support_fputil_rounding_mode", ":__support_macros_optimization", + ":__support_math_expf16_utils", + ":llvm_libc_macros_float16_macros" ], )