1 #include <klibc/diverr.h> 2 #include <stdint.h> 3 __udivmoddi4(uint64_t num,uint64_t den,uint64_t * rem_p)4uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t * rem_p) 5 { 6 uint64_t quot = 0, qbit = 1; 7 8 if (den == 0) { 9 __divide_error(); 10 return 0; /* If trap returns... */ 11 } 12 13 /* Left-justify denominator and count shift */ 14 while ((int64_t) den >= 0) { 15 den <<= 1; 16 qbit <<= 1; 17 } 18 19 while (qbit) { 20 if (den <= num) { 21 num -= den; 22 quot += qbit; 23 } 24 den >>= 1; 25 qbit >>= 1; 26 } 27 28 if (rem_p) 29 *rem_p = num; 30 31 return quot; 32 } 33