From d06e9ce1dd69d53a2a2afd06c027ca8af87a7d7e Mon Sep 17 00:00:00 2001 From: Muhammad Bassiouni <60100307+bassiounix@users.noreply.github.com> Date: Sat, 12 Jul 2025 18:08:58 +0300 Subject: [PATCH] [libc][math] Refactor frexpf implementation to header-only in src/__support/math folder. (#147893) Part of #147386 in preparation for: https://discourse.llvm.org/t/rfc-make-clang-builtin-math-functions-constexpr-with-llvm-libc-to-support-c-23-constexpr-math-functions/86450 --- libc/shared/math.h | 1 + libc/shared/math/frexpf.h | 24 ++++++++++++++++ libc/src/__support/math/CMakeLists.txt | 8 ++++++ libc/src/__support/math/frexpf.h | 28 +++++++++++++++++++ libc/src/math/generic/CMakeLists.txt | 2 +- libc/src/math/generic/frexpf.cpp | 7 ++--- .../llvm-project-overlay/libc/BUILD.bazel | 15 +++++++++- 7 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 libc/shared/math/frexpf.h create mode 100644 libc/src/__support/math/frexpf.h diff --git a/libc/shared/math.h b/libc/shared/math.h index 13c0f9abcdbd..e2950e075a81 100644 --- a/libc/shared/math.h +++ b/libc/shared/math.h @@ -13,6 +13,7 @@ #include "math/expf.h" #include "math/expf16.h" +#include "math/frexpf.h" #include "math/frexpf128.h" #include "math/frexpf16.h" diff --git a/libc/shared/math/frexpf.h b/libc/shared/math/frexpf.h new file mode 100644 index 000000000000..35f23a70eb25 --- /dev/null +++ b/libc/shared/math/frexpf.h @@ -0,0 +1,24 @@ +//===-- Shared frexpf 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_FREXPF_H +#define LLVM_LIBC_SHARED_MATH_FREXPF_H + +#include "shared/libc_common.h" +#include "src/__support/math/frexpf.h" + +namespace LIBC_NAMESPACE_DECL { +namespace shared { + +using math::frexpf; + +} // namespace shared +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SHARED_MATH_FREXPF_H diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt index e745c07529ac..0baf12a26a9d 100644 --- a/libc/src/__support/math/CMakeLists.txt +++ b/libc/src/__support/math/CMakeLists.txt @@ -74,3 +74,11 @@ add_header_library( libc.src.__support.macros.properties.types libc.src.__support.FPUtil.manipulation_functions ) + +add_header_library( + frexpf + HDRS + frexpf.h + DEPENDS + libc.src.__support.FPUtil.manipulation_functions +) diff --git a/libc/src/__support/math/frexpf.h b/libc/src/__support/math/frexpf.h new file mode 100644 index 000000000000..4d2f4948f2af --- /dev/null +++ b/libc/src/__support/math/frexpf.h @@ -0,0 +1,28 @@ +//===-- Implementation header for frexpf ------------------------*- 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_FREXPF_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_FREXPF_H + +#include "src/__support/FPUtil/ManipulationFunctions.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace math { + +static constexpr float frexpf(float x, int *exp) { + return fputil::frexp(x, *exp); +} + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_FREXPF_H diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 6b540b2aafc9..60b8f83f6101 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -1759,7 +1759,7 @@ add_entrypoint_object( HDRS ../frexpf.h DEPENDS - libc.src.__support.FPUtil.manipulation_functions + libc.src.__support.math.frexpf ) add_entrypoint_object( diff --git a/libc/src/math/generic/frexpf.cpp b/libc/src/math/generic/frexpf.cpp index 09227badc341..783880d44ce6 100644 --- a/libc/src/math/generic/frexpf.cpp +++ b/libc/src/math/generic/frexpf.cpp @@ -7,14 +7,13 @@ //===----------------------------------------------------------------------===// #include "src/math/frexpf.h" -#include "src/__support/FPUtil/ManipulationFunctions.h" -#include "src/__support/common.h" -#include "src/__support/macros/config.h" + +#include "src/__support/math/frexpf.h" namespace LIBC_NAMESPACE_DECL { LLVM_LIBC_FUNCTION(float, frexpf, (float x, int *exp)) { - return fputil::frexp(x, *exp); + return math::frexpf(x, exp); } } // 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 3b1d108109ed..11ea06897f82 100644 --- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel @@ -2169,6 +2169,14 @@ libc_support_library( ], ) +libc_support_library( + name = "__support_math_frexpf", + hdrs = ["src/__support/math/frexpf.h"], + deps = [ + ":__support_fputil_manipulation_functions", + ], +) + ############################### complex targets ################################ libc_function( @@ -3216,7 +3224,12 @@ libc_math_function(name = "fmulf128") libc_math_function(name = "frexp") -libc_math_function(name = "frexpf") +libc_math_function( + name = "frexpf", + additional_deps = [ + ":__support_math_frexpf", + ], +) libc_math_function(name = "frexpl")