X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Fisnanl.m4;h=25daecaedc3c24c0d4347a213b31dedd12aed0be;hb=c861b874f3926ab75f12d66ea194a60775b83fc9;hp=fb63ac45511d55f6f155eb5d099129182cd78a22;hpb=98f80c292346b7d5fb8f92ff7bac252a6ac3800c;p=gnulib.git diff --git a/m4/isnanl.m4 b/m4/isnanl.m4 index fb63ac455..25daecaed 100644 --- a/m4/isnanl.m4 +++ b/m4/isnanl.m4 @@ -1,5 +1,5 @@ -# isnanl.m4 serial 11 -dnl Copyright (C) 2007-2009 Free Software Foundation, Inc. +# isnanl.m4 serial 12 +dnl Copyright (C) 2007-2010 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. @@ -133,20 +133,30 @@ AC_DEFUN([gl_FUNC_ISNANL_WORKS], ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { unsigned int word[NWORDS]; long double value; } memory_long_double; +/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the + runtime type conversion. */ +#ifdef __sgi +static long double NaNl () +{ + double zero = 0.0; + return zero / zero; +} +#else +# define NaNl() (0.0L / 0.0L) +#endif int main () { memory_long_double m; unsigned int i; - /* gcc-3.4.3 on IRIX 6.5 appears to have a problem with this. */ - if (!isnanl (0.0L / 0.0L)) + if (!isnanl (NaNl ())) return 1; /* The isnanl function should be immune against changes in the sign bit and in the mantissa bits. The xor operation twiddles a bit that can only be a sign bit or a mantissa bit (since the exponent never extends to bit 31). */ - m.value = 0.0L / 0.0L; + m.value = NaNl (); m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1); for (i = 0; i < NWORDS; i++) m.word[i] |= 1;