1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #include "libgcc.h" 4 __udivmoddi4(uint64_t num,uint64_t den,uint64_t * rem_p)5uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem_p) 6 { 7 uint64_t quot = 0, qbit = 1; 8 if (den == 0) { 9 return 1 / ((unsigned int)den); /* Intentional divide by zero, without 10 triggering a compiler warning which 11 would abort the build */ 12 } 13 14 /* Left-justify denominator and count shift */ 15 while ((int64_t)den >= 0) { 16 den <<= 1; 17 qbit <<= 1; 18 } 19 20 while (qbit) { 21 if (den <= num) { 22 num -= den; 23 quot += qbit; 24 } 25 den >>= 1; 26 qbit >>= 1; 27 } 28 29 if (rem_p) 30 *rem_p = num; 31 32 return quot; 33 } 34