bug-m4
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]