2025-04-14 Bruno Haible <[email protected]>
isnanl, isfinite, snan: Improve cross-compilation guess.
* m4/exponentl.m4 (gl_LONG_DOUBLE_EXPONENT_LOCATION): When
cross-compiling, invoke gl_LONG_DOUBLE_VS_DOUBLE and
gl_DOUBLE_EXPONENT_LOCATION, and guess the result depending on the CPU.
* modules/getpayloadl (Depends-on): Add exponentd.m4, math_h.m4.
* modules/isfinite (Depends-on): Likewise.
* modules/isnanl (Depends-on): Likewise.
* modules/setpayloadl (Depends-on): Likewise.
* modules/setpayloadsigl (Depends-on): Likewise.
* modules/isnanl-nolibm (Depends-on): Add exponentd.m4.
diff --git a/m4/exponentl.m4 b/m4/exponentl.m4
index 7e147eccee..a52e996b5e 100644
--- a/m4/exponentl.m4
+++ b/m4/exponentl.m4
@@ -1,5 +1,5 @@
# exponentl.m4
-# serial 7
+# serial 8
dnl Copyright (C) 2007-2025 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -81,24 +81,94 @@ AC_DEFUN_ONCE([gl_LONG_DOUBLE_EXPONENT_LOCATION]
[gl_cv_cc_long_double_expbit0="unknown"],
[
dnl When cross-compiling, in general we don't know. It depends on the
- dnl ABI and compiler version. There are too many cases.
- gl_cv_cc_long_double_expbit0="unknown"
- case "$host_os" in
- mingw* | windows*)
- # On native Windows (little-endian), we know the result
- # in two cases: mingw, MSVC.
- AC_EGREP_CPP([Known], [
-#ifdef __MINGW32__
- Known
-#endif
- ], [gl_cv_cc_long_double_expbit0="word 2 bit 0"])
- AC_EGREP_CPP([Known], [
-#ifdef _MSC_VER
- Known
-#endif
- ], [gl_cv_cc_long_double_expbit0="word 1 bit 20"])
- ;;
- esac
+ dnl ABI and compiler version. But we know the results for specific
+ dnl CPUs.
+ AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
+ if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
+ gl_DOUBLE_EXPONENT_LOCATION
+ gl_cv_cc_long_double_expbit0="$gl_cv_cc_double_expbit0"
+ if test "$gl_cv_cc_double_expbit0" = unknown; then
+ case "$host_cpu" in
+ arm*)
+ # See the comments in exponentd.m4.
+ ;;
+ aarch64 | sh4)
+ # little-endian IEEE 754 double-precision
+ gl_cv_cc_long_double_expbit0='word 1 bit 20'
+ ;;
+ hppa*)
+ # big-endian IEEE 754 double-precision
+ gl_cv_cc_long_double_expbit0='word 0 bit 20'
+ ;;
+ mips*)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #if defined _MIPSEB /* equivalent: __BYTE_ORDER__ ==
__ORDER_BIG_ENDIAN__ */
+ int big;
+ #else
+ #error little
+ #endif
+ ]], [[]])
+ ],
+ [# big-endian IEEE 754 double-precision
+ gl_cv_cc_long_double_expbit0='word 0 bit 20'
+ ],
+ [# little-endian IEEE 754 double-precision
+ gl_cv_cc_long_double_expbit0='word 1 bit 20'
+ ])
+ ;;
+ esac
+ fi
+ else
+ case "$host_cpu" in
+changequote(,)dnl
+ i[34567]86 | x86_64 | ia64*)
+changequote([,])dnl
+ # 80-bits "extended precision"
+ gl_cv_cc_long_double_expbit0='word 2 bit 0'
+ ;;
+ m68k*)
+ # big-endian, 80-bits padded to 96 bits, non-IEEE exponent
+ gl_cv_cc_long_double_expbit0='word 0 bit 16'
+ ;;
+ alpha* | arm* | aarch64 | loongarch64 | riscv32 | riscv64 | sh4)
+ # little-endian IEEE 754 quadruple-precision
+ gl_cv_cc_long_double_expbit0='word 3 bit 16'
+ ;;
+ s390* | sparc | sparc64)
+ # big-endian IEEE 754 quadruple-precision
+ gl_cv_cc_long_double_expbit0='word 0 bit 16'
+ ;;
+ mips*)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #if defined _MIPSEB /* equivalent: __BYTE_ORDER__ ==
__ORDER_BIG_ENDIAN__ */
+ int big;
+ #else
+ #error little
+ #endif
+ ]], [[]])
+ ],
+ [# big-endian IEEE 754 quadruple-precision
+ gl_cv_cc_long_double_expbit0='word 0 bit 16'
+ ],
+ [# little-endian IEEE 754 quadruple-precision
+ gl_cv_cc_long_double_expbit0='word 3 bit 16'
+ ])
+ ;;
+ powerpc64le)
+ # little-endian double-double
+ gl_cv_cc_long_double_expbit0='word 1 bit 20'
+ ;;
+ powerpc* | rs6000)
+ # big-endian double-double
+ gl_cv_cc_long_double_expbit0='word 0 bit 20'
+ ;;
+ *)
+ gl_cv_cc_long_double_expbit0="unknown"
+ ;;
+ esac
+ fi
])
rm -f conftest.out
])
diff --git a/modules/getpayloadl b/modules/getpayloadl
index a9b93e5d8a..0274af0a52 100644
--- a/modules/getpayloadl
+++ b/modules/getpayloadl
@@ -6,6 +6,8 @@ lib/getpayloadl.c
m4/mathfunc.m4
m4/getpayload.m4
m4/exponentl.m4
+m4/exponentd.m4
+m4/math_h.m4
Depends-on:
math-h
diff --git a/modules/isfinite b/modules/isfinite
index 3039a58802..68382e32a6 100644
--- a/modules/isfinite
+++ b/modules/isfinite
@@ -6,6 +6,8 @@ lib/isfinite.c
m4/isfinite.m4
m4/check-math-lib.m4
m4/exponentl.m4
+m4/exponentd.m4
+m4/math_h.m4
Depends-on:
math-h
diff --git a/modules/isnanl b/modules/isnanl
index 9cee3534e2..4e0def2bb0 100644
--- a/modules/isnanl
+++ b/modules/isnanl
@@ -6,6 +6,8 @@ lib/isnanl.c
lib/isnan.c
lib/float+.h
m4/exponentl.m4
+m4/exponentd.m4
+m4/math_h.m4
m4/isnanl.m4
Depends-on:
diff --git a/modules/isnanl-nolibm b/modules/isnanl-nolibm
index 2375d59318..91e23ca40b 100644
--- a/modules/isnanl-nolibm
+++ b/modules/isnanl-nolibm
@@ -7,6 +7,7 @@ lib/isnanl.c
lib/isnan.c
lib/float+.h
m4/exponentl.m4
+m4/exponentd.m4
m4/isnanl.m4
m4/math_h.m4
diff --git a/modules/setpayloadl b/modules/setpayloadl
index 18dc1ee46c..f58d0f81ca 100644
--- a/modules/setpayloadl
+++ b/modules/setpayloadl
@@ -6,6 +6,8 @@ lib/setpayloadl.c
m4/mathfunc.m4
m4/setpayload.m4
m4/exponentl.m4
+m4/exponentd.m4
+m4/math_h.m4
m4/nan-mips.m4
Depends-on:
diff --git a/modules/setpayloadsigl b/modules/setpayloadsigl
index 370b109fc8..1c1151a7cb 100644
--- a/modules/setpayloadsigl
+++ b/modules/setpayloadsigl
@@ -6,6 +6,8 @@ lib/setpayloadsigl.c
m4/mathfunc.m4
m4/setpayloadsig.m4
m4/exponentl.m4
+m4/exponentd.m4
+m4/math_h.m4
Depends-on:
math-h