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