From d3845ef8dbcd90303cc6066def2dee03eb770653 Mon Sep 17 00:00:00 2001 From: akr Date: Sun, 21 Jul 2013 15:17:09 +0000 Subject: [PATCH] * bignum.c (bary_sq_fast): Refine expressions. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42097 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ bignum.c | 11 +++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 126ffba954..a46cd90364 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Mon Jul 22 00:15:20 2013 Tanaka Akira + + * bignum.c (bary_sq_fast): Refine expressions. + Sun Jul 21 21:08:59 2013 Tanaka Akira * bignum.c (bary_mul): Use simple multiplication if yl is small. 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); } }