Hi @ll,
libgcc's divmodhi4() function has an obvious bug; additionally
it shows rather poor inperformant code: two of the three conditions
tested in the first loop should clearly moved outside the loop!
divmodsi4() shows this inperformant code too!
regards
Stefan Kanthak
--- divmodhi4.c ---
unsigned short
__udivmodhi4(unsigned short num, unsigned short den, int modwanted)
{
unsigned short bit = 1;
unsigned short res = 0;
#ifdef BUGFIX
if (den > num)
return modwanted ? num : 0;
if (den == num)
return modwanted ? 0 : 1;
while ((signed short) den >= 0)
#else // original, buggy and inperformant code
while (den < num && bit && !(den & (1L<<31))) // unsigned shorts are 16 bit!
#endif
{
den <<=1;
bit <<=1;
}
while (bit)
{
if (num >= den)
{
num -= den;
res |= bit;
}
bit >>=1;
den >>=1;
}
if (modwanted) return num;
return res;
}