* libc/include/complex.h (cabsl): Add prototype.

(cimagl): Add prototype.
	(creall): Add prototype.
	* libc/include/ieeefp.h: Include float.h.
	(EXT_EXPBITS, EXT_FRACHBITS, EXT_FRACLBITS)
	(EXT_EXP_INFNAN. EXT_EXP_BIAS, EXT_FRACBITS): Define.
	(struct ieee_ext, union ieee_ext_u): New types for long double
	support.
	* libc/include/math.h (finitel): Add prototype.
	(hypotl): Add prototype.
	(sqrtl): Add prototype.
	* libm/common/Makefile.am (lsrc): Add sl_finite.c.
	* libm/common/Makefile.in: Regenerate.
	* libm/common/fdlibm.h (__ieee754_hypotl): Add prototype.
	* libm/common/hypotl.c (hypotl): Add implementation for when long
	double is larger than double.
	* libm/common/sqrtl.c (sqrtl): Likewise.
	* libm/common/sl_finite.c: New file.  Adds implementation of the
	finitel function.
	* libm/complex/Makefile.am (lsrc): Define.
	(libcomplex_la_SOURCES): Add lsrc.
	(lib_a_SOURCES): Add lsrc.
	* libm/complex/Makefile.in: Regenerate.
	* libm/complex/cabs.c: Add documentation of cabsl function.
	* libm/complex/cimag.c: Add documentation of cimagl function.
	* libm/complex/creall.c: Add documentation of creall function.
	* libm/complex/cabsl.c: New file.  Adds implementation of the
	cabsl function.
	* libm/complex/cimagl.c: New file.  Adds implementation of the
	cimagl function.
	* libm/complex/creall.c: New file.  Adds implementation of the
	creall function.
	* libm/math/Makefile.am (lsrc): Define.
	(libmath_la_SOURCES): Add lsrc.
	(lib_a_SOURCES): Add lsrc.
	* libm/math/Makefile.in: Regenerate.
	* libm/math/el_hypot.c: New file.  Adds implementation of the
	__ieee754_hypotl function.
This commit is contained in:
Nick Clifton 2015-02-06 16:14:04 +00:00
parent db004c5d7a
commit b9e7cd9a84
23 changed files with 525 additions and 52 deletions

View File

@ -1,3 +1,44 @@
2015-02-06 Nick Clifton <nickc@redhat.com>
* libc/include/complex.h (cabsl): Add prototype.
(cimagl): Add prototype.
(creall): Add prototype.
* libc/include/ieeefp.h: Include float.h.
(EXT_EXPBITS, EXT_FRACHBITS, EXT_FRACLBITS)
(EXT_EXP_INFNAN. EXT_EXP_BIAS, EXT_FRACBITS): Define.
(struct ieee_ext, union ieee_ext_u): New types for long double
support.
* libc/include/math.h (finitel): Add prototype.
(hypotl): Add prototype.
(sqrtl): Add prototype.
* libm/common/Makefile.am (lsrc): Add sl_finite.c.
* libm/common/Makefile.in: Regenerate.
* libm/common/fdlibm.h (__ieee754_hypotl): Add prototype.
* libm/common/hypotl.c (hypotl): Add implementation for when long
double is larger than double.
* libm/common/sqrtl.c (sqrtl): Likewise.
* libm/common/sl_finite.c: New file. Adds implementation of the
finitel function.
* libm/complex/Makefile.am (lsrc): Define.
(libcomplex_la_SOURCES): Add lsrc.
(lib_a_SOURCES): Add lsrc.
* libm/complex/Makefile.in: Regenerate.
* libm/complex/cabs.c: Add documentation of cabsl function.
* libm/complex/cimag.c: Add documentation of cimagl function.
* libm/complex/creall.c: Add documentation of creall function.
* libm/complex/cabsl.c: New file. Adds implementation of the
cabsl function.
* libm/complex/cimagl.c: New file. Adds implementation of the
cimagl function.
* libm/complex/creall.c: New file. Adds implementation of the
creall function.
* libm/math/Makefile.am (lsrc): Define.
(libmath_la_SOURCES): Add lsrc.
(lib_a_SOURCES): Add lsrc.
* libm/math/Makefile.in: Regenerate.
* libm/math/el_hypot.c: New file. Adds implementation of the
__ieee754_hypotl function.
2015-02-04 Corinna Vinschen <vinschen@redhat.com>
* libc/include/wchar.h (wcstold): Drop _LDBL_EQ_DBL requirement for

View File

