From 40da25f6a385dd6fc9fe2e999d773f530302a538 Mon Sep 17 00:00:00 2001 From: OverMighty Date: Tue, 4 Jun 2024 15:08:16 +0200 Subject: [PATCH] [libc][math][c23] Add copysignf16 C23 math function --- libc/config/linux/aarch64/entrypoints.txt | 1 + libc/config/linux/x86_64/entrypoints.txt | 1 + libc/docs/math/index.rst | 2 +- libc/spec/stdc.td | 1 + libc/src/math/CMakeLists.txt | 1 + libc/src/math/copysignf16.h | 20 +++++++++++++++++++ libc/src/math/generic/CMakeLists.txt | 13 ++++++++++++ libc/src/math/generic/copysignf16.cpp | 19 ++++++++++++++++++ libc/test/src/math/smoke/CMakeLists.txt | 18 +++++++++++++++++ libc/test/src/math/smoke/CopySignTest.h | 9 ++++++--- libc/test/src/math/smoke/copysignf16_test.cpp | 13 ++++++++++++ 11 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 libc/src/math/copysignf16.h create mode 100644 libc/src/math/generic/copysignf16.cpp create mode 100644 libc/test/src/math/smoke/copysignf16_test.cpp diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 3bbd1629e3d8d1..7a72fe9d968283 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -500,6 +500,7 @@ if(LIBC_TYPES_HAS_FLOAT16) list(APPEND TARGET_LIBM_ENTRYPOINTS # math.h C23 _Float16 entrypoints libc.src.math.ceilf16 + libc.src.math.copysignf16 libc.src.math.fabsf16 libc.src.math.floorf16 libc.src.math.roundf16 diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index 62434298890f06..192d679d7756c9 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -533,6 +533,7 @@ if(LIBC_TYPES_HAS_FLOAT16) list(APPEND TARGET_LIBM_ENTRYPOINTS # math.h C23 _Float16 entrypoints libc.src.math.ceilf16 + libc.src.math.copysignf16 libc.src.math.fabsf16 libc.src.math.floorf16 libc.src.math.roundf16 diff --git a/libc/docs/math/index.rst b/libc/docs/math/index.rst index 9df7dcfc256db0..09c2797f83fbbc 100644 --- a/libc/docs/math/index.rst +++ b/libc/docs/math/index.rst @@ -112,7 +112,7 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | canonicalize | |check| | |check| | |check| | | |check| | 7.12.11.7 | F.10.8.7 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| copysign | |check| | |check| | |check| | | |check| | 7.12.11.1 | F.10.8.1 | +| copysign | |check| | |check| | |check| | |check| | |check| | 7.12.11.1 | F.10.8.1 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | dadd | N/A | N/A | | N/A | | 7.12.14.1 | F.10.11 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ diff --git a/libc/spec/stdc.td b/libc/spec/stdc.td index cacc91ce8789a6..2439e9eef10da3 100644 --- a/libc/spec/stdc.td +++ b/libc/spec/stdc.td @@ -385,6 +385,7 @@ def StdC : StandardSpec<"stdc"> { FunctionSpec<"copysign", RetValSpec, [ArgSpec, ArgSpec]>, FunctionSpec<"copysignf", RetValSpec, [ArgSpec, ArgSpec]>, FunctionSpec<"copysignl", RetValSpec, [ArgSpec, ArgSpec]>, + GuardedFunctionSpec<"copysignf16", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT16">, GuardedFunctionSpec<"copysignf128", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT128">, FunctionSpec<"ceil", RetValSpec, [ArgSpec]>, diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index 3b07b0b8679c46..1c1593cf2cddd0 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -73,6 +73,7 @@ add_math_entrypoint_object(ceilf128) add_math_entrypoint_object(copysign) add_math_entrypoint_object(copysignf) add_math_entrypoint_object(copysignl) +add_math_entrypoint_object(copysignf16) add_math_entrypoint_object(copysignf128) add_math_entrypoint_object(cos) diff --git a/libc/src/math/copysignf16.h b/libc/src/math/copysignf16.h new file mode 100644 index 00000000000000..3ddde9fafaa707 --- /dev/null +++ b/libc/src/math/copysignf16.h @@ -0,0 +1,20 @@ +//===-- Implementation header for copysignf16 -------------------*- 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_COPYSIGNF16_H +#define LLVM_LIBC_SRC_MATH_COPYSIGNF16_H + +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE { + +float16 copysignf16(float16 x, float16 y); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_MATH_COPYSIGNF16_H diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 369616caa2565b..508f09c20422be 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -1147,6 +1147,19 @@ add_entrypoint_object( -O3 ) +add_entrypoint_object( + copysignf16 + SRCS + copysignf16.cpp + HDRS + ../copysignf16.h + DEPENDS + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.manipulation_functions + COMPILE_OPTIONS + -O3 +) + add_entrypoint_object( copysignf128 SRCS diff --git a/libc/src/math/generic/copysignf16.cpp b/libc/src/math/generic/copysignf16.cpp new file mode 100644 index 00000000000000..435c7e47338620 --- /dev/null +++ b/libc/src/math/generic/copysignf16.cpp @@ -0,0 +1,19 @@ +//===-- Implementation of copysignf16 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/copysignf16.h" +#include "src/__support/FPUtil/ManipulationFunctions.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(float16, copysignf16, (float16 x, float16 y)) { + return fputil::copysign(x, y); +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 685a53d8e7c6a4..0c5448468be3fe 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -894,6 +894,7 @@ add_fp_unittest( CopySignTest.h DEPENDS libc.src.math.copysign + libc.src.__support.CPP.algorithm libc.src.__support.FPUtil.fp_bits ) @@ -907,6 +908,7 @@ add_fp_unittest( CopySignTest.h DEPENDS libc.src.math.copysignf + libc.src.__support.CPP.algorithm libc.src.__support.FPUtil.fp_bits ) @@ -920,6 +922,21 @@ add_fp_unittest( CopySignTest.h DEPENDS libc.src.math.copysignl + libc.src.__support.CPP.algorithm + libc.src.__support.FPUtil.fp_bits +) + +add_fp_unittest( + copysignf16_test + SUITE + libc-math-smoke-tests + SRCS + copysignf16_test.cpp + HDRS + CopySignTest.h + DEPENDS + libc.src.math.copysignf16 + libc.src.__support.CPP.algorithm libc.src.__support.FPUtil.fp_bits ) @@ -933,6 +950,7 @@ add_fp_unittest( CopySignTest.h DEPENDS libc.src.math.copysignf128 + libc.src.__support.CPP.algorithm libc.src.__support.FPUtil.fp_bits ) diff --git a/libc/test/src/math/smoke/CopySignTest.h b/libc/test/src/math/smoke/CopySignTest.h index 1810560bf1bb8f..1eb323a3aa41fb 100644 --- a/libc/test/src/math/smoke/CopySignTest.h +++ b/libc/test/src/math/smoke/CopySignTest.h @@ -9,6 +9,7 @@ #ifndef LLVM_LIBC_TEST_SRC_MATH_SMOKE_COPYSIGNTEST_H #define LLVM_LIBC_TEST_SRC_MATH_SMOKE_COPYSIGNTEST_H +#include "src/__support/CPP/algorithm.h" #include "test/UnitTest/FEnvSafeTest.h" #include "test/UnitTest/FPMatcher.h" #include "test/UnitTest/Test.h" @@ -35,9 +36,11 @@ class CopySignTest : public LIBC_NAMESPACE::testing::FEnvSafeTest { } void testRange(CopySignFunc func) { - constexpr StorageType COUNT = 100'000; - constexpr StorageType STEP = STORAGE_MAX / COUNT; - for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) { + constexpr int COUNT = 100'000; + constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max( + static_cast(STORAGE_MAX / COUNT), StorageType(1)); + StorageType v = 0; + for (int i = 0; i <= COUNT; ++i, v += STEP) { FPBits x_bits = FPBits(v); T x = T(v); if (x_bits.is_nan() || x_bits.is_inf()) diff --git a/libc/test/src/math/smoke/copysignf16_test.cpp b/libc/test/src/math/smoke/copysignf16_test.cpp new file mode 100644 index 00000000000000..80a67f1d79ee6b --- /dev/null +++ b/libc/test/src/math/smoke/copysignf16_test.cpp @@ -0,0 +1,13 @@ +//===-- Unittests for copysignf16 -----------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "CopySignTest.h" + +#include "src/math/copysignf16.h" + +LIST_COPYSIGN_TESTS(float16, LIBC_NAMESPACE::copysignf16)