From 6df786c79fda2b174785f983ec976b158534c669 Mon Sep 17 00:00:00 2001 From: akr Date: Thu, 15 Aug 2013 16:47:08 +0000 Subject: [PATCH] * bignum.c (bigdivrem_single): Use shift when y is a power of two. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42572 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ bignum.c | 27 ++++++++++++++++++--------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4b64bcb85d..36cf4d3109 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Fri Aug 16 01:37:43 2013 Tanaka Akira + + * bignum.c (bigdivrem_single): Use shift when y is a power of two. + Fri Aug 16 01:09:33 2013 Tanaka Akira * bignum.c (bigdivrem_restoring): Use bigdivrem_single if non-topmost diff --git a/bignum.c b/bignum.c index fecd0b1953..969dde9e66 100644 --- a/bignum.c +++ b/bignum.c @@ -2683,16 +2683,25 @@ bigdivrem_num_extra_words(size_t xn, size_t yn) static BDIGIT bigdivrem_single(BDIGIT *qds, const BDIGIT *xds, size_t xn, BDIGIT y) { - size_t i; - BDIGIT_DBL t2; - t2 = 0; - i = xn; - while (i--) { - t2 = BIGUP(t2) + xds[i]; - qds[i] = (BDIGIT)(t2 / y); - t2 %= y; + assert(0 < xn); + if (POW2_P(y)) { + BDIGIT r; + r = xds[0] & (y-1); + bary_small_rshift(qds, xds, xn, bitsize(y)-1, 0); + return r; + } + else { + size_t i; + BDIGIT_DBL t2; + t2 = 0; + i = xn; + while (i--) { + t2 = BIGUP(t2) + xds[i]; + qds[i] = (BDIGIT)(t2 / y); + t2 %= y; + } + return (BDIGIT)t2; } - return (BDIGIT)t2; } static void