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 void
9 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 }