Andreas Schwab wrote:
> > Bruno Haible wrote the isnanl replacement. Care to enlighten us how the
> > ia64 long double is laid out in memory?
>
> It's identical to the i387 format.
Then there are 3 bugs in glibc-2.3.6 for ia64. Here is a test program:
============================= foo.c ==============================
#include <float.h>
#include <math.h>
#include <stdio.h>
union u { unsigned int word[4]; long double value; } x =
{ { 0x00000000, 0x40000001, 0x0000ffff, 0x00000000 } };
#define X x.value
int main ()
{
printf ("isnanl(X) = %d\n", isnanl (X) != 0);
printf ("isinfl(X) = %d\n", isinfl (X) != 0);
printf ("finitel(X) = %d\n", finitel (X) != 0);
printf ("X == X = %d\n", X == X);
printf ("X + X == X = %d\n", X + X == X);
printf ("X >= 0 || X <= 0 = %d\n", X >= 0 || X <= 0);
printf ("X = %Lg\n", X);
return 0;
}
====================================================================
On i386 (AMD CPU):
$ gcc -Wall -O -fno-builtin foo.c
$ ./a.out
isnanl(X) = 1
isinfl(X) = 0
finitel(X) = 0
X == X = 0
X + X == X = 0
X >= 0 || X <= 0 = 0
X = nan
On ia64 (Intel Itanium 2):
$ gcc -Wall -O -fno-builtin foo.c
$ ./a.out
isnanl(X) = 0
isinfl(X) = 0
finitel(X) = 1
X == X = 0
X + X == X = 0
X >= 0 || X <= 0 = 0
X = -5.94866e+4931
As you can see: On ia64,
- The value of isnanl(X) is wrong.
- The value of finitel(X) is wrong.
- The printf %g result of X is wrong.
Bruno