Blame view

include/linux/log2.h 6.19 KB
2874c5fd2   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-or-later */
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
2
3
4
5
  /* Integer base 2 logarithm calculation
   *
   * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
   * Written by David Howells (dhowells@redhat.com)
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
6
7
8
9
10
11
12
13
14
   */
  
  #ifndef _LINUX_LOG2_H
  #define _LINUX_LOG2_H
  
  #include <linux/types.h>
  #include <linux/bitops.h>
  
  /*
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
   * non-constant log of base 2 calculators
   * - the arch may override these in asm/bitops.h if they can be implemented
   *   more efficiently than using fls() and fls64()
   * - the arch is not required to handle n==0 if implementing the fallback
   */
  #ifndef CONFIG_ARCH_HAS_ILOG2_U32
  static inline __attribute__((const))
  int __ilog2_u32(u32 n)
  {
  	return fls(n) - 1;
  }
  #endif
  
  #ifndef CONFIG_ARCH_HAS_ILOG2_U64
  static inline __attribute__((const))
  int __ilog2_u64(u64 n)
  {
  	return fls64(n) - 1;
  }
  #endif
a1c4d24e0   Randy Dunlap   linux/log2.h: fix...
35
36
37
38
39
  /**
   * is_power_of_2() - check if a value is a power of two
   * @n: the value to check
   *
   * Determine whether some value is a power of two, where zero is
63c2f782e   Robert P. J. Day   [POWERPC] Add "is...
40
   * *not* considered a power of two.
a1c4d24e0   Randy Dunlap   linux/log2.h: fix...
41
   * Return: true if @n is a power of 2, otherwise false.
63c2f782e   Robert P. J. Day   [POWERPC] Add "is...
42
   */
63c2f782e   Robert P. J. Day   [POWERPC] Add "is...
43
44
45
46
47
  static inline __attribute__((const))
  bool is_power_of_2(unsigned long n)
  {
  	return (n != 0 && ((n & (n - 1)) == 0));
  }
a1c4d24e0   Randy Dunlap   linux/log2.h: fix...
48
49
50
  /**
   * __roundup_pow_of_two() - round up to nearest power of two
   * @n: value to round up
312a0c170   David Howells   [PATCH] LOG2: Alt...
51
52
53
54
55
56
   */
  static inline __attribute__((const))
  unsigned long __roundup_pow_of_two(unsigned long n)
  {
  	return 1UL << fls_long(n - 1);
  }
a1c4d24e0   Randy Dunlap   linux/log2.h: fix...
57
58
59
  /**
   * __rounddown_pow_of_two() - round down to nearest power of two
   * @n: value to round down
b311e921b   Robert P. J. Day   Add a "rounddown_...
60
61
62
63
64
65
   */
  static inline __attribute__((const))
  unsigned long __rounddown_pow_of_two(unsigned long n)
  {
  	return 1UL << (fls_long(n) - 1);
  }
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
66
  /**
dbef91ec5   Martin Wilck   scsi: ilog2: crea...
67
   * const_ilog2 - log base 2 of 32-bit or a 64-bit constant unsigned value
a1c4d24e0   Randy Dunlap   linux/log2.h: fix...
68
   * @n: parameter
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
69
   *
dbef91ec5   Martin Wilck   scsi: ilog2: crea...
70
71
   * Use this where sparse expects a true constant expression, e.g. for array
   * indices.
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
72
   */
