diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index 8f3b4b8..edfbfc5 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -435,7 +435,7 @@
   gdtoa/strtopx.c   gdtoa/sum.c      gdtoa/ulp.c    \
   \
   math/cbrt.c           \
-  math/cbrtf.c          math/cbrtl.c       math/cephes_emath.c   math/copysign.c      math/copysignf.c     \
+  math/cbrtf.c          math/cbrtl.c       math/copysign.c      math/copysignf.c     \
   math/coshf.c          math/coshl.c       math/erfl.c           \
   math/expf.c           \
   math/fabs.c           math/fabsf.c       math/fabsl.c          math/fdim.c          math/fdimf.c         math/fdiml.c         \
@@ -457,7 +457,7 @@
   math/sqrtf.c          math/sqrtl.c       math/tanhf.c          math/tanhl.c         math/tgamma.c        \
   math/tgammaf.c        math/tgammal.c     math/truncl.c         \
   math/powi.def.h       math/sqrt.def.h       \
-  math/cephes_emath.h   math/cephes_mconf.h math/fp_consts.h     math/abs64.c \
+  math/cephes_mconf.h   math/fp_consts.h   math/abs64.c \
   \
   misc/mb_wc_common.h \
   misc/mingw_longjmp.S \
@@ -474,7 +474,7 @@
   misc/mingw_matherr.c   misc/mingw_mbwc_convert.c  misc/mingw_usleep.c     misc/mingw_wcstod.c          misc/mingw_wcstof.c    \
   misc/mkstemp.c             misc/seterrno.c         misc/sleep.c          \
   misc/strnlen.c         misc/strsafe.c         \
-  misc/strtoimax.c       misc/strtold.c             misc/strtoumax.c        misc/tdelete.c               misc/tfind.c           \
+  misc/strtoimax.c       misc/strtoumax.c        misc/tdelete.c               misc/tfind.c           \
   misc/tsearch.c         misc/twalk.c           \
   misc/wcsnlen.c         misc/wcstof.c          \
   misc/wcstoimax.c       misc/wcstold.c             misc/wcstoumax.c        misc/wctob.c                 misc/wctrans.c         \
diff --git a/mingw-w64-crt/gdtoa/strtodnrp.c b/mingw-w64-crt/gdtoa/strtodnrp.c
index a7b9972..97d74fc 100644
--- a/mingw-w64-crt/gdtoa/strtodnrp.c
+++ b/mingw-w64-crt/gdtoa/strtodnrp.c
@@ -93,4 +93,8 @@
 long double __cdecl
 __mingw_strtold (const char * __restrict__ src, char ** __restrict__ endptr)
   __attribute__((alias("__strtod")));
+
+long double __cdecl
+strtold (const char * __restrict__ src, char ** __restrict__ endptr)
+  __attribute__((alias("__strtod")));
 #endif
diff --git a/mingw-w64-crt/gdtoa/strtopx.c b/mingw-w64-crt/gdtoa/strtopx.c
index 64db719..eb0d63b 100644
--- a/mingw-w64-crt/gdtoa/strtopx.c
+++ b/mingw-w64-crt/gdtoa/strtopx.c
@@ -127,4 +127,8 @@
 __mingw_strtold (const char * __restrict__ src, char ** __restrict__ endptr)
   __attribute__((alias("__strtold")));
 
+long double __cdecl
+strtold (const char * __restrict__ src, char ** __restrict__ endptr)
+  __attribute__((alias("__strtold")));
+
 #endif
