176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h>
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanuint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t * rem_p)
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint64_t quot = 0, qbit = 1;
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (den == 0) {
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	asm volatile ("int $0");
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return 0;		/* If trap returns... */
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    /* Left-justify denominator and count shift */
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    while ((int64_t) den >= 0) {
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	den <<= 1;
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	qbit <<= 1;
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    while (qbit) {
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (den <= num) {
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    num -= den;
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    quot += qbit;
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	den >>= 1;
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	qbit >>= 1;
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (rem_p)
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	*rem_p = num;
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return quot;
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
32