@ -83,6 +83,7 @@ float complex clogf(float complex);
float cabsf(float complex) __RENAME(__c99_cabsf);
#endif
*/
long double cabsl(long double complex) ;
double cabs(double complex) ;
float cabsf(float complex) ;
@ -102,7 +103,7 @@ float cargf(float complex);
/* 7.3.9.2 The cimag functions */
double cimag(double complex);
float cimagf(float complex);
/*long double cimagl(long double complex); */
long double cimagl(long double complex);
/* 7.3.9.3 The conj functions */
double complex conj(double complex);
@ -117,7 +118,7 @@ float complex cprojf(float complex);
/* 7.3.9.5 The creal functions */
double creal(double complex);
float crealf(float complex);
/*long double creall(long double complex); */
long double creall(long double complex);
__END_DECLS

View File

@ -4,11 +4,12 @@
#include "_ansi.h"
#include <machine/ieeefp.h>
#include <float.h>
_BEGIN_STD_C
/* FIXME FIXME FIXME:
Neither of __ieee_{float,double}_shape_tape seem to be used anywhere
Neither of __ieee_{float,double}_shape_type seem to be used anywhere
except in libm/test. If that is the case, please delete these from here.
If that is not the case, please insert documentation here describing why
they're needed. */
@ -46,9 +47,7 @@ typedef union
long aslong[2];
} __ieee_double_shape_type;
#endif
#ifdef __IEEE_LITTLE_ENDIAN
#elif defined __IEEE_LITTLE_ENDIAN
typedef union
{
@ -92,7 +91,7 @@ typedef union
} __ieee_double_shape_type;
#endif
#endif /* __IEEE_LITTLE_ENDIAN */
#ifdef __IEEE_BIG_ENDIAN
@ -118,9 +117,7 @@ typedef union
} __ieee_float_shape_type;
#endif
#ifdef __IEEE_LITTLE_ENDIAN
#elif defined __IEEE_LITTLE_ENDIAN
typedef union
{
@ -144,10 +141,70 @@ typedef union
} __ieee_float_shape_type;
#endif /* __IEEE_LITTLE_ENDIAN */
#ifndef _LDBL_EQ_DBL
#ifndef LDBL_MANT_DIG
#error "LDBL_MANT_DIG not defined - should be found in float.h"
#elif LDBL_MANT_DIG == DBL_MANT_DIG
#error "double and long double are the same size but LDBL_EQ_DBL is not defined"
#elif LDBL_MANT_DIG == 53
/* This happens when doubles are 32-bits and long doubles are 64-bits. */
#define EXT_EXPBITS 11
#define EXT_FRACHBITS 20
#define EXT_FRACLBITS 32
#define __ieee_ext_field_type unsigned long
#elif LDBL_MANT_DIG == 64
#define EXT_EXPBITS 15
#define EXT_FRACHBITS 32
#define EXT_FRACLBITS 32
#define __ieee_ext_field_type unsigned int
#elif LDBL_MANT_DIG == 65
#define EXT_EXPBITS 15
#define EXT_FRACHBITS 32
#define EXT_FRACLBITS 32
#define __ieee_ext_field_type unsigned int
#elif LDBL_MANT_DIG == 112
#define EXT_EXPBITS 15
#define EXT_FRACHBITS 48
#define EXT_FRACLBITS 64
#define __ieee_ext_field_type unsigned long long
#elif LDBL_MANT_DIG == 113
#define EXT_EXPBITS 15
#define EXT_FRACHBITS 48
#define EXT_FRACLBITS 64
#define __ieee_ext_field_type unsigned long long
#else
#error Unsupported value for LDBL_MANT_DIG
#endif
#define EXT_EXP_INFNAN ((1 << EXT_EXPBITS) - 1) /* 32767 */
#define EXT_EXP_BIAS ((1 << (EXT_EXPBITS - 1)) - 1) /* 16383 */
#define EXT_FRACBITS (EXT_FRACLBITS + EXT_FRACHBITS)
typedef struct ieee_ext
{
__ieee_ext_field_type ext_fracl : EXT_FRACLBITS;
__ieee_ext_field_type ext_frach : EXT_FRACHBITS;
__ieee_ext_field_type ext_exp : EXT_EXPBITS;
__ieee_ext_field_type ext_sign : 1;
} ieee_ext;
typedef union ieee_ext_u
{
long double extu_ld;
struct ieee_ext extu_ext;
} ieee_ext_u;
#endif /* ! _LDBL_EQ_DBL */
/* FLOATING ROUNDING */

View File

@ -254,6 +254,10 @@ extern int __signbitd (double x);
(__extension__ ({__typeof__(a) __a = (a); __typeof__(b) __b = (b); \
fpclassify(__a) == FP_NAN || fpclassify(__b) == FP_NAN;}))
/* Non ANSI long double precision functions. */
extern int finitel _PARAMS((long double));
/* Non ANSI double precision functions. */
extern double infinity _PARAMS((void));
@ -454,6 +458,8 @@ extern long double erfl _PARAMS((long double));
extern long double erfcl _PARAMS((long double));
#endif /* ! defined (_REENT_ONLY) */
#else /* !_LDBL_EQ_DBL */
extern long double hypotl _PARAMS((long double, long double));
extern long double sqrtl _PARAMS((long double));
#ifdef __i386__
/* Other long double precision functions. */
extern _LONG_DOUBLE rintl _PARAMS((_LONG_DOUBLE));

