1 b3f61791 2004-03-21 devnull #include "os.h"
2 b3f61791 2004-03-21 devnull #include <mp.h>
3 b3f61791 2004-03-21 devnull #include "dat.h"
6 b3f61791 2004-03-21 devnull // divide two digits by one and return quotient
9 b3f61791 2004-03-21 devnull mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient)
11 b3f61791 2004-03-21 devnull mpdigit hi, lo, q, x, y;
14 b3f61791 2004-03-21 devnull hi = dividend[1];
15 b3f61791 2004-03-21 devnull lo = dividend[0];
17 b3f61791 2004-03-21 devnull // return highest digit value if the result >= 2**32
18 b3f61791 2004-03-21 devnull if(hi >= divisor || divisor == 0){
19 b3f61791 2004-03-21 devnull divisor = 0;
20 b3f61791 2004-03-21 devnull *quotient = ~divisor;
24 b3f61791 2004-03-21 devnull // at this point we know that hi < divisor
25 b3f61791 2004-03-21 devnull // just shift and subtract till we're done
27 b3f61791 2004-03-21 devnull x = divisor;
28 b3f61791 2004-03-21 devnull for(i = Dbits-1; hi > 0 && i >= 0; i--){
30 b3f61791 2004-03-21 devnull if(x > hi)
31 b3f61791 2004-03-21 devnull continue;
32 b3f61791 2004-03-21 devnull y = divisor<<i;
33 b3f61791 2004-03-21 devnull if(x == hi && y > lo)
34 b3f61791 2004-03-21 devnull continue;
35 b3f61791 2004-03-21 devnull if(y > lo)
39 b3f61791 2004-03-21 devnull q |= 1<<i;
41 b3f61791 2004-03-21 devnull q += lo/divisor;
42 b3f61791 2004-03-21 devnull *quotient = q;