1234567891011121314151617181920212223242526272829303132 |
- #include "libgcc.h"
-
- __libgcc uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem_p)
- {
- uint64_t quot = 0, qbit = 1;
-
- if ( den == 0 ) {
- return 1/((unsigned)den); /* Intentional divide by zero, without
- triggering a compiler warning which
- would abort the build */
- }
-
- /* Left-justify denominator and count shift */
- while ( (int64_t)den >= 0 ) {
- den <<= 1;
- qbit <<= 1;
- }
-
- while ( qbit ) {
- if ( den <= num ) {
- num -= den;
- quot += qbit;
- }
- den >>= 1;
- qbit >>= 1;
- }
-
- if ( rem_p )
- *rem_p = num;
-
- return quot;
- }
|