diff --git a/libc/config/gpu/entrypoints.txt b/libc/config/gpu/entrypoints.txt index 04a42c3019495a..97cc6b173b1097 100644 --- a/libc/config/gpu/entrypoints.txt +++ b/libc/config/gpu/entrypoints.txt @@ -282,6 +282,8 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.fmodf libc.src.math.frexp libc.src.math.frexpf + libc.src.math.getpayload + libc.src.math.getpayloadf libc.src.math.hypot libc.src.math.hypotf libc.src.math.ilogb diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 4ec75a5f69f166..147c625a008451 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -431,6 +431,8 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxl libc.src.math.fsqrt libc.src.math.fsqrtl + libc.src.math.getpayload + libc.src.math.getpayloadf libc.src.math.hypot libc.src.math.hypotf libc.src.math.ilogb @@ -630,6 +632,7 @@ if(LIBC_TYPES_HAS_FLOAT128) libc.src.math.frexpf128 libc.src.math.fromfpf128 libc.src.math.fromfpxf128 + libc.src.math.getpayloadf128 libc.src.math.ilogbf128 libc.src.math.ldexpf128 libc.src.math.llogbf128 diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt index 451213e7ce904a..f1e560faafa348 100644 --- a/libc/config/linux/arm/entrypoints.txt +++ b/libc/config/linux/arm/entrypoints.txt @@ -292,6 +292,8 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpx libc.src.math.fromfpxf libc.src.math.fromfpxl + libc.src.math.getpayload + libc.src.math.getpayloadf libc.src.math.hypot libc.src.math.hypotf libc.src.math.ilogb diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt index 084f899c2b957f..9262516eae4a90 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -453,6 +453,8 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxl libc.src.math.fsqrt libc.src.math.fsqrtl + libc.src.math.getpayload + libc.src.math.getpayloadf libc.src.math.hypot libc.src.math.hypotf libc.src.math.ilogb @@ -587,6 +589,7 @@ if(LIBC_TYPES_HAS_FLOAT128) libc.src.math.fromfpf128 libc.src.math.fromfpxf128 libc.src.math.fsqrtf128 + libc.src.math.getpayloadf128 libc.src.math.ilogbf128 libc.src.math.ldexpf128 libc.src.math.llogbf128 diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index dbd9cf07d6b7eb..59609c4b9a2084 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -453,6 +453,8 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.fromfpxl libc.src.math.fsqrt libc.src.math.fsqrtl + libc.src.math.getpayload + libc.src.math.getpayloadf libc.src.math.hypot libc.src.math.hypotf libc.src.math.ilogb @@ -674,6 +676,7 @@ if(LIBC_TYPES_HAS_FLOAT128) libc.src.math.fromfpf128 libc.src.math.fromfpxf128 libc.src.math.fsqrtf128 + libc.src.math.getpayloadf128 libc.src.math.ilogbf128 libc.src.math.ldexpf128 libc.src.math.llogbf128 diff --git a/libc/docs/math/index.rst b/libc/docs/math/index.rst index 3845e413a47e46..80342e98c34332 100644 --- a/libc/docs/math/index.rst +++ b/libc/docs/math/index.rst @@ -178,7 +178,7 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | fsub | N/A | | | N/A | | 7.12.14.2 | F.10.11 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| getpayload | | | | |check| | | F.10.13.1 | N/A | +| getpayload | |check| | |check| | | |check| | |check| | F.10.13.1 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | ilogb | |check| | |check| | |check| | |check| | |check| | 7.12.6.8 | F.10.3.8 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ diff --git a/libc/spec/stdc.td b/libc/spec/stdc.td index 6aaf05ffd9f65e..ef266cd652e578 100644 --- a/libc/spec/stdc.td +++ b/libc/spec/stdc.td @@ -733,7 +733,10 @@ def StdC : StandardSpec<"stdc"> { GuardedFunctionSpec<"totalordermagf16", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT16">, GuardedFunctionSpec<"totalordermagf128", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT128">, + FunctionSpec<"getpayload", RetValSpec, [ArgSpec]>, + FunctionSpec<"getpayloadf", RetValSpec, [ArgSpec]>, GuardedFunctionSpec<"getpayloadf16", RetValSpec, [ArgSpec], "LIBC_TYPES_HAS_FLOAT16">, + GuardedFunctionSpec<"getpayloadf128", RetValSpec, [ArgSpec], "LIBC_TYPES_HAS_FLOAT128">, FunctionSpec<"setpayload", RetValSpec, [ArgSpec, ArgSpec]>, FunctionSpec<"setpayloadf", RetValSpec, [ArgSpec, ArgSpec]>, diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index 7fd1e550fd5239..b9bc2ff79fd82d 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -254,7 +254,10 @@ add_math_entrypoint_object(fromfpxl) add_math_entrypoint_object(fromfpxf16) add_math_entrypoint_object(fromfpxf128) +add_math_entrypoint_object(getpayload) +add_math_entrypoint_object(getpayloadf) add_math_entrypoint_object(getpayloadf16) +add_math_entrypoint_object(getpayloadf128) add_math_entrypoint_object(hypot) add_math_entrypoint_object(hypotf) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index a4c1318f8a168a..4e18694faf2803 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -4103,6 +4103,30 @@ add_entrypoint_object( -O3 ) +add_entrypoint_object( + getpayload + SRCS + getpayload.cpp + HDRS + ../getpayload.h + DEPENDS + libc.src.__support.FPUtil.basic_operations + COMPILE_OPTIONS + -O3 +) + +add_entrypoint_object( + getpayloadf + SRCS + getpayloadf.cpp + HDRS + ../getpayloadf.h + DEPENDS + libc.src.__support.FPUtil.basic_operations + COMPILE_OPTIONS + -O3 +) + add_entrypoint_object( getpayloadf16 SRCS @@ -4116,6 +4140,19 @@ add_entrypoint_object( -O3 ) +add_entrypoint_object( + getpayloadf128 + SRCS + getpayloadf128.cpp + HDRS + ../getpayloadf128.h + DEPENDS + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.basic_operations + COMPILE_OPTIONS + -O3 +) + add_entrypoint_object( setpayload SRCS diff --git a/libc/src/math/generic/getpayload.cpp b/libc/src/math/generic/getpayload.cpp new file mode 100644 index 00000000000000..14d95516c42c35 --- /dev/null +++ b/libc/src/math/generic/getpayload.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of getpayload 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/getpayload.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(double, getpayload, (const double *x)) { + return fputil::getpayload(*x); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/getpayloadf.cpp b/libc/src/math/generic/getpayloadf.cpp new file mode 100644 index 00000000000000..22db186a8c354d --- /dev/null +++ b/libc/src/math/generic/getpayloadf.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of getpayloadf 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/getpayloadf.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(float, getpayloadf, (const float *x)) { + return fputil::getpayload(*x); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/generic/getpayloadf128.cpp b/libc/src/math/generic/getpayloadf128.cpp new file mode 100644 index 00000000000000..b57469eb7de911 --- /dev/null +++ b/libc/src/math/generic/getpayloadf128.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of getpayloadf128 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/getpayloadf128.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/common.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(float128, getpayloadf128, (const float128 *x)) { + return fputil::getpayload(*x); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/getpayload.h b/libc/src/math/getpayload.h new file mode 100644 index 00000000000000..b00d313c4da500 --- /dev/null +++ b/libc/src/math/getpayload.h @@ -0,0 +1,20 @@ +//===-- Implementation header for getpayload --------------------*- 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_GETPAYLOAD_H +#define LLVM_LIBC_SRC_MATH_GETPAYLOAD_H + +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +double getpayload(const double *x); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_GETPAYLOAD_H diff --git a/libc/src/math/getpayloadf.h b/libc/src/math/getpayloadf.h new file mode 100644 index 00000000000000..20901cd8bd98a3 --- /dev/null +++ b/libc/src/math/getpayloadf.h @@ -0,0 +1,20 @@ +//===-- Implementation header for getpayloadf -------------------*- 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_GETPAYLOADF_H +#define LLVM_LIBC_SRC_MATH_GETPAYLOADF_H + +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +float getpayloadf(const float *x); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_GETPAYLOADF_H diff --git a/libc/src/math/getpayloadf128.h b/libc/src/math/getpayloadf128.h new file mode 100644 index 00000000000000..7ebb4290d4f8a3 --- /dev/null +++ b/libc/src/math/getpayloadf128.h @@ -0,0 +1,21 @@ +//===-- Implementation header for getpayloadf128 ----------------*- 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_GETPAYLOADF128_H +#define LLVM_LIBC_SRC_MATH_GETPAYLOADF128_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +float128 getpayloadf128(const float128 *x); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_GETPAYLOADF128_H diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 36d66bf146a37b..3ee1e799deaee1 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -3762,6 +3762,30 @@ add_fp_unittest( libc.src.math.totalordermagf128 ) +add_fp_unittest( + getpayload_test + SUITE + libc-math-smoke-tests + SRCS + getpayload_test.cpp + HDRS + GetPayloadTest.h + DEPENDS + libc.src.math.getpayload +) + +add_fp_unittest( + getpayloadf_test + SUITE + libc-math-smoke-tests + SRCS + getpayloadf_test.cpp + HDRS + GetPayloadTest.h + DEPENDS + libc.src.math.getpayloadf +) + add_fp_unittest( getpayloadf16_test SUITE @@ -3774,6 +3798,18 @@ add_fp_unittest( libc.src.math.getpayloadf16 ) +add_fp_unittest( + getpayloadf128_test + SUITE + libc-math-smoke-tests + SRCS + getpayloadf128_test.cpp + HDRS + GetPayloadTest.h + DEPENDS + libc.src.math.getpayloadf128 +) + add_fp_unittest( setpayload_test SUITE diff --git a/libc/test/src/math/smoke/getpayload_test.cpp b/libc/test/src/math/smoke/getpayload_test.cpp new file mode 100644 index 00000000000000..f157d4572d09aa --- /dev/null +++ b/libc/test/src/math/smoke/getpayload_test.cpp @@ -0,0 +1,13 @@ +//===-- Unittests for getpayload ------------------------------------------===// +// +// 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/math/getpayload.h" + +LIST_GETPAYLOAD_TESTS(double, LIBC_NAMESPACE::getpayload) diff --git a/libc/test/src/math/smoke/getpayloadf128_test.cpp b/libc/test/src/math/smoke/getpayloadf128_test.cpp new file mode 100644 index 00000000000000..37bb506a3ed164 --- /dev/null +++ b/libc/test/src/math/smoke/getpayloadf128_test.cpp @@ -0,0 +1,13 @@ +//===-- Unittests for getpayloadf128 --------------------------------------===// +// +// 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/math/getpayloadf128.h" + +LIST_GETPAYLOAD_TESTS(float128, LIBC_NAMESPACE::getpayloadf128) diff --git a/libc/test/src/math/smoke/getpayloadf_test.cpp b/libc/test/src/math/smoke/getpayloadf_test.cpp new file mode 100644 index 00000000000000..89ed02487df043 --- /dev/null +++ b/libc/test/src/math/smoke/getpayloadf_test.cpp @@ -0,0 +1,13 @@ +//===-- Unittests for getpayloadf -----------------------------------------===// +// +// 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/math/getpayloadf.h" + +LIST_GETPAYLOAD_TESTS(float, LIBC_NAMESPACE::getpayloadf)