aboutsummaryrefslogtreecommitdiffstats
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
parent7fc4142a024ac7afa69bd851ab0c595f5c7a0519 (diff)
downloadruby-49e8387baef9e0d750853ccc3534e5077ea26a1a.tar.gz
* 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--ChangeLog5
-rw-r--r--bignum.c10
2 files changed, 15 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 63c8147844..4b64bcb85d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
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;