Messages in this thread | | | Date | Thu, 29 Jul 2004 09:14:45 -0400 | From | Greg Weeks <> | 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/
| |