chiark / gitweb /
[PATCH] added vsyslog support to klibc.
[elogind.git] / klibc / klibc / libgcc / __udivmodsi4.c
1 #include <klibc/diverr.h>
2 #include <stdint.h>
3
4 uint32_t __udivmodsi4(uint32_t num, uint32_t den, uint32_t *rem_p)
5 {
6   uint32_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 ( (int32_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 }