]> sourceware.org Git - newlib-cygwin.git/commitdiff
Add missing long double functions to Cygwin
authorCorinna Vinschen <corinna@vinschen.de>
Mon, 28 Mar 2016 17:35:20 +0000 (19:35 +0200)
committerCorinna Vinschen <corinna@vinschen.de>
Tue, 29 Mar 2016 12:43:55 +0000 (14:43 +0200)
This patch adds the long double functions missing in newlib to Cygwin.
Apart from some self-written additions (exp10l, finite{f,l}, isinf{f,l},
isnan{f,l}, pow10l) the files are taken from the Mingw-w64 math lib.
Minor changes were required, e.g. substitue _WIN64 with __x86_64__ and
fixing __FLT_RPT_DOMAIN/__FLT_RPT_ERANGE for Cygwin.

Cygwin:
* math: New subdir with math functions.
* Makefile.in (VPATH): Add math subdir.
(MATH_OFILES): List of object files collected from building files in
math subdir.
(DLL_OFILES): Add $(MATH_OFILES).
${CURDIR}/libm.a: Add $(MATH_OFILES) to build.
* common.din: Add new functions from math subdir.
* i686.din: Align to new math subdir.  Remove functions now commonly
available.
* x86_64.din: Ditto.
* math.h: math.h wrapper to define mingw structs used in some files in
math subdir.
* include/cygwin/version.h: Bump API minor version.

newlib:
* libc/include/complex.h: Add prototypes for complex long double
functions.  Only define for Cygwin.
* libc/include/math.h: Additionally enable prototypes of long double
functions for Cygwin.  Add Cygwin-only prototypes for dreml, sincosl,
exp10l and pow10l.  Explain why we don't add them to newlib.
* libc/include/tgmath.h: Enable long double handling on Cygwin.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
142 files changed:
newlib/libc/include/complex.h
newlib/libc/include/math.h
newlib/libc/include/tgmath.h
winsup/cygwin/Makefile.in
winsup/cygwin/common.din
winsup/cygwin/i686.din
winsup/cygwin/include/cygwin/version.h
winsup/cygwin/math.h [new file with mode: 0644]
winsup/cygwin/math/DISCLAIMER.PD [new file with mode: 0644]
winsup/cygwin/math/acosh.def.h [new file with mode: 0644]
winsup/cygwin/math/acoshl.c [new file with mode: 0644]
winsup/cygwin/math/acosl.c [new file with mode: 0644]
winsup/cygwin/math/asinhl.c [new file with mode: 0644]
winsup/cygwin/math/asinl.c [new file with mode: 0644]
winsup/cygwin/math/atan2l.c [new file with mode: 0644]
winsup/cygwin/math/atanhl.c [new file with mode: 0644]
winsup/cygwin/math/atanl.c [new file with mode: 0644]
winsup/cygwin/math/cabs.def.h [new file with mode: 0644]
winsup/cygwin/math/cabsl.c [new file with mode: 0644]
winsup/cygwin/math/cacos.def.h [new file with mode: 0644]
winsup/cygwin/math/cacosh.def.h [new file with mode: 0644]
winsup/cygwin/math/cacosl.c [new file with mode: 0644]
winsup/cygwin/math/carg.def.h [new file with mode: 0644]
winsup/cygwin/math/cargl.c [new file with mode: 0644]
winsup/cygwin/math/casin.def.h [new file with mode: 0644]
winsup/cygwin/math/casinh.def.h [new file with mode: 0644]
winsup/cygwin/math/casinl.c [new file with mode: 0644]
winsup/cygwin/math/catan.def.h [new file with mode: 0644]
winsup/cygwin/math/catanh.def.h [new file with mode: 0644]
winsup/cygwin/math/catanl.c [new file with mode: 0644]
winsup/cygwin/math/cbrtl.c [new file with mode: 0644]
winsup/cygwin/math/ccos.def.h [new file with mode: 0644]
winsup/cygwin/math/ccosh.def.h [new file with mode: 0644]
winsup/cygwin/math/ccosl.c [new file with mode: 0644]
winsup/cygwin/math/ceil.S [new file with mode: 0644]
winsup/cygwin/math/ceilf.S [new file with mode: 0644]
winsup/cygwin/math/ceill.S [new file with mode: 0644]
winsup/cygwin/math/cephes_emath.c [new file with mode: 0644]
winsup/cygwin/math/cephes_emath.h [new file with mode: 0644]
winsup/cygwin/math/cephes_mconf.h [new file with mode: 0644]
winsup/cygwin/math/cexp.def.h [new file with mode: 0644]
winsup/cygwin/math/cexpl.c [new file with mode: 0644]
winsup/cygwin/math/cimag.def.h [new file with mode: 0644]
winsup/cygwin/math/cimagl.c [new file with mode: 0644]
winsup/cygwin/math/clog.def.h [new file with mode: 0644]
winsup/cygwin/math/clog10.def.h [new file with mode: 0644]
winsup/cygwin/math/clog10l.c [new file with mode: 0644]
winsup/cygwin/math/clogl.c [new file with mode: 0644]
winsup/cygwin/math/complex_internal.h [new file with mode: 0644]
winsup/cygwin/math/conj.def.h [new file with mode: 0644]
winsup/cygwin/math/conjl.c [new file with mode: 0644]
winsup/cygwin/math/copysignl.S [new file with mode: 0644]
winsup/cygwin/math/cos.def.h [new file with mode: 0644]
winsup/cygwin/math/coshl.c [new file with mode: 0644]
winsup/cygwin/math/cosl.c [new file with mode: 0644]
winsup/cygwin/math/cosl_internal.S [new file with mode: 0644]
winsup/cygwin/math/cossin.c [new file with mode: 0644]
winsup/cygwin/math/cpow.def.h [new file with mode: 0644]
winsup/cygwin/math/cpowl.c [new file with mode: 0644]
winsup/cygwin/math/cproj.def.h [new file with mode: 0644]
winsup/cygwin/math/cprojl.c [new file with mode: 0644]
winsup/cygwin/math/creal.def.h [new file with mode: 0644]
winsup/cygwin/math/creall.c [new file with mode: 0644]
winsup/cygwin/math/csin.def.h [new file with mode: 0644]
winsup/cygwin/math/csinh.def.h [new file with mode: 0644]
winsup/cygwin/math/csinl.c [new file with mode: 0644]
winsup/cygwin/math/csqrt.def.h [new file with mode: 0644]
winsup/cygwin/math/csqrtl.c [new file with mode: 0644]
winsup/cygwin/math/ctan.def.h [new file with mode: 0644]
winsup/cygwin/math/ctanh.def.h [new file with mode: 0644]
winsup/cygwin/math/ctanl.c [new file with mode: 0644]
winsup/cygwin/math/erfl.c [new file with mode: 0644]
winsup/cygwin/math/exp.def.h [new file with mode: 0644]
winsup/cygwin/math/exp10l.c [new file with mode: 0644]
winsup/cygwin/math/exp2.S [new file with mode: 0644]
winsup/cygwin/math/exp2l.S [new file with mode: 0644]
winsup/cygwin/math/expl.c [new file with mode: 0644]
winsup/cygwin/math/expm1.def.h [new file with mode: 0644]
winsup/cygwin/math/expm1l.c [new file with mode: 0644]
winsup/cygwin/math/fabsl.c [new file with mode: 0644]
winsup/cygwin/math/fastmath.h [new file with mode: 0644]
winsup/cygwin/math/fdiml.c [new file with mode: 0644]
winsup/cygwin/math/finite.c [new file with mode: 0644]
winsup/cygwin/math/floorl.S [new file with mode: 0644]
winsup/cygwin/math/fmal.c [new file with mode: 0644]
winsup/cygwin/math/fmaxl.c [new file with mode: 0644]
winsup/cygwin/math/fminl.c [new file with mode: 0644]
winsup/cygwin/math/fmodl.c [new file with mode: 0644]
winsup/cygwin/math/frexpl.S [new file with mode: 0644]
winsup/cygwin/math/ilogbl.S [new file with mode: 0644]
winsup/cygwin/math/internal_logl.S [new file with mode: 0644]
winsup/cygwin/math/isinf.c [new file with mode: 0644]
winsup/cygwin/math/isnan.c [new file with mode: 0644]
winsup/cygwin/math/ldexpl.c [new file with mode: 0644]
winsup/cygwin/math/lgammal.c [new file with mode: 0644]
winsup/cygwin/math/llrint.c [new file with mode: 0644]
winsup/cygwin/math/llrintf.c [new file with mode: 0644]
winsup/cygwin/math/llrintl.c [new file with mode: 0644]
winsup/cygwin/math/llroundl.c [new file with mode: 0644]
winsup/cygwin/math/log.def.h [new file with mode: 0644]
winsup/cygwin/math/log10l.S [new file with mode: 0644]
winsup/cygwin/math/log1pl.S [new file with mode: 0644]
winsup/cygwin/math/log2l.S [new file with mode: 0644]
winsup/cygwin/math/logbl.c [new file with mode: 0644]
winsup/cygwin/math/logl.c [new file with mode: 0644]
winsup/cygwin/math/lrint.c [new file with mode: 0644]
winsup/cygwin/math/lrintf.c [new file with mode: 0644]
winsup/cygwin/math/lrintl.c [new file with mode: 0644]
winsup/cygwin/math/lroundl.c [new file with mode: 0644]
winsup/cygwin/math/modfl.c [new file with mode: 0644]
winsup/cygwin/math/nearbyint.S [new file with mode: 0644]
winsup/cygwin/math/nearbyintf.S [new file with mode: 0644]
winsup/cygwin/math/nearbyintl.S [new file with mode: 0644]
winsup/cygwin/math/nextafterl.c [new file with mode: 0644]
winsup/cygwin/math/nexttoward.c [new file with mode: 0644]
winsup/cygwin/math/nexttowardf.c [new file with mode: 0644]
winsup/cygwin/math/pow.def.h [new file with mode: 0644]
winsup/cygwin/math/pow10l.c [new file with mode: 0644]
winsup/cygwin/math/powi.def.h [new file with mode: 0644]
winsup/cygwin/math/powil.c [new file with mode: 0644]
winsup/cygwin/math/powl.c [new file with mode: 0644]
winsup/cygwin/math/remainder.S [new file with mode: 0644]
winsup/cygwin/math/remainderf.S [new file with mode: 0644]
winsup/cygwin/math/remainderl.S [new file with mode: 0644]
winsup/cygwin/math/remquol.S [new file with mode: 0644]
winsup/cygwin/math/rint.c [new file with mode: 0644]
winsup/cygwin/math/rintf.c [new file with mode: 0644]
winsup/cygwin/math/rintl.c [new file with mode: 0644]
winsup/cygwin/math/roundl.c [new file with mode: 0644]
winsup/cygwin/math/scalbl.S [new file with mode: 0644]
winsup/cygwin/math/scalbnl.S [new file with mode: 0644]
winsup/cygwin/math/sin.def.h [new file with mode: 0644]
winsup/cygwin/math/sinhl.c [new file with mode: 0644]
winsup/cygwin/math/sinl.c [new file with mode: 0644]
winsup/cygwin/math/sinl_internal.S [new file with mode: 0644]
winsup/cygwin/math/sqrt.def.h [new file with mode: 0644]
winsup/cygwin/math/sqrtl.c [new file with mode: 0644]
winsup/cygwin/math/tanhl.c [new file with mode: 0644]
winsup/cygwin/math/tanl.S [new file with mode: 0644]
winsup/cygwin/math/tgammal.c [new file with mode: 0644]
winsup/cygwin/math/truncl.c [new file with mode: 0644]
winsup/cygwin/x86_64.din

index 3150f3423952d1624e7df351fb907a287c8cd20f..89d6162dc0244383b0e12386aa5ae7ceabe84775 100644 (file)
@@ -108,12 +108,10 @@ long double cimagl(long double complex);
 /* 7.3.9.3 The conj functions */
 double complex conj(double complex);
 float complex conjf(float complex);
-/*long double complex conjl(long double complex); */
 
 /* 7.3.9.4 The cproj functions */
 double complex cproj(double complex);
 float complex cprojf(float complex);
-/*long double complex cprojl(long double complex); */
 
 /* 7.3.9.5 The creal functions */
 double creal(double complex);
@@ -125,6 +123,31 @@ double complex clog10(double complex);
 float complex clog10f(float complex);
 #endif
 
+#if defined(__CYGWIN__)
+long double complex cacosl(long double complex);
+long double complex casinl(long double complex);
+long double complex catanl(long double complex);
+long double complex ccosl(long double complex);
+long double complex csinl(long double complex);
+long double complex ctanl(long double complex);
+long double complex cacoshl(long double complex);
+long double complex casinhl(long double complex);
+long double complex catanhl(long double complex);
+long double complex ccoshl(long double complex);
+long double complex csinhl(long double complex);
+long double complex ctanhl(long double complex);
+long double complex cexpl(long double complex);
+long double complex clogl(long double complex);
+long double complex cpowl(long double complex, long double complex);
+long double complex csqrtl(long double complex);
+long double cargl(long double complex);
+long double complex conjl(long double complex);
+long double complex cprojl(long double complex);
+#if __GNU_VISIBLE
+long double complex clog10l(long double complex);
+#endif
+#endif /* __CYGWIN__ */
+
 __END_DECLS
 
 #endif /* ! _COMPLEX_H */
index eeedeba921b89fd4074d7ef7e14944354d7bdac9..e5d612367a9e20a81b4934c7d245dafd16ba1d91 100644 (file)
@@ -421,8 +421,12 @@ extern float log2f _PARAMS((float));
 extern float hypotf _PARAMS((float, float));
 #endif /* ! defined (_REENT_ONLY) */
 
-/* On platforms where long double equals double.  */
-#ifdef _LDBL_EQ_DBL
+/* Newlib doesn't fully support long double math functions so far.
+   On platforms where long double equals double the long double functions
+   simply call the double functions.  On Cygwin the long double functions
+   are implemented independently from newlib to be able to use optimized
+   assembler functions despite using the Microsoft x86_64 ABI. */
+#if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__)
 /* Reentrant ANSI C functions.  */
 #ifndef __math_68881
 extern long double atanl _PARAMS((long double));
@@ -492,7 +496,7 @@ extern long double lgammal _PARAMS((long double));
 extern long double erfl _PARAMS((long double));
 extern long double erfcl _PARAMS((long double));
 #endif /* ! defined (_REENT_ONLY) */
-#else /* !_LDBL_EQ_DBL */
+#else /* !_LDBL_EQ_DBL && !__CYGWIN__ */
 extern long double hypotl _PARAMS((long double, long double));
 extern long double sqrtl _PARAMS((long double));
 #ifdef __i386__
@@ -501,13 +505,16 @@ extern _LONG_DOUBLE rintl _PARAMS((_LONG_DOUBLE));
 extern long int lrintl _PARAMS((_LONG_DOUBLE));
 extern long long int llrintl _PARAMS((_LONG_DOUBLE));
 #endif /* __i386__ */
-#endif /* !_LDBL_EQ_DBL */
+#endif /* !_LDBL_EQ_DBL && !__CYGWIN__ */
 
 #endif /* __ISO_C_VISIBLE >= 1999 */
 
 #if __MISC_VISIBLE
 extern double drem _PARAMS((double, double));
 extern float dremf _PARAMS((float, float));
+#ifdef __CYGWIN__
+extern float dreml _PARAMS((long double, long double));
+#endif /* __CYGWIN__ */
 extern double gamma_r _PARAMS((double, int *));
 extern double lgamma_r _PARAMS((double, int *));
 extern float gammaf_r _PARAMS((float, int *));
@@ -536,6 +543,9 @@ extern float jnf _PARAMS((int, float));
 #if __GNU_VISIBLE
 extern void sincos _PARAMS((double, double *, double *));
 extern void sincosf _PARAMS((float, float *, float *));
+#ifdef __CYGWIN__
+extern void sincosl _PARAMS((long double, long double *, long double *));
+#endif /* __CYGWIN__ */
 # ifndef exp10
 extern double exp10 _PARAMS((double));
 # endif
@@ -548,6 +558,14 @@ extern float exp10f _PARAMS((float));
 # ifndef pow10f
 extern float pow10f _PARAMS((float));
 # endif
+#ifdef __CYGWIN__
+# ifndef exp10l
+extern float exp10l _PARAMS((float));
+# endif
+# ifndef pow10l
+extern float pow10l _PARAMS((float));
+# endif
+#endif /* __CYGWIN__ */
 #endif /* __GNU_VISIBLE */
 
 #if __MISC_VISIBLE || __XSI_VISIBLE
index f9c8311cc3dd5a4155f3d54a0423b8165d0f7322..97dc50eaa11348822350c56e24d25ecdd4b0125b 100644 (file)
@@ -79,7 +79,7 @@
         __tg_type3(__e1, __e2, __e3, long double _Complex) ||          \
         __tg_type3(__e1, __e2, __e3, __typeof__(_Complex_I)))
 
