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