math64.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #ifndef _LINUX_MATH64_H
  2. #define _LINUX_MATH64_H
  3. #include <linux/types.h>
  4. #if BITS_PER_LONG == 64
  5. /**
  6. * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder
  7. *
  8. * This is commonly provided by 32bit archs to provide an optimized 64bit
  9. * divide.
  10. */
  11. static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)
  12. {
  13. *remainder = dividend % divisor;
  14. return dividend / divisor;
  15. }
  16. /**
  17. * div_s64_rem - signed 64bit divide with 32bit divisor with remainder
  18. */
  19. static inline s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder)
  20. {
  21. *remainder = dividend % divisor;
  22. return dividend / divisor;
  23. }
  24. /**
  25. * div64_u64 - unsigned 64bit divide with 64bit divisor
  26. */
  27. static inline u64 div64_u64(u64 dividend, u64 divisor)
  28. {
  29. return dividend / divisor;
  30. }
  31. #elif BITS_PER_LONG == 32
  32. #ifndef div_u64_rem
  33. static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)
  34. {
  35. *remainder = do_div(dividend, divisor);
  36. return dividend;
  37. }
  38. #endif
  39. #ifndef div_s64_rem
  40. extern s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder);
  41. #endif
  42. #ifndef div64_u64
  43. extern u64 div64_u64(u64 dividend, u64 divisor);
  44. #endif
  45. #endif /* BITS_PER_LONG */
  46. /**
  47. * div_u64 - unsigned 64bit divide with 32bit divisor
  48. *
  49. * This is the most common 64bit divide and should be used if possible,
  50. * as many 32bit archs can optimize this variant better than a full 64bit
  51. * divide.
  52. */
  53. #ifndef div_u64
  54. static inline u64 div_u64(u64 dividend, u32 divisor)
  55. {
  56. u32 remainder;
  57. return div_u64_rem(dividend, divisor, &remainder);
  58. }
  59. #endif
  60. /**
  61. * div_s64 - signed 64bit divide with 32bit divisor
  62. */
  63. #ifndef div_s64
  64. static inline s64 div_s64(s64 dividend, s32 divisor)
  65. {
  66. s32 remainder;
  67. return div_s64_rem(dividend, divisor, &remainder);
  68. }
  69. #endif
  70. u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder);
  71. #endif /* _LINUX_MATH64_H */