| #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; |
| } |