This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: long double (was "strtold?")


On Tuesday 07 April 2009 00:30:19 Jeff Johnston wrote:
> Hi Ken,
>
> A number of comments:
>
> 1) Use _LONG_DOUBLE instead of long double everywhere
>     The PPC SPE for example redefines _LONG_DOUBLE to be double in
> sys/config.h
>     Other platforms are allowed to do this.

Changing the type of the arguments of the long double functions alters their 
signature. That means these functions aren't POSIX compliant anymore. 
The former patch guards the implementation by _LDBL_EQ_DBL which is only true 
if the compiler supports C99 or C++. A strict ansi or pre C99 compiler 
wouldn't see that code.
I agree with Craig that having an automake conditional which skips the sources 
would be nice. Since AC_TYPE_LONG_DOUBLE isn't available with the autoconf 
version used by newlib (2.59) it took me a while to find a way to do it. I 
think something like that could be (I'm still struggling with the autotools):
AC_CACHE_CHECK([Checking long double support], [acnewlib_cv_type_long_double],
  [AC_TRY_COMPILE([], [long double foo = 0.0L;],
    [acnewlib_cv_type_long_double = yes;],
    [acnewlib_cv_type_long_double = no;])])
AM_CONDITIONAL(HAVE_LONG_DOUBLE, test x"$acnewlib_cv_type_long_double" = 
x"yes")

> 2) Put the _LDBL_EQ_DBL check in libc/include/machine/ieeefp.h

Done. I moved the check from _ansi.h to machine/ieeefp.h and included 
<machine/ieeefp.h> from stdlib.h.

>     (fix the SPE to manually #undef and then #define it to true in
> sys/config.h)

What is the reason for that? Do you expect a compile time speedup? The 
_LDBL_EQ_DBL check that has just moved into machine/ieeefp.h seems to provide 
a more generic solution. I guess I miss something here.

> 3) Add a license for the new files.  If it is copied from a file without
> a license, then mention which
>     file it is copied from or add the Red Hat license from
> COPYING.NEWLIB which is the
>     default license

Done.

> 4) If these functions will ever be implemented, they will probably end
> up in libm/math, not libm/common
>      If Craig doesn't mind doing this when he implements them, I have no
> objections.

For now the files are still placed in the libm/common directory but I'm happy 
to change that if required.

> 5) Some docs would be nice at least to state the group is only available
> when long double == double

Where are these things documented?

> -- Jeff J.

Attached is the reworked version of the patch (gzipped due to size limits).

Ken

newlib/ChangeLog:

2009-04-07  Ken Werner  <ken.werner@de.ibm.com>

        * libc/include/machine/ieeefp.h: Add _LDBL_EQ_DBL define.
        * libc/include/stdlib.h: Include <machine/ieeefp.h>.
          (strtold, wcstold): Declare.
        * libc/stdlib/strtold.c: New File.
        * libc/stdlib/wcstold.c: Likewise.
        * libc/configure.in: Add long double check. 
        * libc/configure: Regenerate.
        * libc/stdlib/Makefile.am: Add strtold.c and wcstold.c.
        * libc/stdlib/Makefile.in: Regenerate.
        * libc/include/math.h (atanl, cosl, sinl, tanl, tanhl, frexpl, modfl, 
          ceill, fabsl, floorl, log1pl, expm1l, acosl, asinl, atan2l, coshl, 
          sinhl, expl, ldexpl, logl, log10l, powl, sqrtl, fmodl, hypotl, 
          copysignl, nanl, ilogbl, asinhl, cbrt, nextafterl, rintl, scalbnl, 
          exp2l, scalblnl, tgammal, nearbyintl, lrintl, llrintl, roundl, 
          lroundl, llround, llroundl, truncl, remquol, fdiml, fmaxl, fminl,
          fmal, acoshl, atanhl, remainderl, lgammal, erfl, erfcl): Declare.
        * libm/common/atanl.c: New File.
        * libm/common/cosl.c: Likewise.
        * libm/common/sinl.c: Likewise.
        * libm/common/modfl.c: Likewise.
        * libm/common/frexpl.c: Likewise.
        * libm/common/tanhl.c: Likewise.
        * libm/common/tanl.c: Likewise.
        * libm/common/expm1l.c: Likewise.
        * libm/common/log1pl.c: Likewise.
        * libm/common/ceill.c: Likewise.
        * libm/common/fabsl.c: Likewise.
        * common/floorl.c: Likewise.
        * libm/common/acosl.c: Likewise.
        * libm/common/asinl.c: Likewise.
        * libm/common/atan2l.c: Likewise.
        * libm/common/coshl.c: Likewise.
        * libm/common/expl.c: Likewise.
        * libm/common/fmodl.c: Likewise.
        * libm/common/hypotl.c: Likewise.
        * libm/common/ldexpl.c: Likewise.
        * libm/common/log10l.c: Likewise.
        * libm/common/logl.c: Likewise.
        * libm/common/powl.c: Likewise.
        * libm/common/sqrtl.c: Likewise.
        * libm/common/copysignl.c: Likewise.
        * libm/common/ilogbl.c: Likewise.
        * libm/common/nanl.c: Likewise.
        * libm/common/cbrtl.c: Likewise.
        * libm/common/asinhl.c: Likewise.
        * libm/common/nextafterl.c: Likewise.
        * libm/common/rintl.c: Likewise.
        * libm/common/scalbnl.c: Likewise.
        * libm/common/exp2l.c: Likewise.
        * libm/common/fdiml.c: Likewise.
        * libm/common/fmal.c: Likewise.
        * libm/common/fmaxl.c: Likewise.
        * libm/common/fminl.c: Likewise.
        * libm/common/lrintl.c: Likewise.
        * libm/common/lroundl.c: Likewise.
        * libm/common/nearbyintl.c: Likewise.
        * libm/common/remquol.c: Likewise.
        * libm/common/roundl.c: Likewise.
        * libm/common/scalblnl.c: Likewise.
        * libm/common/truncl.c: Likewise.
        * libm/common/acoshl.c: Likewise.
        * libm/common/atanhl.c: Likewise.
        * libm/common/erfcl.c: Likewise.
        * libm/common/erfl.c: Likewise.
        * libm/common/lgammal.c: Likewise.
        * libm/common/remainderl.c: Likewise.
        * libm/common/tgammal.c: Likewise.
        * libm/common/sinhl.c: Likewise.
        * libm/common/llroundl.c: Likewise.
        * libm/configure.in: Add long double check.
        * libm/configure: Regenerate.
        * libm/common/Makefile.am: Add new files.
        * libm/common/Makefile.in: Regenerate.

Attachment: longdouble.patch.gz
Description: GNU Zip compressed data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]