View File

@ -104,7 +104,10 @@ char *_EXFUN(strerror_r,(int, char *, size_t));
#else
# ifdef __GNUC__
int _EXFUN(strerror_r,(int, char *, size_t))
__asm__ (__ASMNAME ("__xpg_strerror_r"));
#ifdef __ASMNAME
__asm__ (__ASMNAME ("__xpg_strerror_r"))
#endif
;
# else
int _EXFUN(__xpg_strerror_r,(int, char *, size_t));
# define strerror_r __xpg_strerror_r

View File

@ -60,6 +60,7 @@ setjmp:
clr r12
ret
#endif
.size setjmp , . - setjmp
.global longjmp
@ -102,4 +103,5 @@ longjmp:
add.w #2, r1
mov.w r14, r0
#endif
.size longjmp , . - longjmp

View File

@ -31,8 +31,8 @@ lsrc = atanl.c cosl.c sinl.c tanl.c tanhl.c frexpl.c modfl.c ceill.c fabsl.c \
scalbnl.c exp2l.c scalblnl.c tgammal.c nearbyintl.c lrintl.c llrintl.c \
roundl.c lroundl.c llroundl.c truncl.c remquol.c fdiml.c fmaxl.c fminl.c \
fmal.c acoshl.c atanhl.c remainderl.c lgammal.c erfl.c erfcl.c \
logbl.c nexttowardf.c nexttoward.c nexttowardl.c log2l.c
logbl.c nexttowardf.c nexttoward.c nexttowardl.c log2l.c \
sl_finite.c
libcommon_la_LDFLAGS = -Xcompiler -nostdlib

View File

@ -139,7 +139,7 @@ am__objects_3 = lib_a-atanl.$(OBJEXT) lib_a-cosl.$(OBJEXT) \
lib_a-erfl.$(OBJEXT) lib_a-erfcl.$(OBJEXT) \
lib_a-logbl.$(OBJEXT) lib_a-nexttowardf.$(OBJEXT) \
lib_a-nexttoward.$(OBJEXT) lib_a-nexttowardl.$(OBJEXT) \
lib_a-log2l.$(OBJEXT)
lib_a-log2l.$(OBJEXT) lib_a-sl_finite.$(OBJEXT)
@HAVE_LONG_DOUBLE_TRUE@@USE_LIBTOOL_FALSE@am__objects_4 = \
@HAVE_LONG_DOUBLE_TRUE@@USE_LIBTOOL_FALSE@ $(am__objects_3)
@USE_LIBTOOL_FALSE@am_lib_a_OBJECTS = $(am__objects_1) \
@ -173,7 +173,7 @@ am__objects_7 = atanl.lo cosl.lo sinl.lo tanl.lo tanhl.lo frexpl.lo \
lroundl.lo llroundl.lo truncl.lo remquol.lo fdiml.lo fmaxl.lo \
fminl.lo fmal.lo acoshl.lo atanhl.lo remainderl.lo lgammal.lo \
erfl.lo erfcl.lo logbl.lo nexttowardf.lo nexttoward.lo \
nexttowardl.lo log2l.lo
nexttowardl.lo log2l.lo sl_finite.lo
@HAVE_LONG_DOUBLE_TRUE@@USE_LIBTOOL_TRUE@am__objects_8 = \
@HAVE_LONG_DOUBLE_TRUE@@USE_LIBTOOL_TRUE@ $(am__objects_7)
@USE_LIBTOOL_TRUE@am_libcommon_la_OBJECTS = $(am__objects_5) \
@ -360,7 +360,8 @@ lsrc = atanl.c cosl.c sinl.c tanl.c tanhl.c frexpl.c modfl.c ceill.c fabsl.c \
scalbnl.c exp2l.c scalblnl.c tgammal.c nearbyintl.c lrintl.c llrintl.c \
roundl.c lroundl.c llroundl.c truncl.c remquol.c fdiml.c fmaxl.c fminl.c \
fmal.c acoshl.c atanhl.c remainderl.c lgammal.c erfl.c erfcl.c \
logbl.c nexttowardf.c nexttoward.c nexttowardl.c log2l.c
logbl.c nexttowardf.c nexttoward.c nexttowardl.c log2l.c \
sl_finite.c
libcommon_la_LDFLAGS = -Xcompiler -nostdlib
@USE_LIBTOOL_TRUE@noinst_LTLIBRARIES = libcommon.la
@ -1238,6 +1239,12 @@ lib_a-log2l.o: log2l.c
lib_a-log2l.obj: log2l.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-log2l.obj `if test -f 'log2l.c'; then $(CYGPATH_W) 'log2l.c'; else $(CYGPATH_W) '$(srcdir)/log2l.c'; fi`
lib_a-sl_finite.o: sl_finite.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sl_finite.o `test -f 'sl_finite.c' || echo '$(srcdir)/'`sl_finite.c
lib_a-sl_finite.obj: sl_finite.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sl_finite.obj `if test -f 'sl_finite.c'; then $(CYGPATH_W) 'sl_finite.c'; else $(CYGPATH_W) '$(srcdir)/sl_finite.c'; fi`
mostlyclean-libtool:
-rm -f *.lo

