diff --git a/libc/shared/math.h b/libc/shared/math.h index 61c3ddffd74e5..a8e2dcbd23af4 100644 --- a/libc/shared/math.h +++ b/libc/shared/math.h @@ -40,6 +40,7 @@ #include "math/bf16addl.h" #include "math/bf16div.h" #include "math/bf16divf.h" +#include "math/bf16divf128.h" #include "math/bf16divl.h" #include "math/bf16fmaf.h" #include "math/bf16fmaf128.h" diff --git a/libc/shared/math/bf16divf128.h b/libc/shared/math/bf16divf128.h new file mode 100644 index 0000000000000..1f92bbb51414f --- /dev/null +++ b/libc/shared/math/bf16divf128.h @@ -0,0 +1,26 @@ +//===-- Shared bf16divf128 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_BF16DIVF128_H +#define LLVM_LIBC_SHARED_MATH_BF16DIVF128_H + +#include "shared/libc_common.h" +#include "src/__support/math/bf16divf128.h" + +namespace LIBC_NAMESPACE_DECL { +namespace shared { + +#ifdef LIBC_TYPES_HAS_FLOAT128 +using math::bf16divf128; +#endif // LIBC_TYPES_HAS_FLOAT128 + +} // namespace shared +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SHARED_MATH_BF16DIVF128_H diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt index 8bb935d863a9b..4098775c0a3ef 100644 --- a/libc/src/__support/math/CMakeLists.txt +++ b/libc/src/__support/math/CMakeLists.txt @@ -452,6 +452,18 @@ add_header_library( libc.src.__support.macros.config ) +add_header_library( + bf16divf128 + HDRS + bf16divf128.h + DEPENDS + libc.include.llvm-libc-types.float128 + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.generic.div + libc.src.__support.macros.config + libc.src.__support.macros.properties.types +) + add_header_library( bf16fmaf HDRS diff --git a/libc/src/__support/math/bf16divf128.h b/libc/src/__support/math/bf16divf128.h new file mode 100644 index 0000000000000..32c348573c96a --- /dev/null +++ b/libc/src/__support/math/bf16divf128.h @@ -0,0 +1,27 @@ +//===-- Implementation header for bf16divf128 -------------------*- 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_BF16DIVF128_H +#define LLVM_LIBC_SRC___SUPPORT_MATH_BF16DIVF128_H + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/FPUtil/generic/div.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace math { + +#ifdef LIBC_TYPES_HAS_FLOAT128 +LIBC_INLINE constexpr bfloat16 bf16divf128(float128 x, float128 y) { + return fputil::generic::div(x, y); +} +#endif // LIBC_TYPES_HAS_FLOAT128 + +} // namespace math +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_MATH_BF16DIVF128_H diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 07c48c9a04c98..9689233bc76b5 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -5140,12 +5140,12 @@ add_entrypoint_object( bf16divf128.cpp HDRS ../bf16divf128.h + COMPILE_OPTIONS + -O3 DEPENDS libc.src.__support.common - libc.src.__support.FPUtil.bfloat16 - libc.src.__support.FPUtil.generic.div libc.src.__support.macros.config - libc.src.__support.macros.properties.types + libc.src.__support.math.bf16divf128 ) add_entrypoint_object( diff --git a/libc/src/math/generic/bf16divf128.cpp b/libc/src/math/generic/bf16divf128.cpp index fbe9775ce4046..32d02e2d31b0e 100644 --- a/libc/src/math/generic/bf16divf128.cpp +++ b/libc/src/math/generic/bf16divf128.cpp @@ -7,15 +7,14 @@ //===----------------------------------------------------------------------===// #include "src/math/bf16divf128.h" -#include "src/__support/FPUtil/bfloat16.h" -#include "src/__support/FPUtil/generic/div.h" #include "src/__support/common.h" #include "src/__support/macros/config.h" +#include "src/__support/math/bf16divf128.h" namespace LIBC_NAMESPACE_DECL { LLVM_LIBC_FUNCTION(bfloat16, bf16divf128, (float128 x, float128 y)) { - return fputil::generic::div(x, y); + return math::bf16divf128(x, y); } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt index 2e351d8051bed..c4acfad4105f2 100644 --- a/libc/test/shared/CMakeLists.txt +++ b/libc/test/shared/CMakeLists.txt @@ -37,6 +37,7 @@ add_fp_unittest( libc.src.__support.math.bf16addf128 libc.src.__support.math.bf16div libc.src.__support.math.bf16divf + libc.src.__support.math.bf16divf128 libc.src.__support.math.bf16divl libc.src.__support.math.bf16fmaf libc.src.__support.math.bf16fmaf128 diff --git a/libc/test/shared/shared_math_test.cpp b/libc/test/shared/shared_math_test.cpp index 4eb950f030a1a..604d6507bb8f8 100644 --- a/libc/test/shared/shared_math_test.cpp +++ b/libc/test/shared/shared_math_test.cpp @@ -415,6 +415,10 @@ TEST(LlvmLibcSharedMathTest, AllBFloat16) { EXPECT_FP_EQ(bfloat16(2.0f), LIBC_NAMESPACE::shared::bf16divf(4.0f, 2.0f)); EXPECT_FP_EQ(bfloat16(2.0), LIBC_NAMESPACE::shared::bf16divl(6.0L, 3.0L)); EXPECT_FP_EQ(bfloat16(2.0), LIBC_NAMESPACE::shared::bf16div(4.0, 2.0)); +#ifdef LIBC_TYPES_HAS_FLOAT128 + EXPECT_FP_EQ(bfloat16(2.0), LIBC_NAMESPACE::shared::bf16divf128( + float128(4.0), float128(2.0))); +#endif EXPECT_FP_EQ(bfloat16(10.0), LIBC_NAMESPACE::shared::bf16fmal(2.0L, 3.0L, 4.0L)); diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel index 316fda92c04a6..864dc76f8f6ed 100644 --- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel @@ -3178,6 +3178,17 @@ libc_support_library( ], ) +libc_support_library( + name = "__support_math_bf16divf128", + hdrs = ["src/__support/math/bf16divf128.h"], + deps = [ + ":__support_fputil_basic_operations", + ":__support_fputil_bfloat16", + ":__support_macros_config", + ":llvm_libc_types_float128", + ], +) + libc_support_library( name = "__support_math_bf16fmaf", hdrs = ["src/__support/math/bf16fmaf.h"], @@ -6300,6 +6311,13 @@ libc_math_function( ], ) +libc_math_function( + name = "bf16divf128", + additional_deps = [ + ":__support_math_bf16divf128", + ], +) + libc_math_function( name = "canonicalizef", additional_deps = [