mirror of
https://github.com/0intro/conterm
synced 2024-11-24 22:59:36 +03:00
44 lines
732 B
C
44 lines
732 B
C
#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;
|
|
}
|