Floating Point problems with Linux on the EST SBC8260
Neil Russell
caret at c-side.com
Thu May 25 06:43:55 EST 2000
On Wed, May 24, 2000 at 03:47:10PM -0400, diekema_jon wrote:
>
> Floating Point problems with Linux on the EST SBC8260:
>
>
> Questions:
>
> - What is the state of floating point support with Linux on the
> MPC8260?
>
> - Does anybody have hard-float applications running on the MPC8260?
>
> - I am looking for a floating point validation test suite written in
> C. The test suite should start with the fundamentals and work out
> from there.
>
> Does anybody have any leads? This is what I have found so far:
>
> 1) TestFloat-2a
>
> Package Overview for TestFloat Release 2a
>
> John R. Hauser
> 1998 December 16
>
>
> TestFloat is a program for testing that a floating-point implementation
> conforms to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
> TestFloat is distributed in the form of C source code. The TestFloat
> package actually provides two related programs:
>
> -- The `testfloat' program tests a system's floating-point for conformance
> to the IEC/IEEE Standard. This program uses the SoftFloat software
> floating-point implementation as a basis for comparison.
>
> -- The `testsoftfloat' program tests SoftFloat itself for conformance to
> the IEC/IEEE Standard. These tests are performed by comparing against a
> separate, slower software floating-point that is included in the TestFloat
> package.
>
> 2) UCBTEST
>
> UCBTEST is a suite of programs for testing certain difficult cases of
> IEEE 754 floating-point arithmetic. Some of the difficult test cases are
> obtained from number-theoretic algorithms developed by Turing Award winner
> Prof. W. Kahan, Department of Electrical Engineering and Computer Science,
> University of California, Berkeley, as part of ongoing research into test
> methods for computer arithmetic.
>
>
> Either TestFloat or UCBTEST will require some porting effort to run
> on the PPC. I would like to work smarter rather than harder. I can't
> even get the rights answers from printf, *, or /.
>
>
> Environment:
>
> Platform: EST SBC8260 w/ MPC8260 Rev A.1 running at 166 Mhz
> Ethernet: 10 Mbs (SCC)
> Linux kernel: 2.3.99-pre9
> root filesystem (NFS mounted): MontaVista Hard Hat Linux version 1.1
> Toolset: Denx Software CDK recompiled with gcc configured for
> --with-cpu=603e and hard-float (i.e. no --nfp)
>
>
> Application:
>
> Note: The executable was statically linked to pull in the hard-float
> C runtime libraries.
>
> dell 403} cat z.c
> #include "stdio.h"
>
> double x, y, z;
>
> main ()
>
> {
> x = 1234.33;
> printf("x %lf (1234.33) 0x%08lX\n", x , x);
>
> y = 4444.2;
> printf("y %lf (4444.2) 0x%08lX\n", y , y);
>
> z = x * y;
> printf("z = x * y, %lf %lf %lf\n", x , y, z);
>
> z = x / y;
> printf("z = x / y, %lf %lf %lf\n", x , y, z);
> }
>
> dell 404} cat z.s
> .file "z.c"
> gcc2_compiled.:
> .section ".rodata"
> .align 2
> .LC1:
> .string "x %lf (1234.33) 0x%08lX\n"
> .align 2
> .LC3:
> .string "y %lf (4444.2) 0x%08lX\n"
> .align 2
> .LC4:
> .string "z = x * y, %lf %lf %lf\n"
> .align 2
> .LC5:
> .string "z = x / y, %lf %lf %lf\n"
> .align 3
> .LC0:
> .long 0x40934951
> .long 0xeb851eb8
> .align 3
> .LC2:
> .long 0x40b15c33
> .long 0x33333333
> .section ".text"
> .align 2
> .globl main
> .type main, at function
> main:
> stwu 1,-16(1)
> mflr 0
> stw 31,12(1)
> stw 0,20(1)
> mr 31,1
> lis 9,x at ha
> lis 11,.LC0 at ha
> lfd 0,.LC0 at l(11)
> stfd 0,x at l(9)
> lis 9,x at ha
> lis 11,x at ha
> lis 10,.LC1 at ha
> la 3,.LC1 at l(10)
> lfd 1,x at l(9)
> lfd 2,x at l(11)
> creqv 6,6,6
> bl printf
> lis 9,y at ha
> lis 11,.LC2 at ha
> lfd 0,.LC2 at l(11)
> stfd 0,y at l(9)
> lis 9,y at ha
> lis 11,y at ha
> lis 10,.LC3 at ha
> la 3,.LC3 at l(10)
> lfd 1,y at l(9)
> lfd 2,y at l(11)
> creqv 6,6,6
> bl printf
> lis 9,z at ha
> lis 11,x at ha
> lis 10,y at ha
> lfd 0,x at l(11)
> lfd 13,y at l(10)
> fmul 0,0,13
> stfd 0,z at l(9)
> lis 9,x at ha
> lis 11,y at ha
> lis 10,z at ha
> lis 8,.LC4 at ha
> la 3,.LC4 at l(8)
> lfd 1,x at l(9)
> lfd 2,y at l(11)
> lfd 3,z at l(10)
> creqv 6,6,6
> bl printf
> lis 9,z at ha
> lis 11,x at ha
> lis 10,y at ha
> lfd 0,x at l(11)
> lfd 13,y at l(10)
> fdiv 0,0,13
> stfd 0,z at l(9)
> lis 9,x at ha
> lis 11,y at ha
> lis 10,z at ha
> lis 8,.LC5 at ha
> la 3,.LC5 at l(8)
> lfd 1,x at l(9)
> lfd 2,y at l(11)
> lfd 3,z at l(10)
> creqv 6,6,6
> bl printf
> .L2:
> lwz 11,0(1)
> lwz 0,4(11)
> mtlr 0
> lwz 31,-4(11)
> mr 1,11
> blr
> .Lfe1:
> .size main,.Lfe1-main
> .comm x,8,8
> .comm y,8,8
> .comm z,8,8
> .ident "GCC: (GNU) 2.95.2 19991024 (release)"
>
>
> On the target:
>
> > ./a.out
> x nan (1234.33) 0x00000000
> y 0.000000 (4444.2) 0x1003FBCC
> z = x * y, 0.000000 0.000000 0.000000
> z = x / y, 0.000000 0.000000 0.000000
>
>
> The expected results should look something like:
>
> dell 420} ./a.out
> x 1234.330000 (1234.33) 0xEB851EB8
> y 4444.200000 (4444.2) 0x33333333
> z = x * y, 1234.330000 4444.200000 5485609.386000
> z = x / y, 1234.330000 4444.200000 0.277740
>
> We aren't even close to reasonable answers yet.
>
--
Neil Russell <caret at c-side.com>
** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-embedded
mailing list