Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/newlib
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2015-02-06 19:14:04 +0300
committerNick Clifton <nickc@redhat.com>2015-02-06 19:14:04 +0300
commitb9e7cd9a846cf584049a719bbd0e4cabe3c50bea (patch)
tree33bb86b0a39693a67106d740062bc5975285b87f /newlib
parentdb004c5d7af31d9a56321d7780621b1df6a1559e (diff)
* 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.
Diffstat (limited to 'newlib')
-rw-r--r--newlib/ChangeLog41
-rw-r--r--newlib/libc/include/complex.h5
-rw-r--r--newlib/libc/include/ieeefp.h73
-rw-r--r--newlib/libc/include/math.h6
-rw-r--r--newlib/libc/include/string.h5
-rw-r--r--newlib/libc/machine/msp430/setjmp.S2
-rw-r--r--newlib/libm/common/Makefile.am4
-rw-r--r--newlib/libm/common/Makefile.in13
-rw-r--r--newlib/libm/common/fdlibm.h2
-rw-r--r--newlib/libm/common/hypotl.c55
-rw-r--r--newlib/libm/common/sl_finite.c25
-rw-r--r--newlib/libm/common/sqrtl.c155
-rw-r--r--newlib/libm/complex/Makefile.am7
-rw-r--r--newlib/libm/complex/Makefile.in36
-rw-r--r--newlib/libm/complex/cabs.c16
-rw-r--r--newlib/libm/complex/cabsl.c18
-rw-r--r--newlib/libm/complex/cimag.c16
-rw-r--r--newlib/libm/complex/cimagl.c16
-rw-r--r--newlib/libm/complex/creal.c18
-rw-r--r--newlib/libm/complex/creall.c16
-rw-r--r--newlib/libm/math/Makefile.am6
-rw-r--r--newlib/libm/math/Makefile.in20
-rw-r--r--newlib/libm/math/el_hypot.c18
23 files changed, 523 insertions, 50 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index eaf5ae8f3..c7a2f1b78 100644
--- a/newlib/ChangeLog
+++ b/newlib/ChangeLog
@@ -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
diff --git a/newlib/libc/include/complex.h b/newlib/libc/include/complex.h
index 969b20e5f..c3ae3cff8 100644
--- a/newlib/libc/include/complex.h
+++ b/newlib/libc/include/complex.h
@@ -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
diff --git a/newlib/libc/include/ieeefp.h b/newlib/libc/include/ieeefp.h
index 0b06fb786..9eb274d86 100644
--- a/newlib/libc/include/ieeefp.h
+++ b/newlib/libc/include/ieeefp.h
@@ -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 */
diff --git a/newlib/libc/include/math.h b/newlib/libc/include/math.h
index d16ce3074..3f6766ab8 100644
--- a/newlib/libc/include/math.h
+++ b/newlib/libc/include/math.h
@@ -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));
diff --git a/newlib/libc/include/string.h b/newlib/libc/include/string.h
index af5c9da4d..43b36267d 100644
--- a/newlib/libc/include/string.h
+++ b/newlib/libc/include/string.h
@@ -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
diff --git a/newlib/libc/machine/msp430/setjmp.S b/newlib/libc/machine/msp430/setjmp.S
index 6684f8acb..f3deefae5 100644
--- a/newlib/libc/machine/msp430/setjmp.S
+++ b/newlib/libc/machine/msp430/setjmp.S
@@ -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
diff --git a/newlib/libm/common/Makefile.am b/newlib/libm/common/Makefile.am
index b370b2e09..d5e0ef959 100644
--- a/newlib/libm/common/Makefile.am
+++ b/newlib/libm/common/Makefile.am
@@ -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
diff --git a/newlib/libm/common/Makefile.in b/newlib/libm/common/Makefile.in
index af3c88d71..ae5949a48 100644
--- a/newlib/libm/common/Makefile.in
+++ b/newlib/libm/common/Makefile.in
@@ -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
diff --git a/newlib/libm/common/fdlibm.h b/newlib/libm/common/fdlibm.h
index a4b7fffe7..821e4dedb 100644
--- a/newlib/libm/common/fdlibm.h
+++ b/newlib/libm/common/fdlibm.h
@@ -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));
diff --git a/newlib/libm/common/hypotl.c b/newlib/libm/common/hypotl.c
index 3934b8ecc..cf67ccf58 100644
--- a/newlib/libm/common/hypotl.c
+++ b/newlib/libm/common/hypotl.c
@@ -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)
{
+#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 */
+}
diff --git a/newlib/libm/common/sl_finite.c b/newlib/libm/common/sl_finite.c
new file mode 100644
index 000000000..0c27b4fae
--- /dev/null
+++ b/newlib/libm/common/sl_finite.c
@@ -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
+}
+
diff --git a/newlib/libm/common/sqrtl.c b/newlib/libm/common/sqrtl.c
index 1e7d7c1d6..8cd717e19 100644
--- a/newlib/libm/common/sqrtl.c
+++ b/newlib/libm/common/sqrtl.c
@@ -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 */
+
+
diff --git a/newlib/libm/complex/Makefile.am b/newlib/libm/complex/Makefile.am
index dbbe759be..1c4a50255 100644
--- a/newlib/libm/complex/Makefile.am
+++ b/newlib/libm/complex/Makefile.am
@@ -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
diff --git a/newlib/libm/complex/Makefile.in b/newlib/libm/complex/Makefile.in
index 8a0d4b468..cf731e72f 100644
--- a/newlib/libm/complex/Makefile.in
+++ b/newlib/libm/complex/Makefile.in
@@ -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
diff --git a/newlib/libm/complex/cabs.c b/newlib/libm/complex/cabs.c
index 2750fab9a..69091d71a 100644
--- a/newlib/libm/complex/cabs.c
+++ b/newlib/libm/complex/cabs.c
@@ -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
*/
diff --git a/newlib/libm/complex/cabsl.c b/newlib/libm/complex/cabsl.c
new file mode 100644
index 000000000..091f2cd53
--- /dev/null
+++ b/newlib/libm/complex/cabsl.c
@@ -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
+}
diff --git a/newlib/libm/complex/cimag.c b/newlib/libm/complex/cimag.c
index 1d2d77414..959dbc9a4 100644
--- a/newlib/libm/complex/cimag.c
+++ b/newlib/libm/complex/cimag.c
@@ -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
*/
diff --git a/newlib/libm/complex/cimagl.c b/newlib/libm/complex/cimagl.c
new file mode 100644
index 000000000..a5afdc456
--- /dev/null
+++ b/newlib/libm/complex/cimagl.c
@@ -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);
+}
diff --git a/newlib/libm/complex/creal.c b/newlib/libm/complex/creal.c
index c621561ae..1652a5f8e 100644
--- a/newlib/libm/complex/creal.c
+++ b/newlib/libm/complex/creal.c
@@ -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
*/
diff --git a/newlib/libm/complex/creall.c b/newlib/libm/complex/creall.c
new file mode 100644
index 000000000..7aa88c272
--- /dev/null
+++ b/newlib/libm/complex/creall.c
@@ -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));
+}
diff --git a/newlib/libm/math/Makefile.am b/newlib/libm/math/Makefile.am
index a4589ada2..2616ada1f 100644
--- a/newlib/libm/math/Makefile.am
+++ b/newlib/libm/math/Makefile.am
@@ -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
diff --git a/newlib/libm/math/Makefile.in b/newlib/libm/math/Makefile.in
index 10f6ca563..233c7c257 100644
--- a/newlib/libm/math/Makefile.in
+++ b/newlib/libm/math/Makefile.in
@@ -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
diff --git a/newlib/libm/math/el_hypot.c b/newlib/libm/math/el_hypot.c
new file mode 100644
index 000000000..737cde36b
--- /dev/null
+++ b/newlib/libm/math/el_hypot.c
@@ -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
+}