From 49e8387baef9e0d750853ccc3534e5077ea26a1a Mon Sep 17 00:00:00 2001 From: akr Date: Thu, 15 Aug 2013 16:16:08 +0000 Subject: [PATCH] * 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 --- ChangeLog | 5 +++++ bignum.c | 10 ++++++++++ 2 files changed, 15 insertions(+) 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 + + * bignum.c (bigdivrem_restoring): Use bigdivrem_single if non-topmost + BDIGITs of y are zero. + Fri Aug 16 00:33:12 2013 Tanaka Akira * 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;