1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* bignum.c (bary_sq_fast): Refine expressions.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42097 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2013-07-21 15:17:09 +00:00
parent 5cf931d65e
commit d3845ef8db
2 changed files with 11 additions and 4 deletions

View file

@ -1,3 +1,7 @@
Mon Jul 22 00:15:20 2013 Tanaka Akira <akr@fsij.org>
* bignum.c (bary_sq_fast): Refine expressions.
Sun Jul 21 21:08:59 2013 Tanaka Akira <akr@fsij.org>
* bignum.c (bary_mul): Use simple multiplication if yl is small.

View file

@ -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);
}
}