Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
log2.h
Go to the documentation of this file.
1
/* Integer base 2 logarithm calculation
2
*
3
* Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
4
* Written by David Howells (
[email protected]
)
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version
9
* 2 of the License, or (at your option) any later version.
10
*/
11
12
#ifndef _LINUX_LOG2_H
13
#define _LINUX_LOG2_H
14
15
#include <linux/types.h>
16
#include <linux/bitops.h>
17
18
/*
19
* deal with unrepresentable constant logarithms
20
*/
21
extern
__attribute__
((
const
, noreturn))
22
int
____ilog2_NaN(
void
);
23
24
/*
25
* non-constant log of base 2 calculators
26
* - the arch may override these in asm/bitops.h if they can be implemented
27
* more efficiently than using fls() and fls64()
28
* - the arch is not required to handle n==0 if implementing the fallback
29
*/
30
#ifndef CONFIG_ARCH_HAS_ILOG2_U32
31
static
inline
__attribute__
((
const
))
32
int
__ilog2_u32(
u32
n
)
33
{
34
return
fls(n) - 1;
35
}
36
#endif
37
38
#ifndef CONFIG_ARCH_HAS_ILOG2_U64
39
static
inline
__attribute__
((
const
))
40
int
__ilog2_u64(
u64
n
)
41
{
42
return
fls64(n) - 1;
43
}
44
#endif
45
46
/*
47
* Determine whether some value is a power of two, where zero is
48
* *not* considered a power of two.
49
*/
50
51
static
inline
__attribute__
((
const
))
52
bool
is_power_of_2
(
unsigned
long
n
)
53
{
54
return
(n != 0 && ((n & (n - 1)) == 0));
55
}
56
57
/*
58
* round up to nearest power of two
59
*/
60
static
inline
__attribute__
((
const
))
61
unsigned
long
__roundup_pow_of_two(
unsigned
long
n)
62
{
63
return
1
UL
<< fls_long(n - 1);
64
}
65
66
/*
67
* round down to nearest power of two
68
*/
69
static
inline
__attribute__
((
const
))
70
unsigned
long
__rounddown_pow_of_two(
unsigned
long
n)
71
{
72
return
1
UL
<< (fls_long(n) - 1);
73
}
74
85
#define ilog2(n) \
86
( \
87
__builtin_constant_p(n) ? ( \
88
(n) < 1 ? ____ilog2_NaN() : \
89
(n) & (1ULL << 63) ? 63 : \
90
(n) & (1ULL << 62) ? 62 : \
91
(n) & (1ULL << 61) ? 61 : \
92
(n) & (1ULL << 60) ? 60 : \
93
(n) & (1ULL << 59) ? 59 : \
94
(n) & (1ULL << 58) ? 58 : \
95
(n) & (1ULL << 57) ? 57 : \
96
(n) & (1ULL << 56) ? 56 : \
97
(n) & (1ULL << 55) ? 55 : \
98
(n) & (1ULL << 54) ? 54 : \
99
(n) & (1ULL << 53) ? 53 : \
100
(n) & (1ULL << 52) ? 52 : \
101
(n) & (1ULL << 51) ? 51 : \
102
(n) & (1ULL << 50) ? 50 : \
103
(n) & (1ULL << 49) ? 49 : \
104
(n) & (1ULL << 48) ? 48 : \
105
(n) & (1ULL << 47) ? 47 : \
106
(n) & (1ULL << 46) ? 46 : \
107
(n) & (1ULL << 45) ? 45 : \
108
(n) & (1ULL << 44) ? 44 : \
109
(n) & (1ULL << 43) ? 43 : \
110
(n) & (1ULL << 42) ? 42 : \
111
(n) & (1ULL << 41) ? 41 : \
112
(n) & (1ULL << 40) ? 40 : \
113
(n) & (1ULL << 39) ? 39 : \
114
(n) & (1ULL << 38) ? 38 : \
115
(n) & (1ULL << 37) ? 37 : \
116
(n) & (1ULL << 36) ? 36 : \
117
(n) & (1ULL << 35) ? 35 : \
118
(n) & (1ULL << 34) ? 34 : \
119
(n) & (1ULL << 33) ? 33 : \
120
(n) & (1ULL << 32) ? 32 : \
121
(n) & (1ULL << 31) ? 31 : \
122
(n) & (1ULL << 30) ? 30 : \
123
(n) & (1ULL << 29) ? 29 : \
124
(n) & (1ULL << 28) ? 28 : \
125
(n) & (1ULL << 27) ? 27 : \
126
(n) & (1ULL << 26) ? 26 : \
127
(n) & (1ULL << 25) ? 25 : \
128
(n) & (1ULL << 24) ? 24 : \
129
(n) & (1ULL << 23) ? 23 : \
130
(n) & (1ULL << 22) ? 22 : \
131
(n) & (1ULL << 21) ? 21 : \
132
(n) & (1ULL << 20) ? 20 : \
133
(n) & (1ULL << 19) ? 19 : \
134
(n) & (1ULL << 18) ? 18 : \
135
(n) & (1ULL << 17) ? 17 : \
136
(n) & (1ULL << 16) ? 16 : \
137
(n) & (1ULL << 15) ? 15 : \
138
(n) & (1ULL << 14) ? 14 : \
139
(n) & (1ULL << 13) ? 13 : \
140
(n) & (1ULL << 12) ? 12 : \
141
(n) & (1ULL << 11) ? 11 : \
142
(n) & (1ULL << 10) ? 10 : \
143
(n) & (1ULL << 9) ? 9 : \
144
(n) & (1ULL << 8) ? 8 : \
145
(n) & (1ULL << 7) ? 7 : \
146
(n) & (1ULL << 6) ? 6 : \
147
(n) & (1ULL << 5) ? 5 : \
148
(n) & (1ULL << 4) ? 4 : \
149
(n) & (1ULL << 3) ? 3 : \
150
(n) & (1ULL << 2) ? 2 : \
151
(n) & (1ULL << 1) ? 1 : \
152
(n) & (1ULL << 0) ? 0 : \
153
____ilog2_NaN() \
154
) : \
155
(sizeof(n) <= 4) ? \
156
__ilog2_u32(n) : \
157
__ilog2_u64(n) \
158
)
159
168
#define roundup_pow_of_two(n) \
169
( \
170
__builtin_constant_p(n) ? ( \
171
(n == 1) ? 1 : \
172
(1UL << (ilog2((n) - 1) + 1)) \
173
) : \
174
__roundup_pow_of_two(n) \
175
)
176
185
#define rounddown_pow_of_two(n) \
186
( \
187
__builtin_constant_p(n) ? ( \
188
(1UL << ilog2(n))) : \
189
__rounddown_pow_of_two(n) \
190
)
191
206
#define order_base_2(n) ilog2(roundup_pow_of_two(n))
207
208
#endif
/* _LINUX_LOG2_H */
Generated on Thu Jan 10 2013 14:51:48 for Linux Kernel by
1.8.2