powerpc targets, long double implementation, and c++ programs
Edmar Wienskoski
edmar@freescale.com
Mon Sep 11 15:25:00 GMT 2006
Joseph S. Myers wrote:
>On Fri, 8 Sep 2006, Edmar Wienskoski wrote:
>
>
>
>>Ok. I am starting to see the whole picture now.
>>So the whole thing appears to work with --disable-shared, just because the way
>>the linker
>>loads symbols in presence of libgcc_s.so versus libgcc.a.
>>
>>Follow up question:
>>The e500 abi actualy defines long double to be 128bits floats.
>>On rs6000.c, rs6000_init_libfuncs links to __gcc_qadd becasue of
>>TARGET_HARD_FLOAT
>>shouldn't that be TARGET_HARD_FLOAT && TARGET_FPRS
>>and also have:
>>diff -u t-fprules-softfp~ t-fprules-softfp
>>--- t-fprules-softfp~ 2006-08-09 14:20:24.000000000 -0500
>>+++ t-fprules-softfp 2006-09-06 12:39:17.000000000 -0500
>>@@ -1,4 +1,4 @@
>>-softfp_float_modes := sf df
>>+softfp_float_modes := sf df tf
>>softfp_int_modes := si di
>>softfp_extensions := sfdf
>>softfp_truncations := dfsf
>>
>>Would that be right ?
>>
>>
>
>No.
>
>(a) The existing GNU/Linux ABIs use or are intended to use IBM long
>double, not IEEE long double, and the E500 GNU/Linux ABI should be
>compatible with the other ABIs in this regard. The present formal ABI
>documents are not very relevant to the de facto GNU/Linux ABIs.
>
>
Well, actually this is part of the problem. We have only one document:
the "e500 Sys V ABI",
which was intended to create only one ABI.
>(b) To use IEEE long double with soft-fp you'll need to add sftf dftf to
>softfp_extensions and tfdf tfsf to softfp_truncations.
>
>
Humm.
>(c) If using IEEE long double on PowerPC, you should be using the standard
>_q_* functions defined in the psABI, and not the __*tf* functions at all.
>glibc does provide the _q_* functions (albeit with a typo meaning _q_utoq
>is missing), though since they don't get built with -mabi=ieeelongdouble
>they aren't actually usable.
>
>
There are 2 issues here:
First, It is libgcc that is generating undefined references to __*tf* functions. If gcc can provide them with "softfp_float_modes := sf df tf", I think is reasonable to do that. For completeness sake you can do as you suggested: change softfp_extensions and softfp_truncations, but they are not absolutely necessary.
Second, is the long double ABI problem. In the past gcc always generated function calls to _q_* functions. (Per ABI Chapter 5)
For this code:
long double foo (long double x, long double y){ return x + y; }
gcc-4.0, target powerpc-eabise and
gcc-4.0, target powerpc-*-linux-gnuspe with -mlong-double-128 option
both generates a call to _q_add.
The same code with gcc-4.2, both targets generates a call to __gcc_qadd.
If there is an intention to change the E500 ABI, then somebody has to step forward and actually change the document (With all the administrative burden that cames with it..).
Edmar
More information about the Gcc
mailing list