View File

@ -146,6 +146,8 @@ extern double scalb __P((double, double));
#endif
extern double significand __P((double));
extern long double __ieee754_hypotl __P((long double, long double));
/* ieee style elementary functions */
extern double __ieee754_sqrt __P((double));
extern double __ieee754_acos __P((double));

View File

@ -29,14 +29,61 @@ POSSIBILITY OF SUCH DAMAGE.
*/
#include <math.h>
#include "local.h"
#include <errno.h>
#include "fdlibm.h"
/* On platforms where long double is as wide as double. */
#ifdef _LDBL_EQ_DBL
long double
hypotl (long double x, long double y)
{
return hypot(x, y);
}
#endif
#ifdef _LDBL_EQ_DBL
/* On platforms where long double is as wide as double. */
return hypot(x, y);
#else
long double z;
z = __ieee754_hypotl (x, y);
if (_LIB_VERSION == _IEEE_)
return z;
if ((! finitel (z)) && finitel (x) && finitel (y))
{
/* hypot (finite, finite) overflow. */
struct exception exc;
exc.type = OVERFLOW;
exc.name = "hypotl";
exc.err = 0;
exc.arg1 = x;
exc.arg2 = y;
if (_LIB_VERSION == _SVID_)
exc.retval = HUGE;
else
{
#ifndef HUGE_VAL
#define HUGE_VAL inf
double inf = 0.0;
SET_HIGH_WORD (inf, 0x7ff00000); /* Set inf to infinite. */
#endif
exc.retval = HUGE_VAL;
}
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
else if (! matherr (& exc))
errno = ERANGE;
if (exc.err != 0)
errno = exc.err;
return (long double) exc.retval;
}
return z;
#endif /* ! _LDBL_EQ_DBL */
}

View File

@ -0,0 +1,25 @@
/* Copyright (C) 2015 by Red Hat, Incorporated. All rights reserved.
*
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
/* finitel(x) returns 1 is x is finite, else 0; */
#include <math.h>
int
finitel (long double x)
{
#ifdef _LDBL_EQ_DBL
return finite (x);
#else
/* Let the compiler do this for us.
Note - we do not know how many bits there are in a long double.
Some architectures for example have an 80-bit long double whereas
others use 128-bits. We use macros and comiler builtin functions
to avoid specific knowledge of the long double format. */
return __builtin_isinf_sign (x) == 0;
#endif
}

View File

