#include <klibc/diverr.h> | |
#include <stdint.h> | |
uint32_t __udivmodsi4(uint32_t num, uint32_t den, uint32_t * rem_p) | |
{ | |
uint32_t quot = 0, qbit = 1; | |
if (den == 0) { | |
__divide_error(); | |
return 0; /* If trap returns... */ | |
} | |
/* Left-justify denominator and count shift */ | |
while ((int32_t) den >= 0) { | |
den <<= 1; | |
qbit <<= 1; | |
} | |
while (qbit) { | |
if (den <= num) { | |
num -= den; | |
quot += qbit; | |
} | |
den >>= 1; | |
qbit >>= 1; | |
} | |
if (rem_p) | |
*rem_p = num; | |
return quot; | |
} |