chiark / gitweb /
1c456543be0da996743a5a8b9f1ec26c14a71928
[elogind.git] / __udivmoddi4.c
1 #include <klibc/diverr.h>
2 #include <stdint.h>
3
4 uint64_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 }