Index: trunk/JavaScriptCore/wtf/dtoa.cpp =================================================================== --- trunk/JavaScriptCore/wtf/dtoa.cpp (revision 41954) +++ trunk/JavaScriptCore/wtf/dtoa.cpp (revision 42262) @@ -190,11 +190,11 @@ #else #ifdef IEEE_8087 -#define word0(x) ((U*)&x)->L[1] -#define word1(x) ((U*)&x)->L[0] -#else -#define word0(x) ((U*)&x)->L[0] -#define word1(x) ((U*)&x)->L[1] -#endif -#define dval(x) ((U*)&x)->d +#define word0(x) (x)->L[1] +#define word1(x) (x)->L[0] +#else +#define word0(x) (x)->L[0] +#define word1(x) (x)->L[1] +#endif +#define dval(x) (x)->d #endif @@ -773,8 +773,8 @@ } -static double ulp(double x) +static double ulp(U *x) { register int32_t L; - double a; + U u; L = (word0(x) & Exp_mask) - (P - 1) * Exp_msk1; @@ -784,6 +784,6 @@ #endif #endif - word0(a) = L; - word1(a) = 0; + word0(&u) = L; + word1(&u) = 0; #ifndef Avoid_Underflow #ifndef Sudden_Underflow @@ -791,15 +791,15 @@ L = -L >> Exp_shift; if (L < Exp_shift) { - word0(a) = 0x80000 >> L; - word1(a) = 0; + word0(&u) = 0x80000 >> L; + word1(&u) = 0; } else { - word0(a) = 0; + word0(&u) = 0; L -= Exp_shift; - word1(a) = L >= 31 ? 1 : 1 << 31 - L; - } - } -#endif -#endif - return dval(a); + word1(&u) = L >= 31 ? 1 : 1 << 31 - L; + } + } +#endif +#endif + return dval(&u); } @@ -812,8 +812,8 @@ uint32_t z; int k; - double d; - -#define d0 word0(d) -#define d1 word1(d) + U d; + +#define d0 word0(&d) +#define d1 word1(&d) xa0 = a->x; @@ -858,8 +858,8 @@ #undef d0 #undef d1 - return dval(d); + return dval(&d); } -static Bigint* d2b(double d, int* e, int* bits) +static Bigint* d2b(U* d, int* e, int* bits) { Bigint* b; @@ -966,9 +966,9 @@ static double ratio(Bigint* a, Bigint* b) { - double da, db; + U da, db; int k, ka, kb; - dval(da) = b2d(a, &ka); - dval(db) = b2d(b, &kb); + dval(&da) = b2d(a, &ka); + dval(&db) = b2d(b, &kb); #ifdef Pack_32 k = ka - kb + 32 * (a->wds - b->wds); @@ -977,10 +977,10 @@ #endif if (k > 0) - word0(da) += k * Exp_msk1; + word0(&da) += k * Exp_msk1; else { k = -k; - word0(db) += k * Exp_msk1; - } - return dval(da) / dval(db); + word0(&db) += k * Exp_msk1; + } + return dval(&da) / dval(&db); } @@ -1032,5 +1032,5 @@ #ifndef No_Hex_NaN -static void hexnan(double* rvp, const char** sp) +static void hexnan(U* rvp, const char** sp) { uint32_t c, x[2]; @@ -1071,6 +1071,6 @@ } if ((x[0] &= 0xfffff) || x[1]) { - word0(*rvp) = Exp_mask | x[0]; - word1(*rvp) = x[1]; + word0(rvp) = Exp_mask | x[0]; + word1(rvp) = x[1]; } } @@ -1086,5 +1086,6 @@ e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; const char *s, *s0, *s1; - double aadj, aadj1, adj, rv, rv0; + double aadj, aadj1; + U aadj2, adj, rv, rv0; int32_t L; uint32_t y, z; @@ -1095,5 +1096,5 @@ sign = nz0 = nz = 0; - dval(rv) = 0.; + dval(&rv) = 0; for (s = s00; ; s++) switch (*s) { @@ -1210,6 +1211,6 @@ if (!match(&s,"inity")) ++s; - word0(rv) = 0x7ff00000; - word1(rv) = 0; + word0(&rv) = 0x7ff00000; + word1(&rv) = 0; goto ret; } @@ -1218,6 +1219,6 @@ case 'N': if (match(&s, "an")) { - word0(rv) = NAN_WORD0; - word1(rv) = NAN_WORD1; + word0(&rv) = NAN_WORD0; + word1(&rv) = NAN_WORD1; #ifndef No_Hex_NaN if (*s == '(') /*)*/ @@ -1244,5 +1245,5 @@ nd0 = nd; k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; - dval(rv) = y; + dval(&rv) = y; if (k > 9) { #ifdef SET_INEXACT @@ -1250,5 +1251,5 @@ oldinexact = get_inexact(); #endif - dval(rv) = tens[k - 9] * dval(rv) + z; + dval(&rv) = tens[k - 9] * dval(&rv) + z; } bd0 = 0; @@ -1258,5 +1259,5 @@ if (e > 0) { if (e <= Ten_pmax) { - /* rv = */ rounded_product(dval(rv), tens[e]); + /* rv = */ rounded_product(dval(&rv), tens[e]); goto ret; } @@ -1267,6 +1268,6 @@ */ e -= i; - dval(rv) *= tens[i]; - /* rv = */ rounded_product(dval(rv), tens[e]); + dval(&rv) *= tens[i]; + /* rv = */ rounded_product(dval(&rv), tens[e]); goto ret; } @@ -1274,5 +1275,5 @@ #ifndef Inaccurate_Divide else if (e >= -Ten_pmax) { - /* rv = */ rounded_quotient(dval(rv), tens[-e]); + /* rv = */ rounded_quotient(dval(&rv), tens[-e]); goto ret; } @@ -1294,5 +1295,5 @@ if (e1 > 0) { if ((i = e1 & 15)) - dval(rv) *= tens[i]; + dval(&rv) *= tens[i]; if (e1 &= ~15) { if (e1 > DBL_MAX_10_EXP) { @@ -1302,10 +1303,10 @@ #endif /* Can't trust HUGE_VAL */ - word0(rv) = Exp_mask; - word1(rv) = 0; + word0(&rv) = Exp_mask; + word1(&rv) = 0; #ifdef SET_INEXACT /* set overflow bit */ - dval(rv0) = 1e300; - dval(rv0) *= dval(rv0); + dval(&rv0) = 1e300; + dval(&rv0) *= dval(&rv0); #endif if (bd0) @@ -1316,22 +1317,22 @@ for (j = 0; e1 > 1; j++, e1 >>= 1) if (e1 & 1) - dval(rv) *= bigtens[j]; + dval(&rv) *= bigtens[j]; /* The last multiplication could overflow. */ - word0(rv) -= P * Exp_msk1; - dval(rv) *= bigtens[j]; - if ((z = word0(rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - P)) + word0(&rv) -= P * Exp_msk1; + dval(&rv) *= bigtens[j]; + if ((z = word0(&rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - P)) goto ovfl; if (z > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P)) { /* set to largest number */ /* (Can't trust DBL_MAX) */ - word0(rv) = Big0; - word1(rv) = Big1; + word0(&rv) = Big0; + word1(&rv) = Big1; } else - word0(rv) += P * Exp_msk1; + word0(&rv) += P * Exp_msk1; } } else if (e1 < 0) { e1 = -e1; if ((i = e1 & 15)) - dval(rv) /= tens[i]; + dval(&rv) /= tens[i]; if (e1 >>= 4) { if (e1 >= 1 << n_bigtens) @@ -1342,30 +1343,30 @@ for (j = 0; e1 > 0; j++, e1 >>= 1) if (e1 & 1) - dval(rv) *= tinytens[j]; - if (scale && (j = (2 * P) + 1 - ((word0(rv) & Exp_mask) >> Exp_shift)) > 0) { + dval(&rv) *= tinytens[j]; + if (scale && (j = (2 * P) + 1 - ((word0(&rv) & Exp_mask) >> Exp_shift)) > 0) { /* scaled rv is denormal; zap j low bits */ if (j >= 32) { - word1(rv) = 0; + word1(&rv) = 0; if (j >= 53) - word0(rv) = (P + 2) * Exp_msk1; + word0(&rv) = (P + 2) * Exp_msk1; else - word0(rv) &= 0xffffffff << (j - 32); + word0(&rv) &= 0xffffffff << (j - 32); } else - word1(rv) &= 0xffffffff << j; + word1(&rv) &= 0xffffffff << j; } #else for (j = 0; e1 > 1; j++, e1 >>= 1) if (e1 & 1) - dval(rv) *= tinytens[j]; + dval(&rv) *= tinytens[j]; /* The last multiplication could underflow. */ - dval(rv0) = dval(rv); - dval(rv) *= tinytens[j]; - if (!dval(rv)) { - dval(rv) = 2. * dval(rv0); - dval(rv) *= tinytens[j]; -#endif - if (!dval(rv)) { + dval(&rv0) = dval(&rv); + dval(&rv) *= tinytens[j]; + if (!dval(&rv)) { + dval(&rv) = 2. * dval(&rv0); + dval(&rv) *= tinytens[j]; +#endif + if (!dval(&rv)) { undfl: - dval(rv) = 0.; + dval(&rv) = 0.; #ifndef NO_ERRNO errno = ERANGE; @@ -1376,6 +1377,6 @@ } #ifndef Avoid_Underflow - word0(rv) = Tiny0; - word1(rv) = Tiny1; + word0(&rv) = Tiny0; + word1(&rv) = Tiny1; /* The refinement below will clean * this approximation up. @@ -1395,5 +1396,5 @@ bd = Balloc(bd0->k); Bcopy(bd, bd0); - bb = d2b(dval(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */ + bb = d2b(&rv, &bbe, &bbbits); /* rv = bb * 2^bbe */ bs = i2b(1); @@ -1465,9 +1466,9 @@ * special case of mantissa a power of two. */ - if (dsign || word1(rv) || word0(rv) & Bndry_mask + if (dsign || word1(&rv) || word0(&rv) & Bndry_mask #ifdef Avoid_Underflow - || (word0(rv) & Exp_mask) <= (2 * P + 1) * Exp_msk1 -#else - || (word0(rv) & Exp_mask) <= Exp_msk1 + || (word0(&rv) & Exp_mask) <= (2 * P + 1) * Exp_msk1 +#else + || (word0(&rv) & Exp_mask) <= Exp_msk1 #endif ) { @@ -1493,14 +1494,14 @@ /* exactly half-way between */ if (dsign) { - if ((word0(rv) & Bndry_mask1) == Bndry_mask1 - && word1(rv) == ( + if ((word0(&rv) & Bndry_mask1) == Bndry_mask1 + && word1(&rv) == ( #ifdef Avoid_Underflow - (scale && (y = word0(rv) & Exp_mask) <= 2 * P * Exp_msk1) + (scale && (y = word0(&rv) & Exp_mask) <= 2 * P * Exp_msk1) ? (0xffffffff & (0xffffffff << (2 * P + 1 - (y >> Exp_shift)))) : #endif 0xffffffff)) { /*boundary case -- increment exponent*/ - word0(rv) = (word0(rv) & Exp_mask) + Exp_msk1; - word1(rv) = 0; + word0(&rv) = (word0(&rv) & Exp_mask) + Exp_msk1; + word1(&rv) = 0; #ifdef Avoid_Underflow dsign = 0; @@ -1508,9 +1509,9 @@ break; } - } else if (!(word0(rv) & Bndry_mask) && !word1(rv)) { + } else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) { drop_down: /* boundary case -- decrement exponent */ #ifdef Sudden_Underflow /*{{*/ - L = word0(rv) & Exp_mask; + L = word0(&rv) & Exp_mask; #ifdef Avoid_Underflow if (L <= (scale ? (2 * P + 1) * Exp_msk1 : Exp_msk1)) @@ -1523,5 +1524,5 @@ #ifdef Avoid_Underflow if (scale) { - L = word0(rv) & Exp_mask; + L = word0(&rv) & Exp_mask; if (L <= (2 * P + 1) * Exp_msk1) { if (L > (P + 2) * Exp_msk1) @@ -1534,18 +1535,18 @@ } #endif /*Avoid_Underflow*/ - L = (word0(rv) & Exp_mask) - Exp_msk1; + L = (word0(&rv) & Exp_mask) - Exp_msk1; #endif /*Sudden_Underflow}}*/ - word0(rv) = L | Bndry_mask1; - word1(rv) = 0xffffffff; + word0(&rv) = L | Bndry_mask1; + word1(&rv) = 0xffffffff; break; } - if (!(word1(rv) & LSB)) + if (!(word1(&rv) & LSB)) break; if (dsign) - dval(rv) += ulp(dval(rv)); + dval(&rv) += ulp(&rv); else { - dval(rv) -= ulp(dval(rv)); + dval(&rv) -= ulp(&rv); #ifndef Sudden_Underflow - if (!dval(rv)) + if (!dval(&rv)) goto undfl; #endif @@ -1559,7 +1560,7 @@ if (dsign) aadj = aadj1 = 1.; - else if (word1(rv) || word0(rv) & Bndry_mask) { + else if (word1(&rv) || word0(&rv) & Bndry_mask) { #ifndef Sudden_Underflow - if (word1(rv) == Tiny1 && !word0(rv)) + if (word1(&rv) == Tiny1 && !word0(&rv)) goto undfl; #endif @@ -1593,21 +1594,21 @@ #endif /*Check_FLT_ROUNDS*/ } - y = word0(rv) & Exp_mask; + y = word0(&rv) & Exp_mask; /* Check for overflow */ if (y == Exp_msk1 * (DBL_MAX_EXP + Bias - 1)) { - dval(rv0) = dval(rv); - word0(rv) -= P * Exp_msk1; - adj = aadj1 * ulp(dval(rv)); - dval(rv) += adj; - if ((word0(rv) & Exp_mask) >= Exp_msk1 * (DBL_MAX_EXP + Bias - P)) { - if (word0(rv0) == Big0 && word1(rv0) == Big1) + dval(&rv0) = dval(&rv); + word0(&rv) -= P * Exp_msk1; + adj.d = aadj1 * ulp(&rv); + dval(&rv) += adj.d; + if ((word0(&rv) & Exp_mask) >= Exp_msk1 * (DBL_MAX_EXP + Bias - P)) { + if (word0(&rv0) == Big0 && word1(&rv0) == Big1) goto ovfl; - word0(rv) = Big0; - word1(rv) = Big1; + word0(&rv) = Big0; + word1(&rv) = Big1; goto cont; } else - word0(rv) += P * Exp_msk1; + word0(&rv) += P * Exp_msk1; } else { #ifdef Avoid_Underflow @@ -1619,28 +1620,30 @@ aadj1 = dsign ? aadj : -aadj; } - word0(aadj1) += (2 * P + 1) * Exp_msk1 - y; - } - adj = aadj1 * ulp(dval(rv)); - dval(rv) += adj; + dval(&aadj2) = aadj1; + word0(&aadj2) += (2 * P + 1) * Exp_msk1 - y; + aadj1 = dval(&aadj2); + } + adj.d = aadj1 * ulp(&rv); + dval(&rv) += adj.d; #else #ifdef Sudden_Underflow - if ((word0(rv) & Exp_mask) <= P * Exp_msk1) { - dval(rv0) = dval(rv); - word0(rv) += P * Exp_msk1; - adj = aadj1 * ulp(dval(rv)); - dval(rv) += adj; - if ((word0(rv) & Exp_mask) <= P * Exp_msk1) + if ((word0(&rv) & Exp_mask) <= P * Exp_msk1) { + dval(&rv0) = dval(&rv); + word0(&rv) += P * Exp_msk1; + adj.d = aadj1 * ulp(&rv); + dval(&rv) += adj.d; + if ((word0(&rv) & Exp_mask) <= P * Exp_msk1) { - if (word0(rv0) == Tiny0 && word1(rv0) == Tiny1) + if (word0(&rv0) == Tiny0 && word1(&rv0) == Tiny1) goto undfl; - word0(rv) = Tiny0; - word1(rv) = Tiny1; + word0(&rv) = Tiny0; + word1(&rv) = Tiny1; goto cont; } else - word0(rv) -= P * Exp_msk1; + word0(&rv) -= P * Exp_msk1; } else { - adj = aadj1 * ulp(dval(rv)); - dval(rv) += adj; + adj.d = aadj1 * ulp(&rv); + dval(&rv) += adj.d; } #else /*Sudden_Underflow*/ @@ -1657,10 +1660,10 @@ aadj1 = -aadj1; } - adj = aadj1 * ulp(dval(rv)); - dval(rv) += adj; + adj.d = aadj1 * ulp(&rv); + dval(&rv) += adj.d; #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow*/ } - z = word0(rv) & Exp_mask; + z = word0(&rv) & Exp_mask; #ifndef SET_INEXACT #ifdef Avoid_Underflow @@ -1672,5 +1675,5 @@ aadj -= L; /* The tolerances below are conservative. */ - if (dsign || word1(rv) || word0(rv) & Bndry_mask) { + if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) { if (aadj < .4999999 || aadj > .5000001) break; @@ -1688,7 +1691,7 @@ if (inexact) { if (!oldinexact) { - word0(rv0) = Exp_1 + (70 << Exp_shift); - word1(rv0) = 0; - dval(rv0) += 1.; + word0(&rv0) = Exp_1 + (70 << Exp_shift); + word1(&rv0) = 0; + dval(&rv0) += 1.; } } else if (!oldinexact) @@ -1697,10 +1700,10 @@ #ifdef Avoid_Underflow if (scale) { - word0(rv0) = Exp_1 - 2 * P * Exp_msk1; - word1(rv0) = 0; - dval(rv) *= dval(rv0); + word0(&rv0) = Exp_1 - 2 * P * Exp_msk1; + word1(&rv0) = 0; + dval(&rv) *= dval(&rv0); #ifndef NO_ERRNO /* try to avoid the bug of testing an 8087 register value */ - if (word0(rv) == 0 && word1(rv) == 0) + if (word0(&rv) == 0 && word1(&rv) == 0) errno = ERANGE; #endif @@ -1708,8 +1711,8 @@ #endif /* Avoid_Underflow */ #ifdef SET_INEXACT - if (inexact && !(word0(rv) & Exp_mask)) { + if (inexact && !(word0(&rv) & Exp_mask)) { /* set underflow bit */ - dval(rv0) = 1e-300; - dval(rv0) *= dval(rv0); + dval(&rv0) = 1e-300; + dval(&rv0) *= dval(&rv0); } #endif @@ -1723,5 +1726,5 @@ if (se) *se = const_cast(s); - return sign ? -dval(rv) : dval(rv); + return sign ? -dval(&rv) : dval(&rv); } @@ -1915,5 +1918,5 @@ */ -char* dtoa(double d, int ndigits, int* decpt, int* sign, char** rve) +char* dtoa(double dd, int ndigits, int* decpt, int* sign, char** rve) { /* @@ -1935,5 +1938,6 @@ #endif Bigint *b, *b1, *delta, *mlo = NULL, *mhi, *S; - double d2, ds, eps; + U d2, eps, u; + double ds; char *s, *s0; #ifdef SET_INEXACT @@ -1948,20 +1952,21 @@ #endif - if (word0(d) & Sign_bit) { + u.d = dd; + if (word0(&u) & Sign_bit) { /* set sign for everything, including 0's and NaNs */ *sign = 1; - word0(d) &= ~Sign_bit; /* clear sign bit */ + word0(&u) &= ~Sign_bit; /* clear sign bit */ } else *sign = 0; - if ((word0(d) & Exp_mask) == Exp_mask) + if ((word0(&u) & Exp_mask) == Exp_mask) { /* Infinity or NaN */ *decpt = 9999; - if (!word1(d) && !(word0(d) & 0xfffff)) + if (!word1(&u) && !(word0(&u) & 0xfffff)) return nrv_alloc("Infinity", rve, 8); return nrv_alloc("NaN", rve, 3); } - if (!dval(d)) { + if (!dval(&u)) { *decpt = 1; return nrv_alloc("0", rve, 1); @@ -1973,13 +1978,13 @@ #endif - b = d2b(dval(d), &be, &bbits); + b = d2b(&u, &be, &bbits); #ifdef Sudden_Underflow - i = (int)(word0(d) >> Exp_shift1 & (Exp_mask >> Exp_shift1)); -#else - if ((i = (int)(word0(d) >> Exp_shift1 & (Exp_mask >> Exp_shift1)))) { -#endif - dval(d2) = dval(d); - word0(d2) &= Frac_mask1; - word0(d2) |= Exp_11; + i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask >> Exp_shift1)); +#else + if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask >> Exp_shift1)))) { +#endif + dval(&d2) = dval(&u); + word0(&d2) &= Frac_mask1; + word0(&d2) |= Exp_11; /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 @@ -2012,13 +2017,13 @@ i = bbits + be + (Bias + (P - 1) - 1); - x = (i > 32) ? (word0(d) << (64 - i)) | (word1(d) >> (i - 32)) - : word1(d) << (32 - i); - dval(d2) = x; - word0(d2) -= 31 * Exp_msk1; /* adjust exponent */ + x = (i > 32) ? (word0(&u) << (64 - i)) | (word1(&u) >> (i - 32)) + : word1(&u) << (32 - i); + dval(&d2) = x; + word0(&d2) -= 31 * Exp_msk1; /* adjust exponent */ i -= (Bias + (P - 1) - 1) + 1; denorm = 1; } #endif - ds = (dval(d2) - 1.5) * 0.289529654602168 + 0.1760912590558 + (i * 0.301029995663981); + ds = (dval(&d2) - 1.5) * 0.289529654602168 + 0.1760912590558 + (i * 0.301029995663981); k = (int)ds; if (ds < 0. && ds != k) @@ -2026,5 +2031,5 @@ k_check = 1; if (k >= 0 && k <= Ten_pmax) { - if (dval(d) < tens[k]) + if (dval(&u) < tens[k]) k--; k_check = 0; @@ -2067,5 +2072,5 @@ i = 0; - dval(d2) = dval(d); + dval(&d2) = dval(&u); k0 = k; ilim0 = ilim; @@ -2077,5 +2082,5 @@ /* prevent overflows */ j &= Bletch - 1; - dval(d) /= bigtens[n_bigtens - 1]; + dval(&u) /= bigtens[n_bigtens - 1]; ieps++; } @@ -2086,30 +2091,30 @@ } } - dval(d) /= ds; + dval(&u) /= ds; } else if ((j1 = -k)) { - dval(d) *= tens[j1 & 0xf]; + dval(&u) *= tens[j1 & 0xf]; for (j = j1 >> 4; j; j >>= 1, i++) { if (j & 1) { ieps++; - dval(d) *= bigtens[i]; + dval(&u) *= bigtens[i]; } } } - if (k_check && dval(d) < 1. && ilim > 0) { + if (k_check && dval(&u) < 1. && ilim > 0) { if (ilim1 <= 0) goto fast_failed; ilim = ilim1; k--; - dval(d) *= 10.; + dval(&u) *= 10.; ieps++; } - dval(eps) = (ieps * dval(d)) + 7.; - word0(eps) -= (P - 1) * Exp_msk1; + dval(&eps) = (ieps * dval(&u)) + 7.; + word0(&eps) -= (P - 1) * Exp_msk1; if (ilim == 0) { S = mhi = 0; - dval(d) -= 5.; - if (dval(d) > dval(eps)) + dval(&u) -= 5.; + if (dval(&u) > dval(&eps)) goto one_digit; - if (dval(d) < -dval(eps)) + if (dval(&u) < -dval(&eps)) goto no_digits; goto fast_failed; @@ -2120,31 +2125,31 @@ * generating digits needed. */ - dval(eps) = (0.5 / tens[ilim - 1]) - dval(eps); + dval(&eps) = (0.5 / tens[ilim - 1]) - dval(&eps); for (i = 0;;) { - L = (long int)dval(d); - dval(d) -= L; + L = (long int)dval(&u); + dval(&u) -= L; *s++ = '0' + (int)L; - if (dval(d) < dval(eps)) + if (dval(&u) < dval(&eps)) goto ret1; - if (1. - dval(d) < dval(eps)) + if (1. - dval(&u) < dval(&eps)) goto bump_up; if (++i >= ilim) break; - dval(eps) *= 10.; - dval(d) *= 10.; + dval(&eps) *= 10.; + dval(&u) *= 10.; } } else { #endif /* Generate ilim digits, then fix them up. */ - dval(eps) *= tens[ilim - 1]; - for (i = 1;; i++, dval(d) *= 10.) { - L = (int32_t)(dval(d)); - if (!(dval(d) -= L)) + dval(&eps) *= tens[ilim - 1]; + for (i = 1;; i++, dval(&u) *= 10.) { + L = (int32_t)(dval(&u)); + if (!(dval(&u) -= L)) ilim = i; *s++ = '0' + (int)L; if (i == ilim) { - if (dval(d) > 0.5 + dval(eps)) + if (dval(&u) > 0.5 + dval(&eps)) goto bump_up; - else if (dval(d) < 0.5 - dval(eps)) { + else if (dval(&u) < 0.5 - dval(&eps)) { while (*--s == '0') { } s++; @@ -2159,5 +2164,5 @@ fast_failed: s = s0; - dval(d) = dval(d2); + dval(&u) = dval(&d2); k = k0; ilim = ilim0; @@ -2171,20 +2176,20 @@ if (ndigits < 0 && ilim <= 0) { S = mhi = 0; - if (ilim < 0 || dval(d) <= 5 * ds) + if (ilim < 0 || dval(&u) <= 5 * ds) goto no_digits; goto one_digit; } - for (i = 1;; i++, dval(d) *= 10.) { - L = (int32_t)(dval(d) / ds); - dval(d) -= L * ds; + for (i = 1;; i++, dval(&u) *= 10.) { + L = (int32_t)(dval(&u) / ds); + dval(&u) -= L * ds; #ifdef Check_FLT_ROUNDS /* If FLT_ROUNDS == 2, L will usually be high by 1 */ - if (dval(d) < 0) { + if (dval(&u) < 0) { L--; - dval(d) += ds; + dval(&u) += ds; } #endif *s++ = '0' + (int)L; - if (!dval(d)) { + if (!dval(&u)) { #ifdef SET_INEXACT inexact = 0; @@ -2193,6 +2198,6 @@ } if (i == ilim) { - dval(d) += dval(d); - if (dval(d) > ds || (dval(d) == ds && (L & 1))) { + dval(&u) += dval(&u); + if (dval(&u) > ds || (dval(&u) == ds && (L & 1))) { bump_up: while (*--s == '9') @@ -2249,7 +2254,7 @@ spec_case = 0; - if (!word1(d) && !(word0(d) & Bndry_mask) + if (!word1(&u) && !(word0(&u) & Bndry_mask) #ifndef Sudden_Underflow - && word0(d) & (Exp_mask & ~Exp_msk1) + && word0(&u) & (Exp_mask & ~Exp_msk1) #endif ) { @@ -2323,5 +2328,5 @@ j1 = delta->sign ? 1 : cmp(b, delta); Bfree(delta); - if (j1 == 0 && !(word1(d) & 1)) { + if (j1 == 0 && !(word1(&u) & 1)) { if (dig == '9') goto round_9_up; @@ -2335,5 +2340,5 @@ goto ret; } - if (j < 0 || (j == 0 && !(word1(d) & 1))) { + if (j < 0 || (j == 0 && !(word1(&u) & 1))) { if (!b->x[0] && b->wds <= 1) { #ifdef SET_INEXACT @@ -2422,7 +2427,7 @@ if (inexact) { if (!oldinexact) { - word0(d) = Exp_1 + (70 << Exp_shift); - word1(d) = 0; - dval(d) += 1.; + word0(&u) = Exp_1 + (70 << Exp_shift); + word1(&u) = 0; + dval(&u) += 1.; } } else if (!oldinexact)