@ -31,12 +31,165 @@ POSSIBILITY OF SUCH DAMAGE.
#include <math.h>
#include "local.h"
/* On platforms where long double is as wide as double. */
#ifdef _LDBL_EQ_DBL
/* On platforms where long double is as wide as double. */
long double
sqrtl (long double x)
{
return sqrt(x);
}
#else
/* This code is based upon the version in the BSD math's library.
That code is...
*
* Copyright (c) 2007 Steven G. Kargl
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice unmodified, this list of conditions, and the following
* disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <float.h>
#include "ieeefp.h"
#ifndef LDBL_NBIT
#define LDBL_NBIT 0
#endif
#ifndef LDBL_MAX_EXP
#define LDBL_MAX_EXP DBL_MAX_EXP
#endif
/* Return (x + ulp) for normal positive x. Assumes no overflow. */
static inline long double
inc (long double x)
{
union ieee_ext_u ux = { .extu_ld = x, };
if (++ux.extu_ext.ext_fracl == 0)
{
if (++ux.extu_ext.ext_frach == 0)
{
ux.extu_ext.ext_exp++;
ux.extu_ext.ext_frach |= LDBL_NBIT;
}
}
return ux.extu_ld;
}
/* Return (x - ulp) for normal positive x. Assumes no underflow. */
static inline long double
dec (long double x)
{
union ieee_ext_u ux = { .extu_ld = x, };
if (ux.extu_ext.ext_fracl-- == 0)
{
if (ux.extu_ext.ext_frach-- == LDBL_NBIT)
{
ux.extu_ext.ext_exp--;
ux.extu_ext.ext_frach |= LDBL_NBIT;
}
}
return ux.extu_ld;
}
/* This is slow, but simple and portable. */
long double
sqrtl (long double x)
{
union ieee_ext_u ux = { .extu_ld = x, };
int k, r;
long double lo, xn;
/* If x = NaN, then sqrt(x) = NaN. */
/* If x = Inf, then sqrt(x) = Inf. */
/* If x = -Inf, then sqrt(x) = NaN. */
if (ux.extu_ext.ext_exp == LDBL_MAX_EXP * 2 - 1)
return (x * x + x);
/* If x = +-0, then sqrt(x) = +-0. */
if (x == 0.0L || x == -0.0L)
return x;
/* If x < 0, then raise invalid and return NaN. */
if (ux.extu_ext.ext_sign)
return ((x - x) / (x - x));
if (ux.extu_ext.ext_exp == 0)
{
/* Adjust subnormal numbers. */
ux.extu_ld *= 0x1.0p514;
k = -514;
}
else
k = 0;
/* ux.extu_ld is a normal number, so break it into ux.extu_ld = e*2^n where
ux.extu_ld = (2*e)*2^2k for odd n and ux.extu_ld = (4*e)*2^2k for even n. */
if ((ux.extu_ext.ext_exp - EXT_EXP_BIAS) & 1)
{
/* n is even. */
k += ux.extu_ext.ext_exp - EXT_EXP_BIAS - 1; /* 2k = n - 2. */
ux.extu_ext.ext_exp = EXT_EXP_BIAS + 1; /* ux.extu_ld in [2,4). */
}
else
{
k += ux.extu_ext.ext_exp - EXT_EXP_BIAS; /* 2k = n - 1. */
ux.extu_ext.ext_exp = EXT_EXP_BIAS; /* ux.extu_ld in [1,2). */
}
/* Newton's iteration.
Split ux.extu_ld into a high and low part to achieve additional precision. */
xn = sqrt ((double) ux.extu_ld); /* 53-bit estimate of sqrtl(x). */
#if LDBL_MANT_DIG > 100
xn = (xn + (ux.extu_ld / xn)) * 0.5; /* 106-bit estimate. */
#endif
lo = ux.extu_ld;
ux.extu_ext.ext_fracl = 0; /* Zero out lower bits. */
lo = (lo - ux.extu_ld) / xn; /* Low bits divided by xn. */
xn = xn + (ux.extu_ld / xn); /* High portion of estimate. */
ux.extu_ld = xn + lo; /* Combine everything. */
ux.extu_ext.ext_exp += (k >> 1) - 1;
xn = x / ux.extu_ld; /* Chopped quotient (inexact?). */
/* For simplicity we round to nearest. */
xn = inc (xn); /* xn = xn + ulp. */
ux.extu_ld = ux.extu_ld + xn; /* Chopped sum. */
ux.extu_ext.ext_exp--;
return ux.extu_ld;
}
#endif /* ! _LDBL_EQ_DBL */

View File

@ -9,7 +9,8 @@ src = cabs.c cacos.c cacosh.c carg.c casin.c casinh.c \
cexp.c cimag.c clog.c conj.c \
cpow.c cproj.c creal.c \
csin.c csinh.c csqrt.c ctan.c ctanh.c
lsrc = cabsl.c creall.c cimagl.c
fsrc = cabsf.c casinf.c ccosf.c cimagf.c cprojf.c \
csqrtf.c cacosf.c casinhf.c ccoshf.c clogf.c \
@ -21,11 +22,11 @@ libcomplex_la_LDFLAGS = -Xcompiler -nostdlib
if USE_LIBTOOL
noinst_LTLIBRARIES = libcomplex.la
libcomplex_la_SOURCES = $(src) $(fsrc)
libcomplex_la_SOURCES = $(src) $(fsrc) $(lsrc)
noinst_DATA = objectlist.awk.in
else
noinst_LIBRARIES = lib.a
lib_a_SOURCES = $(src) $(fsrc)
lib_a_SOURCES = $(src) $(fsrc) $(lsrc)
lib_a_CFLAGS = $(AM_CFLAGS)
noinst_DATA =
endif # USE_LIBTOOL

View File

