diff options
author | wyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-06-03 22:58:28 +0000 |
---|---|---|
committer | wyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-06-03 22:58:28 +0000 |
commit | 1e86a6b9ca71dbf12cab2795410a0ca3f0cd5b3a (patch) | |
tree | 6b0a35e1dde62f5eb4f0825701ce617cfd91539f | |
parent | 5b22d85363ae370f92f629b5278aa7bf6bc7e58e (diff) |
Backport #2392 [ruby-core:26868]; backport of r23353 which suppresses a strict-aliasing warning in gcc-4.4.x -O2.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@28153 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | util.c | 77 | ||||
-rw-r--r-- | version.h | 10 |
3 files changed, 53 insertions, 38 deletions
@@ -1,3 +1,7 @@ +Fri Jun 4 5:57:00 2010 Kirk Haines <khaines@ruby-lang.org> + + * util.c: Backport #2392 [ruby-core:26868]; backport of r23353 which suppresses a strict-aliasing warning in gcc-4.4.x -O2. + Thu May 26 02:15:00 2010 Kirk Haines <khaines@ruby-lang.org> * signal.c: Bug #911 [ruby-core:20723]; this problem exists because Resolv::ResolvTimeout has Interrupt in its ancestry, and Interrupt, which descends from Signal, still used Signal's initialize() method, which requires an argument. Interrupt, however, should not require an argument. This is a backport of r12226 on the 1.8.7 branch, which fixed this problem. @@ -951,23 +951,25 @@ Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be define typedef union { double d; ULong L[2]; } U; #ifdef YES_ALIAS -#define dval(x) x -#ifdef IEEE_LITTLE_ENDIAN -#define word0(x) ((ULong *)&x)[1] -#define word1(x) ((ULong *)&x)[0] -#else -#define word0(x) ((ULong *)&x)[0] -#define word1(x) ((ULong *)&x)[1] -#endif -#else -#ifdef IEEE_LITTLE_ENDIAN -#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 +typedef double double_u; +# define dval(x) x +# ifdef IEEE_LITTLE_ENDIAN +# define word0(x) (((ULong *)&x)[1]) +# define word1(x) (((ULong *)&x)[0]) +# else +# define word0(x) (((ULong *)&x)[0]) +# define word1(x) (((ULong *)&x)[1]) +# endif +#else +typedef U double_u; +# ifdef IEEE_LITTLE_ENDIAN +# 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 /* The following definition of Storeinc is appropriate for MIPS processors. @@ -1697,10 +1699,11 @@ diff(Bigint *a, Bigint *b) } static double -ulp(double x) +ulp(double x_) { register Long L; - double a; + double_u x, a; + dval(x) = x_; L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; #ifndef Avoid_Underflow @@ -1738,7 +1741,7 @@ b2d(Bigint *a, int *e) { ULong *xa, *xa0, w, y, z; int k; - double d; + double_u d; #ifdef VAX ULong d0, d1; #else @@ -1799,8 +1802,9 @@ ret_d: } static Bigint * -d2b(double d, int *e, int *bits) +d2b(double d_, int *e, int *bits) { + double_u d; Bigint *b; int de, k; ULong *x, y, z; @@ -1809,6 +1813,9 @@ d2b(double d, int *e, int *bits) #endif #ifdef VAX ULong d0, d1; +#endif + dval(d) = d_; +#ifdef VAX d0 = word0(d) >> 16 | word0(d) << 16; d1 = word1(d) >> 16 | word1(d) << 16; #else @@ -1934,7 +1941,7 @@ d2b(double d, int *e, int *bits) static double ratio(Bigint *a, Bigint *b) { - double da, db; + double_u da, db; int k, ka, kb; dval(da) = b2d(a, &ka); @@ -2093,7 +2100,8 @@ ruby_strtod(const char *s00, char **se) int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, 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, adj; + double_u aadj1, rv, rv0; Long L; ULong y, z; Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; @@ -2791,14 +2799,14 @@ drop_down: } if ((aadj = ratio(delta, bs)) <= 2.) { if (dsign) - aadj = aadj1 = 1.; + aadj = dval(aadj1) = 1.; else if (word1(rv) || word0(rv) & Bndry_mask) { #ifndef Sudden_Underflow if (word1(rv) == Tiny1 && !word0(rv)) goto undfl; #endif aadj = 1.; - aadj1 = -1.; + dval(aadj1) = -1.; } else { /* special case -- power of FLT_RADIX to be */ @@ -2808,12 +2816,12 @@ drop_down: aadj = 1./FLT_RADIX; else aadj *= 0.5; - aadj1 = -aadj; + dval(aadj1) = -aadj; } } else { aadj *= 0.5; - aadj1 = dsign ? aadj : -aadj; + dval(aadj1) = dsign ? aadj : -aadj; #ifdef Check_FLT_ROUNDS switch (Rounding) { case 2: /* towards +infinity */ @@ -2825,7 +2833,7 @@ drop_down: } #else if (Flt_Rounds == 0) - aadj1 += 0.5; + dval(aadj1) += 0.5; #endif /*Check_FLT_ROUNDS*/ } y = word0(rv) & Exp_mask; @@ -2835,7 +2843,7 @@ drop_down: if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { dval(rv0) = dval(rv); word0(rv) -= P*Exp_msk1; - adj = aadj1 * ulp(dval(rv)); + adj = dval(aadj1) * ulp(dval(rv)); dval(rv) += adj; if ((word0(rv) & Exp_mask) >= Exp_msk1*(DBL_MAX_EXP+Bias-P)) { @@ -2855,11 +2863,11 @@ drop_down: if ((z = aadj) <= 0) z = 1; aadj = z; - aadj1 = dsign ? aadj : -aadj; + dval(aadj1) = dsign ? aadj : -aadj; } word0(aadj1) += (2*P+1)*Exp_msk1 - y; } - adj = aadj1 * ulp(dval(rv)); + adj = dval(aadj1) * ulp(dval(rv)); dval(rv) += adj; #else #ifdef Sudden_Underflow @@ -3170,7 +3178,7 @@ freedtoa(char *s) */ char * -dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve) +dtoa(double d_, int mode, int ndigits, int *decpt, int *sign, char **rve) { /* Arguments ndigits, decpt, sign are similar to those of ecvt and fcvt; trailing zeros are suppressed from @@ -3215,7 +3223,8 @@ dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve) ULong x; #endif Bigint *b, *b1, *delta, *mlo, *mhi, *S; - double d2, ds, eps; + double ds; + double_u d, d2, eps; char *s, *s0; #ifdef Honor_FLT_ROUNDS int rounding; @@ -3224,6 +3233,8 @@ dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve) int inexact, oldinexact; #endif + dval(d) = d_; + #ifndef MULTIPLE_THREADS if (dtoa_result) { freedtoa(dtoa_result); @@ -1,15 +1,15 @@ #define RUBY_VERSION "1.8.6" -#define RUBY_RELEASE_DATE "2010-05-27" +#define RUBY_RELEASE_DATE "2010-06-04" #define RUBY_VERSION_CODE 186 -#define RUBY_RELEASE_CODE 20100527 -#define RUBY_PATCHLEVEL 403 +#define RUBY_RELEASE_CODE 20100604 +#define RUBY_PATCHLEVEL 404 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 #define RUBY_VERSION_TEENY 6 #define RUBY_RELEASE_YEAR 2010 -#define RUBY_RELEASE_MONTH 5 -#define RUBY_RELEASE_DAY 27 +#define RUBY_RELEASE_MONTH 6 +#define RUBY_RELEASE_DAY 4 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; |