From 7683a16dbf4b676236c7698680de92d6510c2399 Mon Sep 17 00:00:00 2001 From: OverMighty Date: Mon, 10 Jun 2024 17:02:09 +0200 Subject: [libc][math][c23] Add {remainder,remquo}f16 C23 math functions (#94773) Part of #93566. --- libc/config/linux/aarch64/entrypoints.txt | 2 ++ libc/config/linux/x86_64/entrypoints.txt | 2 ++ libc/docs/math/index.rst | 4 +-- libc/spec/stdc.td | 8 +++--- libc/src/__support/FPUtil/NormalFloat.h | 2 +- libc/src/math/CMakeLists.txt | 2 ++ libc/src/math/generic/CMakeLists.txt | 38 ++++++++++++++++++++++++----- libc/src/math/generic/remainderf16.cpp | 20 +++++++++++++++ libc/src/math/generic/remquof16.cpp | 19 +++++++++++++++ libc/src/math/remainderf16.h | 20 +++++++++++++++ libc/src/math/remquof16.h | 20 +++++++++++++++ libc/test/src/math/smoke/CMakeLists.txt | 16 +++++++++--- libc/test/src/math/smoke/RemQuoTest.h | 2 -- libc/test/src/math/smoke/remquof16_test.cpp | 13 ++++++++++ 14 files changed, 151 insertions(+), 17 deletions(-) create mode 100644 libc/src/math/generic/remainderf16.cpp create mode 100644 libc/src/math/generic/remquof16.cpp create mode 100644 libc/src/math/remainderf16.h create mode 100644 libc/src/math/remquof16.h create mode 100644 libc/test/src/math/smoke/remquof16_test.cpp (limited to 'libc') diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 8863749..381061ce3 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -536,6 +536,8 @@ if(LIBC_TYPES_HAS_FLOAT16) # clang-12 and after: https://godbolt.org/z/8ceT9454c # libc.src.math.nexttowardf16 libc.src.math.nextupf16 + libc.src.math.remainderf16 + libc.src.math.remquof16 libc.src.math.rintf16 libc.src.math.roundf16 libc.src.math.roundevenf16 diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index 31ad0bc..e99960b 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -566,6 +566,8 @@ if(LIBC_TYPES_HAS_FLOAT16) libc.src.math.nextdownf16 libc.src.math.nexttowardf16 libc.src.math.nextupf16 + libc.src.math.remainderf16 + libc.src.math.remquof16 libc.src.math.rintf16 libc.src.math.roundf16 libc.src.math.roundevenf16 diff --git a/libc/docs/math/index.rst b/libc/docs/math/index.rst index 3e122fb..f83a646 100644 --- a/libc/docs/math/index.rst +++ b/libc/docs/math/index.rst @@ -198,9 +198,9 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | nextup | |check| | |check| | |check| | |check| | |check| | 7.12.11.5 | F.10.8.5 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| remainder | |check| | |check| | |check| | | | 7.12.10.2 | F.10.7.2 | +| remainder | |check| | |check| | |check| | |check| | | 7.12.10.2 | F.10.7.2 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| remquo | |check| | |check| | |check| | | |check| | 7.12.10.3 | F.10.7.3 | +| remquo | |check| | |check| | |check| | |check| | |check| | 7.12.10.3 | F.10.7.3 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | rint | |check| | |check| | |check| | |check| | |check| | 7.12.9.4 | F.10.6.4 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ diff --git a/libc/spec/stdc.td b/libc/spec/stdc.td index b5b6dbc..3416994 100644 --- a/libc/spec/stdc.td +++ b/libc/spec/stdc.td @@ -581,14 +581,16 @@ def StdC : StandardSpec<"stdc"> { FunctionSpec<"exp10", RetValSpec, [ArgSpec]>, FunctionSpec<"exp10f", RetValSpec, [ArgSpec]>, - FunctionSpec<"remainderf", RetValSpec, [ArgSpec, ArgSpec]>, FunctionSpec<"remainder", RetValSpec, [ArgSpec, ArgSpec]>, + FunctionSpec<"remainderf", RetValSpec, [ArgSpec, ArgSpec]>, FunctionSpec<"remainderl", RetValSpec, [ArgSpec, ArgSpec]>, + GuardedFunctionSpec<"remainderf16", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT16">, - FunctionSpec<"remquof", RetValSpec, [ArgSpec, ArgSpec, ArgSpec]>, - GuardedFunctionSpec<"remquof128", RetValSpec, [ArgSpec, ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT128">, FunctionSpec<"remquo", RetValSpec, [ArgSpec, ArgSpec, ArgSpec]>, + FunctionSpec<"remquof", RetValSpec, [ArgSpec, ArgSpec, ArgSpec]>, FunctionSpec<"remquol", RetValSpec, [ArgSpec, ArgSpec, ArgSpec]>, + GuardedFunctionSpec<"remquof16", RetValSpec, [ArgSpec, ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT16">, + GuardedFunctionSpec<"remquof128", RetValSpec, [ArgSpec, ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT128">, FunctionSpec<"round", RetValSpec, [ArgSpec]>, FunctionSpec<"roundf", RetValSpec, [ArgSpec]>, diff --git a/libc/src/__support/FPUtil/NormalFloat.h b/libc/src/__support/FPUtil/NormalFloat.h index 33529d5..413d2043 100644 --- a/libc/src/__support/FPUtil/NormalFloat.h +++ b/libc/src/__support/FPUtil/NormalFloat.h @@ -52,7 +52,7 @@ template struct NormalFloat { return; unsigned normalization_shift = evaluate_normalization_shift(mantissa); - mantissa = mantissa << normalization_shift; + mantissa <<= normalization_shift; exponent -= normalization_shift; } diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index f8582d8..82dfdaf 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -315,11 +315,13 @@ add_math_entrypoint_object(powf) add_math_entrypoint_object(remainder) add_math_entrypoint_object(remainderf) add_math_entrypoint_object(remainderl) +add_math_entrypoint_object(remainderf16) add_math_entrypoint_object(remquo) add_math_entrypoint_object(remquof) add_math_entrypoint_object(remquof128) add_math_entrypoint_object(remquol) +add_math_entrypoint_object(remquof16) add_math_entrypoint_object(rint) add_math_entrypoint_object(rintf) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index caaa0ac..f4f683e 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -2495,7 +2495,7 @@ add_entrypoint_object( DEPENDS libc.src.__support.FPUtil.division_and_remainder_operations COMPILE_OPTIONS - -O2 + -O3 ) add_entrypoint_object( @@ -2519,7 +2519,7 @@ add_entrypoint_object( DEPENDS libc.src.__support.FPUtil.division_and_remainder_operations COMPILE_OPTIONS - -O2 + -O3 ) add_entrypoint_object( @@ -2531,7 +2531,20 @@ add_entrypoint_object( DEPENDS libc.src.__support.FPUtil.division_and_remainder_operations COMPILE_OPTIONS - -O2 + -O3 +) + +add_entrypoint_object( + remquof16 + SRCS + remquof16.cpp + HDRS + ../remquof16.h + DEPENDS + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.division_and_remainder_operations + COMPILE_OPTIONS + -O3 ) add_entrypoint_object( @@ -2543,7 +2556,7 @@ add_entrypoint_object( DEPENDS libc.src.__support.FPUtil.division_and_remainder_operations COMPILE_OPTIONS - -O2 + -O3 ) add_entrypoint_object( @@ -2555,7 +2568,7 @@ add_entrypoint_object( DEPENDS libc.src.__support.FPUtil.division_and_remainder_operations COMPILE_OPTIONS - -O2 + -O3 ) add_entrypoint_object( @@ -2567,7 +2580,20 @@ add_entrypoint_object( DEPENDS libc.src.__support.FPUtil.division_and_remainder_operations COMPILE_OPTIONS - -O2 + -O3 +) + +add_entrypoint_object( + remainderf16 + SRCS + remainderf16.cpp + HDRS + ../remainderf16.h + DEPENDS + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.division_and_remainder_operations + COMPILE_OPTIONS + -O3 ) add_entrypoint_object( diff --git a/libc/src/math/generic/remainderf16.cpp b/libc/src/math/generic/remainderf16.cpp new file mode 100644 index 0000000..3517722 --- /dev/null +++ b/libc/src/math/generic/remainderf16.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of remainderf16 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/remainderf16.h" +#include "src/__support/FPUtil/DivisionAndRemainderOperations.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(float16, remainderf16, (float16 x, float16 y)) { + int quotient; + return fputil::remquo(x, y, quotient); +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/math/generic/remquof16.cpp b/libc/src/math/generic/remquof16.cpp new file mode 100644 index 0000000..a373bfa --- /dev/null +++ b/libc/src/math/generic/remquof16.cpp @@ -0,0 +1,19 @@ +//===-- Implementation of remquof16 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/remquof16.h" +#include "src/__support/FPUtil/DivisionAndRemainderOperations.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(float16, remquof16, (float16 x, float16 y, int *exp)) { + return fputil::remquo(x, y, *exp); +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/math/remainderf16.h b/libc/src/math/remainderf16.h new file mode 100644 index 0000000..e23eead --- /dev/null +++ b/libc/src/math/remainderf16.h @@ -0,0 +1,20 @@ +//===-- Implementation header for remainderf16 ------------------*- 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_REMAINDERF16_H +#define LLVM_LIBC_SRC_MATH_REMAINDERF16_H + +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE { + +float16 remainderf16(float16 x, float16 y); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_MATH_REMAINDERF16_H diff --git a/libc/src/math/remquof16.h b/libc/src/math/remquof16.h new file mode 100644 index 0000000..fee848c --- /dev/null +++ b/libc/src/math/remquof16.h @@ -0,0 +1,20 @@ +//===-- Implementation header for remquof16 ---------------------*- 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_REMQUOF16_H +#define LLVM_LIBC_SRC_MATH_REMQUOF16_H + +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE { + +float16 remquof16(float16 x, float16 y, int *exp); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_MATH_REMQUOF16_H diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 84aa76c..75e2bdd7 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -2608,7 +2608,6 @@ add_fp_unittest( RemQuoTest.h DEPENDS libc.src.math.remquof - libc.src.__support.FPUtil.basic_operations libc.src.__support.FPUtil.fp_bits ) @@ -2636,7 +2635,6 @@ add_fp_unittest( RemQuoTest.h DEPENDS libc.src.math.remquo - libc.src.__support.FPUtil.basic_operations libc.src.__support.FPUtil.fp_bits ) @@ -2650,7 +2648,19 @@ add_fp_unittest( RemQuoTest.h DEPENDS libc.src.math.remquol - libc.src.__support.FPUtil.basic_operations + libc.src.__support.FPUtil.fp_bits +) + +add_fp_unittest( + remquof16_test + SUITE + libc-math-smoke-tests + SRCS + remquof16_test.cpp + HDRS + RemQuoTest.h + DEPENDS + libc.src.math.remquof16 libc.src.__support.FPUtil.fp_bits ) diff --git a/libc/test/src/math/smoke/RemQuoTest.h b/libc/test/src/math/smoke/RemQuoTest.h index 43eee3d..e926326 100644 --- a/libc/test/src/math/smoke/RemQuoTest.h +++ b/libc/test/src/math/smoke/RemQuoTest.h @@ -9,8 +9,6 @@ #ifndef LLVM_LIBC_TEST_SRC_MATH_REMQUOTEST_H #define LLVM_LIBC_TEST_SRC_MATH_REMQUOTEST_H -#include "hdr/math_macros.h" -#include "src/__support/FPUtil/BasicOperations.h" #include "src/__support/FPUtil/FPBits.h" #include "test/UnitTest/FEnvSafeTest.h" #include "test/UnitTest/FPMatcher.h" diff --git a/libc/test/src/math/smoke/remquof16_test.cpp b/libc/test/src/math/smoke/remquof16_test.cpp new file mode 100644 index 0000000..18f2aba --- /dev/null +++ b/libc/test/src/math/smoke/remquof16_test.cpp @@ -0,0 +1,13 @@ +//===-- Unittests for remquof16 -------------------------------------------===// +// +// 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 "RemQuoTest.h" + +#include "src/math/remquof16.h" + +LIST_REMQUO_TESTS(float16, LIBC_NAMESPACE::remquof16) -- cgit v1.1