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,5 +1,16 @@
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.
diff --git a/lib/totalorderl.c b/lib/totalorderl.c
index 1532a84c10..4ccb7e7e23 100644
--- a/lib/totalorderl.c
+++ b/lib/totalorderl.c
@@ -21,6 +21,16 @@
/* 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
@@ -52,20 +62,6 @@ totalorderl (long double const *x, long double const *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. */
@@ -104,3 +100,5 @@ totalorderl (long double const *x, long double const *y)
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,5 +1,5 @@
# 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,
@@ -85,6 +85,7 @@ 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>
@@ -115,7 +116,13 @@ AC_DEFUN([gl_FUNC_TOTALORDERL],
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
diff --git a/modules/totalorderl b/modules/totalorderl
index 76dafb8ecd..d153f4c8cc 100644
--- a/modules/totalorderl
+++ b/modules/totalorderl
@@ -10,10 +10,11 @@ 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

Return to:

Send suggestions and report system problems to the System administrator.