[libc-commits] [libc] de6bd15 - [libc][math][c++23] Add {get, set}payloadbf16 and setpayloadsigbf16 math functions (#153994)
via libc-commits
libc-commits at lists.llvm.org
Fri Aug 22 12:32:05 PDT 2025
Author: Krishna Pandey
Date: 2025-08-23T01:02:02+05:30
New Revision: de6bd152b904eec27764bf238b57fbecd2df5758
URL: https://github.com/llvm/llvm-project/commit/de6bd152b904eec27764bf238b57fbecd2df5758
DIFF: https://github.com/llvm/llvm-project/commit/de6bd152b904eec27764bf238b57fbecd2df5758.diff
LOG: [libc][math][c++23] Add {get,set}payloadbf16 and setpayloadsigbf16 math functions (#153994)
This PR adds the following basic math functions for BFloat16 type along
with the tests:
- getpayloadbf16
- setpayloadbf16
- setpayloadsigbf16
---------
Signed-off-by: Krishna Pandey <kpandey81930 at gmail.com>
Added:
libc/src/math/generic/getpayloadbf16.cpp
libc/src/math/generic/setpayloadbf16.cpp
libc/src/math/generic/setpayloadsigbf16.cpp
libc/src/math/getpayloadbf16.h
libc/src/math/setpayloadbf16.h
libc/src/math/setpayloadsigbf16.h
libc/test/src/math/smoke/getpayloadbf16_test.cpp
libc/test/src/math/smoke/setpayloadbf16_test.cpp
libc/test/src/math/smoke/setpayloadsigbf16_test.cpp
Modified:
libc/config/baremetal/aarch64/entrypoints.txt
libc/config/baremetal/arm/entrypoints.txt
libc/config/baremetal/riscv/entrypoints.txt
libc/config/darwin/aarch64/entrypoints.txt
libc/config/darwin/x86_64/entrypoints.txt
libc/config/gpu/amdgpu/entrypoints.txt
libc/config/gpu/nvptx/entrypoints.txt
libc/config/linux/aarch64/entrypoints.txt
libc/config/linux/arm/entrypoints.txt
libc/config/linux/riscv/entrypoints.txt
libc/config/linux/x86_64/entrypoints.txt
libc/config/windows/entrypoints.txt
libc/docs/headers/math/index.rst
libc/src/__support/FPUtil/bfloat16.h
libc/src/math/CMakeLists.txt
libc/src/math/generic/CMakeLists.txt
libc/test/src/math/smoke/CMakeLists.txt
libc/test/src/math/smoke/GetPayloadTest.h
libc/test/src/math/smoke/SetPayloadSigTest.h
libc/test/src/math/smoke/SetPayloadTest.h
Removed:
################################################################################
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 <typename T> LIBC_INLINE constexpr explicit BFloat16(T value) {
if constexpr (cpp::is_floating_point_v<T>) {
bits = fputil::cast<bfloat16>(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<int>(fputil::setpayload</*IsSignaling=*/false>(*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<int>(fputil::setpayload</*IsSignaling=*/true>(*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)
More information about the libc-commits
mailing list