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 }