From 9f6c62ad5f09ec1782442ec499cfd2a9962a3d2c Mon Sep 17 00:00:00 2001 From: akr Date: Fri, 16 Aug 2013 00:19:51 +0000 Subject: [PATCH] * bignum.c (bary_small_rshift): Specify the higher BDIGIT instead of sign bit. (big_shift3): Follow the above change. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42575 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ bignum.c | 8 +++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4c5c860752..f498596754 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Aug 16 09:17:00 2013 Tanaka Akira + + * bignum.c (bary_small_rshift): Specify the higher BDIGIT instead of + sign bit. + (big_shift3): Follow the above change. + Fri Aug 16 02:20:39 2013 Tanaka Akira * bignum.c (bary_mul_toom3): Reduce a branch. diff --git a/bignum.c b/bignum.c index 73c7d33198..92b5b0b773 100644 --- a/bignum.c +++ b/bignum.c @@ -567,16 +567,14 @@ bary_small_lshift(BDIGIT *zds, const BDIGIT *xds, size_t n, int shift) } static void -bary_small_rshift(BDIGIT *zds, const BDIGIT *xds, size_t n, int shift, int sign_bit) +bary_small_rshift(BDIGIT *zds, const BDIGIT *xds, size_t n, int shift, BDIGIT higher_bdigit) { BDIGIT_DBL num = 0; BDIGIT x; assert(0 <= shift && shift < BITSPERDIG); - if (sign_bit) { - num = (~(BDIGIT_DBL)0) << BITSPERDIG; - } + num = BIGUP(higher_bdigit); while (n--) { num = (num | xds[n]) >> shift; x = xds[n]; @@ -4120,7 +4118,7 @@ big_shift3(VALUE x, int lshift_p, size_t shift_numdigits, int shift_numbits) zn = xn - s1; z = bignew(zn, 0); zds = BDIGITS(z); - bary_small_rshift(zds, xds+s1, zn, s2, hibitsx != 0); + bary_small_rshift(zds, xds+s1, zn, s2, hibitsx != 0 ? BDIGMAX : 0); twocomp2abs_bang(z, hibitsx != 0); } RB_GC_GUARD(x);