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