2025-07-06 Paul Eggert <eggert@cs.ucla.edu>
float-h-tests: port to C23 PowerPC GCC
- Problem reported by C. Neidhal
- <https://lists.gnu.org/r/bug-gnulib/2025-07/msg00021.html>.
+ Problems reported by C. Neidhal in:
+ https://lists.gnu.org/r/bug-gnulib/2025-07/msg00021.html
+ https://lists.gnu.org/r/bug-gnulib/2025-07/msg00027.html
+ * lib/float.in.h (LDBL_MAX): Do not override on PowerPC
+ if __LDBL_NORM_MAX__ is defined, as GCC versions defining that
+ symbol surely have LDBL_MAX right.
+ (LDBL_NORM_MAX): Prefer __LDBL_NORM_MAX__ if defined.
+ Otherwise, hardcode PowerPC value if applicable.
* modules/float-h-tests (Depends-on): Add floorl, frexpl, ldexpl.
(test_float_h_LDADD): Link the resulting libms too.
* tests/test-float-h.c: Include math.h.
# undef LDBL_MIN
# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
#endif
-#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
+#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__ && !defined __LDBL_NORM_MAX__
# undef LDBL_MAX
/* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }.
It is not easy to define:
# endif
#endif
#ifndef LDBL_NORM_MAX
-# define LDBL_NORM_MAX LDBL_MAX
+# ifdef __LDBL_NORM_MAX__
+# define LDBL_NORM_MAX __LDBL_NORM_MAX__
+# elif FLT_RADIX == 2 && LDBL_MAX_EXP == 1024 && LDBL_MANT_DIG == 106
+# define LDBL_NORM_MAX 8.98846567431157953864652595394501E+307L
+# else
+# define LDBL_NORM_MAX LDBL_MAX
+# endif
#endif
#ifndef LDBL_SNAN
/* For sh, beware of <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111814>. */
{
int xexp;
long double volatile xfrac = frexpl (x, &xexp);
- x = ldexpl (floorl (ldexpl (xfrac, LDBL_MANT_DIG - xexp)),
+ x = ldexpl (floorl (ldexpl (xfrac, LDBL_MANT_DIG)),
xexp - LDBL_MANT_DIG);
}
else
#endif
/* Check the value of LDBL_NORM_MAX. */
- ASSERT (LDBL_NORM_MAX == LDBL_MAX);
+ ASSERT (LDBL_NORM_MAX == normalize_long_double (LDBL_MAX));
/* Check the value of LDBL_SNAN. */
ASSERT (isnanl (LDBL_SNAN));