div64.h 952 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #ifndef _ASM_M32R_DIV64
  2. #define _ASM_M32R_DIV64
  3. /* $Id$ */
  4. /* unsigned long long division.
  5. * Input:
  6. * unsigned long long n
  7. * unsigned long base
  8. * Output:
  9. * n = n / base;
  10. * return value = n % base;
  11. */
  12. #define do_div(n, base) \
  13. ({ \
  14. unsigned long _res, _high, _mid, _low; \
  15. \
  16. _low = (n) & 0xffffffffUL; \
  17. _high = (n) >> 32; \
  18. if (_high) { \
  19. _mid = (_high % (unsigned long)(base)) << 16; \
  20. _high = _high / (unsigned long)(base); \
  21. _mid += _low >> 16; \
  22. _low &= 0x0000ffffUL; \
  23. _low += (_mid % (unsigned long)(base)) << 16; \
  24. _mid = _mid / (unsigned long)(base); \
  25. _res = _low % (unsigned long)(base); \
  26. _low = _low / (unsigned long)(base); \
  27. n = _low + ((long long)_mid << 16) + \
  28. ((long long)_high << 32); \
  29. } else { \
  30. _res = _low % (unsigned long)(base); \
  31. n = (_low / (unsigned long)(base)); \
  32. } \
  33. _res; \
  34. })
  35. #endif /* _ASM_M32R_DIV64 */