-#ifdef _LDBL_EQ_DBL
+#if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__)
 #define        __tg_impl_simple(x, y, z, fn, fnf, fnl, ...)                    \
        __builtin_choose_expr(__tg_type_corr(x, y, z, long double),     \
            fnl(__VA_ARGS__), __builtin_choose_expr(                    \
 #define        lround(__x)             __tg_simple(__x, lround)
 #define        nearbyint(__x)          __tg_simple(__x, nearbyint)
 #define        nextafter(__x, __y)     __tg_simple2(__x, __y, nextafter)
-/* not yet implemented even for _LDBL_EQ_DBL platforms
+/* not yet implemented even for _LDBL_EQ_DBL platforms */
+#ifdef __CYGWIN__
 #define        nexttoward(__x, __y)    __tg_simplev(__x, nexttoward, __x, __y)
-*/
+#endif
 #define        remainder(__x, __y)     __tg_simple2(__x, __y, remainder)
 #define        remquo(__x, __y, __z)   __tg_impl_simple(__x, __x, __y, remquo, remquof,        \
                                                 remquol, __x, __y, __z)
index 669548857f650784364887b63d9c38629fe4f1b7..bcfaa2f55ffef99960fe0c29eecfdfe565ef9617 100644 (file)
@@ -29,7 +29,7 @@ export CCWRAP_HEADERS:=. ${srcdir}
 export CCWRAP_SYSTEM_HEADERS:=@cygwin_headers@ @newlib_headers@
 export CCWRAP_DIRAFTER_HEADERS:=@windows_headers@
 
-VPATH+=$(srcdir)/regex $(srcdir)/lib $(srcdir)/libc
+VPATH+=$(srcdir)/regex $(srcdir)/lib $(srcdir)/libc $(srcdir)/math
 
 target_cpu:=@target_cpu@
 target_alias:=@target_alias@
@@ -153,6 +153,101 @@ DLL_IMPORTS:=${shell $(CC) -print-file-name=w32api/libkernel32.a} ${shell $(CC)
 
 MT_SAFE_OBJECTS:=
 #
+MATH_OFILES:= \
+       acoshl.o \
+       acosl.o \
+       asinhl.o \
+       asinl.o \
+       atan2l.o \
+       atanhl.o \
+       atanl.o \
+       cabsl.o \
+       cacosl.o \
+       cargl.o \
+       casinl.o \
+       catanl.o \
+       cbrtl.o \
+       ccosl.o \
+       ceill.o \
+       cephes_emath.o \
+       cexpl.o \
+       cimagl.o \
+       clog10l.o \
+       clogl.o \
+       conjl.o \
+       copysignl.o \
+       coshl.o \
+       cosl.o \
+       cosl_internal.o \
+       cossin.o \
+       cpowl.o \
+       cprojl.o \
+       creall.o \
+       csinl.o \
+       csqrtl.o \
+       ctanl.o \
+       erfl.o \
+       exp10l.o \
+       exp2l.o \
+       expl.o \
+       expm1l.o \
+       fabsl.o \
+       fdiml.o \
+       finite.o \
+       floorl.o \
+       fmal.o \
+       fmaxl.o \
+       fminl.o \
+       fmodl.o \
+       frexpl.o \
+       ilogbl.o \
+       internal_logl.o \
+       isinf.o \
+       isnan.o \
+       ldexpl.o \
+       lgammal.o \
+       llrint.o \
+       llrintf.o \
+       llrintl.o \
+       llroundl.o \
+       log10l.o \
+       log1pl.o \
+       log2l.o \
+       logbl.o \
+       logl.o \
+       lrint.o \
+       lrintf.o \
+       lrintl.o \
+       lroundl.o \
+       modfl.o \
+       nearbyint.o \
+       nearbyintf.o \
+       nearbyintl.o \
+       nextafterl.o \
+       nexttoward.o \
+       nexttowardf.o \
+       pow10l.o \
+       powil.o \
+       powl.o \
+       remainder.o \
+       remainderf.o \
+       remainderl.o \
+       remquol.o \
+       rint.o \
+       rintf.o \
+       rintl.o \
+       roundl.o \
+       scalbl.o \
+       scalbnl.o \
+       sinhl.o \
+       sinl.o \
+       sinl_internal.o \
+       sqrtl.o \
+       tanhl.o \
+       tanl.o \
+       tgammal.o \
+       truncl.o
+
 DLL_OFILES:= \
        advapi32.o \
        arc4random_stir.o \
@@ -305,6 +400,7 @@ DLL_OFILES:= \
        xsique.o \
        $(EXTRA_OFILES) \
        $(MALLOC_OFILES) \
+       $(MATH_OFILES) \
        $(MT_SAFE_OBJECTS)
 
 EXCLUDE_STATIC_OFILES:=$(addprefix --exclude=,\
@@ -626,7 +722,7 @@ $(srcdir)/devices.cc: gendevices devices.in devices.h
 ${CURDIR}/libc.a: ${LIB_NAME} ${CURDIR}/libm.a libpthread.a libutil.a
        ${speclib} -v ${@F}
 
-${CURDIR}/libm.a: ${LIB_NAME} $(LIBM)
+${CURDIR}/libm.a: ${LIB_NAME} $(LIBM) $(MATH_OFILES)
        ${speclib} ${@F}
 
 libpthread.a: ${LIB_NAME} pthread.o thread.o
index 7e72abe50eb1f436fb87fe18f9a5ec88cf2ec29a..c2f5f0fd471e5b9db217522f62dfc1fa701844bc 100644 (file)
@@ -64,10 +64,10 @@ __getpagesize = getpagesize SIGFE
 __getreent NOSIGFE
 __gnu_basename NOSIGFE
 __infinity NOSIGFE
-__isinfd NOSIGFE
-__isinff NOSIGFE
-__isnand NOSIGFE
-__isnanf NOSIGFE
+__isinfd = isinf NOSIGFE
+__isinff = isinff NOSIGFE
+__isnand = isnan NOSIGFE
+__isnanf = isnanf NOSIGFE
 __locale_mb_cur_max NOSIGFE
 __main NOSIGFE
 __mempcpy = mempcpy NOSIGFE
@@ -169,6 +169,8 @@ acos NOSIGFE
 acosf NOSIGFE
 acosh NOSIGFE
 acoshf NOSIGFE
+acoshl NOSIGFE
+acosl NOSIGFE
 alarm SIGFE
 aligned_alloc SIGFE
 alphasort NOSIGFE
@@ -195,14 +197,19 @@ asin NOSIGFE
 asinf NOSIGFE
 asinh NOSIGFE
 asinhf NOSIGFE
+asinhl NOSIGFE
+asinl NOSIGFE
 asnprintf SIGFE
 asprintf SIGFE
 atan NOSIGFE
 atan2 NOSIGFE
 atan2f NOSIGFE
+atan2l NOSIGFE
 atanf NOSIGFE
 atanh NOSIGFE
 atanhf NOSIGFE
+atanhl NOSIGFE
+atanl NOSIGFE
 atexit = cygwin_atexit SIGFE
 atof SIGFE
 atoff SIGFE
@@ -226,28 +233,40 @@ cacos NOSIGFE
 cacosf NOSIGFE
 cacosh NOSIGFE
 cacoshf NOSIGFE
+cacoshl NOSIGFE
+cacosl NOSIGFE
 calloc SIGFE
 canonicalize_file_name SIGFE
 carg NOSIGFE
 cargf NOSIGFE
+cargl NOSIGFE
 casin NOSIGFE
 casinf NOSIGFE
 casinh NOSIGFE
 casinhf NOSIGFE
+casinhl NOSIGFE
+casinl NOSIGFE
 catan NOSIGFE
 catanf NOSIGFE
 catanh NOSIGFE
 catanhf NOSIGFE
+catanhl NOSIGFE
+catanl NOSIGFE
 cbrt NOSIGFE
 cbrtf NOSIGFE
+cbrtl NOSIGFE
 ccos NOSIGFE
 ccosf NOSIGFE
 ccosh NOSIGFE
 ccoshf NOSIGFE
+ccoshl NOSIGFE
+ccosl NOSIGFE
 ceil NOSIGFE
 ceilf NOSIGFE
+ceill NOSIGFE
 cexp NOSIGFE
 cexpf NOSIGFE
+cexpl NOSIGFE
 cfgetispeed NOSIGFE
 cfgetospeed NOSIGFE
 cfmakeraw NOSIGFE
@@ -274,24 +293,32 @@ clock_settime SIGFE
 clog NOSIGFE
 clog10 NOSIGFE
 clog10f NOSIGFE
+clog10l NOSIGFE
 clogf NOSIGFE
+clogl NOSIGFE
 close SIGFE
 closedir SIGFE
 closelog SIGFE
 confstr NOSIGFE
 conj NOSIGFE
 conjf NOSIGFE
+conjl NOSIGFE
 connect = cygwin_connect SIGFE
 copysign NOSIGFE
 copysignf NOSIGFE
+copysignl NOSIGFE
 cos NOSIGFE
 cosf NOSIGFE
 cosh NOSIGFE
 coshf NOSIGFE
+coshl NOSIGFE
+cosl NOSIGFE
 cpow NOSIGFE
 cpowf NOSIGFE
+cpowl NOSIGFE
 cproj NOSIGFE
 cprojf NOSIGFE
+cprojl NOSIGFE
 creal NOSIGFE
 crealf NOSIGFE
 creall NOSIGFE
@@ -300,12 +327,17 @@ csin NOSIGFE
 csinf NOSIGFE
 csinh NOSIGFE
 csinhf NOSIGFE
+csinhl NOSIGFE
+csinl NOSIGFE
 csqrt NOSIGFE
 csqrtf NOSIGFE
+csqrtl NOSIGFE
 ctan NOSIGFE
 ctanf NOSIGFE
 ctanh NOSIGFE
 ctanhf NOSIGFE
+ctanhl NOSIGFE
+ctanl NOSIGFE
 ctermid SIGFE
 ctime SIGFE
 ctime_r SIGFE
@@ -342,8 +374,9 @@ dn_expand = __dn_expand SIGFE
 dn_skipname = __dn_skipname SIGFE
 dprintf SIGFE
 drand48 NOSIGFE
-drem NOSIGFE
-dremf NOSIGFE
+drem = remainder NOSIGFE
+dremf= remainderf NOSIGFE
+dreml= remainderl NOSIGFE
 dup SIGFE
 dup2 SIGFE
 dup3 SIGFE
@@ -370,7 +403,9 @@ erand48 NOSIGFE
 erf NOSIGFE
 erfc NOSIGFE
 erfcf NOSIGFE
+erfcl NOSIGFE
 erff NOSIGFE
+erfl NOSIGFE
 err SIGFE
 error SIGFE
 error_at_line SIGFE
@@ -387,13 +422,18 @@ exit = cygwin_exit SIGFE
 exp NOSIGFE
 exp10 NOSIGFE
 exp10f NOSIGFE
+exp10l NOSIGFE
 exp2 NOSIGFE
 exp2f NOSIGFE
+exp2l NOSIGFE
 expf NOSIGFE
+expl NOSIGFE
 expm1 NOSIGFE
 expm1f NOSIGFE
+expm1l NOSIGFE
 fabs NOSIGFE
 fabsf NOSIGFE
+fabsl NOSIGFE
 faccessat SIGFE
 facl SIGFE
 fchdir SIGFE
@@ -410,6 +450,7 @@ fcvtf SIGFE
 fdatasync SIGFE
 fdim NOSIGFE
 fdimf NOSIGFE
+fdiml NOSIGFE
 fdopen SIGFE
 fdopendir SIGFE
 feclearexcept NOSIGFE
@@ -459,15 +500,20 @@ flock SIGFE
 flockfile SIGFE
 floor NOSIGFE
 floorf NOSIGFE
+floorl NOSIGFE
 fma NOSIGFE
 fmaf NOSIGFE
+fmal NOSIGFE
 fmax NOSIGFE
 fmaxf NOSIGFE
+fmaxl NOSIGFE
 fmemopen SIGFE
 fmin NOSIGFE
 fminf NOSIGFE
+fminl NOSIGFE
 fmod NOSIGFE
 fmodf NOSIGFE
+fmodl NOSIGFE
 fnmatch NOSIGFE
 fopen SIGFE
 fopencookie SIGFE
@@ -493,6 +539,7 @@ fremovexattr SIGFE
 freopen SIGFE
 frexp NOSIGFE
 frexpf NOSIGFE
+frexpl NOSIGFE
 fscanf SIGFE
 fseek SIGFE
 fseeko SIGFE
@@ -650,6 +697,7 @@ if_nameindex SIGFE
 if_nametoindex SIGFE
 ilogb NOSIGFE
 ilogbf NOSIGFE
+ilogbl NOSIGFE
 imaxabs = llabs NOSIGFE
 imaxdiv = lldiv NOSIGFE
 index NOSIGFE
@@ -680,9 +728,11 @@ isdigit NOSIGFE
 isgraph NOSIGFE
 isinf NOSIGFE
 isinff NOSIGFE
+isinfl NOSIGFE
 islower NOSIGFE
 isnan NOSIGFE
 isnanf NOSIGFE
+isnanl NOSIGFE
 isprint NOSIGFE
 ispunct NOSIGFE
 issetugid NOSIGFE
@@ -717,12 +767,15 @@ lchown SIGFE
 lcong48 NOSIGFE
 ldexp NOSIGFE
 ldexpf NOSIGFE
+ldexpl NOSIGFE
 ldiv NOSIGFE
 lfind NOSIGFE
 lgamma NOSIGFE
 lgamma_r NOSIGFE
 lgammaf NOSIGFE
 lgammaf_r NOSIGFE
+lgammal NOSIGFE
+lgammal_r NOSIGFE
 lgetxattr SIGFE
 link SIGFE
 linkat SIGFE
@@ -731,8 +784,12 @@ listxattr SIGFE
 llabs NOSIGFE
 lldiv NOSIGFE
 llistxattr SIGFE
+llrint NOSIGFE
+llrintf NOSIGFE
+llrintl NOSIGFE
 llround NOSIGFE
 llroundf NOSIGFE
+llroundl NOSIGFE
 localeconv NOSIGFE
 localtime SIGFE
 localtime_r SIGFE
@@ -740,13 +797,18 @@ lockf SIGFE
 log NOSIGFE
 log10 NOSIGFE
 log10f NOSIGFE
+log10l NOSIGFE
 log1p NOSIGFE
 log1pf NOSIGFE
+log1pl NOSIGFE
 log2 NOSIGFE
 log2f NOSIGFE
+log2l NOSIGFE
 logb NOSIGFE
 logbf NOSIGFE
+logbl NOSIGFE
 logf NOSIGFE
+logl NOSIGFE
 login SIGFE
 login_tty SIGFE
 logout SIGFE
@@ -754,8 +816,12 @@ logwtmp SIGFE
 longjmp NOSIGFE
 lrand48 NOSIGFE
 lremovexattr SIGFE
+lrint NOSIGFE
+lrintf NOSIGFE
+lrintl NOSIGFE
 lround NOSIGFE
 lroundf NOSIGFE
+lroundl NOSIGFE
 lsearch NOSIGFE
 lseek SIGFE
 lsetxattr SIGFE
@@ -805,6 +871,7 @@ mlock SIGFE
 mmap SIGFE
 modf NOSIGFE
 modff NOSIGFE
+modfl NOSIGFE
 mount SIGFE
 mprotect SIGFE
 mq_close SIGFE
@@ -830,8 +897,13 @@ nanf NOSIGFE
 nanosleep SIGFE
 nearbyint NOSIGFE
 nearbyintf NOSIGFE
+nearbyintl NOSIGFE
 nextafter NOSIGFE
 nextafterf NOSIGFE
+nextafterl NOSIGFE
+nexttoward NOSIGFE
+nexttowardf NOSIGFE
+nexttowardl NOSIGFE
 nftw SIGFE
 nice SIGFE
 nl_langinfo SIGFE
@@ -883,7 +955,9 @@ posix_spawn_file_actions_addopen SIGFE
 pow NOSIGFE
 pow10 NOSIGFE
 pow10f NOSIGFE
+pow10l NOSIGFE
 powf NOSIGFE
+powl NOSIGFE
 ppoll SIGFE
 pread SIGFE
 printf SIGFE
@@ -1037,11 +1111,13 @@ regexec SIGFE
 regfree SIGFE
 remainder NOSIGFE
 remainderf NOSIGFE
+remainderl NOSIGFE
 remove SIGFE
 removexattr SIGFE
 remque NOSIGFE
 remquo NOSIGFE
 remquof NOSIGFE
+remquol NOSIGFE
 rename SIGFE
 renameat SIGFE
 res_close = __res_close SIGFE
@@ -1063,9 +1139,13 @@ rewind SIGFE
 rewinddir SIGFE
 rexec = cygwin_rexec SIGFE
 rindex NOSIGFE
+rint NOSIGFE
+rintf NOSIGFE
+rintl NOSIGFE
 rmdir SIGFE
 round NOSIGFE
 roundf NOSIGFE
+roundl NOSIGFE
 rpmatch SIGFE
 rresvport = cygwin_rresvport SIGFE
 rresvport_af = cygwin_rresvport_af SIGFE
@@ -1073,10 +1153,13 @@ ruserok SIGFE
 sbrk SIGFE
 scalb NOSIGFE
 scalbf NOSIGFE
+scalbl NOSIGFE
 scalbln NOSIGFE
 scalblnf NOSIGFE
+scalblnl NOSIGFE
 scalbn NOSIGFE
 scalbnf NOSIGFE
+scalbnl NOSIGFE
 scandir SIGFE
 scandirat SIGFE
 scanf SIGFE
@@ -1180,9 +1263,12 @@ sigwaitinfo SIGFE
 sin NOSIGFE
 sincos NOSIGFE
 sincosf NOSIGFE
+sincosl NOSIGFE
 sinf NOSIGFE
 sinh NOSIGFE
 sinhf NOSIGFE
+sinhl NOSIGFE
+sinl NOSIGFE
 siprintf SIGFE
 sleep SIGFE
 snprintf SIGFE
@@ -1271,6 +1357,8 @@ tan NOSIGFE
 tanf NOSIGFE
 tanh NOSIGFE
 tanhf NOSIGFE
+tanhl NOSIGFE
+tanl NOSIGFE
 tcdrain SIGFE
 tcflow SIGFE
 tcflush SIGFE
@@ -1287,6 +1375,7 @@ tempnam SIGFE
 tfind NOSIGFE
 tgamma NOSIGFE
 tgammaf NOSIGFE
+tgammal NOSIGFE
 time SIGFE
 timegm NOSIGFE
 timelocal SIGFE
@@ -1307,6 +1396,7 @@ towupper NOSIGFE
 trunc NOSIGFE
 truncate SIGFE
 truncf NOSIGFE
+truncl NOSIGFE
 tsearch SIGFE
 ttyname SIGFE
 ttyname_r SIGFE
index a9b31172bdcee881a0787575842bdeae8a641f38..f3cd2fd37d70f861ab0aecc14b0dfce21d9f14a3 100644 (file)
@@ -164,21 +164,21 @@ _f_frexp NOSIGFE
 _f_frexpf NOSIGFE
 _f_ldexp NOSIGFE
 _f_ldexpf NOSIGFE
-_f_llrint NOSIGFE
-_f_llrintf NOSIGFE
-_f_llrintl NOSIGFE
+_f_llrint = llrint NOSIGFE
+_f_llrintf = llrintf NOSIGFE
+_f_llrintl = llrintl NOSIGFE
 _f_log NOSIGFE
 _f_log10 NOSIGFE
 _f_log10f NOSIGFE
 _f_logf NOSIGFE
-_f_lrint NOSIGFE
-_f_lrintf NOSIGFE
-_f_lrintl NOSIGFE
+_f_lrint = lrint NOSIGFE
+_f_lrintf = lrintf NOSIGFE
+_f_lrintl = lrintl NOSIGFE
 _f_pow NOSIGFE
 _f_powf NOSIGFE
-_f_rint NOSIGFE
-_f_rintf NOSIGFE
-_f_rintl NOSIGFE
+_f_rint = rint NOSIGFE
+_f_rintf = rintf NOSIGFE
+_f_rintl = rintl NOSIGFE
 _f_tan NOSIGFE
 _f_tanf NOSIGFE
 _fabs = fabs NOSIGFE
@@ -622,19 +622,10 @@ fscanf_r = _fscanf_r SIGFE
 get_osfhandle = _get_osfhandle SIGFE
 getpwduid NOSIGFE
 lacl SIGFE
-llrint = _f_llrint NOSIGFE
-llrintf = _f_llrintf NOSIGFE
-llrintl = _f_llrintl NOSIGFE
-lrint = _f_lrint NOSIGFE
-lrintf = _f_lrintf NOSIGFE
-lrintl = _f_lrintl NOSIGFE
 posix_regcomp = regcomp SIGFE
 posix_regerror = regerror SIGFE
 posix_regexec = regexec SIGFE
 posix_regfree = regfree SIGFE
-rint = _f_rint NOSIGFE
-rintf = _f_rintf NOSIGFE
-rintl = _f_rintl NOSIGFE
 scanf_r = _scanf_r SIGFE
 setmode = cygwin_setmode SIGFE
 setregid32 SIGFE
index ee7c4ff6fb51d4eb6d352b96f6521e437af6b7ab..8b1a8fc99e179dc0476ed62aee48dc1cc6707bee 100644 (file)
@@ -478,13 +478,24 @@ details. */
       294: Export clog10, clog10f.
       295: Export POSIX ACL functions.
       296: Export __getpagesize.
+      297: Export missing math functions, acoshl, acosl, asinhl, asinl, atan2l,
+          atanhl, atanl, cacoshl, cacosl, cargl, casinhl, casinl, catanhl,
+          catanl, ccoshl, ccosl, ceill, cexpl, clog10l, clogl, conjl,
+          copysignl, coshl, cosl, cpowl, cprojl, csinhl, csinl, csqrtl, ctanhl,
+          ctanl, dreml, erfcl, erfl, exp10l, exp2l, expl, expm1l, fabsl, fdiml,
+          floorl, fmal, fmaxl, fminl, fmodl, frexpl, ilogbl, isinfl, isnanl,
+          ldexpl, lgammal, lgammal_r, llroundl, log10l, log1pl, log2l, logbl,
+          logl, lroundl, modfl, nearbyintl, nextafterl, nexttoward,
+          nexttowardf, nexttowardl, pow10l, powl, remainderl, remquol, roundl,
+          scalbl, scalblnl, scalbnl, sincosl, sinhl, sinl, tanhl, tanl,
+          tgammal, truncl.
      */
 
      /* Note that we forgot to bump the api for ualarm, strtoll, strtoull,
        sigaltstack, sethostname. */
 
 #define CYGWIN_VERSION_API_MAJOR 0
-#define CYGWIN_VERSION_API_MINOR 296
+#define CYGWIN_VERSION_API_MINOR 297
 
      /* There is also a compatibity version number associated with the
        shared memory regions.  It is incremented when incompatible
diff --git a/winsup/cygwin/math.h b/winsup/cygwin/math.h
new file mode 100644 (file)
index 0000000..d30ecf9
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef _LOCAL_MATH_H_
+#define _LOCAL_MATH_H_
+
+/* This header is required to define the types used by some of the
+   mingw-w64 based files in the math subdir. */
+
+typedef union __mingw_dbl_type_t {
+  double x;
+  unsigned long long val;
+  struct {
+    unsigned int low, high;
+  } lh;
+} __mingw_dbl_type_t;
+
+typedef union __mingw_flt_type_t {
+  float x;
+  unsigned int val;
+} __mingw_flt_type_t;
+
+typedef union __mingw_ldbl_type_t
+{
+  long double x;
+  struct {
+    unsigned int low, high;
+    int sign_exponent : 16;
+    int res1 : 16;
+    int res0 : 32;
+  } lh;
+} __mingw_ldbl_type_t;
+
+typedef union __mingw_fp_types_t
+{
+  long double *ld;
+  double *d;
+  float *f;
+  __mingw_ldbl_type_t *ldt;
+  __mingw_dbl_type_t *dt;
+  __mingw_flt_type_t *ft;
+} __mingw_fp_types_t;
+
+#include_next <math.h>
+
+#endif /* _LOCAL_MATH_H_ */
diff --git a/winsup/cygwin/math/DISCLAIMER.PD b/winsup/cygwin/math/DISCLAIMER.PD
new file mode 100644 (file)
index 0000000..6c2a7c3
--- /dev/null
@@ -0,0 +1,9 @@
+/**
+ * DISCLAIMER
+ * This file has no copyright assigned and is placed in the Public Domain.
+ *
+ * Its code is distributed in the hope that it will be useful but WITHOUT
+ * ANY WARRANTY.  ALL WARRANTIES, EXPRESSED OR IMPLIED ARE HEREBY DISCLAIMED.
+ * This includes but is not limited to warranties of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ */
diff --git a/winsup/cygwin/math/acosh.def.h b/winsup/cygwin/math/acosh.def.h
new file mode 100644 (file)
index 0000000..c039bd8
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "complex_internal.h"
+#include <errno.h>
+#include "fastmath.h"
+
+__FLT_TYPE
+__FLT_ABI(acosh) (__FLT_TYPE x)
+{
+  int x_class = fpclassify (x);
+  if (x_class == FP_NAN || x < __FLT_CST(1.0))
+    {
+      __FLT_RPT_DOMAIN ("acosh", x, 0.0, __FLT_NAN);
+      return __FLT_NAN;
+    }
+  else if (x_class == FP_INFINITE)
+    {
+      __FLT_RPT_DOMAIN ("acosh", x, 0.0, __FLT_NAN);
+      return __FLT_NAN;
+    }
+
+  if (x > __FLT_CST(0x1p32))
+    return __FLT_ABI (__fast_log) (x) + 6.9314718055994530941723E-1L;
+
+  return __FLT_ABI (__fast_log) (x +
+   __FLT_ABI (__fast_sqrt) ((x + __FLT_CST(1.0)) * (x - __FLT_CST(1.0))));
+}
+
diff --git a/winsup/cygwin/math/acoshl.c b/winsup/cygwin/math/acoshl.c
new file mode 100644 (file)
index 0000000..88f9f13
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "acosh.def.h"
diff --git a/winsup/cygwin/math/acosl.c b/winsup/cygwin/math/acosl.c
new file mode 100644 (file)
index 0000000..511b5de
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double acosl (long double x);
+
+long double acosl (long double x)
+{
+  long double res = 0.0L;
+
+  /* acosl = atanl (sqrtl(1 - x^2) / x) */
+  asm (        "fld    %%st\n\t"
+       "fmul   %%st(0)\n\t"            /* x^2 */
+       "fld1\n\t"
+       "fsubp\n\t"                     /* 1 - x^2 */
+       "fsqrt\n\t"                     /* sqrtl (1 - x^2) */
+       "fxch   %%st(1)\n\t"
+       "fpatan"
+       : "=t" (res) : "0" (x) : "st(1)");
+  return res;
+}
diff --git a/winsup/cygwin/math/asinhl.c b/winsup/cygwin/math/asinhl.c
new file mode 100644 (file)
index 0000000..bb2ca97
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+#include "fastmath.h"
+
+ /* asinh(x) = copysign(log(fabs(x) + sqrt(x * x + 1.0)), x) */
+long double asinhl(long double x)
+{
+  long double z;
+  if (!isfinite (x))
+    return x;
+
+  z = fabsl (x);
+
+  /* Avoid setting FPU underflow exception flag in x * x. */
+#if 0
+  if ( z < 0x1p-32)
+    return x;
+#endif
+
+  /* Use log1p to avoid cancellation with small x. Put
+     x * x in denom, so overflow is harmless. 
+     asinh(x) = log1p (x + sqrt (x * x + 1.0) - 1.0)
+              = log1p (x + x * x / (sqrt (x * x + 1.0) + 1.0))  */
+
+  z = __fast_log1pl (z + z * z / (__fast_sqrtl (z * z + 1.0L) + 1.0L));
+
+  return ( x > 0.0 ? z : -z);
+}
diff --git a/winsup/cygwin/math/asinl.c b/winsup/cygwin/math/asinl.c
new file mode 100644 (file)
index 0000000..a4d8746
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ * Adapted for long double type by Danny Smith <dannysmith@users.sourceforge.net>.
+ */
+
+/* asin = atan (x / sqrt(1 - x^2)) */
+long double asinl (long double x);
+
+long double asinl (long double x)
+{
+  long double res = 0.0L;
+
+  asm (        "fld    %%st\n\t"
+       "fmul   %%st(0)\n\t"                    /* x^2 */
+       "fld1\n\t"
+       "fsubp\n\t"                             /* 1 - x^2 */
+       "fsqrt\n\t"                             /* sqrt (1 - x^2) */
+       "fpatan"
+       : "=t" (res) : "0" (x) : "st(1)");
+  return res;
+}
diff --git a/winsup/cygwin/math/atan2l.c b/winsup/cygwin/math/atan2l.c
new file mode 100644 (file)
index 0000000..a32b097
--- /dev/null
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double atan2l (long double y, long double x);
+
+long double
+atan2l (long double y, long double x)
+{
+  long double res = 0.0L;
+  asm ("fpatan" : "=t" (res) : "u" (y), "0" (x) : "st(1)");
+  return res;
+}
diff --git a/winsup/cygwin/math/atanhl.c b/winsup/cygwin/math/atanhl.c
new file mode 100644 (file)
index 0000000..59eb1bd
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+#include "fastmath.h"
+
+/* atanh (x) = 0.5 * log ((1.0 + x)/(1.0 - x)) */
+long double atanhl (long double x)
+{
+  long double z;
+  if (isnan (x))
+    return x;
+  z = fabsl (x);
+  if (z == 1.0L)
+    {
+      errno  = ERANGE;
+      return (x > 0 ? INFINITY : -INFINITY);
+    }
+  if ( z > 1.0L)
+    {
+      errno = EDOM;
+      return nanl("");
+    }
+  /* Rearrange formula to avoid precision loss for small x.
+  atanh(x) = 0.5 * log ((1.0 + x)/(1.0 - x))
+          = 0.5 * log1p ((1.0 + x)/(1.0 - x) - 1.0)
+           = 0.5 * log1p ((1.0 + x - 1.0 + x) /(1.0 - x)) 
+           = 0.5 * log1p ((2.0 * x ) / (1.0 - x))  */
+  z = 0.5L * __fast_log1pl ((z + z) / (1.0L - z));
+  return x >= 0 ? z : -z;
+}
diff --git a/winsup/cygwin/math/atanl.c b/winsup/cygwin/math/atanl.c
new file mode 100644 (file)
index 0000000..b85d053
--- /dev/null
@@ -0,0 +1,17 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double atanl (long double x);
+
+long double
+atanl (long double x)
+{
+  long double res = 0.0L;
+
+  asm ("fld1\n\t"
+       "fpatan"
+       : "=t" (res) : "0" (x));
+  return res;
+}
diff --git a/winsup/cygwin/math/cabs.def.h b/winsup/cygwin/math/cabs.def.h
new file mode 100644 (file)
index 0000000..b3ea097
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __cdecl
+__FLT_ABI(cabs) (__FLT_TYPE __complex__ z)
+{
+  return __FLT_ABI(hypot) (__real__ z, __imag__ z);
+}
diff --git a/winsup/cygwin/math/cabsl.c b/winsup/cygwin/math/cabsl.c
new file mode 100644 (file)
index 0000000..c750e87
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "cabs.def.h"
diff --git a/winsup/cygwin/math/cacos.def.h b/winsup/cygwin/math/cacos.def.h
new file mode 100644 (file)
index 0000000..300faff
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(cacos) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE x;
+  __complex__ __FLT_TYPE ret;
+
+  x = __FLT_ABI(casin) (z);
+
+  __real__ ret = (__FLT_TYPE) __FLT_PI_2 - __real__ x;
+  __imag__ ret = -__imag__ x;
+
+  return ret;
+}
diff --git a/winsup/cygwin/math/cacosh.def.h b/winsup/cygwin/math/cacosh.def.h
new file mode 100644 (file)
index 0000000..f4ea2da
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(cacosh) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE ret;
+  __complex__ __FLT_TYPE x;
+  int r_class = fpclassify (__real__ z);
+  int i_class = fpclassify (__imag__ z);
+
+  if (i_class == FP_INFINITE)
+  {
+    __real__ ret = __FLT_HUGE_VAL;
+    __imag__ ret = (r_class == FP_NAN ? __FLT_NAN : __FLT_ABI(copysign) (
+      (r_class == FP_INFINITE ? (__real__ z < __FLT_CST(0.0) ? __FLT_PI_3_4 : __FLT_PI_4) : __FLT_PI_2), __imag__ z));
+    return ret;
+  }
+
+  if (r_class == FP_INFINITE)
+  {
+    __real__ ret = __FLT_HUGE_VAL;
+    __imag__ ret = ((i_class != FP_NAN && i_class != FP_INFINITE)
+      ? __FLT_ABI(copysign) (signbit (__real__ z) ? __FLT_PI : __FLT_CST(0.0), __imag__ z) : __FLT_NAN);
+    return ret;
+  }
+
+  if (r_class == FP_NAN || i_class == FP_NAN)
+  {
+    __real__ ret = __FLT_NAN;
+    __imag__ ret = __FLT_NAN;
+    return ret;
+  }
+
+  if (r_class == FP_ZERO && i_class == FP_ZERO)
+  {
+    __real__ ret = __FLT_CST(0.0);
+    __imag__ ret = __FLT_ABI(copysign) (__FLT_PI_2, __imag__ z);
+    return ret;
+  }
+
+  __real__ x = (__real__ z - __imag__ z) * (__real__ z + __imag__ z) - __FLT_CST(1.0);
+  __imag__ x = __FLT_CST(2.0) * __real__ z * __imag__ z;
+
+  x = __FLT_ABI(csqrt) (x);
+
+  if (__real__ z < __FLT_CST(0.0))
+    x = -x;
+
+  __real__ x += __real__ z;
+  __imag__ x += __imag__ z;
+
+  ret = __FLT_ABI(clog) (x);
+
+  if (__real__ ret < __FLT_CST(0.0))
+    ret = -ret;
+
+  return ret;
+}
diff --git a/winsup/cygwin/math/cacosl.c b/winsup/cygwin/math/cacosl.c
new file mode 100644 (file)
index 0000000..7a8df65
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "cacosh.def.h"
+#include "cacos.def.h"
diff --git a/winsup/cygwin/math/carg.def.h b/winsup/cygwin/math/carg.def.h
new file mode 100644 (file)
index 0000000..2ccf841
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __cdecl
+__FLT_ABI(carg) (__FLT_TYPE __complex__ z)
+{
+  return __FLT_ABI(atan2) (__imag__ z, __real__ z);
+}
diff --git a/winsup/cygwin/math/cargl.c b/winsup/cygwin/math/cargl.c
new file mode 100644 (file)
index 0000000..e70f580
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "carg.def.h"
diff --git a/winsup/cygwin/math/casin.def.h b/winsup/cygwin/math/casin.def.h
new file mode 100644 (file)
index 0000000..808c1be
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(casin) (__FLT_TYPE __complex__ z)
+{
+  /* Annex G.6: casin(z) = -i casinh (iz) */
+  __complex__ __FLT_TYPE ret;
+  __complex__ __FLT_TYPE x;
+
+  __real__ x = -__imag__ z;
+  __imag__ x = __real__ z;
+
+  x = __FLT_ABI(casinh) (x);
+
+  __real__ ret = __imag__ x;
+  __imag__ ret = -__real__ x;
+
+  return ret;
+}
diff --git a/winsup/cygwin/math/casinh.def.h b/winsup/cygwin/math/casinh.def.h
new file mode 100644 (file)
index 0000000..050d885
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(casinh) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE ret;
+  __complex__ __FLT_TYPE x;
+  int r_class = fpclassify (__real__ z);
+  int i_class = fpclassify (__imag__ z);
+
+  if (i_class == FP_INFINITE)
+  {
+    __real__ ret = __FLT_ABI(copysign) (__FLT_HUGE_VAL, __real__ z);
+    __imag__ ret = (r_class == FP_NAN
+      ? __FLT_NAN
+      : (__FLT_ABI(copysign) ((r_class != FP_NAN && r_class != FP_INFINITE) ? __FLT_PI_2 : __FLT_PI_4, __imag__ z)));
+    return ret;
+  }
+
+  if (r_class == FP_INFINITE)
+  {
+    __real__ ret = __real__ z;
+    __imag__ ret = (i_class != FP_NAN
+      ? __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z)
+      : __FLT_NAN);
+    return ret;
+  }
+
+  if (r_class == FP_NAN)
+  {
+    __real__ ret = __real__ z;
+    __imag__ ret = (i_class == FP_ZERO
+      ? __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z)
+      : __FLT_NAN);
+    return ret;
+  }
+
+  if (i_class == FP_NAN)
+  {
+    __real__ ret = __FLT_NAN;
+    __imag__ ret = __FLT_NAN;
+    return ret;
+  }
+
+  if (r_class == FP_ZERO && i_class == FP_ZERO)
+    return z;
+
+  __real__ x = (__real__ z - __imag__ z) * (__real__ z + __imag__ z) + __FLT_CST(1.0);
+  __imag__ x = __FLT_CST(2.0) * __real__ z * __imag__ z;
+
+  x = __FLT_ABI(csqrt) (x);
+
+  __real__ x += __real__ z;
+  __imag__ x += __imag__ z;
+
+  return __FLT_ABI(clog) (x);
+}
diff --git a/winsup/cygwin/math/casinl.c b/winsup/cygwin/math/casinl.c
new file mode 100644 (file)
index 0000000..1d7e247
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "casinh.def.h"
+#include "casin.def.h"
diff --git a/winsup/cygwin/math/catan.def.h b/winsup/cygwin/math/catan.def.h
new file mode 100644 (file)
index 0000000..19db6b7
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(catan) (__FLT_TYPE __complex__ z)
+{
+  /* Annex G.6: catan(z) = -i catanh (iz) */
+  __complex__ __FLT_TYPE ret;
+  __complex__ __FLT_TYPE x;
+
+  __real__ x = -__imag__ z;
+  __imag__ x = __real__ z;
+
+  x = __FLT_ABI(catanh) (x);
+
+  __real__ ret = __imag__ x;
+  __imag__ ret = -__real__ x;
+
+  return ret;
+}
diff --git a/winsup/cygwin/math/catanh.def.h b/winsup/cygwin/math/catanh.def.h
new file mode 100644 (file)
index 0000000..68949d1
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(catanh) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE ret;
+  __FLT_TYPE i2, n, d;
+  int r_class = fpclassify (__real__ z);
+  int i_class = fpclassify (__imag__ z);
+
+  if (r_class == FP_INFINITE || r_class == FP_NAN || i_class == FP_INFINITE || i_class == FP_NAN)
+  {
+    if (i_class == FP_INFINITE)
+    {
+      __real__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __real__ z);
+      __imag__ ret = __FLT_ABI(copysign) (__FLT_PI_2, __imag__ z);
+      return ret;
+    }
+
+    if (r_class == FP_INFINITE || r_class == FP_ZERO)
+    {
+      __real__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __real__ z);
+      __imag__ ret = ((i_class != FP_NAN && i_class != FP_INFINITE)
+        ? __FLT_ABI(copysign) (__FLT_PI_2, __imag__ z) : __FLT_NAN);
+      return ret;
+    }
+
+    __real__ ret = __FLT_NAN;
+    __imag__ ret = __FLT_NAN;
+    return ret;
+  }
+
+  if (r_class == FP_ZERO && i_class == FP_ZERO)
+    return z;
+
+  i2 = __imag__ z * __imag__ z;
+
+  n = __FLT_CST(1.0) + __real__ z;
+  n = i2 + n * n;
+
+  d = __FLT_CST(1.0) - __real__ z;
+  d = i2 + d * d;
+
+  __real__ ret = __FLT_CST(0.25) * (__FLT_ABI(log) (n) - __FLT_ABI(log) (d));
+
+  d = 1 - __real__ z * __real__ z - i2;
+
+  __imag__ ret = __FLT_CST(0.5) * __FLT_ABI(atan2) (__FLT_CST(2.0) * __imag__ z, d);
+
+  return ret;
+}
diff --git a/winsup/cygwin/math/catanl.c b/winsup/cygwin/math/catanl.c
new file mode 100644 (file)
index 0000000..9c1ccdf
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "catanh.def.h"
+#include "catan.def.h"
diff --git a/winsup/cygwin/math/cbrtl.c b/winsup/cygwin/math/cbrtl.c
new file mode 100644 (file)
index 0000000..95074e9
--- /dev/null
@@ -0,0 +1,80 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+static const long double CBRT2  = 1.2599210498948731647672L;
+static const long double CBRT4  = 1.5874010519681994747517L;
+static const long double CBRT2I = 0.79370052598409973737585L;
+static const long double CBRT4I = 0.62996052494743658238361L;
+
+long double cbrtl(long double x)
+{
+       int e, rem, sign;
+       long double z;
+
+       if (!isfinite (x) || x == 0.0L)
+               return (x);
+
+       if (x > 0)
+               sign = 1;
+       else
+       {
+               sign = -1;
+               x = -x;
+       }
+
+       z = x;
+       /* extract power of 2, leaving
+        * mantissa between 0.5 and 1
+        */
+       x = frexpl(x, &e);
+
+       /* Approximate cube root of number between .5 and 1,
+        * peak relative error = 1.2e-6
+        */
+       x = (((( 1.3584464340920900529734e-1L * x
+              - 6.3986917220457538402318e-1L) * x
+              + 1.2875551670318751538055e0L) * x
+              - 1.4897083391357284957891e0L) * x
+              + 1.3304961236013647092521e0L) * x
+              + 3.7568280825958912391243e-1L;
+
+       /* exponent divided by 3 */
+       if (e >= 0)
+       {
+               rem = e;
+               e /= 3;
+               rem -= 3*e;
+               if (rem == 1)
+                       x *= CBRT2;
+               else if (rem == 2)
+                       x *= CBRT4;
+       }
+       else
+       { /* argument less than 1 */
+               e = -e;
+               rem = e;
+               e /= 3;
+               rem -= 3*e;
+               if (rem == 1)
+                       x *= CBRT2I;
+               else if (rem == 2)
+                       x *= CBRT4I;
+               e = -e;
+       }
+
+       /* multiply by power of 2 */
+       x = ldexpl(x, e);
+
+       /* Newton iteration */
+
+       x -= ( x - (z/(x*x)) )*0.3333333333333333333333L;
+       x -= ( x - (z/(x*x)) )*0.3333333333333333333333L;
+
+       if (sign < 0)
+               x = -x;
+       return (x);
+}
diff --git a/winsup/cygwin/math/ccos.def.h b/winsup/cygwin/math/ccos.def.h
new file mode 100644 (file)
index 0000000..2e7472c
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(ccos) (__FLT_TYPE __complex__ z)
+{
+  /* Annex G.6, ccos(z) = ccosh(iz) */
+  __complex__ __FLT_TYPE x;
+  __real__ x = -__imag__ z;
+  __imag__ x = __real__ z;
+
+  return __FLT_ABI(ccosh) (x);
+}
diff --git a/winsup/cygwin/math/ccosh.def.h b/winsup/cygwin/math/ccosh.def.h
new file mode 100644 (file)
index 0000000..c18d657
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(ccosh) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE ret;
+  __FLT_TYPE s_x, c_x;
+  int r_class = fpclassify (__real__ z);
+  int i_class = fpclassify (__imag__ z);
+
+  if (r_class == FP_NAN)
+  {
+    __real__ ret = __FLT_NAN;
+    __imag__ ret = __imag__ z == __FLT_CST(0.0) ? __imag__ z : __FLT_NAN;
+    return ret;
+  }
+
+  if (r_class == FP_INFINITE)
+  {
+    if (i_class == FP_ZERO)
+    {
+      __real__ ret = __FLT_HUGE_VAL;
+      __imag__ ret = __imag__ z * __FLT_ABI(copysign) (__FLT_CST(1.0), __real__ z);
+      return ret;
+    }
+
+    if (i_class == FP_NAN || i_class == FP_INFINITE)
+    {
+      __real__ ret = __FLT_HUGE_VAL;
+      __imag__ ret = __FLT_NAN + __FLT_NAN;
+      return ret;
+    }
+
+    __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+    __real__ ret = __FLT_ABI(copysign) (__FLT_HUGE_VAL, c_x);
+    __imag__ ret = (__FLT_ABI(copysign) (__FLT_HUGE_VAL, s_x) * __FLT_ABI(copysign) (__FLT_CST(1.0), __real__ z));
+    return ret;
+  }
+
+  if (i_class == FP_NAN || i_class == FP_INFINITE)
+  {
+    __imag__ ret = __real__ z == __FLT_CST(0.0) ? __FLT_CST(0.0) : __FLT_NAN;
+    __real__ ret = __FLT_NAN + __FLT_NAN;
+    return ret;
+  }
+
+  __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+  __real__ ret = __FLT_ABI(cosh) (__real__ z) * c_x;
+  __imag__ ret = __FLT_ABI(sinh) (__real__ z) * s_x;
+  return ret;
+}
diff --git a/winsup/cygwin/math/ccosl.c b/winsup/cygwin/math/ccosl.c
new file mode 100644 (file)
index 0000000..594a4d1
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "ccosh.def.h"
+#include "ccos.def.h"
diff --git a/winsup/cygwin/math/ceil.S b/winsup/cygwin/math/ceil.S
new file mode 100644 (file)
index 0000000..636df1e
--- /dev/null
@@ -0,0 +1,124 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "ceil.S"
+       .text
+       .align 4
+       .globl __MINGW_USYMBOL(ceil)
+       .def    __MINGW_USYMBOL(ceil);  .scl    2;      .type   32;     .endef
+#ifdef __x86_64__
+       .seh_proc       __MINGW_USYMBOL(ceil)
+#endif
+
+__MINGW_USYMBOL(ceil):
+#if defined(_AMD64_) || defined(__x86_64__)
+       .seh_endprologue
+       movd %xmm0, %rax
+       movq    %rax, %rcx
+       sarq    $52, %rcx
+       andl    $2047, %ecx
+       subl    $1023, %ecx
+       cmpl    $51, %ecx
+       jg      .is_intnaninf
+       /* Is x zero? */
+       testq   %rax, %rax
+       je      .ret_org
+       /* Is x signed? */
+       testl   %ecx, %ecx
+       js      .signed_val
+       /* Is x integral? */
+       movabsq $4503599627370495, %rdx
+       sarq    %cl, %rdx
+       testq   %rax, %rdx
+       je      .ret_org
+       addsd   .huge(%rip), %xmm0
+       ucomisd .zero(%rip), %xmm0
+       jbe     .doret
+       testq   %rax, %rax
+       jle     .l1
+       /* inexact ... */
+       movabsq $4503599627370496, %r8
+       shrq    %cl, %r8
+       addq    %r8, %rax
+.l1:
+       notq    %rdx
+       andq    %rdx, %rax
+.doret:
+       movd %rax, %xmm0
+       ret
+       .p2align 4,,10
+.signed_val:
+       addsd   .huge(%rip), %xmm0
+       ucomisd .zero(%rip), %xmm0
+       jbe     .doret2
+       testq   %rax, %rax
+       movabsq $4607182418800017408, %rdx
+       movabsq $-9223372036854775808, %rax
+       cmovns  %rdx, %rax
+       .p2align 4,,10
+.doret2:
+       movd %rax, %xmm0
+       ret
+
+       .p2align 4,,10
+.is_intnaninf:
+       /* Is Nan or Inf? */
+       cmpl    $1024, %ecx
+       je      .ret_naninf
+       .p2align 4,,10
+.ret_org:
+       /* return x.  */
+       rep
+       ret
+       .p2align 4,,10
+.ret_naninf:
+       /* return x + x; */
+       addsd   %xmm0, %xmm0
+       ret
+       .seh_endproc
+
+/* local data.  */
+       .section .rdata,"dr"
+       .align 8
+.huge:
+       .long   -2013235812
+       .long   2117592124
+       .align 8
+.zero:
+       .long   0
+       .long   0
+#elif defined(_ARM_) || defined(__arm__)
+       vmrs    r1, fpscr
+       bic             r0, r1, #0x00c00000
+       orr             r0, r0, #0x00400000 /* Round towards Plus Infinity */
+       vmsr    fpscr, r0
+       vcvtr.s32.f64   s0, d0
+       vcvt.f64.s32    d0, s0
+       vmsr    fpscr, r1
+       bx      lr
+#elif defined(_X86_) || defined(__i386__)
+       fldl    4(%esp)
+       subl    $8,%esp
+
+       fstcw   4(%esp)                 /* store fpu control word */
+
+       /* We use here %edx although only the low 1 bits are defined.
+          But none of the operations should care and they are faster
+          than the 16 bit operations.  */
+       movl    $0x0800,%edx            /* round towards +oo */
+       orl     4(%esp),%edx
+       andl    $0xfbff,%edx
+       movl    %edx,(%esp)
+       fldcw   (%esp)                  /* load modified control word */
+
+       frndint                         /* round */
+
+       fldcw   4(%esp)                 /* restore original control word */
+
+       addl    $8,%esp
+       ret
+#endif
diff --git a/winsup/cygwin/math/ceilf.S b/winsup/cygwin/math/ceilf.S
new file mode 100644 (file)
index 0000000..605c7bf
--- /dev/null
@@ -0,0 +1,120 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "ceilf.S"
+       .text
+       .align 4
+       .globl __MINGW_USYMBOL(ceilf)
+       .def    __MINGW_USYMBOL(ceilf); .scl    2;      .type   32;     .endef
+#ifdef __x86_64__
+       .seh_proc       __MINGW_USYMBOL(ceilf)
+#endif
+
+__MINGW_USYMBOL(ceilf):
+#if defined(_AMD64_) || defined(__x86_64__)
+        subq    $24, %rsp
+        .seh_stackalloc 24
+        .seh_endprologue
+        movd    %xmm0, 12(%rsp)
+        movl    12(%rsp), %eax
+        movl    %eax, %ecx
+        movl    %eax, %edx
+        sarl    $23, %ecx
+        andl    $255, %ecx
+        subl    $127, %ecx
+        cmpl    $22, %ecx
+        jg      .l4
+        testl   %ecx, %ecx
+        js      .l5
+        movl    $8388607, %r8d
+        sarl    %cl, %r8d
+        testl   %eax, %r8d
+        je      .l3
+        addss   .hugeval(%rip), %xmm0
+        ucomiss .zeroval(%rip), %xmm0
+        jbe     .l2
+        testl   %eax, %eax
+        jle     .l1
+        movl    $8388608, %eax
+        sarl    %cl, %eax
+        addl    %eax, %edx
+.l1:
+        movl    %r8d, %eax
+        notl    %eax
+        andl    %edx, %eax
+.l2:
+        movl    %eax, 8(%rsp)
+        movss   8(%rsp), %xmm0
+.l3:
+        addq    $24, %rsp
+        ret
+        .p2align 4,,10
+.l4:
+        addl    $-128, %ecx
+        jne     .l3
+        addss   %xmm0, %xmm0
+        addq    $24, %rsp
+        ret
+        .p2align 4,,10
+.l5:
+        addss   .hugeval(%rip), %xmm0
+        ucomiss .zeroval(%rip), %xmm0
+        jbe     .islesseqzero
+        testl   %eax, %eax
+        js      .l6
+        movl    $1065353216, %edx
+        cmovne  %edx, %eax
+.islesseqzero:
+        movl    %eax, 8(%rsp)
+        movss   8(%rsp), %xmm0
+        addq    $24, %rsp
+        ret
+        .p2align 4,,10
+.l6:
+        movl    $-2147483648, 8(%rsp)
+        movss   8(%rsp), %xmm0
+        addq    $24, %rsp
+        ret
+        .seh_endproc
+        .section .rdata,"dr"
+        .align 4
+.hugeval:
+        .long   1900671690
+        .align 4
+.zeroval:
+        .long   0
+#elif defined(_ARM_) || defined(__arm__)
+       vmrs    r1, fpscr
+       bic             r0, r1, #0x00c00000
+       orr             r0, r0, #0x00400000 /* Round towards Plus Infinity */
+       vmsr    fpscr, r0
+       vcvt.s32.f32    s0, s0
+       vcvt.f32.s32    s0, s0
+       vmsr    fpscr, r1
+       bx      lr
+#elif defined(_X86_) || defined(__i386__)
+       flds    4(%esp)
+       subl    $8,%esp
+
+       fstcw   4(%esp)                 /* store fpu control word */
+
+       /* We use here %edx although only the low 1 bits are defined.
+          But none of the operations should care and they are faster
+          than the 16 bit operations.  */
+       movl    $0x0800,%edx            /* round towards +oo */
+       orl     4(%esp),%edx
+       andl    $0xfbff,%edx
+       movl    %edx,(%esp)
+       fldcw   (%esp)                  /* load modified control word */
+
+       frndint                         /* round */
+
+       fldcw   4(%esp)                 /* restore original control word */
+
+       addl    $8,%esp
+       ret
+#endif
diff --git a/winsup/cygwin/math/ceill.S b/winsup/cygwin/math/ceill.S
new file mode 100644 (file)
index 0000000..61d6199
--- /dev/null
@@ -0,0 +1,64 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "ceill.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+       .globl __MINGW_USYMBOL(ceill)
+       .def    __MINGW_USYMBOL(ceill); .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(ceill):
+#if defined(_AMD64_) || defined(__x86_64__)
+       fldt    (%rdx)
+       subq    $24,%rsp
+
+       fstcw   8(%rsp)                 /* store fpu control word */
+
+       /* We use here %edx although only the low 1 bits are defined.
+          But none of the operations should care and they are faster
+          than the 16 bit operations.  */
+       movl    $0x0800,%edx            /* round towards +oo */
+       orl     8(%rsp),%edx
+       andl    $0xfbff,%edx
+       movl    %edx,(%rsp)
+       fldcw   (%rsp)                  /* load modified control word */
+
+       frndint                         /* round */
+
+       fldcw   8(%rsp)                 /* restore original control word */
+
+       addq    $24,%rsp
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+#elif defined(_ARM_) || defined(__arm__)
+       vmrs    r1, fpscr
+       bic             r0, r1, #0x00c00000
+       orr             r0, r0, #0x00400000 /* Round towards Plus Infinity */
+       vmsr    fpscr, r0
+       vcvtr.s32.f64   s0, d0
+       vcvt.f64.s32    d0, s0
+       vmsr    fpscr, r1
+       bx      lr
+#elif defined(_X86_) || defined(__i386__)
+       fldt    4(%esp)
+       subl    $8,%esp
+       fstcw   4(%esp)
+       movl    $0x0800,%edx
+       orl     4(%esp),%edx
+       andl    $0xfbff,%edx
+       movl    %edx,(%esp)
+       fldcw   (%esp)
+       frndint
+       fldcw   4(%esp)
+       addl $8,%esp
+       ret
+#endif
diff --git a/winsup/cygwin/math/cephes_emath.c b/winsup/cygwin/math/cephes_emath.c
new file mode 100644 (file)
index 0000000..8fb4434
--- /dev/null
@@ -0,0 +1,1283 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_emath.h"
+
+/*
+ * The constants are for 64 bit precision.
+ */
+
+
+/* Move in external format number,
+ * converting it to internal format.
+ */
+void __emovi(const short unsigned int * __restrict__ a,
+            short unsigned int * __restrict__ b)
+{
+       register const unsigned short *p;
+       register unsigned short *q;
+       int i;
+
+       q = b;
+       p = a + (NE-1); /* point to last word of external number */
+       /* get the sign bit */
+       if (*p & 0x8000)
+               *q++ = 0xffff;
+       else
+               *q++ = 0;
+       /* get the exponent */
+       *q = *p--;
+       *q++ &= 0x7fff; /* delete the sign bit */
+#ifdef INFINITY
+       if ((*(q - 1) & 0x7fff) == 0x7fff)
+       {
+#ifdef NANS
+               if (__eisnan(a))
+               {
+                       *q++ = 0;
+                       for (i = 3; i < NI; i++ )
+                               *q++ = *p--;
+                       return;
+               }
+#endif
+               for (i = 2; i < NI; i++)
+                       *q++ = 0;
+               return;
+       }
+#endif
+       /* clear high guard word */
+       *q++ = 0;
+       /* move in the significand */
+       for (i = 0; i < NE - 1; i++ )
+               *q++ = *p--;
+       /* clear low guard word */
+       *q = 0;
+}
+
+
+/*
+;      Add significands
+;      x + y replaces y
+*/
+
+void __eaddm(const short unsigned int * __restrict__ x,
+                 short unsigned int * __restrict__ y)
+{
+       register unsigned long a;
+       int i;
+       unsigned int carry;
+
+       x += NI - 1;
+       y += NI - 1;
+       carry = 0;
+       for (i = M; i < NI; i++)
+       {
+               a = (unsigned long)(*x) + (unsigned long)(*y) + carry;
+               if (a & 0x10000)
+                       carry = 1;
+               else
+                       carry = 0;
+               *y = (unsigned short)a;
+               --x;
+               --y;
+       }
+}
+
+/*
+;      Subtract significands
+;      y - x replaces y
+*/
+
+void __esubm(const short unsigned int * __restrict__ x,
+                 short unsigned int * __restrict__ y)
+{
+       unsigned long a;
+       int i;
+       unsigned int carry;
+
+       x += NI - 1;
+       y += NI - 1;
+       carry = 0;
+       for (i = M; i < NI; i++)
+       {
+               a = (unsigned long)(*y) - (unsigned long)(*x) - carry;
+               if (a & 0x10000)
+                       carry = 1;
+               else
+                       carry = 0;
+               *y = (unsigned short)a;
+               --x;
+               --y;
+       }
+}
+
+
+/* Multiply significand of e-type number b
+by 16-bit quantity a, e-type result to c. */
+
+static void __m16m(short unsigned int a,
+                  short unsigned int *  __restrict__ b,
+                  short unsigned int *  __restrict__ c)
+{
+       register unsigned short *pp;
+       register unsigned long carry;
+       unsigned short *ps;
+       unsigned short p[NI];
+       unsigned long aa, m;
+       int i;
+
+       aa = a;
+       pp = &p[NI - 2];
+       *pp++ = 0;
+       *pp = 0;
+       ps = &b[NI - 1];
+
+       for(i = M + 1; i < NI; i++)
+       {
+               if (*ps == 0)
+               {
+                       --ps;
+                       --pp;
+                       *(pp - 1) = 0;
+               }
+               else
+               {
+                       m = (unsigned long) aa * *ps--;
+                       carry = (m & 0xffff) + *pp;
+                       *pp-- = (unsigned short)carry;
+                       carry = (carry >> 16) + (m >> 16) + *pp;
+                       *pp = (unsigned short)carry;
+                       *(pp - 1) = carry >> 16;
+               }
+       }
+       for (i = M; i < NI; i++)
+       c[i] = p[i];
+}
+
+
+/* Divide significands. Neither the numerator nor the denominator
+is permitted to have its high guard word nonzero.  */
+
+int __edivm(short unsigned int * __restrict__ den,
+                short unsigned int * __restrict__ num)
+{
+       int i;
+       register unsigned short *p;
+       unsigned long tnum;
+       unsigned short j, tdenm, tquot;
+       unsigned short tprod[NI + 1];
+       unsigned short equot[NI];
+
+       p = &equot[0];
+       *p++ = num[0];
+       *p++ = num[1];
+
+       for (i = M; i < NI; i++)
+       {
+               *p++ = 0;
+       }
+       __eshdn1(num);
+       tdenm = den[M + 1];
+       for (i = M; i < NI; i++)
+       {
+               /* Find trial quotient digit (the radix is 65536). */
+               tnum = (((unsigned long) num[M]) << 16) + num[M + 1];
+
+               /* Do not execute the divide instruction if it will overflow. */
+               if ((tdenm * 0xffffUL) < tnum)
+                       tquot = 0xffff;
+               else
+                       tquot = tnum / tdenm;
+
+               /* Prove that the divide worked. */
+               /*
+               tcheck = (unsigned long)tquot * tdenm;
+               if (tnum - tcheck > tdenm)
+                       tquot = 0xffff;
+               */
+               /* Multiply denominator by trial quotient digit. */
+               __m16m(tquot, den, tprod);
+               /* The quotient digit may have been overestimated. */
+               if (__ecmpm(tprod, num) > 0)
+               {
+                       tquot -= 1;
+                       __esubm(den, tprod);
+                       if(__ecmpm(tprod, num) > 0)
+                       {
+                               tquot -= 1;
+                               __esubm(den, tprod);
+                       }
+               }
+               __esubm(tprod, num);
+               equot[i] = tquot;
+               __eshup6(num);
+       }
+       /* test for nonzero remainder after roundoff bit */
+       p = &num[M];
+       j = 0;
+       for (i = M; i < NI; i++)
+       {
+               j |= *p++;
+       }
+       if (j)
+               j = 1;
+
+       for (i = 0; i < NI; i++)
+               num[i] = equot[i];
+
+       return ( (int)j );
+}
+
+
+/* Multiply significands */
+int __emulm(const short unsigned int * __restrict__ a,
+                short unsigned int * __restrict__ b)
+{
+       const unsigned short *p;
+       unsigned short *q;
+       unsigned short pprod[NI];
+       unsigned short equot[NI];
+       unsigned short j;
+       int i;
+
+       equot[0] = b[0];
+       equot[1] = b[1];
+       for (i = M; i < NI; i++)
+               equot[i] = 0;
+
+       j = 0;
+       p = &a[NI - 1];
+       q = &equot[NI - 1];
+       for (i = M + 1; i < NI; i++)
+       {
+               if (*p == 0)
+               {
+                       --p;
+               }
+               else
+               {
+                       __m16m(*p--, b, pprod);
+                       __eaddm(pprod, equot);
+               }
+               j |= *q;
+               __eshdn6(equot);
+       }
+
+       for (i = 0; i < NI; i++)
+               b[i] = equot[i];
+
+       /* return flag for lost nonzero bits */
+       return ( (int)j );
+}
+
+
+/*
+ * Normalize and round off.
+ *
+ * The internal format number to be rounded is "s".
+ * Input "lost" indicates whether the number is exact.
+ * This is the so-called sticky bit.
+ *
+ * Input "subflg" indicates whether the number was obtained
+ * by a subtraction operation.  In that case if lost is nonzero
+ * then the number is slightly smaller than indicated.
+ *
+ * Input "expo" is the biased exponent, which may be negative.
+ * the exponent field of "s" is ignored but is replaced by
+ * "expo" as adjusted by normalization and rounding.
+ *
+ * Input "rcntrl" is the rounding control.
+ *
+ * Input "rnprc" is precison control (64 or NBITS).
+ */
+
+void __emdnorm(short unsigned int *s, int lost, int subflg, int expo, int rcntrl, int rndprc)
+{
+       int i, j;
+       unsigned short r;
+       int rw = NI-1; /* low guard word */
+       int re = NI-2;
+       const unsigned short rmsk = 0xffff;
+       const unsigned short rmbit = 0x8000;
+#if NE == 6
+       unsigned short rbit[NI] = {0,0,0,0,0,0,0,1,0};
+#else
+       unsigned short rbit[NI] = {0,0,0,0,0,0,0,0,0,0,0,1,0};
+#endif
+
+       /* Normalize */
+       j = __enormlz(s);
+
+       /* a blank significand could mean either zero or infinity. */
+#ifndef INFINITY
+       if (j > NBITS)
+       {
+               __ecleazs(s);
+               return;
+       }
+#endif
+       expo -= j;
+#ifndef INFINITY
+       if (expo >= 32767)
+               goto overf;
+#else
+       if ((j > NBITS) && (expo < 32767))
+       {
+               __ecleazs(s);
+               return;
+       }
+#endif
+       if (expo < 0)
+       {
+               if (expo > (-NBITS - 1))
+               {
+                       j = expo;
+                       i = __eshift(s, j);
+                       if (i)
+                               lost = 1;
+               }
+               else
+               {
+                       __ecleazs(s);
+                       return;
+               }
+       }
+       /* Round off, unless told not to by rcntrl. */
+       if (rcntrl == 0)
+               goto mdfin;
+       if (rndprc == 64)
+       {
+               rw = 7;
+               re = 6;
+               rbit[NI - 2] = 0;
+               rbit[6] = 1;
+       }
+
+       /* Shift down 1 temporarily if the data structure has an implied
+        * most significant bit and the number is denormal.
+        * For rndprc = 64 or NBITS, there is no implied bit.
+        * But Intel long double denormals lose one bit of significance even so.
+        */
+#if IBMPC
+       if ((expo <= 0) && (rndprc != NBITS))
+#else
+       if ((expo <= 0) && (rndprc != 64) && (rndprc != NBITS))
+#endif
+       {
+               lost |= s[NI - 1] & 1;
+               __eshdn1(s);
+       }
+       /* Clear out all bits below the rounding bit,
+        * remembering in r if any were nonzero.
+        */
+       r = s[rw] & rmsk;
+       if (rndprc < NBITS)
+       {
+               i = rw + 1;
+               while (i < NI)
+               {
+                       if( s[i] )
+                               r |= 1;
+                       s[i] = 0;
+                       ++i;
+               }
+       }
+       s[rw] &= (rmsk ^ 0xffff);
+       if ((r & rmbit) != 0)
+       {
+               if (r == rmbit)
+               {
+                       if (lost == 0)
+                       { /* round to even */
+                               if ((s[re] & 1) == 0)
+                                       goto mddone;
+                       }
+                       else
+                       {
+                               if (subflg != 0)
+                                       goto mddone;
+                       }
+               }
+               __eaddm(rbit, s);
+       }
+mddone:
+#if IBMPC
+       if ((expo <= 0) && (rndprc != NBITS))
+#else
+       if ((expo <= 0) && (rndprc != 64) && (rndprc != NBITS))
+#endif
+       {
+               __eshup1(s);
+       }
+       if (s[2] != 0)
+       { /* overflow on roundoff */
+               __eshdn1(s);
+               expo += 1;
+       }
+mdfin:
+       s[NI - 1] = 0;
+       if (expo >= 32767)
+       {
+#ifndef INFINITY
+overf:
+#endif
+#ifdef INFINITY
+               s[1] = 32767;
+               for (i = 2; i < NI - 1; i++ )
+                       s[i] = 0;
+#else
+               s[1] = 32766;
+               s[2] = 0;
+               for (i = M + 1; i < NI - 1; i++)
+                       s[i] = 0xffff;
+               s[NI - 1] = 0;
+               if ((rndprc < 64) || (rndprc == 113))
+                       s[rw] &= (rmsk ^ 0xffff);
+#endif
+               return;
+       }
+       if (expo < 0)
+               s[1] = 0;
+       else
+               s[1] = (unsigned short)expo;
+}
+
+
+/*
+;      Multiply.
+;
+;      unsigned short a[NE], b[NE], c[NE];
+;      emul( a, b, c );        c = b * a
+*/
+void __emul(const short unsigned int *a,
+                const short unsigned int *b,
+                short unsigned int *c)
+{
+       unsigned short ai[NI], bi[NI];
+       int i, j;
+       long lt, lta, ltb;
+
+#ifdef NANS
+       /* NaN times anything is the same NaN. */
+       if (__eisnan(a))
+       {
+               __emov(a, c);
+               return;
+       }
+       if (__eisnan(b))
+       {
+               __emov(b, c);
+               return;
+       }
+       /* Zero times infinity is a NaN. */
+       if ((__eisinf(a) && __eiiszero(b))
+        || (__eisinf(b) && __eiiszero(a)))
+       {
+               mtherr( "emul", DOMAIN);
+               __enan_NBITS(c);
+               return;
+       }
+#endif
+/* Infinity times anything else is infinity. */
+#ifdef INFINITY
+       if (__eisinf(a) || __eisinf(b))
+       {
+               if (__eisneg(a) ^ __eisneg(b))
+                       *(c + (NE-1)) = 0x8000;
+               else
+                       *(c + (NE-1)) = 0;
+               __einfin(c);
+               return;
+       }
+#endif
+       __emovi(a, ai);
+       __emovi(b, bi);
+       lta = ai[E];
+       ltb = bi[E];
+       if (ai[E] == 0)
+       {
+               for (i = 1; i < NI - 1; i++)
+               {
+                       if (ai[i] != 0)
+                       {
+                               lta -= __enormlz( ai );
+                               goto mnzer1;
+                       }
+               }
+               __eclear(c);
+               return;
+       }
+mnzer1:
+
+       if (bi[E] == 0)
+       {
+               for (i = 1; i < NI - 1; i++)
+               {
+                       if (bi[i] != 0)
+                       {
+                               ltb -= __enormlz(bi);
+                               goto mnzer2;
+                       }
+               }
+               __eclear(c);
+               return;
+       }
+mnzer2:
+
+       /* Multiply significands */
+       j = __emulm(ai, bi);
+       /* calculate exponent */
+       lt = lta + ltb - (EXONE - 1);
+       __emdnorm(bi, j, 0, lt, 64, NBITS);
+       /* calculate sign of product */
+       if (ai[0] == bi[0])
+               bi[0] = 0;
+       else
+               bi[0] = 0xffff;
+       __emovo(bi, c);
+}
+
+
+/* move out internal format to ieee long double */
+void __toe64(short unsigned int *a, short unsigned int *b)
+{
+       register unsigned short *p, *q;
+       unsigned short i;
+
+#ifdef NANS
+       if (__eiisnan(a))
+       {
+               __enan_64(b);
+               return;
+       }
+#endif
+#ifdef IBMPC
+       /* Shift Intel denormal significand down 1.  */
+       if (a[E] == 0)
+               __eshdn1(a);
+#endif
+       p = a;
+#ifdef MIEEE
+       q = b;
+#else
+       q = b + 4; /* point to output exponent */
+#if 1
+       /* NOTE: if data type is 96 bits wide, clear the last word here. */
+       *(q + 1)= 0;
+#endif
+#endif
+
+       /* combine sign and exponent */
+       i = *p++;
+#ifdef MIEEE
+       if (i)
+               *q++ = *p++ | 0x8000;
+       else
+               *q++ = *p++;
+       *q++ = 0;
+#else
+       if (i)
+               *q-- = *p++ | 0x8000;
+       else
+               *q-- = *p++;
+#endif
+       /* skip over guard word */
+       ++p;
+       /* move the significand */
+#ifdef MIEEE
+       for (i = 0; i < 4; i++)
+               *q++ = *p++;
+#else
+#ifdef INFINITY
+       if (__eiisinf(a))
+        {
+       /* Intel long double infinity.  */
+               *q-- = 0x8000;
+               *q-- = 0;
+               *q-- = 0;
+               *q = 0;
+               return;
+       }
+#endif
+       for (i = 0; i < 4; i++)
+               *q-- = *p++;
+#endif
+}
+
+
+/* Compare two e type numbers.
+ *
+ * unsigned short a[NE], b[NE];
+ * ecmp( a, b );
+ *
+ *  returns +1 if a > b
+ *           0 if a == b
+ *          -1 if a < b
+ *          -2 if either a or b is a NaN.
+ */
+int __ecmp(const short unsigned int * __restrict__ a,
+               const short unsigned int *  __restrict__ b)
+{
+       unsigned short ai[NI], bi[NI];
+       register unsigned short *p, *q;
+       register int i;
+       int msign;
+
+#ifdef NANS
+       if (__eisnan (a) || __eisnan (b))
+               return (-2);
+#endif
+       __emovi(a, ai);
+       p = ai;
+       __emovi(b, bi);
+       q = bi;
+
+       if (*p != *q)
+       { /* the signs are different */
+               /* -0 equals + 0 */
+               for (i = 1; i < NI - 1; i++)
+               {
+                       if (ai[i] != 0)
+                               goto nzro;
+                       if (bi[i] != 0)
+                               goto nzro;
+               }
+               return (0);
+nzro:
+               if (*p == 0)
+                       return (1);
+               else
+                       return (-1);
+       }
+       /* both are the same sign */
+       if (*p == 0)
+               msign = 1;
+       else
+               msign = -1;
+       i = NI - 1;
+       do
+       {
+               if (*p++ != *q++)
+               {
+                       goto diff;
+               }
+       }
+       while (--i > 0);
+
+       return (0);     /* equality */
+
+diff:
+       if ( *(--p) > *(--q) )
+               return (msign);         /* p is bigger */
+       else
+               return (-msign);        /* p is littler */
+}
+
+/*
+;      Shift significand
+;
+;      Shifts significand area up or down by the number of bits
+;      given by the variable sc.
+*/
+int __eshift(short unsigned int *x, int sc)
+{
+       unsigned short lost;
+       unsigned short *p;
+
+       if (sc == 0)
+               return (0);
+
+       lost = 0;
+       p = x + NI - 1;
+
+       if (sc < 0)
+       {
+               sc = -sc;
+               while (sc >= 16)
+               {
+                       lost |= *p;     /* remember lost bits */
+                       __eshdn6(x);
+                       sc -= 16;
+               }
+
+               while (sc >= 8)
+               {
+                       lost |= *p & 0xff;
+                       __eshdn8(x);
+                       sc -= 8;
+               }
+
+               while (sc > 0)
+               {
+                       lost |= *p & 1;
+                       __eshdn1(x);
+                       sc -= 1;
+               }
+       }
+       else
+       {
+               while (sc >= 16)
+               {
+                       __eshup6(x);
+                       sc -= 16;
+               }
+
+               while (sc >= 8)
+               {
+                       __eshup8(x);
+                       sc -= 8;
+               }
+
+               while (sc > 0)
+               {
+                       __eshup1(x);
+                       sc -= 1;
+               }
+       }
+       if (lost)
+               lost = 1;
+       return ( (int)lost );
+}
+
+
+/*
+;      normalize
+;
+; Shift normalizes the significand area pointed to by argument
+; shift count (up = positive) is returned.
+*/
+int __enormlz(short unsigned int *x)
+{
+       register unsigned short *p;
+       int sc;
+
+       sc = 0;
+       p = &x[M];
+       if (*p != 0)
+               goto normdn;
+       ++p;
+       if (*p & 0x8000)
+               return (0);     /* already normalized */
+       while (*p == 0)
+       {
+               __eshup6(x);
+               sc += 16;
+               /* With guard word, there are NBITS+16 bits available.
+                * return true if all are zero.
+                */
+               if (sc > NBITS)
+                       return (sc);
+       }
+       /* see if high byte is zero */
+       while ((*p & 0xff00) == 0)
+       {
+               __eshup8(x);
+               sc += 8;
+       }
+       /* now shift 1 bit at a time */
+       while ((*p  & 0x8000) == 0)
+       {
+               __eshup1(x);
+               sc += 1;
+               if (sc > (NBITS + 16))
+               {
+                       mtherr( "enormlz", UNDERFLOW);
+                       return (sc);
+               }
+       }
+       return (sc);
+
+       /* Normalize by shifting down out of the high guard word
+          of the significand */
+normdn:
+       if (*p & 0xff00)
+       {
+               __eshdn8(x);
+               sc -= 8;
+       }
+       while (*p != 0)
+       {
+               __eshdn1(x);
+               sc -= 1;
+
+               if (sc < -NBITS)
+               {
+                       mtherr("enormlz", OVERFLOW);
+                       return (sc);
+               }
+       }
+       return (sc);
+}
+
+
+/* Move internal format number out,
+ * converting it to external format.
+ */
+void __emovo(const short unsigned int * __restrict__ a,
+                 short unsigned int * __restrict__ b)
+{
+       register const unsigned short *p;
+       register unsigned short *q;
+       unsigned short i;
+
+       p = a;
+       q = b + (NE - 1); /* point to output exponent */
+       /* combine sign and exponent */
+       i = *p++;
+       if (i)
+               *q-- = *p++ | 0x8000;
+       else
+               *q-- = *p++;
+#ifdef INFINITY
+       if (*(p - 1) == 0x7fff)
+       {
+#ifdef NANS
+               if (__eiisnan(a))
+               {
+                       __enan_NBITS(b);
+                       return;
+               }
+#endif
+               __einfin(b);
+               return;
+       }
+#endif
+       /* skip over guard word */
+       ++p;
+       /* move the significand */
+       for (i = 0; i < NE - 1; i++)
+               *q-- = *p++;
+}
+
+
+#if USE_LDTOA
+
+void __eiremain(short unsigned int *den, short unsigned int *num,
+        short unsigned int *equot )
+{
+       long ld, ln;
+       unsigned short j;
+
+       ld = den[E];
+       ld -= __enormlz(den);
+       ln = num[E];
+       ln -= __enormlz(num);
+       __ecleaz(equot);
+       while (ln >= ld)
+       {
+               if(__ecmpm(den,num) <= 0)
+               {
+                       __esubm(den, num);
+                       j = 1;
+               }
+               else
+               {
+                       j = 0;
+               }
+               __eshup1(equot);
+               equot[NI - 1] |= j;
+               __eshup1(num);
+               ln -= 1;
+       }
+       __emdnorm( num, 0, 0, ln, 0, NBITS );
+}
+
+
+void __eadd1(const short unsigned int *  __restrict__ a,
+                 const short unsigned int *  __restrict__ b,
+                 short unsigned int *  __restrict__ c,
+                 int subflg)
+{
+       unsigned short ai[NI], bi[NI], ci[NI];
+       int i, lost, j, k;
+       long lt, lta, ltb;
+
+#ifdef INFINITY
+       if (__eisinf(a))
+       {
+               __emov(a, c);
+               if( subflg )
+                       __eneg(c);
+               return;
+       }
+       if (__eisinf(b))
+       {
+               __emov(b, c);
+               return;
+       }
+#endif
+       __emovi(a, ai);
+       __emovi(b, bi);
+       if (sub)
+               ai[0] = ~ai[0];
+
+       /* compare exponents */
+       lta = ai[E];
+       ltb = bi[E];
+       lt = lta - ltb;
+       if (lt > 0L)
+       {       /* put the larger number in bi */
+               __emovz(bi, ci);
+               __emovz(ai, bi);
+               __emovz(ci, ai);
+               ltb = bi[E];
+               lt = -lt;
+       }
+       lost = 0;
+       if (lt != 0L)
+       {
+               if (lt < (long)(-NBITS - 1))
+                       goto done;      /* answer same as larger addend */
+               k = (int)lt;
+               lost = __eshift(ai, k); /* shift the smaller number down */
+       }
+       else
+       {
+               /* exponents were the same, so must compare significands */
+               i = __ecmpm(ai, bi);
+               if (i == 0)
+               { /* the numbers are identical in magnitude */
+                       /* if different signs, result is zero */
+                       if (ai[0] != bi[0])
+                       {
+                               __eclear(c);
+                               return;
+                       }
+                       /* if same sign, result is double */
+                       /* double denomalized tiny number */
+                       if ((bi[E] == 0) && ((bi[3] & 0x8000) == 0))
+                       {
+                               __eshup1( bi );
+                               goto done;
+                       }
+                       /* add 1 to exponent unless both are zero! */
+                       for (j = 1; j < NI - 1; j++)
+                       {
+                               if (bi[j] != 0)
+                               {
+                               /* This could overflow, but let emovo take care of that. */
+                                       ltb += 1;
+                                       break;
+                               }
+                       }
+                       bi[E] = (unsigned short )ltb;
+                       goto done;
+               }
+               if (i > 0)
+               {       /* put the larger number in bi */
+                       __emovz(bi, ci);
+                       __emovz(ai, bi);
+                       __emovz(ci, ai);
+               }
+       }
+       if (ai[0] == bi[0])
+       {
+               __eaddm(ai, bi);
+               subflg = 0;
+       }
+       else
+       {
+               __esubm(ai, bi);
+               subflg = 1;
+       }
+       __emdnorm(bi, lost, subflg, ltb, 64, NBITS);
+
+done:
+       __emovo(bi, c);
+}
+
+
+/* y = largest integer not greater than x
+ * (truncated toward minus infinity)
+ *
+ * unsigned short x[NE], y[NE]
+ *
+ * efloor( x, y );
+ */
+
+
+void __efloor(short unsigned int *x, short unsigned int *y)
+{
+       register unsigned short *p;
+       int e, expon, i;
+       unsigned short f[NE];
+       const unsigned short bmask[] = {
+                               0xffff,
+                               0xfffe,
+                               0xfffc,
+                               0xfff8,
+                               0xfff0,
+                               0xffe0,
+                               0xffc0,
+                               0xff80,
+                               0xff00,
+                               0xfe00,
+                               0xfc00,
+                               0xf800,
+                               0xf000,
+                               0xe000,
+                               0xc000,
+                               0x8000,
+                               0x0000,
+       };
+
+       __emov(x, f); /* leave in external format */
+       expon = (int) f[NE - 1];
+       e = (expon & 0x7fff) - (EXONE - 1);
+       if (e <= 0)
+       {
+               __eclear(y);
+               goto isitneg;
+       }
+       /* number of bits to clear out */
+       e = NBITS - e;
+       __emov(f, y);
+       if (e <= 0)
+               return;
+
+       p = &y[0];
+       while (e >= 16)
+       {
+               *p++ = 0;
+               e -= 16;
+       }
+       /* clear the remaining bits */
+       *p &= bmask[e];
+       /* truncate negatives toward minus infinity */
+isitneg:
+
+       if ((unsigned short)expon & (unsigned short)0x8000)
+       {
+               for (i = 0; i < NE - 1; i++)
+               {
+                       if (f[i] != y[i])
+                       {
+                               __esub( __eone, y, y );
+                               break;
+                       }
+               }
+       }
+}
+
+/*
+;      Subtract external format numbers.
+;
+;      unsigned short a[NE], b[NE], c[NE];
+;      esub( a, b, c );         c = b - a
+*/
+
+void __esub(const short unsigned int *  a,
+                const short unsigned int *  b,
+                short unsigned int *  c)
+{
+#ifdef NANS
+       if (__eisnan(a))
+       {
+               __emov (a, c);
+               return;
+       }
+       if ( __eisnan(b))
+       {
+               __emov(b, c);
+               return;
+       }
+       /* Infinity minus infinity is a NaN.
+        * Test for subtracting infinities of the same sign.
+        */
+       if (__eisinf(a) && __eisinf(b) && ((__eisneg (a) ^ __eisneg (b)) == 0))
+       {
+               mtherr("esub", DOMAIN);
+               __enan_NBITS( c );
+               return;
+       }
+#endif
+       __eadd1(a, b, c, 1);
+}
+
+
+/*
+;      Divide.
+;
+;      unsigned short a[NI], b[NI], c[NI];
+;      ediv( a, b, c );        c = b / a
+*/
+
+void __ediv(const short unsigned int *a,
+                const short unsigned int *b,
+                short unsigned int *c)
+{
+       unsigned short ai[NI], bi[NI];
+       int i;
+       long lt, lta, ltb;
+
+#ifdef NANS
+       /* Return any NaN input. */
+       if (__eisnan(a))
+       {
+               __emov(a, c);
+               return;
+       }
+       if (__eisnan(b))
+       {
+               __emov(b, c);
+               return;
+       }
+       /* Zero over zero, or infinity over infinity, is a NaN. */
+       if ((__eiszero(a) && __eiszero(b))
+        || (__eisinf (a) && __eisinf (b)))
+       {
+               mtherr("ediv", DOMAIN);
+               __enan_NBITS( c );
+               return;
+       }
+#endif
+/* Infinity over anything else is infinity. */
+#ifdef INFINITY
+       if (__eisinf(b))
+       {
+               if (__eisneg(a) ^ __eisneg(b))
+                       *(c + (NE - 1)) = 0x8000;
+               else
+                       *(c + (NE - 1)) = 0;
+               __einfin(c);
+               return;
+       }
+       if (__eisinf(a))
+       {
+               __eclear(c);
+               return;
+       }
+#endif
+       __emovi(a, ai);
+       __emovi(b, bi);
+       lta = ai[E];
+       ltb = bi[E];
+       if (bi[E] == 0)
+       { /* See if numerator is zero. */
+               for (i = 1; i < NI - 1; i++)
+               {
+                       if (bi[i] != 0)
+                       {
+                               ltb -= __enormlz(bi);
+                               goto dnzro1;
+                       }
+               }
+               __eclear(c);
+               return;
+       }
+dnzro1:
+
+       if (ai[E] == 0)
+       {       /* possible divide by zero */
+               for (i = 1; i < NI - 1; i++)
+               {
+                       if (ai[i] != 0)
+                       {
+                               lta -= __enormlz(ai);
+                               goto dnzro2;
+                       }
+               }
+               if (ai[0] == bi[0])
+                       *(c + (NE - 1)) = 0;
+               else
+                       *(c + (NE - 1)) = 0x8000;
+               __einfin(c);
+               mtherr("ediv", SING);
+               return;
+       }
+dnzro2:
+
+       i = __edivm(ai, bi);
+       /* calculate exponent */
+       lt = ltb - lta + EXONE;
+       __emdnorm(bi, i, 0, lt, 64, NBITS);
+       /* set the sign */
+       if (ai[0] == bi[0])
+               bi[0] = 0;
+       else
+               bi[0] = 0Xffff;
+       __emovo(bi, c);
+}
+
+void __e64toe(short unsigned int *pe, short unsigned int *y)
+{
+       unsigned short yy[NI];
+       unsigned short *p, *q, *e;
+       int i;
+
+       e = pe;
+       p = yy;
+       for (i = 0; i < NE - 5; i++)
+               *p++ = 0;
+#ifdef IBMPC
+       for (i = 0; i < 5; i++)
+               *p++ = *e++;
+#endif
+#ifdef DEC
+       for (i = 0; i < 5; i++)
+               *p++ = *e++;
+#endif
+#ifdef MIEEE
+       p = &yy[0] + (NE - 1);
+       *p-- = *e++;
+       ++e;
+       for (i = 0; i < 4; i++)
+               *p-- = *e++;
+#endif
+
+#ifdef IBMPC
+       /* For Intel long double, shift denormal significand up 1
+          -- but only if the top significand bit is zero.  */
+       if ((yy[NE - 1] & 0x7fff) == 0 && (yy[NE - 2] & 0x8000) == 0)
+       {
+               unsigned short temp[NI + 1];
+               __emovi(yy, temp);
+               __eshup1(temp);
+               __emovo(temp,y);
+               return;
+       }
+#endif
+#ifdef INFINITY
+       /* Point to the exponent field.  */
+       p = &yy[NE - 1];
+       if (*p == 0x7fff)
+       {
+#ifdef NANS
+#ifdef IBMPC
+               for (i = 0; i < 4; i++)
+               {
+                       if ((i != 3 && pe[i] != 0)
+                         /* Check for Intel long double infinity pattern.  */
+                         || (i == 3 && pe[i] != 0x8000))
+                       {
+                               __enan_NBITS(y);
+                               return;
+                       }
+               }
+#else
+               for (i = 1; i <= 4; i++)
+               {
+                       if (pe[i] != 0)
+                       {
+                               __enan_NBITS(y);
+                               return;
+                       }
+               }
+#endif
+#endif /* NANS */
+               __eclear(y);
+               __einfin(y);
+               if (*p & 0x8000)
+                       __eneg(y);
+               return;
+       }
+#endif
+       p = yy;
+       q = y;
+       for (i = 0; i < NE; i++)
+               *q++ = *p++;
+}
+
+#endif /* USE_LDTOA */ 
diff --git a/winsup/cygwin/math/cephes_emath.h b/winsup/cygwin/math/cephes_emath.h
new file mode 100644 (file)
index 0000000..b92d710
--- /dev/null
@@ -0,0 +1,719 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _CEPHES_EMATH_H
+#define _CEPHES_EMATH_H
+
+/**
+ * This is a workaround for a gcc bug
+ */
+#define __restrict__
+
+/* This file is extracted from S L Moshier's  ioldoubl.c,
+ * modified for use in MinGW 
+ *
+ * Extended precision arithmetic functions for long double I/O.
+ * This program has been placed in the public domain.
+ */
+
+
+/*
+ * Revision history:
+ *
+ *  5 Jan 84   PDP-11 assembly language version
+ *  6 Dec 86   C language version
+ * 30 Aug 88   100 digit version, improved rounding
+ * 15 May 92    80-bit long double support
+ *
+ * Author:  S. L. Moshier.
+ *
+ * 6 Oct 02    Modified for MinGW by inlining utility routines,
+ *             removing global variables, and splitting out strtold
+ *             from _IO_ldtoa and _IO_ldtostr.
+ *  
+ *             Danny Smith <dannysmith@users.sourceforge.net>
+ * 
+ */
+
+
+/*                                                     ieee.c
+ *
+ *    Extended precision IEEE binary floating point arithmetic routines
+ *
+ * Numbers are stored in C language as arrays of 16-bit unsigned
+ * short integers.  The arguments of the routines are pointers to
+ * the arrays.
+ *
+ *
+ * External e type data structure, simulates Intel 8087 chip
+ * temporary real format but possibly with a larger significand:
+ *
+ *     NE-1 significand words  (least significant word first,
+ *                              most significant bit is normally set)
+ *     exponent                (value = EXONE for 1.0,
+ *                             top bit is the sign)
+ *
+ *
+ * Internal data structure of a number (a "word" is 16 bits):
+ *
+ * ei[0]       sign word       (0 for positive, 0xffff for negative)
+ * ei[1]       biased __exponent       (value = EXONE for the number 1.0)
+ * ei[2]       high guard word (always zero after normalization)
+ * ei[3]
+ * to ei[NI-2] significand     (NI-4 significand words,
+ *                              most significant word first,
+ *                              most significant bit is set)
+ * ei[NI-1]    low guard word  (0x8000 bit is rounding place)
+ *
+ *
+ *
+ *             Routines for external format numbers
+ *
+ *     __asctoe64( string, &d )        ASCII string to long double
+ *     __asctoeg( string, e, prec )    ASCII string to specified precision
+ *     __e64toe( &d, e )               IEEE long double precision to e type
+ *     __eadd( a, b, c )               c = b + a
+ *     __eclear(e)                     e = 0
+ *     __ecmp (a, b)                   Returns 1 if a > b, 0 if a == b,
+ *                                     -1 if a < b, -2 if either a or b is a NaN.
+ *     __ediv( a, b, c )               c = b / a
+ *     __efloor( a, b )                truncate to integer, toward -infinity
+ *     __efrexp( a, exp, s )           extract exponent and significand
+ *     __eifrac( e, &l, frac )         e to long integer and e type fraction
+ *     __euifrac( e, &l, frac )        e to unsigned long integer and e type fraction
+ *     __einfin( e )                   set e to infinity, leaving its sign alone
+ *     __eldexp( a, n, b )             multiply by 2**n
+ *     __emov( a, b )                  b = a
+ *     __emul( a, b, c )               c = b * a
+ *     __eneg(e)                       e = -e
+ *     __eround( a, b )                b = nearest integer value to a
+ *     __esub( a, b, c )               c = b - a
+ *     __e24toasc( &f, str, n )        single to ASCII string, n digits after decimal
+ *     __e53toasc( &d, str, n )        double to ASCII string, n digits after decimal
+ *     __e64toasc( &d, str, n )        long double to ASCII string
+ *     __etoasc( e, str, n )           e to ASCII string, n digits after decimal
+ *     __etoe24( e, &f )               convert e type to IEEE single precision
+ *     __etoe53( e, &d )               convert e type to IEEE double precision
+ *     __etoe64( e, &d )               convert e type to IEEE long double precision
+ *     __eisneg( e )                   1 if sign bit of e != 0, else 0
+ *     __eisinf( e )                   1 if e has maximum exponent (non-IEEE)
+ *                                     or is infinite (IEEE)
+ *     __eisnan( e )                   1 if e is a NaN
+ *     __esqrt( a, b )                 b = square root of a
+ *
+ *
+ *             Routines for internal format numbers
+ *
+ *     __eaddm( ai, bi )               add significands, bi = bi + ai
+ *     __ecleaz(ei)            ei = 0
+ *     __ecleazs(ei)           set ei = 0 but leave its sign alone
+ *     __ecmpm( ai, bi )               compare significands, return 1, 0, or -1
+ *     __edivm( ai, bi )               divide  significands, bi = bi / ai
+ *     __emdnorm(ai,l,s,exp)   normalize and round off
+ *     __emovi( a, ai )                convert external a to internal ai
+ *     __emovo( ai, a )                convert internal ai to external a
+ *     __emovz( ai, bi )               bi = ai, low guard word of bi = 0
+ *     __emulm( ai, bi )               multiply significands, bi = bi * ai
+ *     __enormlz(ei)           left-justify the significand
+ *     __eshdn1( ai )          shift significand and guards down 1 bit
+ *     __eshdn8( ai )          shift down 8 bits
+ *     __eshdn6( ai )          shift down 16 bits
+ *     __eshift( ai, n )               shift ai n bits up (or down if n < 0)
+ *     __eshup1( ai )          shift significand and guards up 1 bit
+ *     __eshup8( ai )          shift up 8 bits
+ *     __eshup6( ai )          shift up 16 bits
+ *     __esubm( ai, bi )               subtract significands, bi = bi - ai
+ *
+ *
+ * The result is always normalized and rounded to NI-4 word precision
+ * after each arithmetic operation.
+ *
+ * Exception flags are NOT fully supported.
+ *
+ * Define INFINITY in mconf.h for support of infinity; otherwise a
+ * saturation arithmetic is implemented.
+ *
+ * Define NANS for support of Not-a-Number items; otherwise the
+ * arithmetic will never produce a NaN output, and might be confused
+ * by a NaN input.
+ * If NaN's are supported, the output of ecmp(a,b) is -2 if
+ * either a or b is a NaN. This means asking if(ecmp(a,b) < 0)
+ * may not be legitimate. Use if(ecmp(a,b) == -1) for less-than
+ * if in doubt.
+ * Signaling NaN's are NOT supported; they are treated the same
+ * as quiet NaN's.
+ *
+ * Denormals are always supported here where appropriate (e.g., not
+ * for conversion to DEC numbers).
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <math.h>
+#include <locale.h>
+#include <ctype.h>
+
+#undef alloca
+#define alloca __builtin_alloca
+
+/* Don't build non-ANSI _IO_ldtoa.  It is not thread safe. */ 
+#ifndef USE_LDTOA
+#define USE_LDTOA 0
+#endif
+
+
+ /* Number of 16 bit words in external x type format */
+#define NE 6
+
+ /* Number of 16 bit words in internal format */
+#define NI (NE+3)
+
+ /* Array offset to exponent */
+#define E 1
+
+ /* Array offset to high guard word */
+#define M 2
+
+ /* Number of bits of precision */
+#define NBITS ((NI-4)*16)
+
+ /* Maximum number of decimal digits in ASCII conversion
+  * = NBITS*log10(2)
+  */
+#define NDEC (NBITS*8/27)
+
+ /* The exponent of 1.0 */
+#define EXONE (0x3fff)
+
+
+#define  mtherr(x,y)
+
+
+extern long double strtold (const char * __restrict__ s, char ** __restrict__ se);
+extern int __asctoe64(const char * __restrict__ ss,
+                     short unsigned int * __restrict__ y);
+extern void __emul(const short unsigned int *  a,
+                  const short unsigned int *  b,
+                  short unsigned int * c);
+extern int __ecmp(const short unsigned int * __restrict__ a,
+                 const short unsigned int *  __restrict__ b);
+extern int __enormlz(short unsigned int *x);
+extern int __eshift(short unsigned int *x, int sc);
+extern void __eaddm(const short unsigned int  *  __restrict__  x,
+                   short unsigned int *  __restrict__  y);
+extern void __esubm(const short unsigned int * __restrict__  x,
+                   short unsigned int *  __restrict__ y);
+extern void __emdnorm(short unsigned int *s, int lost, int subflg,
+                     int exp, int rcntrl, const int rndprc);
+extern void __toe64(short unsigned int *  __restrict__  a,
+                   short unsigned int *  __restrict__  b);
+extern int __edivm(short unsigned int *  __restrict__  den,
+                  short unsigned int * __restrict__  num);
+extern int __emulm(const short unsigned int *  __restrict__ a,
+                  short unsigned int *  __restrict__ b);
+extern void __emovi(const short unsigned int * __restrict__ a,
+                   short unsigned int * __restrict__ b);
+extern void __emovo(const short unsigned int * __restrict__ a,
+                   short unsigned int * __restrict__ b);
+
+#if USE_LDTOA
+
+extern char * _IO_ldtoa(long double, int, int, int *, int *, char **);
+extern void _IO_ldtostr(long double *x, char *string, int ndigs,
+                       int flags, char fmt);
+
+extern void __eiremain(short unsigned int * __restrict__ den,
+                      short unsigned int *__restrict__ num,
+                      short unsigned int *__restrict__ equot);
+extern void __efloor(short unsigned int *x, short unsigned int *y);
+extern void __eadd1(const short unsigned int * __restrict__ a,
+                   const short unsigned int * __restrict__ b,
+                   short unsigned int * __restrict__ c,
+                   int subflg);
+extern void __esub(const short unsigned int *a, const short unsigned int *b,
+                  short unsigned int *c);
+extern void __ediv(const short unsigned int *a, const short unsigned int *b,
+                  short unsigned int *c);
+extern void __e64toe(short unsigned int *pe, short unsigned int *y);
+
+
+#endif
+
+static  __inline__ int __eisneg(const short unsigned int *x);
+static  __inline__ int __eisinf(const short unsigned int *x);
+static __inline__ int __eisnan(const short unsigned int *x);
+static __inline__ int __eiszero(const short unsigned int *a);
+static __inline__ void __emovz(register const short unsigned int * __restrict__ a,
+                              register short unsigned int * __restrict__ b);
+static __inline__ void __eclear(register short unsigned int *x);
+static __inline__ void __ecleaz(register short unsigned int *xi);
+static __inline__ void __ecleazs(register short unsigned int *xi);
+static  __inline__ int __eiisinf(const short unsigned int *x);
+static __inline__ int __eiisnan(const short unsigned int *x);
+static __inline__ int __eiiszero(const short unsigned int *x);
+static __inline__ void __enan_64(short unsigned int *nanptr);
+static __inline__ void __enan_NBITS (short unsigned int *nanptr);
+static __inline__ void __enan_NI16 (short unsigned int *nanptr);
+static __inline__ void __einfin(register short unsigned int *x);
+static __inline__ void __eneg(short unsigned int *x);
+static __inline__ void __eshup1(register short unsigned int *x);
+static __inline__ void __eshup8(register short unsigned int *x);
+static __inline__ void __eshup6(register short unsigned int *x);
+static __inline__ void __eshdn1(register short unsigned int *x);
+static __inline__ void __eshdn8(register short unsigned int *x);
+static __inline__ void __eshdn6(register short unsigned int *x);
+
+
+
+/* Intel IEEE, low order words come first:
+ */
+#define IBMPC 1
+
+/* Define 1 for ANSI C atan2() function
+ * See atan.c and clog.c.
+ */
+#define ANSIC 1
+
+/*define VOLATILE volatile*/
+#define VOLATILE
+
+/* For 12-byte long doubles on an i386, pad a 16-bit short 0
+ * to the end of real constants initialized by integer arrays.
+ *
+ * #define XPD 0,
+ *
+ * Otherwise, the type is 10 bytes long and XPD should be
+ * defined blank.
+ *
+ * #define XPD
+ */
+#define XPD 0,
+/* #define XPD */
+#define NANS
+
+/* NaN's require infinity support. */
+#ifdef NANS
+#ifndef INFINITY
+#define INFINITY
+#endif
+#endif
+
+/* This handles 64-bit long ints. */
+#define LONGBITS (8 * sizeof(long))
+
+
+#define NTEN 12
+#define MAXP 4096
+
+/*
+; Clear out entire external format number.
+;
+; unsigned short x[];
+; eclear( x );
+*/
+
+static __inline__ void __eclear(register short unsigned int *x)
+{
+       memset(x, 0, NE * sizeof(unsigned short));
+}
+
+
+/* Move external format number from a to b.
+ *
+ * emov( a, b );
+ */
+
+static __inline__ void __emov(register const short unsigned int * __restrict__ a,
+                             register short unsigned int * __restrict__ b)
+{
+       memcpy(b, a, NE * sizeof(unsigned short));
+}
+
+
+/*
+;      Negate external format number
+;
+;      unsigned short x[NE];
+;      eneg( x );
+*/
+
+static __inline__ void __eneg(short unsigned int *x)
+{
+#ifdef NANS
+       if (__eisnan(x))
+               return;
+#endif
+       x[NE-1] ^= 0x8000; /* Toggle the sign bit */
+}
+
+
+/* Return 1 if external format number is negative,
+ * else return zero.
+ */
+static __inline__ int __eisneg(const short unsigned int *x)
+{
+#ifdef NANS
+       if (__eisnan(x))
+               return (0);
+#endif
+       if (x[NE-1] & 0x8000)
+               return (1);
+       else
+               return (0);
+}
+
+
+/* Return 1 if external format number has maximum possible exponent,
+ * else return zero.
+ */
+static __inline__ int __eisinf(const short unsigned int *x)
+{
+       if ((x[NE - 1] & 0x7fff) == 0x7fff)
+       {
+#ifdef NANS
+               if (__eisnan(x))
+                       return (0);
+#endif
+               return (1);
+       }
+       else
+               return (0);
+}
+
+/* Check if e-type number is not a number.
+ */
+static __inline__ int __eisnan(const short unsigned int *x)
+{
+#ifdef NANS
+       int i;
+       /* NaN has maximum __exponent */
+       if ((x[NE - 1] & 0x7fff) == 0x7fff)
+               /* ... and non-zero significand field. */
+               for (i = 0; i < NE - 1; i++)
+               {
+                       if (*x++ != 0)
+                               return (1);
+               }
+#endif
+       return (0);
+}
+
+/*
+; Fill __entire number, including __exponent and significand, with
+; largest possible number.  These programs implement a saturation
+; value that is an ordinary, legal number.  A special value
+; "infinity" may also be implemented; this would require tests
+; for that value and implementation of special rules for arithmetic
+; operations involving inifinity.
+*/
+
+static __inline__ void __einfin(register short unsigned int *x)
+{
+       register int i;
+#ifdef INFINITY
+       for (i = 0; i < NE - 1; i++)
+               *x++ = 0;
+       *x |= 32767;
+#else
+       for (i = 0; i < NE - 1; i++)
+               *x++ = 0xffff;
+       *x |= 32766;
+       *(x - 5) = 0;
+#endif
+}
+
+/* Clear out internal format number.
+ */
+
+static __inline__ void __ecleaz(register short unsigned int *xi)
+{
+       memset(xi, 0, NI * sizeof(unsigned short));
+}
+
+/* same, but don't touch the sign. */
+
+static __inline__ void __ecleazs(register short unsigned int *xi)
+{
+       ++xi;
+       memset(xi, 0, (NI-1) * sizeof(unsigned short));
+}
+
+/* Move internal format number from a to b.
+ */
+static __inline__ void __emovz(register const short unsigned int * __restrict__ a,
+                              register short unsigned int * __restrict__ b)
+{
+       memcpy(b, a, (NI-1) * sizeof(unsigned short));
+       b[NI - 1] = 0;
+}
+
+/* Return nonzero if internal format number is a NaN.
+ */
+
+static __inline__ int __eiisnan (const short unsigned int *x)
+{
+       int i;
+
+       if ((x[E] & 0x7fff) == 0x7fff)
+       {
+               for (i = M + 1; i < NI; i++ )
+               {
+                       if (x[i] != 0)
+                               return (1);
+               }
+       }
+       return (0);
+}
+
+/* Return nonzero if external format number is zero. */
+
+static __inline__ int
+__eiszero(const short unsigned int * a)
+{
+  union {
+    long double ld;
+    unsigned short sh[8];
+  } av;
+  av.ld = 0.0;
+  memcpy (av.sh, a, 12);
+  if (av.ld == 0.0)
+    return (1);
+  return (0);
+}
+
+/* Return nonzero if internal format number is zero. */
+
+static __inline__ int
+__eiiszero(const short unsigned int * ai)
+{
+       int i;
+       /* skip the sign word */
+       for (i = 1; i < NI - 1; i++ )
+       {
+               if (ai[i] != 0)
+                       return (0);
+       }
+       return (1);
+}
+
+
+/* Return nonzero if internal format number is infinite. */
+
+static __inline__ int 
+__eiisinf (const unsigned short *x)
+{
+#ifdef NANS
+       if (__eiisnan (x))
+               return (0);
+#endif
+       if ((x[E] & 0x7fff) == 0x7fff)
+               return (1);
+       return (0);
+}
+
+/*
+;      Compare significands of numbers in internal format.
+;      Guard words are included in the comparison.
+;
+;      unsigned short a[NI], b[NI];
+;      cmpm( a, b );
+;
+;      for the significands:
+;      returns +1 if a > b
+;               0 if a == b
+;              -1 if a < b
+*/
+static __inline__ int __ecmpm(register const short unsigned int * __restrict__ a,
+                             register const short unsigned int * __restrict__ b)
+{
+       int i;
+
+       a += M; /* skip up to significand area */
+       b += M;
+       for (i = M; i < NI; i++)
+       {
+               if( *a++ != *b++ )
+               goto difrnt;
+       }
+       return(0);
+
+  difrnt:
+       if ( *(--a) > *(--b) )
+               return (1);
+       else
+               return (-1);
+}
+
+
+/*
+;      Shift significand down by 1 bit
+*/
+
+static __inline__ void __eshdn1(register short unsigned int *x)
+{
+       register unsigned short bits;
+       int i;
+
+       x += M; /* point to significand area */
+
+       bits = 0;
+       for (i = M; i < NI; i++ )
+       {
+               if (*x & 1)
+                       bits |= 1;
+               *x >>= 1;
+               if (bits & 2)
+                       *x |= 0x8000;
+               bits <<= 1;
+               ++x;
+       }
+}
+
+/*
+;      Shift significand up by 1 bit
+*/
+
+static __inline__ void __eshup1(register short unsigned int *x)
+{
+       register unsigned short bits;
+       int i;
+
+       x += NI-1;
+       bits = 0;
+
+       for (i = M; i < NI; i++)
+       {
+               if (*x & 0x8000)
+                       bits |= 1;
+               *x <<= 1;
+               if (bits & 2)
+                       *x |= 1;
+               bits <<= 1;
+               --x;
+       }
+}
+
+
+/*
+;      Shift significand down by 8 bits
+*/
+
+static __inline__ void __eshdn8(register short unsigned int *x)
+{
+       register unsigned short newbyt, oldbyt;
+       int i;
+
+       x += M;
+       oldbyt = 0;
+       for (i = M; i < NI; i++)
+       {
+               newbyt = *x << 8;
+               *x >>= 8;
+               *x |= oldbyt;
+               oldbyt = newbyt;
+               ++x;
+       }
+}
+
+/*
+;      Shift significand up by 8 bits
+*/
+
+static __inline__ void __eshup8(register short unsigned int *x)
+{
+       int i;
+       register unsigned short newbyt, oldbyt;
+
+       x += NI - 1;
+       oldbyt = 0;
+
+       for (i = M; i < NI; i++)
+       {
+               newbyt = *x >> 8;
+               *x <<= 8;
+               *x |= oldbyt;
+               oldbyt = newbyt;
+               --x;
+       }
+}
+
+/*
+;      Shift significand up by 16 bits
+*/
+
+static __inline__ void __eshup6(register short unsigned int *x)
+{
+       int i;
+       register unsigned short *p;
+
+       p = x + M;
+       x += M + 1;
+
+       for (i = M; i < NI - 1; i++)
+               *p++ = *x++;
+
+       *p = 0;
+}
+
+/*
+;      Shift significand down by 16 bits
+*/
+
+static __inline__ void __eshdn6(register short unsigned int *x)
+{
+       int i;
+       register unsigned short *p;
+
+       x += NI - 1;
+       p = x + 1;
+
+       for (i = M; i < NI - 1; i++)
+               *(--p) = *(--x);
+
+       *(--p) = 0;
+}
+
+/*
+;      Add significands
+;      x + y replaces y
+*/
+
+static __inline__ void __enan_64(unsigned short* nanptr)
+{
+       int i;
+       for (i = 0; i < 3; i++)
+               *nanptr++ = 0;
+       *nanptr++ = 0xc000;
+       *nanptr++ = 0x7fff;
+       *nanptr = 0;
+       return;
+}
+
+static __inline__ void __enan_NBITS(unsigned short* nanptr)
+{
+       int i;
+       for (i = 0; i < NE - 2; i++)
+               *nanptr++ = 0;
+       *nanptr++ = 0xc000;
+       *nanptr = 0x7fff;
+       return;
+}
+
+static __inline__ void __enan_NI16(unsigned short* nanptr)
+{
+       int i;
+       *nanptr++ = 0;
+       *nanptr++ = 0x7fff;
+       *nanptr++ = 0;
+       *nanptr++ = 0xc000;
+       for (i = 4; i < NI; i++)
+               *nanptr++ = 0;
+       return;
+}
+
+#endif /* _CEPHES_EMATH_H */
+
diff --git a/winsup/cygwin/math/cephes_mconf.h b/winsup/cygwin/math/cephes_mconf.h
new file mode 100644 (file)
index 0000000..832fae0
--- /dev/null
@@ -0,0 +1,417 @@
+#include <math.h>
+#include <errno.h>
+
+
+#define IBMPC 1
+#define ANSIPROT 1
+#define MINUSZERO 1
+#define INFINITIES 1
+#define NANS 1
+#define DENORMAL 1
+#define VOLATILE
+#define mtherr(fname, code)
+#define XPD 0,
+#ifdef __x86_64__
+#define XPD_SHORT 0, 0,
+#define XPD_LONG 0,
+#else
+#define XPD_SHORT
+#define XPD_LONG
+#endif
+
+#if UNK
+typedef union uLD { long double ld; unsigned short sh[8]; long lo[4]; } uLD;
+typedef union uD { double d; unsigned short sh[4]; } uD;
+#elif IBMPC
+typedef union uLD { unsigned short sh[8]; long double ld; long lo[4]; } uLD;
+typedef union uD { unsigned short sh[4]; double d; } uD;
+#elif MIEEE
+typedef union uLD { long lo[4]; long double ld; unsigned short sh[8]; } uLD;
+typedef union uD { unsigned short sh[4]; double d; } uD;
+#else
+#error Unknown uLD/uD type definition
+#endif
+
+#define _CEPHES_USE_ERRNO
+
+#ifdef _CEPHES_USE_ERRNO
+#define _SET_ERRNO(x) errno = (x)
+#else
+#define _SET_ERRNO(x)
+#endif
+
+/* constants used by cephes functions */
+
+/* double */
+#define MAXNUM 1.7976931348623158E308
+#define MAXLOG 7.09782712893383996843E2
+#define MINLOG -7.08396418532264106224E2
+#define LOGE2  6.93147180559945309417E-1
+#define LOG2E  1.44269504088896340736
+#define PI     3.14159265358979323846
+#define PIO2   1.57079632679489661923
+#define PIO4   7.85398163397448309616E-1
+
+#define NEGZERO (-0.0)
+#undef NAN
+#undef INFINITY
+#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2))
+#define INFINITY __builtin_huge_val()
+#define NAN __builtin_nan("")
+#else
+extern double __INF;
+#define INFINITY (__INF)
+extern double __QNAN;
+#define NAN (__QNAN)
+#endif
+
+/*long double*/
+#if defined(__arm__) || defined(_ARM_)
+#define MAXNUML        1.7976931348623158E308
+#define MAXLOGL        7.09782712893383996843E2
+#define MINLOGL        -7.08396418532264106224E2
+#define LOGE2L 6.93147180559945309417E-1
+#define LOG2EL 1.44269504088896340736
+#define PIL    3.14159265358979323846
+#define PIO2L  1.57079632679489661923
+#define PIO4L  7.85398163397448309616E-1
+#else
+#define MAXNUML 1.189731495357231765021263853E4932L
+#define MAXLOGL        1.1356523406294143949492E4L
+#define MINLOGL        -1.13994985314888605586758E4L
+#define LOGE2L 6.9314718055994530941723E-1L
+#define LOG2EL 1.4426950408889634073599E0L
+#define PIL    3.1415926535897932384626L
+#define PIO2L  1.5707963267948966192313L
+#define PIO4L  7.8539816339744830961566E-1L
+#endif /* defined(__arm__) || defined(_ARM_) */
+
+#define isfinitel isfinite
+#define isinfl isinf
+#define isnanl isnan
+#define signbitl signbit
+
+#define NEGZEROL (-0.0L)
+
+#undef NANL
+#undef INFINITYL
+#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2))
+#define INFINITYL __builtin_huge_vall()
+#define NANL __builtin_nanl("")
+#else
+extern long double __INFL;
+#define INFINITYL (__INFL)
+extern long double __QNANL;
+#define NANL (__QNANL)
+#endif
+
+/* float */
+
+#define MAXNUMF        3.4028234663852885981170418348451692544e38F
+#define MAXLOGF        88.72283905206835F
+#define MINLOGF        -103.278929903431851103F /* log(2^-149) */
+#define LOG2EF 1.44269504088896341F
+#define LOGE2F 0.693147180559945309F
+#define PIF    3.141592653589793238F
+#define PIO2F  1.5707963267948966192F
+#define PIO4F  0.7853981633974483096F
+
+#define isfinitef isfinite
+#define isinff isinf
+#define isnanf isnan
+#define signbitf signbit
+
+#define NEGZEROF (-0.0F)
+
+#undef NANF
+#undef INFINITYF
+#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2))
+#define INFINITYF __builtin_huge_valf()
+#define NANF __builtin_nanf("")
+#else
+extern float __INFF;
+#define INFINITYF (__INFF)
+extern float __QNANF;
+#define NANF (__QNANF)
+#endif
+
+
+/* double */
+
+/*
+Cephes Math Library Release 2.2:  July, 1992
+Copyright 1984, 1987, 1988, 1992 by Stephen L. Moshier
+Direct inquiries to 30 Frost Street, Cambridge, MA 02140
+*/
+
+
+/*                                                     polevl.c
+ *                                                     p1evl.c
+ *
+ *     Evaluate polynomial
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * int N;
+ * double x, y, coef[N+1], polevl[];
+ *
+ * y = polevl( x, coef, N );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Evaluates polynomial of degree N:
+ *
+ *                     2          N
+ * y  =  C  + C x + C x  +...+ C x
+ *        0    1     2          N
+ *
+ * Coefficients are stored in reverse order:
+ *
+ * coef[0] = C  , ..., coef[N] = C  .
+ *            N                   0
+ *
+ *  The function p1evl() assumes that coef[N] = 1.0 and is
+ * omitted from the array.  Its calling arguments are
+ * otherwise the same as polevl().
+ *
+ *
+ * SPEED:
+ *
+ * In the interest of speed, there are no checks for out
+ * of bounds arithmetic.  This routine is used by most of
+ * the functions in the library.  Depending on available
+ * equipment features, the user may wish to rewrite the
+ * program in microcode or assembly language.
+ *
+ */
+
+/* Polynomial evaluator:
+ *  P[0] x^n  +  P[1] x^(n-1)  +  ...  +  P[n]
+ */
+static __inline__ double polevl(double x, const uD *p, int n)
+{
+       register double y;
+
+       y = p->d;
+       p++;
+       do
+       {
+               y = y * x + p->d;
+               p++;
+       }
+       while (--n);
+       return (y);
+}
+
+
+/* Polynomial evaluator:
+ *  x^n  +  P[0] x^(n-1)  +  P[1] x^(n-2)  +  ...  +  P[n]
+ */
+static __inline__  double p1evl(double x, const uD *p, int n)
+{
+       register double y;
+
+       n -= 1;
+       y = x + p->d; p++;
+       do
+       {
+               y = y * x + p->d; p++;
+       }
+       while (--n);
+       return (y);
+}
+
+
+/* long double */
+/*
+Cephes Math Library Release 2.2:  July, 1992
+Copyright 1984, 1987, 1988, 1992 by Stephen L. Moshier
+Direct inquiries to 30 Frost Street, Cambridge, MA 02140
+*/
+
+
+/*                                                     polevll.c
+ *                                                     p1evll.c
+ *
+ *     Evaluate polynomial
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * int N;
+ * long double x, y, coef[N+1], polevl[];
+ *
+ * y = polevll( x, coef, N );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Evaluates polynomial of degree N:
+ *
+ *                     2          N
+ * y  =  C  + C x + C x  +...+ C x
+ *        0    1     2          N
+ *
+ * Coefficients are stored in reverse order:
+ *
+ * coef[0] = C  , ..., coef[N] = C  .
+ *            N                   0
+ *
+ *  The function p1evll() assumes that coef[N] = 1.0 and is
+ * omitted from the array.  Its calling arguments are
+ * otherwise the same as polevll().
+ *
+ *
+ * SPEED:
+ *
+ * In the interest of speed, there are no checks for out
+ * of bounds arithmetic.  This routine is used by most of
+ * the functions in the library.  Depending on available
+ * equipment features, the user may wish to rewrite the
+ * program in microcode or assembly language.
+ *
+ */
+
+/* Polynomial evaluator:
+ *  P[0] x^n  +  P[1] x^(n-1)  +  ...  +  P[n]
+ */
+static __inline__ long double polevll(long double x, const uLD *p, int n)
+{
+       register long double y;
+
+       y = p->ld;
+       p++;
+       do
+       {
+               y = y * x + p->ld;
+               p++;
+       }
+       while (--n);
+       return y;
+}
+
+
+
+/* Polynomial evaluator:
+ *  x^n  +  P[0] x^(n-1)  +  P[1] x^(n-2)  +  ...  +  P[n]
+ */
+static __inline__ long double p1evll(long double x, const uLD *p, int n)
+{
+       register long double y;
+
+       n -= 1;
+       y = x + p->ld;
+       p++;
+
+       do
+       {
+               y = y * x + p->ld;
+               p++;
+       }
+       while (--n);
+       return (y);
+}
+
+/* Float version */
+
+/*                                                     polevlf.c
+ *                                                     p1evlf.c
+ *
+ *     Evaluate polynomial
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * int N;
+ * float x, y, coef[N+1], polevlf[];
+ *
+ * y = polevlf( x, coef, N );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Evaluates polynomial of degree N:
+ *
+ *                     2          N
+ * y  =  C  + C x + C x  +...+ C x
+ *        0    1     2          N
+ *
+ * Coefficients are stored in reverse order:
+ *
+ * coef[0] = C  , ..., coef[N] = C  .
+ *            N                   0
+ *
+ *  The function p1evl() assumes that coef[N] = 1.0 and is
+ * omitted from the array.  Its calling arguments are
+ * otherwise the same as polevl().
+ *
+ *
+ * SPEED:
+ *
+ * In the interest of speed, there are no checks for out
+ * of bounds arithmetic.  This routine is used by most of
+ * the functions in the library.  Depending on available
+ * equipment features, the user may wish to rewrite the
+ * program in microcode or assembly language.
+ *
+ */
+
+/*
+Cephes Math Library Release 2.1:  December, 1988
+Copyright 1984, 1987, 1988 by Stephen L. Moshier
+Direct inquiries to 30 Frost Street, Cambridge, MA 02140
+*/
+
+static __inline__ float polevlf(float x, const float* coef, int N)
+{
+       float ans;
+       float *p;
+       int i;
+
+       p = (float*)coef;
+       ans = *p++;
+
+       /*
+       for (i = 0; i < N; i++)
+               ans = ans * x  +  *p++;
+       */
+
+       i = N;
+       do
+               ans = ans * x  +  *p++;
+       while (--i);
+
+       return (ans);
+}
+
+/*                                                     p1evl() */
+/*                                          N
+ * Evaluate polynomial when coefficient of x  is 1.0.
+ * Otherwise same as polevl.
+ */
+
+static __inline__ float p1evlf(float x, const float *coef, int N)
+{
+       float ans;
+       float *p;
+       int i;
+
+       p = (float*)coef;
+       ans = x + *p++;
+       i = N - 1;
+
+       do
+               ans = ans * x  + *p++;
+       while (--i);
+
+       return (ans);
+}
+
diff --git a/winsup/cygwin/math/cexp.def.h b/winsup/cygwin/math/cexp.def.h
new file mode 100644 (file)
index 0000000..c0c97b7
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(cexp) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE ret;
+  __FLT_TYPE s_x, c_x, exp_val, v;
+  int r_class = fpclassify (__real__ z);
+  int i_class = fpclassify (__imag__ z);
+
+  if (r_class == FP_INFINITE)
+  {
+    if (i_class != FP_NAN && i_class != FP_INFINITE)
+    {
+      v = signbit (__real__ z) ? __FLT_CST(0.0) : __FLT_HUGE_VAL;
+
+      if (i_class == FP_ZERO)
+      {
+       __real__ ret = v;
+       __imag__ ret = __imag__ z;
+       return ret;
+      }
+
+      __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+      __real__ ret = __FLT_ABI(copysign) (v, c_x);
+      __imag__ ret = __FLT_ABI(copysign) (v, s_x);
+      return ret;
+    }
+
+    if (signbit (__real__ z) == 0)
+    {
+      __real__ ret = __FLT_HUGE_VAL;
+      __imag__ ret = __FLT_NAN;
+    }
+    else
+    {
+      __real__ ret = __FLT_CST(0.0);
+      __imag__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z);
+    }
+    return ret;
+  }
+
+  if (r_class == FP_NAN || i_class == FP_NAN || i_class == FP_INFINITE)
+  {
+    __real__ ret = __FLT_NAN;
+    if (i_class == FP_ZERO)
+      __imag__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z);
+    else
+      __imag__ ret = __FLT_NAN;
+    return ret;
+  }
+
+  exp_val = __FLT_ABI(exp) (__real__ z);
+
+  __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+  if (isfinite (exp_val))
+  {
+    __real__ ret = exp_val * c_x;
+    __imag__ ret = exp_val * s_x;
+  }
+  else
+  {
+    __real__ ret = __FLT_ABI(copysign) (exp_val, c_x);
+    __imag__ ret = __FLT_ABI(copysign) (exp_val, s_x);
+  }
+  return ret;
+}
diff --git a/winsup/cygwin/math/cexpl.c b/winsup/cygwin/math/cexpl.c
new file mode 100644 (file)
index 0000000..9c33bc0
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "cexp.def.h"
diff --git a/winsup/cygwin/math/cimag.def.h b/winsup/cygwin/math/cimag.def.h
new file mode 100644 (file)
index 0000000..0212d93
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __cdecl
+__FLT_ABI(cimag) (__FLT_TYPE __complex z)
+{
+  return __imag__ z;
+}
diff --git a/winsup/cygwin/math/cimagl.c b/winsup/cygwin/math/cimagl.c
new file mode 100644 (file)
index 0000000..94835d7
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "cimag.def.h"
diff --git a/winsup/cygwin/math/clog.def.h b/winsup/cygwin/math/clog.def.h
new file mode 100644 (file)
index 0000000..604c3f3
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(clog) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE ret;
+  int r_class = fpclassify (__real__ z);
+  int i_class = fpclassify (__imag__ z);
+
+  if (r_class == FP_ZERO && i_class == FP_ZERO)
+  {
+    __imag__ ret = signbit (__real__ z) ? __FLT_PI : __FLT_CST(0.0);
+    __imag__ ret = __FLT_ABI(copysign) (__imag__ ret, __imag__ z);
+    __real__ ret = -__FLT_CST(1.0) / __FLT_ABI(fabs) (__real__ z);
+    return ret;
+  }
+
+  if (r_class == FP_NAN || i_class == FP_NAN)
+  {
+    __imag__ ret = __FLT_NAN;
+    __real__ ret = ((r_class == FP_INFINITE || i_class == FP_INFINITE) ? __FLT_HUGE_VAL : __FLT_NAN);
+
+    return ret;
+  }
+
+  __real__ ret = __FLT_ABI(log) (__FLT_ABI(hypot) (__real__ z, __imag__ z));
+  __imag__ ret = __FLT_ABI(atan2) (__imag__ z, __real__ z);
+  return ret;
+}
diff --git a/winsup/cygwin/math/clog10.def.h b/winsup/cygwin/math/clog10.def.h
new file mode 100644 (file)
index 0000000..cdd4eb6
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(clog10) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE ret;
+  int r_class = fpclassify (__real__ z);
+  int i_class = fpclassify (__imag__ z);
+
+  if (r_class == FP_ZERO && i_class == FP_ZERO)
+  {
+    __imag__ ret = signbit (__real__ z) ? __FLT_PI : __FLT_CST(0.0);
+    __imag__ ret = __FLT_ABI(copysign) (__imag__ ret, __imag__ z);
+    __real__ ret = -__FLT_CST(1.0) / __FLT_ABI(fabs) (__real__ z);
+    return ret;
+  }
+
+  if (r_class == FP_NAN || i_class == FP_NAN)
+  {
+    __imag__ ret = __FLT_NAN;
+    __real__ ret = ((r_class == FP_INFINITE || i_class == FP_INFINITE) ? __FLT_HUGE_VAL : __FLT_NAN);
+
+    return ret;
+  }
+
+  __real__ ret = __FLT_ABI(log10) (__FLT_ABI(hypot) (__real__ z, __imag__ z));
+  __imag__ ret = __FLT_LOG10E * __FLT_ABI(atan2) (__imag__ z, __real__ z);
+  return ret;
+}
diff --git a/winsup/cygwin/math/clog10l.c b/winsup/cygwin/math/clog10l.c
new file mode 100644 (file)
index 0000000..8baa2aa
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "clog10.def.h"
diff --git a/winsup/cygwin/math/clogl.c b/winsup/cygwin/math/clogl.c
new file mode 100644 (file)
index 0000000..383fcfa
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "clog.def.h"
diff --git a/winsup/cygwin/math/complex_internal.h b/winsup/cygwin/math/complex_internal.h
new file mode 100644 (file)
index 0000000..b230b15
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#ifdef __CYGWIN__
+/* Disable __IMPORT when defining __fdlib_version. */
+#define _COMPILING_NEWLIB
+#define _GNU_SOURCE
+#endif
+#include <math.h>
+#include <complex.h>
+
+/* Define some PI constants for long double, as they are not defined in math.h  */
+#ifndef M_PI_4l
+#define M_PI_4l 0.7853981633974483096156608458198757L
+#define M_PI_2l 1.5707963267948966192313216916397514L
+#define M_PIl   3.1415926535897932384626433832795029L
+#endif
+
+/* NAN builtins for gcc, as they are not part of math.h  */
+#ifndef NANF
+#define NANF __builtin_nanf ("")
+#endif
+#ifndef NANL
+#define NANL __builtin_nanl ("")
+#endif
+
+/* Some more helpers.  */
+#define M_PI_3_4  (M_PI - M_PI_4)
+#define M_PI_3_4l (M_PIl - M_PI_4l)
+
+#if defined(_NEW_COMPLEX_FLOAT)
+# define __FLT_TYPE    float
+# define __FLT_ABI(N)  N##f
+# define __FLT_CST(N)  N##F
+# define __FLT_EPSILON  __FLT_EPSILON__
+# define __FLT_NAN     NANF
+# define __FLT_HUGE_VAL        HUGE_VALF
+# define __FLT_PI      M_PI
+# define __FLT_PI_2    M_PI_2
+# define __FLT_PI_4    M_PI_4
+# define __FLT_PI_3_4  M_PI_3_4
+# define __FLT_MAXLOG  88.72283905206835F
+# define __FLT_MINLOG  -103.278929903431851103F
+# define __FLT_LOGE2   0.693147180559945309F
+# define __FLT_LOG10E   0.434294481903251828F
+# define __FLT_REPORT(NAME) NAME "f"
+#elif defined(_NEW_COMPLEX_DOUBLE)
+# define __FLT_TYPE    double
+# define __FLT_ABI(N)  N
+# define __FLT_EPSILON  __DBL_EPSILON__
+# define __FLT_CST(N)  N
+# define __FLT_NAN     NAN
+# define __FLT_HUGE_VAL        HUGE_VAL
+# define __FLT_PI      M_PI
+# define __FLT_PI_2    M_PI_2
+# define __FLT_PI_4    M_PI_4
+# define __FLT_PI_3_4  M_PI_3_4
+# define __FLT_MAXLOG  7.09782712893383996843E2
+# define __FLT_MINLOG  -7.45133219101941108420E2
+# define __FLT_LOGE2   6.93147180559945309417E-1
+# define __FLT_LOG10E   4.34294481903251827651E-1
+# define __FLT_REPORT(NAME)    NAME
+#elif defined(_NEW_COMPLEX_LDOUBLE)
+# define __FLT_TYPE    long double
+# define __FLT_ABI(N)  N##l
+# define __FLT_CST(N)  N##L
+# define __FLT_EPSILON  __LDBL_EPSILON__
+# define __FLT_NAN     NANL
+# define __FLT_HUGE_VAL        HUGE_VALL
+# define __FLT_PI      M_PIl
+# define __FLT_PI_2    M_PI_2l
+# define __FLT_PI_4    M_PI_4l
+# define __FLT_PI_3_4  M_PI_3_4l
+# define __FLT_MAXLOG  1.1356523406294143949492E4L
+# define __FLT_MINLOG  -1.1355137111933024058873E4L
+# define __FLT_LOGE2   6.9314718055994530941723E-1L
+# define __FLT_LOG10E   4.3429448190325182765113E-1L
+# define __FLT_REPORT(NAME) NAME "l"
+#else
+# error "Unknown complex number type"
+#endif
+
+#define __FLT_RPT_DOMAIN(NAME, ARG1, ARG2, RSLT) \
+       errno = EDOM, \
+       __mingw_raise_matherr (_DOMAIN, __FLT_REPORT(NAME), (double) (ARG1), \
+                              (double) (ARG2), (double) (RSLT))
+#define __FLT_RPT_ERANGE(NAME, ARG1, ARG2, RSLT, OVL) \
+       errno = ERANGE, \
+        __mingw_raise_matherr (((OVL) ? _OVERFLOW : _UNDERFLOW), \
+                              __FLT_REPORT(NAME), (double) (ARG1), \
+                               (double) (ARG2), (double) (RSLT))
+
+#ifdef __CYGWIN__
+inline void __attribute__ ((always_inline))
+__mingw_raise_matherr (int typ, const char *name, double a1, double a2,
+                      double rslt)
+{
+  if (_LIB_VERSION != _POSIX_)
+    {
+      struct exception ex;
+      ex.type = typ;
+      ex.name = (char*)name;
+      ex.arg1 = a1;
+      ex.arg2 = a2;
+      ex.retval = rslt;
+      matherr(&ex);
+    }
+}
+#define _DOMAIN                DOMAIN
+#define _OVERFLOW      OVERFLOW
+#define _UNDERFLOW     UNDERFLOW
+#endif
diff --git a/winsup/cygwin/math/conj.def.h b/winsup/cygwin/math/conj.def.h
new file mode 100644 (file)
index 0000000..35fa898
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(conj) (__FLT_TYPE __complex__ z)
+{
+  return ~z;
+}
diff --git a/winsup/cygwin/math/conjl.c b/winsup/cygwin/math/conjl.c
new file mode 100644 (file)
index 0000000..52e32e6
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "conj.def.h"
diff --git a/winsup/cygwin/math/copysignl.S b/winsup/cygwin/math/copysignl.S
new file mode 100644 (file)
index 0000000..ffe6240
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Changes for long double by Ulrich Drepper <drepper@cygnus.com>
+ * Public domain.
+ */
+#include <_mingw_mac.h>
+
+       .file   "copysignl.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+
+       .globl __MINGW_USYMBOL(copysignl)
+       .def    __MINGW_USYMBOL(copysignl);     .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(copysignl):
+#if defined(_AMD64_) || defined(__x86_64__)
+       movq    (%rdx), %rax
+       movq    %rax, (%rcx)
+       movq    8(%rdx), %rax
+       movq    8(%r8), %rdx
+       andq    $0x777f, %rax
+       andq    $0x8000, %rdx
+       orq     %rdx, %rax
+       movq    %rax, 8(%rcx)
+       movq    %rcx, %rax
+       ret
+#elif defined(_ARM_) || defined(__arm__)
+       fcmpzd  d1
+       fmstat
+       bmi     1f /* jump if d1 is negative */
+       fcmpzd  d0
+       fmstat
+       vnegmi.f64      d0, d0 /* negate d0 if it is negative */
+       bx      lr
+       1: fcmpzd       d0
+       fmstat
+       vnegpl.f64      d0, d0 /* negate d0 if it is positive */
+       bx      lr
+#elif defined(_X86_) || defined(__i386__)
+       movl    24(%esp),%edx
+       movl    12(%esp),%eax
+       andl    $0x8000,%edx
+       andl    $0x7fff,%eax
+       orl     %edx,%eax
+       movl    %eax,12(%esp)
+       fldt    4(%esp)
+       ret
+#endif
diff --git a/winsup/cygwin/math/cos.def.h b/winsup/cygwin/math/cos.def.h
new file mode 100644 (file)
index 0000000..1058d03
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "complex_internal.h"
+#include <errno.h>
+
+extern long double __cosl_internal (long double);
+
+__FLT_TYPE
+__FLT_ABI(cos) (__FLT_TYPE x)
+{
+  int x_class = fpclassify (x);
+  if (x_class == FP_NAN)
+    {
+      __FLT_RPT_DOMAIN ("cos", x, 0.0, x);
+      return x;
+    }
+  else if (x_class == FP_INFINITE)
+    {
+      __FLT_RPT_DOMAIN ("cos", x, 0.0, __FLT_NAN);
+      return __FLT_NAN;
+    }
+  return (__FLT_TYPE) __cosl_internal ((long double) x);
+}
diff --git a/winsup/cygwin/math/coshl.c b/winsup/cygwin/math/coshl.c
new file mode 100644 (file)
index 0000000..d7eb4b7
--- /dev/null
@@ -0,0 +1,45 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+
+#ifndef _SET_ERRNO
+#define _SET_ERRNO(x)
+#endif
+
+long double coshl(long double x)
+{
+  long double y;
+  int x_class = fpclassify (x);
+  if (x_class == FP_NAN)
+    {
+      errno = EDOM;
+      return x;
+    }
+  else if (x_class == FP_INFINITE)
+    {
+       errno = ERANGE;
+       return x;
+    }
+  x = fabsl (x);
+  if (x > (MAXLOGL + LOGE2L))
+    {
+      errno = ERANGE;
+#ifdef INFINITIES
+      return (INFINITYL);
+#else
+      return (MAXNUML);
+#endif
+    }
+  if (x >= (MAXLOGL - LOGE2L))
+    {
+      y = expl(0.5L * x);
+      y = (0.5L * y) * y;
+      return y;
+    }
+  y = expl(x);
+  y = 0.5L * (y + 1.0L / y);
+  return y;
+}
diff --git a/winsup/cygwin/math/cosl.c b/winsup/cygwin/math/cosl.c
new file mode 100644 (file)
index 0000000..f798862
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "cos.def.h"
diff --git a/winsup/cygwin/math/cosl_internal.S b/winsup/cygwin/math/cosl_internal.S
new file mode 100644 (file)
index 0000000..3c8f60d
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "cosl_internal.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(__cosl_internal)
+       .def    __MINGW_USYMBOL(__cosl_internal);       .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(__cosl_internal):
+#ifdef __x86_64__
+       fldt    (%rdx)
+       fcos
+       fnstsw  %ax
+       testl   $0x400,%eax
+       jz      1f
+       fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fnstsw  %ax
+       testl   $0x400,%eax
+       jnz     2b
+       fstp    %st(1)
+       fcos
+1:     movq %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt (%rcx)
+       ret
+#else
+       fldt    4(%esp)
+       fcos
+       fnstsw  %ax
+       testl   $0x400,%eax
+       jnz     1f
+       ret
+1:     fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fnstsw  %ax
+       testl   $0x400,%eax
+       jnz     2b
+       fstp    %st(1)
+       fcos
+       ret
+#endif
+
diff --git a/winsup/cygwin/math/cossin.c b/winsup/cygwin/math/cossin.c
new file mode 100644 (file)
index 0000000..0095daa
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+void sincos (double __x, double *p_sin, double *p_cos);
+void sincosl (long double __x, long double *p_sin, long double *p_cos);
+void sincosf (float __x, float *p_sin, float *p_cos);
+
+void sincos (double __x, double *p_sin, double *p_cos)
+{
+  long double c, s;
+
+  __asm__ __volatile__ ("fsincos\n\t"
+    "fnstsw    %%ax\n\t"
+    "testl     $0x400, %%eax\n\t"
+    "jz        1f\n\t"
+    "fldpi\n\t"
+    "fadd      %%st(0)\n\t"
+    "fxch      %%st(1)\n\t"
+    "2: fprem1\n\t"
+    "fnstsw    %%ax\n\t"
+    "testl     $0x400, %%eax\n\t"
+    "jnz       2b\n\t"
+    "fstp      %%st(1)\n\t"
+    "fsincos\n\t"
+    "1:" : "=t" (c), "=u" (s) : "0" (__x));
+  *p_sin = (double) s;
+  *p_cos = (double) c;
+}
+
+void sincosf (float __x, float *p_sin, float *p_cos)
+{
+  long double c, s;
+
+  __asm__ __volatile__ ("fsincos\n\t"
+    "fnstsw    %%ax\n\t"
+    "testl     $0x400, %%eax\n\t"
+    "jz        1f\n\t"
+    "fldpi\n\t"
+    "fadd      %%st(0)\n\t"
+    "fxch      %%st(1)\n\t"
+    "2: fprem1\n\t"
+    "fnstsw    %%ax\n\t"
+    "testl     $0x400, %%eax\n\t"
+    "jnz       2b\n\t"
+    "fstp      %%st(1)\n\t"
+    "fsincos\n\t"
+    "1:" : "=t" (c), "=u" (s) : "0" (__x));
+  *p_sin = (float) s;
+  *p_cos = (float) c;
+}
+
+void sincosl (long double __x, long double *p_sin, long double *p_cos)
+{
+  long double c, s;
+
+  __asm__ __volatile__ ("fsincos\n\t"
+    "fnstsw    %%ax\n\t"
+    "testl     $0x400, %%eax\n\t"
+    "jz        1f\n\t"
+    "fldpi\n\t"
+    "fadd      %%st(0)\n\t"
+    "fxch      %%st(1)\n\t"
+    "2: fprem1\n\t"
+    "fnstsw    %%ax\n\t"
+    "testl     $0x400, %%eax\n\t"
+    "jnz       2b\n\t"
+    "fstp      %%st(1)\n\t"
+    "fsincos\n\t"
+    "1:" : "=t" (c), "=u" (s) : "0" (__x));
+  *p_sin = s;
+  *p_cos = c;
+}
diff --git a/winsup/cygwin/math/cpow.def.h b/winsup/cygwin/math/cpow.def.h
new file mode 100644 (file)
index 0000000..984224b
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(cpow) (__FLT_TYPE __complex__ z, __FLT_TYPE __complex__ x)
+{
+  return __FLT_ABI(cexp) (x * __FLT_ABI(clog) (z));
+}
diff --git a/winsup/cygwin/math/cpowl.c b/winsup/cygwin/math/cpowl.c
new file mode 100644 (file)
index 0000000..42edb79
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "cpow.def.h"
diff --git a/winsup/cygwin/math/cproj.def.h b/winsup/cygwin/math/cproj.def.h
new file mode 100644 (file)
index 0000000..e15d779
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(cproj) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE ret;
+
+  if (isinf (__real__ z) || isinf (__imag__ z))
+  {
+    __real__ ret = INFINITY;
+    __imag__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z);
+    return ret;
+  }
+
+  return z;
+}
diff --git a/winsup/cygwin/math/cprojl.c b/winsup/cygwin/math/cprojl.c
new file mode 100644 (file)
index 0000000..d48d108
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "cproj.def.h"
diff --git a/winsup/cygwin/math/creal.def.h b/winsup/cygwin/math/creal.def.h
new file mode 100644 (file)
index 0000000..554c99d
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE
+__FLT_ABI(creal) (__FLT_TYPE __complex__ z)
+{
+  return __real__ z;
+}
diff --git a/winsup/cygwin/math/creall.c b/winsup/cygwin/math/creall.c
new file mode 100644 (file)
index 0000000..e46c8ea
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "creal.def.h"
diff --git a/winsup/cygwin/math/csin.def.h b/winsup/cygwin/math/csin.def.h
new file mode 100644 (file)
index 0000000..cf9cfe1
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(csin) (__FLT_TYPE __complex__ z)
+{
+  /* Annex G.6: csin(z) = -i csinh (iz) */
+  __complex__ __FLT_TYPE ret;
+  __complex__ __FLT_TYPE x;
+
+  __real__ x = -__imag__ z;
+  __imag__ x = __real__ z;
+
+  x = __FLT_ABI(csinh) (x);
+
+  __real__ ret = __imag__ x;
+  __imag__ ret = -__real__ x;
+
+  return ret;
+}
diff --git a/winsup/cygwin/math/csinh.def.h b/winsup/cygwin/math/csinh.def.h
new file mode 100644 (file)
index 0000000..3e07d2b
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(csinh) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE ret;
+  __FLT_TYPE s_x, c_x;
+  int negate = signbit (__real__ z);
+  int r_class = fpclassify (__real__ z);
+  int i_class = fpclassify (__imag__ z);
+
+  __real__ z = __FLT_ABI(fabs) (__real__ z);
+
+  if (r_class == FP_NAN)
+  {
+    __real__ ret = __FLT_NAN;
+    __imag__ ret = __imag__ z == __FLT_CST(0.0) ? __imag__ z : __FLT_NAN;
+
+    return ret;
+  }
+
+  if (r_class == FP_INFINITE)
+  {
+    if (i_class == FP_ZERO)
+    {
+      __real__ ret = negate ? -__FLT_HUGE_VAL : __FLT_HUGE_VAL;
+      __imag__ ret = __imag__ z;
+      return ret;
+    }
+
+    if (i_class == FP_NAN || i_class == FP_INFINITE)
+    {
+      __real__ ret = __FLT_HUGE_VAL;
+      __imag__ ret = __FLT_NAN + __FLT_NAN;
+
+      return ret;
+    }
+    __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+    __real__ ret = __FLT_ABI(copysign) (__FLT_HUGE_VAL, c_x);
+    __imag__ ret = __FLT_ABI(copysign) (__FLT_HUGE_VAL, s_x);
+
+    if (negate)
+    __real__ ret = -__real__ ret;
+    return ret;
+  }
+
+  if (i_class == FP_NAN || i_class == FP_INFINITE)
+  {
+    __real__ ret = (r_class == FP_ZERO
+      ? (__FLT_ABI(copysign) (__FLT_CST(0.0), negate ? -__FLT_CST(1.0) : __FLT_CST(1.0))) : __FLT_NAN);
+    __imag__ ret = (r_class == FP_ZERO ? (__FLT_NAN + __FLT_NAN) : __FLT_NAN);
+
+    return ret;
+  }
+
+  __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+  __real__ ret = __FLT_ABI(sinh) (__real__ z) * c_x;
+  __imag__ ret = __FLT_ABI(cosh) (__real__ z) * s_x;
+
+  if (negate)
+    __real__ ret = -__real__ ret;
+  return ret;
+}
diff --git a/winsup/cygwin/math/csinl.c b/winsup/cygwin/math/csinl.c
new file mode 100644 (file)
index 0000000..de04104
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "csinh.def.h"
+#include "csin.def.h"
diff --git a/winsup/cygwin/math/csqrt.def.h b/winsup/cygwin/math/csqrt.def.h
new file mode 100644 (file)
index 0000000..714f303
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(csqrt) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE ret;
+  __FLT_TYPE d, r, s;
+  int r_class = fpclassify (__real__ z);
+  int i_class = fpclassify (__imag__ z);
+
+  if (r_class == FP_INFINITE || r_class == FP_NAN || i_class == FP_INFINITE || i_class == FP_NAN)
+  {
+    if (i_class == FP_INFINITE)
+    {
+      __real__ ret = __FLT_HUGE_VAL;
+      __imag__ ret = __imag__ z;
+      return ret;
+    }
+
+    if (r_class == FP_INFINITE)
+    {
+      if (__real__ z < __FLT_CST(0.0))
+      {
+       __real__ ret = i_class == FP_NAN ? __FLT_NAN : __FLT_CST(0.0);
+       __imag__ ret = __FLT_ABI(copysign) (__FLT_HUGE_VAL, __imag__ z);
+       return ret;
+      }
+
+      __real__ ret = __real__ z;
+      __imag__ ret = (i_class == FP_NAN
+       ? __FLT_NAN : __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z));
+      return ret;
+    }
+
+    __real__ ret = __FLT_NAN;
+    __imag__ ret = __FLT_NAN;
+    return ret;
+  }
+
+  if (i_class == FP_ZERO)
+  {
+    if (__real__ z < __FLT_CST(0.0))
+    {
+      __real__ ret = __FLT_CST(0.0);
+      __imag__ ret = __FLT_ABI(copysign) (__FLT_ABI(sqrt) (-__real__ z), __imag__ z);
+    }
+    else
+    {
+      __real__ ret = __FLT_ABI(fabs) (__FLT_ABI(sqrt) (__real__ z));
+      __imag__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z);
+    }
+    return ret;
+  }
+
+  if (r_class == FP_ZERO)
+  {
+    r = __FLT_ABI(sqrt) (__FLT_CST(0.5) * __FLT_ABI(fabs) (__imag__ z));
+
+    __real__ ret = r;
+    __imag__ ret = __FLT_ABI(copysign) (r, __imag__ z);
+    return ret;
+  }
+
+  d = __FLT_ABI(hypot) (__real__ z, __imag__ z);
+  if (__real__ z > __FLT_CST(0.0))
+  {
+    r = __FLT_ABI(sqrt) (__FLT_CST(0.5) * d + __FLT_CST(0.5) * __real__ z);
+    s = (__FLT_CST(0.5) * __imag__ z) / r;
+  }
+  else
+  {
+    s = __FLT_ABI(sqrt) (__FLT_CST(0.5) * d - __FLT_CST(0.5) * __real__ z);
+    r = __FLT_ABI(fabs) ((__FLT_CST(0.5) * __imag__ z) / s);
+  }
+
+  __real__ ret = r;
+  __imag__ ret = __FLT_ABI(copysign) (s, __imag__ z);
+
+  return ret;
+}
diff --git a/winsup/cygwin/math/csqrtl.c b/winsup/cygwin/math/csqrtl.c
new file mode 100644 (file)
index 0000000..1993289
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "csqrt.def.h"
diff --git a/winsup/cygwin/math/ctan.def.h b/winsup/cygwin/math/ctan.def.h
new file mode 100644 (file)
index 0000000..28df5f3
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(ctan) (__FLT_TYPE __complex__ z)
+{
+  /* Annex G.6: ctan(z) = -i ctanh (iz) */
+  __complex__ __FLT_TYPE ret;
+  __complex__ __FLT_TYPE x;
+
+  __real__ x = -__imag__ z;
+  __imag__ x = __real__ z;
+
+  x = __FLT_ABI(ctanh) (x);
+
+  __real__ ret = __imag__ x;
+  __imag__ ret = -__real__ x;
+
+  return ret;
+}
diff --git a/winsup/cygwin/math/ctanh.def.h b/winsup/cygwin/math/ctanh.def.h
new file mode 100644 (file)
index 0000000..11a1836
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(ctanh) (__FLT_TYPE __complex__ z)
+{
+  __complex__ __FLT_TYPE ret;
+  __FLT_TYPE s, c, d;
+
+  if (!isfinite (__real__ z) || !isfinite (__imag__ z))
+  {
+    if (isinf (__real__ z))
+    {
+      __real__ ret = __FLT_ABI(copysign) (__FLT_CST(1.0), __real__ z);
+
+      /* fmod will return NaN if __imag__ z is infinity. This is actually
+        OK, because imaginary infinity returns a + or - zero (unspecified).
+        For +x, sin (x) is negative if fmod (x, 2pi) > pi.
+        For -x, sin (x) is positive if fmod (x, 2pi) < pi.
+        We use epsilon to ensure that the zeros are detected properly with
+        float and long double comparisons.  */
+      s = __FLT_ABI(fmod) (__imag__ z, __FLT_PI);
+      if (signbit (__imag__ z))
+       __imag__ ret = s + __FLT_PI_2 < -__FLT_EPSILON ? 0.0 : -0.0;
+      else
+       __imag__ ret = s - __FLT_PI_2 > __FLT_EPSILON ? -0.0 : 0.0;
+      return ret;
+    }
+
+    if (__imag__ z == __FLT_CST(0.0))
+      return z;
+
+    __real__ ret = __FLT_NAN;
+    __imag__ ret = __FLT_NAN;
+    return ret;
+  }
+
+  __FLT_ABI(sincos) (__FLT_CST(2.0) * __imag__ z, &s, &c);
+
+  d = (__FLT_ABI(cosh) (__FLT_CST(2.0) * __real__ z) + c);
+
+  if (d == __FLT_CST(0.0))
+  {
+    __complex__ __FLT_TYPE ez = __FLT_ABI(cexp) (z);
+    __complex__ __FLT_TYPE emz = __FLT_ABI(cexp) (-z);
+
+    return (ez - emz) / (ez + emz);
+  }
+
+  __real__ ret = __FLT_ABI(sinh) (__FLT_CST(2.0) * __real__ z) / d;
+  __imag__ ret = s / d;
+  return ret;
+}
diff --git a/winsup/cygwin/math/ctanl.c b/winsup/cygwin/math/ctanl.c
new file mode 100644 (file)
index 0000000..eb7e378
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions.  */
+#define  _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "ctanh.def.h"
+#include "ctan.def.h"
diff --git a/winsup/cygwin/math/erfl.c b/winsup/cygwin/math/erfl.c
new file mode 100644 (file)
index 0000000..3832fe9
--- /dev/null
@@ -0,0 +1,303 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*                                                     erfl.c
+ *
+ *     Error function
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, erfl();
+ *
+ * y = erfl( x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * The integral is
+ *
+ *                           x 
+ *                            -
+ *                 2         | |          2
+ *   erf(x)  =  --------     |    exp( - t  ) dt.
+ *              sqrt(pi)   | |
+ *                          -
+ *                           0
+ *
+ * The magnitude of x is limited to about 106.56 for IEEE
+ * arithmetic; 1 or -1 is returned outside this range.
+ *
+ * For 0 <= |x| < 1, erf(x) = x * P6(x^2)/Q6(x^2);
+ * Otherwise: erf(x) = 1 - erfc(x).
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ *                      Relative error:
+ * arithmetic   domain     # trials      peak         rms
+ *    IEEE      0,1         50000       2.0e-19     5.7e-20
+ *
+ */
+
+/*                                                     erfcl.c
+ *
+ *     Complementary error function
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, erfcl();
+ *
+ * y = erfcl( x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ *
+ *  1 - erf(x) =
+ *
+ *                           inf. 
+ *                             -
+ *                  2         | |          2
+ *   erfc(x)  =  --------     |    exp( - t  ) dt
+ *               sqrt(pi)   | |
+ *                           -
+ *                            x
+ *
+ *
+ * For small x, erfc(x) = 1 - erf(x); otherwise rational
+ * approximations are computed.
+ *
+ * A special function expx2l.c is used to suppress error amplification
+ * in computing exp(-x^2).
+ *
+ *
+ * ACCURACY:
+ *
+ *                      Relative error:
+ * arithmetic   domain     # trials      peak         rms
+ *    IEEE      0,13        50000      8.4e-19      9.7e-20
+ *    IEEE      6,106.56    20000      2.9e-19      7.1e-20
+ *
+ *
+ * ERROR MESSAGES:
+ *
+ *   message          condition              value returned
+ * erfcl underflow    x^2 > MAXLOGL              0.0
+ *
+ *
+ */
+
+
+/*
+Modified from file ndtrl.c
+Cephes Math Library Release 2.3:  January, 1995
+Copyright 1984, 1995 by Stephen L. Moshier
+*/
+
+#include <math.h>
+#include "cephes_mconf.h"
+
+long double erfl(long double x);
+
+/* erfc(x) = exp(-x^2) P(1/x)/Q(1/x)
+   1/8 <= 1/x <= 1
+   Peak relative error 5.8e-21  */
+
+static const uLD P[10] = {
+  { { 0x4bf0,0x9ad8,0x7a03,0x86c7,0x401d, 0, 0, 0 } },
+  { { 0xdf23,0xd843,0x4032,0x8881,0x401e, 0, 0, 0 } },
+  { { 0xd025,0xcfd5,0x8494,0x88d3,0x401e, 0, 0, 0 } },
+  { { 0xb6d0,0xc92b,0x5417,0xacb1,0x401d, 0, 0, 0 } },
+  { { 0xada8,0x356a,0x4982,0x94a6,0x401c, 0, 0, 0 } },
+  { { 0x4e13,0xcaee,0x9e31,0xb258,0x401a, 0, 0, 0 } },
+  { { 0x5840,0x554d,0x37a3,0x9239,0x4018, 0, 0, 0 } },
+  { { 0x3b58,0x3da2,0xaf02,0x9780,0x4015, 0, 0, 0 } },
+  { { 0x0144,0x489e,0xbe68,0x9c31,0x4011, 0, 0, 0 } },
+  { { 0x333b,0xd9e6,0xd404,0x986f,0xbfee, 0, 0, 0 } }
+};
+static const uLD Q[] = {
+  { { 0x0e43,0x302d,0x79ed,0x86c7,0x401d, 0, 0, 0 } },
+  { { 0xf817,0x9128,0xc0f8,0xd48b,0x401e, 0, 0, 0 } },
+  { { 0x8eae,0x8dad,0x6eb4,0x9aa2,0x401f, 0, 0, 0 } },
+  { { 0x00e7,0x7595,0xcd06,0x88bb,0x401f, 0, 0, 0 } },
+  { { 0x4991,0xcfda,0x52f1,0xa2a9,0x401e, 0, 0, 0 } },
+  { { 0xc39d,0xe415,0xc43d,0x87c0,0x401d, 0, 0, 0 } },
+  { { 0xa75d,0x436f,0x30dd,0xa027,0x401b, 0, 0, 0 } },
+  { { 0xc4cb,0x305a,0xbf78,0x8220,0x4019, 0, 0, 0 } },
+  { { 0x3708,0x33b1,0x07fa,0x8644,0x4016, 0, 0, 0 } },
+  { { 0x24fa,0x96f6,0x7153,0x8a6c,0x4012, 0, 0, 0 } }
+};
+
+/* erfc(x) = exp(-x^2) 1/x R(1/x^2) / S(1/x^2)
+   1/128 <= 1/x < 1/8
+   Peak relative error 1.9e-21  */
+
+static const uLD R[] = {
+  { { 0x260a,0xab95,0x2fc7,0xe7c4,0x4000, 0, 0, 0 } },
+  { { 0x4761,0x613e,0xdf6d,0xe58e,0x4001, 0, 0, 0 } },
+  { { 0x0615,0x4b00,0x575f,0xdc7b,0x4000, 0, 0, 0 } },
+  { { 0x521d,0x8527,0x3435,0x8dc2,0x3ffe, 0, 0, 0 } },
+  { { 0x22cf,0xc711,0x6c5b,0xdcfb,0x3ff9, 0, 0, 0 } }
+};
+static const uLD S[] = {
+  { { 0x5de6,0x17d7,0x54d6,0xaba9,0x4002, 0, 0, 0 } },
+  { { 0x55d5,0xd300,0xe71e,0xf564,0x4002, 0, 0, 0 } },
+  { { 0xb611,0x8f76,0xf020,0xd255,0x4001, 0, 0, 0 } },
+  { { 0x3684,0x3798,0xb793,0x80b0,0x3fff, 0, 0, 0 } },
+  { { 0xf5af,0x2fb2,0x1e57,0xc3d7,0x3ffa, 0, 0, 0 } }
+};
+
+/* erf(x)  = x T(x^2)/U(x^2)
+   0 <= x <= 1
+   Peak relative error 7.6e-23  */
+
+static const uLD T[] = {
+  { { 0xfd7a,0x3a1a,0x705b,0xe0c4,0x3ffb, 0, 0, 0 } },
+  { { 0x3128,0xc337,0x3716,0xace5,0x4001, 0, 0, 0 } },
+  { { 0x9517,0x4e93,0x540e,0x8f97,0x4007, 0, 0, 0 } },
+  { { 0x6118,0x6059,0x9093,0xa757,0x400a, 0, 0, 0 } },
+  { { 0xb954,0xa987,0xc60c,0xbc83,0x400e, 0, 0, 0 } },
+  { { 0x7a56,0xe45a,0xa4bd,0x975b,0x4010, 0, 0, 0 } },
+  { { 0xc446,0x6bab,0x0b2a,0x86d0,0x4013, 0, 0, 0 } }
+};
+
+static const uLD U[] = {
+  { { 0x3453,0x1f8e,0xf688,0xb507,0x4004, 0, 0, 0 } },
+  { { 0x71ac,0xb12f,0x21ca,0xf2e2,0x4008, 0, 0, 0 } },
+  { { 0xffe8,0x9cac,0x3b84,0xc2ac,0x400c, 0, 0, 0 } },
+  { { 0x481d,0x445b,0xc807,0xc232,0x400f, 0, 0, 0 } },
+  { { 0x9ad5,0x1aef,0x45b1,0xe25e,0x4011, 0, 0, 0 } },
+  { { 0x71a7,0x1cad,0x012e,0xeef3,0x4012, 0, 0, 0 } }
+};
+
+/*                                                     expx2l.c
+ *
+ *     Exponential of squared argument
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, expmx2l();
+ * int sign;
+ *
+ * y = expx2l( x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Computes y = exp(x*x) while suppressing error amplification
+ * that would ordinarily arise from the inexactness of the
+ * exponential argument x*x.
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ *                      Relative error:
+ * arithmetic      domain        # trials      peak         rms
+ *   IEEE     -106.566, 106.566    10^5       1.6e-19     4.4e-20
+ *
+ */
+
+#define M 32768.0L
+#define MINV 3.0517578125e-5L
+
+static long double expx2l (long double x)
+{
+       long double u, u1, m, f;
+
+       x = fabsl (x);
+       /* Represent x as an exact multiple of M plus a residual.
+          M is a power of 2 chosen so that exp(m * m) does not overflow
+          or underflow and so that |x - m| is small.  */
+       m = MINV * floorl(M * x + 0.5L);
+       f = x - m;
+
+       /* x^2 = m^2 + 2mf + f^2 */
+       u = m * m;
+       u1 = 2 * m * f  +  f * f;
+
+       if ((u + u1) > MAXLOGL)
+               return (INFINITYL);
+
+       /* u is exact, u1 is small.  */
+       u = expl(u) * expl(u1);
+       return (u);
+}
+
+long double erfcl(long double a)
+{
+       long double p, q, x, y, z;
+
+       if (isinf (a))
+               return (signbit(a) ? 2.0 : 0.0);
+
+       x = fabsl (a);
+
+       if (x < 1.0L)
+               return (1.0L - erfl(a));
+
+       z = a * a;
+
+       if (z  > MAXLOGL)
+       {
+under:
+               mtherr("erfcl", UNDERFLOW);
+               errno = ERANGE;
+               return (signbit(a) ? 2.0 : 0.0);
+       }
+
+       /* Compute z = expl(a * a).  */
+       z = expx2l(a);
+       y = 1.0L/x;
+
+       if (x < 8.0L)
+       {
+               p = polevll(y, P, 9);
+               q = p1evll(y, Q, 10);
+       }
+       else
+       {
+               q = y * y;
+               p = y * polevll(q, R, 4);
+               q = p1evll(q, S, 5);
+       }
+       y = p/(q * z);
+
+       if (a < 0.0L)
+               y = 2.0L - y;
+
+       if (y == 0.0L)
+               goto under;
+
+       return (y);
+}
+
+long double erfl(long double x)
+{
+       long double y, z;
+
+       if (x == 0.0L)
+               return (x);
+
+       if (isinf (x))
+               return (signbit(x) ?  -1.0L : 1.0L);
+
+       if (fabsl(x) > 1.0L)
+               return (1.0L - erfcl(x));
+
+       z = x * x;
+       y = x * polevll(z, T, 6) / p1evll(z, U, 6);
+       return (y);
+}
diff --git a/winsup/cygwin/math/exp.def.h b/winsup/cygwin/math/exp.def.h
new file mode 100644 (file)
index 0000000..2419ef6
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "complex_internal.h"
+#include <errno.h>
+
+static long double c0 = 1.44268798828125L; // INV_LN2
+static long double c1 = 7.05260771340735992468e-6L;
+
+static long double
+__expl_internal (long double x)
+{
+  long double res = 0.0L;
+  asm ("fldl2e\n\t"             /* 1  log2(e)         */
+       "fmul %%st(1),%%st\n\t"  /* 1  x log2(e)       */
+
+#ifdef __x86_64__
+    "subq $8, %%rsp\n"
+    "fnstcw 4(%%rsp)\n"
+    "movzwl 4(%%rsp), %%eax\n"
+    "orb $12, %%ah\n"
+    "movw %%ax, (%%rsp)\n"
+    "fldcw (%%rsp)\n"
+    "frndint\n\t"            /* 1  i               */
+    "fld %%st(1)\n\t"        /* 2  x               */
+    "frndint\n\t"            /* 2  xi              */
+    "fldcw 4(%%rsp)\n"
+    "addq $8, %%rsp\n"
+#else
+    "push %%eax\n\tsubl $8, %%esp\n"
+    "fnstcw 4(%%esp)\n"
+    "movzwl 4(%%esp), %%eax\n"
+    "orb $12, %%ah\n"
+    "movw %%ax, (%%esp)\n"
+    "fldcw (%%esp)\n"
+    "frndint\n\t"            /* 1  i               */
+    "fld %%st(1)\n\t"        /* 2  x               */
+    "frndint\n\t"            /* 2  xi              */
+    "fldcw 4(%%esp)\n"
+    "addl $8, %%esp\n\tpop %%eax\n"
+#endif
+       "fld %%st(1)\n\t"        /* 3  i               */
+       "fldt %2\n\t"            /* 4  c0              */
+       "fld %%st(2)\n\t"        /* 5  xi              */
+       "fmul %%st(1),%%st\n\t"  /* 5  c0 xi           */
+       "fsubp %%st,%%st(2)\n\t" /* 4  f = c0 xi  - i  */
+       "fld %%st(4)\n\t"        /* 5  x               */
+       "fsub %%st(3),%%st\n\t"  /* 5  xf = x - xi     */
+       "fmulp %%st,%%st(1)\n\t" /* 4  c0 xf           */
+       "faddp %%st,%%st(1)\n\t" /* 3  f = f + c0 xf   */
+       "fldt %3\n\t"            /* 4                  */
+       "fmul %%st(4),%%st\n\t"  /* 4  c1 * x          */
+       "faddp %%st,%%st(1)\n\t" /* 3  f = f + c1 * x  */
+       "f2xm1\n\t"             /* 3 2^(fract(x * log2(e))) - 1 */
+       "fld1\n\t"               /* 4 1.0              */
+       "faddp\n\t"             /* 3 2^(fract(x * log2(e))) */
+       "fstp   %%st(1)\n\t"    /* 2  */
+       "fscale\n\t"            /* 2 scale factor is st(1); e^x */
+       "fstp   %%st(1)\n\t"    /* 1  */
+       "fstp   %%st(1)\n\t"    /* 0  */
+       : "=t" (res) : "0" (x), "m" (c0), "m" (c1) : "ax", "dx");
+  return res;
+}
+
+__FLT_TYPE
+__FLT_ABI(exp) (__FLT_TYPE x)
+{
+  int x_class = fpclassify (x);
+  if (x_class == FP_NAN)
+    {
+      __FLT_RPT_DOMAIN ("exp", x, 0.0, x);
+      return x;
+    }
+  else if (x_class == FP_INFINITE)
+    {
+      __FLT_TYPE r = (signbit (x) ? __FLT_CST (0.0) : __FLT_HUGE_VAL);
+      __FLT_RPT_ERANGE ("exp", x, 0.0, r, signbit (x));
+      return r;
+    }
+  else if (x_class == FP_ZERO)
+    {
+      return __FLT_CST (1.0);
+    }
+  else if (x > __FLT_MAXLOG)
+    {
+      __FLT_RPT_ERANGE ("exp", x, 0.0, __FLT_HUGE_VAL, 1);
+      return __FLT_HUGE_VAL;
+    }
+  else if (x < __FLT_MINLOG)
+    {
+      return __FLT_CST(0.0);
+    }
+  else
+    return (__FLT_TYPE) __expl_internal ((long double) x);
+}
diff --git a/winsup/cygwin/math/exp10l.c b/winsup/cygwin/math/exp10l.c
new file mode 100644 (file)
index 0000000..821b8f5
--- /dev/null
@@ -0,0 +1,8 @@
+#undef exp10l
+#include <math.h>
+
+long double
+exp10l (long double x)
+{
+  return powl (10.0L, x);
+}
diff --git a/winsup/cygwin/math/exp2.S b/winsup/cygwin/math/exp2.S
new file mode 100644 (file)
index 0000000..37d4a2b
--- /dev/null
@@ -0,0 +1,94 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "exp2.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(exp2)
+       .def    __MINGW_USYMBOL(exp2);  .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(exp2):
+#ifdef __x86_64__
+       subq    $24, %rsp
+       movsd   %xmm0,(%rsp)
+       fldl    (%rsp)
+       fxam                            /* Is NaN or +-Inf?  */
+       fstsw   %ax
+       movb    $0x45, %dh
+       andb    %ah, %dh
+       cmpb    $0x05, %dh
+       je      1f                      /* Is +-Inf, jump.  */
+       fld     %st
+       subq $8, %rsp /* int(x) */
+       fnstcw 4(%rsp)
+       movzwl 4(%rsp), %eax
+       orb $12, %ah
+       movw %ax, (%rsp)
+       fldcw (%rsp)
+       frndint
+       fldcw 4(%rsp)
+       addq $8, %rsp
+       fsubr   %st,%st(1)              /* fract(x) */
+       fxch
+       f2xm1                           /* 2^(fract(x)) - 1 */
+       fld1
+       faddp                           /* 2^(fract(x)) */
+       fscale                          /* e^x */
+       fstp    %st(1)
+       fstpl   (%rsp)
+       movsd   (%rsp),%xmm0
+       addq    $24, %rsp
+       ret
+
+1:     testl   $0x200, %eax            /* Test sign.  */
+       jz      2f                      /* If positive, jump.  */
+       fstp    %st
+       fldz                            /* Set result to 0.  */
+2:     fstpl   (%rsp)
+       movsd   (%rsp),%xmm0
+       addq    $24,%rsp
+       ret
+#else
+       fldl    4(%esp)
+/* I added the following ugly construct because exp(+-Inf) resulted
+   in NaN.  The ugliness results from the bright minds at Intel.
+   For the i686 the code can be written better.
+   -- drepper@cygnus.com.  */
+       fxam                            /* Is NaN or +-Inf?  */
+       fstsw   %ax
+       movb    $0x45, %dh
+       andb    %ah, %dh
+       cmpb    $0x05, %dh
+       je      1f                      /* Is +-Inf, jump.  */
+       fld     %st
+       subl $8, %esp /* int(x) */
+       fnstcw 4(%esp)
+       movzwl 4(%esp), %eax
+       orb $12, %ah
+       movw %ax, (%esp)
+       fldcw (%esp)
+       frndint
+       fldcw 4(%esp)
+       addl $8, %esp
+       fsubr   %st,%st(1)              /* fract(x) */
+       fxch
+       f2xm1                           /* 2^(fract(x)) - 1 */
+       fld1
+       faddp                           /* 2^(fract(x)) */
+       fscale                          /* e^x */
+       fstp    %st(1)
+       ret
+
+1:     testl   $0x200, %eax            /* Test sign.  */
+       jz      2f                      /* If positive, jump.  */
+       fstp    %st
+       fldz                            /* Set result to 0.  */
+2:     ret
+#endif
diff --git a/winsup/cygwin/math/exp2l.S b/winsup/cygwin/math/exp2l.S
new file mode 100644 (file)
index 0000000..2e58c37
--- /dev/null
@@ -0,0 +1,92 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "exp2l.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(exp2l)
+       .def    __MINGW_USYMBOL(exp2l); .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(exp2l):
+#ifdef __x86_64__
+       fldt    (%rdx)
+       fxam                            /* Is NaN or +-Inf?  */
+       fstsw   %ax
+       movb    $0x45, %dh
+       andb    %ah, %dh
+       cmpb    $0x05, %dh
+       je      1f                      /* Is +-Inf, jump.  */
+       fld     %st
+       subq $8, %rsp /* int(x) */
+       fnstcw 4(%rsp)
+       movzwl 4(%rsp), %eax
+       orb $12, %ah
+       movw %ax, (%rsp)
+       fldcw (%rsp)
+       frndint
+       fldcw 4(%rsp)
+       addq $8, %rsp
+       fsubr   %st,%st(1)              /* fract(x) */
+       fxch
+       f2xm1                           /* 2^(fract(x)) - 1 */
+       fld1
+       faddp                           /* 2^(fract(x)) */
+       fscale                          /* e^x */
+       fstp    %st(1)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+
+1:     testl   $0x200, %eax            /* Test sign.  */
+       jz      2f                      /* If positive, jump.  */
+       fstp    %st
+       fldz                            /* Set result to 0.  */
+2:     movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+#else
+       fldt    4(%esp)
+/* I added the following ugly construct because exp(+-Inf) resulted
+   in NaN.  The ugliness results from the bright minds at Intel.
+   For the i686 the code can be written better.
+   -- drepper@cygnus.com.  */
+       fxam                            /* Is NaN or +-Inf?  */
+       fstsw   %ax
+       movb    $0x45, %dh
+       andb    %ah, %dh
+       cmpb    $0x05, %dh
+       je      1f                      /* Is +-Inf, jump.  */
+       fld     %st
+       subl $8, %esp /* int(x) */
+       fnstcw 4(%esp)
+       movzwl 4(%esp), %eax
+       orb $12, %ah
+       movw %ax, (%esp)
+       fldcw (%esp)
+       frndint
+       fldcw 4(%esp)
+       addl $8, %esp
+       fsubr   %st,%st(1)              /* fract(x) */
+       fxch
+       f2xm1                           /* 2^(fract(x)) - 1 */
+       fld1
+       faddp                           /* 2^(fract(x)) */
+       fscale                          /* e^x */
+       fstp    %st(1)
+       ret
+
+1:     testl   $0x200, %eax            /* Test sign.  */
+       jz      2f                      /* If positive, jump.  */
+       fstp    %st
+       fldz                            /* Set result to 0.  */
+2:     ret
+#endif
diff --git a/winsup/cygwin/math/expl.c b/winsup/cygwin/math/expl.c
new file mode 100644 (file)
index 0000000..7f4be62
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "exp.def.h"
diff --git a/winsup/cygwin/math/expm1.def.h b/winsup/cygwin/math/expm1.def.h
new file mode 100644 (file)
index 0000000..5a2b6f4
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "complex_internal.h"
+#include <errno.h>
+
+__FLT_TYPE
+__FLT_ABI(expm1) (__FLT_TYPE x)
+{
+  int x_class = fpclassify (x);
+  if (x_class == FP_NAN)
+  {
+    __FLT_RPT_DOMAIN ("expm1", x, 0.0, x);
+    return x;
+  }
+  else if (x_class == FP_INFINITE)
+  {
+    return (signbit (x) ? -__FLT_CST(1.0) : __FLT_HUGE_VAL);
+  }
+  else if (x_class == FP_ZERO)
+  {
+    return x;
+  }
+  if (__FLT_ABI (fabs) (x) < __FLT_LOGE2)
+    {
+      x /= __FLT_LOGE2;
+      __asm__ __volatile__ ("f2xm1" : "=t" (x) : "0" (x));
+      return x;
+    }
+  return __FLT_ABI (exp) (x) - __FLT_CST (1.0);
+}
diff --git a/winsup/cygwin/math/expm1l.c b/winsup/cygwin/math/expm1l.c
new file mode 100644 (file)
index 0000000..625fbb1
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "expm1.def.h"
diff --git a/winsup/cygwin/math/fabsl.c b/winsup/cygwin/math/fabsl.c
new file mode 100644 (file)
index 0000000..2dfdfaa
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double fabsl (long double x);
+
+long double
+fabsl (long double x)
+{
+#if defined(__x86_64__) || defined(_AMD64_) || defined(__i386__) || defined(_X86_)
+  long double res = 0.0L;
+  asm ("fabs;" : "=t" (res) : "0" (x));
+  return res;
+#elif defined(__arm__) || defined(_ARM_)
+  return __builtin_fabsl (x);
+#endif /* defined(__x86_64__) || defined(_AMD64_) || defined(__i386__) || defined(_X86_) */
+}
diff --git a/winsup/cygwin/math/fastmath.h b/winsup/cygwin/math/fastmath.h
new file mode 100644 (file)
index 0000000..a6bb467
--- /dev/null
@@ -0,0 +1,120 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _MINGWEX_FASTMATH_H_
+#define _MINGWEX_FASTMATH_H_
+
+/* Fast math inlines
+   No range or domain checks. No setting of errno.  No tweaks to
+   protect precision near range limits. */
+
+/* For now this is an internal header with just the functions that
+   are currently used in building libmingwex.a math components */
+
+/* FIXME: We really should get rid of the code duplication using euther
+   C++ templates or tgmath-type macros.  */  
+
+static __inline__ double __fast_sqrt (double x)
+{
+  double res;
+  asm __volatile__ ("fsqrt" : "=t" (res) : "0" (x));
+  return res;
+}
+
+static __inline__ long double __fast_sqrtl (long double x)
+{
+  long double res;
+  asm __volatile__ ("fsqrt" : "=t" (res) : "0" (x));
+  return res;
+}
+
+static __inline__ float __fast_sqrtf (float x)
+{
+  float res;
+  asm __volatile__ ("fsqrt" : "=t" (res) : "0" (x));
+  return res;
+}
+
+
+static __inline__ double __fast_log (double x)
+{
+   double res;
+   asm __volatile__
+     ("fldln2\n\t"
+      "fxch\n\t"
+      "fyl2x"
+       : "=t" (res) : "0" (x) : "st(1)");
+   return res;
+}
+
+static __inline__ long double __fast_logl (long double x)
+{
+  long double res;
+   asm __volatile__
+     ("fldln2\n\t"
+      "fxch\n\t"
+      "fyl2x"
+       : "=t" (res) : "0" (x) : "st(1)");
+   return res;
+}
+
+
+static __inline__ float __fast_logf (float x)
+{
+   float res;
+   asm __volatile__
+     ("fldln2\n\t"
+      "fxch\n\t"
+      "fyl2x"
+       : "=t" (res) : "0" (x) : "st(1)");
+   return res;
+}
+
+static __inline__ double __fast_log1p (double x)
+{
+  double res;
+  /* fyl2xp1 accurate only for |x| <= 1.0 - 0.5 * sqrt (2.0) */
+  if (fabs (x) >= 1.0 - 0.5 * 1.41421356237309504880)
+    res = __fast_log (1.0 + x);
+  else
+    asm __volatile__
+      ("fldln2\n\t"
+       "fxch\n\t"
+       "fyl2xp1"
+       : "=t" (res) : "0" (x) : "st(1)");
+   return res;
+}
+
+static __inline__ long double __fast_log1pl (long double x)
+{
+  long double res;
+  /* fyl2xp1 accurate only for |x| <= 1.0 - 0.5 * sqrt (2.0) */
+  if (fabsl (x) >= 1.0L - 0.5L * 1.41421356237309504880L)
+    res = __fast_logl (1.0L + x);
+  else
+    asm __volatile__
+      ("fldln2\n\t"
+       "fxch\n\t"
+       "fyl2xp1"
+       : "=t" (res) : "0" (x) : "st(1)");
+   return res;
+}
+
+static __inline__ float __fast_log1pf (float x)
+{
+  float res;
+  /* fyl2xp1 accurate only for |x| <= 1.0 - 0.5 * sqrt (2.0) */
+  if (fabsf (x) >= 1.0 - 0.5 * 1.41421356237309504880)
+    res = __fast_logf (1.0 + x);
+  else
+    asm __volatile__
+      ("fldln2\n\t"
+       "fxch\n\t"
+       "fyl2xp1"
+       : "=t" (res) : "0" (x) : "st(1)");
+   return res;
+}
+
+#endif
diff --git a/winsup/cygwin/math/fdiml.c b/winsup/cygwin/math/fdiml.c
new file mode 100644 (file)
index 0000000..3be0679
--- /dev/null
@@ -0,0 +1,24 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <errno.h>
+#include <math.h>
+
+long double
+fdiml (long double x, long double y)
+{
+  int cx = fpclassify (x), cy = fpclassify (y);
+  long double r;
+
+  if (cx == FP_NAN || cy == FP_NAN
+      || (y < 0 && cx == FP_INFINITE && cy == FP_INFINITE))
+    return x - y;  /* Take care invalid flag is raised.  */
+  if (x <= y)
+    return 0.0;
+  r = x - y;
+  if (fpclassify (r) == FP_INFINITE)
+    errno = ERANGE;
+  return r;
+}
diff --git a/winsup/cygwin/math/finite.c b/winsup/cygwin/math/finite.c
new file mode 100644 (file)
index 0000000..bcef72a
--- /dev/null
@@ -0,0 +1,19 @@
+#include <math.h>
+
+int
+finite (double x)
+{
+  return __builtin_isfinite (x);
+}
+
+int
+finitef (float x)
+{
+  return __builtin_isfinite (x);
+}
+
+int
+finitel (long double x)
+{
+  return __builtin_isfinite (x);
+}
diff --git a/winsup/cygwin/math/floorl.S b/winsup/cygwin/math/floorl.S
new file mode 100644 (file)
index 0000000..19ab3f0
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "floorl.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+       .globl __MINGW_USYMBOL(floorl)
+       .def    __MINGW_USYMBOL(floorl);        .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(floorl):
+#if defined(_AMD64_) || defined(__x86_64__)
+       fldt    (%rdx)
+       subq    $24,%rsp
+
+       fstcw   8(%rsp)                 /* store fpu control word */
+
+       /* We use here %edx although only the low 1 bits are defined.
+          But none of the operations should care and they are faster
+          than the 16 bit operations.  */
+       movl    $0x400,%edx             /* round towards -oo */
+       orl     8(%rsp),%edx
+       andl    $0xf7ff,%edx
+       movl    %edx,(%rsp)
+       fldcw   (%rsp)                  /* load modified control word */
+
+       frndint                         /* round */
+
+       fldcw   8(%rsp)                 /* restore original control word */
+
+       addq    $24,%rsp
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+#elif defined(_ARM_) || defined(__arm__)
+       vmrs    r1, fpscr
+       bic             r0, r1, #0x00c00000
+       orr             r0, r0, #0x00800000 /* Round towards Minus Infinity */
+       vmsr    fpscr, r0
+       vcvtr.s32.f64   s0, d0
+       vcvt.f64.s32    d0, s0
+       vmsr    fpscr, r1
+       bx      lr
+#elif defined(_X86_) || defined(__i386__)
+       fldt    4(%esp)
+       subl    $8,%esp
+
+       fstcw   4(%esp)                 /* store fpu control word */
+
+       /* We use here %edx although only the low 1 bits are defined.
+          But none of the operations should care and they are faster
+          than the 16 bit operations.  */
+       movl    $0x400,%edx             /* round towards -oo */
+       orl     4(%esp),%edx
+       andl    $0xf7ff,%edx
+       movl    %edx,(%esp)
+       fldcw   (%esp)                  /* load modified control word */
+
+       frndint                         /* round */
+
+       fldcw   4(%esp)                 /* restore original control word */
+
+       addl    $8,%esp
+       ret
+#endif
diff --git a/winsup/cygwin/math/fmal.c b/winsup/cygwin/math/fmal.c
new file mode 100644 (file)
index 0000000..3d0eb02
--- /dev/null
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double fmal ( long double _x,  long double _y,  long double _z);
+
+long double
+fmal ( long double _x,  long double _y,  long double _z)
+{
+  return ((_x * _y) + _z);
+}
diff --git a/winsup/cygwin/math/fmaxl.c b/winsup/cygwin/math/fmaxl.c
new file mode 100644 (file)
index 0000000..4ac6e21
--- /dev/null
@@ -0,0 +1,13 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long double
+fmaxl (long double _x, long double  _y)
+{
+  return (__builtin_isgreaterequal (_x, _y) || __builtin_isnan (_y))
+        ?  _x : _y;
+}
diff --git a/winsup/cygwin/math/fminl.c b/winsup/cygwin/math/fminl.c
new file mode 100644 (file)
index 0000000..0396a8e
--- /dev/null
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long double
+fminl (long double _x, long double _y)
+{
+  return ((__builtin_islessequal(_x, _y) || __builtin_isnan (_y)) ? _x : _y );
+}
diff --git a/winsup/cygwin/math/fmodl.c b/winsup/cygwin/math/fmodl.c
new file mode 100644 (file)
index 0000000..6224db1
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double fmodl (long double x, long double y);
+
+long double
+fmodl (long double x, long double y)
+{
+  long double res = 0.0L;
+
+  asm ("1:\tfprem\n\t"
+       "fstsw   %%ax\n\t"
+       "sahf\n\t"
+       "jp      1b\n\t"
+       "fstp    %%st(1)"
+       : "=t" (res) : "0" (x), "u" (y) : "ax", "st(1)");
+  return res;
+}
diff --git a/winsup/cygwin/math/frexpl.S b/winsup/cygwin/math/frexpl.S
new file mode 100644 (file)
index 0000000..f9fcc6b
--- /dev/null
@@ -0,0 +1,130 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+/*
+ * frexpl(long double x, int* expnt) extracts the exponent from x.
+ * It returns an integer power of two to expnt and the significand
+ * between 0.5 and 1 to y.  Thus  x = y * 2**expn.
+ */ 
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 2
+#endif
+.globl __MINGW_USYMBOL(frexpl)
+__MINGW_USYMBOL(frexpl):
+#ifdef __x86_64__
+       pushq %rbp
+       movq %rsp,%rbp
+       subq $48,%rsp
+       pushq %rsi
+       fldt (%rdx)
+       movq %rcx,%r9
+       fld %st(0)
+       fstpt -12(%rbp)
+       leaq -4(%rbp),%rcx
+       movw -4(%rbp),%dx
+       andl $32767,%edx
+       jne L25
+       fldz
+       fucompp
+       fnstsw %ax
+       andb $68,%ah
+       xorb $64,%ah
+       jne L21
+       movl $0,(%r8)
+       fldz
+       jmp L24
+       .align 4,0x90
+       .align 4,0x90
+L21:
+       fldt -12(%rbp)
+       fadd %st(0),%st
+       fstpt -12(%rbp)
+       decl %edx
+       movw (%rcx),%si
+       andl $32767,%esi
+       jne L22
+       cmpl $-66,%edx
+       jg L21
+L22:
+       add %esi,%edx
+       jmp L19
+       .align 2,0x90
+L25:
+       fstp %st(0)
+L19:
+       addl $-16382,%edx
+       movl %edx,(%r8)
+       movw (%rcx),%ax
+       andl $-32768,%eax
+       orl $16382,%eax
+       movw %ax,(%rcx)
+       fldt -12(%rbp)
+L24:
+       popq %rsi
+       movq    %r9,%rax
+       movq    $0,8(%r9)
+       fstpt   (%r9)
+       leave
+       ret
+#else
+       pushl %ebp
+       movl %esp,%ebp
+       subl $24,%esp
+       pushl %esi
+       pushl %ebx
+       fldt 8(%ebp)
+       movl 20(%ebp),%ebx
+       fld %st(0)
+       fstpt -12(%ebp)
+       leal -4(%ebp),%ecx
+       movw -4(%ebp),%dx
+       andl $32767,%edx
+       jne L25
+       fldz
+       fucompp
+       fnstsw %ax
+       andb $68,%ah
+       xorb $64,%ah
+       jne L21
+       movl $0,(%ebx)
+       fldz
+       jmp L24
+       .align 2,0x90
+       .align 2,0x90
+L21:
+       fldt -12(%ebp)
+       fadd %st(0),%st
+       fstpt -12(%ebp)
+       decl %edx
+       movw (%ecx),%si
+       andl $32767,%esi
+       jne L22
+       cmpl $-66,%edx
+       jg L21
+L22:
+       addl %esi,%edx
+       jmp L19
+       .align 2,0x90
+L25:
+       fstp %st(0)
+L19:
+       addl $-16382,%edx
+       movl %edx,(%ebx)
+       movw (%ecx),%ax
+       andl $-32768,%eax
+       orl $16382,%eax
+       movw %ax,(%ecx)
+       fldt -12(%ebp)
+L24:
+       leal -32(%ebp),%esp
+       popl %ebx
+       popl %esi
+       leave
+       ret
+#endif
diff --git a/winsup/cygwin/math/ilogbl.S b/winsup/cygwin/math/ilogbl.S
new file mode 100644 (file)
index 0000000..f68082c
--- /dev/null
@@ -0,0 +1,65 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "ilogbl.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(ilogbl)
+       .def    __MINGW_USYMBOL(ilogbl);        .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(ilogbl):
+#ifdef __x86_64__
+       fldt    (%rcx)
+       fxam                    /* Is NaN or +-Inf?  */
+       fstsw   %ax
+       movb    $0x45, %dh
+       andb    %ah, %dh
+       cmpb    $0x05, %dh
+       je      1f              /* Is +-Inf, jump.  */
+
+       fxtract
+       pushq   %rax
+       fstp    %st
+
+       fistpl  (%rsp)
+       fwait
+       popq    %rax
+
+       ret
+
+1:     fstp    %st
+       movl    $0x7fffffff, %eax
+       ret
+#else
+       fldt    4(%esp)
+/* I added the following ugly construct because ilogb(+-Inf) is
+   required to return INT_MAX in ISO C99.
+   -- jakub@redhat.com.  */
+       fxam                    /* Is NaN or +-Inf?  */
+       fstsw   %ax
+       movb    $0x45, %dh
+       andb    %ah, %dh
+       cmpb    $0x05, %dh
+       je      1f              /* Is +-Inf, jump.  */
+
+       fxtract
+       pushl   %eax
+       fstp    %st
+
+       fistpl  (%esp)
+       fwait
+       popl    %eax
+
+       ret
+
+1:     fstp    %st
+       movl    $0x7fffffff, %eax
+       ret
+#endif
diff --git a/winsup/cygwin/math/internal_logl.S b/winsup/cygwin/math/internal_logl.S
new file mode 100644 (file)
index 0000000..f8a0757
--- /dev/null
@@ -0,0 +1,66 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "internal_logl.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+one:   .double 1.0
+       /* It is not important that this constant is precise.  It is only
+          a value which is known to be on the safe side for using the
+          fyl2xp1 instruction.  */
+limit: .double 0.29
+
+.globl __MINGW_USYMBOL(__logl_internal)
+       .def    __MINGW_USYMBOL(__logl_internal);       .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(__logl_internal):
+#ifdef __x86_64__
+       fldln2                  // log(2)
+       fldt    (%rdx)          // x : log(2)
+       fld     %st             // x : x : log(2)
+       fsubl   one(%rip)       // x-1 : x : log(2)
+       fld     %st             // x-1 : x-1 : x : log(2)
+       fabs                    // |x-1| : x-1 : x : log(2)
+       fcompl  limit(%rip)     // x-1 : x : log(2)
+       fnstsw                  // x-1 : x : log(2)
+       andb    $0x45, %ah
+       jz      2f
+       fstp    %st(1)          // x-1 : log(2)
+       fyl2xp1                 // log(x)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+
+2:     fstp    %st(0)          // x : log(2)
+       fyl2x                   // log(x)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+#else
+       fldln2                  // log(2)
+       fldt    4(%esp)         // x : log(2)
+       fld     %st             // x : x : log(2)
+       fsubl   one             // x-1 : x : log(2)
+       fld     %st             // x-1 : x-1 : x : log(2)
+       fabs                    // |x-1| : x-1 : x : log(2)
+       fcompl  limit           // x-1 : x : log(2)
+       fnstsw                  // x-1 : x : log(2)
+       andb    $0x45, %ah
+       jz      2f
+       fstp    %st(1)          // x-1 : log(2)
+       fyl2xp1                 // log(x)
+       ret
+
+2:     fstp    %st(0)          // x : log(2)
+       fyl2x                   // log(x)
+       ret
+#endif
diff --git a/winsup/cygwin/math/isinf.c b/winsup/cygwin/math/isinf.c
new file mode 100644 (file)
index 0000000..e7d3e26
--- /dev/null
@@ -0,0 +1,18 @@
+int
+isinf (double x)
+{
+  return __builtin_isinf (x);
+}
+
+int
+isinff (float x)
+{
+  return __builtin_isinf (x);
+}
+
+int
+isinfl (long double x)
+{
+  return __builtin_isinf (x);
+}
+
diff --git a/winsup/cygwin/math/isnan.c b/winsup/cygwin/math/isnan.c
new file mode 100644 (file)
index 0000000..ac68bef
--- /dev/null
@@ -0,0 +1,18 @@
+int
+isnan (double x)
+{
+  return __builtin_isnan (x);
+}
+
+int
+isnanf (float x)
+{
+  return __builtin_isnan (x);
+}
+
+int
+isnanl (long double x)
+{
+  return __builtin_isnan (x);
+}
+
diff --git a/winsup/cygwin/math/ldexpl.c b/winsup/cygwin/math/ldexpl.c
new file mode 100644 (file)
index 0000000..fde31a2
--- /dev/null
@@ -0,0 +1,23 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+
+long double ldexpl(long double x, int expn)
+{
+  long double res = 0.0L;
+  if (!isfinite (x) || x == 0.0L)
+    return x;
+
+  __asm__ __volatile__ ("fscale"
+           : "=t" (res)
+           : "0" (x), "u" ((long double) expn));
+
+  if (!isfinite (res) || res == 0.0L)
+    errno = ERANGE;
+
+  return res;
+}
diff --git a/winsup/cygwin/math/lgammal.c b/winsup/cygwin/math/lgammal.c
new file mode 100644 (file)
index 0000000..03c030e
--- /dev/null
@@ -0,0 +1,342 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+
+#if UNK
+static uLD S[9] = {
+  { { -1.193945051381510095614E-3L } },
+  { {  7.220599478036909672331E-3L } },
+  { { -9.622023360406271645744E-3L } },
+  { { -4.219773360705915470089E-2L } },
+  { {  1.665386113720805206758E-1L } },
+  { { -4.200263503403344054473E-2L } },
+  { { -6.558780715202540684668E-1L } },
+  { {  5.772156649015328608253E-1L } },
+  { {  1.000000000000000000000E0L } }
+};
+#endif
+#if IBMPC
+static const uLD S[] = {
+  { { 0xbaeb,0xd6d3,0x25e5,0x9c7e,0xbff5, 0, 0, 0 } },
+  { { 0xfe9a,0xceb4,0xc74e,0xec9a,0x3ff7, 0, 0, 0 } },
+  { { 0x9225,0xdfef,0xb0e9,0x9da5,0xbff8, 0, 0, 0 } },
+  { { 0x10b0,0xec17,0x87dc,0xacd7,0xbffa, 0, 0, 0 } },
+  { { 0x6b8d,0x7515,0x1905,0xaa89,0x3ffc, 0, 0, 0 } },
+  { { 0xf183,0x126b,0xf47d,0xac0a,0xbffa, 0, 0, 0 } },
+  { { 0x7bf6,0x57d1,0xa013,0xa7e7,0xbffe, 0, 0, 0 } },
+  { { 0xc7a9,0x7db0,0x67e3,0x93c4,0x3ffe, 0, 0, 0 } },
+  { { 0x0000,0x0000,0x0000,0x8000,0x3fff, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static uLD S[27] = {
+  { { 0xbff50000,0x9c7e25e5,0xd6d3baeb, 0 } },
+  { { 0x3ff70000,0xec9ac74e,0xceb4fe9a, 0 } },
+  { { 0xbff80000,0x9da5b0e9,0xdfef9225, 0 } },
+  { { 0xbffa0000,0xacd787dc,0xec1710b0, 0 } },
+  { { 0x3ffc0000,0xaa891905,0x75156b8d, 0 } },
+  { { 0xbffa0000,0xac0af47d,0x126bf183, 0 } },
+  { { 0xbffe0000,0xa7e7a013,0x57d17bf6, 0 } },
+  { { 0x3ffe0000,0x93c467e3,0x7db0c7a9, 0 } },
+  { { 0x3fff0000,0x80000000,0x00000000, 0 } }
+};
+#endif
+
+#if UNK
+static uLD SN[9] = {
+  { {  1.133374167243894382010E-3L } },
+  { {  7.220837261893170325704E-3L } },
+  { {  9.621911155035976733706E-3L } },
+  { { -4.219773343731191721664E-2L } },
+  { { -1.665386113944413519335E-1L } },
+  { { -4.200263503402112910504E-2L } },
+  { {  6.558780715202536547116E-1L } },
+  { {  5.772156649015328608727E-1L } },
+  { { -1.000000000000000000000E0L } }
+};
+#endif
+#if IBMPC
+static const uLD SN[] = {
+  { { 0x5dd1,0x02de,0xb9f7,0x948d,0x3ff5, 0, 0, 0 } },
+  { { 0x989b,0xdd68,0xc5f1,0xec9c,0x3ff7, 0, 0, 0 } },
+  { { 0x2ca1,0x18f0,0x386f,0x9da5,0x3ff8, 0, 0, 0 } },
+  { { 0x783f,0x41dd,0x87d1,0xacd7,0xbffa, 0, 0, 0 } },
+  { { 0x7a5b,0xd76d,0x1905,0xaa89,0xbffc, 0, 0, 0 } },
+  { { 0x7f64,0x1234,0xf47d,0xac0a,0xbffa, 0, 0, 0 } },
+  { { 0x5e26,0x57d1,0xa013,0xa7e7,0x3ffe, 0, 0, 0 } },
+  { { 0xc7aa,0x7db0,0x67e3,0x93c4,0x3ffe, 0, 0, 0 } },
+  { { 0x0000,0x0000,0x0000,0x8000,0xbfff, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static uLD SN[] = {
+  { { 0x3ff50000,0x948db9f7,0x02de5dd1, 0 } },
+  { { 0x3ff70000,0xec9cc5f1,0xdd68989b, 0 } },
+  { { 0x3ff80000,0x9da5386f,0x18f02ca1, 0 } },
+  { { 0xbffa0000,0xacd787d1,0x41dd783f, 0 } },
+  { { 0xbffc0000,0xaa891905,0xd76d7a5b, 0 } },
+  { { 0xbffa0000,0xac0af47d,0x12347f64, 0 } },
+  { { 0x3ffe0000,0xa7e7a013,0x57d15e26, 0 } },
+  { { 0x3ffe0000,0x93c467e3,0x7db0c7aa, 0 } },
+  { { 0xbfff0000,0x80000000,0x00000000, 0 } }
+};
+#endif
+
+
+/* A[]: Stirling's formula expansion of log gamma
+ * B[], C[]: log gamma function between 2 and 3
+ */
+
+
+/* log gamma(x) = ( x - 0.5 ) * log(x) - x + LS2PI + 1/x A(1/x^2)
+ * x >= 8
+ * Peak relative error 1.51e-21
+ * Relative spread of error peaks 5.67e-21
+ */
+#if UNK
+static uLD A[7] = {
+  { {  4.885026142432270781165E-3L } },
+  { { -1.880801938119376907179E-3L } },
+  { {  8.412723297322498080632E-4L } },
+  { { -5.952345851765688514613E-4L } },
+  { {  7.936507795855070755671E-4L } },
+  { { -2.777777777750349603440E-3L } },
+  { {  8.333333333333331447505E-2L } }
+};
+#endif
+#if IBMPC
+static const uLD A[] = {
+  { { 0xd984,0xcc08,0x91c2,0xa012,0x3ff7, 0, 0, 0 } },
+  { { 0x3d91,0x0304,0x3da1,0xf685,0xbff5, 0, 0, 0 } },
+  { { 0x3bdc,0xaad1,0xd492,0xdc88,0x3ff4, 0, 0, 0 } },
+  { { 0x8b20,0x9fce,0x844e,0x9c09,0xbff4, 0, 0, 0 } },
+  { { 0xf8f2,0x30e5,0x0092,0xd00d,0x3ff4, 0, 0, 0 } },
+  { { 0x4d88,0x03a8,0x60b6,0xb60b,0xbff6, 0, 0, 0 } },
+  { { 0x9fcc,0xaaaa,0xaaaa,0xaaaa,0x3ffb, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static uLD A[] = {
+  { { 0x3ff70000,0xa01291c2,0xcc08d984, 0 } },
+  { { 0xbff50000,0xf6853da1,0x03043d91, 0 } },
+  { { 0x3ff40000,0xdc88d492,0xaad13bdc, 0 } },
+  { { 0xbff40000,0x9c09844e,0x9fce8b20, 0 } },
+  { { 0x3ff40000,0xd00d0092,0x30e5f8f2, 0 } },
+  { { 0xbff60000,0xb60b60b6,0x03a84d88, 0 } },
+  { { 0x3ffb0000,0xaaaaaaaa,0xaaaa9fcc, 0 } }
+};
+#endif
+
+/* log gamma(x+2) = x B(x)/C(x)
+ * 0 <= x <= 1
+ * Peak relative error 7.16e-22
+ * Relative spread of error peaks 4.78e-20
+ */
+#if UNK
+static uLD B[7] = {
+  { { -2.163690827643812857640E3L } },
+  { { -8.723871522843511459790E4L } },
+  { { -1.104326814691464261197E6L } },
+  { { -6.111225012005214299996E6L } },
+  { { -1.625568062543700591014E7L } },
+  { { -2.003937418103815175475E7L } },
+  { { -8.875666783650703802159E6L } }
+};
+static uLD C[7] = {
+  { { -5.139481484435370143617E2L } },
+  { { -3.403570840534304670537E4L } },
+  { { -6.227441164066219501697E5L } },
+  { { -4.814940379411882186630E6L } },
+  { { -1.785433287045078156959E7L } },
+  { { -3.138646407656182662088E7L } },
+  { { -2.099336717757895876142E7L } }
+};
+#endif
+#if IBMPC
+static const uLD B[] = {
+  { { 0x9557,0x4995,0x0da1,0x873b,0xc00a, 0, 0, 0 } },
+  { { 0xfe44,0x9af8,0x5b8c,0xaa63,0xc00f, 0, 0, 0 } },
+  { { 0x5aa8,0x7cf5,0x3684,0x86ce,0xc013, 0, 0, 0 } },
+  { { 0x259a,0x258c,0xf206,0xba7f,0xc015, 0, 0, 0 } },
+  { { 0xbe18,0x1ca3,0xc0a0,0xf80a,0xc016, 0, 0, 0 } },
+  { { 0x168f,0x2c42,0x6717,0x98e3,0xc017, 0, 0, 0 } },
+  { { 0x2051,0x9d55,0x92c8,0x876e,0xc016, 0, 0, 0 } }
+};
+static const uLD C[] = {
+  { { 0xaa77,0xcf2f,0xae76,0x807c,0xc008, 0, 0, 0 } },
+  { { 0xb280,0x0d74,0xb55a,0x84f3,0xc00e, 0, 0, 0 } },
+  { { 0xa505,0xcd30,0x81dc,0x9809,0xc012, 0, 0, 0 } },
+  { { 0x3369,0x4246,0xb8c2,0x92f0,0xc015, 0, 0, 0 } },
+  { { 0x63cf,0x6aee,0xbe6f,0x8837,0xc017, 0, 0, 0 } },
+  { { 0x26bb,0xccc7,0xb009,0xef75,0xc017, 0, 0, 0 } },
+  { { 0x462b,0xbae8,0xab96,0xa02a,0xc017, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static uLD B[] = {
+  { { 0xc00a0000,0x873b0da1,0x49959557, 0 } },
+  { { 0xc00f0000,0xaa635b8c,0x9af8fe44, 0 } },
+  { { 0xc0130000,0x86ce3684,0x7cf55aa8, 0 } },
+  { { 0xc0150000,0xba7ff206,0x258c259a, 0 } },
+  { { 0xc0160000,0xf80ac0a0,0x1ca3be18, 0 } },
+  { { 0xc0170000,0x98e36717,0x2c42168f, 0 } },
+  { { 0xc0160000,0x876e92c8,0x9d552051, 0 } }
+};
+static uLD C[] = {
+  { { 0xc0080000,0x807cae76,0xcf2faa77, 0 } },
+  { { 0xc00e0000,0x84f3b55a,0x0d74b280, 0 } },
+  { { 0xc0120000,0x980981dc,0xcd30a505, 0 } },
+  { { 0xc0150000,0x92f0b8c2,0x42463369, 0 } },
+  { { 0xc0170000,0x8837be6f,0x6aee63cf, 0 } },
+  { { 0xc0170000,0xef75b009,0xccc726bb, 0 } },
+  { { 0xc0170000,0xa02aab96,0xbae8462b, 0 } }
+};
+#endif
+
+/* log( sqrt( 2*pi ) ) */
+static const long double LS2PI  =  0.91893853320467274178L;
+#if defined(__arm__) || defined(_ARM_)
+#define MAXLGM 2.035093e36
+#else
+#define MAXLGM 1.04848146839019521116e+4928L
+#endif /* defined(__arm__) || defined(_ARM_) */
+
+/* Logarithm of gamma function */
+/* Reentrant version */ 
+long double __lgammal_r(long double x, int* sgngaml);
+
+long double __lgammal_r(long double x, int* sgngaml)
+{
+       long double p, q, w, z, f, nx;
+       int i;
+
+       *sgngaml = 1;
+#ifdef NANS
+       if (isnanl(x))
+               return(NANL);
+#endif
+#ifdef INFINITIES
+       if (!isfinitel(x))
+               return (INFINITYL);
+#endif
+       if (x < -34.0L)
+       {
+               q = -x;
+               w = __lgammal_r(q, sgngaml); /* note this modifies sgngam! */
+               p = floorl(q);
+               if (p == q)
+               {
+lgsing:
+                       _SET_ERRNO(EDOM);
+                       mtherr( "lgammal", SING );
+#ifdef INFINITIES
+                       return (INFINITYL);
+#else
+                       return (MAXNUML);
+#endif
+               }
+               i = p;
+               if ((i & 1) == 0)
+                       *sgngaml = -1;
+               else
+                       *sgngaml = 1;
+               z = q - p;
+               if (z > 0.5L)
+               {
+                       p += 1.0L;
+                       z = p - q;
+               }
+               z = q * sinl(PIL * z);
+               if (z == 0.0L)
+                       goto lgsing;
+       /*      z = LOGPI - logl( z ) - w; */
+               z = logl(PIL/z) - w;
+               return (z);
+       }
+
+       if (x < 13.0L)
+       {
+               z = 1.0L;
+               nx = floorl(x +  0.5L);
+               f = x - nx;
+               while (x >= 3.0L)
+               {
+                       nx -= 1.0L;
+                       x = nx + f;
+                       z *= x;
+               }
+               while (x < 2.0L)
+               {
+                       if (fabsl(x) <= 0.03125)
+                               goto lsmall;
+                       z /= nx +  f;
+                       nx += 1.0L;
+                       x = nx + f;
+               }
+               if (z < 0.0L)
+               {
+                       *sgngaml = -1;
+                       z = -z;
+               }
+               else
+                       *sgngaml = 1;
+               if (x == 2.0L)
+                       return ( logl(z) );
+               x = (nx - 2.0L) + f;
+               p = x * polevll(x, B, 6) / p1evll(x, C, 7);
+               return ( logl(z) + p );
+       }
+
+       if (x > MAXLGM)
+       {
+               _SET_ERRNO(ERANGE);
+               mtherr("lgammal", OVERFLOW);
+#ifdef INFINITIES
+               return (*sgngaml * INFINITYL);
+#else
+               return (*sgngaml * MAXNUML);
+#endif
+       }
+
+       q = (x - 0.5L) * logl(x) - x + LS2PI;
+       if (x > 1.0e10L)
+               return(q);
+       p = 1.0L/(x*x);
+       q += polevll(p, A, 6) / x;
+       return (q);
+
+lsmall:
+       if (x == 0.0L)
+               goto lgsing;
+       if (x < 0.0L)
+       {
+               x = -x;
+               q = z / (x * polevll(x, SN, 8));
+       }
+       else
+               q = z / (x * polevll(x, S, 8));
+       if (q < 0.0L)
+       {
+               *sgngaml = -1;
+               q = -q;
+       }
+       else
+               *sgngaml = 1;
+       q = logl(q);
+       return (q);
+}
+
+/* This is the C99 version */
+long double lgammal(long double x)
+{
+       return (__lgammal_r (x, &signgam));
+}
+
+long double lgammal_r(long double x, int *signp)
+{
+       return (__lgammal_r (x, signp));
+}
+
diff --git a/winsup/cygwin/math/llrint.c b/winsup/cygwin/math/llrint.c
new file mode 100644 (file)
index 0000000..1fc11e8
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long long llrint (double x) 
+{
+  long long retval = 0ll;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+  __asm__ __volatile__ ("fistpll %0"  : "=m" (retval) : "t" (x) : "st");
+#else
+  retval = (long long)x;
+#endif
+  return retval;
+}
+
diff --git a/winsup/cygwin/math/llrintf.c b/winsup/cygwin/math/llrintf.c
new file mode 100644 (file)
index 0000000..aabd81f
--- /dev/null
@@ -0,0 +1,17 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long long llrintf (float x) 
+{
+  long long retval = 0ll;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+  __asm__ __volatile__ ("fistpll %0"  : "=m" (retval) : "t" (x) : "st");
+#else
+  retval = (long long)x;
+#endif
+  return retval;
+}
diff --git a/winsup/cygwin/math/llrintl.c b/winsup/cygwin/math/llrintl.c
new file mode 100644 (file)
index 0000000..59ace2d
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long long llrintl (long double x) 
+{
+  long long retval = 0ll;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+  __asm__ __volatile__ ("fistpll %0"  : "=m" (retval) : "t" (x) : "st");
+#else
+  retval = (long long)x;
+#endif
+  return retval;
+}
+
diff --git a/winsup/cygwin/math/llroundl.c b/winsup/cygwin/math/llroundl.c
new file mode 100644 (file)
index 0000000..fc600e7
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <limits.h>
+#include <errno.h>
+
+long long
+llroundl (long double x)
+{
+  long double res;
+
+  if (x >= 0.0L)
+    {
+      res = ceill (x);
+      if (res - x > 0.5L)
+        res -= 1.0L;
+    }
+  else
+    {
+      res = ceill (-x);
+      if (res + x > 0.5L)
+        res -= 1.0L;
+      res = -res;
+    }
+  if (!isfinite (res)
+      || res > (double) LLONG_MAX
+      || res < (double) LLONG_MIN)
+    {
+      errno = ERANGE;
+      /* Undefined behaviour, so we could return anything.  */
+      /* return res > 0.0 ? LLONG_MAX : LLONG_MIN;  */
+    }
+  return (long long) res;
+}
+
diff --git a/winsup/cygwin/math/log.def.h b/winsup/cygwin/math/log.def.h
new file mode 100644 (file)
index 0000000..94a7700
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "complex_internal.h"
+#include <errno.h>
+
+extern long double __cdecl __logl_internal (long double);
+
+__FLT_TYPE __cdecl
+__FLT_ABI(log) (__FLT_TYPE x)
+{
+  int x_class = fpclassify (x);
+  if (x_class == FP_ZERO)
+    {
+      __FLT_RPT_ERANGE ("log", x, 0.0, -__FLT_HUGE_VAL, 1);
+      return -__FLT_HUGE_VAL;
+    }
+  else if (signbit (x))
+    {
+      __FLT_RPT_DOMAIN ("log", x, 0.0, __FLT_NAN);
+      return __FLT_NAN;
+    }
+  else if (x_class == FP_INFINITE)
+    return __FLT_HUGE_VAL;
+  else if (x_class == FP_NAN)
+    return __FLT_NAN;
+  return (__FLT_TYPE) __logl_internal ((long double) x);
+}
diff --git a/winsup/cygwin/math/log10l.S b/winsup/cygwin/math/log10l.S
new file mode 100644 (file)
index 0000000..33d45a3
--- /dev/null
@@ -0,0 +1,93 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "log10l.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+one:   .double 1.0
+       /* It is not important that this constant is precise.  It is only
+          a value which is known to be on the safe side for using the
+          fyl2xp1 instruction.  */
+limit: .double 0.29
+
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(log10l)
+       .def    __MINGW_USYMBOL(log10l);        .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(log10l):
+#ifdef __x86_64__
+       fldlg2                  // log10(2)
+       fldt    (%rdx)          // x : log10(2)
+       fxam
+       fnstsw
+       fld     %st             // x : x : log10(2)
+       sahf
+       jc      3f              // in case x is NaN or Â±Inf
+4:     fsubl   one(%rip)       // x-1 : x : log10(2)
+       fld     %st             // x-1 : x-1 : x : log10(2)
+       fabs                    // |x-1| : x-1 : x : log10(2)
+       fcompl  limit(%rip)     // x-1 : x : log10(2)
+       fnstsw                  // x-1 : x : log10(2)
+       andb    $0x45, %ah
+       jz      2f
+       fstp    %st(1)          // x-1 : log10(2)
+       fyl2xp1                 // log10(x)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+
+2:     fstp    %st(0)          // x : log10(2)
+       fyl2x                   // log10(x)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+
+3:     jp      4b              // in case x is Â±Inf
+       fstp    %st(1)
+       fstp    %st(1)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+#else
+       fldlg2                  // log10(2)
+       fldt    4(%esp)         // x : log10(2)
+       fxam
+       fnstsw
+       fld     %st             // x : x : log10(2)
+       sahf
+       jc      3f              // in case x is NaN or Â±Inf
+4:     fsubl   one             // x-1 : x : log10(2)
+       fld     %st             // x-1 : x-1 : x : log10(2)
+       fabs                    // |x-1| : x-1 : x : log10(2)
+       fcompl  limit           // x-1 : x : log10(2)
+       fnstsw                  // x-1 : x : log10(2)
+       andb    $0x45, %ah
+       jz      2f
+       fstp    %st(1)          // x-1 : log10(2)
+       fyl2xp1                 // log10(x)
+       ret
+
+2:     fstp    %st(0)          // x : log10(2)
+       fyl2x                   // log10(x)
+       ret
+
+3:     jp      4b              // in case x is Â±Inf
+       fstp    %st(1)
+       fstp    %st(1)
+       ret
+#endif
diff --git a/winsup/cygwin/math/log1pl.S b/winsup/cygwin/math/log1pl.S
new file mode 100644 (file)
index 0000000..a56bcf4
--- /dev/null
@@ -0,0 +1,102 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "log1pl.S"
+       .text
+       /* The fyl2xp1 can only be used for values in
+          -1 + sqrt(2) / 2 <= x <= 1 - sqrt(2) / 2
+          0.29 is a safe value.
+        */
+
+       /* Only gcc understands the .tfloat type
+          The series of .long below represents
+          limit:       .tfloat 0.29
+        */
+       .align 16
+limit:
+       .long 2920577761
+       .long 2491081031
+       .long 16381
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+       /* Please note:  we use a double value here.  Since 1.0 has
+          an exact representation this does not effect the accuracy
+          but it helps to optimize the code.  */
+one:   .double 1.0
+
+/*
+ * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29,
+ * otherwise fyl2x with the needed extra computation.
+ */
+.globl __MINGW_USYMBOL(log1pl)
+       .def    __MINGW_USYMBOL(log1pl);        .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(log1pl):
+#ifdef __x86_64__
+       fldln2
+       fldt    (%rdx)
+       fxam
+       fnstsw
+       fld     %st
+       sahf
+       jc      3f              // in case x is NaN or Â±Inf
+4:
+       fabs
+       fldt    limit(%rip)
+       fcompp
+       fnstsw
+       sahf
+       jnc     2f
+       faddl   one(%rip)
+       fyl2x
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+
+2:     fyl2xp1
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+
+3:     jp      4b              // in case x is Â±Inf
+       fstp    %st(1)
+       fstp    %st(1)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+#else
+       fldln2
+       fldt    4(%esp)
+       fxam
+       fnstsw
+       fld     %st
+       sahf
+       jc      3f              // in case x is NaN or Â±Inf
+4:
+       fabs
+       fldt    limit
+       fcompp
+       fnstsw
+       sahf
+       jnc     2f
+       faddl   one
+       fyl2x
+       ret
+
+2:     fyl2xp1
+       ret
+
+3:     jp      4b              // in case x is Â±Inf
+       fstp    %st(1)
+       fstp    %st(1)
+       ret
+#endif
diff --git a/winsup/cygwin/math/log2l.S b/winsup/cygwin/math/log2l.S
new file mode 100644 (file)
index 0000000..771cd8a
--- /dev/null
@@ -0,0 +1,87 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "log2l.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+one:   .double 1.0
+       /* It is not important that this constant is precise.  It is only
+          a value which is known to be on the safe side for using the
+          fyl2xp1 instruction.  */
+limit: .double 0.29
+
+.globl __MINGW_USYMBOL(log2l)
+       .def    __MINGW_USYMBOL(log2l); .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(log2l):
+#ifdef __x86_64__
+       fldl    one(%rip)
+       fldt    (%rdx)          // x : 1
+       fxam
+       fnstsw
+       fld     %st             // x : x : 1
+       sahf
+       jc      3f              // in case x is NaN or Â±Inf
+4:     fsub    %st(2), %st     // x-1 : x : 1
+       fld     %st             // x-1 : x-1 : x : 1
+       fabs                    // |x-1| : x-1 : x : 1
+       fcompl  limit(%rip)     // x-1 : x : 1
+       fnstsw                  // x-1 : x : 1
+       andb    $0x45, %ah
+       jz      2f
+       fstp    %st(1)          // x-1 : 1
+       fyl2xp1                 // log(x)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+
+2:     fstp    %st(0)          // x : 1
+       fyl2x                   // log(x)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+
+3:     jp      4b              // in case x is Â±Inf
+       fstp    %st(1)
+       fstp    %st(1)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+#else
+       fldl    one
+       fldt    4(%esp)         // x : 1
+       fxam
+       fnstsw
+       fld     %st             // x : x : 1
+       sahf
+       jc      3f              // in case x is NaN or Â±Inf
+4:     fsub    %st(2), %st     // x-1 : x : 1
+       fld     %st             // x-1 : x-1 : x : 1
+       fabs                    // |x-1| : x-1 : x : 1
+       fcompl  limit           // x-1 : x : 1
+       fnstsw                  // x-1 : x : 1
+       andb    $0x45, %ah
+       jz      2f
+       fstp    %st(1)          // x-1 : 1
+       fyl2xp1                 // log(x)
+       ret
+
+2:     fstp    %st(0)          // x : 1
+       fyl2x                   // log(x)
+       ret
+
+3:     jp      4b              // in case x is Â±Inf
+       fstp    %st(1)
+       fstp    %st(1)
+       ret
+#endif
diff --git a/winsup/cygwin/math/logbl.c b/winsup/cygwin/math/logbl.c
new file mode 100644 (file)
index 0000000..310c445
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Changes for long double by Ulrich Drepper <drepper@cygnus.com>
+ * Public domain.
+ */
+
+#include <math.h>
+
+long double
+logbl (long double x)
+{
+  long double res = 0.0L;
+
+  asm ("fxtract\n\t"
+       "fstp   %%st" : "=t" (res) : "0" (x));
+  return res;
+}
diff --git a/winsup/cygwin/math/logl.c b/winsup/cygwin/math/logl.c
new file mode 100644 (file)
index 0000000..a0fa386
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "log.def.h"
diff --git a/winsup/cygwin/math/lrint.c b/winsup/cygwin/math/lrint.c
new file mode 100644 (file)
index 0000000..0409da6
--- /dev/null
@@ -0,0 +1,30 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+#if defined(__arm__) || defined(_ARM_)
+/* This works around a compiler bug */
+long __lrint_internal( double x );
+asm(".def __lrint_internal; .scl 2; .type 32; .endef\n"
+    "\t.text\n"
+    "\t.align 4\n"
+    "\t.globl __lrint_internal\n"
+    "__lrint_internal:\n"
+    "\tvcvtr.s32.f64    s0, d0\n"
+    "\tfmrs             r0, s0\n"
+    "\tbx lr");
+#endif /* defined(__arm__) || defined(_ARM_) */
+
+long lrint (double x) 
+{
+  long retval = 0L;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+  __asm__ __volatile__ ("fistpl %0"  : "=m" (retval) : "t" (x) : "st");
+#elif defined(__arm__) || defined(_ARM_)
+    retval = __lrint_internal(x);
+#endif
+  return retval;
+}
diff --git a/winsup/cygwin/math/lrintf.c b/winsup/cygwin/math/lrintf.c
new file mode 100644 (file)
index 0000000..2b6d893
--- /dev/null
@@ -0,0 +1,30 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+#if defined(__arm__) || defined(_ARM_)
+/* This works around a compiler bug */
+long __lrintf_internal( float x );
+asm(".def __lrintf_internal; .scl 2; .type 32; .endef\n"
+    "\t.text\n"
+    "\t.align 4\n"
+    "\t.globl __lrintf_internal\n"
+    "__lrintf_internal:\n"
+    "\tvcvtr.s32.f32    s0, s0\n"
+    "\tfmrs             r0, s0\n"
+    "\tbx lr");
+#endif /* defined(__arm__) || defined(_ARM_) */
+
+long lrintf (float x) 
+{
+  long retval = 0l;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+  __asm__ __volatile__ ("fistpl %0"  : "=m" (retval) : "t" (x) : "st");
+#elif defined(__arm__) || defined(_ARM_)
+    retval = __lrintf_internal(x);
+#endif
+  return retval;
+}
diff --git a/winsup/cygwin/math/lrintl.c b/winsup/cygwin/math/lrintl.c
new file mode 100644 (file)
index 0000000..94c4e49
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long lrintl (long double x) 
+{
+  long retval = 0l;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+  __asm__ __volatile__ ("fistpl %0"  : "=m" (retval) : "t" (x) : "st");
+#elif defined(__arm__) || defined(_ARM_)
+    retval = lrint(x);
+#endif
+  return retval;
+}
+
diff --git a/winsup/cygwin/math/lroundl.c b/winsup/cygwin/math/lroundl.c
new file mode 100644 (file)
index 0000000..b4584a8
--- /dev/null
@@ -0,0 +1,37 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <limits.h>
+#include <errno.h>
+
+long
+lroundl (long double x)
+{
+  long double res;
+
+  if (x >= 0.0L)
+    {
+      res = ceill (x);
+      if (res - x > 0.5L)
+       res -= 1.0;
+    }
+  else
+    {
+      res = ceill (-x);
+      if (res + x > 0.5L)
+       res -= 1.0L;
+      res = -res;
+    }
+  if (!isfinite (res)
+      || res > (long double)LONG_MAX
+      || res < (long double)LONG_MIN)
+    {
+      errno = ERANGE;
+      /* Undefined behaviour, so we could return anything.  */
+      /* return res > 0.0L ? LONG_MAX : LONG_MIN;  */
+    }
+  return (long) res;
+}
diff --git a/winsup/cygwin/math/modfl.c b/winsup/cygwin/math/modfl.c
new file mode 100644 (file)
index 0000000..af75a8b
--- /dev/null
@@ -0,0 +1,41 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+#include <math.h>
+#include <errno.h>
+
+long double
+modfl (long double value, long double* iptr)
+{
+  long double int_part = 0.0L;
+  /* truncate */
+#if defined(_AMD64_) || defined(__x86_64__)
+  asm ("subq $8, %%rsp\n"
+    "fnstcw 4(%%rsp)\n"
+    "movzwl 4(%%rsp), %%eax\n"
+    "orb $12, %%ah\n"
+    "movw %%ax, (%%rsp)\n"
+    "fldcw (%%rsp)\n"
+    "frndint\n"
+    "fldcw 4(%%rsp)\n"
+    "addq $8, %%rsp\n" : "=t" (int_part) : "0" (value)); /* round */
+#elif defined(_X86_) || defined(__i386__)
+  asm ("push %%eax\n\tsubl $8, %%esp\n"
+    "fnstcw 4(%%esp)\n"
+    "movzwl 4(%%esp), %%eax\n"
+    "orb $12, %%ah\n"
+    "movw %%ax, (%%esp)\n"
+    "fldcw (%%esp)\n"
+    "frndint\n"
+    "fldcw 4(%%esp)\n"
+    "addl $8, %%esp\n\tpop %%eax\n" : "=t" (int_part) : "0" (value)); /* round */
+#else
+  int_part = truncl(value);
+#endif
+  if (iptr)
+    *iptr = int_part;
+  return (isinf (value) ?  0.0L : value - int_part);
+}
diff --git a/winsup/cygwin/math/nearbyint.S b/winsup/cygwin/math/nearbyint.S
new file mode 100644 (file)
index 0000000..8aec9bd
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "nearbyint.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+       .globl __MINGW_USYMBOL(nearbyint)
+       .def    __MINGW_USYMBOL(nearbyint);     .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(nearbyint):
+#if defined(_AMD64_) || defined(__x86_64__)
+       movsd   %xmm0,-16(%rsp)
+       fldl    -16(%rsp)
+       pushq   %rax
+       pushq   %rcx
+       fnstcw  (%rsp)
+       movq    (%rsp), %rax
+       orq     $0x20, %rax
+       movq    %rax, 8(%rsp)
+       fldcw   8(%rsp)
+       frndint
+       fclex
+       fldcw   (%rsp)
+       popq    %rcx
+       popq    %rax
+       fstpl   -16(%rsp)
+       movsd   -16(%rsp),%xmm0
+       ret
+#elif defined(_ARM_) || defined(__arm__)
+       vmrs    r1, fpscr
+       vcvtr.s32.f64   s0, d0
+       vcvt.f64.s32    d0, s0
+       vmsr    fpscr, r1
+       bx      lr
+#elif defined(_X86_) || defined(__i386__)
+       fldl    4(%esp)
+       pushl   %eax
+       pushl   %ecx
+       fnstcw  (%esp)
+       movl    (%esp), %eax
+       orl     $0x20, %eax
+       movl    %eax, 4(%esp)
+       fldcw   4(%esp)
+       frndint
+       fclex
+       fldcw   (%esp)
+       popl    %ecx
+       popl    %eax
+       ret
+#endif
diff --git a/winsup/cygwin/math/nearbyintf.S b/winsup/cygwin/math/nearbyintf.S
new file mode 100644 (file)
index 0000000..460e1a5
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "nearbyintf.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+       .globl __MINGW_USYMBOL(nearbyintf)
+       .def    __MINGW_USYMBOL(nearbyintf);    .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(nearbyintf):
+#if defined(_AMD64_) || defined(__x86_64__)
+       movss   %xmm0,-12(%rsp)
+       flds    -12(%rsp)
+       pushq   %rax
+       pushq   %rcx
+       fnstcw  (%rsp)
+       movq    (%rsp), %rax
+       orq     $0x20, %rax
+       movq    %rax, 8(%rsp)
+       fldcw   8(%rsp)
+       frndint
+       fclex
+       fldcw   (%rsp)
+       popq    %rcx
+       popq    %rax
+       fstps   -12(%rsp)
+       movss   -12(%rsp),%xmm0
+       ret
+#elif defined(_ARM_) || defined(__arm__)
+       vmrs    r1, fpscr
+       vcvt.s32.f32    s0, s0
+       vcvt.f32.s32    s0, s0
+       vmsr    fpscr, r1
+       bx      lr
+#elif defined(_X86_) || defined(__i386__)
+       flds    4(%esp)
+       pushl   %eax
+       pushl   %ecx
+       fnstcw  (%esp)
+       movl    (%esp), %eax
+       orl     $0x20, %eax
+       movl    %eax, 4(%esp)
+       fldcw   4(%esp)
+       frndint
+       fclex
+       fldcw   (%esp)
+       popl    %ecx
+       popl    %eax
+       ret
+#endif
diff --git a/winsup/cygwin/math/nearbyintl.S b/winsup/cygwin/math/nearbyintl.S
new file mode 100644 (file)
index 0000000..f4262a2
--- /dev/null
@@ -0,0 +1,58 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "nearbyintl.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+       .globl __MINGW_USYMBOL(nearbyintl)
+       .def    __MINGW_USYMBOL(nearbyintl);    .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(nearbyintl):
+#if defined(_AMD64_) || defined(__x86_64__)
+       fldt    (%rdx)
+       movq    %rcx,%r8
+       pushq   %rax
+       pushq   %rcx
+       fnstcw  (%rsp)
+       movl    (%rsp), %eax
+       orl     $0x20, %eax
+       movl    %eax, 8(%rsp)
+       fldcw   8(%rsp)
+       frndint
+       fclex
+       fldcw   (%rsp)
+       popq    %rcx
+       popq    %rax
+       movq    %r8,%rax
+       movq    $0,8(%r8)
+       fstpt   (%r8)
+       ret
+#elif defined(_ARM_) || defined(__arm__)
+       vmrs    r1, fpscr
+       vcvtr.s32.f64   s0, d0
+       vcvt.f64.s32    d0, s0
+       vmsr    fpscr, r1
+       bx      lr
+#elif defined(_X86_) || defined(__i386__)
+       fldt    4(%esp)
+       pushl   %eax
+       pushl   %ecx
+       fnstcw  (%esp)
+       movl    (%esp), %eax
+       orl     $0x20, %eax
+       movl    %eax, 4(%esp)
+       fldcw   4(%esp)
+       frndint
+       fclex
+       fldcw   (%esp)
+       popl    %ecx
+       popl    %eax
+       ret
+#endif
diff --git a/winsup/cygwin/math/nextafterl.c b/winsup/cygwin/math/nextafterl.c
new file mode 100644 (file)
index 0000000..5db3af7
--- /dev/null
@@ -0,0 +1,71 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+   nextafterl.c
+   Contributed by Danny Smith <dannysmith@users.sourceforge.net>
+   No copyright claimed, absolutely no warranties.
+
+   2005-05-09
+*/
+
+#include <math.h>
+
+long double
+nextafterl (long double x, long double y)
+{
+  union {
+      long double ld;
+      struct {
+        /* packed attribute is unnecessary on x86/x64 for these three variables */
+        unsigned long long mantissa;
+        unsigned short expn;
+        unsigned short pad;
+      } parts; 
+  } u;
+
+  /* The normal bit is explicit for long doubles, unlike
+     float and double.  */
+  static const unsigned long long normal_bit = 0x8000000000000000ull;
+  u.ld = 0.0L;
+  if (isnan (y) || isnan (x))
+    return x + y;
+
+  if (x == y )
+     /* nextafter (0.0, -O.0) should return -0.0.  */
+     return y;
+
+  u.ld = x;
+  if (x == 0.0L)
+    {
+      u.parts.mantissa = 1ull;
+      return y > 0.0L ? u.ld : -u.ld;
+    }
+
+  if (((x > 0.0L) ^ (y > x)) == 0)
+    {
+      u.parts.mantissa++;
+      if ((u.parts.mantissa & ~normal_bit) == 0ull)
+       u.parts.expn++;
+    }
+  else
+    {
+      if ((u.parts.mantissa & ~normal_bit) == 0ull)
+       u.parts.expn--;
+      u.parts.mantissa--;
+    }
+
+  /* If we have updated the expn of a normal number,
+     or moved from denormal to normal, [re]set the normal bit.  */ 
+  if (u.parts.expn & 0x7fff)
+    u.parts.mantissa |=  normal_bit;
+
+  return u.ld;
+}
+
+/* nexttowardl is the same function with a different name.  */
+long double
+nexttowardl (long double, long double) __attribute__ ((alias("nextafterl")));
+
diff --git a/winsup/cygwin/math/nexttoward.c b/winsup/cygwin/math/nexttoward.c
new file mode 100644 (file)
index 0000000..909f6ea
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+   nexttoward.c
+   Contributed by Danny Smith <dannysmith@users.sourceforge.net>
+   No copyright claimed, absolutely no warranties.
+
+   2005-05-10
+*/
+
+#include <math.h>
+
+double
+nexttoward (double x, long double y)
+{
+  union
+  {
+    double d;
+    unsigned long long ll;
+  } u;
+
+  long double xx = x;
+
+  if (isnan (y) || isnan (x))
+    return x + y;
+
+  if (xx == y)
+     /* nextafter (0.0, -O.0) should return -0.0.  */
+     return y;
+  u.d = x; 
+  if (x == 0.0)
+    {
+      u.ll = 1;
+      return y > 0.0L ? u.d : -u.d;
+    }
+
+  /* Non-extended encodings are lexicographically ordered,
+     with implicit "normal" bit.  */ 
+  if (((x > 0.0) ^ (y > xx)) == 0)
+    u.ll++;
+  else
+    u.ll--;
+  return u.d;
+}
diff --git a/winsup/cygwin/math/nexttowardf.c b/winsup/cygwin/math/nexttowardf.c
new file mode 100644 (file)
index 0000000..0a2f3bf
--- /dev/null
@@ -0,0 +1,43 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+   nexttowardf.c
+   Contributed by Danny Smith <dannysmith@users.sourceforge.net>
+   No copyright claimed, absolutely no warranties.
+
+   2005-05-10
+*/
+
+#include <math.h>
+
+float
+nexttowardf (float x, long double y)
+{
+  union
+  {
+    float f;
+    unsigned int i;
+  } u;
+
+  long double xx = x;
+
+  if (isnan (y) || isnan (x))
+    return x + y;
+  if (xx == y )
+     /* nextafter (0.0, -O.0) should return -0.0.  */
+     return y;
+  u.f = x; 
+  if (x == 0.0F)
+    {
+      u.i = 1;
+      return y > 0.0L ? u.f : -u.f;
+    }
+  if (((x > 0.0F) ^ (y > xx)) == 0)
+    u.i++;
+  else
+    u.i--;
+  return u.f;
+}
diff --git a/winsup/cygwin/math/pow.def.h b/winsup/cygwin/math/pow.def.h
new file mode 100644 (file)
index 0000000..a5513c1
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* IEEE 754 - Elementary Functions - Special Cases
+ * pow(+/-0, oo) is +0
+ * pow(+/-0, -oo) is +oo
+ * pow (x, +/-0) is 1 for any x (even a zero, quiet NaN, or infinity)
+ * pow (+1, y) is 1 for any y (even a quiet NaN)
+ * pow (+/-0, y) is +/-oo and signals the divideByZero exception for y an odd integer < 0
+ * pow (+/-0, y) is +oo and signals the divideByZero exception for finite y < 0 and not an odd integer
+ * pow (+/-0, y) is +/-0 for finite y > 0 an odd integer
+ * pow (+/-0, y) is +0 for finite y > 0 and not an odd integer
+ * pow (-1, +/-oo) is 1 with no exception
+ pow( -inf, y) = +0 for y<0 and not an odd integer
+ pow( -inf, y) = -inf for y an odd integer > 0
+ pow( -inf, y) = +inf for y>0 and not an odd integer
+ pow (+/-inf, y) is +/-0 with no exception for y an odd integer < 0
+ pow (+/-inf, -inf) is +0 with no exception
+ pow (+/-inf, +inf) is +inf with no exception
+ pow (+/-inf, y) is +0 with no exception for finite y < 0 and not an odd integer
+ pow (+/-inf, y) is +/-inf with no exception for finite y > 0 an odd integer
+ pow (+/-inf, y) is +inf with no exception for finite y > 0 and not an odd integer
+ pow (x, y) signals the invalid operation exception for finite x < 0 and finite non-integer y.
+ For x /= 0: lim y->oo (1/x)^y results as: for |x| < 1 that sgn(x)*0 and for |x| > 0 that sgn(x)*Infinity
+
+*/
+#include "complex_internal.h"
+#include <errno.h>
+#include <limits.h>
+#include <fenv.h>
+#include <math.h>
+#include <errno.h>
+#define FE_ROUNDING_MASK \
+  (FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)
+
+static __FLT_TYPE
+internal_modf (__FLT_TYPE value, __FLT_TYPE *iptr)
+{
+  __FLT_TYPE int_part = (__FLT_TYPE) 0.0;
+  /* truncate */ 
+  /* truncate */
+#ifdef __x86_64__
+  asm ("pushq %%rax\n\tsubq $8, %%rsp\n"
+    "fnstcw 4(%%rsp)\n"
+    "movzwl 4(%%rsp), %%eax\n"
+    "orb $12, %%ah\n"
+    "movw %%ax, (%%rsp)\n"
+    "fldcw (%%rsp)\n"
+    "frndint\n"
+    "fldcw 4(%%rsp)\n"
+    "addq $8, %%rsp\npopq %%rax" : "=t" (int_part) : "0" (value)); /* round */
+#else
+  asm ("push %%eax\n\tsubl $8, %%esp\n"
+    "fnstcw 4(%%esp)\n"
+    "movzwl 4(%%esp), %%eax\n"
+    "orb $12, %%ah\n"
+    "movw %%ax, (%%esp)\n"
+    "fldcw (%%esp)\n"
+    "frndint\n"
+    "fldcw 4(%%esp)\n"
+    "addl $8, %%esp\n\tpop %%eax\n" : "=t" (int_part) : "0" (value)); /* round */
+#endif
+  if (iptr)
+    *iptr = int_part;
+  return (isinf (value) ?  (__FLT_TYPE) 0.0 : value - int_part);
+}
+
+__FLT_TYPE __cdecl __FLT_ABI(__powi) (__FLT_TYPE x, int n);
+
+__FLT_TYPE __cdecl
+__FLT_ABI(pow) (__FLT_TYPE x, __FLT_TYPE y)
+{
+  int x_class = fpclassify (x);
+  int y_class = fpclassify (y);
+  long odd_y = 0;
+  __FLT_TYPE d, rslt;
+
+  if (y_class == FP_ZERO || x == __FLT_CST(1.0))
+    return __FLT_CST(1.0);
+  else if (x_class == FP_NAN || y_class == FP_NAN)
+    {
+      rslt = (signbit(x) ? -__FLT_NAN : __FLT_NAN);
+      __FLT_RPT_DOMAIN ("pow", x, y, rslt);
+      return rslt;
+    }
+  else if (x_class == FP_ZERO)
+    {
+      if (y_class == FP_INFINITE)
+       return (signbit(y) ? __FLT_HUGE_VAL : __FLT_CST(0.0));
+
+      if (signbit(x) && internal_modf (y, &d) != 0.0)
+       {
+         return signbit (y) ? (1.0 / -x) : __FLT_CST (0.0);
+         /*__FLT_RPT_DOMAIN ("pow", x, y, -__FLT_NAN);
+         return -__FLT_NAN; */
+       }
+      odd_y = (internal_modf (__FLT_ABI (ldexp) (y, -1), &d) != 0.0) ? 1 : 0;
+      if (!signbit(y))
+       {
+         if (!odd_y || !signbit (x))
+           return __FLT_CST (0.0);
+         return -__FLT_CST(0.0);
+       }
+
+      if (!odd_y || !signbit (x))
+       return __FLT_HUGE_VAL;
+      return (signbit(x) ? -__FLT_HUGE_VAL : __FLT_HUGE_VAL);
+    }
+  else if (y_class == FP_INFINITE)
+    {
+      __FLT_TYPE a_x;
+
+      if (x_class == FP_INFINITE)
+       return (signbit (y) ? __FLT_CST (0.0) : __FLT_HUGE_VAL);
+      a_x = (signbit (x) ? -x : x);
+      if (a_x == 1.0)
+       return __FLT_CST (1.0);
+      if (a_x > 1.0)
+       return (signbit (y) == 0 ? __FLT_HUGE_VAL : __FLT_CST (0.0));
+      return (!signbit (y) ? __FLT_CST (0.0) : __FLT_HUGE_VAL);
+    }
+  else if (x_class == FP_INFINITE)
+    {
+      /* pow (x, y) signals the invalid operation exception for finite x < 0 and finite non-integer y.  */
+      if (signbit(x) && internal_modf (y, &d) != 0.0)
+       {
+         return signbit(y) ? 1.0 / -x : -x;
+         /*__FLT_RPT_DOMAIN ("pow", x, y, -__FLT_NAN);
+         return -__FLT_NAN;*/
+       }
+      odd_y = (internal_modf (__FLT_ABI (ldexp) (y, -1), &d) != 0.0) ? 1 : 0;
+      /* pow( -inf, y) = +0 for y<0 and not an odd integer,  */
+      if (signbit(x) && signbit(y) && !odd_y)
+       return __FLT_CST(0.0);
+      /* pow( -inf, y) = -inf for y an odd integer > 0.  */
+      if (signbit(x) && !signbit(y) && odd_y)
+       return -__FLT_HUGE_VAL;
+      /* pow( -inf, y) = +inf for y>0 and not an odd integer.  */
+      if (signbit(x) && !signbit(y) && !odd_y)
+       return __FLT_HUGE_VAL;
+      /* pow (+/-inf, y) is +/-0 with no exception for y an odd integer < 0. */
+      if (signbit(y))
+      {
+        /* pow (+/-inf, y) is +0 with no exception for finite y < 0 and not an odd integer.  */
+       return (odd_y && signbit(x) ? -__FLT_CST(0.0) : __FLT_CST(0.0));
+      }
+      /* pow (+/-inf, y) is +/-inf with no exception for finite y > 0 an odd integer.  */
+      /* pow (+/-inf, y) is +inf with no exception for finite y > 0 and not an odd integer.  */
+      return (odd_y && signbit(x) ? -__FLT_HUGE_VAL : __FLT_HUGE_VAL);
+    }
+
+  if (internal_modf (y, &d) != 0.0)
+    {
+      if (signbit (x))
+       {
+         __FLT_RPT_DOMAIN ("pow", x, y, -__FLT_NAN);
+         return -__FLT_NAN;
+       }
+      if (y == __FLT_CST(0.5))
+       {
+         asm ("fsqrt" : "=t" (rslt) : "0" (x));
+         return rslt;
+       }
+    }
+  else if ((d <= (__FLT_TYPE) INT_MAX && d >= (__FLT_TYPE) INT_MIN))
+     return __FLT_ABI (__powi) (x, (int) y);
+  /* As exp already checks for minlog and maxlog no further checks are necessary.  */
+  rslt = (__FLT_TYPE) exp2l ((long double) y * log2l ((long double) __FLT_ABI(fabs) (x)));
+
+  if (signbit (x) && internal_modf (__FLT_ABI (ldexp) (y, -1), &d) != 0.0)
+    rslt = -rslt;
+  return rslt;
+}
diff --git a/winsup/cygwin/math/pow10l.c b/winsup/cygwin/math/pow10l.c
new file mode 100644 (file)
index 0000000..ad53489
--- /dev/null
@@ -0,0 +1,8 @@
+#undef pow10l
+#include <math.h>
+
+long double
+pow10l (long double x)
+{
+  return powl (10.0L, x);
+}
diff --git a/winsup/cygwin/math/powi.def.h b/winsup/cygwin/math/powi.def.h
new file mode 100644 (file)
index 0000000..f7fa860
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* IEEE 754 - Elementary Functions - Special Cases
+ * powi (x, +/-0) is 1 for any x (even a zero, quiet NaN, or infinity)
+ * powi (+1, y) is 1 for any y (even a quiet NaN)
+ * powi (+/-0, y) is +/-oo and signals the divideByZero exception for y an odd integer < 0
+ * powi (+/-0, y) is +oo and signals the divideByZero exception for finite y < 0 and not an odd integer
+ * powi (+/-0, y) is +/-0 for finite y > 0 an odd integer
+ * powi (+/-0, y) is +0 for finite y > 0 and not an odd integer
+ powi (-inf, y) = +0 for y<0 and not an odd integer
+ powi (-inf, y) = -inf for y an odd integer > 0
+ powi (-inf, y) = +inf for y>0 and not an odd integer
+ powi (+/-inf, y) is +/-0 with no exception for y an odd integer < 0
+ powi (+/-inf, y) is +0 with no exception for finite y < 0 and not an odd integer
+ powi (+/-inf, y) is +/-inf with no exception for finite y > 0 an odd integer
+ powi (+/-inf, y) is +inf with no exception for finite y > 0 and not an odd integer
+ powi (x, y) signals the invalid operation exception for finite x < 0 and finite non-integer y.
+ For x /= 0: lim y->oo (1/x)^y results as: for |x| < 1 that sgn(x)*0 and for |x| > 0 that sgn(x)*Infinity
+
+*/
+#include "complex_internal.h"
+#include <errno.h>
+#include <limits.h>
+#include <fenv.h>
+#include <math.h>
+#include <errno.h>
+
+__FLT_TYPE __cdecl
+__FLT_ABI(__powi) (__FLT_TYPE x, int y);
+
+__FLT_TYPE __cdecl
+__FLT_ABI(__powi) (__FLT_TYPE x, int y)
+{
+  int x_class = fpclassify (x);
+  int odd_y = y & 1;
+  __FLT_TYPE d, rslt;
+
+  if (y == 0 || x == __FLT_CST(1.0))
+    return __FLT_CST(1.0);
+  else if (x_class == FP_NAN)
+    {
+      rslt = (signbit(x) ? -__FLT_NAN : __FLT_NAN);
+      __FLT_RPT_DOMAIN ("__powi", x, (__FLT_TYPE) y, rslt);
+      return rslt;
+    }
+  else if (x_class == FP_ZERO)
+    {
+      if (y >= 0)
+       {
+         if (!odd_y || !signbit (x))
+           return __FLT_CST (0.0);
+         return -__FLT_CST(0.0);
+       }
+
+      if (!odd_y || !signbit (x))
+       return __FLT_HUGE_VAL;
+      return (signbit(x) ? -__FLT_HUGE_VAL : __FLT_HUGE_VAL);
+    }
+  else if (x_class == FP_INFINITE)
+    {
+      /* pow( -inf, y) = +0 for y<0 and not an odd integer,  */
+      if (signbit(x) && y < 0 && !odd_y)
+       return __FLT_CST(0.0);
+      /* pow( -inf, y) = -inf for y an odd integer > 0.  */
+      if (signbit(x) && y >= 0 && odd_y)
+       return -__FLT_HUGE_VAL;
+      /* pow( -inf, y) = +inf for y>0 and not an odd integer.  */
+      if (signbit(x) && y >= 0 && !odd_y)
+       return __FLT_HUGE_VAL;
+      /* pow (+/-inf, y) is +/-0 with no exception for y an odd integer < 0. */
+      if (y < 0)
+      {
+        /* pow (+/-inf, y) is +0 with no exception for finite y < 0 and not an odd integer.  */
+       return (odd_y && signbit(x) ? -__FLT_CST(0.0) : __FLT_CST(0.0));
+      }
+      /* pow (+/-inf, y) is +/-inf with no exception for finite y > 0 an odd integer.  */
+      /* pow (+/-inf, y) is +inf with no exception for finite y > 0 and not an odd integer.  */
+      return (odd_y && signbit(x) ? -__FLT_HUGE_VAL : __FLT_HUGE_VAL);
+    }
+
+  d = __FLT_ABI(fabs) (x);
+
+  if (y < 0)
+    {
+      d = __FLT_CST(1.0) / d;
+      y = -y;
+    }
+
+  if (!y)
+    rslt = __FLT_CST(1.0);
+  else if (y == 1)
+    rslt = d;
+  else
+    {
+      unsigned int u = (unsigned int) y;
+      rslt = ((u & 1) != 0) ? d : __FLT_CST(1.0);
+      u >>= 1;
+      do
+       {
+         d *= d;
+         if ((u & 1) != 0)
+           rslt *= d;
+         u >>= 1;
+       }
+      while (u > 0);
+    }
+  if (signbit (x) && odd_y)
+    rslt = -rslt;
+  return rslt;
+}
diff --git a/winsup/cygwin/math/powil.c b/winsup/cygwin/math/powil.c
new file mode 100644 (file)
index 0000000..d3e08e3
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "powi.def.h"
diff --git a/winsup/cygwin/math/powl.c b/winsup/cygwin/math/powl.c
new file mode 100644 (file)
index 0000000..6864370
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "pow.def.h"
diff --git a/winsup/cygwin/math/remainder.S b/winsup/cygwin/math/remainder.S
new file mode 100644 (file)
index 0000000..5a713f9
--- /dev/null
@@ -0,0 +1,40 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "remainder.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(remainder)
+       .def    __MINGW_USYMBOL(remainder);     .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(remainder):
+#ifdef __x86_64__
+       movsd   %xmm0,-16(%rsp)
+       movsd   %xmm1,-32(%rsp)
+       fldl    -32(%rsp)
+       fldl    -16(%rsp)
+1:     fprem1
+       fstsw   %ax
+       sahf
+       jp      1b
+       fstp    %st(1)
+       fstpl   -16(%rsp)
+       movsd   -16(%rsp),%xmm0
+       ret
+#else
+       fldl    12(%esp)
+       fldl    4(%esp)
+1:     fprem1
+       fstsw   %ax
+       sahf
+       jp      1b
+       fstp    %st(1)
+       ret
+#endif
diff --git a/winsup/cygwin/math/remainderf.S b/winsup/cygwin/math/remainderf.S
new file mode 100644 (file)
index 0000000..c3a3a3d
--- /dev/null
@@ -0,0 +1,40 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "remainderf.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(remainder)
+       .def    __MINGW_USYMBOL(remainderf);    .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(remainderf):
+#ifdef __x86_64__
+       movss   %xmm1,-12(%rsp)
+       flds    -12(%rsp)
+       movss   %xmm0,-12(%rsp)
+       flds    -12(%rsp)
+1:     fprem1
+       fstsw   %ax
+       sahf
+       jp      1b
+       fstp    %st(1)
+       fstps   -12(%rsp)
+       movss   -12(%rsp),%xmm0
+       ret
+#else
+       flds    8(%esp)
+       flds    4(%esp)
+1:     fprem1
+       fstsw   %ax
+       sahf
+       jp      1b
+       fstp    %st(1)
+       ret
+#endif
diff --git a/winsup/cygwin/math/remainderl.S b/winsup/cygwin/math/remainderl.S
new file mode 100644 (file)
index 0000000..a69e382
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "remainderl.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(remainderl)
+       .def    __MINGW_USYMBOL(remainderl);    .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(remainderl):
+#ifdef __x86_64__
+       fldt    (%r8)
+       fldt    (%rdx)
+1:     fprem1
+       fstsw   %ax
+       sahf
+       jp      1b
+       fstp    %st(1)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+#else
+       fldt    16(%esp)
+       fldt    4(%esp)
+1:     fprem1
+       fstsw   %ax
+       sahf
+       jp      1b
+       fstp    %st(1)
+       ret
+#endif
diff --git a/winsup/cygwin/math/remquol.S b/winsup/cygwin/math/remquol.S
new file mode 100644 (file)
index 0000000..42cc2a7
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "remquol.S"
+        .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(remquol)
+__MINGW_USYMBOL(remquol):
+#ifdef __x86_64__
+       pushq   %rcx
+        fldt (%r8)
+        fldt (%rdx)
+1:     fprem1
+        fstsw %ax
+        sahf
+        jp 1b
+        fstp %st(1)
+        movl %eax, %ecx
+        shrl $8, %eax
+        shrl $12, %ecx
+        andl $4, %ecx
+        andl $3, %eax
+        orl %eax, %ecx
+        movl $0xef2a60, %eax
+       leal (%ecx,%ecx,2),%ecx
+        shrl %cl, %eax
+        andl $7, %eax
+        movl 8(%rdx), %edx
+        xorl 8(%r8), %edx
+        testl $0x8000, %edx
+        jz 1f
+        negl %eax
+1:     movl %eax, (%r9)
+
+       popq %rcx
+       movq %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+        ret
+#else
+        fldt 4 +12(%esp)
+        fldt 4(%esp)
+1:     fprem1
+        fstsw %ax
+        sahf
+        jp 1b
+        fstp %st(1)
+        movl %eax, %ecx
+        shrl $8, %eax
+        shrl $12, %ecx
+        andl $4, %ecx
+        andl $3, %eax
+        orl %eax, %ecx
+        movl $0xef2a60, %eax
+       leal (%ecx,%ecx,2),%ecx
+        shrl %cl, %eax
+        andl $7, %eax
+        movl 4 +12 +12(%esp), %ecx      
+        movl 4 +8(%esp), %edx
+        xorl 4 +12 +8(%esp), %edx
+        testl $0x8000, %edx
+        jz 1f
+        negl %eax
+1:     movl %eax, (%ecx)
+      
+        ret
+#endif
diff --git a/winsup/cygwin/math/rint.c b/winsup/cygwin/math/rint.c
new file mode 100644 (file)
index 0000000..01f9644
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+#if defined(__arm__) || defined(_ARM_)
+/* This works around a compiler bug */
+double __rint_internal( double x );
+asm(".def __rint_internal; .scl 2; .type 32; .endef\n"
+    "\t.text\n"
+    "\t.align 4\n"
+    "\t.globl __rint_internal\n"
+    "__rint_internal:\n"
+    "\tvcvtr.s32.f64    s0, d0\n"
+    "\tvcvt.f64.s32     d0, s0\n"
+    "\tbx lr");
+#endif /* defined(__arm__) || defined(_ARM_) */
+
+double rint (double x) {
+  double retval = 0.0;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+  __asm__ __volatile__ ("frndint;" : "=t" (retval) : "0" (x));
+#elif defined(__arm__) || defined(_ARM_)
+    retval = __rint_internal(x);
+#endif
+  return retval;
+}
diff --git a/winsup/cygwin/math/rintf.c b/winsup/cygwin/math/rintf.c
new file mode 100644 (file)
index 0000000..09c641b
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+#if defined(__arm__) || defined(_ARM_)
+/* This works around a compiler bug */
+float __rintf_internal( float x );
+asm(".def __rintf_internal; .scl 2; .type 32; .endef\n"
+    "\t.text\n"
+    "\t.align 4\n"
+    "\t.globl __rintf_internal\n"
+    "__rintf_internal:\n"
+    "\tvcvtr.s32.f32    s0, s0\n"
+    "\tvcvt.f32.s32     s0, s0\n"
+    "\tbx lr");
+#endif /* defined(__arm__) || defined(_ARM_) */
+
+float rintf (float x) {
+  float retval = 0.0F;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+  __asm__ __volatile__ ("frndint;": "=t" (retval) : "0" (x));
+#elif defined(__arm__) || defined(_ARM_)
+    retval = __rintf_internal(x);
+#endif
+  return retval;
+}
diff --git a/winsup/cygwin/math/rintl.c b/winsup/cygwin/math/rintl.c
new file mode 100644 (file)
index 0000000..9ec159d
--- /dev/null
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long double rintl (long double x) {
+  long double retval = 0.0L;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+  __asm__ __volatile__ ("frndint;": "=t" (retval) : "0" (x));
+#elif defined(__arm__) || defined(_ARM_)
+    retval = rint(x);
+#endif
+  return retval;
+}
diff --git a/winsup/cygwin/math/roundl.c b/winsup/cygwin/math/roundl.c
new file mode 100644 (file)
index 0000000..9879a82
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long double
+roundl (long double x)
+{
+  long double res = 0.0L;
+  if (x >= 0.0L)
+    {
+      res = ceill (x);
+      if (res - x > 0.5L)
+       res -= 1.0L;
+    }
+  else
+    {
+      res = ceill (-x);
+      if (res + x > 0.5L)
+       res -= 1.0L;
+      res = -res;
+    }
+  return res;
+}
diff --git a/winsup/cygwin/math/scalbl.S b/winsup/cygwin/math/scalbl.S
new file mode 100644 (file)
index 0000000..f9675ac
--- /dev/null
@@ -0,0 +1,35 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "scalbl.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(scalbl)
+       .def    __MINGW_USYMBOL(scalbl);        .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(scalbl):
+#ifdef __x86_64__
+       subq  $24, %rsp
+       fldt    (%r8)
+       fldt    (%rdx)
+       fscale
+       fstp    %st(1)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       addq $24, %rsp
+       ret
+#else
+       fildl   16(%esp)
+       fldt    4(%esp)
+       fscale
+       fstp    %st(1)
+       ret
+#endif
diff --git a/winsup/cygwin/math/scalbnl.S b/winsup/cygwin/math/scalbnl.S
new file mode 100644 (file)
index 0000000..5ff0a68
--- /dev/null
@@ -0,0 +1,41 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "scalbnl.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(scalbnl)
+       .def    __MINGW_USYMBOL(scalbnl);       .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(scalbnl):
+#ifdef __x86_64__
+       subq  $24, %rsp
+       andl    $-1, %r8d
+       movq    %r8, (%rsp)
+       fildl   (%rsp)
+       fldt    (%rdx)
+       fscale
+       fstp    %st(1)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       addq $24, %rsp
+       ret
+#else
+       fildl   16(%esp)
+       fldt    4(%esp)
+       fscale
+       fstp    %st(1)
+       ret
+#endif
+
+.globl __MINGW_USYMBOL(scalblnl)
+       .set    __MINGW_USYMBOL(scalblnl),__MINGW_USYMBOL(scalbnl)
+
diff --git a/winsup/cygwin/math/sin.def.h b/winsup/cygwin/math/sin.def.h
new file mode 100644 (file)
index 0000000..c9b3b04
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "complex_internal.h"
+#include <errno.h>
+
+extern long double __sinl_internal (long double);
+
+__FLT_TYPE
+__FLT_ABI(sin) (__FLT_TYPE x)
+{
+  int x_class = fpclassify (x);
+  if (x_class == FP_NAN)
+    {
+      __FLT_RPT_DOMAIN ("sin", x, 0.0, x);
+      return x;
+    }
+  else if (x_class == FP_INFINITE)
+    {
+      __FLT_RPT_DOMAIN ("sin", x, 0.0, __FLT_NAN);
+      return __FLT_NAN;
+    }
+  return (__FLT_TYPE) __sinl_internal ((long double) x);
+}
diff --git a/winsup/cygwin/math/sinhl.c b/winsup/cygwin/math/sinhl.c
new file mode 100644 (file)
index 0000000..f6ecef0
--- /dev/null
@@ -0,0 +1,100 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+#include <errno.h>
+
+#ifdef UNK
+static uLD P[] = {
+  { { 1.7550769032975377032681E-6L } },
+  { { 4.1680702175874268714539E-4L } },
+  { { 3.0993532520425419002409E-2L } },
+  { { 9.9999999999999999998002E-1L } }
+};
+static long double Q[] = {
+  { { 1.7453965448620151484660E-8L } },
+  { { -5.9116673682651952419571E-6L } },
+  { { 1.0599252315677389339530E-3L } },
+  { { -1.1403880487744749056675E-1L } },
+  { { 6.0000000000000000000200E0L } }
+};
+#endif
+
+#ifdef IBMPC
+static const uLD P[] = {
+  { { 0xec6a,0xd942,0xfbb3,0xeb8f,0x3feb, 0, 0, 0 } },
+  { { 0x365e,0xb30a,0xe437,0xda86,0x3ff3, 0, 0, 0 } },
+  { { 0x8890,0x01f6,0x2612,0xfde6,0x3ff9, 0, 0, 0 } },
+  { { 0x0000,0x0000,0x0000,0x8000,0x3fff, 0, 0, 0 } }
+};
+static const uLD Q[] = {
+  { { 0x4edd,0x4c21,0xad09,0x95ed,0x3fe5, 0, 0, 0 } },
+  { { 0x4376,0x9b70,0xd605,0xc65c,0xbfed, 0, 0, 0 } },
+  { { 0xc8ad,0x5d21,0x3069,0x8aed,0x3ff5, 0, 0, 0 } },
+  { { 0x9c32,0x6374,0x2d4b,0xe98d,0xbffb, 0, 0, 0 } },
+  { { 0x0000,0x0000,0x0000,0xc000,0x4001, 0, 0, 0 } }
+};
+#endif
+
+#ifdef MIEEE
+static uLD P[] = {
+  { { 0x3feb0000,0xeb8ffbb3,0xd942ec6a, 0 } },
+  { { 0x3ff30000,0xda86e437,0xb30a365e, 0 } },
+  { { 0x3ff90000,0xfde62612,0x01f68890, 0 } },
+  { { 0x3fff0000,0x80000000,0x00000000, 0 } }
+};
+static uLD Q[] = {
+  { { 0x3fe50000,0x95edad09,0x4c214edd, 0 } },
+  { { 0xbfed0000,0xc65cd605,0x9b704376, 0 } },
+  { { 0x3ff50000,0x8aed3069,0x5d21c8ad, 0 } },
+  { { 0xbffb0000,0xe98d2d4b,0x63749c32, 0 } },
+  { { 0x40010000,0xc0000000,0x00000000, 0 } }
+};
+#endif
+
+long double sinhl(long double x)
+{
+  long double a;
+  int x_class = fpclassify (x);
+
+  if (x_class == FP_NAN)
+    {
+      errno = EDOM;
+      return x;
+    }
+  if (x_class == FP_ZERO)
+    return x;
+  if (x_class == FP_INFINITE ||
+      (fabs (x) > (MAXLOGL + LOGE2L)))
+  {
+    errno = ERANGE;
+#ifdef INFINITIES
+    return (signbit (x) ? -INFINITYL : INFINITYL);
+#else
+    return (signbit (x) ? -MAXNUML : MAXNUML);
+#endif
+  }
+  a = fabsl (x);
+  if (a > 1.0L)
+  {
+    if (a >= (MAXLOGL - LOGE2L))
+    {
+      a = expl(0.5L*a);
+      a = (0.5L * a) * a;
+      if (x < 0.0L)
+       a = -a;
+      return (a);
+    }
+    a = expl(a);
+    a = 0.5L*a - (0.5L/a);
+    if (x < 0.0L)
+      a = -a;
+    return (a);
+  }
+
+  a *= a;
+  return (x + x * a * (polevll(a,P,3)/polevll(a,Q,4)));
+}
+
diff --git a/winsup/cygwin/math/sinl.c b/winsup/cygwin/math/sinl.c
new file mode 100644 (file)
index 0000000..0bbb71d
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "sin.def.h"
diff --git a/winsup/cygwin/math/sinl_internal.S b/winsup/cygwin/math/sinl_internal.S
new file mode 100644 (file)
index 0000000..6d766b0
--- /dev/null
@@ -0,0 +1,58 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "sinl_internal.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(__sinl_internal)
+       .def    __MINGW_USYMBOL(__sinl_internal);       .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(__sinl_internal):
+#ifdef __x86_64__
+       fldt    (%rdx)
+       fsin
+       fnstsw  %ax
+       testl   $0x400,%eax
+       jnz     1f
+       movq    %rcx,%rax
+        movq   $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+1:     fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fnstsw  %ax
+       testl   $0x400,%eax
+       jnz     2b
+       fstp    %st(1)
+       fsin
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+#else
+       fldt    4(%esp)
+       fsin
+       fnstsw  %ax
+       testl   $0x400,%eax
+       jnz     1f
+       ret
+1:     fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fnstsw  %ax
+       testl   $0x400,%eax
+       jnz     2b
+       fstp    %st(1)
+       fsin
+       ret
+#endif
diff --git a/winsup/cygwin/math/sqrt.def.h b/winsup/cygwin/math/sqrt.def.h
new file mode 100644 (file)
index 0000000..1048130
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "complex_internal.h"
+#include <errno.h>
+
+#if defined(__arm__) || defined(_ARM_)
+/* This works around a compiler bug, normally you would inline it with e.g.
+ * asm ("fsqrts %[dst], %[src];\n" : [dst] "=w" (res) : [src] "w" (x));
+ */
+__FLT_TYPE __fsqrt_internal( __FLT_TYPE x );
+asm(".def __fsqrt_internal; .scl 2; .type 32; .endef\n"
+    "\t.text\n"
+    "\t.align 4\n"
+    "\t.globl __fsqrt_internal\n"
+    "__fsqrt_internal:\n"
+#if _NEW_COMPLEX_FLOAT
+    "\t" "fsqrts s0, s0\n"
+#else
+    "\t" "fsqrtd d0, d0\n"
+#endif /* _NEW_COMPLEX_FLOAT */
+    "\tbx lr");
+#endif /* defined(__arm__) || defined(_ARM_) */
+
+__FLT_TYPE
+__FLT_ABI (sqrt) (__FLT_TYPE x)
+{
+  __FLT_TYPE res = __FLT_CST (0.0);
+  int x_class = fpclassify (x);
+  if (x_class == FP_NAN || signbit (x))
+    {
+      if (x_class == FP_ZERO)
+       return __FLT_CST (-0.0);
+
+      res = (signbit (x) ? -__FLT_NAN : __FLT_NAN);
+      __FLT_RPT_DOMAIN ("sqrt", x, 0.0, res);
+      return res;
+    }
+  else if (x_class == FP_ZERO)
+    return __FLT_CST (0.0);
+  else if (x_class == FP_INFINITE)
+    return __FLT_HUGE_VAL;
+  else if (x == __FLT_CST (1.0))
+   return __FLT_CST (1.0);
+#if defined(__arm__) || defined(_ARM_)
+  __fsqrt_internal(x);
+#elif defined(_X86_) || defined(__i386__) || defined(_AMD64_) || defined(__x86_64__)
+  asm ("fsqrt" : "=t" (res) : "0" (x));
+#else
+#error Not supported on your platform yet
+#endif
+  return res;
+}
diff --git a/winsup/cygwin/math/sqrtl.c b/winsup/cygwin/math/sqrtl.c
new file mode 100644 (file)
index 0000000..ffd8185
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions in source code must retain the accompanying copyright
+      notice, this list of conditions, and the following disclaimer.
+   2. Redistributions in binary form must reproduce the accompanying
+      copyright notice, this list of conditions, and the following disclaimer
+      in the documentation and/or other materials provided with the
+      distribution.
+   3. Names of the copyright holders must not be used to endorse or promote
+      products derived from this software without prior written permission
+      from the copyright holders.
+   4. The right to distribute this software or to use it for any purpose does
+      not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+      the copyright holders.  Use of them is covered by separate agreement
+      with the copyright holders.
+   5. If any files are modified, you must cause the modified files to carry
+      prominent notices stating that you changed the files and the date of
+      any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "sqrt.def.h"
diff --git a/winsup/cygwin/math/tanhl.c b/winsup/cygwin/math/tanhl.c
new file mode 100644 (file)
index 0000000..2c48a6a
--- /dev/null
@@ -0,0 +1,92 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+#ifndef _SET_ERRNO
+#define _SET_ERRNO(x)
+#endif
+
+#ifdef UNK
+static uLD P[] = {
+  { { -6.8473739392677100872869E-5L } },
+  { { -9.5658283111794641589011E-1L } },
+  { { -8.4053568599672284488465E1L } },
+  { { -1.3080425704712825945553E3L } }
+};
+static uLD Q[] = {
+  { { 9.6259501838840336946872E1L } },
+  { { 1.8218117903645559060232E3L } },
+  { { 3.9241277114138477845780E3L } }
+};
+#endif
+
+#ifdef IBMPC
+static uLD P[] = {
+  { { 0xd2a4,0x1b0c,0x8f15,0x8f99,0xbff1, 0, 0, 0 } },
+  { { 0x5959,0x9111,0x9cc7,0xf4e2,0xbffe, 0, 0, 0 } },
+  { { 0xb576,0xef5e,0x6d57,0xa81b,0xc005, 0, 0, 0 } },
+  { { 0xe3be,0xbfbd,0x5cbc,0xa381,0xc009, 0, 0, 0 } }
+};
+static uLD Q[] = {
+  { { 0x687f,0xce24,0xdd6c,0xc084,0x4005, 0, 0, 0 } },
+  { { 0x3793,0xc95f,0xfa2f,0xe3b9,0x4009, 0, 0, 0 } },
+  { { 0xd5a2,0x1f9c,0x0b1b,0xf542,0x400a, 0, 0, 0 } }
+};
+#endif
+
+#ifdef MIEEE
+static uLD P[] = {
+  { { 0xbff10000,0x8f998f15,0x1b0cd2a4, 0 } },
+  { { 0xbffe0000,0xf4e29cc7,0x91115959, 0 } },
+  { { 0xc0050000,0xa81b6d57,0xef5eb576, 0 } },
+  { { 0xc0090000,0xa3815cbc,0xbfbde3be, 0 } }
+};
+static uLD Q[] = {
+  { { 0x40050000,0xc084dd6c,0xce24687f, 0 } },
+  { { 0x40090000,0xe3b9fa2f,0xc95f3793, 0 } },
+  { { 0x400a0000,0xf5420b1b,0x1f9cd5a2, 0 } }
+};
+#endif
+
+long double tanhl(long double x)
+{
+  long double s, z;
+
+#ifdef MINUSZERO
+  if (x == 0.0L)
+    return (x);
+#endif
+  if (isnanl(x))
+  {
+    _SET_ERRNO (EDOM);
+    return x;
+  }
+
+  z = fabsl(x);
+  if (z > 0.5L * MAXLOGL)
+  {
+    _SET_ERRNO (ERANGE);
+    if (x > 0)
+      return (1.0L);
+    else
+      return (-1.0L);
+  }
+  if (z >= 0.625L)
+  {
+    s = expl(2.0*z);
+    z =  1.0L  - 2.0/(s + 1.0L);
+    if (x < 0)
+      z = -z;
+  }
+  else
+  {
+    s = x * x;
+    z = polevll( s, P, 3 )/p1evll(s, Q, 3);
+    z = x * s * z;
+    z = x + z;
+  }
+  return (z);
+}
+
diff --git a/winsup/cygwin/math/tanl.S b/winsup/cygwin/math/tanl.S
new file mode 100644 (file)
index 0000000..f11b539
--- /dev/null
@@ -0,0 +1,62 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+       .file   "tanl.S"
+       .text
+#ifdef __x86_64__
+       .align 8
+#else
+       .align 4
+#endif
+.globl __MINGW_USYMBOL(tanl)
+       .def    __MINGW_USYMBOL(tanl);  .scl    2;      .type   32;     .endef
+__MINGW_USYMBOL(tanl):
+#ifdef __x86_64__
+       fldt    (%rdx)
+       fptan
+       fnstsw  %ax
+       testl   $0x400,%eax
+       jnz     1f
+       fstp    %st(0)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+1:     fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fstsw   %ax
+       testl   $0x400,%eax
+       jnz     2b
+       fstp    %st(1)
+       fptan
+       fstp    %st(0)
+       movq    %rcx,%rax
+       movq    $0,8(%rcx)
+       fstpt   (%rcx)
+       ret
+#else
+       fldt    4(%esp)
+       fptan
+       fnstsw  %ax
+       testl   $0x400,%eax
+       jnz     1f
+       fstp    %st(0)
+       ret
+1:     fldpi
+       fadd    %st(0)
+       fxch    %st(1)
+2:     fprem1
+       fstsw   %ax
+       testl   $0x400,%eax
+       jnz     2b
+       fstp    %st(1)
+       fptan
+       fstp    %st(0)
+       ret
+#endif
diff --git a/winsup/cygwin/math/tgammal.c b/winsup/cygwin/math/tgammal.c
new file mode 100644 (file)
index 0000000..99408ee
--- /dev/null
@@ -0,0 +1,393 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+
+/*
+gamma(x+2)  = gamma(x+2) P(x)/Q(x)
+0 <= x <= 1
+Relative error
+n=7, d=8
+Peak error =  1.83e-20
+Relative error spread =  8.4e-23
+*/
+
+#if UNK
+static const uLD P[8] = {
+  { { 4.212760487471622013093E-5L } },
+  { { 4.542931960608009155600E-4L } },
+  { { 4.092666828394035500949E-3L } },
+  { { 2.385363243461108252554E-2L } },
+  { { 1.113062816019361559013E-1L } },
+  { { 3.629515436640239168939E-1L } },
+  { { 8.378004301573126728826E-1L } },
+  { { 1.000000000000000000009E0L } }
+};
+static const uLD Q[9] = {
+  { { -1.397148517476170440917E-5L } },
+  { { 2.346584059160635244282E-4L } },
+  { { -1.237799246653152231188E-3L } },
+  { { -7.955933682494738320586E-4L } },
+  { { 2.773706565840072979165E-2L } },
+  { { -4.633887671244534213831E-2L } },
+  { { -2.243510905670329164562E-1L } },
+  { { 4.150160950588455434583E-1L } },
+  { { 9.999999999999999999908E-1L } }
+};
+#endif
+#if IBMPC
+static const uLD P[8] = {
+  { { 0x434a,0x3f22,0x2bda,0xb0b2,0x3ff0, 0x0, 0x0, 0x0 } },
+  { { 0xf5aa,0xe82f,0x335b,0xee2e,0x3ff3, 0x0, 0x0, 0x0 } },
+  { { 0xbe6c,0x3757,0xc717,0x861b,0x3ff7, 0x0, 0x0, 0x0 } },
+  { { 0x7f43,0x5196,0xb166,0xc368,0x3ff9, 0x0, 0x0, 0x0 } },
+  { { 0x9549,0x8eb5,0x8c3a,0xe3f4,0x3ffb, 0x0, 0x0, 0x0 } },
+  { { 0x8d75,0x23af,0xc8e4,0xb9d4,0x3ffd, 0x0, 0x0, 0x0 } },
+  { { 0x29cf,0x19b3,0x16c8,0xd67a,0x3ffe, 0x0, 0x0, 0x0 } },
+  { { 0x0000,0x0000,0x0000,0x8000,0x3fff, 0x0, 0x0, 0x0 } }
+};
+static const uLD Q[9] = {
+  { { 0x5473,0x2de8,0x1268,0xea67,0xbfee, 0x0, 0x0, 0x0 } },
+  { { 0x334b,0xc2f0,0xa2dd,0xf60e,0x3ff2, 0x0, 0x0, 0x0 } },
+  { { 0xbeed,0x1853,0xa691,0xa23d,0xbff5, 0x0, 0x0, 0x0 } },
+  { { 0x296e,0x7cb1,0x5dfd,0xd08f,0xbff4, 0x0, 0x0, 0x0 } },
+  { { 0x0417,0x7989,0xd7bc,0xe338,0x3ff9, 0x0, 0x0, 0x0 } },
+  { { 0x3295,0x3698,0xd580,0xbdcd,0xbffa, 0x0, 0x0, 0x0 } },
+  { { 0x75ef,0x3ab7,0x4ad3,0xe5bc,0xbffc, 0x0, 0x0, 0x0 } },
+  { { 0xe458,0x2ec7,0xfd57,0xd47c,0x3ffd, 0x0, 0x0, 0x0 } },
+  { { 0x0000,0x0000,0x0000,0x8000,0x3fff, 0x0, 0x0, 0x0 } }
+};
+#endif
+#if MIEEE
+static const uLD P[8] = {
+  { { 0x3ff00000,0xb0b22bda,0x3f22434a, 0 } },
+  { { 0x3ff30000,0xee2e335b,0xe82ff5aa, 0 } },
+  { { 0x3ff70000,0x861bc717,0x3757be6c, 0 } },
+  { { 0x3ff90000,0xc368b166,0x51967f43, 0 } },
+  { { 0x3ffb0000,0xe3f48c3a,0x8eb59549, 0 } },
+  { { 0x3ffd0000,0xb9d4c8e4,0x23af8d75, 0 } },
+  { { 0x3ffe0000,0xd67a16c8,0x19b329cf, 0 } },
+  { { 0x3fff0000,0x80000000,0x00000000, 0 } }
+};
+static const uLD Q[9] = {
+  { { 0xbfee0000,0xea671268,0x2de85473, 0 } },
+  { { 0x3ff20000,0xf60ea2dd,0xc2f0334b, 0 } },
+  { { 0xbff50000,0xa23da691,0x1853beed, 0 } },
+  { { 0xbff40000,0xd08f5dfd,0x7cb1296e, 0 } },
+  { { 0x3ff90000,0xe338d7bc,0x79890417, 0 } },
+  { { 0xbffa0000,0xbdcdd580,0x36983295, 0 } },
+  { { 0xbffc0000,0xe5bc4ad3,0x3ab775ef, 0 } },
+  { { 0x3ffd0000,0xd47cfd57,0x2ec7e458, 0 } },
+  { { 0x3fff0000,0x80000000,0x00000000, 0 } }
+};
+#endif
+
+#define MAXGAML 1755.455L
+/*static const long double LOGPI = 1.14472988584940017414L;*/
+
+/* Stirling's formula for the gamma function
+gamma(x) = sqrt(2 pi) x^(x-.5) exp(-x) (1 + 1/x P(1/x))
+z(x) = x
+13 <= x <= 1024
+Relative error
+n=8, d=0
+Peak error =  9.44e-21
+Relative error spread =  8.8e-4
+*/
+#if UNK
+static const uLD STIR[9] = {
+  { { 7.147391378143610789273E-4L } },
+  { { -2.363848809501759061727E-5L } },
+  { { -5.950237554056330156018E-4L } },
+  { { 6.989332260623193171870E-5L } },
+  { { 7.840334842744753003862E-4L } },
+  { { -2.294719747873185405699E-4L } },
+  { { -2.681327161876304418288E-3L } },
+  { { 3.472222222230075327854E-3L } },
+  { { 8.333333333333331800504E-2L } }
+};
+#endif
+#if IBMPC
+static const uLD STIR[9] = {
+  { { 0x6ede,0x69f7,0x54e3,0xbb5d,0x3ff4, 0, 0, 0 } },
+  { { 0xc395,0x0295,0x4443,0xc64b,0xbfef, 0, 0, 0 } },
+  { { 0xba6f,0x7c59,0x5e47,0x9bfb,0xbff4, 0, 0, 0 } },
+  { { 0x5704,0x1a39,0xb11d,0x9293,0x3ff1, 0, 0, 0 } },
+  { { 0x30b7,0x1a21,0x98b2,0xcd87,0x3ff4, 0, 0, 0 } },
+  { { 0xbef3,0x7023,0x6a08,0xf09e,0xbff2, 0, 0, 0 } },
+  { { 0x3a1c,0x5ac8,0x3478,0xafb9,0xbff6, 0, 0, 0 } },
+  { { 0xc3c9,0x906e,0x38e3,0xe38e,0x3ff6, 0, 0, 0 } },
+  { { 0xa1d5,0xaaaa,0xaaaa,0xaaaa,0x3ffb, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static const uLD STIR[9] = {
+  { { 0x3ff40000,0xbb5d54e3,0x69f76ede, 0 } },
+  { { 0xbfef0000,0xc64b4443,0x0295c395, 0 } },
+  { { 0xbff40000,0x9bfb5e47,0x7c59ba6f, 0 } },
+  { { 0x3ff10000,0x9293b11d,0x1a395704, 0 } },
+  { { 0x3ff40000,0xcd8798b2,0x1a2130b7, 0 } },
+  { { 0xbff20000,0xf09e6a08,0x7023bef3, 0 } },
+  { { 0xbff60000,0xafb93478,0x5ac83a1c, 0 } },
+  { { 0x3ff60000,0xe38e38e3,0x906ec3c9, 0 } },
+  { { 0x3ffb0000,0xaaaaaaaa,0xaaaaa1d5, 0 } }
+};
+#endif
+#define MAXSTIR 1024.0L
+static const long double SQTPI = 2.50662827463100050242E0L;
+
+/* 1/gamma(x) = z P(z)
+ * z(x) = 1/x
+ * 0 < x < 0.03125
+ * Peak relative error 4.2e-23
+ */
+#if UNK
+static const uLD S[9] = {
+  { { -1.193945051381510095614E-3L } },
+  { { 7.220599478036909672331E-3L } },
+  { { -9.622023360406271645744E-3L } },
+  { { -4.219773360705915470089E-2L } },
+  { { 1.665386113720805206758E-1L } },
+  { { -4.200263503403344054473E-2L } },
+  { { -6.558780715202540684668E-1L } },
+  { { 5.772156649015328608253E-1L } },
+  { { 1.000000000000000000000E0L } }
+};
+#endif
+#if IBMPC
+static const uLD S[9] = {
+  { { 0xbaeb,0xd6d3,0x25e5,0x9c7e,0xbff5, 0, 0, 0 } },
+  { { 0xfe9a,0xceb4,0xc74e,0xec9a,0x3ff7, 0, 0, 0 } },
+  { { 0x9225,0xdfef,0xb0e9,0x9da5,0xbff8, 0, 0, 0 } },
+  { { 0x10b0,0xec17,0x87dc,0xacd7,0xbffa, 0, 0, 0 } },
+  { { 0x6b8d,0x7515,0x1905,0xaa89,0x3ffc, 0, 0, 0 } },
+  { { 0xf183,0x126b,0xf47d,0xac0a,0xbffa, 0, 0, 0 } },
+  { { 0x7bf6,0x57d1,0xa013,0xa7e7,0xbffe, 0, 0, 0 } },
+  { { 0xc7a9,0x7db0,0x67e3,0x93c4,0x3ffe, 0, 0, 0 } },
+  { { 0x0000,0x0000,0x0000,0x8000,0x3fff, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static const long S[9] = {
+  { { 0xbff50000,0x9c7e25e5,0xd6d3baeb, 0 } },
+  { { 0x3ff70000,0xec9ac74e,0xceb4fe9a, 0 } },
+  { { 0xbff80000,0x9da5b0e9,0xdfef9225, 0 } },
+  { { 0xbffa0000,0xacd787dc,0xec1710b0, 0 } },
+  { { 0x3ffc0000,0xaa891905,0x75156b8d, 0 } },
+  { { 0xbffa0000,0xac0af47d,0x126bf183, 0 } },
+  { { 0xbffe0000,0xa7e7a013,0x57d17bf6, 0 } },
+  { { 0x3ffe0000,0x93c467e3,0x7db0c7a9, 0 } },
+  { { 0x3fff0000,0x80000000,0x00000000, 0 } }
+};
+#endif
+/* 1/gamma(-x) = z P(z)
+ * z(x) = 1/x
+ * 0 < x < 0.03125
+ * Peak relative error 5.16e-23
+ * Relative error spread =  2.5e-24
+ */
+#if UNK
+static const uLD SN[9] = {
+  { { 1.133374167243894382010E-3L } },
+  { { 7.220837261893170325704E-3L } },
+  { { 9.621911155035976733706E-3L } },
+  { { -4.219773343731191721664E-2L } },
+  { { -1.665386113944413519335E-1L } },
+  { { -4.200263503402112910504E-2L } },
+  { { 6.558780715202536547116E-1L } },
+  { { 5.772156649015328608727E-1L } },
+  { { -1.000000000000000000000E0L } }
+};
+#endif
+#if IBMPC
+static const uLD SN[9] = {
+  { { 0x5dd1,0x02de,0xb9f7,0x948d,0x3ff5, 0, 0, 0 } },
+  { { 0x989b,0xdd68,0xc5f1,0xec9c,0x3ff7, 0, 0, 0 } },
+  { { 0x2ca1,0x18f0,0x386f,0x9da5,0x3ff8, 0, 0, 0 } },
+  { { 0x783f,0x41dd,0x87d1,0xacd7,0xbffa, 0, 0, 0 } },
+  { { 0x7a5b,0xd76d,0x1905,0xaa89,0xbffc, 0, 0, 0 } },
+  { { 0x7f64,0x1234,0xf47d,0xac0a,0xbffa, 0, 0, 0 } },
+  { { 0x5e26,0x57d1,0xa013,0xa7e7,0x3ffe, 0, 0, 0 } },
+  { { 0xc7aa,0x7db0,0x67e3,0x93c4,0x3ffe, 0, 0, 0 } },
+  { { 0x0000,0x0000,0x0000,0x8000,0xbfff, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static const uLD SN[9] = {
+  { { 0x3ff50000,0x948db9f7,0x02de5dd1, 0 } },
+  { { 0x3ff70000,0xec9cc5f1,0xdd68989b, 0 } },
+  { { 0x3ff80000,0x9da5386f,0x18f02ca1, 0 } },
+  { { 0xbffa0000,0xacd787d1,0x41dd783f, 0 } },
+  { { 0xbffc0000,0xaa891905,0xd76d7a5b, 0 } },
+  { { 0xbffa0000,0xac0af47d,0x12347f64, 0 } },
+  { { 0x3ffe0000,0xa7e7a013,0x57d15e26, 0 } },
+  { { 0x3ffe0000,0x93c467e3,0x7db0c7aa, 0 } },
+  { { 0xbfff0000,0x80000000,0x00000000, 0 } }
+};
+#endif
+
+static long double stirf (long double);
+
+/* Gamma function computed by Stirling's formula.  */
+
+static long double stirf(long double x)
+{
+       long double y, w, v;
+
+       w = 1.0L/x;
+       /* For large x, use rational coefficients from the analytical expansion.  */
+       if (x > 1024.0L)
+               w = (((((6.97281375836585777429E-5L * w
+                     + 7.84039221720066627474E-4L) * w
+                     - 2.29472093621399176955E-4L) * w
+                     - 2.68132716049382716049E-3L) * w
+                     + 3.47222222222222222222E-3L) * w
+                     + 8.33333333333333333333E-2L) * w
+                     + 1.0L;
+       else
+               w = 1.0L + w * polevll( w, STIR, 8 );
+       y = expl(x);
+       if (x > MAXSTIR)
+       { /* Avoid overflow in pow() */
+               v = powl(x, 0.5L * x - 0.25L);
+               y = v * (v / y);
+       }
+       else
+       {
+               y = powl(x, x - 0.5L) / y;
+       }
+       y = SQTPI * y * w;
+       return (y);
+}
+
+long double __tgammal_r(long double, int *);
+
+long double __tgammal_r(long double x, int* sgngaml)
+{
+       long double p, q, z;
+       int i;
+
+       *sgngaml = 1;
+#ifdef NANS
+       if (isnanl(x))
+               return (NANL);
+#endif
+#ifdef INFINITIES
+#ifdef NANS
+       if (x == INFINITYL)
+               return (x);
+       if (x == -INFINITYL)
+               return (NANL);
+#else
+       if (!isfinite(x))
+               return (x);
+#endif
+#endif
+       q = fabsl(x);
+
+       if (q > 13.0L)
+       {
+               if (q > MAXGAML)
+                       goto goverf;
+               if (x < 0.0L)
+               {
+                       p = floorl(q);
+                       if (p == q)
+                       {
+gsing:
+                               _SET_ERRNO(EDOM);
+                               mtherr("tgammal", SING);
+#ifdef INFINITIES
+                               return (INFINITYL);
+#else
+                               return (*sgngaml * MAXNUML);
+#endif
+                       }
+                       i = p;
+                       if ((i & 1) == 0)
+                               *sgngaml = -1;
+                       z = q - p;
+                       if (z > 0.5L)
+                       {
+                               p += 1.0L;
+                               z = q - p;
+                       }
+                       z = q * sinl(PIL * z);
+                       z = fabsl(z) * stirf(q);
+                       if (z <= PIL/MAXNUML)
+                       {
+goverf:
+                               _SET_ERRNO(ERANGE);
+                               mtherr("tgammal", OVERFLOW);
+#ifdef INFINITIES
+                               return(*sgngaml * INFINITYL);
+#else
+                               return(*sgngaml * MAXNUML);
+#endif
+                       }
+                       z = PIL/z;
+               }
+               else
+               {
+                       z = stirf(x);
+               }
+               return (*sgngaml * z);
+       }
+
+       z = 1.0L;
+       while (x >= 3.0L)
+       {
+               x -= 1.0L;
+               z *= x;
+       }
+
+       while (x < -0.03125L)
+       {
+               z /= x;
+               x += 1.0L;
+       }
+
+       if (x <= 0.03125L)
+               goto Small;
+
+       while (x < 2.0L)
+       {
+               z /= x;
+               x += 1.0L;
+       }
+
+       if (x == 2.0L)
+               return (z);
+
+       x -= 2.0L;
+       p = polevll( x, P, 7 );
+       q = polevll( x, Q, 8 );
+       return (z * p / q);
+
+Small:
+       if (x == 0.0L)
+       {
+               goto gsing;
+       }
+       else
+       {
+               if (x < 0.0L)
+               {
+                       x = -x;
+                       q = z / (x * polevll(x, SN, 8));
+               }
+               else
+                       q = z / (x * polevll(x, S, 8));
+       }
+       return q;
+}
+
+/* This is the C99 version. */
+long double tgammal(long double x)
+{
+       int local_sgngaml = 0;
+       return (__tgammal_r(x, &local_sgngaml));
+}
+
diff --git a/winsup/cygwin/math/truncl.c b/winsup/cygwin/math/truncl.c
new file mode 100644 (file)
index 0000000..ddc6af6
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+#include <math.h>
+
+long double
+truncl (long double _x)
+{
+#if defined(_ARM_) || defined(__arm__)
+  return trunc(_x);
+#else
+  long double retval = 0.0L;
+  unsigned short saved_cw;
+  unsigned short tmp_cw;
+  __asm__ __volatile__ ("fnstcw %0;" : "=m" (saved_cw)); /* save FPU control word */
+  tmp_cw = (saved_cw & ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO))
+           | FE_TOWARDZERO;
+  __asm__ __volatile__ ("fldcw %0;" : : "m" (tmp_cw));
+  __asm__ __volatile__ ("frndint;" : "=t" (retval)  : "0" (_x)); /* round towards zero */
+  __asm__ __volatile__ ("fldcw %0;" : : "m" (saved_cw) ); /* restore saved control word */
+  return retval;
+#endif /* defined(_ARM_) || defined(__arm__) */
+}
index 24f2584c6d08ec2a57b978f37fc98755ab0028af..e1896bf8a524816f43fe77c7b9de7ead07ecae16 100644 (file)
@@ -12,9 +12,3 @@ __wrap__ZnwmRKSt9nothrow_t NOSIGFE  # void *operator new(std::size_t sz, const s
 _alloca = __alloca NOSIGFE
 _dll_crt0 NOSIGFE
 dll_entry NOSIGFE
-llrint NOSIGFE
-llrintf NOSIGFE
-lrint NOSIGFE
-lrintf NOSIGFE
-rint NOSIGFE
-rintf NOSIGFE
This page took 0.315128 seconds and 5 git commands to generate.