diff options
author | niklas <> | 1998-08-12 22:16:38 +0000 |
---|---|---|
committer | niklas <> | 1998-08-12 22:16:38 +0000 |
commit | 2f3712534799d2184deb6221d3f4d1f8d9098442 (patch) | |
tree | 0c81ec36b8b5e36874b4be9045bd48ca9a8d5339 | |
parent | 50eee0f1b3f8eb0bb5326831025eae1cacfc3059 (diff) | |
download | openbsd-2f3712534799d2184deb6221d3f4d1f8d9098442.tar.gz openbsd-2f3712534799d2184deb6221d3f4d1f8d9098442.tar.bz2 openbsd-2f3712534799d2184deb6221d3f4d1f8d9098442.zip |
Make code ANSI/ISO C conformant. Formerly undefined constructs were used
making load/store architectures (like mips&alpha) fail whn compiled with
gcc -O2.
-rw-r--r-- | src/lib/libc/stdlib/strtod.c | 222 |
1 files changed, 119 insertions, 103 deletions
diff --git a/src/lib/libc/stdlib/strtod.c b/src/lib/libc/stdlib/strtod.c index 4b38110dcb..36a0603fbf 100644 --- a/src/lib/libc/stdlib/strtod.c +++ b/src/lib/libc/stdlib/strtod.c | |||
@@ -90,7 +90,7 @@ | |||
90 | */ | 90 | */ |
91 | 91 | ||
92 | #if defined(LIBC_SCCS) && !defined(lint) | 92 | #if defined(LIBC_SCCS) && !defined(lint) |
93 | static char *rcsid = "$OpenBSD: strtod.c,v 1.10 1998/08/11 22:04:29 niklas Exp $"; | 93 | static char *rcsid = "$OpenBSD: strtod.c,v 1.11 1998/08/12 22:16:38 niklas Exp $"; |
94 | #endif /* LIBC_SCCS and not lint */ | 94 | #endif /* LIBC_SCCS and not lint */ |
95 | 95 | ||
96 | #if defined(__m68k__) || defined(__sparc__) || defined(__i386__) || \ | 96 | #if defined(__m68k__) || defined(__sparc__) || defined(__i386__) || \ |
@@ -222,12 +222,17 @@ Exactly one of IEEE_LITTLE_ENDIAN IEEE_BIG_ENDIAN, VAX, or | |||
222 | IBM should be defined. | 222 | IBM should be defined. |
223 | #endif | 223 | #endif |
224 | 224 | ||
225 | typedef union { | ||
226 | double d; | ||
227 | ULong ul[2]; | ||
228 | } _double; | ||
229 | #define value(x) ((x).d) | ||
225 | #ifdef IEEE_LITTLE_ENDIAN | 230 | #ifdef IEEE_LITTLE_ENDIAN |
226 | #define word0(x) ((ULong *)&x)[1] | 231 | #define word0(x) ((x).ul[1]) |
227 | #define word1(x) ((ULong *)&x)[0] | 232 | #define word1(x) ((x).ul[0]) |
228 | #else | 233 | #else |
229 | #define word0(x) ((ULong *)&x)[0] | 234 | #define word0(x) ((x).ul[0]) |
230 | #define word1(x) ((ULong *)&x)[1] | 235 | #define word1(x) ((x).ul[1]) |
231 | #endif | 236 | #endif |
232 | 237 | ||
233 | /* The following definition of Storeinc is appropriate for MIPS processors. | 238 | /* The following definition of Storeinc is appropriate for MIPS processors. |
@@ -909,14 +914,16 @@ diff | |||
909 | static double | 914 | static double |
910 | ulp | 915 | ulp |
911 | #ifdef KR_headers | 916 | #ifdef KR_headers |
912 | (x) double x; | 917 | (_x) double _x; |
913 | #else | 918 | #else |
914 | (double x) | 919 | (double _x) |
915 | #endif | 920 | #endif |
916 | { | 921 | { |
922 | _double x; | ||
917 | register Long L; | 923 | register Long L; |
918 | double a; | 924 | _double a; |
919 | 925 | ||
926 | value(x) = _x; | ||
920 | L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; | 927 | L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; |
921 | #ifndef Sudden_Underflow | 928 | #ifndef Sudden_Underflow |
922 | if (L > 0) { | 929 | if (L > 0) { |
@@ -941,7 +948,7 @@ ulp | |||
941 | } | 948 | } |
942 | } | 949 | } |
943 | #endif | 950 | #endif |
944 | return a; | 951 | return value(a); |
945 | } | 952 | } |
946 | 953 | ||
947 | static double | 954 | static double |
@@ -954,7 +961,7 @@ b2d | |||
954 | { | 961 | { |
955 | ULong *xa, *xa0, w, y, z; | 962 | ULong *xa, *xa0, w, y, z; |
956 | int k; | 963 | int k; |
957 | double d; | 964 | _double d; |
958 | #ifdef VAX | 965 | #ifdef VAX |
959 | ULong d0, d1; | 966 | ULong d0, d1; |
960 | #else | 967 | #else |
@@ -1011,22 +1018,27 @@ b2d | |||
1011 | #undef d0 | 1018 | #undef d0 |
1012 | #undef d1 | 1019 | #undef d1 |
1013 | #endif | 1020 | #endif |
1014 | return d; | 1021 | return value(d); |
1015 | } | 1022 | } |
1016 | 1023 | ||
1017 | static Bigint * | 1024 | static Bigint * |
1018 | d2b | 1025 | d2b |
1019 | #ifdef KR_headers | 1026 | #ifdef KR_headers |
1020 | (d, e, bits) double d; int *e, *bits; | 1027 | (_d, e, bits) double d; int *e, *bits; |
1021 | #else | 1028 | #else |
1022 | (double d, int *e, int *bits) | 1029 | (double _d, int *e, int *bits) |
1023 | #endif | 1030 | #endif |
1024 | { | 1031 | { |
1025 | Bigint *b; | 1032 | Bigint *b; |
1026 | int de, i, k; | 1033 | int de, i, k; |
1027 | ULong *x, y, z; | 1034 | ULong *x, y, z; |
1035 | _double d; | ||
1028 | #ifdef VAX | 1036 | #ifdef VAX |
1029 | ULong d0, d1; | 1037 | ULong d0, d1; |
1038 | #endif | ||
1039 | |||
1040 | value(d) = _d; | ||
1041 | #ifdef VAX | ||
1030 | d0 = word0(d) >> 16 | word0(d) << 16; | 1042 | d0 = word0(d) >> 16 | word0(d) << 16; |
1031 | d1 = word1(d) >> 16 | word1(d) << 16; | 1043 | d1 = word1(d) >> 16 | word1(d) << 16; |
1032 | #else | 1044 | #else |
@@ -1151,11 +1163,11 @@ ratio | |||
1151 | (Bigint *a, Bigint *b) | 1163 | (Bigint *a, Bigint *b) |
1152 | #endif | 1164 | #endif |
1153 | { | 1165 | { |
1154 | double da, db; | 1166 | _double da, db; |
1155 | int k, ka, kb; | 1167 | int k, ka, kb; |
1156 | 1168 | ||
1157 | da = b2d(a, &ka); | 1169 | value(da) = b2d(a, &ka); |
1158 | db = b2d(b, &kb); | 1170 | value(db) = b2d(b, &kb); |
1159 | #ifdef Pack_32 | 1171 | #ifdef Pack_32 |
1160 | k = ka - kb + 32*(a->wds - b->wds); | 1172 | k = ka - kb + 32*(a->wds - b->wds); |
1161 | #else | 1173 | #else |
@@ -1181,7 +1193,7 @@ ratio | |||
1181 | word0(db) += k*Exp_msk1; | 1193 | word0(db) += k*Exp_msk1; |
1182 | } | 1194 | } |
1183 | #endif | 1195 | #endif |
1184 | return da / db; | 1196 | return value(da) / value(db); |
1185 | } | 1197 | } |
1186 | 1198 | ||
1187 | static CONST double | 1199 | static CONST double |
@@ -1221,7 +1233,8 @@ strtod | |||
1221 | int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, | 1233 | int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, |
1222 | e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; | 1234 | e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; |
1223 | CONST char *s, *s0, *s1; | 1235 | CONST char *s, *s0, *s1; |
1224 | double aadj, aadj1, adj, rv, rv0; | 1236 | double aadj, aadj1, adj; |
1237 | _double rv, rv0; | ||
1225 | Long L; | 1238 | Long L; |
1226 | ULong y, z; | 1239 | ULong y, z; |
1227 | Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; | 1240 | Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; |
@@ -1233,7 +1246,7 @@ strtod | |||
1233 | #endif | 1246 | #endif |
1234 | 1247 | ||
1235 | sign = nz0 = nz = 0; | 1248 | sign = nz0 = nz = 0; |
1236 | rv = 0.; | 1249 | value(rv) = 0.; |
1237 | 1250 | ||
1238 | 1251 | ||
1239 | for(s = s00; isspace((unsigned char) *s); s++) | 1252 | for(s = s00; isspace((unsigned char) *s); s++) |
@@ -1350,9 +1363,9 @@ strtod | |||
1350 | if (!nd0) | 1363 | if (!nd0) |
1351 | nd0 = nd; | 1364 | nd0 = nd; |
1352 | k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; | 1365 | k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; |
1353 | rv = y; | 1366 | value(rv) = y; |
1354 | if (k > 9) | 1367 | if (k > 9) |
1355 | rv = tens[k - 9] * rv + z; | 1368 | value(rv) = tens[k - 9] * value(rv) + z; |
1356 | bd0 = 0; | 1369 | bd0 = 0; |
1357 | if (nd <= DBL_DIG | 1370 | if (nd <= DBL_DIG |
1358 | #ifndef RND_PRODQUOT | 1371 | #ifndef RND_PRODQUOT |
@@ -1366,7 +1379,8 @@ strtod | |||
1366 | #ifdef VAX | 1379 | #ifdef VAX |
1367 | goto vax_ovfl_check; | 1380 | goto vax_ovfl_check; |
1368 | #else | 1381 | #else |
1369 | /* rv = */ rounded_product(rv, tens[e]); | 1382 | /* value(rv) = */ rounded_product(value(rv), |
1383 | tens[e]); | ||
1370 | goto ret; | 1384 | goto ret; |
1371 | #endif | 1385 | #endif |
1372 | } | 1386 | } |
@@ -1376,27 +1390,30 @@ strtod | |||
1376 | * this for larger i values. | 1390 | * this for larger i values. |
1377 | */ | 1391 | */ |
1378 | e -= i; | 1392 | e -= i; |
1379 | rv *= tens[i]; | 1393 | value(rv) *= tens[i]; |
1380 | #ifdef VAX | 1394 | #ifdef VAX |
1381 | /* VAX exponent range is so narrow we must | 1395 | /* VAX exponent range is so narrow we must |
1382 | * worry about overflow here... | 1396 | * worry about overflow here... |
1383 | */ | 1397 | */ |
1384 | vax_ovfl_check: | 1398 | vax_ovfl_check: |
1385 | word0(rv) -= P*Exp_msk1; | 1399 | word0(rv) -= P*Exp_msk1; |
1386 | /* rv = */ rounded_product(rv, tens[e]); | 1400 | /* value(rv) = */ rounded_product(value(rv), |
1401 | tens[e]); | ||
1387 | if ((word0(rv) & Exp_mask) | 1402 | if ((word0(rv) & Exp_mask) |
1388 | > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) | 1403 | > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) |
1389 | goto ovfl; | 1404 | goto ovfl; |
1390 | word0(rv) += P*Exp_msk1; | 1405 | word0(rv) += P*Exp_msk1; |
1391 | #else | 1406 | #else |
1392 | /* rv = */ rounded_product(rv, tens[e]); | 1407 | /* value(rv) = */ rounded_product(value(rv), |
1408 | tens[e]); | ||
1393 | #endif | 1409 | #endif |
1394 | goto ret; | 1410 | goto ret; |
1395 | } | 1411 | } |
1396 | } | 1412 | } |
1397 | #ifndef Inaccurate_Divide | 1413 | #ifndef Inaccurate_Divide |
1398 | else if (e >= -Ten_pmax) { | 1414 | else if (e >= -Ten_pmax) { |
1399 | /* rv = */ rounded_quotient(rv, tens[-e]); | 1415 | /* value(rv) = */ rounded_quotient(value(rv), |
1416 | tens[-e]); | ||
1400 | goto ret; | 1417 | goto ret; |
1401 | } | 1418 | } |
1402 | #endif | 1419 | #endif |
@@ -1407,13 +1424,13 @@ strtod | |||
1407 | 1424 | ||
1408 | if (e1 > 0) { | 1425 | if (e1 > 0) { |
1409 | if (i = e1 & 15) | 1426 | if (i = e1 & 15) |
1410 | rv *= tens[i]; | 1427 | value(rv) *= tens[i]; |
1411 | if (e1 &= ~15) { | 1428 | if (e1 &= ~15) { |
1412 | if (e1 > DBL_MAX_10_EXP) { | 1429 | if (e1 > DBL_MAX_10_EXP) { |
1413 | ovfl: | 1430 | ovfl: |
1414 | errno = ERANGE; | 1431 | errno = ERANGE; |
1415 | #ifdef __STDC__ | 1432 | #ifdef __STDC__ |
1416 | rv = HUGE_VAL; | 1433 | value(rv) = HUGE_VAL; |
1417 | #else | 1434 | #else |
1418 | /* Can't trust HUGE_VAL */ | 1435 | /* Can't trust HUGE_VAL */ |
1419 | #ifdef IEEE_Arith | 1436 | #ifdef IEEE_Arith |
@@ -1431,10 +1448,10 @@ strtod | |||
1431 | if (e1 >>= 4) { | 1448 | if (e1 >>= 4) { |
1432 | for(j = 0; e1 > 1; j++, e1 >>= 1) | 1449 | for(j = 0; e1 > 1; j++, e1 >>= 1) |
1433 | if (e1 & 1) | 1450 | if (e1 & 1) |
1434 | rv *= bigtens[j]; | 1451 | value(rv) *= bigtens[j]; |
1435 | /* The last multiplication could overflow. */ | 1452 | /* The last multiplication could overflow. */ |
1436 | word0(rv) -= P*Exp_msk1; | 1453 | word0(rv) -= P*Exp_msk1; |
1437 | rv *= bigtens[j]; | 1454 | value(rv) *= bigtens[j]; |
1438 | if ((z = word0(rv) & Exp_mask) | 1455 | if ((z = word0(rv) & Exp_mask) |
1439 | > Exp_msk1*(DBL_MAX_EXP+Bias-P)) | 1456 | > Exp_msk1*(DBL_MAX_EXP+Bias-P)) |
1440 | goto ovfl; | 1457 | goto ovfl; |
@@ -1453,23 +1470,23 @@ strtod | |||
1453 | else if (e1 < 0) { | 1470 | else if (e1 < 0) { |
1454 | e1 = -e1; | 1471 | e1 = -e1; |
1455 | if (i = e1 & 15) | 1472 | if (i = e1 & 15) |
1456 | rv /= tens[i]; | 1473 | value(rv) /= tens[i]; |
1457 | if (e1 &= ~15) { | 1474 | if (e1 &= ~15) { |
1458 | e1 >>= 4; | 1475 | e1 >>= 4; |
1459 | if (e1 >= 1 << n_bigtens) | 1476 | if (e1 >= 1 << n_bigtens) |
1460 | goto undfl; | 1477 | goto undfl; |
1461 | for(j = 0; e1 > 1; j++, e1 >>= 1) | 1478 | for(j = 0; e1 > 1; j++, e1 >>= 1) |
1462 | if (e1 & 1) | 1479 | if (e1 & 1) |
1463 | rv *= tinytens[j]; | 1480 | value(rv) *= tinytens[j]; |
1464 | /* The last multiplication could underflow. */ | 1481 | /* The last multiplication could underflow. */ |
1465 | rv0 = rv; | 1482 | value(rv0) = value(rv); |
1466 | rv *= tinytens[j]; | 1483 | value(rv) *= tinytens[j]; |
1467 | if (!rv) { | 1484 | if (!value(rv)) { |
1468 | rv = 2.*rv0; | 1485 | value(rv) = 2.*value(rv0); |
1469 | rv *= tinytens[j]; | 1486 | value(rv) *= tinytens[j]; |
1470 | if (!rv) { | 1487 | if (!value(rv)) { |
1471 | undfl: | 1488 | undfl: |
1472 | rv = 0.; | 1489 | value(rv) = 0.; |
1473 | errno = ERANGE; | 1490 | errno = ERANGE; |
1474 | if (bd0) | 1491 | if (bd0) |
1475 | goto retfree; | 1492 | goto retfree; |
@@ -1493,7 +1510,7 @@ strtod | |||
1493 | for(;;) { | 1510 | for(;;) { |
1494 | bd = Balloc(bd0->k); | 1511 | bd = Balloc(bd0->k); |
1495 | Bcopy(bd, bd0); | 1512 | Bcopy(bd, bd0); |
1496 | bb = d2b(rv, &bbe, &bbbits); /* rv = bb * 2^bbe */ | 1513 | bb = d2b(value(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */ |
1497 | bs = i2b(1); | 1514 | bs = i2b(1); |
1498 | 1515 | ||
1499 | if (e >= 0) { | 1516 | if (e >= 0) { |
@@ -1605,12 +1622,12 @@ strtod | |||
1605 | break; | 1622 | break; |
1606 | #endif | 1623 | #endif |
1607 | if (dsign) | 1624 | if (dsign) |
1608 | rv += ulp(rv); | 1625 | value(rv) += ulp(value(rv)); |
1609 | #ifndef ROUND_BIASED | 1626 | #ifndef ROUND_BIASED |
1610 | else { | 1627 | else { |
1611 | rv -= ulp(rv); | 1628 | value(rv) -= ulp(value(rv)); |
1612 | #ifndef Sudden_Underflow | 1629 | #ifndef Sudden_Underflow |
1613 | if (!rv) | 1630 | if (!value(rv)) |
1614 | goto undfl; | 1631 | goto undfl; |
1615 | #endif | 1632 | #endif |
1616 | } | 1633 | } |
@@ -1661,10 +1678,10 @@ strtod | |||
1661 | /* Check for overflow */ | 1678 | /* Check for overflow */ |
1662 | 1679 | ||
1663 | if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { | 1680 | if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { |
1664 | rv0 = rv; | 1681 | value(rv0) = value(rv); |
1665 | word0(rv) -= P*Exp_msk1; | 1682 | word0(rv) -= P*Exp_msk1; |
1666 | adj = aadj1 * ulp(rv); | 1683 | adj = aadj1 * ulp(value(rv)); |
1667 | rv += adj; | 1684 | value(rv) += adj; |
1668 | if ((word0(rv) & Exp_mask) >= | 1685 | if ((word0(rv) & Exp_mask) >= |
1669 | Exp_msk1*(DBL_MAX_EXP+Bias-P)) { | 1686 | Exp_msk1*(DBL_MAX_EXP+Bias-P)) { |
1670 | if (word0(rv0) == Big0 && word1(rv0) == Big1) | 1687 | if (word0(rv0) == Big0 && word1(rv0) == Big1) |
@@ -1679,10 +1696,10 @@ strtod | |||
1679 | else { | 1696 | else { |
1680 | #ifdef Sudden_Underflow | 1697 | #ifdef Sudden_Underflow |
1681 | if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { | 1698 | if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { |
1682 | rv0 = rv; | 1699 | value(rv0) = value(rv); |
1683 | word0(rv) += P*Exp_msk1; | 1700 | word0(rv) += P*Exp_msk1; |
1684 | adj = aadj1 * ulp(rv); | 1701 | adj = aadj1 * ulp(value(rv)); |
1685 | rv += adj; | 1702 | value(rv) += adj; |
1686 | #ifdef IBM | 1703 | #ifdef IBM |
1687 | if ((word0(rv) & Exp_mask) < P*Exp_msk1) | 1704 | if ((word0(rv) & Exp_mask) < P*Exp_msk1) |
1688 | #else | 1705 | #else |
@@ -1700,8 +1717,8 @@ strtod | |||
1700 | word0(rv) -= P*Exp_msk1; | 1717 | word0(rv) -= P*Exp_msk1; |
1701 | } | 1718 | } |
1702 | else { | 1719 | else { |
1703 | adj = aadj1 * ulp(rv); | 1720 | adj = aadj1 * ulp(value(rv)); |
1704 | rv += adj; | 1721 | value(rv) += adj; |
1705 | } | 1722 | } |
1706 | #else | 1723 | #else |
1707 | /* Compute adj so that the IEEE rounding rules will | 1724 | /* Compute adj so that the IEEE rounding rules will |
@@ -1716,8 +1733,8 @@ strtod | |||
1716 | if (!dsign) | 1733 | if (!dsign) |
1717 | aadj1 = -aadj1; | 1734 | aadj1 = -aadj1; |
1718 | } | 1735 | } |
1719 | adj = aadj1 * ulp(rv); | 1736 | adj = aadj1 * ulp(value(rv)); |
1720 | rv += adj; | 1737 | value(rv) += adj; |
1721 | #endif | 1738 | #endif |
1722 | } | 1739 | } |
1723 | z = word0(rv) & Exp_mask; | 1740 | z = word0(rv) & Exp_mask; |
@@ -1748,7 +1765,7 @@ strtod | |||
1748 | ret: | 1765 | ret: |
1749 | if (se) | 1766 | if (se) |
1750 | *se = (char *)s; | 1767 | *se = (char *)s; |
1751 | return sign ? -rv : rv; | 1768 | return sign ? -value(rv) : value(rv); |
1752 | } | 1769 | } |
1753 | 1770 | ||
1754 | static int | 1771 | static int |
@@ -1894,10 +1911,10 @@ quorem | |||
1894 | char * | 1911 | char * |
1895 | __dtoa | 1912 | __dtoa |
1896 | #ifdef KR_headers | 1913 | #ifdef KR_headers |
1897 | (d, mode, ndigits, decpt, sign, rve) | 1914 | (_d, mode, ndigits, decpt, sign, rve) |
1898 | double d; int mode, ndigits, *decpt, *sign; char **rve; | 1915 | double _d; int mode, ndigits, *decpt, *sign; char **rve; |
1899 | #else | 1916 | #else |
1900 | (double d, int mode, int ndigits, int *decpt, int *sign, char **rve) | 1917 | (double _d, int mode, int ndigits, int *decpt, int *sign, char **rve) |
1901 | #endif | 1918 | #endif |
1902 | { | 1919 | { |
1903 | /* Arguments ndigits, decpt, sign are similar to those | 1920 | /* Arguments ndigits, decpt, sign are similar to those |
@@ -1943,11 +1960,13 @@ __dtoa | |||
1943 | ULong x; | 1960 | ULong x; |
1944 | #endif | 1961 | #endif |
1945 | Bigint *b, *b1, *delta, *mlo, *mhi, *S; | 1962 | Bigint *b, *b1, *delta, *mlo, *mhi, *S; |
1946 | double d2, ds, eps; | 1963 | double ds; |
1947 | char *s, *s0; | 1964 | char *s, *s0; |
1948 | static Bigint *result; | 1965 | static Bigint *result; |
1949 | static int result_k; | 1966 | static int result_k; |
1967 | _double d, d2, eps; | ||
1950 | 1968 | ||
1969 | value(d) = _d; | ||
1951 | if (result) { | 1970 | if (result) { |
1952 | result->k = result_k; | 1971 | result->k = result_k; |
1953 | result->maxwds = 1 << result_k; | 1972 | result->maxwds = 1 << result_k; |
@@ -1987,9 +2006,9 @@ __dtoa | |||
1987 | } | 2006 | } |
1988 | #endif | 2007 | #endif |
1989 | #ifdef IBM | 2008 | #ifdef IBM |
1990 | d += 0; /* normalize */ | 2009 | value(d) += 0; /* normalize */ |
1991 | #endif | 2010 | #endif |
1992 | if (!d) { | 2011 | if (!value(d)) { |
1993 | *decpt = 1; | 2012 | *decpt = 1; |
1994 | s = "0"; | 2013 | s = "0"; |
1995 | if (rve) | 2014 | if (rve) |
@@ -1997,22 +2016,18 @@ __dtoa | |||
1997 | return s; | 2016 | return s; |
1998 | } | 2017 | } |
1999 | 2018 | ||
2000 | b = d2b(d, &be, &bbits); | 2019 | b = d2b(value(d), &be, &bbits); |
2001 | #ifdef Sudden_Underflow | 2020 | #ifdef Sudden_Underflow |
2002 | i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); | 2021 | i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); |
2003 | #else | 2022 | #else |
2004 | if (i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) { | 2023 | if (i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) { |
2005 | #endif | 2024 | #endif |
2006 | d2 = d; | 2025 | value(d2) = value(d); |
2007 | #ifdef __GNUC__ | ||
2008 | /* Do not move instructions depending on d2 over this line. */ | ||
2009 | __asm__ __volatile__ ("" : : "X" (d2) : "memory"); | ||
2010 | #endif | ||
2011 | word0(d2) &= Frac_mask1; | 2026 | word0(d2) &= Frac_mask1; |
2012 | word0(d2) |= Exp_11; | 2027 | word0(d2) |= Exp_11; |
2013 | #ifdef IBM | 2028 | #ifdef IBM |
2014 | if (j = 11 - hi0bits(word0(d2) & Frac_mask)) | 2029 | if (j = 11 - hi0bits(word0(d2) & Frac_mask)) |
2015 | d2 /= 1 << j; | 2030 | value(d2) /= 1 << j; |
2016 | #endif | 2031 | #endif |
2017 | 2032 | ||
2018 | /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 | 2033 | /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 |
@@ -2051,19 +2066,20 @@ __dtoa | |||
2051 | i = bbits + be + (Bias + (P-1) - 1); | 2066 | i = bbits + be + (Bias + (P-1) - 1); |
2052 | x = i > 32 ? word0(d) << 64 - i | word1(d) >> i - 32 | 2067 | x = i > 32 ? word0(d) << 64 - i | word1(d) >> i - 32 |
2053 | : word1(d) << 32 - i; | 2068 | : word1(d) << 32 - i; |
2054 | d2 = x; | 2069 | value(d2) = x; |
2055 | word0(d2) -= 31*Exp_msk1; /* adjust exponent */ | 2070 | word0(d2) -= 31*Exp_msk1; /* adjust exponent */ |
2056 | i -= (Bias + (P-1) - 1) + 1; | 2071 | i -= (Bias + (P-1) - 1) + 1; |
2057 | denorm = 1; | 2072 | denorm = 1; |
2058 | } | 2073 | } |
2059 | #endif | 2074 | #endif |
2060 | ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; | 2075 | ds = (value(d2)-1.5)*0.289529654602168 + 0.1760912590558 + |
2076 | i*0.301029995663981; | ||
2061 | k = (int)ds; | 2077 | k = (int)ds; |
2062 | if (ds < 0. && ds != k) | 2078 | if (ds < 0. && ds != k) |
2063 | k--; /* want k = floor(ds) */ | 2079 | k--; /* want k = floor(ds) */ |
2064 | k_check = 1; | 2080 | k_check = 1; |
2065 | if (k >= 0 && k <= Ten_pmax) { | 2081 | if (k >= 0 && k <= Ten_pmax) { |
2066 | if (d < tens[k]) | 2082 | if (value(d) < tens[k]) |
2067 | k--; | 2083 | k--; |
2068 | k_check = 0; | 2084 | k_check = 0; |
2069 | } | 2085 | } |
@@ -2130,7 +2146,7 @@ __dtoa | |||
2130 | /* Try to get by with floating-point arithmetic. */ | 2146 | /* Try to get by with floating-point arithmetic. */ |
2131 | 2147 | ||
2132 | i = 0; | 2148 | i = 0; |
2133 | d2 = d; | 2149 | value(d2) = value(d); |
2134 | k0 = k; | 2150 | k0 = k; |
2135 | ilim0 = ilim; | 2151 | ilim0 = ilim; |
2136 | ieps = 2; /* conservative */ | 2152 | ieps = 2; /* conservative */ |
@@ -2140,7 +2156,7 @@ __dtoa | |||
2140 | if (j & Bletch) { | 2156 | if (j & Bletch) { |
2141 | /* prevent overflows */ | 2157 | /* prevent overflows */ |
2142 | j &= Bletch - 1; | 2158 | j &= Bletch - 1; |
2143 | d /= bigtens[n_bigtens-1]; | 2159 | value(d) /= bigtens[n_bigtens-1]; |
2144 | ieps++; | 2160 | ieps++; |
2145 | } | 2161 | } |
2146 | for(; j; j >>= 1, i++) | 2162 | for(; j; j >>= 1, i++) |
@@ -2148,32 +2164,32 @@ __dtoa | |||
2148 | ieps++; | 2164 | ieps++; |
2149 | ds *= bigtens[i]; | 2165 | ds *= bigtens[i]; |
2150 | } | 2166 | } |
2151 | d /= ds; | 2167 | value(d) /= ds; |
2152 | } | 2168 | } |
2153 | else if (j1 = -k) { | 2169 | else if (j1 = -k) { |
2154 | d *= tens[j1 & 0xf]; | 2170 | value(d) *= tens[j1 & 0xf]; |
2155 | for(j = j1 >> 4; j; j >>= 1, i++) | 2171 | for(j = j1 >> 4; j; j >>= 1, i++) |
2156 | if (j & 1) { | 2172 | if (j & 1) { |
2157 | ieps++; | 2173 | ieps++; |
2158 | d *= bigtens[i]; | 2174 | value(d) *= bigtens[i]; |
2159 | } | 2175 | } |
2160 | } | 2176 | } |
2161 | if (k_check && d < 1. && ilim > 0) { | 2177 | if (k_check && value(d) < 1. && ilim > 0) { |
2162 | if (ilim1 <= 0) | 2178 | if (ilim1 <= 0) |
2163 | goto fast_failed; | 2179 | goto fast_failed; |
2164 | ilim = ilim1; | 2180 | ilim = ilim1; |
2165 | k--; | 2181 | k--; |
2166 | d *= 10.; | 2182 | value(d) *= 10.; |
2167 | ieps++; | 2183 | ieps++; |
2168 | } | 2184 | } |
2169 | eps = ieps*d + 7.; | 2185 | value(eps) = ieps*value(d) + 7.; |
2170 | word0(eps) -= (P-1)*Exp_msk1; | 2186 | word0(eps) -= (P-1)*Exp_msk1; |
2171 | if (ilim == 0) { | 2187 | if (ilim == 0) { |
2172 | S = mhi = 0; | 2188 | S = mhi = 0; |
2173 | d -= 5.; | 2189 | value(d) -= 5.; |
2174 | if (d > eps) | 2190 | if (value(d) > value(eps)) |
2175 | goto one_digit; | 2191 | goto one_digit; |
2176 | if (d < -eps) | 2192 | if (value(d) < -value(eps)) |
2177 | goto no_digits; | 2193 | goto no_digits; |
2178 | goto fast_failed; | 2194 | goto fast_failed; |
2179 | } | 2195 | } |
@@ -2182,33 +2198,33 @@ __dtoa | |||
2182 | /* Use Steele & White method of only | 2198 | /* Use Steele & White method of only |
2183 | * generating digits needed. | 2199 | * generating digits needed. |
2184 | */ | 2200 | */ |
2185 | eps = 0.5/tens[ilim-1] - eps; | 2201 | value(eps) = 0.5/tens[ilim-1] - value(eps); |
2186 | for(i = 0;;) { | 2202 | for(i = 0;;) { |
2187 | L = d; | 2203 | L = value(d); |
2188 | d -= L; | 2204 | value(d) -= L; |
2189 | *s++ = '0' + (int)L; | 2205 | *s++ = '0' + (int)L; |
2190 | if (d < eps) | 2206 | if (value(d) < value(eps)) |
2191 | goto ret1; | 2207 | goto ret1; |
2192 | if (1. - d < eps) | 2208 | if (1. - value(d) < value(eps)) |
2193 | goto bump_up; | 2209 | goto bump_up; |
2194 | if (++i >= ilim) | 2210 | if (++i >= ilim) |
2195 | break; | 2211 | break; |
2196 | eps *= 10.; | 2212 | value(eps) *= 10.; |
2197 | d *= 10.; | 2213 | value(d) *= 10.; |
2198 | } | 2214 | } |
2199 | } | 2215 | } |
2200 | else { | 2216 | else { |
2201 | #endif | 2217 | #endif |
2202 | /* Generate ilim digits, then fix them up. */ | 2218 | /* Generate ilim digits, then fix them up. */ |
2203 | eps *= tens[ilim-1]; | 2219 | value(eps) *= tens[ilim-1]; |
2204 | for(i = 1;; i++, d *= 10.) { | 2220 | for(i = 1;; i++, value(d) *= 10.) { |
2205 | L = d; | 2221 | L = value(d); |
2206 | d -= L; | 2222 | value(d) -= L; |
2207 | *s++ = '0' + (int)L; | 2223 | *s++ = '0' + (int)L; |
2208 | if (i == ilim) { | 2224 | if (i == ilim) { |
2209 | if (d > 0.5 + eps) | 2225 | if (value(d) > 0.5 + value(eps)) |
2210 | goto bump_up; | 2226 | goto bump_up; |
2211 | else if (d < 0.5 - eps) { | 2227 | else if (value(d) < 0.5 - value(eps)) { |
2212 | while(*--s == '0'); | 2228 | while(*--s == '0'); |
2213 | s++; | 2229 | s++; |
2214 | goto ret1; | 2230 | goto ret1; |
@@ -2221,7 +2237,7 @@ __dtoa | |||
2221 | #endif | 2237 | #endif |
2222 | fast_failed: | 2238 | fast_failed: |
2223 | s = s0; | 2239 | s = s0; |
2224 | d = d2; | 2240 | value(d) = value(d2); |
2225 | k = k0; | 2241 | k = k0; |
2226 | ilim = ilim0; | 2242 | ilim = ilim0; |
2227 | } | 2243 | } |
@@ -2233,24 +2249,24 @@ __dtoa | |||
2233 | ds = tens[k]; | 2249 | ds = tens[k]; |
2234 | if (ndigits < 0 && ilim <= 0) { | 2250 | if (ndigits < 0 && ilim <= 0) { |
2235 | S = mhi = 0; | 2251 | S = mhi = 0; |
2236 | if (ilim < 0 || d <= 5*ds) | 2252 | if (ilim < 0 || value(d) <= 5*ds) |
2237 | goto no_digits; | 2253 | goto no_digits; |
2238 | goto one_digit; | 2254 | goto one_digit; |
2239 | } | 2255 | } |
2240 | for(i = 1;; i++) { | 2256 | for(i = 1;; i++) { |
2241 | L = d / ds; | 2257 | L = value(d) / ds; |
2242 | d -= L*ds; | 2258 | value(d) -= L*ds; |
2243 | #ifdef Check_FLT_ROUNDS | 2259 | #ifdef Check_FLT_ROUNDS |
2244 | /* If FLT_ROUNDS == 2, L will usually be high by 1 */ | 2260 | /* If FLT_ROUNDS == 2, L will usually be high by 1 */ |
2245 | if (d < 0) { | 2261 | if (value(d) < 0) { |
2246 | L--; | 2262 | L--; |
2247 | d += ds; | 2263 | value(d) += ds; |
2248 | } | 2264 | } |
2249 | #endif | 2265 | #endif |
2250 | *s++ = '0' + (int)L; | 2266 | *s++ = '0' + (int)L; |
2251 | if (i == ilim) { | 2267 | if (i == ilim) { |
2252 | d += d; | 2268 | value(d) += value(d); |
2253 | if (d > ds || d == ds && L & 1) { | 2269 | if (value(d) > ds || value(d) == ds && L & 1) { |
2254 | bump_up: | 2270 | bump_up: |
2255 | while(*--s == '9') | 2271 | while(*--s == '9') |
2256 | if (s == s0) { | 2272 | if (s == s0) { |
@@ -2262,7 +2278,7 @@ __dtoa | |||
2262 | } | 2278 | } |
2263 | break; | 2279 | break; |
2264 | } | 2280 | } |
2265 | if (!(d *= 10.)) | 2281 | if (!(value(d) *= 10.)) |
2266 | break; | 2282 | break; |
2267 | } | 2283 | } |
2268 | goto ret1; | 2284 | goto ret1; |