[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: M4 1.4.9b testsuite failure
From: |
Bruno Haible |
Subject: |
Re: M4 1.4.9b testsuite failure |
Date: |
Thu, 31 May 2007 02:25:31 +0200 |
User-agent: |
KMail/1.5.4 |
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
Re: M4 1.4.9b testsuite failure, Andreas Schwab, 2007/05/30
Re: M4 1.4.9b testsuite failure, Andreas Schwab, 2007/05/30