]> git.saurik.com Git - apple/libc.git/blob - gdtoa/FreeBSD/_ldtoa.c.patch
Libc-583.tar.gz
[apple/libc.git] / gdtoa / FreeBSD / _ldtoa.c.patch
1 --- _ldtoa.c.orig 2008-09-07 11:38:10.000000000 -0700
2 +++ _ldtoa.c 2008-09-07 12:55:35.000000000 -0700
3 @@ -46,7 +46,7 @@ char *
4 __ldtoa(long double *ld, int mode, int ndigits, int *decpt, int *sign,
5 char **rve)
6 {
7 - static FPI fpi = {
8 + static FPI fpi0 = {
9 LDBL_MANT_DIG, /* nbits */
10 LDBL_MIN_EXP - LDBL_MANT_DIG, /* emin */
11 LDBL_MAX_EXP - LDBL_MANT_DIG, /* emax */
12 @@ -61,28 +61,57 @@ __ldtoa(long double *ld, int mode, int n
13 char *ret;
14 union IEEEl2bits u;
15 uint32_t bits[(LDBL_MANT_DIG + 31) / 32];
16 + FPI *fpi = &fpi0, fpi1;
17 +#ifdef Honor_FLT_ROUNDS
18 + int rounding = Flt_Rounds;
19 +#endif
20 + int type;
21
22 u.e = *ld;
23 +#if defined(__ppc__) || defined(__ppc64__)
24 + /*
25 + * Subnormal head-tail doubles don't seem to be converted correctly
26 + * by gdtoa. So we multiply by 10^32 to make them normal then
27 + * subtract 32 from the exponent later.
28 + */
29 + if ((type = __fpclassify(u.e)) == FP_NORMAL && __fpclassifyd(u.d[1]) == FP_SUBNORMAL)
30 + type = FP_SUBNORMAL;
31 + if (type == FP_SUBNORMAL)
32 + u.e *= 1.0e32L;
33 +#else /* !defined(__ppc__) && !defined(__ppc64__) */
34 + type = fpclassify(u.e);
35 +#endif /* defined(__ppc__) || defined(__ppc64__) */
36 *sign = u.bits.sign;
37 be = u.bits.exp - (LDBL_MAX_EXP - 1) - (LDBL_MANT_DIG - 1);
38 +#if defined(__ppc__) || defined(__ppc64__)
39 + be -= LDBL_TO_ARRAY32(u, bits);
40 +#else /* !defined(__ppc__) && !defined(__ppc64__) */
41 LDBL_TO_ARRAY32(u, bits);
42 +#endif /* defined(__ppc__) || defined(__ppc64__) */
43
44 - switch (fpclassify(u.e)) {
45 + switch (type) {
46 +#if defined(__ppc__) || defined(__ppc64__)
47 + case FP_SUBNORMAL:
48 +#endif /* defined(__ppc__) || defined(__ppc64__) */
49 case FP_NORMAL:
50 + case FP_SUPERNORMAL:
51 kind = STRTOG_Normal;
52 +/* For ppc/ppc64 and head-tail long double, the implicit bit is already there */
53 +#if !defined(__ppc__) && !defined(__ppc64__)
54 #ifdef LDBL_IMPLICIT_NBIT
55 bits[LDBL_MANT_DIG / 32] |= 1 << ((LDBL_MANT_DIG - 1) % 32);
56 #endif /* LDBL_IMPLICIT_NBIT */
57 +#endif /* !defined(__ppc__) && !defined(__ppc64__) */
58 break;
59 case FP_ZERO:
60 kind = STRTOG_Zero;
61 break;
62 +#if !defined(__ppc__) && !defined(__ppc64__)
63 case FP_SUBNORMAL:
64 kind = STRTOG_Denormal;
65 -#ifdef LDBL_IMPLICIT_NBIT
66 be++;
67 -#endif
68 break;
69 +#endif /* !defined(__ppc__) && !defined(__ppc64__) */
70 case FP_INFINITE:
71 kind = STRTOG_Infinite;
72 break;
73 @@ -90,11 +119,22 @@ __ldtoa(long double *ld, int mode, int n
74 kind = STRTOG_NaN;
75 break;
76 default:
77 - abort();
78 + LIBC_ABORT("fpclassify returned %d", type);
79 }
80
81 - ret = gdtoa(&fpi, be, (ULong *)bits, &kind, mode, ndigits, decpt, rve);
82 +#ifdef Honor_FLT_ROUNDS
83 + if (rounding != fpi0.rounding) {
84 + fpi1 = fpi0; /* for thread safety */
85 + fpi1.rounding = rounding;
86 + fpi = &fpi1;
87 + }
88 +#endif /* Honor_FLT_ROUNDS */
89 + ret = gdtoa(fpi, be, (ULong *)bits, &kind, mode, ndigits, decpt, rve);
90 if (*decpt == -32768)
91 *decpt = INT_MAX;
92 +#if defined(__ppc__) || defined(__ppc64__)
93 + else if (type == FP_SUBNORMAL)
94 + *decpt -= 32;
95 +#endif /* defined(__ppc__) || defined(__ppc64__) */
96 return ret;
97 }