190075Sobrienunsigned long
290075Sobrienudivmodsi4(unsigned long num, unsigned long den, int modwanted)
390075Sobrien{
490075Sobrien  unsigned long bit = 1;
590075Sobrien  unsigned long res = 0;
690075Sobrien
790075Sobrien  while (den < num && bit && !(den & (1L<<31)))
890075Sobrien    {
990075Sobrien      den <<=1;
1090075Sobrien      bit <<=1;
1190075Sobrien    }
1290075Sobrien  while (bit)
1390075Sobrien    {
1490075Sobrien      if (num >= den)
1590075Sobrien	{
1690075Sobrien	  num -= den;
1790075Sobrien	  res |= bit;
1890075Sobrien	}
1990075Sobrien      bit >>=1;
2090075Sobrien      den >>=1;
2190075Sobrien    }
2290075Sobrien  if (modwanted) return num;
2390075Sobrien  return res;
2490075Sobrien}
25