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