dbef91ec5   Martin Wilck   scsi: ilog2: crea...
73
  #define const_ilog2(n)				\
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
74
75
  (						\
  	__builtin_constant_p(n) ? (		\
474c90156   Linus Torvalds   give up on gcc il...
76
  		(n) < 2 ? 0 :			\
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
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
  		(n) & (1ULL << 63) ? 63 :	\
  		(n) & (1ULL << 62) ? 62 :	\
  		(n) & (1ULL << 61) ? 61 :	\
  		(n) & (1ULL << 60) ? 60 :	\
  		(n) & (1ULL << 59) ? 59 :	\
  		(n) & (1ULL << 58) ? 58 :	\
  		(n) & (1ULL << 57) ? 57 :	\
  		(n) & (1ULL << 56) ? 56 :	\
  		(n) & (1ULL << 55) ? 55 :	\
  		(n) & (1ULL << 54) ? 54 :	\
  		(n) & (1ULL << 53) ? 53 :	\
  		(n) & (1ULL << 52) ? 52 :	\
  		(n) & (1ULL << 51) ? 51 :	\
  		(n) & (1ULL << 50) ? 50 :	\
  		(n) & (1ULL << 49) ? 49 :	\
  		(n) & (1ULL << 48) ? 48 :	\
  		(n) & (1ULL << 47) ? 47 :	\
  		(n) & (1ULL << 46) ? 46 :	\
  		(n) & (1ULL << 45) ? 45 :	\
  		(n) & (1ULL << 44) ? 44 :	\
  		(n) & (1ULL << 43) ? 43 :	\
  		(n) & (1ULL << 42) ? 42 :	\
  		(n) & (1ULL << 41) ? 41 :	\
  		(n) & (1ULL << 40) ? 40 :	\
  		(n) & (1ULL << 39) ? 39 :	\
  		(n) & (1ULL << 38) ? 38 :	\
  		(n) & (1ULL << 37) ? 37 :	\
  		(n) & (1ULL << 36) ? 36 :	\
  		(n) & (1ULL << 35) ? 35 :	\
  		(n) & (1ULL << 34) ? 34 :	\
  		(n) & (1ULL << 33) ? 33 :	\
  		(n) & (1ULL << 32) ? 32 :	\
  		(n) & (1ULL << 31) ? 31 :	\
  		(n) & (1ULL << 30) ? 30 :	\
  		(n) & (1ULL << 29) ? 29 :	\
  		(n) & (1ULL << 28) ? 28 :	\
  		(n) & (1ULL << 27) ? 27 :	\
  		(n) & (1ULL << 26) ? 26 :	\
  		(n) & (1ULL << 25) ? 25 :	\
  		(n) & (1ULL << 24) ? 24 :	\
  		(n) & (1ULL << 23) ? 23 :	\
  		(n) & (1ULL << 22) ? 22 :	\
  		(n) & (1ULL << 21) ? 21 :	\
  		(n) & (1ULL << 20) ? 20 :	\
  		(n) & (1ULL << 19) ? 19 :	\
  		(n) & (1ULL << 18) ? 18 :	\
  		(n) & (1ULL << 17) ? 17 :	\
  		(n) & (1ULL << 16) ? 16 :	\
  		(n) & (1ULL << 15) ? 15 :	\
  		(n) & (1ULL << 14) ? 14 :	\
  		(n) & (1ULL << 13) ? 13 :	\
  		(n) & (1ULL << 12) ? 12 :	\
  		(n) & (1ULL << 11) ? 11 :	\
  		(n) & (1ULL << 10) ? 10 :	\
  		(n) & (1ULL <<  9) ?  9 :	\
  		(n) & (1ULL <<  8) ?  8 :	\
  		(n) & (1ULL <<  7) ?  7 :	\
  		(n) & (1ULL <<  6) ?  6 :	\
  		(n) & (1ULL <<  5) ?  5 :	\
  		(n) & (1ULL <<  4) ?  4 :	\
  		(n) & (1ULL <<  3) ?  3 :	\
  		(n) & (1ULL <<  2) ?  2 :	\
dbef91ec5   Martin Wilck   scsi: ilog2: crea...
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
  		1) :				\
  	-1)
  
  /**
   * ilog2 - log base 2 of 32-bit or a 64-bit unsigned value
   * @n: parameter
   *
   * constant-capable log of base 2 calculation
   * - this can be used to initialise global variables from constant data, hence
   * the massive ternary operator construction
   *
   * selects the appropriately-sized optimised version depending on sizeof(n)
   */
  #define ilog2(n) \
  ( \
  	__builtin_constant_p(n) ?	\
  	const_ilog2(n) :		\
  	(sizeof(n) <= 4) ?		\
  	__ilog2_u32(n) :		\
  	__ilog2_u64(n)			\
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
159
   )
