Loading...
gdtoa/FreeBSD/_hdtoa.c.patch /dev/null Libc-763.13
--- /dev/null
+++ Libc/Libc-763.13/gdtoa/FreeBSD/_hdtoa.c.patch
@@ -0,0 +1,118 @@
+--- _hdtoa.c.orig	2008-09-07 11:38:10.000000000 -0700
++++ _hdtoa.c	2008-09-07 12:49:47.000000000 -0700
+@@ -55,7 +55,7 @@ roundup(char *s0, int ndigits)
+ 			*s = 1;
+ 			return (1);
+ 		}
+-		++*s;
++		*s = 0;
+ 	}
+ 	++*s;
+ 	return (0);
+@@ -126,12 +126,12 @@ __hdtoa(double d, const char *xdigs, int
+ 	static const int sigfigs = (DBL_MANT_DIG + 3) / 4;
+ 	union IEEEd2bits u;
+ 	char *s, *s0;
+-	int bufsize;
++	int bufsize, f;
+ 
+ 	u.d = d;
+ 	*sign = u.bits.sign;
+ 
+-	switch (fpclassify(d)) {
++	switch (f = fpclassify(d)) {
+ 	case FP_NORMAL:
+ 		*decpt = u.bits.exp - DBL_ADJ;
+ 		break;
+@@ -149,7 +149,7 @@ __hdtoa(double d, const char *xdigs, int
+ 		*decpt = INT_MAX;
+ 		return (nrv_alloc(NANSTR, rve, sizeof(NANSTR) - 1));
+ 	default:
+-		abort();
++		LIBC_ABORT("fpclassify returned %d", f);
+ 	}
+ 
+ 	/* FP_NORMAL or FP_SUBNORMAL */
+@@ -210,6 +210,7 @@ __hdtoa(double d, const char *xdigs, int
+ 	return (s0);
+ }
+ 
++#ifndef LDBL_COMPAT
+ #if (LDBL_MANT_DIG > DBL_MANT_DIG)
+ 
+ /*
+@@ -222,13 +223,18 @@ __hldtoa(long double e, const char *xdig
+ 	static const int sigfigs = (LDBL_MANT_DIG + 3) / 4;
+ 	union IEEEl2bits u;
+ 	char *s, *s0;
+-	int bufsize;
++	int bufsize, f;
++#ifdef LDBL_HEAD_TAIL_PAIR
++	uint32_t bits[4];
++	int i, pos;
++#endif /* LDBL_HEAD_TAIL_PAIR */
+ 
+ 	u.e = e;
+ 	*sign = u.bits.sign;
+ 
+-	switch (fpclassify(e)) {
++	switch (f = fpclassify(e)) {
+ 	case FP_NORMAL:
++	case FP_SUPERNORMAL:
+ 		*decpt = u.bits.exp - LDBL_ADJ;
+ 		break;
+ 	case FP_ZERO:
+@@ -245,7 +251,7 @@ __hldtoa(long double e, const char *xdig
+ 		*decpt = INT_MAX;
+ 		return (nrv_alloc(NANSTR, rve, sizeof(NANSTR) - 1));
+ 	default:
+-		abort();
++		LIBC_ABORT("fpclassify returned %d", f);
+ 	}
+ 
+ 	/* FP_NORMAL or FP_SUBNORMAL */
+@@ -270,6 +276,19 @@ __hldtoa(long double e, const char *xdig
+ 	 */
+ 	for (s = s0 + bufsize - 1; s > s0 + sigfigs - 1; s--)
+ 		*s = 0;
++#ifdef LDBL_HEAD_TAIL_PAIR
++	*decpt -= _ldbl2array32dd(u, bits);
++	i = 0;
++	pos = 8;
++	for (; s > s0; s--) {
++		*s = bits[i] & 0xf;
++		bits[i] >>= 4;
++		if (--pos <= 0) {
++			i++;
++			pos = 8;
++		}
++	}
++#else /* LDBL_HEAD_TAIL_PAIR */
+ 	for (; s > s0 + sigfigs - (LDBL_MANL_SIZE / 4) - 1 && s > s0; s--) {
+ 		*s = u.bits.manl & 0xf;
+ 		u.bits.manl >>= 4;
+@@ -278,6 +297,7 @@ __hldtoa(long double e, const char *xdig
+ 		*s = u.bits.manh & 0xf;
+ 		u.bits.manh >>= 4;
+ 	}
++#endif /* LDBL_HEAD_TAIL_PAIR */
+ 
+ 	/*
+ 	 * At this point, we have snarfed all the bits in the
+@@ -285,7 +305,11 @@ __hldtoa(long double e, const char *xdig
+ 	 * (partial) nibble, which is dealt with by the next
+ 	 * statement.  We also tack on the implicit normalization bit.
+ 	 */
++#ifdef LDBL_HEAD_TAIL_PAIR
++	*s = bits[i];
++#else /* LDBL_HEAD_TAIL_PAIR */
+ 	*s = u.bits.manh | (1U << ((LDBL_MANT_DIG - 1) % 4));
++#endif /* LDBL_HEAD_TAIL_PAIR */
+ 
+ 	/* If ndigits < 0, we are expected to auto-size the precision. */
+ 	if (ndigits < 0) {
+@@ -317,3 +341,4 @@ __hldtoa(long double e, const char *xdig
+ }
+ 
+ #endif	/* (LDBL_MANT_DIG == DBL_MANT_DIG) */
++#endif  /* !LDBL_COMPAT */