problem while building arm vfp softfloat gcc
Richard Earnshaw
rearnsha@arm.com
Mon Feb 9 10:04:00 GMT 2004
> sorry for my testcase, I had rewriten it to easy to understand, but on the
> contrary...
> Here is my true test case using printf:
> ----main.c
> #include <stdio.h>
> #include <stdlib.h>
>
> int main()
> {
> float i=1.0;
> printf("%f",i);
> return 0;
> }
> ----main.c
>
> here is generated by arm-linux-gcc -S main.c -o main.s
> ----main.s
> <sniz>
> main:
> @ args = 0, pretend = 0, frame = 4
> @ frame_needed = 1, uses_anonymous_args = 0
> mov ip, sp
> stmfd sp!, {r4, fp, ip, lr, pc}
> sub fp, ip, #4
> sub sp, sp, #4
> ldr r3, .L2 @ float
> str r3, [fp, #-20] @ float
> ldr r0, [fp, #-20] @ float
> bl __extendsfdf2
> mov r4, r1
> mov r3, r0
> ldr r0, .L2+4
> mov r2, r4
> mov r1, r3
> bl printf
> mov r3, #0
> mov r0, r3
> <sniz>
> -----main.s
>
> if I arm-linux-gcc main.s -o test
> then execute test on pxa board, it will output: -1.999744
>
> but if I modified the two lines before "bl printf" in main.s to:
> mov r2, r3
> mov r3, r4
> then compile main.s and execute,
> it will print right result: 1.00000
>
> so conclusion:
> my toolchain must has a problem of float param passing, seemly related to
> float word order. so I want to dig into my gcc source tree to find where is
> responsible for generating this wrong asm code.
> I hope this time it's clearer :)
>
> and Dan, I think the most recently snapshot ptxdist still has this problem
> :(
The code above is correct. You should not be doing a word order swap
before the call to printf.
So I think the problem must be in your printf library function (or a
subroutine of that). Two possibilities here:
1) The library was compiled without soft-vfp (it for traditional FPA
format floats).
2) The library needs porting to support soft-vfp (there will probably be
#ifdef __arm__ somewhere in the library, where the code will then assume
that you have FPA format floats).
R.
------
Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com
More information about the crossgcc
mailing list