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