From 64121d4437c4f167afe91ca7cabc2a1719687d2c Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 12:05:28 +0530 Subject: [PATCH 01/12] feat: implement {canonicalize,iscanonical,fdim,copysign,issignaling}bf16 math functions Signed-off-by: Krishna Pandey --- libc/src/math/canonicalizebf16.h | 21 +++++++++++++++++++++ libc/src/math/copysignbf16.h | 21 +++++++++++++++++++++ libc/src/math/fdimbf16.h | 21 +++++++++++++++++++++ libc/src/math/generic/canonicalizebf16.cpp | 21 +++++++++++++++++++++ libc/src/math/generic/copysignbf16.cpp | 21 +++++++++++++++++++++ libc/src/math/generic/fdimbf16.cpp | 21 +++++++++++++++++++++ libc/src/math/generic/iscanonicalbf16.cpp | 22 ++++++++++++++++++++++ libc/src/math/generic/issignalingbf16.cpp | 21 +++++++++++++++++++++ libc/src/math/iscanonicalbf16.h | 21 +++++++++++++++++++++ libc/src/math/issignalingbf16.h | 21 +++++++++++++++++++++ 10 files changed, 211 insertions(+) create mode 100644 libc/src/math/canonicalizebf16.h create mode 100644 libc/src/math/copysignbf16.h create mode 100644 libc/src/math/fdimbf16.h create mode 100644 libc/src/math/generic/canonicalizebf16.cpp create mode 100644 libc/src/math/generic/copysignbf16.cpp create mode 100644 libc/src/math/generic/fdimbf16.cpp create mode 100644 libc/src/math/generic/iscanonicalbf16.cpp create mode 100644 libc/src/math/generic/issignalingbf16.cpp create mode 100644 libc/src/math/iscanonicalbf16.h create mode 100644 libc/src/math/issignalingbf16.h diff --git a/libc/src/math/canonicalizebf16.h b/libc/src/math/canonicalizebf16.h new file mode 100644 index 0000000000000..858fa32969868 --- /dev/null +++ b/libc/src/math/canonicalizebf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for canonicalizebf16 --------------*- 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_MATH_CANONICALIZEBF16_H +#define LLVM_LIBC_SRC_MATH_CANONICALIZEBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +int canonicalizebf16(bfloat16 *cx, const bfloat16 *x); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_CANONICALIZEBF16_H diff --git a/libc/src/math/copysignbf16.h b/libc/src/math/copysignbf16.h new file mode 100644 index 0000000000000..6369616d6f569 --- /dev/null +++ b/libc/src/math/copysignbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for copysignbf16 ------------------*- 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_MATH_COPYSIGNBF16_H +#define LLVM_LIBC_SRC_MATH_COPYSIGNBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +bfloat16 copysignbf16(bfloat16 x, bfloat16 y); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_COPYSIGNBF16_H diff --git a/libc/src/math/fdimbf16.h b/libc/src/math/fdimbf16.h new file mode 100644 index 0000000000000..75bec34b70db2 --- /dev/null +++ b/libc/src/math/fdimbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for fdimbf16 ----------------------*- 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_MATH_FDIMBF16_H +#define LLVM_LIBC_SRC_MATH_FDIMBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +bfloat16 fdimbf16(bfloat16 x, bfloat16 y); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_FDIMBF16_H diff --git a/libc/src/math/generic/canonicalizebf16.cpp b/libc/src/math/generic/canonicalizebf16.cpp new file mode 100644 index 0000000000000..9cc379060c3de --- /dev/null +++ b/libc/src/math/generic/canonicalizebf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of canonicalizebf16 function -----------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/math/canonicalizebf16.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(int, canonicalizebf16, (bfloat16 * cx, const bfloat16 *x)) { + return fputil::canonicalize(*cx, *x); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/copysignbf16.cpp b/libc/src/math/generic/copysignbf16.cpp new file mode 100644 index 0000000000000..48ade2b26981c --- /dev/null +++ b/libc/src/math/generic/copysignbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of copysignbf16 function ---------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/math/copysignbf16.h" +#include "src/__support/FPUtil/ManipulationFunctions.h" +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(bfloat16, copysignbf16, (bfloat16 x, bfloat16 y)) { + return fputil::copysign(x, y); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/fdimbf16.cpp b/libc/src/math/generic/fdimbf16.cpp new file mode 100644 index 0000000000000..0f54055b763e1 --- /dev/null +++ b/libc/src/math/generic/fdimbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of fdimbf16 function -------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/math/fdimbf16.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(bfloat16, fdimbf16, (bfloat16 x, bfloat16 y)) { + return fputil::fdim(x, y); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/iscanonicalbf16.cpp b/libc/src/math/generic/iscanonicalbf16.cpp new file mode 100644 index 0000000000000..34c11bfcb83d5 --- /dev/null +++ b/libc/src/math/generic/iscanonicalbf16.cpp @@ -0,0 +1,22 @@ +//===-- Implementation of iscanonicalbf16 function ------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/math/iscanonicalbf16.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(int, iscanonicalbf16, (bfloat16 x)) { + bfloat16 tmp; + return fputil::canonicalize(tmp, x) == 0; +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/issignalingbf16.cpp b/libc/src/math/generic/issignalingbf16.cpp new file mode 100644 index 0000000000000..3bb17efaa0ffe --- /dev/null +++ b/libc/src/math/generic/issignalingbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of issignalingbf16 function ------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/math/issignalingbf16.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(int, issignalingbf16, (bfloat16 x)) { + return fputil::issignaling_impl(x); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/iscanonicalbf16.h b/libc/src/math/iscanonicalbf16.h new file mode 100644 index 0000000000000..f4f975ed9b24e --- /dev/null +++ b/libc/src/math/iscanonicalbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for iscanonicalbf16 ---------------*- 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_MATH_ISCANONICALBF16_H +#define LLVM_LIBC_SRC_MATH_ISCANONICALBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +int iscanonicalbf16(bfloat16 x); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_ISCANONICALBF16_H diff --git a/libc/src/math/issignalingbf16.h b/libc/src/math/issignalingbf16.h new file mode 100644 index 0000000000000..afbe70fddf1c0 --- /dev/null +++ b/libc/src/math/issignalingbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for issignalingbf16 ---------------*- 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_MATH_ISSIGNALINGBF16_H +#define LLVM_LIBC_SRC_MATH_ISSIGNALINGBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +int issignalingbf16(bfloat16 x); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_ISSIGNALINGBF16_H From ff3915c7c47cb3e461cae99034d53229814f0c88 Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 12:05:57 +0530 Subject: [PATCH 02/12] chore: update CMakeLists Signed-off-by: Krishna Pandey --- libc/src/math/CMakeLists.txt | 5 ++ libc/src/math/generic/CMakeLists.txt | 72 ++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index 95e5ae781490f..e6a2f868e46b5 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -78,12 +78,14 @@ add_math_entrypoint_object(canonicalizef) add_math_entrypoint_object(canonicalizel) add_math_entrypoint_object(canonicalizef16) add_math_entrypoint_object(canonicalizef128) +add_math_entrypoint_object(canonicalizebf16) add_math_entrypoint_object(iscanonical) add_math_entrypoint_object(iscanonicalf) add_math_entrypoint_object(iscanonicall) add_math_entrypoint_object(iscanonicalf16) add_math_entrypoint_object(iscanonicalf128) +add_math_entrypoint_object(iscanonicalbf16) add_math_entrypoint_object(cbrt) add_math_entrypoint_object(cbrtf) @@ -100,6 +102,7 @@ add_math_entrypoint_object(copysignf) add_math_entrypoint_object(copysignl) add_math_entrypoint_object(copysignf16) add_math_entrypoint_object(copysignf128) +add_math_entrypoint_object(copysignbf16) add_math_entrypoint_object(cos) add_math_entrypoint_object(cosf) @@ -203,6 +206,7 @@ add_math_entrypoint_object(fdimf) add_math_entrypoint_object(fdiml) add_math_entrypoint_object(fdimf16) add_math_entrypoint_object(fdimf128) +add_math_entrypoint_object(fdimbf16) add_math_entrypoint_object(fdiv) add_math_entrypoint_object(fdivl) @@ -355,6 +359,7 @@ add_math_entrypoint_object(issignalingf) add_math_entrypoint_object(issignalingl) add_math_entrypoint_object(issignalingf16) add_math_entrypoint_object(issignalingf128) +add_math_entrypoint_object(issignalingbf16) add_math_entrypoint_object(llogb) add_math_entrypoint_object(llogbf) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index ba71e5f9e1260..70ca5c51990de 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -52,6 +52,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.basic_operations ) +add_entrypoint_object( + canonicalizebf16 + SRCS + canonicalizebf16.cpp + HDRS + ../canonicalizebf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.macros.config + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 +) + add_entrypoint_object( iscanonical SRCS @@ -96,6 +110,20 @@ add_entrypoint_object( libc.src.__support.macros.properties.types ) +add_entrypoint_object( + iscanonicalbf16 + SRCS + iscanonicalbf16.cpp + HDRS + ../iscanonicalbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.macros.config + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 +) + add_entrypoint_object( ceil SRCS @@ -1748,6 +1776,22 @@ add_entrypoint_object( libc.src.__support.FPUtil.manipulation_functions ) +add_entrypoint_object( + copysignbf16 + SRCS + copysignbf16.cpp + HDRS + ../copysignbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.macros.config + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.manipulation_functions + FLAGS + MISC_MATH_BASIC_OPS_OPT +) + add_entrypoint_object( frexp SRCS @@ -3427,6 +3471,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.basic_operations ) +add_entrypoint_object( + fdimbf16 + SRCS + fdimbf16.cpp + HDRS + ../fdimbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.macros.config + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 +) + add_entrypoint_object( fdiv SRCS @@ -3543,6 +3601,20 @@ add_entrypoint_object( libc.src.__support.macros.properties.types ) +add_entrypoint_object( + issignalingbf16 + SRCS + issignalingbf16.cpp + HDRS + ../issignalingbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.macros.config + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 +) + add_entrypoint_object( isnan SRCS From cbdfc66f487e4b7bd6be5207874847bf52236ea6 Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 12:06:13 +0530 Subject: [PATCH 03/12] chore: add smoke tests for {canonicalize,iscanonical,fdim,copysign,issignaling}bf16 math functions Signed-off-by: Krishna Pandey --- libc/test/src/math/smoke/CMakeLists.txt | 72 +++++++++++++++++++ .../src/math/smoke/canonicalizebf16_test.cpp | 14 ++++ .../test/src/math/smoke/copysignbf16_test.cpp | 14 ++++ libc/test/src/math/smoke/fdimbf16_test.cpp | 14 ++++ .../src/math/smoke/iscanonicalbf16_test.cpp | 14 ++++ .../src/math/smoke/issignalingbf16_test.cpp | 14 ++++ 6 files changed, 142 insertions(+) create mode 100644 libc/test/src/math/smoke/canonicalizebf16_test.cpp create mode 100644 libc/test/src/math/smoke/copysignbf16_test.cpp create mode 100644 libc/test/src/math/smoke/fdimbf16_test.cpp create mode 100644 libc/test/src/math/smoke/iscanonicalbf16_test.cpp create mode 100644 libc/test/src/math/smoke/issignalingbf16_test.cpp diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index a5f856f05bb8c..0497d5e0c06ed 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -432,6 +432,22 @@ add_fp_unittest( libc.src.__support.integer_literals ) +add_fp_unittest( + canonicalizebf16_test + SUITE + libc-math-smoke-tests + SRCS + canonicalizebf16_test.cpp + HDRS + CanonicalizeTest.h + DEPENDS + libc.src.math.canonicalizebf16 + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.fp_bits + libc.src.__support.FPUtil.fenv_impl + libc.src.__support.integer_literals +) + add_fp_unittest( iscanonical_test SUITE @@ -492,6 +508,19 @@ add_fp_unittest( libc.src.math.iscanonicalf128 ) +add_fp_unittest( + iscanonicalbf16_test + SUITE + libc-math-smoke-tests + SRCS + iscanonicalbf16_test.cpp + HDRS + IsCanonicalTest.h + DEPENDS + libc.src.math.iscanonicalbf16 + libc.src.__support.FPUtil.bfloat16 +) + add_fp_unittest( ceil_test SUITE @@ -1559,6 +1588,21 @@ add_fp_unittest( libc.src.__support.FPUtil.fp_bits ) +add_fp_unittest( + copysignbf16_test + SUITE + libc-math-smoke-tests + SRCS + copysignbf16_test.cpp + HDRS + CopySignTest.h + DEPENDS + libc.src.math.copysignbf16 + libc.src.__support.CPP.algorithm + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.fp_bits +) + add_fp_unittest( frexp_test SUITE @@ -2076,6 +2120,19 @@ add_fp_unittest( libc.src.math.issignalingf128 ) +add_fp_unittest( + issignalingbf16_test + SUITE + libc-math-smoke-tests + SRCS + issignalingbf16_test.cpp + HDRS + IsSignalingTest.h + DEPENDS + libc.src.math.issignalingbf16 + libc.src.__support.FPUtil.bfloat16 +) + add_fp_unittest( llogb_test SUITE @@ -2510,6 +2567,21 @@ add_fp_unittest( libc.src.__support.FPUtil.fp_bits ) +add_fp_unittest( + fdimbf16_test + SUITE + libc-math-smoke-tests + SRCS + fdimbf16_test.cpp + HDRS + FDimTest.h + DEPENDS + libc.src.math.fdimbf16 + libc.src.__support.CPP.algorithm + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.fp_bits +) + add_fp_unittest( fminf_test SUITE diff --git a/libc/test/src/math/smoke/canonicalizebf16_test.cpp b/libc/test/src/math/smoke/canonicalizebf16_test.cpp new file mode 100644 index 0000000000000..bf955c26ebc4f --- /dev/null +++ b/libc/test/src/math/smoke/canonicalizebf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for canonicalizebf16 ------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "CanonicalizeTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/canonicalizebf16.h" + +LIST_CANONICALIZE_TESTS(bfloat16, LIBC_NAMESPACE::canonicalizebf16) diff --git a/libc/test/src/math/smoke/copysignbf16_test.cpp b/libc/test/src/math/smoke/copysignbf16_test.cpp new file mode 100644 index 0000000000000..71a97e37a7491 --- /dev/null +++ b/libc/test/src/math/smoke/copysignbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for copysignbf16 ----------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "CopySignTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/copysignbf16.h" + +LIST_COPYSIGN_TESTS(bfloat16, LIBC_NAMESPACE::copysignbf16) diff --git a/libc/test/src/math/smoke/fdimbf16_test.cpp b/libc/test/src/math/smoke/fdimbf16_test.cpp new file mode 100644 index 0000000000000..43e8039053fdf --- /dev/null +++ b/libc/test/src/math/smoke/fdimbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for fdimbf16 --------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "FDimTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/fdimbf16.h" + +LIST_FDIM_TESTS(bfloat16, LIBC_NAMESPACE::fdimbf16); diff --git a/libc/test/src/math/smoke/iscanonicalbf16_test.cpp b/libc/test/src/math/smoke/iscanonicalbf16_test.cpp new file mode 100644 index 0000000000000..3d735882e82a3 --- /dev/null +++ b/libc/test/src/math/smoke/iscanonicalbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for iscanonicalbf16 -------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "IsCanonicalTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/iscanonicalbf16.h" + +LIST_ISCANONICAL_TESTS(bfloat16, LIBC_NAMESPACE::iscanonicalbf16) diff --git a/libc/test/src/math/smoke/issignalingbf16_test.cpp b/libc/test/src/math/smoke/issignalingbf16_test.cpp new file mode 100644 index 0000000000000..ed7e5af4aa41f --- /dev/null +++ b/libc/test/src/math/smoke/issignalingbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for issignalingbf16 -------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "IsSignalingTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/issignalingbf16.h" + +LIST_ISSIGNALING_TESTS(bfloat16, LIBC_NAMESPACE::issignalingbf16) From 170f9b2204546869db58a3882afe46430b36a8e0 Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 12:06:44 +0530 Subject: [PATCH 04/12] fix: add 0 to T cast Signed-off-by: Krishna Pandey --- libc/src/__support/FPUtil/BasicOperations.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libc/src/__support/FPUtil/BasicOperations.h b/libc/src/__support/FPUtil/BasicOperations.h index 2357b053b60b8..ca7be6676630a 100644 --- a/libc/src/__support/FPUtil/BasicOperations.h +++ b/libc/src/__support/FPUtil/BasicOperations.h @@ -244,7 +244,7 @@ LIBC_INLINE T fdim(T x, T y) { return y; } - return (x > y ? x - y : 0); + return (x > y ? x - y : T(0)); } // Avoid reusing `issignaling` macro. From ceb8818a9f86de8a85bfb8a52e2aac69738f1237 Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 12:09:38 +0530 Subject: [PATCH 05/12] chore: update entrypoints Signed-off-by: Krishna Pandey --- libc/config/baremetal/aarch64/entrypoints.txt | 5 +++++ libc/config/baremetal/arm/entrypoints.txt | 5 +++++ libc/config/baremetal/riscv/entrypoints.txt | 5 +++++ libc/config/darwin/aarch64/entrypoints.txt | 5 +++++ libc/config/darwin/x86_64/entrypoints.txt | 5 +++++ libc/config/gpu/amdgpu/entrypoints.txt | 5 +++++ libc/config/gpu/nvptx/entrypoints.txt | 5 +++++ libc/config/linux/aarch64/entrypoints.txt | 5 +++++ libc/config/linux/arm/entrypoints.txt | 5 +++++ libc/config/linux/riscv/entrypoints.txt | 5 +++++ libc/config/linux/x86_64/entrypoints.txt | 5 +++++ libc/config/windows/entrypoints.txt | 5 +++++ 12 files changed, 60 insertions(+) diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt index c2e4c337f199a..ce6d0a7e440a4 100644 --- a/libc/config/baremetal/aarch64/entrypoints.txt +++ b/libc/config/baremetal/aarch64/entrypoints.txt @@ -772,8 +772,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -790,6 +793,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt index c4f3a87659b23..d8fffd0da48da 100644 --- a/libc/config/baremetal/arm/entrypoints.txt +++ b/libc/config/baremetal/arm/entrypoints.txt @@ -775,8 +775,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -793,6 +796,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt index 380ca57ea8aa9..2a120b2f68c41 100644 --- a/libc/config/baremetal/riscv/entrypoints.txt +++ b/libc/config/baremetal/riscv/entrypoints.txt @@ -775,8 +775,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -793,6 +796,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt index 1f4318fc88389..8945b61f186b3 100644 --- a/libc/config/darwin/aarch64/entrypoints.txt +++ b/libc/config/darwin/aarch64/entrypoints.txt @@ -605,8 +605,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -623,6 +626,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 diff --git a/libc/config/darwin/x86_64/entrypoints.txt b/libc/config/darwin/x86_64/entrypoints.txt index 0cba22016c960..1a5c75fb0c038 100644 --- a/libc/config/darwin/x86_64/entrypoints.txt +++ b/libc/config/darwin/x86_64/entrypoints.txt @@ -248,8 +248,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -266,6 +269,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 diff --git a/libc/config/gpu/amdgpu/entrypoints.txt b/libc/config/gpu/amdgpu/entrypoints.txt index e08b028865bfc..53fbabc6fce39 100644 --- a/libc/config/gpu/amdgpu/entrypoints.txt +++ b/libc/config/gpu/amdgpu/entrypoints.txt @@ -631,8 +631,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -649,6 +652,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 diff --git a/libc/config/gpu/nvptx/entrypoints.txt b/libc/config/gpu/nvptx/entrypoints.txt index 88c8fc91ebb77..a970618643f5c 100644 --- a/libc/config/gpu/nvptx/entrypoints.txt +++ b/libc/config/gpu/nvptx/entrypoints.txt @@ -633,8 +633,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -651,6 +654,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 20924e9047c69..e55c47e1ee4d6 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -860,8 +860,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -878,6 +881,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt index f2e8ddfe8e91a..55554e439e71e 100644 --- a/libc/config/linux/arm/entrypoints.txt +++ b/libc/config/linux/arm/entrypoints.txt @@ -475,8 +475,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -493,6 +496,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt index 0ad36a667232a..6bf97c5164ada 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -878,8 +878,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -896,6 +899,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index c060e900472eb..998d4193c353b 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -911,8 +911,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -929,6 +932,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 diff --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt index 9e45b800b10a3..2ca06edfa9a2c 100644 --- a/libc/config/windows/entrypoints.txt +++ b/libc/config/windows/entrypoints.txt @@ -321,8 +321,11 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.bf16sub libc.src.math.bf16subf libc.src.math.bf16subl + libc.src.math.canonicalizebf16 libc.src.math.ceilbf16 + libc.src.math.copysignbf16 libc.src.math.fabsbf16 + libc.src.math.fdimbf16 libc.src.math.floorbf16 libc.src.math.fmaxbf16 libc.src.math.fmaximumbf16 @@ -339,6 +342,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxbf16 libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 + libc.src.math.iscanonicalbf16 + libc.src.math.isignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 From 99f5872441d8279e77884deddd20ad53903044ed Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 12:10:12 +0530 Subject: [PATCH 06/12] docs: add {canonicalize,iscanonical,fdim,copysign,issignaling}bf16 math functions Signed-off-by: Krishna Pandey --- libc/docs/headers/math/index.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst index b329bf031312d..818386aa18f02 100644 --- a/libc/docs/headers/math/index.rst +++ b/libc/docs/headers/math/index.rst @@ -109,9 +109,9 @@ Basic Operations +==================+==================+=================+========================+======================+========================+========================+========================+============================+ | ceil | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.9.1 | F.10.6.1 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| canonicalize | |check| | |check| | |check| | |check| | |check| | | 7.12.11.7 | F.10.8.7 | +| canonicalize | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.11.7 | F.10.8.7 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| copysign | |check| | |check| | |check| | |check| | |check| | | 7.12.11.1 | F.10.8.1 | +| copysign | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.11.1 | F.10.8.1 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | dadd | N/A | N/A | |check| | N/A | |check|\* | N/A | 7.12.14.1 | F.10.11 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ @@ -147,7 +147,7 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | fadd | N/A | |check| | |check| | N/A | |check| | N/A | 7.12.14.1 | F.10.11 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| fdim | |check| | |check| | |check| | |check| | |check| | | 7.12.12.1 | F.10.9.1 | +| fdim | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.12.1 | F.10.9.1 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | fdiv | N/A | |check| | |check| | N/A | |check|\* | N/A | 7.12.14.4 | F.10.11 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ @@ -191,9 +191,9 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | ilogb | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.6.8 | F.10.3.8 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| iscanonical | |check| | |check| | |check| | |check| | |check| | | 7.12.3.2 | N/A | +| iscanonical | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.3.2 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| issignaling | |check| | |check| | |check| | |check| | |check| | | 7.12.3.8 | N/A | +| issignaling | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.3.8 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | ldexp | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.6.9 | F.10.3.9 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ From 204df3472901aba6382817f36b1f3d19e80d662a Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 12:43:27 +0530 Subject: [PATCH 07/12] feat: implement totalorder{,mag}bf16 math functions Signed-off-by: Krishna Pandey --- libc/src/math/CMakeLists.txt | 2 ++ libc/src/math/generic/CMakeLists.txt | 29 +++++++++++++++++++++ libc/src/math/generic/totalorderbf16.cpp | 22 ++++++++++++++++ libc/src/math/generic/totalordermagbf16.cpp | 22 ++++++++++++++++ libc/src/math/totalorderbf16.h | 21 +++++++++++++++ libc/src/math/totalordermagbf16.h | 21 +++++++++++++++ 6 files changed, 117 insertions(+) create mode 100644 libc/src/math/generic/totalorderbf16.cpp create mode 100644 libc/src/math/generic/totalordermagbf16.cpp create mode 100644 libc/src/math/totalorderbf16.h create mode 100644 libc/src/math/totalordermagbf16.h diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index e6a2f868e46b5..1edb517421e28 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -579,12 +579,14 @@ add_math_entrypoint_object(totalorderf) add_math_entrypoint_object(totalorderl) add_math_entrypoint_object(totalorderf16) add_math_entrypoint_object(totalorderf128) +add_math_entrypoint_object(totalorderbf16) add_math_entrypoint_object(totalordermag) add_math_entrypoint_object(totalordermagf) add_math_entrypoint_object(totalordermagl) add_math_entrypoint_object(totalordermagf16) add_math_entrypoint_object(totalordermagf128) +add_math_entrypoint_object(totalordermagbf16) add_math_entrypoint_object(trunc) add_math_entrypoint_object(truncf) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 70ca5c51990de..904f8d2eb4704 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -4784,6 +4784,21 @@ add_entrypoint_object( libc.src.__support.FPUtil.basic_operations libc.src.__support.macros.properties.types ) + +add_entrypoint_object( + totalorderbf16 + SRCS + totalorderbf16.cpp + HDRS + ../totalorderbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.macros.config + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 +) + add_entrypoint_object( totalordermag SRCS @@ -4835,6 +4850,20 @@ add_entrypoint_object( libc.src.__support.macros.properties.types ) +add_entrypoint_object( + totalordermagbf16 + SRCS + totalordermagbf16.cpp + HDRS + ../totalordermagbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.macros.config + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 +) + add_entrypoint_object( getpayload SRCS diff --git a/libc/src/math/generic/totalorderbf16.cpp b/libc/src/math/generic/totalorderbf16.cpp new file mode 100644 index 0000000000000..bb9c86e281f6b --- /dev/null +++ b/libc/src/math/generic/totalorderbf16.cpp @@ -0,0 +1,22 @@ +//===-- Implementation of totalorderbf16 function -------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/math/totalorderbf16.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(int, totalorderbf16, + (const bfloat16 *x, const bfloat16 *y)) { + return static_cast(fputil::totalorder(*x, *y)); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/totalordermagbf16.cpp b/libc/src/math/generic/totalordermagbf16.cpp new file mode 100644 index 0000000000000..3fc61d9d8bcb4 --- /dev/null +++ b/libc/src/math/generic/totalordermagbf16.cpp @@ -0,0 +1,22 @@ +//===-- Implementation of totalordermagbf16 function ----------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/math/totalordermagbf16.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/FPUtil/bfloat16.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(int, totalordermagbf16, + (const bfloat16 *x, const bfloat16 *y)) { + return static_cast(fputil::totalordermag(*x, *y)); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/totalorderbf16.h b/libc/src/math/totalorderbf16.h new file mode 100644 index 0000000000000..2414852db92b8 --- /dev/null +++ b/libc/src/math/totalorderbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for totalorderbf16 ----------------*- 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_MATH_TOTALORDERF16_H +#define LLVM_LIBC_SRC_MATH_TOTALORDERF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +int totalorderbf16(const bfloat16 *x, const bfloat16 *y); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_TOTALORDERF16_H diff --git a/libc/src/math/totalordermagbf16.h b/libc/src/math/totalordermagbf16.h new file mode 100644 index 0000000000000..c48de1ca8e540 --- /dev/null +++ b/libc/src/math/totalordermagbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for totalordermagbf16 -------------*- 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_MATH_TOTALORDERMAGF16_H +#define LLVM_LIBC_SRC_MATH_TOTALORDERMAGF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +int totalordermagbf16(const bfloat16 *x, const bfloat16 *y); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_TOTALORDERMAGF16_H From 06ca9a3956e5331d7cc15bc65d51c1f77f1e6c0c Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 12:43:42 +0530 Subject: [PATCH 08/12] chore: add smoke tests for totalorder{,mag}bf16 math functions Signed-off-by: Krishna Pandey --- libc/test/src/math/smoke/CMakeLists.txt | 26 ++++++++++++ libc/test/src/math/smoke/TotalOrderMagTest.h | 41 +++++++++++++++---- libc/test/src/math/smoke/TotalOrderTest.h | 41 +++++++++++++++---- .../src/math/smoke/totalorderbf16_test.cpp | 14 +++++++ .../src/math/smoke/totalordermagbf16_test.cpp | 14 +++++++ 5 files changed, 120 insertions(+), 16 deletions(-) create mode 100644 libc/test/src/math/smoke/totalorderbf16_test.cpp create mode 100644 libc/test/src/math/smoke/totalordermagbf16_test.cpp diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 0497d5e0c06ed..166802fd9f9cc 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -5050,6 +5050,19 @@ add_fp_unittest( libc.src.math.totalorderf128 ) +add_fp_unittest( + totalorderbf16_test + SUITE + libc-math-smoke-tests + SRCS + totalorderbf16_test.cpp + HDRS + TotalOrderTest.h + DEPENDS + libc.src.math.totalorderbf16 + libc.src.__support.FPUtil.bfloat16 +) + add_fp_unittest( totalordermag_test SUITE @@ -5110,6 +5123,19 @@ add_fp_unittest( libc.src.math.totalordermagf128 ) +add_fp_unittest( + totalordermagbf16_test + SUITE + libc-math-smoke-tests + SRCS + totalordermagbf16_test.cpp + HDRS + TotalOrderMagTest.h + DEPENDS + libc.src.math.totalordermagbf16 + libc.src.__support.FPUtil.bfloat16 +) + add_fp_unittest( getpayload_test SUITE diff --git a/libc/test/src/math/smoke/TotalOrderMagTest.h b/libc/test/src/math/smoke/TotalOrderMagTest.h index 0a13fd2922e4c..2b37d8b2f6c4a 100644 --- a/libc/test/src/math/smoke/TotalOrderMagTest.h +++ b/libc/test/src/math/smoke/TotalOrderMagTest.h @@ -111,19 +111,44 @@ class TotalOrderMagTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val(); T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val(); + T qnan_0x15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val(); + T neg_qnan_0x15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val(); + T snan_0x15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val(); + T neg_snan_0x15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val(); + EXPECT_TRUE(funcWrapper(func, aNaN, aNaN)); EXPECT_TRUE(funcWrapper(func, sNaN, sNaN)); - EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42)); - EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42)); - EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN)); - EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN)); + + if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42)); + EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42)); + EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN)); + EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN)); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 5) { + EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x15)); + EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x15)); + EXPECT_FALSE(funcWrapper(func, qnan_0x15, aNaN)); + EXPECT_TRUE(funcWrapper(func, snan_0x15, sNaN)); + } EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_aNaN)); EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_sNaN)); - EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_qnan_0x42)); - EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_snan_0x42)); - EXPECT_FALSE(funcWrapper(func, neg_qnan_0x42, neg_aNaN)); - EXPECT_TRUE(funcWrapper(func, neg_snan_0x42, neg_sNaN)); + + if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_qnan_0x42)); + EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_snan_0x42)); + EXPECT_FALSE(funcWrapper(func, neg_qnan_0x42, neg_aNaN)); + EXPECT_TRUE(funcWrapper(func, neg_snan_0x42, neg_sNaN)); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 5) { + EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_qnan_0x15)); + EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_snan_0x15)); + EXPECT_FALSE(funcWrapper(func, neg_qnan_0x15, neg_aNaN)); + EXPECT_TRUE(funcWrapper(func, neg_snan_0x15, neg_sNaN)); + } } }; diff --git a/libc/test/src/math/smoke/TotalOrderTest.h b/libc/test/src/math/smoke/TotalOrderTest.h index e426eb35016b9..e5984391f719f 100644 --- a/libc/test/src/math/smoke/TotalOrderTest.h +++ b/libc/test/src/math/smoke/TotalOrderTest.h @@ -109,19 +109,44 @@ class TotalOrderTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val(); T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val(); + T qnan_0x15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val(); + T neg_qnan_0x15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val(); + T snan_0x15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val(); + T neg_snan_0x15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val(); + EXPECT_TRUE(funcWrapper(func, aNaN, aNaN)); EXPECT_TRUE(funcWrapper(func, sNaN, sNaN)); - EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42)); - EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42)); - EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN)); - EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN)); + + if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42)); + EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42)); + EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN)); + EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN)); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 5) { + EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x15)); + EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x15)); + EXPECT_FALSE(funcWrapper(func, qnan_0x15, aNaN)); + EXPECT_TRUE(funcWrapper(func, snan_0x15, sNaN)); + } EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_aNaN)); EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_sNaN)); - EXPECT_FALSE(funcWrapper(func, neg_aNaN, neg_qnan_0x42)); - EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_snan_0x42)); - EXPECT_TRUE(funcWrapper(func, neg_qnan_0x42, neg_aNaN)); - EXPECT_FALSE(funcWrapper(func, neg_snan_0x42, neg_sNaN)); + + if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + EXPECT_FALSE(funcWrapper(func, neg_aNaN, neg_qnan_0x42)); + EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_snan_0x42)); + EXPECT_TRUE(funcWrapper(func, neg_qnan_0x42, neg_aNaN)); + EXPECT_FALSE(funcWrapper(func, neg_snan_0x42, neg_sNaN)); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 5) { + EXPECT_FALSE(funcWrapper(func, neg_aNaN, neg_qnan_0x15)); + EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_snan_0x15)); + EXPECT_TRUE(funcWrapper(func, neg_qnan_0x15, neg_aNaN)); + EXPECT_FALSE(funcWrapper(func, neg_snan_0x15, neg_sNaN)); + } } }; diff --git a/libc/test/src/math/smoke/totalorderbf16_test.cpp b/libc/test/src/math/smoke/totalorderbf16_test.cpp new file mode 100644 index 0000000000000..11aeeac0c52dd --- /dev/null +++ b/libc/test/src/math/smoke/totalorderbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for totalorderbf16 --------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "TotalOrderTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/totalorderbf16.h" + +LIST_TOTALORDER_TESTS(bfloat16, LIBC_NAMESPACE::totalorderbf16) diff --git a/libc/test/src/math/smoke/totalordermagbf16_test.cpp b/libc/test/src/math/smoke/totalordermagbf16_test.cpp new file mode 100644 index 0000000000000..b5a5a1b7d6c52 --- /dev/null +++ b/libc/test/src/math/smoke/totalordermagbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for totalordermagbf16 -----------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "TotalOrderMagTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/totalordermagbf16.h" + +LIST_TOTALORDERMAG_TESTS(bfloat16, LIBC_NAMESPACE::totalordermagbf16) From f83bce4928ed483836a84d7630fcbced151602fd Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 12:43:52 +0530 Subject: [PATCH 09/12] chore: update entrypoints Signed-off-by: Krishna Pandey --- libc/config/baremetal/aarch64/entrypoints.txt | 4 +++- libc/config/baremetal/arm/entrypoints.txt | 4 +++- libc/config/baremetal/riscv/entrypoints.txt | 4 +++- libc/config/darwin/aarch64/entrypoints.txt | 4 +++- libc/config/darwin/x86_64/entrypoints.txt | 4 +++- libc/config/gpu/amdgpu/entrypoints.txt | 4 +++- libc/config/gpu/nvptx/entrypoints.txt | 4 +++- libc/config/linux/aarch64/entrypoints.txt | 4 +++- libc/config/linux/arm/entrypoints.txt | 4 +++- libc/config/linux/riscv/entrypoints.txt | 4 +++- libc/config/linux/x86_64/entrypoints.txt | 4 +++- libc/config/windows/entrypoints.txt | 4 +++- 12 files changed, 36 insertions(+), 12 deletions(-) diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt index ce6d0a7e440a4..ff3a6bfa8a2fc 100644 --- a/libc/config/baremetal/aarch64/entrypoints.txt +++ b/libc/config/baremetal/aarch64/entrypoints.txt @@ -794,7 +794,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -817,6 +817,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt index d8fffd0da48da..f8916d71f86aa 100644 --- a/libc/config/baremetal/arm/entrypoints.txt +++ b/libc/config/baremetal/arm/entrypoints.txt @@ -797,7 +797,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -820,6 +820,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt index 2a120b2f68c41..8a72fa6692869 100644 --- a/libc/config/baremetal/riscv/entrypoints.txt +++ b/libc/config/baremetal/riscv/entrypoints.txt @@ -797,7 +797,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -820,6 +820,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt index 8945b61f186b3..796c0d3c8a4ff 100644 --- a/libc/config/darwin/aarch64/entrypoints.txt +++ b/libc/config/darwin/aarch64/entrypoints.txt @@ -627,7 +627,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -650,6 +650,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) diff --git a/libc/config/darwin/x86_64/entrypoints.txt b/libc/config/darwin/x86_64/entrypoints.txt index 1a5c75fb0c038..fa1d8def8936c 100644 --- a/libc/config/darwin/x86_64/entrypoints.txt +++ b/libc/config/darwin/x86_64/entrypoints.txt @@ -270,7 +270,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -293,6 +293,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) diff --git a/libc/config/gpu/amdgpu/entrypoints.txt b/libc/config/gpu/amdgpu/entrypoints.txt index 53fbabc6fce39..49c41411cb5d2 100644 --- a/libc/config/gpu/amdgpu/entrypoints.txt +++ b/libc/config/gpu/amdgpu/entrypoints.txt @@ -653,7 +653,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -676,6 +676,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) diff --git a/libc/config/gpu/nvptx/entrypoints.txt b/libc/config/gpu/nvptx/entrypoints.txt index a970618643f5c..06a2c9addb7fb 100644 --- a/libc/config/gpu/nvptx/entrypoints.txt +++ b/libc/config/gpu/nvptx/entrypoints.txt @@ -655,7 +655,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -678,6 +678,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index e55c47e1ee4d6..feea7ff69c166 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -882,7 +882,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -905,6 +905,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt index 55554e439e71e..8e92fac863c6b 100644 --- a/libc/config/linux/arm/entrypoints.txt +++ b/libc/config/linux/arm/entrypoints.txt @@ -497,7 +497,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -520,6 +520,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt index 6bf97c5164ada..fb08cfe7bd3f8 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -900,7 +900,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -923,6 +923,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index 998d4193c353b..37af75454daa3 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -933,7 +933,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -956,6 +956,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) diff --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt index 2ca06edfa9a2c..c09e6b259fa42 100644 --- a/libc/config/windows/entrypoints.txt +++ b/libc/config/windows/entrypoints.txt @@ -343,7 +343,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.getpayloadbf16 libc.src.math.ilogbbf16 libc.src.math.iscanonicalbf16 - libc.src.math.isignalingbf16 + libc.src.math.issignalingbf16 libc.src.math.ldexpbf16 libc.src.math.llogbbf16 libc.src.math.llrintbf16 @@ -366,6 +366,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.setpayloadbf16 libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 + libc.src.math.totalorderbf16 + libc.src.math.totalordermagbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 ) From 4396ea91f1af80bf74bd765a3c02b95ca71a89bc Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 12:44:02 +0530 Subject: [PATCH 10/12] docs: add totalorder{,mag}bf16 math functions Signed-off-by: Krishna Pandey --- libc/docs/headers/math/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst index 818386aa18f02..89624460c3af5 100644 --- a/libc/docs/headers/math/index.rst +++ b/libc/docs/headers/math/index.rst @@ -241,9 +241,9 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | setpayloadsig | |check| | |check| | |check| | |check| | |check| | |check| | F.10.13.3 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| totalorder | |check| | |check| | |check| | |check| | |check| | | F.10.12.1 | N/A | +| totalorder | |check| | |check| | |check| | |check| | |check| | |check| | F.10.12.1 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| totalordermag | |check| | |check| | |check| | |check| | |check| | | F.10.12.2 | N/A | +| totalordermag | |check| | |check| | |check| | |check| | |check| | |check| | F.10.12.2 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | trunc | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.9.9 | F.10.6.9 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ From d6987f41cec3a80b8dc23d5944401c10cb69a9b9 Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 22:49:09 +0530 Subject: [PATCH 11/12] nit: reorder TotalOrder and TotalOrderMag tests Signed-off-by: Krishna Pandey --- libc/test/src/math/smoke/TotalOrderMagTest.h | 47 +++++++++--------- libc/test/src/math/smoke/TotalOrderTest.h | 51 +++++++++----------- 2 files changed, 46 insertions(+), 52 deletions(-) diff --git a/libc/test/src/math/smoke/TotalOrderMagTest.h b/libc/test/src/math/smoke/TotalOrderMagTest.h index 2b37d8b2f6c4a..b5c26bb4bcd37 100644 --- a/libc/test/src/math/smoke/TotalOrderMagTest.h +++ b/libc/test/src/math/smoke/TotalOrderMagTest.h @@ -106,49 +106,46 @@ class TotalOrderMagTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { } void testNaNPayloads(TotalOrderMagFunc func) { - T qnan_0x42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val(); - T neg_qnan_0x42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val(); - T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val(); - T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val(); - - T qnan_0x15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val(); - T neg_qnan_0x15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val(); - T snan_0x15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val(); - T neg_snan_0x15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val(); EXPECT_TRUE(funcWrapper(func, aNaN, aNaN)); EXPECT_TRUE(funcWrapper(func, sNaN, sNaN)); - if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { - EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42)); - EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42)); - EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN)); - EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN)); - } + EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_aNaN)); + EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_sNaN)); if constexpr (FPBits::FRACTION_LEN - 1 >= 5) { + T qnan_0x15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val(); + T neg_qnan_0x15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val(); + T snan_0x15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val(); + T neg_snan_0x15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val(); + EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x15)); EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x15)); EXPECT_FALSE(funcWrapper(func, qnan_0x15, aNaN)); EXPECT_TRUE(funcWrapper(func, snan_0x15, sNaN)); - } - EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_aNaN)); - EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_sNaN)); + EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_qnan_0x15)); + EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_snan_0x15)); + EXPECT_FALSE(funcWrapper(func, neg_qnan_0x15, neg_aNaN)); + EXPECT_TRUE(funcWrapper(func, neg_snan_0x15, neg_sNaN)); + } if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + T qnan_0x42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val(); + T neg_qnan_0x42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val(); + T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val(); + T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val(); + + EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42)); + EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42)); + EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN)); + EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN)); + EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_qnan_0x42)); EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_snan_0x42)); EXPECT_FALSE(funcWrapper(func, neg_qnan_0x42, neg_aNaN)); EXPECT_TRUE(funcWrapper(func, neg_snan_0x42, neg_sNaN)); } - - if constexpr (FPBits::FRACTION_LEN - 1 >= 5) { - EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_qnan_0x15)); - EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_snan_0x15)); - EXPECT_FALSE(funcWrapper(func, neg_qnan_0x15, neg_aNaN)); - EXPECT_TRUE(funcWrapper(func, neg_snan_0x15, neg_sNaN)); - } } }; diff --git a/libc/test/src/math/smoke/TotalOrderTest.h b/libc/test/src/math/smoke/TotalOrderTest.h index e5984391f719f..608c1ed0aa049 100644 --- a/libc/test/src/math/smoke/TotalOrderTest.h +++ b/libc/test/src/math/smoke/TotalOrderTest.h @@ -104,49 +104,46 @@ class TotalOrderTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { } void testNaNPayloads(TotalOrderFunc func) { - T qnan_0x42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val(); - T neg_qnan_0x42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val(); - T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val(); - T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val(); - - T qnan_0x15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val(); - T neg_qnan_0x15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val(); - T snan_0x15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val(); - T neg_snan_0x15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val(); EXPECT_TRUE(funcWrapper(func, aNaN, aNaN)); EXPECT_TRUE(funcWrapper(func, sNaN, sNaN)); - if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { - EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42)); - EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42)); - EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN)); - EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN)); - } + EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_aNaN)); + EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_sNaN)); if constexpr (FPBits::FRACTION_LEN - 1 >= 5) { + T qnan_0x15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val(); + T neg_qnan_0x15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val(); + T snan_0x15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val(); + T neg_snan_0x15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val(); + EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x15)); EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x15)); EXPECT_FALSE(funcWrapper(func, qnan_0x15, aNaN)); EXPECT_TRUE(funcWrapper(func, snan_0x15, sNaN)); - } - - EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_aNaN)); - EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_sNaN)); - if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { - EXPECT_FALSE(funcWrapper(func, neg_aNaN, neg_qnan_0x42)); - EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_snan_0x42)); - EXPECT_TRUE(funcWrapper(func, neg_qnan_0x42, neg_aNaN)); - EXPECT_FALSE(funcWrapper(func, neg_snan_0x42, neg_sNaN)); - } - - if constexpr (FPBits::FRACTION_LEN - 1 >= 5) { EXPECT_FALSE(funcWrapper(func, neg_aNaN, neg_qnan_0x15)); EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_snan_0x15)); EXPECT_TRUE(funcWrapper(func, neg_qnan_0x15, neg_aNaN)); EXPECT_FALSE(funcWrapper(func, neg_snan_0x15, neg_sNaN)); } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + T qnan_0x42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val(); + T neg_qnan_0x42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val(); + T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val(); + T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val(); + + EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42)); + EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42)); + EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN)); + EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN)); + + EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_qnan_0x42)); + EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_snan_0x42)); + EXPECT_FALSE(funcWrapper(func, neg_qnan_0x42, neg_aNaN)); + EXPECT_TRUE(funcWrapper(func, neg_snan_0x42, neg_sNaN)); + } } }; From 312bc545143cc9e93129bcb95e680041caded49d Mon Sep 17 00:00:00 2001 From: Krishna Pandey Date: Wed, 27 Aug 2025 23:02:49 +0530 Subject: [PATCH 12/12] fix: TotalOrderTest Signed-off-by: Krishna Pandey --- libc/test/src/math/smoke/TotalOrderTest.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libc/test/src/math/smoke/TotalOrderTest.h b/libc/test/src/math/smoke/TotalOrderTest.h index 608c1ed0aa049..4281a9a0b987d 100644 --- a/libc/test/src/math/smoke/TotalOrderTest.h +++ b/libc/test/src/math/smoke/TotalOrderTest.h @@ -139,10 +139,10 @@ class TotalOrderTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN)); EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN)); - EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_qnan_0x42)); - EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_snan_0x42)); - EXPECT_FALSE(funcWrapper(func, neg_qnan_0x42, neg_aNaN)); - EXPECT_TRUE(funcWrapper(func, neg_snan_0x42, neg_sNaN)); + EXPECT_FALSE(funcWrapper(func, neg_aNaN, neg_qnan_0x42)); + EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_snan_0x42)); + EXPECT_TRUE(funcWrapper(func, neg_qnan_0x42, neg_aNaN)); + EXPECT_FALSE(funcWrapper(func, neg_snan_0x42, neg_sNaN)); } } };