diff --git a/libc/shared/math.h b/libc/shared/math.h index c110f6a696b79..4ac2fd80ff502 100644 --- a/libc/shared/math.h +++ b/libc/shared/math.h @@ -41,6 +41,7 @@ #include "math/bf16addl.h" #include "math/bf16div.h" #include "math/bf16divf.h" +#include "math/bf16divf128.h" #include "math/bf16divl.h" #include "math/bf16fma.h" #include "math/bf16fmaf.h" diff --git a/libc/shared/math/bf16divf128.h b/libc/shared/math/bf16divf128.h new file mode 100644 index 0000000000000..54a6d2703ab4a --- /dev/null +++ b/libc/shared/math/bf16divf128.h @@ -0,0 +1,29 @@ +//===-- 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 "include/llvm-libc-types/float128.h" + +#ifdef LIBC_TYPES_HAS_FLOAT128 + +#include "shared/libc_common.h" +#include "src/__support/math/bf16divf128.h" + +namespace LIBC_NAMESPACE_DECL { +namespace shared { + +using math::bf16divf128; + +} // namespace shared +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TYPES_HAS_FLOAT128 + +#endif // LLVM_LIBC_SHARED_MATH_BF16DIVF128_H diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt index a8bd09e925b38..b3392e0201092 100644 --- a/libc/src/__support/math/CMakeLists.txt +++ b/libc/src/__support/math/CMakeLists.txt @@ -469,6 +469,18 @@ add_header_library( libc.src.__support.macros.config ) +add_header_library( + bf16divf128 + HDRS + bf16divf128.h + DEPENDS + libc.src.__support.common + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.generic.div + libc.src.__support.macros.config + libc.include.llvm-libc-types.float128 +) + add_header_library( bf16fma HDRS diff --git a/libc/src/__support/math/bf16divf128.h b/libc/src/__support/math/bf16divf128.h new file mode 100644 index 0000000000000..8ed5335099e71 --- /dev/null +++ b/libc/src/__support/math/bf16divf128.h @@ -0,0 +1,33 @@ +//===-- 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 "include/llvm-libc-types/float128.h" + +#ifdef LIBC_TYPES_HAS_FLOAT128 + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/FPUtil/generic/div.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace math { + +LIBC_INLINE bfloat16 bf16divf128(float128 x, float128 y) { + return fputil::generic::div(x, y); +} + +} // namespace math +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TYPES_HAS_FLOAT128 + +#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 1c41a8f4980b0..a6c1b5b28b3f4 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -5126,11 +5126,7 @@ add_entrypoint_object( HDRS ../bf16divf128.h 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..eb1b5b241e2a3 100644 --- a/libc/src/math/generic/bf16divf128.cpp +++ b/libc/src/math/generic/bf16divf128.cpp @@ -7,15 +7,12 @@ //===----------------------------------------------------------------------===// #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 789286c25444f..305a2481ea730 100644 --- a/libc/test/shared/CMakeLists.txt +++ b/libc/test/shared/CMakeLists.txt @@ -38,6 +38,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.bf16fma libc.src.__support.math.bf16fmaf diff --git a/libc/test/shared/shared_math_test.cpp b/libc/test/shared/shared_math_test.cpp index c67078f4d5ac4..f177f118821a4 100644 --- a/libc/test/shared/shared_math_test.cpp +++ b/libc/test/shared/shared_math_test.cpp @@ -377,6 +377,8 @@ TEST(LlvmLibcSharedMathTest, AllFloat128) { float128(0.0), float128(0.0), float128(0.0))); EXPECT_FP_EQ(bfloat16(0.0), LIBC_NAMESPACE::shared::bf16mulf128( float128(0.0), float128(0.0))); + EXPECT_FP_EQ(bfloat16(2.0), LIBC_NAMESPACE::shared::bf16divf128( + float128(4.0), float128(2.0))); EXPECT_FP_EQ(float128(0.0), LIBC_NAMESPACE::shared::ceilf128(float128(0.0))); EXPECT_FP_EQ(float128(0.0), LIBC_NAMESPACE::shared::faddf128(float128(0.0), float128(0.0))); diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel index 381c57b18c8e2..8354547f91dab 100644 --- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel @@ -3195,6 +3195,18 @@ libc_support_library( ], ) +libc_support_library( + name = "__support_math_bf16divf128", + hdrs = ["src/__support/math/bf16divf128.h"], + deps = [ + ":__support_common", + ":__support_fputil_basic_operations", + ":__support_fputil_bfloat16", + ":__support_macros_config", + ":llvm_libc_types_float128", + ], +) + libc_support_library( name = "__support_math_bf16fma", hdrs = ["src/__support/math/bf16fma.h"], @@ -6352,6 +6364,13 @@ libc_math_function( ], ) +libc_math_function( + name = "bf16divf128", + additional_deps = [ + ":__support_math_bf16divf128", + ], +) + libc_math_function( name = "canonicalizef", additional_deps = [