Broken run-time wide divide.

The wide-divide function was broke. It generated bad results.
This commit is contained in:
Stephen Williams 2008-08-27 18:20:35 -07:00
parent bccb762e9f
commit 091a546387
1 changed files with 9 additions and 1 deletions

View File

@ -1626,7 +1626,10 @@ static unsigned long* divide_bits(unsigned long*ap, unsigned long*bp, unsigned w
unsigned cur_ptr = cur-1; unsigned cur_ptr = cur-1;
unsigned long cur_res; unsigned long cur_res;
if (ap[cur_ptr+btop] >= bp[btop]) { if (ap[cur_ptr+btop] >= bp[btop]) {
cur_res = ap[cur_ptr+btop] / bp[btop]; unsigned long high = 0;
if (cur_ptr+btop+1 < words)
high = ap[cur_ptr+btop+1];
cur_res = divide2words(ap[cur_ptr+btop], bp[btop], high);
} else if (cur_ptr+btop+1 >= words) { } else if (cur_ptr+btop+1 >= words) {
continue; continue;
@ -1749,6 +1752,9 @@ bool of_DIV_S(vthread_t thr, vvp_code_t cp)
assert(adra >= 4); assert(adra >= 4);
// Get the values, left in right, in binary form. If there is
// a problem with either (caused by an X or Z bit) then we
// know right away that the entire result is X.
unsigned long*ap = vector_to_array(thr, adra, wid); unsigned long*ap = vector_to_array(thr, adra, wid);
if (ap == 0) { if (ap == 0) {
vvp_vector4_t tmp(wid, BIT4_X); vvp_vector4_t tmp(wid, BIT4_X);
@ -1764,6 +1770,7 @@ bool of_DIV_S(vthread_t thr, vvp_code_t cp)
return true; return true;
} }
// Sign extend the bits in the array to fill out the array.
unsigned long sign_mask = 0; unsigned long sign_mask = 0;
if (unsigned long sign_bits = (words*CPU_WORD_BITS) - wid) { if (unsigned long sign_bits = (words*CPU_WORD_BITS) - wid) {
sign_mask = -1UL << (CPU_WORD_BITS-sign_bits); sign_mask = -1UL << (CPU_WORD_BITS-sign_bits);
@ -1773,6 +1780,7 @@ bool of_DIV_S(vthread_t thr, vvp_code_t cp)
bp[words-1] |= sign_mask; bp[words-1] |= sign_mask;
} }
// If the value fits in a single word, then use the native divide.
if (wid <= CPU_WORD_BITS) { if (wid <= CPU_WORD_BITS) {
if (bp[0] == 0) { if (bp[0] == 0) {
vvp_vector4_t tmp(wid, BIT4_X); vvp_vector4_t tmp(wid, BIT4_X);