NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: toolchain/45310: some mixed int/float computations are wrong on mips64
On Tue, Aug 30, 2011 at 06:50:04PM +0000, David Holland wrote:
> Here's a second test that could allow to narrow down the issue:
> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/types.h>
>
> main()
> {
> float a;
> int64_t b;
>
> a = 33.000000;
> b = a;
>
> printf("a %f b %d\n",a, (int)b);
> }
>
> cuba:/home/bouyer>./test3
> a 33.000000 b 0
>
> looks like the problem could be in __fixsfdi() (or one of the functions used
> by
> __fixsfdi()).
I __fixsfdi() uses __fixunssfdi() which uses double to uint casts, which is
the problem as shown by this new test:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
main()
{
double a;
uint b;
a = 33.000000;
b = a;
printf("a %f b %d\n",a, b);
}
cuba:/home/bouyer> gcc -o test4 test4.c
cuba:/home/bouyer> ./test4
a 33.000000 b 0
tracking this down, I ended up in fixunsgen_ieee754.c:__fixunsgen32.
It's called with
exp=5, sign=0, mant_dig=53, fracbits=20, frac={0, 0, 32768}
as exp - mant_dig is larger than 32, __fixunsgen32 returns 0.
mant_dig is a constant from mips/float.h; I've no idea if it's right or
wrong here ...
--
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
NetBSD: 26 ans d'experience feront toujours la difference
--
Home |
Main Index |
Thread Index |
Old Index