/* See LICENSE file for copyright and license details. */ #include "common.h" uintmax_t libquanta_bigint_divmod_small__(struct bigint *big, uintmax_t small) { uintmax_t q = 0, hi, lo; int e = 8 * (int)sizeof(small); #if 0 /* this would overflow (undefined behaviour) and not fit in the result */ q = big->high / small; q <<= 8 * (int)sizeof(small); #endif big->high %= small; while (big->high && --e) { hi = small >> (8 * (int)sizeof(small) - e); lo = small << e; if (hi > big->high) continue; if (hi == big->high && lo > big->low) continue; q |= (uintmax_t)1 << e; bigint_sub_small(big, lo); big->high -= hi; } q += big->low / small; big->low %= small; return q; }