Commit bce9cb11 authored by vegorov@chromium.org's avatar vegorov@chromium.org

Fix strict aliasing rule violations in dtoa.c.

Review URL: http://codereview.chromium.org/3172008

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5251 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 7e167a95
...@@ -238,7 +238,7 @@ bool POSIXSocket::Bind(const int port) { ...@@ -238,7 +238,7 @@ bool POSIXSocket::Bind(const int port) {
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addr.sin_port = htons(port); addr.sin_port = htons(port);
int status = bind(socket_, int status = bind(socket_,
reinterpret_cast<struct sockaddr *>(&addr), BitCast<struct sockaddr *>(&addr),
sizeof(addr)); sizeof(addr));
return status == 0; return status == 0;
} }
......
...@@ -270,25 +270,14 @@ Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. ...@@ -270,25 +270,14 @@ Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
typedef union { double d; ULong L[2]; } U; typedef union { double d; ULong L[2]; } U;
#ifdef YES_ALIAS
#define dval(x) x
#ifdef IEEE_8087 #ifdef IEEE_8087
#define word0(x) ((ULong *)&x)[1] #define word0(x) (x).L[1]
#define word1(x) ((ULong *)&x)[0] #define word1(x) (x).L[0]
#else #else
#define word0(x) ((ULong *)&x)[0] #define word0(x) (x).L[0]
#define word1(x) ((ULong *)&x)[1] #define word1(x) (x).L[1]
#endif
#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
#endif #endif
#define dval(x) (x).d
/* The following definition of Storeinc is appropriate for MIPS processors. /* The following definition of Storeinc is appropriate for MIPS processors.
* An alternative that might be better on some machines is * An alternative that might be better on some machines is
...@@ -1108,13 +1097,15 @@ diff ...@@ -1108,13 +1097,15 @@ diff
static double static double
ulp ulp
#ifdef KR_headers #ifdef KR_headers
(x) double x; (dx) double dx;
#else #else
(double x) (double dx)
#endif #endif
{ {
register Long L; register Long L;
double a; U x, a;
dval(x) = dx;
L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
#ifndef Avoid_Underflow #ifndef Avoid_Underflow
...@@ -1157,7 +1148,7 @@ b2d ...@@ -1157,7 +1148,7 @@ b2d
{ {
ULong *xa, *xa0, w, y, z; ULong *xa, *xa0, w, y, z;
int k; int k;
double d; U d;
#ifdef VAX #ifdef VAX
ULong d0, d1; ULong d0, d1;
#else #else
...@@ -1220,9 +1211,9 @@ b2d ...@@ -1220,9 +1211,9 @@ b2d
static Bigint * static Bigint *
d2b d2b
#ifdef KR_headers #ifdef KR_headers
(d, e, bits) double d; int *e, *bits; (dd, e, bits) double dd; int *e, *bits;
#else #else
(double d, int *e, int *bits) (double dd, int *e, int *bits)
#endif #endif
{ {
Bigint *b; Bigint *b;
...@@ -1236,6 +1227,8 @@ d2b ...@@ -1236,6 +1227,8 @@ d2b
d0 = word0(d) >> 16 | word0(d) << 16; d0 = word0(d) >> 16 | word0(d) << 16;
d1 = word1(d) >> 16 | word1(d) << 16; d1 = word1(d) >> 16 | word1(d) << 16;
#else #else
U d;
dval(d) = dd;
#define d0 word0(d) #define d0 word0(d)
#define d1 word1(d) #define d1 word1(d)
#endif #endif
...@@ -1368,7 +1361,7 @@ ratio ...@@ -1368,7 +1361,7 @@ ratio
(Bigint *a, Bigint *b) (Bigint *a, Bigint *b)
#endif #endif
{ {
double da, db; U da, db;
int k, ka, kb; int k, ka, kb;
dval(da) = b2d(a, &ka); dval(da) = b2d(a, &ka);
...@@ -1542,7 +1535,8 @@ strtod ...@@ -1542,7 +1535,8 @@ strtod
int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
CONST char *s, *s0, *s1; CONST char *s, *s0, *s1;
double aadj, aadj1, adj, rv, rv0; double aadj;
U aadj1, adj, rv, rv0;
Long L; Long L;
ULong y, z; ULong y, z;
Bigint *bb = NULL, *bb1, *bd = NULL, *bd0, *bs = NULL, *delta = NULL; Bigint *bb = NULL, *bb1, *bd = NULL, *bd0, *bs = NULL, *delta = NULL;
...@@ -2042,12 +2036,12 @@ strtod ...@@ -2042,12 +2036,12 @@ strtod
} }
if (rounding) { if (rounding) {
if (dsign) { if (dsign) {
adj = 1.; dval(adj) = 1.;
goto apply_adj; goto apply_adj;
} }
} }
else if (!dsign) { else if (!dsign) {
adj = -1.; dval(adj) = -1.;
if (!word1(rv) if (!word1(rv)
&& !(word0(rv) & Frac_mask)) { && !(word0(rv) & Frac_mask)) {
y = word0(rv) & Exp_mask; y = word0(rv) & Exp_mask;
...@@ -2059,7 +2053,7 @@ strtod ...@@ -2059,7 +2053,7 @@ strtod
{ {
delta = lshift(delta,Log2P); delta = lshift(delta,Log2P);
if (cmp(delta, bs) <= 0) if (cmp(delta, bs) <= 0)
adj = -0.5; dval(adj) = -0.5;
} }
} }
apply_adj: apply_adj:
...@@ -2072,26 +2066,26 @@ strtod ...@@ -2072,26 +2066,26 @@ strtod
if ((word0(rv) & Exp_mask) <= if ((word0(rv) & Exp_mask) <=
P*Exp_msk1) { P*Exp_msk1) {
word0(rv) += P*Exp_msk1; word0(rv) += P*Exp_msk1;
dval(rv) += adj*ulp(dval(rv)); dval(rv) += dval(adj)*ulp(dval(rv));
word0(rv) -= P*Exp_msk1; word0(rv) -= P*Exp_msk1;
} }
else else
#endif /*Sudden_Underflow*/ #endif /*Sudden_Underflow*/
#endif /*Avoid_Underflow*/ #endif /*Avoid_Underflow*/
dval(rv) += adj*ulp(dval(rv)); dval(rv) += dval(adj)*ulp(dval(rv));
} }
break; break;
} }
adj = ratio(delta, bs); dval(adj) = ratio(delta, bs);
if (adj < 1.) if (dval(adj) < 1.)
adj = 1.; dval(adj) = 1.;
if (adj <= 0x7ffffffe) { if (dval(adj) <= 0x7ffffffe) {
/* adj = rounding ? ceil(adj) : floor(adj); */ /* adj = rounding ? ceil(adj) : floor(adj); */
y = adj; y = dval(adj);
if (y != adj) { if (y != dval(adj)) {
if (!((rounding>>1) ^ dsign)) if (!((rounding>>1) ^ dsign))
y++; y++;
adj = y; dval(adj) = y;
} }
} }
#ifdef Avoid_Underflow #ifdef Avoid_Underflow
...@@ -2101,21 +2095,21 @@ strtod ...@@ -2101,21 +2095,21 @@ strtod
#ifdef Sudden_Underflow #ifdef Sudden_Underflow
if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
word0(rv) += P*Exp_msk1; word0(rv) += P*Exp_msk1;
adj *= ulp(dval(rv)); dval(adj) *= ulp(dval(rv));
if (dsign) if (dsign)
dval(rv) += adj; dval(rv) += dval(adj);
else else
dval(rv) -= adj; dval(rv) -= dval(adj);
word0(rv) -= P*Exp_msk1; word0(rv) -= P*Exp_msk1;
goto cont; goto cont;
} }
#endif /*Sudden_Underflow*/ #endif /*Sudden_Underflow*/
#endif /*Avoid_Underflow*/ #endif /*Avoid_Underflow*/
adj *= ulp(dval(rv)); dval(adj) *= ulp(dval(rv));
if (dsign) if (dsign)
dval(rv) += adj; dval(rv) += dval(adj);
else else
dval(rv) -= adj; dval(rv) -= dval(adj);
goto cont; goto cont;
} }
#endif /*Honor_FLT_ROUNDS*/ #endif /*Honor_FLT_ROUNDS*/
...@@ -2237,14 +2231,14 @@ strtod ...@@ -2237,14 +2231,14 @@ strtod
} }
if ((aadj = ratio(delta, bs)) <= 2.) { if ((aadj = ratio(delta, bs)) <= 2.) {
if (dsign) if (dsign)
aadj = aadj1 = 1.; aadj = dval(aadj1) = 1.;
else if (word1(rv) || word0(rv) & Bndry_mask) { else if (word1(rv) || word0(rv) & Bndry_mask) {
#ifndef Sudden_Underflow #ifndef Sudden_Underflow
if (word1(rv) == Tiny1 && !word0(rv)) if (word1(rv) == Tiny1 && !word0(rv))
goto undfl; goto undfl;
#endif #endif
aadj = 1.; aadj = 1.;
aadj1 = -1.; dval(aadj1) = -1.;
} }
else { else {
/* special case -- power of FLT_RADIX to be */ /* special case -- power of FLT_RADIX to be */
...@@ -2254,24 +2248,24 @@ strtod ...@@ -2254,24 +2248,24 @@ strtod
aadj = 1./FLT_RADIX; aadj = 1./FLT_RADIX;
else else
aadj *= 0.5; aadj *= 0.5;
aadj1 = -aadj; dval(aadj1) = -aadj;
} }
} }
else { else {
aadj *= 0.5; aadj *= 0.5;
aadj1 = dsign ? aadj : -aadj; dval(aadj1) = dsign ? aadj : -aadj;
#ifdef Check_FLT_ROUNDS #ifdef Check_FLT_ROUNDS
switch(Rounding) { switch(Rounding) {
case 2: /* towards +infinity */ case 2: /* towards +infinity */
aadj1 -= 0.5; dval(aadj1) -= 0.5;
break; break;
case 0: /* towards 0 */ case 0: /* towards 0 */
case 3: /* towards -infinity */ case 3: /* towards -infinity */
aadj1 += 0.5; dval(aadj1) += 0.5;
} }
#else #else
if (Flt_Rounds == 0) if (Flt_Rounds == 0)
aadj1 += 0.5; dval(aadj1) += 0.5;
#endif /*Check_FLT_ROUNDS*/ #endif /*Check_FLT_ROUNDS*/
} }
y = word0(rv) & Exp_mask; y = word0(rv) & Exp_mask;
...@@ -2281,8 +2275,8 @@ strtod ...@@ -2281,8 +2275,8 @@ strtod
if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
dval(rv0) = dval(rv); dval(rv0) = dval(rv);
word0(rv) -= P*Exp_msk1; word0(rv) -= P*Exp_msk1;
adj = aadj1 * ulp(dval(rv)); dval(adj) = dval(aadj1) * ulp(dval(rv));
dval(rv) += adj; dval(rv) += dval(adj);
if ((word0(rv) & Exp_mask) >= if ((word0(rv) & Exp_mask) >=
Exp_msk1*(DBL_MAX_EXP+Bias-P)) { Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
if (word0(rv0) == Big0 && word1(rv0) == Big1) if (word0(rv0) == Big0 && word1(rv0) == Big1)
...@@ -2301,19 +2295,19 @@ strtod ...@@ -2301,19 +2295,19 @@ strtod
if ((z = aadj) <= 0) if ((z = aadj) <= 0)
z = 1; z = 1;
aadj = z; aadj = z;
aadj1 = dsign ? aadj : -aadj; dval(aadj1) = dsign ? aadj : -aadj;
} }
word0(aadj1) += (2*P+1)*Exp_msk1 - y; word0(aadj1) += (2*P+1)*Exp_msk1 - y;
} }
adj = aadj1 * ulp(dval(rv)); dval(adj) = dval(aadj1) * ulp(dval(rv));
dval(rv) += adj; dval(rv) += dval(adj);
#else #else
#ifdef Sudden_Underflow #ifdef Sudden_Underflow
if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
dval(rv0) = dval(rv); dval(rv0) = dval(rv);
word0(rv) += P*Exp_msk1; word0(rv) += P*Exp_msk1;
adj = aadj1 * ulp(dval(rv)); dval(adj) = dval(aadj1) * ulp(dval(rv));
dval(rv) += adj; dval(rv) += dval(adj);
#ifdef IBM #ifdef IBM
if ((word0(rv) & Exp_mask) < P*Exp_msk1) if ((word0(rv) & Exp_mask) < P*Exp_msk1)
#else #else
...@@ -2331,8 +2325,8 @@ strtod ...@@ -2331,8 +2325,8 @@ strtod
word0(rv) -= P*Exp_msk1; word0(rv) -= P*Exp_msk1;
} }
else { else {
adj = aadj1 * ulp(dval(rv)); dval(adj) = dval(aadj1) * ulp(dval(rv));
dval(rv) += adj; dval(rv) += dval(adj);
} }
#else /*Sudden_Underflow*/ #else /*Sudden_Underflow*/
/* Compute adj so that the IEEE rounding rules will /* Compute adj so that the IEEE rounding rules will
...@@ -2343,12 +2337,12 @@ strtod ...@@ -2343,12 +2337,12 @@ strtod
* example: 1.2e-307 . * example: 1.2e-307 .
*/ */
if (y <= (P-1)*Exp_msk1 && aadj > 1.) { if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
aadj1 = (double)(int)(aadj + 0.5); dval(aadj1) = (double)(int)(aadj + 0.5);
if (!dsign) if (!dsign)
aadj1 = -aadj1; dval(aadj1) = -dval(aadj1);
} }
adj = aadj1 * ulp(dval(rv)); dval(adj) = dval(aadj1) * ulp(dval(rv));
dval(rv) += adj; dval(rv) += dval(adj);
#endif /*Sudden_Underflow*/ #endif /*Sudden_Underflow*/
#endif /*Avoid_Underflow*/ #endif /*Avoid_Underflow*/
} }
...@@ -2638,10 +2632,10 @@ freedtoa(char *s) ...@@ -2638,10 +2632,10 @@ freedtoa(char *s)
char * char *
dtoa dtoa
#ifdef KR_headers #ifdef KR_headers
(d, mode, ndigits, decpt, sign, rve) (dd, mode, ndigits, decpt, sign, rve)
double d; int mode, ndigits, *decpt, *sign; char **rve; double dd; int mode, ndigits, *decpt, *sign; char **rve;
#else #else
(double d, int mode, int ndigits, int *decpt, int *sign, char **rve) (double dd, int mode, int ndigits, int *decpt, int *sign, char **rve)
#endif #endif
{ {
/* Arguments ndigits, decpt, sign are similar to those /* Arguments ndigits, decpt, sign are similar to those
...@@ -2687,7 +2681,8 @@ dtoa ...@@ -2687,7 +2681,8 @@ dtoa
ULong x; ULong x;
#endif #endif
Bigint *b, *b1, *delta, *mlo, *mhi, *S; Bigint *b, *b1, *delta, *mlo, *mhi, *S;
double d2, ds, eps; double ds;
U d2, eps;
char *s, *s0; char *s, *s0;
#ifdef Honor_FLT_ROUNDS #ifdef Honor_FLT_ROUNDS
int rounding; int rounding;
...@@ -2695,6 +2690,8 @@ dtoa ...@@ -2695,6 +2690,8 @@ dtoa
#ifdef SET_INEXACT #ifdef SET_INEXACT
int inexact, oldinexact; int inexact, oldinexact;
#endif #endif
U d;
dval(d) = dd;
/* In mode 2 and 3 we bias rounding up when there are ties. */ /* In mode 2 and 3 we bias rounding up when there are ties. */
bias_round_up = mode == 2 || mode == 3; bias_round_up = mode == 2 || mode == 3;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment