summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/math
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2016-03-28 19:35:20 +0200
committerCorinna Vinschen <corinna@vinschen.de>2016-03-29 14:43:55 +0200
commit792e51b721491b19904e046124fb8c4c0e83f621 (patch)
treea7449cd3a88b63385954605f715c0208d3aa6833 /winsup/cygwin/math
parent087aca6163236ab7ce55d73bba938ebaed57c2d7 (diff)
downloadcygnal-792e51b721491b19904e046124fb8c4c0e83f621.tar.gz
cygnal-792e51b721491b19904e046124fb8c4c0e83f621.tar.bz2
cygnal-792e51b721491b19904e046124fb8c4c0e83f621.zip
Add missing long double functions to Cygwin
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>
Diffstat (limited to 'winsup/cygwin/math')
-rw-r--r--winsup/cygwin/math/DISCLAIMER.PD9
-rw-r--r--winsup/cygwin/math/acosh.def.h70
-rw-r--r--winsup/cygwin/math/acoshl.c46
-rw-r--r--winsup/cygwin/math/acosl.c22
-rw-r--r--winsup/cygwin/math/asinhl.c33
-rw-r--r--winsup/cygwin/math/asinl.c27
-rw-r--r--winsup/cygwin/math/atan2l.c14
-rw-r--r--winsup/cygwin/math/atanhl.c34
-rw-r--r--winsup/cygwin/math/atanl.c17
-rw-r--r--winsup/cygwin/math/cabs.def.h49
-rw-r--r--winsup/cygwin/math/cabsl.c48
-rw-r--r--winsup/cygwin/math/cacos.def.h57
-rw-r--r--winsup/cygwin/math/cacosh.def.h100
-rw-r--r--winsup/cygwin/math/cacosl.c50
-rw-r--r--winsup/cygwin/math/carg.def.h49
-rw-r--r--winsup/cygwin/math/cargl.c48
-rw-r--r--winsup/cygwin/math/casin.def.h61
-rw-r--r--winsup/cygwin/math/casinh.def.h99
-rw-r--r--winsup/cygwin/math/casinl.c50
-rw-r--r--winsup/cygwin/math/catan.def.h61
-rw-r--r--winsup/cygwin/math/catanh.def.h93
-rw-r--r--winsup/cygwin/math/catanl.c50
-rw-r--r--winsup/cygwin/math/cbrtl.c80
-rw-r--r--winsup/cygwin/math/ccos.def.h54
-rw-r--r--winsup/cygwin/math/ccosh.def.h95
-rw-r--r--winsup/cygwin/math/ccosl.c50
-rw-r--r--winsup/cygwin/math/ceil.S124
-rw-r--r--winsup/cygwin/math/ceilf.S120
-rw-r--r--winsup/cygwin/math/ceill.S64
-rw-r--r--winsup/cygwin/math/cephes_emath.c1283
-rw-r--r--winsup/cygwin/math/cephes_emath.h719
-rw-r--r--winsup/cygwin/math/cephes_mconf.h417
-rw-r--r--winsup/cygwin/math/cexp.def.h111
-rw-r--r--winsup/cygwin/math/cexpl.c48
-rw-r--r--winsup/cygwin/math/cimag.def.h49
-rw-r--r--winsup/cygwin/math/cimagl.c48
-rw-r--r--winsup/cygwin/math/clog.def.h71
-rw-r--r--winsup/cygwin/math/clog10.def.h71
-rw-r--r--winsup/cygwin/math/clog10l.c48
-rw-r--r--winsup/cygwin/math/clogl.c48
-rw-r--r--winsup/cygwin/math/complex_internal.h153
-rw-r--r--winsup/cygwin/math/conj.def.h49
-rw-r--r--winsup/cygwin/math/conjl.c48
-rw-r--r--winsup/cygwin/math/copysignl.S56
-rw-r--r--winsup/cygwin/math/cos.def.h65
-rw-r--r--winsup/cygwin/math/coshl.c45
-rw-r--r--winsup/cygwin/math/cosl.c46
-rw-r--r--winsup/cygwin/math/cosl_internal.S55
-rw-r--r--winsup/cygwin/math/cossin.c75
-rw-r--r--winsup/cygwin/math/cpow.def.h49
-rw-r--r--winsup/cygwin/math/cpowl.c48
-rw-r--r--winsup/cygwin/math/cproj.def.h58
-rw-r--r--winsup/cygwin/math/cprojl.c48
-rw-r--r--winsup/cygwin/math/creal.def.h49
-rw-r--r--winsup/cygwin/math/creall.c48
-rw-r--r--winsup/cygwin/math/csin.def.h61
-rw-r--r--winsup/cygwin/math/csinh.def.h107
-rw-r--r--winsup/cygwin/math/csinl.c50
-rw-r--r--winsup/cygwin/math/csqrt.def.h122
-rw-r--r--winsup/cygwin/math/csqrtl.c48
-rw-r--r--winsup/cygwin/math/ctan.def.h61
-rw-r--r--winsup/cygwin/math/ctanh.def.h94
-rw-r--r--winsup/cygwin/math/ctanl.c50
-rw-r--r--winsup/cygwin/math/erfl.c303
-rw-r--r--winsup/cygwin/math/exp.def.h136
-rw-r--r--winsup/cygwin/math/exp10l.c8
-rw-r--r--winsup/cygwin/math/exp2.S94
-rw-r--r--winsup/cygwin/math/exp2l.S92
-rw-r--r--winsup/cygwin/math/expl.c46
-rw-r--r--winsup/cygwin/math/expm1.def.h72
-rw-r--r--winsup/cygwin/math/expm1l.c46
-rw-r--r--winsup/cygwin/math/fabsl.c18
-rw-r--r--winsup/cygwin/math/fastmath.h120
-rw-r--r--winsup/cygwin/math/fdiml.c24
-rw-r--r--winsup/cygwin/math/finite.c19
-rw-r--r--winsup/cygwin/math/floorl.S72
-rw-r--r--winsup/cygwin/math/fmal.c12
-rw-r--r--winsup/cygwin/math/fmaxl.c13
-rw-r--r--winsup/cygwin/math/fminl.c12
-rw-r--r--winsup/cygwin/math/fmodl.c20
-rw-r--r--winsup/cygwin/math/frexpl.S130
-rw-r--r--winsup/cygwin/math/ilogbl.S65
-rw-r--r--winsup/cygwin/math/internal_logl.S66
-rw-r--r--winsup/cygwin/math/isinf.c18
-rw-r--r--winsup/cygwin/math/isnan.c18
-rw-r--r--winsup/cygwin/math/ldexpl.c23
-rw-r--r--winsup/cygwin/math/lgammal.c342
-rw-r--r--winsup/cygwin/math/llrint.c18
-rw-r--r--winsup/cygwin/math/llrintf.c17
-rw-r--r--winsup/cygwin/math/llrintl.c18
-rw-r--r--winsup/cygwin/math/llroundl.c38
-rw-r--r--winsup/cygwin/math/log.def.h69
-rw-r--r--winsup/cygwin/math/log10l.S93
-rw-r--r--winsup/cygwin/math/log1pl.S102
-rw-r--r--winsup/cygwin/math/log2l.S87
-rw-r--r--winsup/cygwin/math/logbl.c22
-rw-r--r--winsup/cygwin/math/logl.c46
-rw-r--r--winsup/cygwin/math/lrint.c30
-rw-r--r--winsup/cygwin/math/lrintf.c30
-rw-r--r--winsup/cygwin/math/lrintl.c18
-rw-r--r--winsup/cygwin/math/lroundl.c37
-rw-r--r--winsup/cygwin/math/modfl.c41
-rw-r--r--winsup/cygwin/math/nearbyint.S57
-rw-r--r--winsup/cygwin/math/nearbyintf.S57
-rw-r--r--winsup/cygwin/math/nearbyintl.S58
-rw-r--r--winsup/cygwin/math/nextafterl.c71
-rw-r--r--winsup/cygwin/math/nexttoward.c47
-rw-r--r--winsup/cygwin/math/nexttowardf.c43
-rw-r--r--winsup/cygwin/math/pow.def.h215
-rw-r--r--winsup/cygwin/math/pow10l.c8
-rw-r--r--winsup/cygwin/math/powi.def.h153
-rw-r--r--winsup/cygwin/math/powil.c46
-rw-r--r--winsup/cygwin/math/powl.c46
-rw-r--r--winsup/cygwin/math/remainder.S40
-rw-r--r--winsup/cygwin/math/remainderf.S40
-rw-r--r--winsup/cygwin/math/remainderl.S39
-rw-r--r--winsup/cygwin/math/remquol.S75
-rw-r--r--winsup/cygwin/math/rint.c29
-rw-r--r--winsup/cygwin/math/rintf.c29
-rw-r--r--winsup/cygwin/math/rintl.c16
-rw-r--r--winsup/cygwin/math/roundl.c26
-rw-r--r--winsup/cygwin/math/scalbl.S35
-rw-r--r--winsup/cygwin/math/scalbnl.S41
-rw-r--r--winsup/cygwin/math/sin.def.h65
-rw-r--r--winsup/cygwin/math/sinhl.c100
-rw-r--r--winsup/cygwin/math/sinl.c46
-rw-r--r--winsup/cygwin/math/sinl_internal.S58
-rw-r--r--winsup/cygwin/math/sqrt.def.h94
-rw-r--r--winsup/cygwin/math/sqrtl.c46
-rw-r--r--winsup/cygwin/math/tanhl.c92
-rw-r--r--winsup/cygwin/math/tanl.S62
-rw-r--r--winsup/cygwin/math/tgammal.c393
-rw-r--r--winsup/cygwin/math/truncl.c26
133 files changed, 10660 insertions, 0 deletions
diff --git a/winsup/cygwin/math/DISCLAIMER.PD b/winsup/cygwin/math/DISCLAIMER.PD
new file mode 100644
index 000000000..6c2a7c3bb
--- /dev/null
+++ b/winsup/cygwin/math/DISCLAIMER.PD
@@ -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
index 000000000..c039bd8eb
--- /dev/null
+++ b/winsup/cygwin/math/acosh.def.h
@@ -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
index 000000000..88f9f130e
--- /dev/null
+++ b/winsup/cygwin/math/acoshl.c
@@ -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
index 000000000..511b5def2
--- /dev/null
+++ b/winsup/cygwin/math/acosl.c
@@ -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
index 000000000..bb2ca97b2
--- /dev/null
+++ b/winsup/cygwin/math/asinhl.c
@@ -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
index 000000000..a4d8746be
--- /dev/null
+++ b/winsup/cygwin/math/asinl.c
@@ -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
index 000000000..a32b097fb
--- /dev/null
+++ b/winsup/cygwin/math/atan2l.c
@@ -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
index 000000000..59eb1bd91
--- /dev/null
+++ b/winsup/cygwin/math/atanhl.c
@@ -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
index 000000000..b85d05350
--- /dev/null
+++ b/winsup/cygwin/math/atanl.c
@@ -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
index 000000000..b3ea09764
--- /dev/null
+++ b/winsup/cygwin/math/cabs.def.h
@@ -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
index 000000000..c750e877d
--- /dev/null
+++ b/winsup/cygwin/math/cabsl.c
@@ -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
index 000000000..300faffac
--- /dev/null
+++ b/winsup/cygwin/math/cacos.def.h
@@ -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
index 000000000..f4ea2da07
--- /dev/null
+++ b/winsup/cygwin/math/cacosh.def.h
@@ -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
index 000000000..7a8df652d
--- /dev/null
+++ b/winsup/cygwin/math/cacosl.c
@@ -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
index 000000000..2ccf84189
--- /dev/null
+++ b/winsup/cygwin/math/carg.def.h
@@ -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
index 000000000..e70f580ea
--- /dev/null
+++ b/winsup/cygwin/math/cargl.c
@@ -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
index 000000000..808c1bef0
--- /dev/null
+++ b/winsup/cygwin/math/casin.def.h
@@ -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
index 000000000..050d885a0
--- /dev/null
+++ b/winsup/cygwin/math/casinh.def.h
@@ -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
index 000000000..1d7e24785
--- /dev/null
+++ b/winsup/cygwin/math/casinl.c
@@ -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
index 000000000..19db6b78b
--- /dev/null
+++ b/winsup/cygwin/math/catan.def.h
@@ -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
index 000000000..68949d139
--- /dev/null
+++ b/winsup/cygwin/math/catanh.def.h
@@ -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
index 000000000..9c1ccdfcb
--- /dev/null
+++ b/winsup/cygwin/math/catanl.c
@@ -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
index 000000000..95074e964
--- /dev/null
+++ b/winsup/cygwin/math/cbrtl.c
@@ -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
index 000000000..2e7472cd9
--- /dev/null
+++ b/winsup/cygwin/math/ccos.def.h
@@ -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
index 000000000..c18d657bf
--- /dev/null
+++ b/winsup/cygwin/math/ccosh.def.h
@@ -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
index 000000000..594a4d1de
--- /dev/null
+++ b/winsup/cygwin/math/ccosl.c
@@ -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
index 000000000..636df1e30
--- /dev/null
+++ b/winsup/cygwin/math/ceil.S
@@ -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
index 000000000..605c7bffa
--- /dev/null
+++ b/winsup/cygwin/math/ceilf.S
@@ -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
index 000000000..61d619929
--- /dev/null
+++ b/winsup/cygwin/math/ceill.S
@@ -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
index 000000000..8fb44346c
--- /dev/null
+++ b/winsup/cygwin/math/cephes_emath.c
@@ -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
index 000000000..b92d710f6
--- /dev/null
+++ b/winsup/cygwin/math/cephes_emath.h
@@ -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
index 000000000..832fae0df
--- /dev/null
+++ b/winsup/cygwin/math/cephes_mconf.h
@@ -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
index 000000000..c0c97b70f
--- /dev/null
+++ b/winsup/cygwin/math/cexp.def.h
@@ -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
index 000000000..9c33bc05c
--- /dev/null
+++ b/winsup/cygwin/math/cexpl.c
@@ -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
index 000000000..0212d9390
--- /dev/null
+++ b/winsup/cygwin/math/cimag.def.h
@@ -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
index 000000000..94835d745
--- /dev/null
+++ b/winsup/cygwin/math/cimagl.c
@@ -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
index 000000000..604c3f321
--- /dev/null
+++ b/winsup/cygwin/math/clog.def.h
@@ -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
index 000000000..cdd4eb6b5
--- /dev/null
+++ b/winsup/cygwin/math/clog10.def.h
@@ -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
index 000000000..8baa2aafd
--- /dev/null
+++ b/winsup/cygwin/math/clog10l.c
@@ -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
index 000000000..383fcfa0f
--- /dev/null
+++ b/winsup/cygwin/math/clogl.c
@@ -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
index 000000000..b230b15b8
--- /dev/null
+++ b/winsup/cygwin/math/complex_internal.h
@@ -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
index 000000000..35fa8989d
--- /dev/null
+++ b/winsup/cygwin/math/conj.def.h
@@ -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
index 000000000..52e32e65a
--- /dev/null
+++ b/winsup/cygwin/math/conjl.c
@@ -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
index 000000000..ffe6240d5
--- /dev/null
+++ b/winsup/cygwin/math/copysignl.S
@@ -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
index 000000000..1058d031f
--- /dev/null
+++ b/winsup/cygwin/math/cos.def.h
@@ -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
index 000000000..d7eb4b7cb
--- /dev/null
+++ b/winsup/cygwin/math/coshl.c
@@ -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
index 000000000..f798862d3
--- /dev/null
+++ b/winsup/cygwin/math/cosl.c
@@ -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
index 000000000..3c8f60d14
--- /dev/null
+++ b/winsup/cygwin/math/cosl_internal.S
@@ -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
index 000000000..0095daa66
--- /dev/null
+++ b/winsup/cygwin/math/cossin.c
@@ -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
index 000000000..984224b96
--- /dev/null
+++ b/winsup/cygwin/math/cpow.def.h
@@ -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
index 000000000..42edb7996
--- /dev/null
+++ b/winsup/cygwin/math/cpowl.c
@@ -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
index 000000000..e15d779f7
--- /dev/null
+++ b/winsup/cygwin/math/cproj.def.h
@@ -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
index 000000000..d48d10877
--- /dev/null
+++ b/winsup/cygwin/math/cprojl.c
@@ -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
index 000000000..554c99d8c
--- /dev/null
+++ b/winsup/cygwin/math/creal.def.h
@@ -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
index 000000000..e46c8ea37
--- /dev/null
+++ b/winsup/cygwin/math/creall.c
@@ -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
index 000000000..cf9cfe108
--- /dev/null
+++ b/winsup/cygwin/math/csin.def.h
@@ -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
index 000000000..3e07d2bab
--- /dev/null
+++ b/winsup/cygwin/math/csinh.def.h
@@ -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
index 000000000..de04104c8
--- /dev/null
+++ b/winsup/cygwin/math/csinl.c
@@ -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
index 000000000..714f303c1
--- /dev/null
+++ b/winsup/cygwin/math/csqrt.def.h
@@ -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
index 000000000..1993289b5
--- /dev/null
+++ b/winsup/cygwin/math/csqrtl.c
@@ -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
index 000000000..28df5f330
--- /dev/null
+++ b/winsup/cygwin/math/ctan.def.h
@@ -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
index 000000000..11a183648
--- /dev/null
+++ b/winsup/cygwin/math/ctanh.def.h
@@ -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
index 000000000..eb7e37807
--- /dev/null
+++ b/winsup/cygwin/math/ctanl.c
@@ -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
index 000000000..3832fe9e0
--- /dev/null
+++ b/winsup/cygwin/math/erfl.c
@@ -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
index 000000000..2419ef6d1
--- /dev/null
+++ b/winsup/cygwin/math/exp.def.h
@@ -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
index 000000000..821b8f5c3
--- /dev/null
+++ b/winsup/cygwin/math/exp10l.c
@@ -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
index 000000000..37d4a2b89
--- /dev/null
+++ b/winsup/cygwin/math/exp2.S
@@ -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
index 000000000..2e58c37b8
--- /dev/null
+++ b/winsup/cygwin/math/exp2l.S
@@ -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
index 000000000..7f4be6239
--- /dev/null
+++ b/winsup/cygwin/math/expl.c
@@ -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
index 000000000..5a2b6f498
--- /dev/null
+++ b/winsup/cygwin/math/expm1.def.h
@@ -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
index 000000000..625fbb1d7
--- /dev/null
+++ b/winsup/cygwin/math/expm1l.c
@@ -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
index 000000000..2dfdfaa45
--- /dev/null
+++ b/winsup/cygwin/math/fabsl.c
@@ -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
index 000000000..a6bb467c2
--- /dev/null
+++ b/winsup/cygwin/math/fastmath.h
@@ -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
index 000000000..3be0679ac
--- /dev/null
+++ b/winsup/cygwin/math/fdiml.c
@@ -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
index 000000000..bcef72a92
--- /dev/null
+++ b/winsup/cygwin/math/finite.c
@@ -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
index 000000000..19ab3f099
--- /dev/null
+++ b/winsup/cygwin/math/floorl.S
@@ -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
index 000000000..3d0eb020b
--- /dev/null
+++ b/winsup/cygwin/math/fmal.c
@@ -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
index 000000000..4ac6e2194
--- /dev/null
+++ b/winsup/cygwin/math/fmaxl.c
@@ -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
index 000000000..0396a8eba
--- /dev/null
+++ b/winsup/cygwin/math/fminl.c
@@ -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
index 000000000..6224db13b
--- /dev/null
+++ b/winsup/cygwin/math/fmodl.c
@@ -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
index 000000000..f9fcc6be1
--- /dev/null
+++ b/winsup/cygwin/math/frexpl.S
@@ -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
index 000000000..f68082ce6
--- /dev/null
+++ b/winsup/cygwin/math/ilogbl.S
@@ -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
index 000000000..f8a075774
--- /dev/null
+++ b/winsup/cygwin/math/internal_logl.S
@@ -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
index 000000000..e7d3e2626
--- /dev/null
+++ b/winsup/cygwin/math/isinf.c
@@ -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
index 000000000..ac68bef6d
--- /dev/null
+++ b/winsup/cygwin/math/isnan.c
@@ -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
index 000000000..fde31a23c
--- /dev/null
+++ b/winsup/cygwin/math/ldexpl.c
@@ -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
index 000000000..03c030e00
--- /dev/null
+++ b/winsup/cygwin/math/lgammal.c
@@ -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
index 000000000..1fc11e886
--- /dev/null
+++ b/winsup/cygwin/math/llrint.c
@@ -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
index 000000000..aabd81f33
--- /dev/null
+++ b/winsup/cygwin/math/llrintf.c
@@ -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
index 000000000..59ace2dfe
--- /dev/null
+++ b/winsup/cygwin/math/llrintl.c
@@ -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
index 000000000..fc600e77d
--- /dev/null
+++ b/winsup/cygwin/math/llroundl.c
@@ -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
index 000000000..94a77007f
--- /dev/null
+++ b/winsup/cygwin/math/log.def.h
@@ -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
index 000000000..33d45a3a8
--- /dev/null
+++ b/winsup/cygwin/math/log10l.S
@@ -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
index 000000000..a56bcf4ec
--- /dev/null
+++ b/winsup/cygwin/math/log1pl.S
@@ -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
index 000000000..771cd8ae4
--- /dev/null
+++ b/winsup/cygwin/math/log2l.S
@@ -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
index 000000000..310c4457b
--- /dev/null
+++ b/winsup/cygwin/math/logbl.c
@@ -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
index 000000000..a0fa386dc
--- /dev/null
+++ b/winsup/cygwin/math/logl.c
@@ -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
index 000000000..0409da660
--- /dev/null
+++ b/winsup/cygwin/math/lrint.c
@@ -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
index 000000000..2b6d89318
--- /dev/null
+++ b/winsup/cygwin/math/lrintf.c
@@ -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
index 000000000..94c4e4924
--- /dev/null
+++ b/winsup/cygwin/math/lrintl.c
@@ -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
index 000000000..b4584a896
--- /dev/null
+++ b/winsup/cygwin/math/lroundl.c
@@ -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
index 000000000..af75a8b8c
--- /dev/null
+++ b/winsup/cygwin/math/modfl.c
@@ -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
index 000000000..8aec9bdb0
--- /dev/null
+++ b/winsup/cygwin/math/nearbyint.S
@@ -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
index 000000000..460e1a5e5
--- /dev/null
+++ b/winsup/cygwin/math/nearbyintf.S
@@ -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
index 000000000..f4262a2e0
--- /dev/null
+++ b/winsup/cygwin/math/nearbyintl.S
@@ -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
index 000000000..5db3af74a
--- /dev/null
+++ b/winsup/cygwin/math/nextafterl.c
@@ -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
index 000000000..909f6ea2d
--- /dev/null
+++ b/winsup/cygwin/math/nexttoward.c
@@ -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
index 000000000..0a2f3bfb7
--- /dev/null
+++ b/winsup/cygwin/math/nexttowardf.c
@@ -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
index 000000000..a5513c1f9
--- /dev/null
+++ b/winsup/cygwin/math/pow.def.h
@@ -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
index 000000000..ad5348951
--- /dev/null
+++ b/winsup/cygwin/math/pow10l.c
@@ -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
index 000000000..f7fa860a6
--- /dev/null
+++ b/winsup/cygwin/math/powi.def.h
@@ -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
index 000000000..d3e08e301
--- /dev/null
+++ b/winsup/cygwin/math/powil.c
@@ -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
index 000000000..686437069
--- /dev/null
+++ b/winsup/cygwin/math/powl.c
@@ -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
index 000000000..5a713f904
--- /dev/null
+++ b/winsup/cygwin/math/remainder.S
@@ -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
index 000000000..c3a3a3dc5
--- /dev/null
+++ b/winsup/cygwin/math/remainderf.S
@@ -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
index 000000000..a69e38296
--- /dev/null
+++ b/winsup/cygwin/math/remainderl.S
@@ -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
index 000000000..42cc2a78d
--- /dev/null
+++ b/winsup/cygwin/math/remquol.S
@@ -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
index 000000000..01f9644b1
--- /dev/null
+++ b/winsup/cygwin/math/rint.c
@@ -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
index 000000000..09c641bcd
--- /dev/null
+++ b/winsup/cygwin/math/rintf.c
@@ -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
index 000000000..9ec159d17
--- /dev/null
+++ b/winsup/cygwin/math/rintl.c
@@ -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
index 000000000..9879a82cc
--- /dev/null
+++ b/winsup/cygwin/math/roundl.c
@@ -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
index 000000000..f9675ac4b
--- /dev/null
+++ b/winsup/cygwin/math/scalbl.S
@@ -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
index 000000000..5ff0a68f3
--- /dev/null
+++ b/winsup/cygwin/math/scalbnl.S
@@ -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
index 000000000..c9b3b0499
--- /dev/null
+++ b/winsup/cygwin/math/sin.def.h
@@ -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
index 000000000..f6ecef0f2
--- /dev/null
+++ b/winsup/cygwin/math/sinhl.c
@@ -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
index 000000000..0bbb71d37
--- /dev/null
+++ b/winsup/cygwin/math/sinl.c
@@ -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
index 000000000..6d766b098
--- /dev/null
+++ b/winsup/cygwin/math/sinl_internal.S
@@ -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
index 000000000..1048130d0
--- /dev/null
+++ b/winsup/cygwin/math/sqrt.def.h
@@ -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
index 000000000..ffd818591
--- /dev/null
+++ b/winsup/cygwin/math/sqrtl.c
@@ -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
index 000000000..2c48a6aab
--- /dev/null
+++ b/winsup/cygwin/math/tanhl.c
@@ -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
index 000000000..f11b53920
--- /dev/null
+++ b/winsup/cygwin/math/tanl.S
@@ -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
index 000000000..99408eed7
--- /dev/null
+++ b/winsup/cygwin/math/tgammal.c
@@ -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
index 000000000..ddc6af68f
--- /dev/null
+++ b/winsup/cygwin/math/truncl.c
@@ -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__) */
+}