still debugging division
This commit is contained in:
parent
e7ccbc36b4
commit
48c1ea7c92
@ -1871,12 +1871,12 @@ static moo_oow_t nlz (moo_liw_t x)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void divide_unsigned_array3 (moo_t* moo, const moo_liw_t* x, moo_oow_t xs, const moo_liw_t* y, moo_oow_t ys, moo_liw_t* q, moo_liw_t* r)
|
static void divide_unsigned_array3 (moo_t* moo, const moo_liw_t* x, moo_oow_t xs, const moo_liw_t* y, moo_oow_t ys, moo_liw_t* q, moo_liw_t* r)
|
||||||
{
|
{
|
||||||
moo_oow_t i, j, s;
|
moo_oow_t i, j, s;
|
||||||
moo_lidw_t dw, qhat, rhat;
|
moo_lidw_t dw, qhat, rhat, b;
|
||||||
moo_lidi_t t, k;
|
moo_lidi_t t, k;
|
||||||
|
moo_liw_t* qq;
|
||||||
|
|
||||||
/* the caller must ensure:
|
/* the caller must ensure:
|
||||||
* - q can hold 'xs + 1' words and r can hold 'ys' words.
|
* - q can hold 'xs + 1' words and r can hold 'ys' words.
|
||||||
@ -1899,6 +1899,32 @@ static void divide_unsigned_array3 (moo_t* moo, const moo_liw_t* x, moo_oow_t xs
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (moo->inttostr.t.capa <= xs)
|
||||||
|
{
|
||||||
|
moo_liw_t* t;
|
||||||
|
moo_oow_t reqcapa;
|
||||||
|
|
||||||
|
reqcapa = MOO_ALIGN_POW2(xs + 1, 32);
|
||||||
|
t = (moo_liw_t*)moo_reallocmem(moo, moo->inttostr.t.ptr, reqcapa * MOO_SIZEOF(*t));
|
||||||
|
//if (!t) return -1; // TOOD:
|
||||||
|
|
||||||
|
moo->inttostr.t.capa = xs + 1;
|
||||||
|
moo->inttostr.t.ptr = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
b = (moo_lidw_t)MOO_TYPE_MAX(moo_liw_t) + 1;
|
||||||
|
qq = moo->inttostr.t.ptr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
printf ("------------------\n");
|
||||||
|
printf ("unsigned u[] = {");
|
||||||
|
for (i = 0; i < xs; i++ ) printf ("0x%llx, ", (unsigned long long)x[i]);
|
||||||
|
printf ("};\n");
|
||||||
|
printf ("unsigned v[] = {");
|
||||||
|
for (i = 0; i < ys; i++) printf ("0x%llx, ", (unsigned long long)y[i]);
|
||||||
|
printf ("};\n"); */
|
||||||
|
//for (i = 0; i <= xs; i++) printf ("un %llx\n", (unsigned long long)q[i]);
|
||||||
|
|
||||||
s = nlz(y[ys - 1]);
|
s = nlz(y[ys - 1]);
|
||||||
for (i = ys; i > 1; )
|
for (i = ys; i > 1; )
|
||||||
{
|
{
|
||||||
@ -1908,41 +1934,44 @@ static void divide_unsigned_array3 (moo_t* moo, const moo_liw_t* x, moo_oow_t xs
|
|||||||
r[0] = y[0] << s;
|
r[0] = y[0] << s;
|
||||||
|
|
||||||
|
|
||||||
q[xs] = (moo_lidw_t)x[xs - 1] >> (MOO_LIW_BITS - s);
|
qq[xs] = (moo_lidw_t)x[xs - 1] >> (MOO_LIW_BITS - s);
|
||||||
for (i = xs; i > 1; )
|
for (i = xs; i > 1; )
|
||||||
{
|
{
|
||||||
--i;
|
--i;
|
||||||
q[i] = (x[i] << s) | ((moo_lidw_t)x[i - 1] >> (MOO_LIW_BITS - s));
|
qq[i] = (x[i] << s) | ((moo_lidw_t)x[i - 1] >> (MOO_LIW_BITS - s));
|
||||||
}
|
}
|
||||||
q[0] = x[0] << s;
|
qq[0] = x[0] << s;
|
||||||
|
|
||||||
|
|
||||||
|
//for (i = 0; i < ys; i++) printf ("vn %llx\n", (unsigned long long)r[i]);
|
||||||
|
//for (i = 0; i <= xs; i++) printf ("un %llx\n", (unsigned long long)qq[i]);
|
||||||
|
|
||||||
for (j = xs - ys + 1; j > 0; )
|
for (j = xs - ys + 1; j > 0; )
|
||||||
{
|
{
|
||||||
--j;
|
--j;
|
||||||
|
|
||||||
//dw = ((moo_lidw_t)q[j + ys] << MOO_LIW_BITS) + q[j + ys - 1];
|
dw = (moo_lidw_t)qq[j + ys] * b + qq[j + ys - 1];
|
||||||
dw = ((moo_lidw_t)q[j + ys] * MOO_TYPE_MAX(moo_liw_t)) + q[j + ys - 1];
|
|
||||||
qhat = dw / r[ys - 1];
|
qhat = dw / r[ys - 1];
|
||||||
rhat = dw - (qhat * r[ys - 1]);
|
rhat = dw - (qhat * r[ys - 1]);
|
||||||
|
|
||||||
|
//printf ("qhat == %llx rhat == %llx dw = %llx r[ys-1] = %llx /// %llx %llx\n", (unsigned long long)qhat, (unsigned long long)rhat, (unsigned long long)dw, (unsigned long long)r[ys-1], (unsigned long long)qq[j + ys], (unsigned long long)qq[j + ys - 1]);
|
||||||
again:
|
again:
|
||||||
//if (qhat >= MOO_TYPE_MAX(moo_liw_t) || (qhat * r[ys - 2]) > ((rhat << MOO_LIW_BITS) + q[j + ys - 2]))
|
if (qhat >= b || (qhat * r[ys - 2]) > (rhat * b + qq[j + ys - 2]))
|
||||||
if (qhat >= MOO_TYPE_MAX(moo_liw_t) || (qhat * r[ys - 2]) > (rhat * MOO_TYPE_MAX(moo_liw_t) + q[j + ys - 2]))
|
|
||||||
{
|
{
|
||||||
qhat = qhat - 1;
|
qhat = qhat - 1;
|
||||||
rhat = rhat + r[ys - 1];
|
rhat = rhat + r[ys - 1];
|
||||||
if (rhat < MOO_TYPE_MAX(moo_liw_t)) goto again;
|
if (rhat < b) goto again;
|
||||||
}
|
}
|
||||||
|
//printf ("qhat == %llx rhat == %llx\n", (unsigned long long)qhat, (unsigned long long)rhat);
|
||||||
for (k = 0, i = 0; i < ys; i++)
|
for (k = 0, i = 0; i < ys; i++)
|
||||||
{
|
{
|
||||||
dw = qhat * r[i];
|
dw = qhat * r[i];
|
||||||
t = q[j + i] - k - (dw & MOO_TYPE_MAX(moo_liw_t));
|
t = qq[j + i] - k - (dw & MOO_TYPE_MAX(moo_liw_t));
|
||||||
q[j + i] = t;
|
qq[j + i] = t;
|
||||||
k = (dw >> MOO_LIW_BITS) - (t >> MOO_LIW_BITS);
|
k = (dw >> MOO_LIW_BITS) - (t >> MOO_LIW_BITS);
|
||||||
}
|
}
|
||||||
t = q[j + ys] - k;
|
t = qq[j + ys] - k;
|
||||||
q[j + ys] = t;
|
qq[j + ys] = t;
|
||||||
|
|
||||||
q[j] = qhat;
|
q[j] = qhat;
|
||||||
if (t < 0)
|
if (t < 0)
|
||||||
@ -1950,23 +1979,29 @@ static void divide_unsigned_array3 (moo_t* moo, const moo_liw_t* x, moo_oow_t xs
|
|||||||
q[j] = q[j] - 1;
|
q[j] = q[j] - 1;
|
||||||
for (k = 0, i = 0; i < ys; i++)
|
for (k = 0, i = 0; i < ys; i++)
|
||||||
{
|
{
|
||||||
t = (moo_lidw_t)q[j + i] + r[i] + k;
|
t = (moo_lidw_t)qq[j + i] + r[i] + k;
|
||||||
q[j + i] = t;
|
qq[j + i] = t;
|
||||||
k = t >> MOO_LIW_BITS;
|
k = t >> MOO_LIW_BITS;
|
||||||
}
|
}
|
||||||
q[j + ys] += k;
|
qq[j + ys] += k;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < ys - 1; i++)
|
for (i = 0; i < ys - 1; i++)
|
||||||
{
|
{
|
||||||
r[i] = (r[i] >> s) | ((moo_lidw_t)q[i + 1] << (MOO_LIW_BITS - s));
|
r[i] = (qq[i] >> s) | ((moo_lidw_t)qq[i + 1] << (MOO_LIW_BITS - s));
|
||||||
}
|
}
|
||||||
r[i] = r[i] >> s;
|
r[i] = qq[i] >> s;
|
||||||
|
|
||||||
//for (j = (xs == ys)? 1: (xs - ys + 1); j < xs; j++) q[i] = 0;
|
//for (i = (xs == ys)? 1: (xs - ys + 1); i < xs; i++) q[i] = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
printf ("q => ");
|
||||||
for (i = xs ; i > 0; ) printf ("%08x ", q[--i]);
|
for (i = xs ; i > 0; ) printf ("%08x ", q[--i]);
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
|
printf ("r => ");
|
||||||
|
for (i = ys ; i > 0; ) printf ("%08x ", r[--i]);
|
||||||
|
printf ("\n"); */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user