diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt index c2710429b3cfd..26ee82d99192f 100644 --- a/libc/config/baremetal/aarch64/entrypoints.txt +++ b/libc/config/baremetal/aarch64/entrypoints.txt @@ -787,6 +787,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 + libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt index 6e5389d542f80..00025d324fc2c 100644 --- a/libc/config/baremetal/arm/entrypoints.txt +++ b/libc/config/baremetal/arm/entrypoints.txt @@ -790,6 +790,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 + libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt index 76da24d2cc876..c0ab0cf903c41 100644 --- a/libc/config/baremetal/riscv/entrypoints.txt +++ b/libc/config/baremetal/riscv/entrypoints.txt @@ -790,6 +790,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 + libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt index 5bfd6c863fabb..cd81756770ed4 100644 --- a/libc/config/darwin/aarch64/entrypoints.txt +++ b/libc/config/darwin/aarch64/entrypoints.txt @@ -620,6 +620,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 + libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/config/darwin/x86_64/entrypoints.txt b/libc/config/darwin/x86_64/entrypoints.txt index 27d214d06cd0b..3aa54e027a42d 100644 --- a/libc/config/darwin/x86_64/entrypoints.txt +++ b/libc/config/darwin/x86_64/entrypoints.txt @@ -263,6 +263,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 + libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/config/gpu/amdgpu/entrypoints.txt b/libc/config/gpu/amdgpu/entrypoints.txt index bc75956738e5a..3b42c0fd71547 100644 --- a/libc/config/gpu/amdgpu/entrypoints.txt +++ b/libc/config/gpu/amdgpu/entrypoints.txt @@ -646,6 +646,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 + libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/config/gpu/nvptx/entrypoints.txt b/libc/config/gpu/nvptx/entrypoints.txt index c9688284df16c..b569327409849 100644 --- a/libc/config/gpu/nvptx/entrypoints.txt +++ b/libc/config/gpu/nvptx/entrypoints.txt @@ -647,6 +647,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 + libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index b6b1821e5707d..6483544d6b2a9 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -875,6 +875,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 + libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt index 60fc953c2b9f4..9002bd12d6733 100644 --- a/libc/config/linux/arm/entrypoints.txt +++ b/libc/config/linux/arm/entrypoints.txt @@ -490,6 +490,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 + libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt index 1a03683d72e61..d26c8ae2edf5b 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -893,6 +893,9 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index 5590f1a15ac57..20f4510326998 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -926,6 +926,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 + libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt index b97e893567038..ec2fde253e898 100644 --- a/libc/config/windows/entrypoints.txt +++ b/libc/config/windows/entrypoints.txt @@ -336,6 +336,10 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.nextafterbf16 + libc.src.math.nextdownbf16 + libc.src.math.nexttowardbf16 + libc.src.math.nextupbf16 libc.src.math.roundbf16 libc.src.math.roundevenbf16 libc.src.math.truncbf16 diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst index 9e328c7db1fc2..e9c63f4c02a48 100644 --- a/libc/docs/headers/math/index.rst +++ b/libc/docs/headers/math/index.rst @@ -215,13 +215,13 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | nearbyint | |check| | |check| | |check| | |check| | |check| | | 7.12.9.3 | F.10.6.3 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| nextafter | |check| | |check| | |check| | |check| | |check| | | 7.12.11.3 | F.10.8.3 | +| nextafter | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.11.3 | F.10.8.3 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| nextdown | |check| | |check| | |check| | |check| | |check| | | 7.12.11.6 | F.10.8.6 | +| nextdown | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.11.6 | F.10.8.6 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| nexttoward | |check| | |check| | |check| | |check| | N/A | | 7.12.11.4 | F.10.8.4 | +| nexttoward | |check| | |check| | |check| | |check| | N/A | |check| | 7.12.11.4 | F.10.8.4 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| nextup | |check| | |check| | |check| | |check| | |check| | | 7.12.11.5 | F.10.8.5 | +| nextup | |check| | |check| | |check| | |check| | |check| | |check| | 7.12.11.5 | F.10.8.5 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | remainder | |check| | |check| | |check| | |check| | |check| | | 7.12.10.2 | F.10.7.2 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index 766c60dc10423..c3875418082fb 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -433,23 +433,27 @@ add_math_entrypoint_object(nextafterf) add_math_entrypoint_object(nextafterl) add_math_entrypoint_object(nextafterf16) add_math_entrypoint_object(nextafterf128) +add_math_entrypoint_object(nextafterbf16) add_math_entrypoint_object(nexttoward) add_math_entrypoint_object(nexttowardf) add_math_entrypoint_object(nexttowardl) add_math_entrypoint_object(nexttowardf16) +add_math_entrypoint_object(nexttowardbf16) add_math_entrypoint_object(nextdown) add_math_entrypoint_object(nextdownf) add_math_entrypoint_object(nextdownl) add_math_entrypoint_object(nextdownf16) add_math_entrypoint_object(nextdownf128) +add_math_entrypoint_object(nextdownbf16) add_math_entrypoint_object(nextup) add_math_entrypoint_object(nextupf) add_math_entrypoint_object(nextupl) add_math_entrypoint_object(nextupf16) add_math_entrypoint_object(nextupf128) +add_math_entrypoint_object(nextupbf16) add_math_entrypoint_object(pow) add_math_entrypoint_object(powf) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 2bb4d44eddb8d..bd0fdc0de2357 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -3496,6 +3496,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.manipulation_functions ) +add_entrypoint_object( + nextafterbf16 + SRCS + nextafterbf16.cpp + HDRS + ../nextafterbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.manipulation_functions + libc.src.__support.macros.config + libc.src.__support.macros.properties.types +) + add_entrypoint_object( nexttoward SRCS @@ -3537,6 +3551,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.manipulation_functions ) +add_entrypoint_object( + nexttowardbf16 + SRCS + nexttowardbf16.cpp + HDRS + ../nexttowardbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.manipulation_functions + libc.src.__support.macros.config + libc.src.__support.macros.properties.types +) + add_entrypoint_object( nextdown SRCS @@ -3589,6 +3617,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.manipulation_functions ) +add_entrypoint_object( + nextdownbf16 + SRCS + nextdownbf16.cpp + HDRS + ../nextdownbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.manipulation_functions + libc.src.__support.macros.config + libc.src.__support.macros.properties.types +) + add_entrypoint_object( nextup SRCS @@ -3641,6 +3683,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.manipulation_functions ) +add_entrypoint_object( + nextupbf16 + SRCS + nextupbf16.cpp + HDRS + ../nextupbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.manipulation_functions + libc.src.__support.macros.config + libc.src.__support.macros.properties.types +) + add_entrypoint_object( fmod SRCS diff --git a/libc/src/math/generic/nextafterbf16.cpp b/libc/src/math/generic/nextafterbf16.cpp new file mode 100644 index 0000000000000..e21a2dcb3d664 --- /dev/null +++ b/libc/src/math/generic/nextafterbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of nextafterbf16 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/nextafterbf16.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, nextafterbf16, (bfloat16 x, bfloat16 y)) { + return fputil::nextafter(x, y); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/nextdownbf16.cpp b/libc/src/math/generic/nextdownbf16.cpp new file mode 100644 index 0000000000000..2115df95ff072 --- /dev/null +++ b/libc/src/math/generic/nextdownbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of nextdownbf16 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/nextdownbf16.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, nextdownbf16, (bfloat16 x)) { + return fputil::nextupdown(x); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/nexttowardbf16.cpp b/libc/src/math/generic/nexttowardbf16.cpp new file mode 100644 index 0000000000000..3deab87575939 --- /dev/null +++ b/libc/src/math/generic/nexttowardbf16.cpp @@ -0,0 +1,22 @@ +//===-- Implementation of nexttowardbf16 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/nexttowardbf16.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, nexttowardbf16, (bfloat16 x, long double y)) { + // nextafter where T != U is nexttoward + return fputil::nextafter(x, y); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/nextupbf16.cpp b/libc/src/math/generic/nextupbf16.cpp new file mode 100644 index 0000000000000..147ce37477d9f --- /dev/null +++ b/libc/src/math/generic/nextupbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of nextupbf16 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/nextupbf16.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, nextupbf16, (bfloat16 x)) { + return fputil::nextupdown(x); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/nextafterbf16.h b/libc/src/math/nextafterbf16.h new file mode 100644 index 0000000000000..f962c7c51e5cd --- /dev/null +++ b/libc/src/math/nextafterbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for nextafterbf16 -----------------*- 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_NEXTAFTERBF16_H +#define LLVM_LIBC_SRC_MATH_NEXTAFTERBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +bfloat16 nextafterbf16(bfloat16 x, bfloat16 y); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_NEXTAFTERBF16_H diff --git a/libc/src/math/nextdownbf16.h b/libc/src/math/nextdownbf16.h new file mode 100644 index 0000000000000..36b0cd7cb9626 --- /dev/null +++ b/libc/src/math/nextdownbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for nextdownbf16 ------------------*- 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_NEXTDOWNBF16_H +#define LLVM_LIBC_SRC_MATH_NEXTDOWNBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +bfloat16 nextdownbf16(bfloat16 x); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_NEXTDOWNBF16_H diff --git a/libc/src/math/nexttowardbf16.h b/libc/src/math/nexttowardbf16.h new file mode 100644 index 0000000000000..930abf858ef51 --- /dev/null +++ b/libc/src/math/nexttowardbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for nexttowardbf16 ----------------*- 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_NEXTTOWARDBF16_H +#define LLVM_LIBC_SRC_MATH_NEXTTOWARDBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +bfloat16 nexttowardbf16(bfloat16 x, long double y); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_NEXTTOWARDBF16_H diff --git a/libc/src/math/nextupbf16.h b/libc/src/math/nextupbf16.h new file mode 100644 index 0000000000000..872de84338d95 --- /dev/null +++ b/libc/src/math/nextupbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for nextupbf16 --------------------*- 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_NEXTUPBF16_H +#define LLVM_LIBC_SRC_MATH_NEXTUPBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +bfloat16 nextupbf16(bfloat16 x); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_NEXTUPBF16_H diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 4af8842b1a3c7..4be34adf468e8 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -3660,6 +3660,23 @@ add_fp_unittest( libc.src.__support.FPUtil.fp_bits ) +add_fp_unittest( + nextafterbf16_test + SUITE + libc-math-smoke-tests + SRCS + nextafterbf16_test.cpp + HDRS + NextAfterTest.h + DEPENDS + libc.hdr.fenv_macros + libc.src.math.nextafterbf16 + libc.src.__support.CPP.bit + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.fenv_impl + libc.src.__support.FPUtil.fp_bits +) + # FIXME: These tests are currently spurious for the GPU. if(NOT LIBC_TARGET_OS_IS_GPU) add_fp_unittest( @@ -3727,6 +3744,23 @@ add_fp_unittest( libc.src.__support.FPUtil.fp_bits ) +add_fp_unittest( + nexttowardbf16_test + SUITE + libc-math-smoke-tests + SRCS + nexttowardbf16_test.cpp + HDRS + NextTowardTest.h + DEPENDS + libc.hdr.fenv_macros + libc.src.math.nexttowardbf16 + libc.src.__support.CPP.bit + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.FPUtil.fenv_impl + libc.src.__support.FPUtil.fp_bits +) + add_fp_unittest( nextdown_test SUITE @@ -3787,6 +3821,19 @@ add_fp_unittest( libc.src.math.nextdownf128 ) +add_fp_unittest( + nextdownbf16_test + SUITE + libc-math-smoke-tests + SRCS + nextdownbf16_test.cpp + HDRS + NextDownTest.h + DEPENDS + libc.src.math.nextdownbf16 + libc.src.__support.FPUtil.bfloat16 +) + add_fp_unittest( nextup_test SUITE @@ -3847,6 +3894,19 @@ add_fp_unittest( libc.src.math.nextupf128 ) +add_fp_unittest( + nextupbf16_test + SUITE + libc-math-smoke-tests + SRCS + nextupbf16_test.cpp + HDRS + NextUpTest.h + DEPENDS + libc.src.math.nextupbf16 + libc.src.__support.FPUtil.bfloat16 +) + # TODO(lntue): The current implementation of fputil::general::fma is only # correctly rounded for the default rounding mode round-to-nearest tie-to-even. add_fp_unittest( diff --git a/libc/test/src/math/smoke/NextAfterTest.h b/libc/test/src/math/smoke/NextAfterTest.h index be27c9f188a72..b7e59f7cd8cfd 100644 --- a/libc/test/src/math/smoke/NextAfterTest.h +++ b/libc/test/src/math/smoke/NextAfterTest.h @@ -12,6 +12,7 @@ #include "src/__support/CPP/bit.h" #include "src/__support/FPUtil/FEnvImpl.h" #include "src/__support/FPUtil/FPBits.h" +#include "src/__support/sign.h" #include "test/UnitTest/FEnvSafeTest.h" #include "test/UnitTest/FPMatcher.h" #include "test/UnitTest/Test.h" @@ -42,6 +43,8 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { const T neg_inf = FPBits::inf(Sign::NEG).get_val(); const T zero = FPBits::zero(Sign::POS).get_val(); const T neg_zero = FPBits::zero(Sign::NEG).get_val(); + const T one = FPBits::one(Sign::POS).get_val(); + const T neg_one = FPBits::one(Sign::NEG).get_val(); const T nan = FPBits::quiet_nan().get_val(); static constexpr StorageType min_subnormal = @@ -55,8 +58,8 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { typedef T (*NextAfterFunc)(T, T); void testNaN(NextAfterFunc func) { - ASSERT_FP_EQ(func(nan, 0), nan); - ASSERT_FP_EQ(func(0, nan), nan); + ASSERT_FP_EQ(func(nan, zero), nan); + ASSERT_FP_EQ(func(zero, nan), nan); } void testBoundaries(NextAfterFunc func) { @@ -65,68 +68,68 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { // 'from' is zero|neg_zero. T x = zero; - T result = func(x, T(1)); + T result = func(x, one); StorageType expected_bits = 1; T expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected); - result = func(x, T(-1)); + result = func(x, neg_one); expected_bits = FPBits::SIGN_MASK + 1; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected); x = neg_zero; - result = func(x, 1); + result = func(x, one); expected_bits = 1; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected); - result = func(x, -1); + result = func(x, neg_one); expected_bits = FPBits::SIGN_MASK + 1; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected); // 'from' is max subnormal value. x = LIBC_NAMESPACE::cpp::bit_cast(max_subnormal); - result = func(x, 1); + result = func(x, one); expected = LIBC_NAMESPACE::cpp::bit_cast(min_normal); ASSERT_FP_EQ(result, expected); - result = func(x, 0); + result = func(x, zero); expected_bits = max_subnormal - 1; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected); x = -x; - result = func(x, -1); + result = func(x, neg_one); expected_bits = FPBits::SIGN_MASK + min_normal; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ(result, expected); - result = func(x, 0); + result = func(x, zero); expected_bits = FPBits::SIGN_MASK + max_subnormal - 1; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected); // 'from' is min subnormal value. x = LIBC_NAMESPACE::cpp::bit_cast(min_subnormal); - result = func(x, 1); + result = func(x, one); expected_bits = min_subnormal + 1; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected); - ASSERT_FP_EQ_WITH_UNDERFLOW(func(x, 0), zero); + ASSERT_FP_EQ_WITH_UNDERFLOW(func(x, zero), zero); x = -x; - result = func(x, -1); + result = func(x, neg_one); expected_bits = FPBits::SIGN_MASK + min_subnormal + 1; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected); - ASSERT_FP_EQ_WITH_UNDERFLOW(func(x, 0), T(-0.0)); + ASSERT_FP_EQ_WITH_UNDERFLOW(func(x, zero), neg_zero); // 'from' is min normal. x = LIBC_NAMESPACE::cpp::bit_cast(min_normal); - result = func(x, 0); + result = func(x, zero); expected_bits = max_subnormal; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected); @@ -137,7 +140,7 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { ASSERT_FP_EQ(result, expected); x = -x; - result = func(x, 0); + result = func(x, zero); expected_bits = FPBits::SIGN_MASK + max_subnormal; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected); @@ -157,14 +160,14 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { // 'from' is infinity. x = inf; - result = func(x, 0); + result = func(x, zero); expected_bits = max_normal; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ(result, expected); ASSERT_FP_EQ(func(x, inf), inf); x = neg_inf; - result = func(x, 0); + result = func(x, zero); expected_bits = FPBits::SIGN_MASK + max_normal; expected = LIBC_NAMESPACE::cpp::bit_cast(expected_bits); ASSERT_FP_EQ(result, expected); @@ -172,7 +175,7 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { // 'from' is a power of 2. x = T(32.0); - result = func(x, 0); + result = func(x, zero); FPBits x_bits = FPBits(x); FPBits result_bits = FPBits(result); ASSERT_EQ(result_bits.get_biased_exponent(), @@ -187,7 +190,7 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { x = -x; - result = func(x, 0); + result = func(x, zero); result_bits = FPBits(result); ASSERT_EQ(result_bits.get_biased_exponent(), uint16_t(x_bits.get_biased_exponent() - 1)); diff --git a/libc/test/src/math/smoke/NextTowardTest.h b/libc/test/src/math/smoke/NextTowardTest.h index d2f352cdcbdf7..43e71c6a2d8f6 100644 --- a/libc/test/src/math/smoke/NextTowardTest.h +++ b/libc/test/src/math/smoke/NextTowardTest.h @@ -62,8 +62,8 @@ class NextTowardTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { typedef T (*NextTowardFunc)(T, long double); void testNaN(NextTowardFunc func) { - ASSERT_FP_EQ(func(nan, 0), nan); - ASSERT_FP_EQ(func(0, to_nan), nan); + ASSERT_FP_EQ(func(nan, to_zero), nan); + ASSERT_FP_EQ(func(zero, to_nan), nan); } void testBoundaries(NextTowardFunc func) { diff --git a/libc/test/src/math/smoke/nextafterbf16_test.cpp b/libc/test/src/math/smoke/nextafterbf16_test.cpp new file mode 100644 index 0000000000000..b73a3cbef0b74 --- /dev/null +++ b/libc/test/src/math/smoke/nextafterbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for nextafterbf16 ---------------------------------------===// +// +// 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 "NextAfterTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/nextafterbf16.h" + +LIST_NEXTAFTER_TESTS(bfloat16, LIBC_NAMESPACE::nextafterbf16) diff --git a/libc/test/src/math/smoke/nextdownbf16_test.cpp b/libc/test/src/math/smoke/nextdownbf16_test.cpp new file mode 100644 index 0000000000000..300206461e2de --- /dev/null +++ b/libc/test/src/math/smoke/nextdownbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for nextdownbf16 ----------------------------------------===// +// +// 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 "NextDownTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/nextdownbf16.h" + +LIST_NEXTDOWN_TESTS(bfloat16, LIBC_NAMESPACE::nextdownbf16) diff --git a/libc/test/src/math/smoke/nexttowardbf16_test.cpp b/libc/test/src/math/smoke/nexttowardbf16_test.cpp new file mode 100644 index 0000000000000..c1f35fcb96ef6 --- /dev/null +++ b/libc/test/src/math/smoke/nexttowardbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for nexttowardbf16 --------------------------------------===// +// +// 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 "NextTowardTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/nexttowardbf16.h" + +LIST_NEXTTOWARD_TESTS(bfloat16, LIBC_NAMESPACE::nexttowardbf16) diff --git a/libc/test/src/math/smoke/nextupbf16_test.cpp b/libc/test/src/math/smoke/nextupbf16_test.cpp new file mode 100644 index 0000000000000..49ad2f70b12a8 --- /dev/null +++ b/libc/test/src/math/smoke/nextupbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for nextupbf16 ------------------------------------------===// +// +// 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 "NextUpTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/nextupbf16.h" + +LIST_NEXTUP_TESTS(bfloat16, LIBC_NAMESPACE::nextupbf16)