Import various libgcc functions from syslinux.
[people/indolent/gpxe.git/.git] / src / libgcc / __udivmoddi4.c
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 }