summaryrefslogtreecommitdiff
path: root/bignum.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-08-13 14:03:55 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-08-13 14:03:55 +0000
commitadaa5650cd948674e51db36b4c6af8e4304a711a (patch)
tree29f3024d166a57b31afb87fa89990b1b7192cee6 /bignum.c
parent26feae3958eff107ce0ff297981f2ed515a19f16 (diff)
* bignum.c (bigdivrem_restoring): Extracted from bigdivrem_normal.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42543 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'bignum.c')
-rw-r--r--bignum.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/bignum.c b/bignum.c
index 61f0fa42c8..b209d4059f 100644
--- a/bignum.c
+++ b/bignum.c
@@ -2697,23 +2697,11 @@ bigdivrem_single(BDIGIT *qds, const BDIGIT *xds, size_t xn, BDIGIT y)
}
static void
-bigdivrem_normal(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, BDIGIT *yds, size_t yn, int needs_mod)
+bigdivrem_restoring(BDIGIT *zds, size_t zn, size_t xn, BDIGIT *yds, size_t yn)
{
struct big_div_struct bds;
- BDIGIT q;
- int shift;
- q = yds[yn-1];
- shift = nlz(q);
- if (shift) {
- bary_small_lshift(yds, yds, yn, shift);
- zds[xn] = bary_small_lshift(zds, xds, xn, shift);
- }
- else {
- MEMCPY(zds, xds, BDIGIT, xn);
- zds[xn] = 0;
- }
- if (xn+1 < zn) zds[xn+1] = 0;
+ assert(BDIGIT_MSB(yds[yn-1]));
bds.xn = xn;
bds.yn = yn;
@@ -2735,6 +2723,27 @@ bigdivrem_normal(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, BDIGIT *y
else {
bigdivrem1(&bds);
}
+}
+
+static void
+bigdivrem_normal(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, BDIGIT *yds, size_t yn, int needs_mod)
+{
+ BDIGIT q;
+ int shift;
+
+ q = yds[yn-1];
+ shift = nlz(q);
+ if (shift) {
+ bary_small_lshift(yds, yds, yn, shift);
+ zds[xn] = bary_small_lshift(zds, xds, xn, shift);
+ }
+ else {
+ MEMCPY(zds, xds, BDIGIT, xn);
+ zds[xn] = 0;
+ }
+ if (xn+1 < zn) zds[xn+1] = 0;
+
+ bigdivrem_restoring(zds, zn, xn, yds, yn);
if (needs_mod && shift) {
bary_small_rshift(zds, zds, yn, shift, 0);