1 #include "libgcc.h"
2 
__udivmoddi4(uint64_t num,uint64_t den,uint64_t * rem_p)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