312a0c170   David Howells   [PATCH] LOG2: Alt...
160
161
  /**
   * roundup_pow_of_two - round the given value up to nearest power of two
a1c4d24e0   Randy Dunlap   linux/log2.h: fix...
162
   * @n: parameter
312a0c170   David Howells   [PATCH] LOG2: Alt...
163
   *
6fb189c2a   Robert P. J. Day   Correct trivial t...
164
   * round the given value up to the nearest power of two
312a0c170   David Howells   [PATCH] LOG2: Alt...
165
166
167
168
169
170
   * - the result is undefined when n == 0
   * - this can be used to initialise global variables from constant data
   */
  #define roundup_pow_of_two(n)			\
  (						\
  	__builtin_constant_p(n) ? (		\
428fc0aff   Jason Gunthorpe   include/linux/log...
171
  		((n) == 1) ? 1 :		\
312a0c170   David Howells   [PATCH] LOG2: Alt...
172
173
174
175
  		(1UL << (ilog2((n) - 1) + 1))	\
  				   ) :		\
  	__roundup_pow_of_two(n)			\
   )
b311e921b   Robert P. J. Day   Add a "rounddown_...
176
177
  /**
   * rounddown_pow_of_two - round the given value down to nearest power of two
a1c4d24e0   Randy Dunlap   linux/log2.h: fix...
178
   * @n: parameter
b311e921b   Robert P. J. Day   Add a "rounddown_...
179
180
181
182
183
184
185
186
   *
   * round the given value down to the nearest power of two
   * - the result is undefined when n == 0
   * - this can be used to initialise global variables from constant data
   */
  #define rounddown_pow_of_two(n)			\
  (						\
  	__builtin_constant_p(n) ? (		\
b311e921b   Robert P. J. Day   Add a "rounddown_...
187
188
189
  		(1UL << ilog2(n))) :		\
  	__rounddown_pow_of_two(n)		\
   )
a1c4d24e0   Randy Dunlap   linux/log2.h: fix...
190
191
192
193
194
  static inline __attribute_const__
  int __order_base_2(unsigned long n)
  {
  	return n > 1 ? ilog2(n - 1) + 1 : 0;
  }
de9330d13   Robert P. J. Day   log2.h: Define or...
195
196
197
198
199
200
201
202
203
204
205
206
207
  /**
   * order_base_2 - calculate the (rounded up) base 2 order of the argument
   * @n: parameter
   *
   * The first few values calculated by this routine:
   *  ob2(0) = 0
   *  ob2(1) = 0
   *  ob2(2) = 1
   *  ob2(3) = 2
   *  ob2(4) = 2
   *  ob2(5) = 3
   *  ... and so on.
   */
29905b52f   Ard Biesheuvel   log2: make order_...
208
209
210
211
212
213
214
  #define order_base_2(n)				\
  (						\
  	__builtin_constant_p(n) ? (		\
  		((n) == 0 || (n) == 1) ? 0 :	\
  		ilog2((n) - 1) + 1) :		\
  	__order_base_2(n)			\
  )
69842cba9   Patrick Bellasi   sched/uclamp: Add...
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
  
  static inline __attribute__((const))
  int __bits_per(unsigned long n)
  {
  	if (n < 2)
  		return 1;
  	if (is_power_of_2(n))
  		return order_base_2(n) + 1;
  	return order_base_2(n);
  }
  
  /**
   * bits_per - calculate the number of bits required for the argument
   * @n: parameter
   *
   * This is constant-capable and can be used for compile time
   * initializations, e.g bitfields.
   *
   * The first few values calculated by this routine:
   * bf(0) = 1
   * bf(1) = 1
   * bf(2) = 2
   * bf(3) = 2
   * bf(4) = 3
   * ... and so on.
   */
  #define bits_per(n)				\
  (						\
  	__builtin_constant_p(n) ? (		\
  		((n) == 0 || (n) == 1)		\
  			? 1 : ilog2(n) + 1	\
  	) :					\
  	__bits_per(n)				\
  )
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
249
  #endif /* _LINUX_LOG2_H */