@ -79,8 +79,11 @@ am__objects_2 = lib_a-cabsf.$(OBJEXT) lib_a-casinf.$(OBJEXT) \
lib_a-cargf.$(OBJEXT) lib_a-catanhf.$(OBJEXT) \
lib_a-cexpf.$(OBJEXT) lib_a-cpowf.$(OBJEXT) \
lib_a-csinhf.$(OBJEXT)
am__objects_5 = lib_a-cabsl.$(OBJEXT) lib_a-creall.$(OBJEXT) \
lib_a-cimagl.$(OBJEXT)
@USE_LIBTOOL_FALSE@am_lib_a_OBJECTS = $(am__objects_1) \
@USE_LIBTOOL_FALSE@ $(am__objects_2)
@USE_LIBTOOL_FALSE@ $(am__objects_2) \
@USE_LIBTOOL_FALSE@ $(am__objects_5)
lib_a_OBJECTS = $(am_lib_a_OBJECTS)
LTLIBRARIES = $(noinst_LTLIBRARIES)
libcomplex_la_LIBADD =
@ -93,8 +96,10 @@ am__objects_4 = cabsf.lo casinf.lo ccosf.lo cimagf.lo cprojf.lo \
ctanf.lo cacoshf.lo catanf.lo cephes_subrf.lo conjf.lo \
csinf.lo ctanhf.lo cargf.lo catanhf.lo cexpf.lo cpowf.lo \
csinhf.lo
am__objects_6 = cabsl.lo creall.lo ciamgl.lo
@USE_LIBTOOL_TRUE@am_libcomplex_la_OBJECTS = $(am__objects_3) \
@USE_LIBTOOL_TRUE@ $(am__objects_4)
@USE_LIBTOOL_TRUE@ $(am__objects_4) \
@USE_LIBTOOL_TRUE@ $(am__objects_6)
libcomplex_la_OBJECTS = $(am_libcomplex_la_OBJECTS)
libcomplex_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@ -249,6 +254,8 @@ src = cabs.c cacos.c cacosh.c carg.c casin.c casinh.c \
cpow.c cproj.c creal.c \
csin.c csinh.c csqrt.c ctan.c ctanh.c
lsrc = cabsl.c creall.c cimagl.c
fsrc = cabsf.c casinf.c ccosf.c cimagf.c cprojf.c \
csqrtf.c cacosf.c casinhf.c ccoshf.c clogf.c \
crealf.c ctanf.c cacoshf.c catanf.c \
@ -257,11 +264,11 @@ fsrc = cabsf.c casinf.c ccosf.c cimagf.c cprojf.c \
libcomplex_la_LDFLAGS = -Xcompiler -nostdlib
@USE_LIBTOOL_TRUE@noinst_LTLIBRARIES = libcomplex.la
@USE_LIBTOOL_TRUE@libcomplex_la_SOURCES = $(src) $(fsrc)
@USE_LIBTOOL_TRUE@libcomplex_la_SOURCES = $(src) $(fsrc) $(lsrc)
@USE_LIBTOOL_FALSE@noinst_DATA =
@USE_LIBTOOL_TRUE@noinst_DATA = objectlist.awk.in
@USE_LIBTOOL_FALSE@noinst_LIBRARIES = lib.a
@USE_LIBTOOL_FALSE@lib_a_SOURCES = $(src) $(fsrc)
@USE_LIBTOOL_FALSE@lib_a_SOURCES = $(src) $(fsrc) $(lsrc)
@USE_LIBTOOL_FALSE@lib_a_CFLAGS = $(AM_CFLAGS)
chobj = cabs.def cacos.def cacosh.def carg.def \
casin.def casinh.def catan.def catanh.def \
@ -617,6 +624,27 @@ lib_a-csinhf.o: csinhf.c
lib_a-csinhf.obj: csinhf.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-csinhf.obj `if test -f 'csinhf.c'; then $(CYGPATH_W) 'csinhf.c'; else $(CYGPATH_W) '$(srcdir)/csinhf.c'; fi`
lib_a-cabsl.o: cabsl.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-cabsl.o `test -f 'cabsl.c' || echo '$(srcdir)/'`cabsl.c
lib_a-cabsl.obj: cabsl.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-cabsl.obj `if test -f 'cabsl.c'; then $(CYGPATH_W) 'cabsl.c'; else $(CYGPATH_W) '$(srcdir)/cabsl.c'; fi`
lib_a-creall.o: creall.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-creall.o `test -f 'creall.c' || echo '$(srcdir)/'`creall.c
lib_a-creall.obj: creall.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-creall.obj `if test -f 'creall.c'; then $(CYGPATH_W) 'creall.c'; else $(CYGPATH_W) '$(srcdir)/creall.c'; fi`
lib_a-cimagl.o: cimagl.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-cimagl.o `test -f 'cimagl.c' || echo '$(srcdir)/'`cimagl.c
lib_a-cimagl.obj: cimagl.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-cimagl.obj `if test -f 'cimagl.c'; then $(CYGPATH_W) 'cimagl.c'; else $(CYGPATH_W) '$(srcdir)/cimagl.c'; fi`
mostlyclean-libtool:
-rm -f *.lo

View File

