summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--lib/totalorderl.c26
-rw-r--r--m4/totalorder.m49
-rw-r--r--modules/totalorderl9
4 files changed, 36 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index aa8533e40d..6a92574391 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,19 @@
2024-04-18 Bruno Haible <bruno@clisp.org>
+ totalorderl: Simplify on MSVC.
+ * lib/totalorderl.c (totalorderl): If 'long double' is the same as
+ 'double', just invoke totalorder. Otherwise, drop the optimized code
+ for small 'long double' since it does not occur on any platform.
+ * m4/totalorder.m4 (gl_FUNC_TOTALORDERL): Require
+ gl_LONG_DOUBLE_VS_DOUBLE. If 'long double' is the same as 'double', use
+ TOTALORDER_LIBM.
+ * modules/totalorderl (Depends-on): Add totalorder.
+
+2024-04-18 Bruno Haible <bruno@clisp.org>
+
signbit: Fix typos.
* lib/signbitd.c: Fix typo in comment.
* lib/signbitf.c: Likewise.
2024-04-18 Collin Funk <collin.funk1@gmail.com>
diff --git a/lib/totalorderl.c b/lib/totalorderl.c
index 1532a84c10..4ccb7e7e23 100644
--- a/lib/totalorderl.c
+++ b/lib/totalorderl.c
@@ -18,12 +18,22 @@
#include <config.h>
/* Specification. */
#include <math.h>
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+int
+totalorderl (long double const *x, long double const *y)
+{
+ return totalorder ((double const *) x, (double const *) y);
+}
+
+#else
+
# include <float.h>
# ifndef LDBL_SIGNBIT_WORD
# define LDBL_SIGNBIT_WORD (-1)
# endif
@@ -49,26 +59,12 @@ totalorderl (long double const *x, long double const *y)
if (!xn)
return *x <= *y;
/* At this point, *X and *Y are NaNs with the same sign bit. */
unsigned long long extended_sign = -!!xs;
-
- if (sizeof (long double) <= sizeof (unsigned long long))
- {
-#if defined __hppa || defined __mips__ || defined __sh__
- /* Invert the most significant bit of the mantissa field. Cf. snan.h. */
- extended_sign ^= (1ULL << 51);
-#endif
- union { unsigned long long i; long double f; } volatile
- xu = {0}, yu = {0};
- xu.f = *x;
- yu.f = *y;
- return (xu.i ^ extended_sign) <= (yu.i ^ extended_sign);
- }
-
unsigned long long extended_sign_hi = extended_sign;
# if defined __hppa || defined __mips__ || defined __sh__
/* Invert the most significant bit of the mantissa field. Cf. snan.h. */
extended_sign_hi ^=
(1ULL << (LDBL_MANT_DIG == 106
? 51 /* double-double representation */
@@ -101,6 +97,8 @@ totalorderl (long double const *x, long double const *y)
xhi = xu.i[!bigendian] ^ extended_sign_hi,
yhi = yu.i[!bigendian] ^ extended_sign_hi,
xlo = xu.i[ bigendian] ^ extended_sign,
ylo = yu.i[ bigendian] ^ extended_sign;
return (xhi < yhi) | ((xhi == yhi) & (xlo <= ylo));
}
+
+#endif
diff --git a/m4/totalorder.m4 b/m4/totalorder.m4
index 92166de484..51012b8503 100644
--- a/m4/totalorder.m4
+++ b/m4/totalorder.m4
@@ -1,8 +1,8 @@
# totalorder.m4
-# serial 1
+# serial 2
dnl Copyright 2023-2024 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
AC_DEFUN([gl_FUNC_TOTALORDERF],
@@ -82,12 +82,13 @@ AC_DEFUN([gl_FUNC_TOTALORDER],
])
AC_DEFUN([gl_FUNC_TOTALORDERL],
[
AC_REQUIRE([gl_MATH_H_DEFAULTS])
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
dnl glibc versions < 2.31 had an incompatible declaration of this function,
dnl see <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=42760d764649ad82f5fe45a26cbdf2c2500409f7>
AC_CACHE_CHECK([whether totalorderl has a non-standard declaration],
[gl_cv_func_totalorderl_incompatible],
[AC_COMPILE_IFELSE(
@@ -112,12 +113,18 @@ AC_DEFUN([gl_FUNC_TOTALORDERL],
if test $gl_cv_func_totalorderl_no_libm != yes \
&& test $gl_cv_func_totalorderl_in_libm != yes; then
HAVE_TOTALORDERL=0
fi
fi
if test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1; then
+ dnl Find libraries needed to link lib/totalorderl.c.
+ if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
+ AC_REQUIRE([gl_FUNC_TOTALORDER])
+ TOTALORDERL_LIBM="$TOTALORDER_LIBM"
+ else
TOTALORDERL_LIBM='$(ISNANL_LIBM)'
+ fi
dnl Prerequisite of lib/totalorderl.c.
gl_LONG_DOUBLE_SIGN_LOCATION
fi
AC_SUBST([TOTALORDERL_LIBM])
])
diff --git a/modules/totalorderl b/modules/totalorderl
index 76dafb8ecd..d153f4c8cc 100644
--- a/modules/totalorderl
+++ b/modules/totalorderl
@@ -7,16 +7,17 @@ m4/mathfunc.m4
m4/totalorder.m4
m4/signbit.m4
Depends-on:
math
extensions
-float [test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1]
-stdbool [test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1]
-isnanl [test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1]
-signbit [test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1]
+totalorder [{ test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1]
+float [{ test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
+stdbool [{ test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
+isnanl [{ test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
+signbit [{ test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
configure.ac:
gl_FUNC_TOTALORDERL
gl_CONDITIONAL([GL_COND_OBJ_TOTALORDERL],
[test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1])
gl_MATH_MODULE_INDICATOR([totalorderl])

Return to:

Send suggestions and report system problems to the System administrator.