| // dividend / divisor, remainder is stored in rem. | |
| uint128 __udivmodti4(uint128 dividend, uint128 divisor, uint128* rem) { | |
| if (divisor > dividend) { | |
| if (rem) | |
| *rem = dividend; | |
| return 0; | |
| } | |
| // Calculate the distance between most significant bits, 128 > shift >= 0. | |
| int shift = Distance(dividend, divisor); | |
| divisor <<= shift; | |
| quotient = 0; | |
| for (; shift >= 0; --shift) { | |
| quotient <<= 1; | |
| if (dividend >= divisor) { | |
| dividend -= divisor; | |
| quotient |= 1; | |
| } | |
| divisor >>= 1; | |
| } | |
| if (rem) | |
| *rem = dividend; | |
| return quotient; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment