int test__udivmodsi4(su_int a, su_int b, su_int expected_result, su_int expected_rem) { su_int rem; su_int result = __udivmodsi4(a, b, &rem); if (result != expected_result) { printf("error in __udivmodsi4: %u / %u = %u, expected %u\n", a, b, result, expected_result); return 1; } if (rem != expected_rem) { printf("error in __udivmodsi4: %u mod %u = %u, expected %u\n", a, b, rem, expected_rem); return 1; } return 0; }
int32_t __divsi3(int32_t num, int32_t den) { int minus = 0; int32_t v; if (num < 0) { num = -num; minus = 1; } if (den < 0) { den = -den; minus ^= 1; } v = __udivmodsi4(num, den, NULL); if (minus) v = -v; return v; }
/* * 32-bit unsigned integer divide. */ unsigned int __aeabi_uidiv(unsigned int num, unsigned int den) { return __udivmodsi4(num, den, 0); }