1 --- kjs/dtoa.cpp.orig 2009-05-26 17:20:54.673539511 +0200
2 +++ kjs/dtoa.cpp 2009-05-26 17:24:20.117023777 +0200
3 @@ -207,11 +207,7 @@ typedef unsigned Long ULong;
8 -extern char *MALLOC();
10 extern void *MALLOC(size_t);
15 @@ -273,12 +269,8 @@ extern "C" {
20 -#define CONST /* blank */
26 #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
27 Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
28 @@ -286,37 +278,19 @@ Exactly one of IEEE_8087, IEEE_MC68k, VA
30 typedef union { double d; ULong L[2]; } U;
34 +#define dval(x) (x).d
36 -#define word0(x) ((ULong *)&x)[1]
37 -#define word1(x) ((ULong *)&x)[0]
38 +#define word0(x) (x).L[1]
39 +#define word1(x) (x).L[0]
41 -#define word0(x) ((ULong *)&x)[0]
42 -#define word1(x) ((ULong *)&x)[1]
46 -#define word0(x) ((U*)&x)->L[1]
47 -#define word1(x) ((U*)&x)->L[0]
49 -#define word0(x) ((U*)&x)->L[0]
50 -#define word1(x) ((U*)&x)->L[1]
52 -#define dval(x) ((U*)&x)->d
53 +#define word0(x) (x).L[0]
54 +#define word1(x) (x).L[1]
57 /* The following definition of Storeinc is appropriate for MIPS processors.
58 * An alternative that might be better on some machines is
59 - * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
61 -#if defined(IEEE_8087) + defined(VAX)
62 -#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
63 -((unsigned short *)a)[0] = (unsigned short)c, a++)
65 -#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
66 -((unsigned short *)a)[1] = (unsigned short)c, a++)
68 +#define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
70 /* #define P DBL_MANT_DIG */
71 /* Ten_pmax = floor(P*log(2)/log(5)) */
72 @@ -440,11 +414,7 @@ typedef union { double d; ULong L[2]; }
74 #define rounded_product(a,b) a = rnd_prod(a, b)
75 #define rounded_quotient(a,b) a = rnd_quot(a, b)
77 -extern double rnd_prod(), rnd_quot();
79 extern double rnd_prod(double, double), rnd_quot(double, double);
82 #define rounded_product(a,b) a *= b
83 #define rounded_quotient(a,b) a /= b
84 @@ -457,11 +427,7 @@ extern double rnd_prod(double, double),
89 -#define FFFFFFFF ((((unsigned long)0xffff)<<16)|(unsigned long)0xffff)
91 #define FFFFFFFF 0xffffffffUL
96 @@ -502,11 +468,7 @@ Bigint {
108 @@ -542,11 +504,7 @@ Balloc
119 ACQUIRE_DTOA_LOCK(0);
120 @@ -561,11 +519,7 @@ y->wds*sizeof(Long) + 2*sizeof(int))
125 - (b, m, a) Bigint *b; int m, a;
127 (Bigint *b, int m, int a) /* multiply by m and add a */
132 @@ -618,11 +572,7 @@ multadd
137 - (s, nd0, nd, y9) CONST char *s; int nd0, nd; ULong y9;
139 (CONST char *s, int nd0, int nd, ULong y9)
144 @@ -656,11 +606,7 @@ s2b
149 - (x) register ULong x;
156 @@ -690,11 +636,7 @@ hi0bits
167 register ULong x = *y;
168 @@ -738,11 +680,7 @@ lo0bits
180 @@ -754,11 +692,7 @@ i2b
185 - (a, b) Bigint *a, *b;
187 (Bigint *a, Bigint *b)
192 @@ -866,11 +800,7 @@ mult
197 - (b, k) Bigint *b; int k;
202 Bigint *b1, *p5, *p51;
204 @@ -923,11 +853,7 @@ pow5mult
209 - (b, k) Bigint *b; int k;
216 @@ -983,11 +909,7 @@ lshift
221 - (a, b) Bigint *a, *b;
223 (Bigint *a, Bigint *b)
226 ULong *xa, *xa0, *xb, *xb0;
228 @@ -1017,11 +939,7 @@ cmp
233 - (a, b) Bigint *a, *b;
235 (Bigint *a, Bigint *b)
240 @@ -1111,15 +1029,12 @@ diff
256 L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
257 #ifndef Avoid_Underflow
258 #ifndef Sudden_Underflow
259 @@ -1153,15 +1068,11 @@ ulp
264 - (a, e) Bigint *a; int *e;
269 ULong *xa, *xa0, w, y, z;
276 @@ -1223,12 +1134,9 @@ b2d
281 - (d, e, bits) double d; int *e, *bits;
283 - (double d, int *e, int *bits)
285 + (double dd, int *e, int *bits)
291 @@ -1237,6 +1145,9 @@ d2b
298 d0 = word0(d) >> 16 | word0(d) << 16;
299 d1 = word1(d) >> 16 | word1(d) << 16;
301 @@ -1361,13 +1272,9 @@ d2b
306 - (a, b) Bigint *a, *b;
308 (Bigint *a, Bigint *b)
315 dval(da) = b2d(a, &ka);
316 @@ -1453,11 +1360,7 @@ static CONST double tinytens[] = { 1e-16
321 - (sp, t) char **sp, *t;
323 (CONST char **sp, CONST char *t)
328 @@ -1475,11 +1378,7 @@ match
333 - (rvp, sp) double *rvp; CONST char **sp;
335 - (double *rvp, CONST char **sp)
337 + (U *rvp, CONST char **sp)
341 @@ -1529,11 +1428,7 @@ hexnan
346 - (s00, se) CONST char *s00; char **se;
348 (CONST char *s00, char **se)
351 #ifdef Avoid_Underflow
353 @@ -1541,7 +1436,8 @@ kjs_strtod
354 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
355 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
356 CONST char *s, *s0, *s1;
357 - double aadj, aadj1, adj, rv, rv0;
358 + double aadj, aadj1, adj;
362 Bigint *bb = NULL, *bb1 = NULL, *bd = NULL, *bd0 = NULL, *bs = NULL, *delta = NULL;
363 @@ -2302,7 +2198,9 @@ kjs_strtod
365 aadj1 = dsign ? aadj : -aadj;
367 - word0(aadj1) += (2*P+1)*Exp_msk1 - y;
368 + dval(aadj2) = aadj1;
369 + word0(aadj2) += (2*P+1)*Exp_msk1 - y;
370 + aadj1 = dval(aadj2);
372 adj = aadj1 * ulp(dval(rv));
374 @@ -2419,11 +2317,7 @@ kjs_strtod
379 - (b, S) Bigint *b, *S;
381 (Bigint *b, Bigint *S)
385 ULong *bx, *bxe, q, *sx, *sxe;
386 @@ -2540,11 +2434,7 @@ quorem
398 @@ -2563,11 +2453,7 @@ rv_alloc(int i)
403 -nrv_alloc(s, rve, n) char *s, **rve; int n;
405 nrv_alloc(CONST char *s, char **rve, int n)
410 @@ -2585,11 +2471,7 @@ nrv_alloc(CONST char *s, char **rve, int
415 -kjs_freedtoa(s) char *s;
417 kjs_freedtoa(char *s)
420 Bigint *b = (Bigint *)((int *)s - 1);
421 b->maxwds = 1 << (b->k = *(int*)b);
422 @@ -2636,12 +2518,7 @@ kjs_freedtoa(char *s)
427 - (d, mode, ndigits, decpt, sign, rve)
428 - double d; int mode, ndigits, *decpt, *sign; char **rve;
430 - (double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
432 + (double dd, int mode, int ndigits, int *decpt, int *sign, char **rve)
434 /* Arguments ndigits, decpt, sign are similar to those
435 of ecvt and fcvt; trailing zeros are suppressed from
436 @@ -2686,7 +2563,8 @@ kjs_dtoa
439 Bigint *b, *b1, *delta, *mlo = NULL, *mhi, *S;
440 - double d2, ds, eps;
444 #ifdef Honor_FLT_ROUNDS
446 @@ -2702,6 +2580,7 @@ kjs_dtoa
451 if (word0(d) & Sign_bit) {
452 /* set sign for everything, including 0's and NaNs */