lkml.org 
[lkml]   [2004]   [Jul]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
Subject[BUG] PPC math-emu multiply problem
I'm seeing what appears to be a bug in the ppc kernel trap math 
emulator. An extreme case for multiplies isn't working the way gcc
soft-float or hardware floating point is. The value in mindble is the
smallest that can be represented in a double. When we try to divide it
by two we should see an underflow and a return value of 0. We see this
when using soft-float in gcc, or when there is HW floating point
support, but it fails when the kernel trap emulator is used.

If anyone can verify this on a PPC other than an 8560 without hardware
floating point I'd appreciate it. I did all of these tests with a 2.6.X
based kernels. The x86 was 2.6.6 vanilla, 8560 is 2.6.6 with lots of
stuff added and support for 8560. The 8260 was 2.6.0 with changes. I
bumped into this with the LSB ldexp test. A simple multiply shows the
problem though.

Greg Weeks

mulbug.c file
------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <math.h>
#include <errno.h>

int main()
{
double x, rtval;
double mindble = 4.9406564584124654418e-324;

x = mindble;

printf("x = %.20g\n", x);

errno = 0;
rtval = ldexp(x, -1);

printf("using ldexp(x, -1) ERRNO = %d - %s, %.20g\n",
errno, strerror(errno), rtval);

printf("using (x * .5) %.20g\n", (x * .5));

exit(0);
}
-----------------------------------------

compile with:
gcc mulbug.c -lm -o mulbug


on an 8260 ppc with HW float.

x = 4.9406564584124654418e-324
using ldexp(x, -1) ERRNO = 34 - Numerical result out of range, 0
using (x * .5) 0

on an x86 with HW float.

x = 4.9406564584124654418e-324
using ldexp(x, -1) ERRNO = 34 - Numerical result out of range, 0
using (x * .5) 0

on an 8560 ppc with kernel trap float emulator.

x = 4.9406564584124654418e-324
using ldexp(x, -1) ERRNO = 0 - Success, 4.9406564584124654418e-324
using (x * .5) 4.9406564584124654418e-324

on an 8260 with soft-float in the gcc

x = 4.9406564584124654418e-324
using ldexp(x, -1) ERRNO = 34 - Numerical result out of range, 0
using (x * .5) 0


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 14:04    [W:0.093 / U:0.088 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site