summaryrefslogtreecommitdiff
path: root/bignum.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-21 15:17:09 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-21 15:17:09 +0000
commitd3845ef8dbcd90303cc6066def2dee03eb770653 (patch)
treeb84507bbf58ac7a1be424432d8a77676a911bb32 /bignum.c
parent5cf931d65e0fbee89b50a09e65b30207ac767884 (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.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/bignum.c b/bignum.c
index 16186f6c85..75de8941a4 100644
--- a/bignum.c
+++ b/bignum.c
@@ -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);
}
}