@ -10,17 +10,20 @@
/*
FUNCTION
<<cabs>>, <<cabsf>>---complex absolute-value
<<cabs>>, <<cabsf>>, <<cabsl>>---complex absolute-value
INDEX
cabs
INDEX
cabsf
INDEX
cabsl
ANSI_SYNOPSIS
#include <complex.h>
double cabs(double complex <[z]>);
float cabsf(float complex <[z]>);
long double cabsl(long double complex <[z]>);
DESCRIPTION
@ -28,16 +31,19 @@ DESCRIPTION
(also called norm, modulus, or magnitude) of <[z]>.
<<cabsf>> is identical to <<cabs>>, except that it performs
its calculations on <<floats complex>>.
its calculations on <<float complex>>.
<<cabsl>> is identical to <<cabs>>, except that it performs
its calculations on <<long double complex>>.
RETURNS
The cabs functions return the complex absolute value.
The cabs* functions return the complex absolute value.
PORTABILITY
<<cabs>> and <<cabsf>> are ISO C99
<<cabs>>, <<cabsf>> and <<cabsl>> are ISO C99
QUICKREF
<<cabs>> and <<cabsf>> are ISO C99
<<cabs>>, <<cabsf>> and <<cabsl>> are ISO C99
*/

View File

@ -0,0 +1,18 @@
/* Copyright (C) 2015 by Red Hat, Incorporated. All rights reserved.
*
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
#include <complex.h>
#include <math.h>
long double
cabsl (long double complex z)
{
#ifdef _LDBL_EQ_DBL
return cabs (z);
#else
return hypotl (creall (z), cimagl (z));
#endif
}

View File

@ -10,33 +10,39 @@
/*
FUNCTION
<<cimag>>, <<cimagf>>---imaginary part
<<cimag>>, <<cimagf>>, <<cimagl>>---imaginary part
INDEX
cimag
INDEX
cimagf
INDEX
cimagl
ANSI_SYNOPSIS
#include <complex.h>
double cimag(double complex <[z]>);
float cimagf(float complex <[z]>);
long double cimagl(long double complex <[z]>);
DESCRIPTION
These functions compute the imaginary part of <[z]>.
<<cimagf>> is identical to <<cimag>>, except that it performs
its calculations on <<floats complex>>.
its calculations on <<float complex>>.
<<cimagl>> is identical to <<cimag>>, except that it performs
its calculations on <<long double complex>>.
RETURNS
The cimag functions return the imaginary part value (as a real).
The cimag* functions return the imaginary part value (as a real).
PORTABILITY
<<cimag>> and <<cimagf>> are ISO C99
<<cimag>>, <<cimagf>> and <<cimagl>> are ISO C99
QUICKREF
<<cimag>> and <<cimagf>> are ISO C99
<<cimag>>, <<cimagf>> and <<cimagl>> are ISO C99
*/

View File

@ -0,0 +1,16 @@
/* Copyright (C) 2015 by Red Hat, Incorporated. All rights reserved.
*
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
#include <complex.h>
#include "../common/fdlibm.h"
long double
cimagl (long double complex z)
{
long_double_complex w = { .z = z };
return IMAG_PART (w);
}

View File

@ -10,33 +10,39 @@
/*
FUNCTION
<<creal>>, <<crealf>>---real part
<<creal>>, <<crealf>>, <<creall>>---real part
INDEX
creal
INDEX
crealf
INDEX
creall
ANSI_SYNOPSIS
#include <complex.h>
double creal(double complex <[z]>);
float crealf(float complex <[z]>);
double long creall(long double complex <[z]>);
DESCRIPTION
These functions compute the real part of <[z]>.
<<crealf>> is identical to <<creal>>, except that it performs
its calculations on <<floats complex>>.
its calculations on <<float complex>>.
<<creall>> is identical to <<creal>>, except that it performs
its calculations on <<long double complex>>.
RETURNS
The creal functions return the real part value.
The creal* functions return the real part value.
PORTABILITY
<<creal>> and <<crealf>> are ISO C99
<<creal>>, <<crealf>> and <<creall>> are ISO C99
QUICKREF
<<creal>> and <<crealf>> are ISO C99
<<creal>>, <<crealf>> and <<creall>> are ISO C99
*/

View File

