diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 3bbd1629e3d8d..4e3e1ceca6a02 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -501,6 +501,7 @@ if(LIBC_TYPES_HAS_FLOAT16) # math.h C23 _Float16 entrypoints libc.src.math.ceilf16 libc.src.math.fabsf16 + libc.src.math.fdimf16 libc.src.math.floorf16 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 62434298890f0..49a4f7436cf57 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -534,6 +534,7 @@ if(LIBC_TYPES_HAS_FLOAT16) # math.h C23 _Float16 entrypoints libc.src.math.ceilf16 libc.src.math.fabsf16 + libc.src.math.fdimf16 libc.src.math.floorf16 libc.src.math.roundf16 libc.src.math.roundevenf16 diff --git a/libc/docs/math/index.rst b/libc/docs/math/index.rst index 9df7dcfc256db..c044272be69ae 100644 --- a/libc/docs/math/index.rst +++ b/libc/docs/math/index.rst @@ -128,7 +128,7 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | fadd | N/A | | | N/A | | 7.12.14.1 | F.10.11 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| fdim | |check| | |check| | |check| | | |check| | 7.12.12.1 | F.10.9.1 | +| fdim | |check| | |check| | |check| | |check| | |check| | 7.12.12.1 | F.10.9.1 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | fdiv | N/A | | | N/A | | 7.12.14.4 | F.10.11 | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ diff --git a/libc/spec/stdc.td b/libc/spec/stdc.td index cacc91ce8789a..7fdae0694fcc1 100644 --- a/libc/spec/stdc.td +++ b/libc/spec/stdc.td @@ -402,6 +402,7 @@ def StdC : StandardSpec<"stdc"> { FunctionSpec<"fdim", RetValSpec, [ArgSpec, ArgSpec]>, FunctionSpec<"fdimf", RetValSpec, [ArgSpec, ArgSpec]>, FunctionSpec<"fdiml", RetValSpec, [ArgSpec, ArgSpec]>, + GuardedFunctionSpec<"fdimf16", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT16">, GuardedFunctionSpec<"fdimf128", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT128">, FunctionSpec<"floor", RetValSpec, [ArgSpec]>, diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index 3b07b0b8679c4..f5ac1382258dc 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -106,6 +106,7 @@ add_math_entrypoint_object(fabsf128) add_math_entrypoint_object(fdim) add_math_entrypoint_object(fdimf) add_math_entrypoint_object(fdiml) +add_math_entrypoint_object(fdimf16) add_math_entrypoint_object(fdimf128) add_math_entrypoint_object(floor) diff --git a/libc/src/math/fdimf16.h b/libc/src/math/fdimf16.h new file mode 100644 index 0000000000000..0aa23810c64fa --- /dev/null +++ b/libc/src/math/fdimf16.h @@ -0,0 +1,20 @@ +//===-- Implementation header for fdimf16 -----------------------*- 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_FDIMF16_H +#define LLVM_LIBC_SRC_MATH_FDIMF16_H + +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE { + +float16 fdimf16(float16 x, float16 y); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_MATH_FDIMF16_H diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 369616caa2565..b436ef2deca8a 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -2292,6 +2292,19 @@ add_entrypoint_object( libc.src.__support.FPUtil.basic_operations ) +add_entrypoint_object( + fdimf16 + SRCS + fdimf16.cpp + HDRS + ../fdimf16.h + COMPILE_OPTIONS + -O3 + DEPENDS + libc.src.__support.macros.properties.types + libc.src.__support.FPUtil.basic_operations +) + add_entrypoint_object( fdimf128 SRCS diff --git a/libc/src/math/generic/fdimf16.cpp b/libc/src/math/generic/fdimf16.cpp new file mode 100644 index 0000000000000..25e1d88d7048d --- /dev/null +++ b/libc/src/math/generic/fdimf16.cpp @@ -0,0 +1,19 @@ +//===-- Implementation of fdimf16 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/fdimf16.h" +#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +LLVM_LIBC_FUNCTION(float16, fdimf16, (float16 x, float16 y)) { + return fputil::fdim(x, y); +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 685a53d8e7c6a..aa0cd53d9367f 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -1468,7 +1468,7 @@ add_fp_unittest( FDimTest.h DEPENDS libc.src.math.fdimf - libc.src.__support.FPUtil.basic_operations + libc.src.__support.CPP.algorithm libc.src.__support.FPUtil.fp_bits ) @@ -1482,7 +1482,7 @@ add_fp_unittest( FDimTest.h DEPENDS libc.src.math.fdim - libc.src.__support.FPUtil.basic_operations + libc.src.__support.CPP.algorithm libc.src.__support.FPUtil.fp_bits ) @@ -1496,7 +1496,21 @@ add_fp_unittest( FDimTest.h DEPENDS libc.src.math.fdiml - libc.src.__support.FPUtil.basic_operations + libc.src.__support.CPP.algorithm + libc.src.__support.FPUtil.fp_bits +) + +add_fp_unittest( + fdimf16_test + SUITE + libc-math-smoke-tests + SRCS + fdimf16_test.cpp + HDRS + FDimTest.h + DEPENDS + libc.src.math.fdimf16 + libc.src.__support.CPP.algorithm libc.src.__support.FPUtil.fp_bits ) @@ -1510,7 +1524,7 @@ add_fp_unittest( FDimTest.h DEPENDS libc.src.math.fdimf128 - libc.src.__support.FPUtil.basic_operations + libc.src.__support.CPP.algorithm libc.src.__support.FPUtil.fp_bits ) diff --git a/libc/test/src/math/smoke/FDimTest.h b/libc/test/src/math/smoke/FDimTest.h index cff88f29a8efa..cc0ce3bc10c46 100644 --- a/libc/test/src/math/smoke/FDimTest.h +++ b/libc/test/src/math/smoke/FDimTest.h @@ -6,7 +6,7 @@ // //===---------------------------------------------------------------------===// -#include "src/__support/FPUtil/BasicOperations.h" +#include "src/__support/CPP/algorithm.h" #include "src/__support/FPUtil/FPBits.h" #include "test/UnitTest/FEnvSafeTest.h" #include "test/UnitTest/FPMatcher.h" @@ -61,10 +61,11 @@ class FDimTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { void test_in_range(FuncPtr func) { constexpr StorageType STORAGE_MAX = LIBC_NAMESPACE::cpp::numeric_limits::max(); - constexpr StorageType COUNT = 100'001; - constexpr StorageType STEP = STORAGE_MAX / COUNT; - for (StorageType i = 0, v = 0, w = STORAGE_MAX; i <= COUNT; - ++i, v += STEP, w -= STEP) { + constexpr int COUNT = 100'001; + constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max( + static_cast(STORAGE_MAX / COUNT), StorageType(1)); + StorageType v = 0, w = STORAGE_MAX; + for (int i = 0; i <= COUNT; ++i, v += STEP, w -= STEP) { FPBits xbits(v), ybits(w); if (xbits.is_inf_or_nan()) continue; diff --git a/libc/test/src/math/smoke/fdimf16_test.cpp b/libc/test/src/math/smoke/fdimf16_test.cpp new file mode 100644 index 0000000000000..f40fab3713d76 --- /dev/null +++ b/libc/test/src/math/smoke/fdimf16_test.cpp @@ -0,0 +1,13 @@ +//===-- Unittests for fdimf16 ---------------------------------------------===// +// +// 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 "FDimTest.h" + +#include "src/math/fdimf16.h" + +LIST_FDIM_TESTS(float16, LIBC_NAMESPACE::fdimf16);