Blame view

include/linux/math64.h 2.39 KB
2418f4f28   Roman Zippel   introduce explici...
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
  #ifndef _LINUX_MATH64_H
  #define _LINUX_MATH64_H
  
  #include <linux/types.h>
  #include <asm/div64.h>
  
  #if BITS_PER_LONG == 64
  
  /**
   * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder
   *
   * This is commonly provided by 32bit archs to provide an optimized 64bit
   * divide.
   */
  static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)
  {
  	*remainder = dividend % divisor;
  	return dividend / divisor;
  }
  
  /**
   * div_s64_rem - signed 64bit divide with 32bit divisor with remainder
   */
  static inline s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder)
  {
  	*remainder = dividend % divisor;
  	return dividend / divisor;
  }
6f6d6a1a6   Roman Zippel   rename div64_64 t...
29
30
31
32
33
34
35
  /**
   * div64_u64 - unsigned 64bit divide with 64bit divisor
   */
  static inline u64 div64_u64(u64 dividend, u64 divisor)
  {
  	return dividend / divisor;
  }
658716d19   Brian Behlendorf   div64_u64(): impr...
36
37
38
39
40
41
42
  /**
   * div64_s64 - signed 64bit divide with 64bit divisor
   */
  static inline s64 div64_s64(s64 dividend, s64 divisor)
  {
  	return dividend / divisor;
  }
2418f4f28   Roman Zippel   introduce explici...
43
44
45
46
47
48
49
50
51
52
53
54
55
  #elif BITS_PER_LONG == 32
  
  #ifndef div_u64_rem
  static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)
  {
  	*remainder = do_div(dividend, divisor);
  	return dividend;
  }
  #endif
  
  #ifndef div_s64_rem
  extern s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder);
  #endif
6f6d6a1a6   Roman Zippel   rename div64_64 t...
56
57
58
  #ifndef div64_u64
  extern u64 div64_u64(u64 dividend, u64 divisor);
  #endif
658716d19   Brian Behlendorf   div64_u64(): impr...
59
60
61
  #ifndef div64_s64
  extern s64 div64_s64(s64 dividend, s64 divisor);
  #endif
2418f4f28   Roman Zippel   introduce explici...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  #endif /* BITS_PER_LONG */
  
  /**
   * div_u64 - unsigned 64bit divide with 32bit divisor
   *
   * This is the most common 64bit divide and should be used if possible,
   * as many 32bit archs can optimize this variant better than a full 64bit
   * divide.
   */
  #ifndef div_u64
  static inline u64 div_u64(u64 dividend, u32 divisor)
  {
  	u32 remainder;
  	return div_u64_rem(dividend, divisor, &remainder);
  }
  #endif
  
  /**
   * div_s64 - signed 64bit divide with 32bit divisor
   */
  #ifndef div_s64
  static inline s64 div_s64(s64 dividend, s32 divisor)
  {
  	s32 remainder;
  	return div_s64_rem(dividend, divisor, &remainder);
  }
  #endif
f595ec964   Jeremy Fitzhardinge   common implementa...
89
  u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder);
d5e181f78   Jeremy Fitzhardinge   add an inlined ve...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  static __always_inline u32
  __iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder)
  {
  	u32 ret = 0;
  
  	while (dividend >= divisor) {
  		/* The following asm() prevents the compiler from
  		   optimising this loop into a modulo operation.  */
  		asm("" : "+rm"(dividend));
  
  		dividend -= divisor;
  		ret++;
  	}
  
  	*remainder = dividend;
  
  	return ret;
  }
2418f4f28   Roman Zippel   introduce explici...
108
  #endif /* _LINUX_MATH64_H */