diff --git a/mingw-w64-crt/math/cephes_emath.c b/mingw-w64-crt/math/cephes_emath.c
deleted file mode 100644
index 41e297c..0000000
--- a/mingw-w64-crt/math/cephes_emath.c
+++ /dev/null
@@ -1,1283 +0,0 @@
-/**
- * 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 >= 32767L)
-		goto overf;
-#else
-	if ((j > NBITS) && (expo < 32767L))
-	{
-		__ecleazs(s);
-		return;
-	}
-#endif
-	if (expo < 0L)
-	{
-		if (expo > (long)(-NBITS - 1))
-		{
-			j = (int)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 >= 32767L)
-	{
-#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/mingw-w64-crt/math/cephes_emath.h b/mingw-w64-crt/math/cephes_emath.h
deleted file mode 100644
index 58a8e13..0000000
--- a/mingw-w64-crt/math/cephes_emath.h
+++ /dev/null
@@ -1,719 +0,0 @@
-/**
- * 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(fname, code)
-
-
-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 1
-
-/* 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/mingw-w64-crt/misc/strtold.c b/mingw-w64-crt/misc/strtold.c
deleted file mode 100644
index 2b99eba..0000000
--- a/mingw-w64-crt/misc/strtold.c
+++ /dev/null
@@ -1,398 +0,0 @@
-/**
- * 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/cephes_emath.h"
-
-#if NE == 10
-/* 1.0E0 */
-static const unsigned short __eone[NE] = {
-  0x0000, 0x0000, 0x0000, 0x0000,
-  0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3fff,
-};
-#else
-static const unsigned short __eone[NE] = {
-  0, 0000000,0000000,0000000,0100000,0x3fff,
-};
-#endif
-
-#if NE == 10
-static const unsigned short __etens[NTEN + 1][NE] =
-{
-  {0x6576, 0x4a92, 0x804a, 0x153f,
-   0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,},	/* 10**4096 */
-  {0x6a32, 0xce52, 0x329a, 0x28ce,
-   0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,},	/* 10**2048 */
-  {0x526c, 0x50ce, 0xf18b, 0x3d28,
-   0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
-  {0x9c66, 0x58f8, 0xbc50, 0x5c54,
-   0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
-  {0x851e, 0xeab7, 0x98fe, 0x901b,
-   0xddbb, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
-  {0x0235, 0x0137, 0x36b1, 0x336c,
-   0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
-  {0x50f8, 0x25fb, 0xc76b, 0x6b71,
-   0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
-  {0x0000, 0x0000, 0x0000, 0x0000,
-   0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
-  {0x0000, 0x0000, 0x0000, 0x0000,
-   0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
-  {0x0000, 0x0000, 0x0000, 0x0000,
-   0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
-  {0x0000, 0x0000, 0x0000, 0x0000,
-   0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
-  {0x0000, 0x0000, 0x0000, 0x0000,
-   0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
-  {0x0000, 0x0000, 0x0000, 0x0000,
-   0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,},	/* 10**1 */
-};
-#else
-static const unsigned short __etens[NTEN+1][NE] = {
-  {0xc94c,0x979a,0x8a20,0x5202,0xc460,0x7525,},/* 10**4096 */
-  {0xa74d,0x5de4,0xc53d,0x3b5d,0x9e8b,0x5a92,},/* 10**2048 */
-  {0x650d,0x0c17,0x8175,0x7586,0xc976,0x4d48,},
-  {0xcc65,0x91c6,0xa60e,0xa0ae,0xe319,0x46a3,},
-  {0xddbc,0xde8d,0x9df9,0xebfb,0xaa7e,0x4351,},
-  {0xc66f,0x8cdf,0x80e9,0x47c9,0x93ba,0x41a8,},
-  {0x3cbf,0xa6d5,0xffcf,0x1f49,0xc278,0x40d3,},
-  {0xf020,0xb59d,0x2b70,0xada8,0x9dc5,0x4069,},
-  {0x0000,0x0000,0x0400,0xc9bf,0x8e1b,0x4034,},
-  {0x0000,0x0000,0x0000,0x2000,0xbebc,0x4019,},
-  {0x0000,0x0000,0x0000,0x0000,0x9c40,0x400c,},
-  {0x0000,0x0000,0x0000,0x0000,0xc800,0x4005,},
-  {0x0000,0x0000,0x0000,0x0000,0xa000,0x4002,}, /* 10**1 */
-};
-#endif
-
-int __asctoe64(const char * __restrict__ ss, short unsigned int * __restrict__ y)
-{
-  unsigned short yy[NI], xt[NI], tt[NI];
-  int esign, decflg, nexp, expo, lost;
-  int k, c;
-  int valid_lead_string = 0;
-  int have_non_zero_mant = 0;
-  int prec = 0;
-  /* int trail = 0; */
-  int lexp;
-  unsigned short nsign = 0;
-  const unsigned short *p;
-  char *sp,  *lstr;
-  char *s;
-
-  const char dec_sym = *(localeconv ()->decimal_point); 
-
-  int lenldstr = 0;
-
-  /* Copy the input string. */
-  c = strlen (ss) + 2;
-  lstr = (char *) alloca (c);
-  s = (char *) ss;
-  while( isspace ((int)(unsigned char)*s)) /* skip leading spaces */
-    {
-      ++s;
-      ++lenldstr;
-    }
-  sp = lstr;
-  for (k = 0; k < c; k++)
-    {
-      if ((*sp++ = *s++) == '\0')
-	break;
-    }
-  *sp = '\0';
-  s = lstr;
-
-  if (*s == '-')
-    {
-      nsign = 0xffff;
-      ++s;
-    }
-  else if (*s == '+')
-    {
-     ++s;
-    }
-
-  if (_strnicmp("INF", s , 3) == 0)
-    {
-      valid_lead_string = 1;
-      s += 3;
-      if ( _strnicmp ("INITY", s, 5) == 0)
-	s += 5;
-      __ecleaz(yy);
-      yy[E] = 0x7fff;  /* infinity */
-      goto aexit;
-    }
-  else if(_strnicmp ("NAN", s, 3) == 0)
-    {
-      valid_lead_string = 1;
-      s += 3;
-      __enan_NI16( yy );
-      goto aexit;
-    }
-
-  /* FIXME: Handle case of strtold ("NAN(n_char_seq)",endptr)  */ 
-
-  /*  Now get some digits.  */
-  lost = 0;
-  decflg = 0;
-  nexp = 0;
-  expo = 0;
-  __ecleaz( yy );
-
-  /* Ignore leading zeros */
-  while (*s == '0')
-    {
-      valid_lead_string = 1;
-      s++;
-    }
-
-nxtcom:
-
-  k = *s - '0';
-  if ((k >= 0) && (k <= 9))
-    {
-#if 0
-/* The use of a special char as a flag for trailing zeroes causes problems when input
-   actually contains the char  */
-/* Identify and strip trailing zeros after the decimal point. */
-      if ((trail == 0) && (decflg != 0))
-	{
-	  sp = s;
-	  while ((*sp >= '0') && (*sp <= '9'))
-	    ++sp;
-	  --sp;
-	  while (*sp == '0')
-	    {
-	      *sp-- = (char)-1;
-	      trail++;
-	    }
-	  if( *s == (char)-1 )
-	    goto donchr;
-	}
-#endif
-
-/* If enough digits were given to more than fill up the yy register,
- * continuing until overflow into the high guard word yy[2]
- * guarantees that there will be a roundoff bit at the top
- * of the low guard word after normalization.
- */
-      if (yy[2] == 0)
-	{
-	  if( decflg )
-	    nexp += 1; /* count digits after decimal point */
-	  __eshup1( yy );	/* multiply current number by 10 */
-	  __emovz( yy, xt );
-	  __eshup1( xt );
-	  __eshup1( xt );
-	  __eaddm( xt, yy );
-	  __ecleaz( xt );
-	  xt[NI-2] = (unsigned short )k;
-	  __eaddm( xt, yy );
-	}
-      else
-	{
-	  /* Mark any lost non-zero digit.  */
-	  lost |= k;
-	  /* Count lost digits before the decimal point.  */
-	  if (decflg == 0)
-	    nexp -= 1;
-	}
-      have_non_zero_mant |= k;
-      prec ++;
-      /* goto donchr; */
-    }
-  else if (*s == dec_sym)
-    {
-      if( decflg )
-        goto daldone;
-      ++decflg;
-    }
-  else if ((*s == 'E') || (*s == 'e') )
-    {
-      if (prec || valid_lead_string)
-	goto expnt;
-      else
-	goto daldone;
-    }
-#if 0
-  else if (*s == (char)-1)
-    goto donchr;
-#endif
-  else  /* an invalid char */
-    goto daldone;
-
-  /* donchr: */
-  ++s;
-  goto nxtcom;
-
-/* Exponent interpretation */
-expnt:
-
-  esign = 1;
-  expo = 0;
-  /* Save position in case we need to fall back.  */
-  sp = s;
-  ++s;
-  /* check for + or - */
-  if (*s == '-')
-    {
-      esign = -1;
-      ++s;
-    }
-  if (*s == '+')
-    ++s;
-
-  /* Check for valid exponent.  */
-  if (!(*s >= '0' && *s <= '9'))
-    {
-      s = sp;
-      goto daldone;
-    }
-
-  while ((*s >= '0') && (*s <= '9'))
-    {
-    /* Stop modifying exp if we are going to overflow anyway,
-       but keep parsing the string. */	
-      if (expo < 4978)
-	{
-	  expo *= 10;
-	  expo += *s - '0';
-	}
-      s++;
-    }
-
-  if (esign < 0)
-    expo = -expo;
-
-  if (expo > 4977) /* maybe overflow */
-    {
-      __ecleaz(yy);
-      if (have_non_zero_mant)
-	yy[E] = 0x7fff;
-      goto aexit;
-    }
-  else if (expo < -4977) /* underflow */
-    {
-      __ecleaz(yy);
-      goto aexit;
-    }
-
-daldone:
-
-  nexp = expo - nexp;
-
-  /* Pad trailing zeros to minimize power of 10, per IEEE spec. */
-  while ((nexp > 0) && (yy[2] == 0))
-    {
-      __emovz( yy, xt );
-      __eshup1( xt );
-      __eshup1( xt );
-      __eaddm( yy, xt );
-      __eshup1( xt );
-      if (xt[2] != 0)
-	break;
-      nexp -= 1;
-      __emovz( xt, yy );
-    }
-  if ((k = __enormlz(yy)) > NBITS)
-    {
-      __ecleaz(yy);
-      goto aexit;
-    }
-  lexp = (EXONE - 1 + NBITS) - k;
-  __emdnorm( yy, lost, 0, lexp, 64, NBITS );
-  /* convert to external format */
-
-  /* Multiply by 10**nexp.  If precision is 64 bits,
-   * the maximum relative error incurred in forming 10**n
-   * for 0 <= n <= 324 is 8.2e-20, at 10**180.
-   * For 0 <= n <= 999, the peak relative error is 1.4e-19 at 10**947.
-   * For 0 >= n >= -999, it is -1.55e-19 at 10**-435.
-   */
-  lexp = yy[E];
-  if (nexp == 0)
-    {
-      k = 0;
-      goto expdon;
-    }
-  esign = 1;
-  if (nexp < 0)
-    {
-      nexp = -nexp;
-      esign = -1;
-      if (nexp > 4096)
-	{ /* Punt.  Can't handle this without 2 divides. */
-	  __emovi( __etens[0], tt );
-	  lexp -= tt[E];
-	  k = __edivm( tt, yy );
-	  lexp += EXONE;
-	  nexp -= 4096;
-	}
-    }
-  p = &__etens[NTEN][0];
-  __emov( __eone, xt );
-  expo = 1;
-  do
-    {
-      if (expo & nexp)
-	__emul( p, xt, xt );
-      p -= NE;
-      expo = expo + expo;
-    }
-  while (expo <= MAXP);
-
-  __emovi( xt, tt );
-  if (esign < 0)
-    {
-      lexp -= tt[E];
-      k = __edivm( tt, yy );
-      lexp += EXONE;
-    }
-  else
-    {
-      lexp += tt[E];
-      k = __emulm( tt, yy );
-      lexp -= EXONE - 1;
-    }
-
-expdon:
-
-  /* Round and convert directly to the destination type */
-
-  __emdnorm( yy, k, 0, lexp, 64, 64 );
-
-aexit:
-
-  yy[0] = nsign;
-
-  __toe64( yy, y );
-
-  /* Check for overflow, undeflow  */
-  if (have_non_zero_mant &&
-      (*((long double*) y) == 0.0L || isinf (*((long double*) y)))) 
-    errno = ERANGE;
-
-  if (prec || valid_lead_string)
-    return (lenldstr + (s - lstr));
-
-  return 0;
-}
-
-
-long double strtold (const char * __restrict__ s, char ** __restrict__ se)
-{
-  int lenldstr;
-  union
-  {
-    unsigned short int us[6];
-    long double ld;
-  } xx = {{0}};
-
-  lenldstr =  __asctoe64( s, xx.us);
-  if (se)
-    *se = (char*)s + lenldstr;
-
-  return xx.ld;
-}
-
