diff --git a/libc/shared/math.h b/libc/shared/math.h index 874c2c0779adb..79ba2ea5aa6ff 100644 --- a/libc/shared/math.h +++ b/libc/shared/math.h @@ -57,6 +57,7 @@ #include "math/expm1.h" #include "math/expm1f.h" #include "math/expm1f16.h" +#include "math/fma.h" #include "math/frexpf.h" #include "math/frexpf128.h" #include "math/frexpf16.h" diff --git a/libc/shared/math/fma.h b/libc/shared/math/fma.h new file mode 100644 index 0000000000000..82f1dac61dda2 --- /dev/null +++ b/libc/shared/math/fma.h @@ -0,0 +1,23 @@ +//===-- Shared fma 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_FMA_H +#define LLVM_LIBC_SHARED_MATH_FMA_H + +#include "shared/libc_common.h" +#include "src/__support/math/fma.h" + +namespace LIBC_NAMESPACE_DECL { +namespace shared { + +using math::fma; + +} // namespace shared +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SHARED_MATH_FMA_H diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt index effded3c2bfb2..76dc425caef5b 100644 --- a/libc/src/__support/math/CMakeLists.txt +++ b/libc/src/__support/math/CMakeLists.txt @@ -593,6 +593,14 @@ add_header_library( libc.src.__support.math.exp10_float16_constants ) +add_header_library( + fma + HDRS + fma.h + DEPENDS + libc.src.__support.FPUtil.fma +) + add_header_library( frexpf128 HDRS diff --git a/libc/src/__support/math/fma.h b/libc/src/__support/math/fma.h new file mode 100644 index 0000000000000..d996610167a19 --- /dev/null +++ b/libc/src/__support/math/fma.h @@ -0,0 +1,27 @@ +//===-- Implementation header for fma ---------------------------*- 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_FMA_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_FMA_H + +#include "src/__support/FPUtil/FMA.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +namespace math { + +LIBC_INLINE static double fma(double x, double y, double z) { + return fputil::fma(x, y, z); +} + +} // namespace math + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_FMA_H diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 08e16711e00af..fdd5c3b329192 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -4696,7 +4696,7 @@ add_entrypoint_object( HDRS ../fma.h DEPENDS - libc.src.__support.FPUtil.fma + libc.src.__support.math.fma ) add_entrypoint_object( diff --git a/libc/src/math/generic/fma.cpp b/libc/src/math/generic/fma.cpp index 2ea4ae9961150..3ccdb78846e34 100644 --- a/libc/src/math/generic/fma.cpp +++ b/libc/src/math/generic/fma.cpp @@ -7,15 +7,12 @@ //===----------------------------------------------------------------------===// #include "src/math/fma.h" -#include "src/__support/common.h" - -#include "src/__support/FPUtil/FMA.h" -#include "src/__support/macros/config.h" +#include "src/__support/math/fma.h" namespace LIBC_NAMESPACE_DECL { LLVM_LIBC_FUNCTION(double, fma, (double x, double y, double z)) { - return fputil::fma(x, y, z); + return math::fma(x, y, z); } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt index bfcac7884e646..cd4b5ec75f876 100644 --- a/libc/test/shared/CMakeLists.txt +++ b/libc/test/shared/CMakeLists.txt @@ -53,6 +53,7 @@ add_fp_unittest( libc.src.__support.math.exp10f16 libc.src.__support.math.expf libc.src.__support.math.expf16 + libc.src.__support.math.fma libc.src.__support.math.frexpf libc.src.__support.math.frexpf128 libc.src.__support.math.frexpf16 diff --git a/libc/test/shared/shared_math_test.cpp b/libc/test/shared/shared_math_test.cpp index 3369cb5e2cf03..7357e24603004 100644 --- a/libc/test/shared/shared_math_test.cpp +++ b/libc/test/shared/shared_math_test.cpp @@ -90,6 +90,7 @@ TEST(LlvmLibcSharedMathTest, AllDouble) { EXPECT_FP_EQ(0x1p+0, LIBC_NAMESPACE::shared::exp2(0.0)); EXPECT_FP_EQ(0x1p+0, LIBC_NAMESPACE::shared::exp10(0.0)); EXPECT_FP_EQ(0x0p+0, LIBC_NAMESPACE::shared::expm1(0.0)); + EXPECT_FP_EQ(0x0p+0, LIBC_NAMESPACE::shared::fma(0.0, 0.0, 0.0)); } #ifdef LIBC_TYPES_HAS_FLOAT128 diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel index 5d9d4368359b6..6b8fb6e48a811 100644 --- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel @@ -2792,6 +2792,14 @@ libc_support_library( ], ) +libc_support_library( + name = "__support_math_fma", + hdrs = ["src/__support/math/fma.h"], + deps = [ + ":__support_fputil_fma", + ], +) + libc_support_library( name = "__support_math_frexpf128", hdrs = ["src/__support/math/frexpf128.h"], @@ -3094,15 +3102,15 @@ libc_support_library( name = "__support_math_expm1f16", hdrs = ["src/__support/math/expm1f16.h"], deps = [ + ":__support_fputil_except_value_utils", ":__support_fputil_fma", ":__support_fputil_multiply_add", ":__support_fputil_nearest_integer", ":__support_fputil_polyeval", ":__support_fputil_rounding_mode", - ":__support_fputil_except_value_utils", ":__support_macros_optimization", ":__support_macros_properties_cpu_features", - ":__support_math_expxf16_utils" + ":__support_math_expxf16_utils", ], ) @@ -4006,7 +4014,7 @@ libc_math_function(name = "floorf16") libc_math_function( name = "fma", additional_deps = [ - ":__support_fputil_fma", + ":__support_math_fma", ], )