diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 3bbd1629e3d8d..04362bc88e89f 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -499,6 +499,7 @@ set(TARGET_LIBM_ENTRYPOINTS if(LIBC_TYPES_HAS_FLOAT16) list(APPEND TARGET_LIBM_ENTRYPOINTS # math.h C23 _Float16 entrypoints + libc.src.math.canonicalizef16 libc.src.math.ceilf16 libc.src.math.fabsf16 libc.src.math.floorf16 diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index 62434298890f0..bbedcfd3afb2c 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -532,6 +532,7 @@ set(TARGET_LIBM_ENTRYPOINTS if(LIBC_TYPES_HAS_FLOAT16) list(APPEND TARGET_LIBM_ENTRYPOINTS # math.h C23 _Float16 entrypoints + libc.src.math.canonicalizef16 libc.src.math.ceilf16 libc.src.math.fabsf16 libc.src.math.floorf16 diff --git a/libc/docs/c23.rst b/libc/docs/c23.rst index 8ccfd46271797..6a8093ccae387 100644 --- a/libc/docs/c23.rst +++ b/libc/docs/c23.rst @@ -60,7 +60,7 @@ Additions: * fromfpx* * nextup* * nextdown* - * canonicalize* + * canonicalize* |check| * fmaximum* * fminimum* * fmaximum_mag* diff --git a/libc/docs/math/index.rst b/libc/docs/math/index.rst index 9df7dcfc256db..4027c72237674 100644 --- a/libc/docs/math/index.rst +++ b/libc/docs/math/index.rst @@ -110,7 +110,7 @@ Basic Operations +==================+==================+=================+========================+======================+========================+========================+============================+ | ceil | |check| | |check| | |check| | |check| | |check| | 7.12.9.1 | F.10.6.1 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| canonicalize | |check| | |check| | |check| | | |check| | 7.12.11.7 | F.10.8.7 | +| canonicalize | |check| | |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 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ diff --git a/libc/spec/stdc.td b/libc/spec/stdc.td index cacc91ce8789a..0d1d0ebe62a6c 100644 --- a/libc/spec/stdc.td +++ b/libc/spec/stdc.td @@ -669,6 +669,7 @@ def StdC : StandardSpec<"stdc"> { FunctionSpec<"canonicalize", RetValSpec, [ArgSpec, ArgSpec]>, FunctionSpec<"canonicalizef", RetValSpec, [ArgSpec, ArgSpec]>, FunctionSpec<"canonicalizel", RetValSpec, [ArgSpec, ArgSpec]>, + GuardedFunctionSpec<"canonicalizef16", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT16">, GuardedFunctionSpec<"canonicalizef128", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT128">, ] >; diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index 3b07b0b8679c4..8395e56694963 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -61,8 +61,9 @@ add_math_entrypoint_object(atanhf) add_math_entrypoint_object(canonicalize) add_math_entrypoint_object(canonicalizef) -add_math_entrypoint_object(canonicalizef128) add_math_entrypoint_object(canonicalizel) +add_math_entrypoint_object(canonicalizef16) +add_math_entrypoint_object(canonicalizef128) add_math_entrypoint_object(ceil) add_math_entrypoint_object(ceilf) diff --git a/libc/src/math/canonicalizef16.h b/libc/src/math/canonicalizef16.h new file mode 100644 index 0000000000000..102af01c0c2ba --- /dev/null +++ b/libc/src/math/canonicalizef16.h @@ -0,0 +1,20 @@ +//===-- Implementation header for canonicalizef16 ---------------*- 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_CANONICALIZEF16_H +#define LLVM_LIBC_SRC_MATH_CANONICALIZEF16_H + +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE { + +int canonicalizef16(float16 *cx, const float16 *x); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_MATH_CANONICALIZEF16_H diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 369616caa2565..ca28dda662537 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -22,6 +22,19 @@ add_entrypoint_object( libc.src.__support.FPUtil.basic_operations ) +add_entrypoint_object( + canonicalizef16 + SRCS + canonicalizef16.cpp + HDRS + ../canonicalizef16.h + COMPILE_OPTIONS + -O3 + DEPENDS + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.basic_operations +) + add_entrypoint_object( canonicalizef128 SRCS @@ -31,6 +44,7 @@ add_entrypoint_object( COMPILE_OPTIONS -O3 DEPENDS + libc.src.__support.macros.properties.types libc.src.__support.FPUtil.basic_operations ) diff --git a/libc/src/math/generic/canonicalizef16.cpp b/libc/src/math/generic/canonicalizef16.cpp new file mode 100644 index 0000000000000..232e84f7dd68f --- /dev/null +++ b/libc/src/math/generic/canonicalizef16.cpp @@ -0,0 +1,19 @@ +//===-- Implementation of canonicalizef16 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/canonicalizef16.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(int, canonicalizef16, (float16 * cx, const float16 *x)) { + return fputil::canonicalize(*cx, *x); +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 685a53d8e7c6a..9da420e525634 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -211,6 +211,21 @@ add_fp_unittest( libc.src.__support.integer_literals ) +add_fp_unittest( + canonicalizef16_test + SUITE + libc-math-smoke-tests + SRCS + canonicalizef16_test.cpp + HDRS + CanonicalizeTest.h + DEPENDS + libc.src.math.canonicalizef16 + libc.src.__support.FPUtil.fp_bits + libc.src.__support.FPUtil.fenv_impl + libc.src.__support.integer_literals +) + add_fp_unittest( canonicalizef128_test SUITE diff --git a/libc/test/src/math/smoke/CanonicalizeTest.h b/libc/test/src/math/smoke/CanonicalizeTest.h index 7e2456f84705c..3baf60c3140ff 100644 --- a/libc/test/src/math/smoke/CanonicalizeTest.h +++ b/libc/test/src/math/smoke/CanonicalizeTest.h @@ -9,6 +9,7 @@ #ifndef LLVM_LIBC_TEST_SRC_MATH_SMOKE_CANONICALIZETEST_H #define LLVM_LIBC_TEST_SRC_MATH_SMOKE_CANONICALIZETEST_H +#include "src/__support/FPUtil/FEnvImpl.h" #include "src/__support/FPUtil/FPBits.h" #include "src/__support/integer_literals.h" #include "test/UnitTest/FEnvSafeTest.h" diff --git a/libc/test/src/math/smoke/canonicalizef16_test.cpp b/libc/test/src/math/smoke/canonicalizef16_test.cpp new file mode 100644 index 0000000000000..32a3d1756e4da --- /dev/null +++ b/libc/test/src/math/smoke/canonicalizef16_test.cpp @@ -0,0 +1,13 @@ +//===-- Unittests for canonicalizef16 -------------------------------------===// +// +// 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 "CanonicalizeTest.h" + +#include "src/math/canonicalizef16.h" + +LIST_CANONICALIZE_TESTS(float16, LIBC_NAMESPACE::canonicalizef16)