]> git.saurik.com Git - apple/libc.git/blobdiff - gdtoa/FreeBSD/_ldtoa.c.patch
Libc-763.13.tar.gz
[apple/libc.git] / gdtoa / FreeBSD / _ldtoa.c.patch
index c4a62ed50be47b0c3d67b38529fb73a31279614d..3e57e864fd580a19ffd1915fe388a868838586de 100644 (file)
@@ -1,12 +1,23 @@
---- _ldtoa.c.orig      2004-12-08 22:50:28.000000000 -0800
-+++ _ldtoa.c   2004-12-08 22:52:58.000000000 -0800
-@@ -61,14 +61,34 @@
+--- _ldtoa.c.orig      2008-09-07 11:38:10.000000000 -0700
++++ _ldtoa.c   2008-09-07 12:55:35.000000000 -0700
+@@ -46,7 +46,7 @@ char *
+ __ldtoa(long double *ld, int mode, int ndigits, int *decpt, int *sign,
+     char **rve)
+ {
+-      static FPI fpi = {
++      static FPI fpi0 = {
+               LDBL_MANT_DIG,                  /* nbits */
+               LDBL_MIN_EXP - LDBL_MANT_DIG,   /* emin */
+               LDBL_MAX_EXP - LDBL_MANT_DIG,   /* emax */
+@@ -61,28 +61,57 @@ __ldtoa(long double *ld, int mode, int n
        char *ret;
        union IEEEl2bits u;
        uint32_t bits[(LDBL_MANT_DIG + 31) / 32];
-+#if defined(__ppc__) || defined(__ppc64__)
++      FPI *fpi = &fpi0, fpi1;
++#ifdef Honor_FLT_ROUNDS
++      int rounding = Flt_Rounds;
++#endif
 +      int type;
-+#endif /* defined(__ppc__) || defined(__ppc64__) */
  
        u.e = *ld;
 +#if defined(__ppc__) || defined(__ppc64__)
 +              type = FP_SUBNORMAL;
 +      if (type == FP_SUBNORMAL)
 +              u.e *= 1.0e32L;
++#else /* !defined(__ppc__) && !defined(__ppc64__) */
++      type = fpclassify(u.e);
 +#endif /* defined(__ppc__) || defined(__ppc64__) */
        *sign = u.bits.sign;
        be = u.bits.exp - (LDBL_MAX_EXP - 1) - (LDBL_MANT_DIG - 1);
++#if defined(__ppc__) || defined(__ppc64__)
++      be -= LDBL_TO_ARRAY32(u, bits);
++#else /* !defined(__ppc__) && !defined(__ppc64__) */
        LDBL_TO_ARRAY32(u, bits);
++#endif /* defined(__ppc__) || defined(__ppc64__) */
  
-+#if defined(__ppc__) || defined(__ppc64__)
+-      switch (fpclassify(u.e)) {
 +      switch (type) {
++#if defined(__ppc__) || defined(__ppc64__)
 +      case FP_SUBNORMAL:
-+#else /* !defined(__ppc__) && !defined(__ppc64__) */
-       switch (fpclassify(u.e)) {
 +#endif /* defined(__ppc__) || defined(__ppc64__) */
        case FP_NORMAL:
 +      case FP_SUPERNORMAL:
                kind = STRTOG_Normal;
++/* For ppc/ppc64 and head-tail long double, the implicit bit is already there */
++#if !defined(__ppc__) && !defined(__ppc64__)
  #ifdef        LDBL_IMPLICIT_NBIT
                bits[LDBL_MANT_DIG / 32] |= 1 << ((LDBL_MANT_DIG - 1) % 32);
-@@ -77,12 +97,14 @@
+ #endif /* LDBL_IMPLICIT_NBIT */
++#endif /* !defined(__ppc__) && !defined(__ppc64__) */
+               break;
        case FP_ZERO:
                kind = STRTOG_Zero;
                break;
 +#if !defined(__ppc__) && !defined(__ppc64__)
        case FP_SUBNORMAL:
                kind = STRTOG_Denormal;
- #ifdef        LDBL_IMPLICIT_NBIT
+-#ifdef        LDBL_IMPLICIT_NBIT
                be++;
- #endif
+-#endif
                break;
 +#endif /* !defined(__ppc__) && !defined(__ppc64__) */
        case FP_INFINITE:
                kind = STRTOG_Infinite;
                break;
-@@ -96,5 +118,9 @@
-       ret = gdtoa(&fpi, be, (ULong *)bits, &kind, mode, ndigits, decpt, rve);
+@@ -90,11 +119,22 @@ __ldtoa(long double *ld, int mode, int n
+               kind = STRTOG_NaN;
+               break;
+       default:
+-              abort();
++              LIBC_ABORT("fpclassify returned %d", type);
+       }
+-      ret = gdtoa(&fpi, be, (ULong *)bits, &kind, mode, ndigits, decpt, rve);
++#ifdef Honor_FLT_ROUNDS
++      if (rounding != fpi0.rounding) {
++              fpi1 = fpi0; /* for thread safety */
++              fpi1.rounding = rounding;
++              fpi = &fpi1;
++              }
++#endif /* Honor_FLT_ROUNDS */
++      ret = gdtoa(fpi, be, (ULong *)bits, &kind, mode, ndigits, decpt, rve);
        if (*decpt == -32768)
                *decpt = INT_MAX;
 +#if defined(__ppc__) || defined(__ppc64__)