diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index bb0ebca29e6ae..75e010e63c92d 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -568,6 +568,7 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.tanhf libc.src.math.totalorder libc.src.math.totalorderf + libc.src.math.totalorderl libc.src.math.totalordermag libc.src.math.totalordermagf libc.src.math.totalordermagl diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt index 7fd60799bbcc7..02265aef6fdfb 100644 --- a/libc/config/linux/arm/entrypoints.txt +++ b/libc/config/linux/arm/entrypoints.txt @@ -396,6 +396,7 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.tanhf libc.src.math.totalorder libc.src.math.totalorderf + libc.src.math.totalorderl libc.src.math.totalordermag libc.src.math.totalordermagf libc.src.math.totalordermagl diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt index 0d48b55a96548..f80e741115e79 100644 --- a/libc/config/linux/riscv/entrypoints.txt +++ b/libc/config/linux/riscv/entrypoints.txt @@ -571,6 +571,7 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.tanhf libc.src.math.totalorder libc.src.math.totalorderf + libc.src.math.totalorderl libc.src.math.totalordermag libc.src.math.totalordermagf libc.src.math.totalordermagl diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index b9134c8496c30..683ac8b1c71e3 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -571,6 +571,7 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.tanhf libc.src.math.totalorder libc.src.math.totalorderf + libc.src.math.totalorderl libc.src.math.totalordermag libc.src.math.totalordermagf libc.src.math.totalordermagl diff --git a/libc/docs/math/index.rst b/libc/docs/math/index.rst index 9185a95192963..b617289d1364f 100644 --- a/libc/docs/math/index.rst +++ b/libc/docs/math/index.rst @@ -228,7 +228,7 @@ Basic Operations +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | setpayloadsig | |check| | |check| | |check| | |check| | |check| | F.10.13.3 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| totalorder | |check| | |check| | | |check| | |check| | F.10.12.1 | N/A | +| totalorder | |check| | |check| | |check| | |check| | |check| | F.10.12.1 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | totalordermag | |check| | |check| | |check| | |check| | |check| | F.10.12.2 | N/A | +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ diff --git a/libc/newhdrgen/yaml/math.yaml b/libc/newhdrgen/yaml/math.yaml index 2f1203e581f9a..025f5fa48bf60 100644 --- a/libc/newhdrgen/yaml/math.yaml +++ b/libc/newhdrgen/yaml/math.yaml @@ -1839,14 +1839,43 @@ functions: - type: float128 * - type: float128 guard: LIBC_TYPES_HAS_FLOAT128 + - name: totalorder + standards: + - stdc + return_type: int + arguments: + - type: const double * + - type: const double * + - name: totalorderf + standards: + - stdc + return_type: int + arguments: + - type: const float * + - type: const float * + - name: totalorderl + standards: + - stdc + return_type: int + arguments: + - type: const long double * + - type: const long double * - name: totalorderf16 standards: - stdc return_type: int arguments: - - type: _Float16 * - - type: _Float16 * + - type: const _Float16 * + - type: const _Float16 * guard: LIBC_TYPES_HAS_FLOAT16 + - name: totalorderf128 + standards: + - stdc + return_type: int + arguments: + - type: const float128 * + - type: const float128 * + guard: LIBC_TYPES_HAS_FLOAT128 - name: totalordermagf16 standards: - stdc diff --git a/libc/spec/spec.td b/libc/spec/spec.td index a3a5db7465b39..ad9ca76846c28 100644 --- a/libc/spec/spec.td +++ b/libc/spec/spec.td @@ -119,6 +119,12 @@ def Float16Ptr : PtrType; def Float128Ptr : PtrType; def UnsignedCharPtr : PtrType; +def ConstDoublePtr : ConstType; +def ConstFloatPtr : ConstType; +def ConstLongDoublePtr : ConstType; +def ConstFloat16Ptr : ConstType; +def ConstFloat128Ptr : ConstType; + def SigHandlerT : NamedType<"__sighandler_t">; def TimeTType : NamedType<"time_t">; diff --git a/libc/spec/stdc.td b/libc/spec/stdc.td index 72bfe0cf71aa2..b3b087ab3b58a 100644 --- a/libc/spec/stdc.td +++ b/libc/spec/stdc.td @@ -743,10 +743,11 @@ def StdC : StandardSpec<"stdc"> { FunctionSpec<"dsqrtl", RetValSpec, [ArgSpec]>, - FunctionSpec<"totalorder", RetValSpec, [ArgSpec, ArgSpec]>, - FunctionSpec<"totalorderf", RetValSpec, [ArgSpec, ArgSpec]>, - GuardedFunctionSpec<"totalorderf16", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT16">, - GuardedFunctionSpec<"totalorderf128", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT128">, + FunctionSpec<"totalorder", RetValSpec, [ArgSpec, ArgSpec]>, + FunctionSpec<"totalorderf", RetValSpec, [ArgSpec, ArgSpec]>, + FunctionSpec<"totalorderl", RetValSpec, [ArgSpec, ArgSpec]>, + GuardedFunctionSpec<"totalorderf16", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT16">, + GuardedFunctionSpec<"totalorderf128", RetValSpec, [ArgSpec, ArgSpec], "LIBC_TYPES_HAS_FLOAT128">, FunctionSpec<"totalordermag", RetValSpec, [ArgSpec, ArgSpec]>, FunctionSpec<"totalordermagf", RetValSpec, [ArgSpec, ArgSpec]>, diff --git a/libc/src/__support/FPUtil/BasicOperations.h b/libc/src/__support/FPUtil/BasicOperations.h index 8131c9b663cfe..824c9bfb3947f 100644 --- a/libc/src/__support/FPUtil/BasicOperations.h +++ b/libc/src/__support/FPUtil/BasicOperations.h @@ -321,12 +321,8 @@ totalorder(T x, T y) { StorageType x_u = x_bits.uintval(); StorageType y_u = y_bits.uintval(); - using signed_t = make_integral_or_big_int_signed_t; - signed_t x_signed = static_cast(x_u); - signed_t y_signed = static_cast(y_u); - - bool both_neg = (x_u & y_u & FPBits::SIGN_MASK) != 0; - return x_signed == y_signed || ((x_signed <= y_signed) != both_neg); + bool has_neg = ((x_u | y_u) & FPBits::SIGN_MASK) != 0; + return x_u == y_u || ((x_u < y_u) != has_neg); } template diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index e2ebf2ddd4bfa..7f1800ab3480d 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -479,6 +479,7 @@ add_math_entrypoint_object(lgamma_r) add_math_entrypoint_object(totalorder) add_math_entrypoint_object(totalorderf) +add_math_entrypoint_object(totalorderl) add_math_entrypoint_object(totalorderf16) add_math_entrypoint_object(totalorderf128) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index c80c7ca7f7af1..534036aa36456 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -4368,6 +4368,18 @@ add_entrypoint_object( -O3 ) +add_entrypoint_object( + totalorderl + SRCS + totalorderl.cpp + HDRS + ../totalorderl.h + DEPENDS + libc.src.__support.FPUtil.basic_operations + COMPILE_OPTIONS + -O3 +) + add_entrypoint_object( totalorderf16 SRCS diff --git a/libc/src/math/generic/totalorderl.cpp b/libc/src/math/generic/totalorderl.cpp new file mode 100644 index 0000000000000..1aae1c6cd025a --- /dev/null +++ b/libc/src/math/generic/totalorderl.cpp @@ -0,0 +1,21 @@ +//===-- Implementation of totalorderl 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/totalorderl.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(int, totalorderl, + (const long double *x, const long double *y)) { + return static_cast(fputil::totalorder(*x, *y)); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/math/totalorderl.h b/libc/src/math/totalorderl.h new file mode 100644 index 0000000000000..064b2a514fa8e --- /dev/null +++ b/libc/src/math/totalorderl.h @@ -0,0 +1,20 @@ +//===-- Implementation header for totalorderl -------------------*- 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_TOTALORDERL_H +#define LLVM_LIBC_SRC_MATH_TOTALORDERL_H + +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { + +int totalorderl(const long double *x, const long double *y); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_TOTALORDERL_H diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 609ecef42f745..9fe61672f7258 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -3837,6 +3837,18 @@ add_fp_unittest( libc.src.math.totalorderf ) +add_fp_unittest( + totalorderl_test + SUITE + libc-math-smoke-tests + SRCS + totalorderl_test.cpp + HDRS + TotalOrderTest.h + DEPENDS + libc.src.math.totalorderl +) + add_fp_unittest( totalorderf16_test SUITE diff --git a/libc/test/src/math/smoke/totalorderl_test.cpp b/libc/test/src/math/smoke/totalorderl_test.cpp new file mode 100644 index 0000000000000..fc2353fce3859 --- /dev/null +++ b/libc/test/src/math/smoke/totalorderl_test.cpp @@ -0,0 +1,13 @@ +//===-- Unittests for totalorderl -----------------------------------------===// +// +// 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 "TotalOrderTest.h" + +#include "src/math/totalorderl.h" + +LIST_TOTALORDER_TESTS(long double, LIBC_NAMESPACE::totalorderl)