On Mon, 11 Sep 2006, Edmar Wienskoski wrote:

> 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.

softfp_extensions and softfp_truncations are needed for conversions 
between float/double and long double.

> 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.

__gcc_* are for IBM long double.  _q_* are for IEEE long double.  __*tf* 
are for an unspecified version of long double *where there aren't 
ABI-specified functions*; generating calls to them on PowerPC Linux is 
generally a GCC bug.  For IEEE long double, it's definitely better to use 
_q_* from glibc since they support rounding modes and exceptions.  (This 
in general is an advantage of using soft-fp code in glibc where the glibc 
version is known to have a good copy, but doing it in general - for float 
and double - requires extra configure support to be implemented in GCC, 
and some changes in glibc.)

I personally prefer IEEE long double to IBM long double, but in the 
context of the existing family of PowerPC ABIs currently supported by 
glibc and GCC I think trying to use it on Linux is a mistake; if used it 
should have a separate family of target triplets whose names explicitly 
indicate a new ABI.

-- 
Joseph S. Myers
[EMAIL PROTECTED]

Reply via email to