1 #include "libgcc.h" 2 3 __libgcc 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 return 1/((unsigned)den); /* Intentional divide by zero, without 9 triggering a compiler warning which 10 would abort the build */ 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