summaryrefslogtreecommitdiff
path: root/bignum.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-08-15 16:16:08 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-08-15 16:16:08 +0000
commit49e8387baef9e0d750853ccc3534e5077ea26a1a (patch)
tree0eb0c340651d3c7fb8b13396c0e7a8c9c9e02346 /bignum.c
parent7fc4142a024ac7afa69bd851ab0c595f5c7a0519 (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
Diffstat (limited to 'bignum.c')
-rw-r--r--bignum.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/bignum.c b/bignum.c
index 0bdae81573..fecd0b1953 100644
--- a/bignum.c
+++ b/bignum.c
@@ -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;