chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blob
commit
grep
author
committer
pickaxe
?
search:
re
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
}