Changeset 42262 in webkit for trunk/JavaScriptCore/wtf/dtoa.cpp


Ignore:
Timestamp:
Apr 7, 2009, 4:48:06 AM (16 years ago)
Author:
[email protected]
Message:

2009-04-04 Xan Lopez <[email protected]>

Reviewed by Alexey Proskuryakov.

https://bugs.webkit.org/show_bug.cgi?id=25033
dtoa.cpp segfaults with g++ 4.4.0

g++ 4.4.0 seems to be more strict about aliasing rules, so it
produces incorrect code if dtoa.cpp is compiled with
-fstrict-aliasing (it also emits a ton of warnings, so fair enough
I guess). The problem was that we were only casting variables to
union types in order to do type punning, but GCC and the C
standard require that we actually use a union to store the value.

This patch does just that, the code is mostly copied from the dtoa
version in GCC:
http://gcc.gnu.org/viewcvs/trunk/libjava/classpath/native/fdlibm/dtoa.c?view=markup.

  • wtf/dtoa.cpp: (WTF::ulp): (WTF::b2d): (WTF::ratio): (WTF::hexnan): (WTF::strtod): (WTF::dtoa):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/wtf/dtoa.cpp

    r41954 r42262  
    190190#else
    191191#ifdef IEEE_8087
    192 #define word0(x) ((U*)&x)->L[1]
    193 #define word1(x) ((U*)&x)->L[0]
    194 #else
    195 #define word0(x) ((U*)&x)->L[0]
    196 #define word1(x) ((U*)&x)->L[1]
    197 #endif
    198 #define dval(x) ((U*)&x)->d
     192#define word0(x) (x)->L[1]
     193#define word1(x) (x)->L[0]
     194#else
     195#define word0(x) (x)->L[0]
     196#define word1(x) (x)->L[1]
     197#endif
     198#define dval(x) (x)->d
    199199#endif
    200200
     
    773773}
    774774
    775 static double ulp(double x)
     775static double ulp(U *x)
    776776{
    777777    register int32_t L;
    778     double a;
     778    U u;
    779779
    780780    L = (word0(x) & Exp_mask) - (P - 1) * Exp_msk1;
     
    784784#endif
    785785#endif
    786         word0(a) = L;
    787         word1(a) = 0;
     786        word0(&u) = L;
     787        word1(&u) = 0;
    788788#ifndef Avoid_Underflow
    789789#ifndef Sudden_Underflow
     
    791791        L = -L >> Exp_shift;
    792792        if (L < Exp_shift) {
    793             word0(a) = 0x80000 >> L;
    794             word1(a) = 0;
     793            word0(&u) = 0x80000 >> L;
     794            word1(&u) = 0;
    795795        } else {
    796             word0(a) = 0;
     796            word0(&u) = 0;
    797797            L -= Exp_shift;
    798             word1(a) = L >= 31 ? 1 : 1 << 31 - L;
    799         }
    800     }
    801 #endif
    802 #endif
    803     return dval(a);
     798            word1(&u) = L >= 31 ? 1 : 1 << 31 - L;
     799        }
     800    }
     801#endif
     802#endif
     803    return dval(&u);
    804804}
    805805
     
    812812    uint32_t z;
    813813    int k;
    814     double d;
    815 
    816 #define d0 word0(d)
    817 #define d1 word1(d)
     814    U d;
     815
     816#define d0 word0(&d)
     817#define d1 word1(&d)
    818818
    819819    xa0 = a->x;
     
    858858#undef d0
    859859#undef d1
    860     return dval(d);
     860    return dval(&d);
    861861}
    862862
    863 static Bigint* d2b(double d, int* e, int* bits)
     863static Bigint* d2b(U* d, int* e, int* bits)
    864864{
    865865    Bigint* b;
     
    966966static double ratio(Bigint* a, Bigint* b)
    967967{
    968     double da, db;
     968    U da, db;
    969969    int k, ka, kb;
    970970
    971     dval(da) = b2d(a, &ka);
    972     dval(db) = b2d(b, &kb);
     971    dval(&da) = b2d(a, &ka);
     972    dval(&db) = b2d(b, &kb);
    973973#ifdef Pack_32
    974974    k = ka - kb + 32 * (a->wds - b->wds);
     
    977977#endif
    978978    if (k > 0)
    979         word0(da) += k * Exp_msk1;
     979        word0(&da) += k * Exp_msk1;
    980980    else {
    981981        k = -k;
    982         word0(db) += k * Exp_msk1;
    983     }
    984     return dval(da) / dval(db);
     982        word0(&db) += k * Exp_msk1;
     983    }
     984    return dval(&da) / dval(&db);
    985985}
    986986
     
    10321032
    10331033#ifndef No_Hex_NaN
    1034 static void hexnan(double* rvp, const char** sp)
     1034static void hexnan(U* rvp, const char** sp)
    10351035{
    10361036    uint32_t c, x[2];
     
    10711071    }
    10721072    if ((x[0] &= 0xfffff) || x[1]) {
    1073         word0(*rvp) = Exp_mask | x[0];
    1074         word1(*rvp) = x[1];
     1073        word0(rvp) = Exp_mask | x[0];
     1074        word1(rvp) = x[1];
    10751075    }
    10761076}
     
    10861086         e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
    10871087    const char *s, *s0, *s1;
    1088     double aadj, aadj1, adj, rv, rv0;
     1088    double aadj, aadj1;
     1089    U aadj2, adj, rv, rv0;
    10891090    int32_t L;
    10901091    uint32_t y, z;
     
    10951096
    10961097    sign = nz0 = nz = 0;
    1097     dval(rv) = 0.;
     1098    dval(&rv) = 0;
    10981099    for (s = s00; ; s++)
    10991100        switch (*s) {
     
    12101211                        if (!match(&s,"inity"))
    12111212                            ++s;
    1212                         word0(rv) = 0x7ff00000;
    1213                         word1(rv) = 0;
     1213                        word0(&rv) = 0x7ff00000;
     1214                        word1(&rv) = 0;
    12141215                        goto ret;
    12151216                    }
     
    12181219                case 'N':
    12191220                    if (match(&s, "an")) {
    1220                         word0(rv) = NAN_WORD0;
    1221                         word1(rv) = NAN_WORD1;
     1221                        word0(&rv) = NAN_WORD0;
     1222                        word1(&rv) = NAN_WORD1;
    12221223#ifndef No_Hex_NaN
    12231224                        if (*s == '(') /*)*/
     
    12441245        nd0 = nd;
    12451246    k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
    1246     dval(rv) = y;
     1247    dval(&rv) = y;
    12471248    if (k > 9) {
    12481249#ifdef SET_INEXACT
     
    12501251            oldinexact = get_inexact();
    12511252#endif
    1252         dval(rv) = tens[k - 9] * dval(rv) + z;
     1253        dval(&rv) = tens[k - 9] * dval(&rv) + z;
    12531254    }
    12541255    bd0 = 0;
     
    12581259        if (e > 0) {
    12591260            if (e <= Ten_pmax) {
    1260                 /* rv = */ rounded_product(dval(rv), tens[e]);
     1261                /* rv = */ rounded_product(dval(&rv), tens[e]);
    12611262                goto ret;
    12621263            }
     
    12671268                 */
    12681269                e -= i;
    1269                 dval(rv) *= tens[i];
    1270                 /* rv = */ rounded_product(dval(rv), tens[e]);
     1270                dval(&rv) *= tens[i];
     1271                /* rv = */ rounded_product(dval(&rv), tens[e]);
    12711272                goto ret;
    12721273            }
     
    12741275#ifndef Inaccurate_Divide
    12751276        else if (e >= -Ten_pmax) {
    1276             /* rv = */ rounded_quotient(dval(rv), tens[-e]);
     1277            /* rv = */ rounded_quotient(dval(&rv), tens[-e]);
    12771278            goto ret;
    12781279        }
     
    12941295    if (e1 > 0) {
    12951296        if ((i = e1 & 15))
    1296             dval(rv) *= tens[i];
     1297            dval(&rv) *= tens[i];
    12971298        if (e1 &= ~15) {
    12981299            if (e1 > DBL_MAX_10_EXP) {
     
    13021303#endif
    13031304                /* Can't trust HUGE_VAL */
    1304                 word0(rv) = Exp_mask;
    1305                 word1(rv) = 0;
     1305                word0(&rv) = Exp_mask;
     1306                word1(&rv) = 0;
    13061307#ifdef SET_INEXACT
    13071308                /* set overflow bit */
    1308                 dval(rv0) = 1e300;
    1309                 dval(rv0) *= dval(rv0);
     1309                dval(&rv0) = 1e300;
     1310                dval(&rv0) *= dval(&rv0);
    13101311#endif
    13111312                if (bd0)
     
    13161317            for (j = 0; e1 > 1; j++, e1 >>= 1)
    13171318                if (e1 & 1)
    1318                     dval(rv) *= bigtens[j];
     1319                    dval(&rv) *= bigtens[j];
    13191320        /* The last multiplication could overflow. */
    1320             word0(rv) -= P * Exp_msk1;
    1321             dval(rv) *= bigtens[j];
    1322             if ((z = word0(rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - P))
     1321            word0(&rv) -= P * Exp_msk1;
     1322            dval(&rv) *= bigtens[j];
     1323            if ((z = word0(&rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - P))
    13231324                goto ovfl;
    13241325            if (z > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P)) {
    13251326                /* set to largest number */
    13261327                /* (Can't trust DBL_MAX) */
    1327                 word0(rv) = Big0;
    1328                 word1(rv) = Big1;
     1328                word0(&rv) = Big0;
     1329                word1(&rv) = Big1;
    13291330            } else
    1330                 word0(rv) += P * Exp_msk1;
     1331                word0(&rv) += P * Exp_msk1;
    13311332        }
    13321333    } else if (e1 < 0) {
    13331334        e1 = -e1;
    13341335        if ((i = e1 & 15))
    1335             dval(rv) /= tens[i];
     1336            dval(&rv) /= tens[i];
    13361337        if (e1 >>= 4) {
    13371338            if (e1 >= 1 << n_bigtens)
     
    13421343            for (j = 0; e1 > 0; j++, e1 >>= 1)
    13431344                if (e1 & 1)
    1344                     dval(rv) *= tinytens[j];
    1345             if (scale && (j = (2 * P) + 1 - ((word0(rv) & Exp_mask) >> Exp_shift)) > 0) {
     1345                    dval(&rv) *= tinytens[j];
     1346            if (scale && (j = (2 * P) + 1 - ((word0(&rv) & Exp_mask) >> Exp_shift)) > 0) {
    13461347                /* scaled rv is denormal; zap j low bits */
    13471348                if (j >= 32) {
    1348                     word1(rv) = 0;
     1349                    word1(&rv) = 0;
    13491350                    if (j >= 53)
    1350                        word0(rv) = (P + 2) * Exp_msk1;
     1351                       word0(&rv) = (P + 2) * Exp_msk1;
    13511352                    else
    1352                        word0(rv) &= 0xffffffff << (j - 32);
     1353                       word0(&rv) &= 0xffffffff << (j - 32);
    13531354                } else
    1354                     word1(rv) &= 0xffffffff << j;
     1355                    word1(&rv) &= 0xffffffff << j;
    13551356            }
    13561357#else
    13571358            for (j = 0; e1 > 1; j++, e1 >>= 1)
    13581359                if (e1 & 1)
    1359                     dval(rv) *= tinytens[j];
     1360                    dval(&rv) *= tinytens[j];
    13601361            /* The last multiplication could underflow. */
    1361             dval(rv0) = dval(rv);
    1362             dval(rv) *= tinytens[j];
    1363             if (!dval(rv)) {
    1364                 dval(rv) = 2. * dval(rv0);
    1365                 dval(rv) *= tinytens[j];
    1366 #endif
    1367                 if (!dval(rv)) {
     1362            dval(&rv0) = dval(&rv);
     1363            dval(&rv) *= tinytens[j];
     1364            if (!dval(&rv)) {
     1365                dval(&rv) = 2. * dval(&rv0);
     1366                dval(&rv) *= tinytens[j];
     1367#endif
     1368                if (!dval(&rv)) {
    13681369undfl:
    1369                     dval(rv) = 0.;
     1370                    dval(&rv) = 0.;
    13701371#ifndef NO_ERRNO
    13711372                    errno = ERANGE;
     
    13761377                }
    13771378#ifndef Avoid_Underflow
    1378                 word0(rv) = Tiny0;
    1379                 word1(rv) = Tiny1;
     1379                word0(&rv) = Tiny0;
     1380                word1(&rv) = Tiny1;
    13801381                /* The refinement below will clean
    13811382                 * this approximation up.
     
    13951396        bd = Balloc(bd0->k);
    13961397        Bcopy(bd, bd0);
    1397         bb = d2b(dval(rv), &bbe, &bbbits);    /* rv = bb * 2^bbe */
     1398        bb = d2b(&rv, &bbe, &bbbits);    /* rv = bb * 2^bbe */
    13981399        bs = i2b(1);
    13991400
     
    14651466             * special case of mantissa a power of two.
    14661467             */
    1467             if (dsign || word1(rv) || word0(rv) & Bndry_mask
     1468            if (dsign || word1(&rv) || word0(&rv) & Bndry_mask
    14681469#ifdef Avoid_Underflow
    1469              || (word0(rv) & Exp_mask) <= (2 * P + 1) * Exp_msk1
    1470 #else
    1471              || (word0(rv) & Exp_mask) <= Exp_msk1
     1470             || (word0(&rv) & Exp_mask) <= (2 * P + 1) * Exp_msk1
     1471#else
     1472             || (word0(&rv) & Exp_mask) <= Exp_msk1
    14721473#endif
    14731474                ) {
     
    14931494            /* exactly half-way between */
    14941495            if (dsign) {
    1495                 if ((word0(rv) & Bndry_mask1) == Bndry_mask1
    1496                  &&  word1(rv) == (
     1496                if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
     1497                 &&  word1(&rv) == (
    14971498#ifdef Avoid_Underflow
    1498             (scale && (y = word0(rv) & Exp_mask) <= 2 * P * Exp_msk1)
     1499            (scale && (y = word0(&rv) & Exp_mask) <= 2 * P * Exp_msk1)
    14991500        ? (0xffffffff & (0xffffffff << (2 * P + 1 - (y >> Exp_shift)))) :
    15001501#endif
    15011502                           0xffffffff)) {
    15021503                    /*boundary case -- increment exponent*/
    1503                     word0(rv) = (word0(rv) & Exp_mask) + Exp_msk1;
    1504                     word1(rv) = 0;
     1504                    word0(&rv) = (word0(&rv) & Exp_mask) + Exp_msk1;
     1505                    word1(&rv) = 0;
    15051506#ifdef Avoid_Underflow
    15061507                    dsign = 0;
     
    15081509                    break;
    15091510                }
    1510             } else if (!(word0(rv) & Bndry_mask) && !word1(rv)) {
     1511            } else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
    15111512drop_down:
    15121513                /* boundary case -- decrement exponent */
    15131514#ifdef Sudden_Underflow /*{{*/
    1514                 L = word0(rv) & Exp_mask;
     1515                L = word0(&rv) & Exp_mask;
    15151516#ifdef Avoid_Underflow
    15161517                if (L <= (scale ? (2 * P + 1) * Exp_msk1 : Exp_msk1))
     
    15231524#ifdef Avoid_Underflow
    15241525                if (scale) {
    1525                     L = word0(rv) & Exp_mask;
     1526                    L = word0(&rv) & Exp_mask;
    15261527                    if (L <= (2 * P + 1) * Exp_msk1) {
    15271528                        if (L > (P + 2) * Exp_msk1)
     
    15341535                }
    15351536#endif /*Avoid_Underflow*/
    1536                 L = (word0(rv) & Exp_mask) - Exp_msk1;
     1537                L = (word0(&rv) & Exp_mask) - Exp_msk1;
    15371538#endif /*Sudden_Underflow}}*/
    1538                 word0(rv) = L | Bndry_mask1;
    1539                 word1(rv) = 0xffffffff;
     1539                word0(&rv) = L | Bndry_mask1;
     1540                word1(&rv) = 0xffffffff;
    15401541                break;
    15411542            }
    1542             if (!(word1(rv) & LSB))
     1543            if (!(word1(&rv) & LSB))
    15431544                break;
    15441545            if (dsign)
    1545                 dval(rv) += ulp(dval(rv));
     1546                dval(&rv) += ulp(&rv);
    15461547            else {
    1547                 dval(rv) -= ulp(dval(rv));
     1548                dval(&rv) -= ulp(&rv);
    15481549#ifndef Sudden_Underflow
    1549                 if (!dval(rv))
     1550                if (!dval(&rv))
    15501551                    goto undfl;
    15511552#endif
     
    15591560            if (dsign)
    15601561                aadj = aadj1 = 1.;
    1561             else if (word1(rv) || word0(rv) & Bndry_mask) {
     1562            else if (word1(&rv) || word0(&rv) & Bndry_mask) {
    15621563#ifndef Sudden_Underflow
    1563                 if (word1(rv) == Tiny1 && !word0(rv))
     1564                if (word1(&rv) == Tiny1 && !word0(&rv))
    15641565                    goto undfl;
    15651566#endif
     
    15931594#endif /*Check_FLT_ROUNDS*/
    15941595        }
    1595         y = word0(rv) & Exp_mask;
     1596        y = word0(&rv) & Exp_mask;
    15961597
    15971598        /* Check for overflow */
    15981599
    15991600        if (y == Exp_msk1 * (DBL_MAX_EXP + Bias - 1)) {
    1600             dval(rv0) = dval(rv);
    1601             word0(rv) -= P * Exp_msk1;
    1602             adj = aadj1 * ulp(dval(rv));
    1603             dval(rv) += adj;
    1604             if ((word0(rv) & Exp_mask) >= Exp_msk1 * (DBL_MAX_EXP + Bias - P)) {
    1605                 if (word0(rv0) == Big0 && word1(rv0) == Big1)
     1601            dval(&rv0) = dval(&rv);
     1602            word0(&rv) -= P * Exp_msk1;
     1603            adj.d = aadj1 * ulp(&rv);
     1604            dval(&rv) += adj.d;
     1605            if ((word0(&rv) & Exp_mask) >= Exp_msk1 * (DBL_MAX_EXP + Bias - P)) {
     1606                if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
    16061607                    goto ovfl;
    1607                 word0(rv) = Big0;
    1608                 word1(rv) = Big1;
     1608                word0(&rv) = Big0;
     1609                word1(&rv) = Big1;
    16091610                goto cont;
    16101611            } else
    1611                 word0(rv) += P * Exp_msk1;
     1612                word0(&rv) += P * Exp_msk1;
    16121613        } else {
    16131614#ifdef Avoid_Underflow
     
    16191620                    aadj1 = dsign ? aadj : -aadj;
    16201621                }
    1621                 word0(aadj1) += (2 * P + 1) * Exp_msk1 - y;
    1622             }
    1623             adj = aadj1 * ulp(dval(rv));
    1624             dval(rv) += adj;
     1622                dval(&aadj2) = aadj1;
     1623                word0(&aadj2) += (2 * P + 1) * Exp_msk1 - y;
     1624                aadj1 = dval(&aadj2);
     1625            }
     1626            adj.d = aadj1 * ulp(&rv);
     1627            dval(&rv) += adj.d;
    16251628#else
    16261629#ifdef Sudden_Underflow
    1627             if ((word0(rv) & Exp_mask) <= P * Exp_msk1) {
    1628                 dval(rv0) = dval(rv);
    1629                 word0(rv) += P * Exp_msk1;
    1630                 adj = aadj1 * ulp(dval(rv));
    1631                 dval(rv) += adj;
    1632                 if ((word0(rv) & Exp_mask) <= P * Exp_msk1)
     1630            if ((word0(&rv) & Exp_mask) <= P * Exp_msk1) {
     1631                dval(&rv0) = dval(&rv);
     1632                word0(&rv) += P * Exp_msk1;
     1633                adj.d = aadj1 * ulp(&rv);
     1634                dval(&rv) += adj.d;
     1635                if ((word0(&rv) & Exp_mask) <= P * Exp_msk1)
    16331636                {
    1634                     if (word0(rv0) == Tiny0 && word1(rv0) == Tiny1)
     1637                    if (word0(&rv0) == Tiny0 && word1(&rv0) == Tiny1)
    16351638                        goto undfl;
    1636                     word0(rv) = Tiny0;
    1637                     word1(rv) = Tiny1;
     1639                    word0(&rv) = Tiny0;
     1640                    word1(&rv) = Tiny1;
    16381641                    goto cont;
    16391642                }
    16401643                else
    1641                     word0(rv) -= P * Exp_msk1;
     1644                    word0(&rv) -= P * Exp_msk1;
    16421645            } else {
    1643                 adj = aadj1 * ulp(dval(rv));
    1644                 dval(rv) += adj;
     1646                adj.d = aadj1 * ulp(&rv);
     1647                dval(&rv) += adj.d;
    16451648            }
    16461649#else /*Sudden_Underflow*/
     
    16571660                    aadj1 = -aadj1;
    16581661            }
    1659             adj = aadj1 * ulp(dval(rv));
    1660             dval(rv) += adj;
     1662            adj.d = aadj1 * ulp(&rv);
     1663            dval(&rv) += adj.d;
    16611664#endif /*Sudden_Underflow*/
    16621665#endif /*Avoid_Underflow*/
    16631666        }
    1664         z = word0(rv) & Exp_mask;
     1667        z = word0(&rv) & Exp_mask;
    16651668#ifndef SET_INEXACT
    16661669#ifdef Avoid_Underflow
     
    16721675            aadj -= L;
    16731676            /* The tolerances below are conservative. */
    1674             if (dsign || word1(rv) || word0(rv) & Bndry_mask) {
     1677            if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
    16751678                if (aadj < .4999999 || aadj > .5000001)
    16761679                    break;
     
    16881691    if (inexact) {
    16891692        if (!oldinexact) {
    1690             word0(rv0) = Exp_1 + (70 << Exp_shift);
    1691             word1(rv0) = 0;
    1692             dval(rv0) += 1.;
     1693            word0(&rv0) = Exp_1 + (70 << Exp_shift);
     1694            word1(&rv0) = 0;
     1695            dval(&rv0) += 1.;
    16931696        }
    16941697    } else if (!oldinexact)
     
    16971700#ifdef Avoid_Underflow
    16981701    if (scale) {
    1699         word0(rv0) = Exp_1 - 2 * P * Exp_msk1;
    1700         word1(rv0) = 0;
    1701         dval(rv) *= dval(rv0);
     1702        word0(&rv0) = Exp_1 - 2 * P * Exp_msk1;
     1703        word1(&rv0) = 0;
     1704        dval(&rv) *= dval(&rv0);
    17021705#ifndef NO_ERRNO
    17031706        /* try to avoid the bug of testing an 8087 register value */
    1704         if (word0(rv) == 0 && word1(rv) == 0)
     1707        if (word0(&rv) == 0 && word1(&rv) == 0)
    17051708            errno = ERANGE;
    17061709#endif
     
    17081711#endif /* Avoid_Underflow */
    17091712#ifdef SET_INEXACT
    1710     if (inexact && !(word0(rv) & Exp_mask)) {
     1713    if (inexact && !(word0(&rv) & Exp_mask)) {
    17111714        /* set underflow bit */
    1712         dval(rv0) = 1e-300;
    1713         dval(rv0) *= dval(rv0);
     1715        dval(&rv0) = 1e-300;
     1716        dval(&rv0) *= dval(&rv0);
    17141717    }
    17151718#endif
     
    17231726    if (se)
    17241727        *se = const_cast<char*>(s);
    1725     return sign ? -dval(rv) : dval(rv);
     1728    return sign ? -dval(&rv) : dval(&rv);
    17261729}
    17271730
     
    19151918 */
    19161919
    1917 char* dtoa(double d, int ndigits, int* decpt, int* sign, char** rve)
     1920char* dtoa(double dd, int ndigits, int* decpt, int* sign, char** rve)
    19181921{
    19191922    /*
     
    19351938#endif
    19361939    Bigint *b, *b1, *delta, *mlo = NULL, *mhi, *S;
    1937     double d2, ds, eps;
     1940    U d2, eps, u;
     1941    double ds;
    19381942    char *s, *s0;
    19391943#ifdef SET_INEXACT
     
    19481952#endif
    19491953
    1950     if (word0(d) & Sign_bit) {
     1954    u.d = dd;
     1955    if (word0(&u) & Sign_bit) {
    19511956        /* set sign for everything, including 0's and NaNs */
    19521957        *sign = 1;
    1953         word0(d) &= ~Sign_bit;    /* clear sign bit */
     1958        word0(&u) &= ~Sign_bit;    /* clear sign bit */
    19541959    } else
    19551960        *sign = 0;
    19561961
    1957     if ((word0(d) & Exp_mask) == Exp_mask)
     1962    if ((word0(&u) & Exp_mask) == Exp_mask)
    19581963    {
    19591964        /* Infinity or NaN */
    19601965        *decpt = 9999;
    1961         if (!word1(d) && !(word0(d) & 0xfffff))
     1966        if (!word1(&u) && !(word0(&u) & 0xfffff))
    19621967            return nrv_alloc("Infinity", rve, 8);
    19631968        return nrv_alloc("NaN", rve, 3);
    19641969    }
    1965     if (!dval(d)) {
     1970    if (!dval(&u)) {
    19661971        *decpt = 1;
    19671972        return nrv_alloc("0", rve, 1);
     
    19731978#endif
    19741979
    1975     b = d2b(dval(d), &be, &bbits);
     1980    b = d2b(&u, &be, &bbits);
    19761981#ifdef Sudden_Underflow
    1977     i = (int)(word0(d) >> Exp_shift1 & (Exp_mask >> Exp_shift1));
    1978 #else
    1979     if ((i = (int)(word0(d) >> Exp_shift1 & (Exp_mask >> Exp_shift1)))) {
    1980 #endif
    1981         dval(d2) = dval(d);
    1982         word0(d2) &= Frac_mask1;
    1983         word0(d2) |= Exp_11;
     1982    i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask >> Exp_shift1));
     1983#else
     1984    if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask >> Exp_shift1)))) {
     1985#endif
     1986        dval(&d2) = dval(&u);
     1987        word0(&d2) &= Frac_mask1;
     1988        word0(&d2) |= Exp_11;
    19841989
    19851990        /* log(x)    ~=~ log(1.5) + (x-1.5)/1.5
     
    20122017
    20132018        i = bbits + be + (Bias + (P - 1) - 1);
    2014         x = (i > 32) ? (word0(d) << (64 - i)) | (word1(d) >> (i - 32))
    2015                 : word1(d) << (32 - i);
    2016         dval(d2) = x;
    2017         word0(d2) -= 31 * Exp_msk1; /* adjust exponent */
     2019        x = (i > 32) ? (word0(&u) << (64 - i)) | (word1(&u) >> (i - 32))
     2020                : word1(&u) << (32 - i);
     2021        dval(&d2) = x;
     2022        word0(&d2) -= 31 * Exp_msk1; /* adjust exponent */
    20182023        i -= (Bias + (P - 1) - 1) + 1;
    20192024        denorm = 1;
    20202025    }
    20212026#endif
    2022     ds = (dval(d2) - 1.5) * 0.289529654602168 + 0.1760912590558 + (i * 0.301029995663981);
     2027    ds = (dval(&d2) - 1.5) * 0.289529654602168 + 0.1760912590558 + (i * 0.301029995663981);
    20232028    k = (int)ds;
    20242029    if (ds < 0. && ds != k)
     
    20262031    k_check = 1;
    20272032    if (k >= 0 && k <= Ten_pmax) {
    2028         if (dval(d) < tens[k])
     2033        if (dval(&u) < tens[k])
    20292034            k--;
    20302035        k_check = 0;
     
    20672072
    20682073        i = 0;
    2069         dval(d2) = dval(d);
     2074        dval(&d2) = dval(&u);
    20702075        k0 = k;
    20712076        ilim0 = ilim;
     
    20772082                /* prevent overflows */
    20782083                j &= Bletch - 1;
    2079                 dval(d) /= bigtens[n_bigtens - 1];
     2084                dval(&u) /= bigtens[n_bigtens - 1];
    20802085                ieps++;
    20812086            }
     
    20862091                }
    20872092            }
    2088             dval(d) /= ds;
     2093            dval(&u) /= ds;
    20892094        } else if ((j1 = -k)) {
    2090             dval(d) *= tens[j1 & 0xf];
     2095            dval(&u) *= tens[j1 & 0xf];
    20912096            for (j = j1 >> 4; j; j >>= 1, i++) {
    20922097                if (j & 1) {
    20932098                    ieps++;
    2094                     dval(d) *= bigtens[i];
     2099                    dval(&u) *= bigtens[i];
    20952100                }
    20962101            }
    20972102        }
    2098         if (k_check && dval(d) < 1. && ilim > 0) {
     2103        if (k_check && dval(&u) < 1. && ilim > 0) {
    20992104            if (ilim1 <= 0)
    21002105                goto fast_failed;
    21012106            ilim = ilim1;
    21022107            k--;
    2103             dval(d) *= 10.;
     2108            dval(&u) *= 10.;
    21042109            ieps++;
    21052110        }
    2106         dval(eps) = (ieps * dval(d)) + 7.;
    2107         word0(eps) -= (P - 1) * Exp_msk1;
     2111        dval(&eps) = (ieps * dval(&u)) + 7.;
     2112        word0(&eps) -= (P - 1) * Exp_msk1;
    21082113        if (ilim == 0) {
    21092114            S = mhi = 0;
    2110             dval(d) -= 5.;
    2111             if (dval(d) > dval(eps))
     2115            dval(&u) -= 5.;
     2116            if (dval(&u) > dval(&eps))
    21122117                goto one_digit;
    2113             if (dval(d) < -dval(eps))
     2118            if (dval(&u) < -dval(&eps))
    21142119                goto no_digits;
    21152120            goto fast_failed;
     
    21202125             * generating digits needed.
    21212126             */
    2122             dval(eps) = (0.5 / tens[ilim - 1]) - dval(eps);
     2127            dval(&eps) = (0.5 / tens[ilim - 1]) - dval(&eps);
    21232128            for (i = 0;;) {
    2124                 L = (long int)dval(d);
    2125                 dval(d) -= L;
     2129                L = (long int)dval(&u);
     2130                dval(&u) -= L;
    21262131                *s++ = '0' + (int)L;
    2127                 if (dval(d) < dval(eps))
     2132                if (dval(&u) < dval(&eps))
    21282133                    goto ret1;
    2129                 if (1. - dval(d) < dval(eps))
     2134                if (1. - dval(&u) < dval(&eps))
    21302135                    goto bump_up;
    21312136                if (++i >= ilim)
    21322137                    break;
    2133                 dval(eps) *= 10.;
    2134                 dval(d) *= 10.;
     2138                dval(&eps) *= 10.;
     2139                dval(&u) *= 10.;
    21352140            }
    21362141        } else {
    21372142#endif
    21382143            /* Generate ilim digits, then fix them up. */
    2139             dval(eps) *= tens[ilim - 1];
    2140             for (i = 1;; i++, dval(d) *= 10.) {
    2141                 L = (int32_t)(dval(d));
    2142                 if (!(dval(d) -= L))
     2144            dval(&eps) *= tens[ilim - 1];
     2145            for (i = 1;; i++, dval(&u) *= 10.) {
     2146                L = (int32_t)(dval(&u));
     2147                if (!(dval(&u) -= L))
    21432148                    ilim = i;
    21442149                *s++ = '0' + (int)L;
    21452150                if (i == ilim) {
    2146                     if (dval(d) > 0.5 + dval(eps))
     2151                    if (dval(&u) > 0.5 + dval(&eps))
    21472152                        goto bump_up;
    2148                     else if (dval(d) < 0.5 - dval(eps)) {
     2153                    else if (dval(&u) < 0.5 - dval(&eps)) {
    21492154                        while (*--s == '0') { }
    21502155                        s++;
     
    21592164fast_failed:
    21602165        s = s0;
    2161         dval(d) = dval(d2);
     2166        dval(&u) = dval(&d2);
    21622167        k = k0;
    21632168        ilim = ilim0;
     
    21712176        if (ndigits < 0 && ilim <= 0) {
    21722177            S = mhi = 0;
    2173             if (ilim < 0 || dval(d) <= 5 * ds)
     2178            if (ilim < 0 || dval(&u) <= 5 * ds)
    21742179                goto no_digits;
    21752180            goto one_digit;
    21762181        }
    2177         for (i = 1;; i++, dval(d) *= 10.) {
    2178             L = (int32_t)(dval(d) / ds);
    2179             dval(d) -= L * ds;
     2182        for (i = 1;; i++, dval(&u) *= 10.) {
     2183            L = (int32_t)(dval(&u) / ds);
     2184            dval(&u) -= L * ds;
    21802185#ifdef Check_FLT_ROUNDS
    21812186            /* If FLT_ROUNDS == 2, L will usually be high by 1 */
    2182             if (dval(d) < 0) {
     2187            if (dval(&u) < 0) {
    21832188                L--;
    2184                 dval(d) += ds;
     2189                dval(&u) += ds;
    21852190            }
    21862191#endif
    21872192            *s++ = '0' + (int)L;
    2188             if (!dval(d)) {
     2193            if (!dval(&u)) {
    21892194#ifdef SET_INEXACT
    21902195                inexact = 0;
     
    21932198            }
    21942199            if (i == ilim) {
    2195                 dval(d) += dval(d);
    2196                 if (dval(d) > ds || (dval(d) == ds && (L & 1))) {
     2200                dval(&u) += dval(&u);
     2201                if (dval(&u) > ds || (dval(&u) == ds && (L & 1))) {
    21972202bump_up:
    21982203                    while (*--s == '9')
     
    22492254
    22502255    spec_case = 0;
    2251     if (!word1(d) && !(word0(d) & Bndry_mask)
     2256    if (!word1(&u) && !(word0(&u) & Bndry_mask)
    22522257#ifndef Sudden_Underflow
    2253      && word0(d) & (Exp_mask & ~Exp_msk1)
     2258     && word0(&u) & (Exp_mask & ~Exp_msk1)
    22542259#endif
    22552260            ) {
     
    23232328            j1 = delta->sign ? 1 : cmp(b, delta);
    23242329            Bfree(delta);
    2325             if (j1 == 0 && !(word1(d) & 1)) {
     2330            if (j1 == 0 && !(word1(&u) & 1)) {
    23262331                if (dig == '9')
    23272332                    goto round_9_up;
     
    23352340                goto ret;
    23362341            }
    2337             if (j < 0 || (j == 0 && !(word1(d) & 1))) {
     2342            if (j < 0 || (j == 0 && !(word1(&u) & 1))) {
    23382343                if (!b->x[0] && b->wds <= 1) {
    23392344#ifdef SET_INEXACT
     
    24222427    if (inexact) {
    24232428        if (!oldinexact) {
    2424             word0(d) = Exp_1 + (70 << Exp_shift);
    2425             word1(d) = 0;
    2426             dval(d) += 1.;
     2429            word0(&u) = Exp_1 + (70 << Exp_shift);
     2430            word1(&u) = 0;
     2431            dval(&u) += 1.;
    24272432        }
    24282433    } else if (!oldinexact)
Note: See TracChangeset for help on using the changeset viewer.