Patch for Soft-Float Problems w/ Glibc & Gcc?
Ralph Blach
rcblach at raleigh.ibm.com
Wed Feb 14 04:48:06 EST 2001
Grant,
As I understand it, Softfloat does NOT produce software emulation.
One must have a library to which to link inorder to floating point in
this situation.
The MontaVista toolset seems to have the floating point emulation in it.
Chip
Grant Erickson wrote:
>
> For some time I've noted but have never bothered chasing down the *printf
> problems associated with using -msoft-float/-D_SOFT_FLOAT on Linux/PPC.
>
> Needing to remedy the issue, I started chasing it down using the code
> samples below. When compiled using just '$(CROSS_COMPILE)gcc -o pi-test
> *.c' everything works fine:
>
> user at host% ./pi-test
> The value of Pi is approximately: 3.142857
>
> If I turn-around and compile it with '$(CROSS_COMPILE)gcc -o pi-test
> -msoft-float *.c' or '$(CROSS_COMPILE)gcc -o pi-test -msoft-float
> -D_SOFT_FLOAT *.c' I get:
>
> user at host% ./pi-test
> The value of Pi is approximately: 0.000000
>
> After disassembling the code, from what I can see both bits of code are
> generating the right output for the IEEE single-precision result. Both
> bits of code appear to be following the correct register callee/caller
> convetions for both 'pi' and 'float_print'. So, I have to assume that the
> problem lies somewhere within either the '__extendsfdf2' or 'printf'
> subroutine calls within 'float_print':
>
> Disassembly of section .text:
>
> 00000000 <float_print>:
> 0: 94 21 ff e0 stwu r1,-32(r1)
> 4: 7c 08 02 a6 mflr r0
> 8: 93 e1 00 1c stw r31,28(r1)
> c: 90 01 00 24 stw r0,36(r1)
> 10: 7c 3f 0b 78 mr r31,r1
> 14: 90 7f 00 08 stw r3,8(r31)
> 18: 90 9f 00 0c stw r4,12(r31)
> 1c: 80 7f 00 0c lwz r3,12(r31)
> 20: 48 00 00 01 bl __extendsfdf2
> 24: 7c 69 1b 78 mr r9,r3
> 28: 7c 8a 23 78 mr r10,r4
> 2c: 3d 60 00 00 lis r11,.rodata at h
> 30: 38 6b 00 00 addi r3,r11,.rodata at l
> 34: 80 9f 00 08 lwz r4,8(r31)
> 38: 7d 25 4b 78 mr r5,r9
> 3c: 7d 46 53 78 mr r6,r10
> 40: 48 00 00 01 bl printf
> 44: 7c 60 1b 78 mr r0,r3
> 48: 7c 03 03 78 mr r3,r0
> 4c: 48 00 00 04 b 50 <float_print+0x50>
> 50: 81 61 00 00 lwz r11,0(r1)
> 54: 80 0b 00 04 lwz r0,4(r11)
> 58: 7c 08 03 a6 mtlr r0
> 5c: 83 eb ff fc lwz r31,-4(r11)
> 60: 7d 61 5b 78 mr r1,r11
> 64: 4e 80 00 20 blr
>
> I've heard and have read in back messages that this problem lies in either
> the varags implementation or in the stdio-common (i.e. printf) bits of
> glibc. Does anyone have a patch which addresses this specific problem?
>
> This problem happens on both a Solaris/SPARC to Linux/PPC cross compiler
> as well as on a native Linux/PPC compiler. The former is
> gcc-2.95.3-20010112 (prerelease) with glibc-2.1.3 and the latter is
> gcc-2.95.2-19991024 (release/franzo) with 'glibc-2.1.3 from
> 'glibc-2.1.3-4a'.
>
> For the cross-compiler, the compiler and libraries were configured w/
>
> GCC:
>
> ./configure --host=sparc-sun-solaris2.7 --target=powerpc-linux
> --prefix=$TOOLROOT/host/sparc-sun-solaris
> --with-headers=$TOOLROOT/target/powerpc-linux-gnu/include
> --with-libs=$TOOLROOT/target/powerpc-linux-gnu/lib
> --enable-shared --enable-languages=c,c++
> --with-cpu=403 --without-fp
>
> GLIBC:
>
> ./configure --host=powerpc-linux --with-headers=/usr/src/linux/include
> --enable-shared --enable-add-ons=crypt,linuxthreads
> --prefix=$TOOLROOT/target/powerpc-linux-gnu --without-fp
>
> The test code:
>
> main.c:
>
> int main (void)
> {
> float value;
> int status;
>
> value = pi();
> status = float_print("The value of Pi is approximately", value);
>
> return (status);
> }
>
> pi.c:
>
> float
> pi(void)
> {
> return (22.0/7.0);
> }
>
> float_print.c:
>
> int float_print(const char *string, float value)
> {
> return (printf("%s: %f\n", string, value));
> }
>
> --
> Grant Erickson University of Minnesota Alumni
> o mail:erick205 at umn.edu 1996 BSEE
> o http://www.umn.edu/~erick205 1998 MSEE
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: rcblach.vcf
Type: text/x-vcard
Size: 247 bytes
Desc: Card for Ralph Blach
Url : http://ozlabs.org/pipermail/linuxppc-embedded/attachments/20010213/43329574/attachment.vcf
More information about the Linuxppc-embedded
mailing list