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