1 --- _ldtoa.c.orig 2004-06-03 15:17:18.000000000 -0700
2 +++ _ldtoa.c 2005-10-09 00:09:11.000000000 -0700
4 __ldtoa(long double *ld, int mode, int ndigits, int *decpt, int *sign,
9 LDBL_MANT_DIG, /* nbits */
10 LDBL_MIN_EXP - LDBL_MANT_DIG, /* emin */
11 LDBL_MAX_EXP - LDBL_MANT_DIG, /* emax */
15 uint32_t bits[(LDBL_MANT_DIG + 31) / 32];
16 + FPI *fpi = &fpi0, fpi1;
17 +#ifdef Honor_FLT_ROUNDS
18 + int rounding = Flt_Rounds;
20 +#if defined(__ppc__) || defined(__ppc64__)
22 +#endif /* defined(__ppc__) || defined(__ppc64__) */
25 +#if defined(__ppc__) || defined(__ppc64__)
27 + * Subnormal head-tail doubles don't seem to be converted correctly
28 + * by gdtoa. So we multiply by 10^32 to make them normal then
29 + * subtract 32 from the exponent later.
31 + if ((type = __fpclassify(u.e)) == FP_NORMAL && __fpclassifyd(u.d[1]) == FP_SUBNORMAL)
32 + type = FP_SUBNORMAL;
33 + if (type == FP_SUBNORMAL)
35 +#endif /* defined(__ppc__) || defined(__ppc64__) */
37 be = u.bits.exp - (LDBL_MAX_EXP - 1) - (LDBL_MANT_DIG - 1);
38 LDBL_TO_ARRAY32(u, bits);
40 +#if defined(__ppc__) || defined(__ppc64__)
43 +#else /* !defined(__ppc__) && !defined(__ppc64__) */
44 switch (fpclassify(u.e)) {
45 +#endif /* defined(__ppc__) || defined(__ppc64__) */
47 + case FP_SUPERNORMAL:
49 +/* For ppc/ppc64 and head-tail long double, the implicit bit is already there */
50 +#if !defined(__ppc__) && !defined(__ppc64__)
51 #ifdef LDBL_IMPLICIT_NBIT
52 bits[LDBL_MANT_DIG / 32] |= 1 << ((LDBL_MANT_DIG - 1) % 32);
53 #endif /* LDBL_IMPLICIT_NBIT */
54 +#endif /* !defined(__ppc__) && !defined(__ppc64__) */
59 +#if !defined(__ppc__) && !defined(__ppc64__)
61 kind = STRTOG_Denormal;
62 -#ifdef LDBL_IMPLICIT_NBIT
66 +#endif /* !defined(__ppc__) && !defined(__ppc64__) */
68 kind = STRTOG_Infinite;
74 - ret = gdtoa(&fpi, be, (ULong *)bits, &kind, mode, ndigits, decpt, rve);
75 +#ifdef Honor_FLT_ROUNDS
76 + if (rounding != fpi0.rounding) {
77 + fpi1 = fpi0; /* for thread safety */
78 + fpi1.rounding = rounding;
81 +#endif /* Honor_FLT_ROUNDS */
82 + ret = gdtoa(fpi, be, (ULong *)bits, &kind, mode, ndigits, decpt, rve);
85 +#if defined(__ppc__) || defined(__ppc64__)
86 + else if (type == FP_SUBNORMAL)
88 +#endif /* defined(__ppc__) || defined(__ppc64__) */