xref: /linux-6.15/include/linux/math.h (revision b16510a5)
1aa6159abSAndy Shevchenko /* SPDX-License-Identifier: GPL-2.0 */
2aa6159abSAndy Shevchenko #ifndef _LINUX_MATH_H
3aa6159abSAndy Shevchenko #define _LINUX_MATH_H
4aa6159abSAndy Shevchenko 
5e820a337SAndy Shevchenko #include <linux/types.h>
6aa6159abSAndy Shevchenko #include <asm/div64.h>
7aa6159abSAndy Shevchenko #include <uapi/linux/kernel.h>
8aa6159abSAndy Shevchenko 
9aa6159abSAndy Shevchenko /*
10aa6159abSAndy Shevchenko  * This looks more complex than it should be. But we need to
11aa6159abSAndy Shevchenko  * get the type for the ~ right in round_down (it needs to be
12aa6159abSAndy Shevchenko  * as wide as the result!), and we want to evaluate the macro
13aa6159abSAndy Shevchenko  * arguments just once each.
14aa6159abSAndy Shevchenko  */
15aa6159abSAndy Shevchenko #define __round_mask(x, y) ((__typeof__(x))((y)-1))
16aa6159abSAndy Shevchenko 
17aa6159abSAndy Shevchenko /**
18aa6159abSAndy Shevchenko  * round_up - round up to next specified power of 2
19aa6159abSAndy Shevchenko  * @x: the value to round
20aa6159abSAndy Shevchenko  * @y: multiple to round up to (must be a power of 2)
21aa6159abSAndy Shevchenko  *
22aa6159abSAndy Shevchenko  * Rounds @x up to next multiple of @y (which must be a power of 2).
23aa6159abSAndy Shevchenko  * To perform arbitrary rounding up, use roundup() below.
24aa6159abSAndy Shevchenko  */
25aa6159abSAndy Shevchenko #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
26aa6159abSAndy Shevchenko 
27aa6159abSAndy Shevchenko /**
28aa6159abSAndy Shevchenko  * round_down - round down to next specified power of 2
29aa6159abSAndy Shevchenko  * @x: the value to round
30aa6159abSAndy Shevchenko  * @y: multiple to round down to (must be a power of 2)
31aa6159abSAndy Shevchenko  *
32aa6159abSAndy Shevchenko  * Rounds @x down to next multiple of @y (which must be a power of 2).
33aa6159abSAndy Shevchenko  * To perform arbitrary rounding down, use rounddown() below.
34aa6159abSAndy Shevchenko  */
35aa6159abSAndy Shevchenko #define round_down(x, y) ((x) & ~__round_mask(x, y))
36aa6159abSAndy Shevchenko 
37*b16510a5SLukas Wunner /**
38*b16510a5SLukas Wunner  * DIV_ROUND_UP_POW2 - divide and round up
39*b16510a5SLukas Wunner  * @n: numerator
40*b16510a5SLukas Wunner  * @d: denominator (must be a power of 2)
41*b16510a5SLukas Wunner  *
42*b16510a5SLukas Wunner  * Divides @n by @d and rounds up to next multiple of @d (which must be a power
43*b16510a5SLukas Wunner  * of 2). Avoids integer overflows that may occur with __KERNEL_DIV_ROUND_UP().
44*b16510a5SLukas Wunner  * Performance is roughly equivalent to __KERNEL_DIV_ROUND_UP().
45*b16510a5SLukas Wunner  */
46*b16510a5SLukas Wunner #define DIV_ROUND_UP_POW2(n, d) \
47*b16510a5SLukas Wunner 	((n) / (d) + !!((n) & ((d) - 1)))
48*b16510a5SLukas Wunner 
49aa6159abSAndy Shevchenko #define DIV_ROUND_UP __KERNEL_DIV_ROUND_UP
50aa6159abSAndy Shevchenko 
51aa6159abSAndy Shevchenko #define DIV_ROUND_DOWN_ULL(ll, d) \
52aa6159abSAndy Shevchenko 	({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; })
53aa6159abSAndy Shevchenko 
54aa6159abSAndy Shevchenko #define DIV_ROUND_UP_ULL(ll, d) \
55aa6159abSAndy Shevchenko 	DIV_ROUND_DOWN_ULL((unsigned long long)(ll) + (d) - 1, (d))
56aa6159abSAndy Shevchenko 
57aa6159abSAndy Shevchenko #if BITS_PER_LONG == 32
58aa6159abSAndy Shevchenko # define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP_ULL(ll, d)
59aa6159abSAndy Shevchenko #else
60aa6159abSAndy Shevchenko # define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP(ll,d)
61aa6159abSAndy Shevchenko #endif
62aa6159abSAndy Shevchenko 
63aa6159abSAndy Shevchenko /**
64aa6159abSAndy Shevchenko  * roundup - round up to the next specified multiple
65aa6159abSAndy Shevchenko  * @x: the value to up
66aa6159abSAndy Shevchenko  * @y: multiple to round up to
67aa6159abSAndy Shevchenko  *
68aa6159abSAndy Shevchenko  * Rounds @x up to next multiple of @y. If @y will always be a power
69aa6159abSAndy Shevchenko  * of 2, consider using the faster round_up().
70aa6159abSAndy Shevchenko  */
71aa6159abSAndy Shevchenko #define roundup(x, y) (					\
72aa6159abSAndy Shevchenko {							\
73aa6159abSAndy Shevchenko 	typeof(y) __y = y;				\
74aa6159abSAndy Shevchenko 	(((x) + (__y - 1)) / __y) * __y;		\
75aa6159abSAndy Shevchenko }							\
76aa6159abSAndy Shevchenko )
77aa6159abSAndy Shevchenko /**
78aa6159abSAndy Shevchenko  * rounddown - round down to next specified multiple
79aa6159abSAndy Shevchenko  * @x: the value to round
80aa6159abSAndy Shevchenko  * @y: multiple to round down to
81aa6159abSAndy Shevchenko  *
82aa6159abSAndy Shevchenko  * Rounds @x down to next multiple of @y. If @y will always be a power
83aa6159abSAndy Shevchenko  * of 2, consider using the faster round_down().
84aa6159abSAndy Shevchenko  */
85aa6159abSAndy Shevchenko #define rounddown(x, y) (				\
86aa6159abSAndy Shevchenko {							\
87aa6159abSAndy Shevchenko 	typeof(x) __x = (x);				\
88aa6159abSAndy Shevchenko 	__x - (__x % (y));				\
89aa6159abSAndy Shevchenko }							\
90aa6159abSAndy Shevchenko )
91aa6159abSAndy Shevchenko 
92aa6159abSAndy Shevchenko /*
93aa6159abSAndy Shevchenko  * Divide positive or negative dividend by positive or negative divisor
94aa6159abSAndy Shevchenko  * and round to closest integer. Result is undefined for negative
95aa6159abSAndy Shevchenko  * divisors if the dividend variable type is unsigned and for negative
96aa6159abSAndy Shevchenko  * dividends if the divisor variable type is unsigned.
97aa6159abSAndy Shevchenko  */
98aa6159abSAndy Shevchenko #define DIV_ROUND_CLOSEST(x, divisor)(			\
99aa6159abSAndy Shevchenko {							\
100aa6159abSAndy Shevchenko 	typeof(x) __x = x;				\
101aa6159abSAndy Shevchenko 	typeof(divisor) __d = divisor;			\
102aa6159abSAndy Shevchenko 	(((typeof(x))-1) > 0 ||				\
103aa6159abSAndy Shevchenko 	 ((typeof(divisor))-1) > 0 ||			\
104aa6159abSAndy Shevchenko 	 (((__x) > 0) == ((__d) > 0))) ?		\
105aa6159abSAndy Shevchenko 		(((__x) + ((__d) / 2)) / (__d)) :	\
106aa6159abSAndy Shevchenko 		(((__x) - ((__d) / 2)) / (__d));	\
107aa6159abSAndy Shevchenko }							\
108aa6159abSAndy Shevchenko )
109aa6159abSAndy Shevchenko /*
110aa6159abSAndy Shevchenko  * Same as above but for u64 dividends. divisor must be a 32-bit
111aa6159abSAndy Shevchenko  * number.
112aa6159abSAndy Shevchenko  */
113aa6159abSAndy Shevchenko #define DIV_ROUND_CLOSEST_ULL(x, divisor)(		\
114aa6159abSAndy Shevchenko {							\
115aa6159abSAndy Shevchenko 	typeof(divisor) __d = divisor;			\
116aa6159abSAndy Shevchenko 	unsigned long long _tmp = (x) + (__d) / 2;	\
117aa6159abSAndy Shevchenko 	do_div(_tmp, __d);				\
118aa6159abSAndy Shevchenko 	_tmp;						\
119aa6159abSAndy Shevchenko }							\
120aa6159abSAndy Shevchenko )
121aa6159abSAndy Shevchenko 
122e820a337SAndy Shevchenko #define __STRUCT_FRACT(type)				\
123e820a337SAndy Shevchenko struct type##_fract {					\
124e820a337SAndy Shevchenko 	__##type numerator;				\
125e820a337SAndy Shevchenko 	__##type denominator;				\
126e820a337SAndy Shevchenko };
127e38a82dfSAngeloGioacchino Del Regno __STRUCT_FRACT(s8)
__STRUCT_FRACT(u8)128e38a82dfSAngeloGioacchino Del Regno __STRUCT_FRACT(u8)
129e820a337SAndy Shevchenko __STRUCT_FRACT(s16)
130e820a337SAndy Shevchenko __STRUCT_FRACT(u16)
131e820a337SAndy Shevchenko __STRUCT_FRACT(s32)
132e820a337SAndy Shevchenko __STRUCT_FRACT(u32)
133e820a337SAndy Shevchenko #undef __STRUCT_FRACT
134e820a337SAndy Shevchenko 
135048a9883SAlexey Dobriyan /* Calculate "x * n / d" without unnecessary overflow or loss of precision. */
136048a9883SAlexey Dobriyan #define mult_frac(x, n, d)	\
137048a9883SAlexey Dobriyan ({				\
138048a9883SAlexey Dobriyan 	typeof(x) x_ = (x);	\
139048a9883SAlexey Dobriyan 	typeof(n) n_ = (n);	\
140048a9883SAlexey Dobriyan 	typeof(d) d_ = (d);	\
141048a9883SAlexey Dobriyan 				\
142048a9883SAlexey Dobriyan 	typeof(x_) q = x_ / d_;	\
143048a9883SAlexey Dobriyan 	typeof(x_) r = x_ % d_;	\
144048a9883SAlexey Dobriyan 	q * n_ + r * n_ / d_;	\
145048a9883SAlexey Dobriyan })
146aa6159abSAndy Shevchenko 
147aa6159abSAndy Shevchenko #define sector_div(a, b) do_div(a, b)
148aa6159abSAndy Shevchenko 
149aa6159abSAndy Shevchenko /**
150aa6159abSAndy Shevchenko  * abs - return absolute value of an argument
151aa6159abSAndy Shevchenko  * @x: the value.  If it is unsigned type, it is converted to signed type first.
152aa6159abSAndy Shevchenko  *     char is treated as if it was signed (regardless of whether it really is)
153aa6159abSAndy Shevchenko  *     but the macro's return type is preserved as char.
154aa6159abSAndy Shevchenko  *
155aa6159abSAndy Shevchenko  * Return: an absolute value of x.
156aa6159abSAndy Shevchenko  */
157aa6159abSAndy Shevchenko #define abs(x)	__abs_choose_expr(x, long long,				\
158aa6159abSAndy Shevchenko 		__abs_choose_expr(x, long,				\
159aa6159abSAndy Shevchenko 		__abs_choose_expr(x, int,				\
160aa6159abSAndy Shevchenko 		__abs_choose_expr(x, short,				\
161aa6159abSAndy Shevchenko 		__abs_choose_expr(x, char,				\
162aa6159abSAndy Shevchenko 		__builtin_choose_expr(					\
163aa6159abSAndy Shevchenko 			__builtin_types_compatible_p(typeof(x), char),	\
164aa6159abSAndy Shevchenko 			(char)({ signed char __x = (x); __x<0?-__x:__x; }), \
165aa6159abSAndy Shevchenko 			((void)0)))))))
166aa6159abSAndy Shevchenko 
167aa6159abSAndy Shevchenko #define __abs_choose_expr(x, type, other) __builtin_choose_expr(	\
168aa6159abSAndy Shevchenko 	__builtin_types_compatible_p(typeof(x),   signed type) ||	\
169aa6159abSAndy Shevchenko 	__builtin_types_compatible_p(typeof(x), unsigned type),		\
170aa6159abSAndy Shevchenko 	({ signed type __x = (x); __x < 0 ? -__x : __x; }), other)
171aa6159abSAndy Shevchenko 
172aa6159abSAndy Shevchenko /**
17346f12960SAndy Shevchenko  * abs_diff - return absolute value of the difference between the arguments
17446f12960SAndy Shevchenko  * @a: the first argument
17546f12960SAndy Shevchenko  * @b: the second argument
17646f12960SAndy Shevchenko  *
17746f12960SAndy Shevchenko  * @a and @b have to be of the same type. With this restriction we compare
17846f12960SAndy Shevchenko  * signed to signed and unsigned to unsigned. The result is the subtraction
17946f12960SAndy Shevchenko  * the smaller of the two from the bigger, hence result is always a positive
18046f12960SAndy Shevchenko  * value.
18146f12960SAndy Shevchenko  *
18246f12960SAndy Shevchenko  * Return: an absolute value of the difference between the @a and @b.
18346f12960SAndy Shevchenko  */
18446f12960SAndy Shevchenko #define abs_diff(a, b) ({			\
18546f12960SAndy Shevchenko 	typeof(a) __a = (a);			\
18646f12960SAndy Shevchenko 	typeof(b) __b = (b);			\
18746f12960SAndy Shevchenko 	(void)(&__a == &__b);			\
18846f12960SAndy Shevchenko 	__a > __b ? (__a - __b) : (__b - __a);	\
18946f12960SAndy Shevchenko })
19046f12960SAndy Shevchenko 
19146f12960SAndy Shevchenko /**
192aa6159abSAndy Shevchenko  * reciprocal_scale - "scale" a value into range [0, ep_ro)
193aa6159abSAndy Shevchenko  * @val: value
194aa6159abSAndy Shevchenko  * @ep_ro: right open interval endpoint
195aa6159abSAndy Shevchenko  *
196aa6159abSAndy Shevchenko  * Perform a "reciprocal multiplication" in order to "scale" a value into
197aa6159abSAndy Shevchenko  * range [0, @ep_ro), where the upper interval endpoint is right-open.
198aa6159abSAndy Shevchenko  * This is useful, e.g. for accessing a index of an array containing
199aa6159abSAndy Shevchenko  * @ep_ro elements, for example. Think of it as sort of modulus, only that
200aa6159abSAndy Shevchenko  * the result isn't that of modulo. ;) Note that if initial input is a
201aa6159abSAndy Shevchenko  * small value, then result will return 0.
202aa6159abSAndy Shevchenko  *
203aa6159abSAndy Shevchenko  * Return: a result based on @val in interval [0, @ep_ro).
204aa6159abSAndy Shevchenko  */
205aa6159abSAndy Shevchenko static inline u32 reciprocal_scale(u32 val, u32 ep_ro)
206aa6159abSAndy Shevchenko {
207aa6159abSAndy Shevchenko 	return (u32)(((u64) val * ep_ro) >> 32);
208aa6159abSAndy Shevchenko }
209aa6159abSAndy Shevchenko 
210aa6159abSAndy Shevchenko u64 int_pow(u64 base, unsigned int exp);
211aa6159abSAndy Shevchenko unsigned long int_sqrt(unsigned long);
212aa6159abSAndy Shevchenko 
213aa6159abSAndy Shevchenko #if BITS_PER_LONG < 64
214aa6159abSAndy Shevchenko u32 int_sqrt64(u64 x);
215aa6159abSAndy Shevchenko #else
int_sqrt64(u64 x)216aa6159abSAndy Shevchenko static inline u32 int_sqrt64(u64 x)
217aa6159abSAndy Shevchenko {
218aa6159abSAndy Shevchenko 	return (u32)int_sqrt(x);
219aa6159abSAndy Shevchenko }
220aa6159abSAndy Shevchenko #endif
221aa6159abSAndy Shevchenko 
222aa6159abSAndy Shevchenko #endif	/* _LINUX_MATH_H */
223