diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-08-15 16:16:08 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-08-15 16:16:08 +0000 |
commit | 49e8387baef9e0d750853ccc3534e5077ea26a1a (patch) | |
tree | 0eb0c340651d3c7fb8b13396c0e7a8c9c9e02346 | |
parent | 7fc4142a024ac7afa69bd851ab0c595f5c7a0519 (diff) |
* bignum.c (bigdivrem_restoring): Use bigdivrem_single if non-topmost
BDIGITs of y are zero.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42571 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | bignum.c | 10 |
2 files changed, 15 insertions, 0 deletions
@@ -1,3 +1,8 @@ +Fri Aug 16 01:09:33 2013 Tanaka Akira <akr@fsij.org> + + * bignum.c (bigdivrem_restoring): Use bigdivrem_single if non-topmost + BDIGITs of y are zero. + Fri Aug 16 00:33:12 2013 Tanaka Akira <akr@fsij.org> * bignum.c (rb_big2str1): Truncate topmost zeros of x. @@ -2704,6 +2704,16 @@ bigdivrem_restoring(BDIGIT *zds, size_t zn, BDIGIT *yds, size_t yn) assert(BDIGIT_MSB(yds[yn-1])); for (ynzero = 0; !yds[ynzero]; ynzero++); + + if (ynzero+1 == yn) { + BDIGIT r; + r = bigdivrem_single(zds+ynzero, zds+ynzero, zn-ynzero, yds[yn-1]); + assert(zds[zn-1] == 0); + MEMMOVE(zds+yn, zds+yn-1, BDIGIT, zn - yn); + zds[yn-1] = r; + return; + } + bds.yn = yn - ynzero; bds.zds = zds + ynzero; bds.yds = yds + ynzero; |