* bignum.c (big_div_struct): Remove xn and j field. Add zn field.

(bigdivrem1): Follow the above change.
  (bigdivrem_restoring): Ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42545 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2013-08-13 15:21:42 +00:00
parent 26e69a89fa
commit f069f26bc2
2 changed files with 18 additions and 13 deletions

View File

@ -1,3 +1,9 @@
Wed Aug 14 00:18:39 2013 Tanaka Akira <akr@fsij.org>
* bignum.c (big_div_struct): Remove xn and j field. Add zn field.
(bigdivrem1): Follow the above change.
(bigdivrem_restoring): Ditto.
Tue Aug 13 23:38:17 2013 Tanaka Akira <akr@fsij.org> Tue Aug 13 23:38:17 2013 Tanaka Akira <akr@fsij.org>
* bignum.c (big_div_struct): ynzero field removed. * bignum.c (big_div_struct): ynzero field removed.

View File

@ -2625,7 +2625,7 @@ bary_mul(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const BDIGIT *yds
} }
struct big_div_struct { struct big_div_struct {
size_t xn, yn, j; size_t yn, zn;
BDIGIT *yds, *zds; BDIGIT *yds, *zds;
volatile VALUE stop; volatile VALUE stop;
}; };
@ -2635,33 +2635,33 @@ bigdivrem1(void *ptr)
{ {
struct big_div_struct *bds = (struct big_div_struct*)ptr; struct big_div_struct *bds = (struct big_div_struct*)ptr;
size_t yn = bds->yn; size_t yn = bds->yn;
size_t j; size_t zn = bds->zn;
BDIGIT *yds = bds->yds, *zds = bds->zds; BDIGIT *yds = bds->yds, *zds = bds->zds;
BDIGIT_DBL_SIGNED num; BDIGIT_DBL_SIGNED num;
BDIGIT q; BDIGIT q;
j = bds->j;
do { do {
if (bds->stop) { if (bds->stop) {
bds->j = j; bds->zn = zn;
return 0; return 0;
} }
if (zds[j] == yds[yn-1]) q = BDIGMAX; if (zds[zn-1] == yds[yn-1]) q = BDIGMAX;
else q = (BDIGIT)((BIGUP(zds[j]) + zds[j-1])/yds[yn-1]); else q = (BDIGIT)((BIGUP(zds[zn-1]) + zds[zn-2])/yds[yn-1]);
if (q) { if (q) {
num = bigdivrem_mulsub(zds+j-yn, yn+1, num = bigdivrem_mulsub(zds+zn-(yn+1), yn+1,
q, q,
yds, yn); yds, yn);
while (num) { /* "add back" required */ while (num) { /* "add back" required */
q--; q--;
num = bary_add(zds+j-yn, yn, num = bary_add(zds+zn-(yn+1), yn,
zds+j-yn, yn, zds+zn-(yn+1), yn,
yds, yn); yds, yn);
num--; num--;
} }
} }
zds[j] = q; zn--;
} while (--j >= yn); zds[zn] = q;
} while (zn > yn);
return 0; return 0;
} }
@ -2704,12 +2704,11 @@ bigdivrem_restoring(BDIGIT *zds, size_t zn, size_t xn, BDIGIT *yds, size_t yn)
assert(BDIGIT_MSB(yds[yn-1])); assert(BDIGIT_MSB(yds[yn-1]));
for (ynzero = 0; !yds[ynzero]; ynzero++); for (ynzero = 0; !yds[ynzero]; ynzero++);
bds.xn = xn - ynzero;
bds.yn = yn - ynzero; bds.yn = yn - ynzero;
bds.zds = zds + ynzero; bds.zds = zds + ynzero;
bds.yds = yds + ynzero; bds.yds = yds + ynzero;
bds.stop = Qfalse; bds.stop = Qfalse;
bds.j = zn - 1 - ynzero; bds.zn = zn - ynzero;
if (xn > 10000 || yn > 10000) { if (xn > 10000 || yn > 10000) {
retry: retry:
bds.stop = Qfalse; bds.stop = Qfalse;