diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt index 26ee82d99192f..5f72793beecb4 100644 --- a/libc/config/baremetal/aarch64/entrypoints.txt +++ b/libc/config/baremetal/aarch64/entrypoints.txt @@ -787,12 +787,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 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 00025d324fc2c..244dd2e87b1fd 100644 --- a/libc/config/baremetal/arm/entrypoints.txt +++ b/libc/config/baremetal/arm/entrypoints.txt @@ -790,12 +790,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 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 c0ab0cf903c41..32980c4a1d222 100644 --- a/libc/config/baremetal/riscv/entrypoints.txt +++ b/libc/config/baremetal/riscv/entrypoints.txt @@ -790,12 +790,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 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 cd81756770ed4..3684713474cbc 100644 --- a/libc/config/darwin/aarch64/entrypoints.txt +++ b/libc/config/darwin/aarch64/entrypoints.txt @@ -620,12 +620,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 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 3aa54e027a42d..7482a80c37d33 100644 --- a/libc/config/darwin/x86_64/entrypoints.txt +++ b/libc/config/darwin/x86_64/entrypoints.txt @@ -263,12 +263,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 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 3b42c0fd71547..a88c74be2997a 100644 --- a/libc/config/gpu/amdgpu/entrypoints.txt +++ b/libc/config/gpu/amdgpu/entrypoints.txt @@ -646,12 +646,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 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 f8baab00d7ab3..d10b820caeeac 100644 --- a/libc/config/gpu/nvptx/entrypoints.txt +++ b/libc/config/gpu/nvptx/entrypoints.txt @@ -648,12 +648,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 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 6483544d6b2a9..b1fdee76af934 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -875,12 +875,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 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 9002bd12d6733..8f21976e9e88e 100644 --- a/libc/config/linux/arm/entrypoints.txt +++ b/libc/config/linux/arm/entrypoints.txt @@ -490,12 +490,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 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 d26c8ae2edf5b..69d7519118198 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -893,11 +893,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 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 20f4510326998..786c16dac5b06 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -926,12 +926,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt index ec2fde253e898..541d9fee1adf5 100644 --- a/libc/config/windows/entrypoints.txt +++ b/libc/config/windows/entrypoints.txt @@ -336,12 +336,15 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS libc.src.math.fminimum_numbf16 libc.src.math.fromfpbf16 libc.src.math.fromfpxbf16 + libc.src.math.getpayloadbf16 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.setpayloadbf16 + libc.src.math.setpayloadsigbf16 libc.src.math.truncbf16 libc.src.math.ufromfpbf16 libc.src.math.ufromfpxbf16 diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst index e9c63f4c02a48..4d6e0cc4c88f1 100644 --- a/libc/docs/headers/math/index.rst +++ b/libc/docs/headers/math/index.rst @@ -187,7 +187,7 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | fsub | N/A | |check| | |check| | N/A | |check|\* | N/A | 7.12.14.2 | F.10.11 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| getpayload | |check| | |check| | |check| | |check| | |check| | | F.10.13.1 | N/A | +| getpayload | |check| | |check| | |check| | |check| | |check| | |check| | F.10.13.1 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | ilogb | |check| | |check| | |check| | |check| | |check| | | 7.12.6.8 | F.10.3.8 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ @@ -237,9 +237,9 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ | scalbn | |check| | |check| | |check| | |check| | |check| | | 7.12.6.19 | F.10.3.19 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| setpayload | |check| | |check| | |check| | |check| | |check| | | F.10.13.2 | N/A | +| setpayload | |check| | |check| | |check| | |check| | |check| | |check| | F.10.13.2 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ -| setpayloadsig | |check| | |check| | |check| | |check| | |check| | | F.10.13.3 | N/A | +| 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 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+ diff --git a/libc/src/__support/FPUtil/bfloat16.h b/libc/src/__support/FPUtil/bfloat16.h index 3fab2b80317de..f74fa0c2bef5a 100644 --- a/libc/src/__support/FPUtil/bfloat16.h +++ b/libc/src/__support/FPUtil/bfloat16.h @@ -29,8 +29,6 @@ struct BFloat16 { LIBC_INLINE BFloat16() = default; - LIBC_INLINE constexpr explicit BFloat16(uint16_t bits) : bits(bits) {} - template LIBC_INLINE constexpr explicit BFloat16(T value) { if constexpr (cpp::is_floating_point_v) { bits = fputil::cast(value).bits; diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index c3875418082fb..d3afce514a000 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -332,6 +332,7 @@ add_math_entrypoint_object(getpayloadf) add_math_entrypoint_object(getpayloadl) add_math_entrypoint_object(getpayloadf16) add_math_entrypoint_object(getpayloadf128) +add_math_entrypoint_object(getpayloadbf16) add_math_entrypoint_object(hypot) add_math_entrypoint_object(hypotf) @@ -509,12 +510,14 @@ add_math_entrypoint_object(setpayloadf) add_math_entrypoint_object(setpayloadl) add_math_entrypoint_object(setpayloadf16) add_math_entrypoint_object(setpayloadf128) +add_math_entrypoint_object(setpayloadbf16) add_math_entrypoint_object(setpayloadsig) add_math_entrypoint_object(setpayloadsigf) add_math_entrypoint_object(setpayloadsigl) add_math_entrypoint_object(setpayloadsigf16) add_math_entrypoint_object(setpayloadsigf128) +add_math_entrypoint_object(setpayloadsigbf16) add_math_entrypoint_object(sincos) add_math_entrypoint_object(sincosf) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 0c926370deadd..fd3442f912172 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -4609,6 +4609,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.basic_operations ) +add_entrypoint_object( + getpayloadbf16 + SRCS + getpayloadbf16.cpp + HDRS + ../getpayloadbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.macros.config + libc.src.__support.macros.properties.types +) + add_entrypoint_object( setpayload SRCS @@ -4661,6 +4675,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.basic_operations ) +add_entrypoint_object( + setpayloadbf16 + SRCS + setpayloadbf16.cpp + HDRS + ../setpayloadbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.macros.config + libc.src.__support.macros.properties.types +) + add_entrypoint_object( setpayloadsig SRCS @@ -4713,6 +4741,20 @@ add_entrypoint_object( libc.src.__support.FPUtil.basic_operations ) +add_entrypoint_object( + setpayloadsigbf16 + SRCS + setpayloadsigbf16.cpp + HDRS + ../setpayloadsigbf16.h + DEPENDS + libc.src.__support.common + libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.bfloat16 + libc.src.__support.macros.config + libc.src.__support.macros.properties.types +) + add_entrypoint_object( f16add SRCS diff --git a/libc/src/math/generic/getpayloadbf16.cpp b/libc/src/math/generic/getpayloadbf16.cpp new file mode 100644 index 0000000000000..544ed0a2f5c9d --- /dev/null +++ b/libc/src/math/generic/getpayloadbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of getpayloadbf16 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/getpayloadbf16.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, getpayloadbf16, (const bfloat16 *x)) { + return fputil::getpayload(*x); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/setpayloadbf16.cpp b/libc/src/math/generic/setpayloadbf16.cpp new file mode 100644 index 0000000000000..49f9b9cabd6a2 --- /dev/null +++ b/libc/src/math/generic/setpayloadbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of setpayloadbf16 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/setpayloadbf16.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, setpayloadbf16, (bfloat16 * res, bfloat16 pl)) { + return static_cast(fputil::setpayload(*res, pl)); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/setpayloadsigbf16.cpp b/libc/src/math/generic/setpayloadsigbf16.cpp new file mode 100644 index 0000000000000..7a2b7c7dc66dd --- /dev/null +++ b/libc/src/math/generic/setpayloadsigbf16.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of setpayloadsigbf16 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/setpayloadsigbf16.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, setpayloadsigbf16, (bfloat16 * res, bfloat16 pl)) { + return static_cast(fputil::setpayload(*res, pl)); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/getpayloadbf16.h b/libc/src/math/getpayloadbf16.h new file mode 100644 index 0000000000000..e4767f0728139 --- /dev/null +++ b/libc/src/math/getpayloadbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for getpayloadbf16 ----------------*- 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_GETPAYLOADBF16_H +#define LLVM_LIBC_SRC_MATH_GETPAYLOADBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +bfloat16 getpayloadbf16(const bfloat16 *x); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_GETPAYLOADBF16_H diff --git a/libc/src/math/setpayloadbf16.h b/libc/src/math/setpayloadbf16.h new file mode 100644 index 0000000000000..e3a60b2f2e021 --- /dev/null +++ b/libc/src/math/setpayloadbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for setpayloadbf16 ----------------*- 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_SETPAYLOADBF16_H +#define LLVM_LIBC_SRC_MATH_SETPAYLOADBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +int setpayloadbf16(bfloat16 *res, bfloat16 pl); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_SETPAYLOADBF16_H diff --git a/libc/src/math/setpayloadsigbf16.h b/libc/src/math/setpayloadsigbf16.h new file mode 100644 index 0000000000000..5baba95b45758 --- /dev/null +++ b/libc/src/math/setpayloadsigbf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for setpayloadsigbf16 -------------*- 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_SETPAYLOADSIGBF16_H +#define LLVM_LIBC_SRC_MATH_SETPAYLOADSIGBF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +int setpayloadsigbf16(bfloat16 *res, bfloat16 pl); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_SETPAYLOADSIGBF16_H diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 4be34adf468e8..a44f237cf0aad 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -4873,6 +4873,19 @@ add_fp_unittest( libc.src.math.getpayloadf128 ) +add_fp_unittest( + getpayloadbf16_test + SUITE + libc-math-smoke-tests + SRCS + getpayloadbf16_test.cpp + HDRS + GetPayloadTest.h + DEPENDS + libc.src.math.getpayloadbf16 + libc.src.__support.FPUtil.bfloat16 +) + add_fp_unittest( setpayload_test SUITE @@ -4933,6 +4946,19 @@ add_fp_unittest( libc.src.math.setpayloadf128 ) +add_fp_unittest( + setpayloadbf16_test + SUITE + libc-math-smoke-tests + SRCS + setpayloadbf16_test.cpp + HDRS + SetPayloadTest.h + DEPENDS + libc.src.math.setpayloadbf16 + libc.src.__support.FPUtil.bfloat16 +) + add_fp_unittest( setpayloadsig_test SUITE @@ -4993,6 +5019,18 @@ add_fp_unittest( libc.src.math.setpayloadsigf128 ) +add_fp_unittest( + setpayloadsigbf16_test + SUITE + libc-math-smoke-tests + SRCS + setpayloadsigbf16_test.cpp + HDRS + SetPayloadTest.h + DEPENDS + libc.src.math.setpayloadsigbf16 + libc.src.__support.FPUtil.bfloat16 +) add_fp_unittest( f16add_test diff --git a/libc/test/src/math/smoke/GetPayloadTest.h b/libc/test/src/math/smoke/GetPayloadTest.h index 1b1bf4f5d56ff..486ea42bf50c1 100644 --- a/libc/test/src/math/smoke/GetPayloadTest.h +++ b/libc/test/src/math/smoke/GetPayloadTest.h @@ -51,23 +51,50 @@ class GetPayloadTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { EXPECT_FP_EQ(default_snan_payload, funcWrapper(func, sNaN)); EXPECT_FP_EQ(default_snan_payload, funcWrapper(func, neg_sNaN)); - T qnan_42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val(); - T neg_qnan_42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val(); - T snan_42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val(); - T neg_snan_42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val(); - EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, qnan_42)); - EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_qnan_42)); - EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, snan_42)); - EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_snan_42)); - - T qnan_123 = FPBits::quiet_nan(Sign::POS, 0x123).get_val(); - T neg_qnan_123 = FPBits::quiet_nan(Sign::NEG, 0x123).get_val(); - T snan_123 = FPBits::signaling_nan(Sign::POS, 0x123).get_val(); - T neg_snan_123 = FPBits::signaling_nan(Sign::NEG, 0x123).get_val(); - EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, qnan_123)); - EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_qnan_123)); - EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, snan_123)); - EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_snan_123)); + if constexpr (FPBits::FRACTION_LEN - 1 >= 6) { + // [S] [E..E] [QM..M] -> number of M bits should be at least 6 + // 0x31 = 0b110001 = 6 bits + T qnan_31 = FPBits::quiet_nan(Sign::POS, 0x31).get_val(); + T neg_qnan_31 = FPBits::quiet_nan(Sign::NEG, 0x31).get_val(); + T snan_31 = FPBits::signaling_nan(Sign::POS, 0x31).get_val(); + T neg_snan_31 = FPBits::signaling_nan(Sign::NEG, 0x31).get_val(); + EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, qnan_31)); + EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, neg_qnan_31)); + EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, snan_31)); + EXPECT_FP_EQ(T(0x31.0p+0), funcWrapper(func, neg_snan_31)); + + // 0x15 = 0b10101 = 5 bits + T qnan_15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val(); + T neg_qnan_15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val(); + T snan_15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val(); + T neg_snan_15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val(); + EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, qnan_15)); + EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, neg_qnan_15)); + EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, snan_15)); + EXPECT_FP_EQ(T(0x15.0p+0), funcWrapper(func, neg_snan_15)); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + T qnan_42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val(); + T neg_qnan_42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val(); + T snan_42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val(); + T neg_snan_42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val(); + EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, qnan_42)); + EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_qnan_42)); + EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, snan_42)); + EXPECT_FP_EQ(T(0x42.0p+0), funcWrapper(func, neg_snan_42)); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 9) { + T qnan_123 = FPBits::quiet_nan(Sign::POS, 0x123).get_val(); + T neg_qnan_123 = FPBits::quiet_nan(Sign::NEG, 0x123).get_val(); + T snan_123 = FPBits::signaling_nan(Sign::POS, 0x123).get_val(); + T neg_snan_123 = FPBits::signaling_nan(Sign::NEG, 0x123).get_val(); + EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, qnan_123)); + EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_qnan_123)); + EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, snan_123)); + EXPECT_FP_EQ(T(0x123.0p+0), funcWrapper(func, neg_snan_123)); + } } }; diff --git a/libc/test/src/math/smoke/SetPayloadSigTest.h b/libc/test/src/math/smoke/SetPayloadSigTest.h index f480479618a08..7b26c98b7ee35 100644 --- a/libc/test/src/math/smoke/SetPayloadSigTest.h +++ b/libc/test/src/math/smoke/SetPayloadSigTest.h @@ -54,15 +54,31 @@ class SetPayloadSigTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 1).uintval(), FPBits(res).uintval()); - EXPECT_EQ(0, func(&res, T(0x42.0p+0))); - EXPECT_TRUE(FPBits(res).is_signaling_nan()); - EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x42).uintval(), - FPBits(res).uintval()); - - EXPECT_EQ(0, func(&res, T(0x123.0p+0))); - EXPECT_TRUE(FPBits(res).is_signaling_nan()); - EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x123).uintval(), - FPBits(res).uintval()); + if constexpr (FPBits::FRACTION_LEN - 1 >= 6) { + EXPECT_EQ(0, func(&res, T(0x31.0p+0))); + EXPECT_TRUE(FPBits(res).is_signaling_nan()); + EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x31).uintval(), + FPBits(res).uintval()); + + EXPECT_EQ(0, func(&res, T(0x15.0p+0))); + EXPECT_TRUE(FPBits(res).is_signaling_nan()); + EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x15).uintval(), + FPBits(res).uintval()); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + EXPECT_EQ(0, func(&res, T(0x42.0p+0))); + EXPECT_TRUE(FPBits(res).is_signaling_nan()); + EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x42).uintval(), + FPBits(res).uintval()); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 9) { + EXPECT_EQ(0, func(&res, T(0x123.0p+0))); + EXPECT_TRUE(FPBits(res).is_signaling_nan()); + EXPECT_EQ(FPBits::signaling_nan(Sign::POS, 0x123).uintval(), + FPBits(res).uintval()); + } FPBits nan_payload_bits = FPBits::one(); nan_payload_bits.set_biased_exponent(FPBits::FRACTION_LEN - 2 + diff --git a/libc/test/src/math/smoke/SetPayloadTest.h b/libc/test/src/math/smoke/SetPayloadTest.h index 9ede5678fef1b..b86b3250f03a8 100644 --- a/libc/test/src/math/smoke/SetPayloadTest.h +++ b/libc/test/src/math/smoke/SetPayloadTest.h @@ -54,15 +54,33 @@ class SetPayloadTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { EXPECT_TRUE(FPBits(res).is_quiet_nan()); EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 1).uintval(), FPBits(res).uintval()); - EXPECT_EQ(0, func(&res, T(0x42.0p+0))); - EXPECT_TRUE(FPBits(res).is_quiet_nan()); - EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x42).uintval(), - FPBits(res).uintval()); - - EXPECT_EQ(0, func(&res, T(0x123.0p+0))); - EXPECT_TRUE(FPBits(res).is_quiet_nan()); - EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x123).uintval(), - FPBits(res).uintval()); + if constexpr (FPBits::FRACTION_LEN - 1 >= 5) { + EXPECT_EQ(0, func(&res, T(0x15.0p+0))); + EXPECT_TRUE(FPBits(res).is_quiet_nan()); + EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x15).uintval(), + FPBits(res).uintval()); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 6) { + EXPECT_EQ(0, func(&res, T(0x31.0p+0))); + EXPECT_TRUE(FPBits(res).is_quiet_nan()); + EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x31).uintval(), + FPBits(res).uintval()); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 7) { + EXPECT_EQ(0, func(&res, T(0x42.0p+0))); + EXPECT_TRUE(FPBits(res).is_quiet_nan()); + EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x42).uintval(), + FPBits(res).uintval()); + } + + if constexpr (FPBits::FRACTION_LEN - 1 >= 9) { + EXPECT_EQ(0, func(&res, T(0x123.0p+0))); + EXPECT_TRUE(FPBits(res).is_quiet_nan()); + EXPECT_EQ(FPBits::quiet_nan(Sign::POS, 0x123).uintval(), + FPBits(res).uintval()); + } // The following code is creating a NaN payload manually to prevent a // conversion from BigInt to float128. diff --git a/libc/test/src/math/smoke/getpayloadbf16_test.cpp b/libc/test/src/math/smoke/getpayloadbf16_test.cpp new file mode 100644 index 0000000000000..51a5fad88cd97 --- /dev/null +++ b/libc/test/src/math/smoke/getpayloadbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for getpayloadbf16 --------------------------------------===// +// +// 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 "GetPayloadTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/getpayloadbf16.h" + +LIST_GETPAYLOAD_TESTS(bfloat16, LIBC_NAMESPACE::getpayloadbf16) diff --git a/libc/test/src/math/smoke/setpayloadbf16_test.cpp b/libc/test/src/math/smoke/setpayloadbf16_test.cpp new file mode 100644 index 0000000000000..198b454ed78b0 --- /dev/null +++ b/libc/test/src/math/smoke/setpayloadbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for setpayloadbf16 --------------------------------------===// +// +// 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 "SetPayloadTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/setpayloadbf16.h" + +LIST_SETPAYLOAD_TESTS(bfloat16, LIBC_NAMESPACE::setpayloadbf16) diff --git a/libc/test/src/math/smoke/setpayloadsigbf16_test.cpp b/libc/test/src/math/smoke/setpayloadsigbf16_test.cpp new file mode 100644 index 0000000000000..aa6a3e9dcbf2f --- /dev/null +++ b/libc/test/src/math/smoke/setpayloadsigbf16_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for setpayloadsigbf16 -----------------------------------===// +// +// 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 "SetPayloadSigTest.h" + +#include "src/__support/FPUtil/bfloat16.h" +#include "src/math/setpayloadsigbf16.h" + +LIST_SETPAYLOADSIG_TESTS(bfloat16, LIBC_NAMESPACE::setpayloadsigbf16)