| #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; |
| } |