aboutsummaryrefslogtreecommitdiff
path: root/softint/udivrem.c
blob: 906c665e3b218a5ad88299b243d612eee60aff1e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

#include <stdint.h>


unsigned long
softint_udivrem(unsigned long num, unsigned long den, int modwanted)
{
  unsigned long bit = 1;
  unsigned long res = 0;

  while (den < num && bit && ((signed long) den >= 0))
  {
    den <<=1;
    bit <<=1;
  }
  while (bit)
  {
    if (num >= den)
    {
      num -= den;
      res |= bit;
    }
    bit >>=1;
    den >>=1;
  }
  if (modwanted) return num;
  return res;
}