@ -0,0 +1,16 @@
/* Copyright (C) 2015 by Red Hat, Incorporated. All rights reserved.
*
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
#include <complex.h>
#include "../common/fdlibm.h"
long double
creall (long double complex z)
{
long_double_complex w = { .z = z };
return (REAL_PART(w));
}

View File

@ -50,15 +50,17 @@ fsrc = kf_rem_pio2.c \
sf_tan.c sf_tanh.c \
wf_exp2.c wf_tgamma.c
lsrc = el_hypot.c
libmath_la_LDFLAGS = -Xcompiler -nostdlib
if USE_LIBTOOL
noinst_LTLIBRARIES = libmath.la
libmath_la_SOURCES = $(src) $(fsrc)
libmath_la_SOURCES = $(src) $(fsrc) $(lsrc)
noinst_DATA = objectlist.awk.in
else
noinst_LIBRARIES = lib.a
lib_a_SOURCES = $(src) $(fsrc)
lib_a_SOURCES = $(src) $(fsrc) $(lsrc)
lib_a_CFLAGS = $(AM_CFLAGS)
noinst_DATA =
endif # USE_LIBTOOL

View File

@ -138,8 +138,10 @@ am__objects_2 = lib_a-kf_rem_pio2.$(OBJEXT) lib_a-kf_cos.$(OBJEXT) \
lib_a-sf_signif.$(OBJEXT) lib_a-sf_sin.$(OBJEXT) \
lib_a-sf_tan.$(OBJEXT) lib_a-sf_tanh.$(OBJEXT) \
lib_a-wf_exp2.$(OBJEXT) lib_a-wf_tgamma.$(OBJEXT)
am__objects_5 = lib_a-el_hypot.$(OBJEXT)
@USE_LIBTOOL_FALSE@am_lib_a_OBJECTS = $(am__objects_1) \
@USE_LIBTOOL_FALSE@ $(am__objects_2)
@USE_LIBTOOL_FALSE@ $(am__objects_2) \
@USE_LIBTOOL_FALSE@ $(am__objects_5)
lib_a_OBJECTS = $(am_lib_a_OBJECTS)
LTLIBRARIES = $(noinst_LTLIBRARIES)
libmath_la_LIBADD =
@ -169,8 +171,10 @@ am__objects_4 = kf_rem_pio2.lo kf_cos.lo kf_sin.lo kf_tan.lo \
sf_cos.lo sf_erf.lo sf_fabs.lo sf_floor.lo sf_frexp.lo \
sf_ldexp.lo sf_signif.lo sf_sin.lo sf_tan.lo sf_tanh.lo \
wf_exp2.lo wf_tgamma.lo
am__objects_6 = el_hypot.lo
@USE_LIBTOOL_TRUE@am_libmath_la_OBJECTS = $(am__objects_3) \
@USE_LIBTOOL_TRUE@ $(am__objects_4)
@USE_LIBTOOL_TRUE@ $(am__objects_4) \
@USE_LIBTOOL_TRUE@ $(am__objects_6)
libmath_la_OBJECTS = $(am_libmath_la_OBJECTS)
libmath_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@ -372,13 +376,15 @@ fsrc = kf_rem_pio2.c \
sf_tan.c sf_tanh.c \
wf_exp2.c wf_tgamma.c
lsrc = el_hypot.c
libmath_la_LDFLAGS = -Xcompiler -nostdlib
@USE_LIBTOOL_TRUE@noinst_LTLIBRARIES = libmath.la
@USE_LIBTOOL_TRUE@libmath_la_SOURCES = $(src) $(fsrc)
@USE_LIBTOOL_TRUE@libmath_la_SOURCES = $(src) $(fsrc) $(lsrc)
@USE_LIBTOOL_FALSE@noinst_DATA =
@USE_LIBTOOL_TRUE@noinst_DATA = objectlist.awk.in
@USE_LIBTOOL_FALSE@noinst_LIBRARIES = lib.a
@USE_LIBTOOL_FALSE@lib_a_SOURCES = $(src) $(fsrc)
@USE_LIBTOOL_FALSE@lib_a_SOURCES = $(src) $(fsrc) $(lsrc)
@USE_LIBTOOL_FALSE@lib_a_CFLAGS = $(AM_CFLAGS)
chobj = w_acos.def w_acosh.def w_asin.def s_asinh.def \
s_atan.def w_atan2.def w_atanh.def w_j0.def \
@ -1260,6 +1266,12 @@ lib_a-wf_tgamma.o: wf_tgamma.c
lib_a-wf_tgamma.obj: wf_tgamma.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wf_tgamma.obj `if test -f 'wf_tgamma.c'; then $(CYGPATH_W) 'wf_tgamma.c'; else $(CYGPATH_W) '$(srcdir)/wf_tgamma.c'; fi`
lib_a-el_hypot.o: el_hypot.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-el_hypot.o `test -f 'el_hypot.c' || echo '$(srcdir)/'`el_hypot.c
lib_a-el_hypot.obj: el_hypot.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-el_hypot.obj `if test -f 'el_hypot.c'; then $(CYGPATH_W) 'el_hypot.c'; else $(CYGPATH_W) '$(srcdir)/el_hypot.c'; fi`
mostlyclean-libtool:
-rm -f *.lo

View File

@ -0,0 +1,18 @@
/* Copyright (C) 2015 by Red Hat, Incorporated. All rights reserved.
*
* Permission to use, copy, modify, and distribute this software
* is freely granted, provided that this notice is preserved.
*/
#include "fdlibm.h"
long double
__ieee754_hypotl (long double x, long double y)
{
#ifdef _LDBL_EQ_DBL
return __ieee754_hypot (x, y);
#else
/* Keep it simple for now... */
return sqrtl ((x * x) + (y * y));
#endif
}