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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
|
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_MATH_H
#define _LINUX_MATH_H
#include <linux/types.h>
#include <asm/div64.h>
#include <uapi/linux/kernel.h>
/*
* This looks more complex than it should be. But we need to
* get the type for the ~ right in round_down (it needs to be
* as wide as the result!), and we want to evaluate the macro
* arguments just once each.
*/
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
/**
* round_up - round up to next specified power of 2
* @x: the value to round
* @y: multiple to round up to (must be a power of 2)
*
* Rounds @x up to next multiple of @y (which must be a power of 2).
* To perform arbitrary rounding up, use roundup() below.
*/
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
/**
* round_down - round down to next specified power of 2
* @x: the value to round
* @y: multiple to round down to (must be a power of 2)
*
* Rounds @x down to next multiple of @y (which must be a power of 2).
* To perform arbitrary rounding down, use rounddown() below.
*/
#define round_down(x, y) ((x) & ~__round_mask(x, y))
/**
* round_closest_up - round closest to be multiple of specified value (which is
* power of 2) with preference to rounding up
* @x: the value to round
* @y: multiple to round closest to (must be a power of 2)
*
* Rounds @x to closest multiple of @y (which must be a power of 2).
* The value can be either rounded up or rounded down depending upon rounded
* value's closeness to the specified value. If there are two closest possible
* values, i.e. the difference between the specified value and it's rounded up
* and rounded down values is same then preference is given to rounded up
* value.
*
* To perform arbitrary rounding to closest value (not multiple of 2), use
* roundclosest().
*
* Examples:
* * round_closest_up(17, 4) = 16
* * round_closest_up(15, 4) = 16
* * round_closest_up(14, 4) = 16
*/
#define round_closest_up(x, y) round_down((x) + (y) / 2, (y))
/**
* round_closest_down - round closest to be multiple of specified value (which
* is power of 2) with preference to rounding down
* @x: the value to round
* @y: multiple to round closest to (must be a power of 2)
*
* Rounds @x to closest multiple of @y (which must be a power of 2).
* The value can be either rounded up or rounded down depending upon rounded
* value's closeness to the specified value. If there are two closest possible
* values, i.e. the difference between the specified value and it's rounded up
* and rounded down values is same then preference is given to rounded up
* value.
*
* To perform arbitrary rounding to closest value (not multiple of 2), use
* roundclosest().
*
* Examples:
* * round_closest_down(17, 4) = 16
* * round_closest_down(15, 4) = 16
* * round_closest_down(14, 4) = 12
*/
#define round_closest_down(x, y) round_up((x) - (y) / 2, (y))
#define DIV_ROUND_UP __KERNEL_DIV_ROUND_UP
#define DIV_ROUND_DOWN_ULL(ll, d) \
({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; })
#define DIV_ROUND_UP_ULL(ll, d) \
DIV_ROUND_DOWN_ULL((unsigned long long)(ll) + (d) - 1, (d))
#if BITS_PER_LONG == 32
# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP_ULL(ll, d)
#else
# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP(ll,d)
#endif
/**
* roundup - round up to the next specified multiple
* @x: the value to up
* @y: multiple to round up to
*
* Rounds @x up to next multiple of @y. If @y will always be a power
* of 2, consider using the faster round_up().
*/
#define roundup(x, y) ( \
{ \
typeof(y) __y = y; \
(((x) + (__y - 1)) / __y) * __y; \
} \
)
/**
* rounddown - round down to next specified multiple
* @x: the value to round
* @y: multiple to round down to
*
* Rounds @x down to next multiple of @y. If @y will always be a power
* of 2, consider using the faster round_down().
*/
#define rounddown(x, y) ( \
{ \
typeof(x) __x = (x); \
__x - (__x % (y)); \
} \
)
/**
* roundclosest - round to nearest multiple
* @x: the value to round
* @y: multiple to round nearest to
*
* Rounds @x to nearest multiple of @y.
* The rounded value can be greater than or less than @x depending
* upon it's nearness to @x. If @y will always be a power of 2, consider
* using the faster round_closest_up() or round_closest_down().
*
* Examples:
* * roundclosest(21, 5) = 20
* * roundclosest(19, 5) = 20
* * roundclosest(17, 5) = 15
*/
#define roundclosest(x, y) rounddown((x) + (y) / 2, (y))
/**
* DIV_ROUND_CLOSEST - Divide positive or negative dividend by positive or
* negative divisor and round to closest value
* @x: dividend value
* @divisor: divisor value
*
* Divide positive or negative dividend value @x by positive or negative
* @divisor value and round to closest integer. Result is undefined for negative
* divisors if the dividend variable type is unsigned and for negative
* dividends if the divisor variable type is unsigned.
*/
#define DIV_ROUND_CLOSEST(x, divisor)( \
{ \
typeof(x) __x = x; \
typeof(divisor) __d = divisor; \
(((typeof(x))-1) > 0 || \
((typeof(divisor))-1) > 0 || \
(((__x) > 0) == ((__d) > 0))) ? \
(((__x) + ((__d) / 2)) / (__d)) : \
(((__x) - ((__d) / 2)) / (__d)); \
} \
)
/**
* DIV_ROUND_CLOSEST_ULL - Divide 64-bit unsigned dividend by 32-bit divisor and
* round to closest value
* @x: unsigned 64-bit dividend
* @divisor: 32-bit divisor
*
* Divide unsigned 64-bit dividend value @x by 32-bit @divisor value
* and round to closest integer. Result is undefined for negative divisors.
*/
#define DIV_ROUND_CLOSEST_ULL(x, divisor)( \
{ \
typeof(divisor) __d = divisor; \
unsigned long long _tmp = (x) + (__d) / 2; \
do_div(_tmp, __d); \
_tmp; \
} \
)
#define __STRUCT_FRACT(type) \
struct type##_fract { \
__##type numerator; \
__##type denominator; \
};
__STRUCT_FRACT(s16)
__STRUCT_FRACT(u16)
__STRUCT_FRACT(s32)
__STRUCT_FRACT(u32)
#undef __STRUCT_FRACT
/* Calculate "x * n / d" without unnecessary overflow or loss of precision. */
#define mult_frac(x, n, d) \
({ \
typeof(x) x_ = (x); \
typeof(n) n_ = (n); \
typeof(d) d_ = (d); \
\
typeof(x_) q = x_ / d_; \
typeof(x_) r = x_ % d_; \
q * n_ + r * n_ / d_; \
})
#define sector_div(a, b) do_div(a, b)
/**
* abs - return absolute value of an argument
* @x: the value. If it is unsigned type, it is converted to signed type first.
* char is treated as if it was signed (regardless of whether it really is)
* but the macro's return type is preserved as char.
*
* Return: an absolute value of x.
*/
#define abs(x) __abs_choose_expr(x, long long, \
__abs_choose_expr(x, long, \
__abs_choose_expr(x, int, \
__abs_choose_expr(x, short, \
__abs_choose_expr(x, char, \
__builtin_choose_expr( \
__builtin_types_compatible_p(typeof(x), char), \
(char)({ signed char __x = (x); __x<0?-__x:__x; }), \
((void)0)))))))
#define __abs_choose_expr(x, type, other) __builtin_choose_expr( \
__builtin_types_compatible_p(typeof(x), signed type) || \
__builtin_types_compatible_p(typeof(x), unsigned type), \
({ signed type __x = (x); __x < 0 ? -__x : __x; }), other)
/**
* abs_diff - return absolute value of the difference between the arguments
* @a: the first argument
* @b: the second argument
*
* @a and @b have to be of the same type. With this restriction we compare
* signed to signed and unsigned to unsigned. The result is the subtraction
* the smaller of the two from the bigger, hence result is always a positive
* value.
*
* Return: an absolute value of the difference between the @a and @b.
*/
#define abs_diff(a, b) ({ \
typeof(a) __a = (a); \
typeof(b) __b = (b); \
(void)(&__a == &__b); \
__a > __b ? (__a - __b) : (__b - __a); \
})
/**
* reciprocal_scale - "scale" a value into range [0, ep_ro)
* @val: value
* @ep_ro: right open interval endpoint
*
* Perform a "reciprocal multiplication" in order to "scale" a value into
* range [0, @ep_ro), where the upper interval endpoint is right-open.
* This is useful, e.g. for accessing a index of an array containing
* @ep_ro elements, for example. Think of it as sort of modulus, only that
* the result isn't that of modulo. ;) Note that if initial input is a
* small value, then result will return 0.
*
* Return: a result based on @val in interval [0, @ep_ro).
*/
static inline u32 reciprocal_scale(u32 val, u32 ep_ro)
{
return (u32)(((u64) val * ep_ro) >> 32);
}
u64 int_pow(u64 base, unsigned int exp);
unsigned long int_sqrt(unsigned long);
#if BITS_PER_LONG < 64
u32 int_sqrt64(u64 x);
#else
static inline u32 int_sqrt64(u64 x)
{
return (u32)int_sqrt(x);
}
#endif
#endif /* _LINUX_MATH_H */
|