#include "os.h" | |
#include <mp.h> | |
#include "dat.h" | |
/* */ | |
/* divide two digits by one and return quotient */ | |
/* */ | |
void | |
mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient) | |
{ | |
mpdigit hi, lo, q, x, y; | |
int i; | |
hi = dividend[1]; | |
lo = dividend[0]; | |
/* return highest digit value if the result >= 2**32 */ | |
if(hi >= divisor || divisor == 0){ | |
divisor = 0; | |
*quotient = ~divisor; | |
return; | |
} | |
/* at this point we know that hi < divisor */ | |
/* just shift and subtract till we're done */ | |
q = 0; | |
x = divisor; | |
for(i = Dbits-1; hi > 0 && i >= 0; i--){ | |
x >>= 1; | |
if(x > hi) | |
continue; | |
y = divisor<<i; | |
if(x == hi && y > lo) | |
continue; | |
if(y > lo) | |
hi--; | |
lo -= y; | |
hi -= x; | |
q |= 1<<i; | |
} | |
q += lo/divisor; | |
*quotient = q; | |
} |