diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-21 15:17:09 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-21 15:17:09 +0000 |
commit | d3845ef8dbcd90303cc6066def2dee03eb770653 (patch) | |
tree | b84507bbf58ac7a1be424432d8a77676a911bb32 /bignum.c | |
parent | 5cf931d65e0fbee89b50a09e65b30207ac767884 (diff) |
* bignum.c (bary_sq_fast): Refine expressions.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42097 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'bignum.c')
-rw-r--r-- | bignum.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -1601,6 +1601,8 @@ bary_sq_fast(BDIGIT *zds, size_t zn, BDIGIT *xds, size_t xn) { size_t i, j; BDIGIT_DBL c, v, w; + BDIGIT vl; + int vh; assert(xn * 2 <= zn); @@ -1617,12 +1619,14 @@ bary_sq_fast(BDIGIT *zds, size_t zn, BDIGIT *xds, size_t xn) zds[i + i] = BIGLO(c); c = BIGDN(c); v *= 2; + vl = BIGLO(v); + vh = (int)BIGDN(v); for (j = i + 1; j < xn; j++) { w = (BDIGIT_DBL)xds[j]; - c += (BDIGIT_DBL)zds[i + j] + BIGLO(v) * w; + c += (BDIGIT_DBL)zds[i + j] + vl * w; zds[i + j] = BIGLO(c); c = BIGDN(c); - if (BIGDN(v)) + if (vh) c += w; } if (c) { @@ -1642,8 +1646,7 @@ bary_sq_fast(BDIGIT *zds, size_t zn, BDIGIT *xds, size_t xn) zds[i + i] = BIGLO(c); c = BIGDN(c); if (c) { - c += (BDIGIT_DBL)zds[i + xn]; - zds[i + xn] = BIGLO(c); + zds[i + xn] += BIGLO(c); } } |