Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merge branch 'devel'
[palacios.git] / kitten / include / lwk / log2.h
1 /* Integer base 2 logarithm calculation
2  *
3  * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
4  * Written by David Howells (dhowells@redhat.com)
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 _LWK_LOG2_H
13 #define _LWK_LOG2_H
14
15 #include <lwk/types.h>
16 #include <lwk/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 1UL << fls_long(n - 1);
64 }
65
66 /**
67  * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
68  * @n - parameter
69  *
70  * constant-capable log of base 2 calculation
71  * - this can be used to initialise global variables from constant data, hence
72  *   the massive ternary operator construction
73  *
74  * selects the appropriately-sized optimised version depending on sizeof(n)
75  */
76 #define ilog2(n)                                \
77 (                                               \
78         __builtin_constant_p(n) ? (             \
79                 (n) < 1 ? ____ilog2_NaN() :     \
80                 (n) & (1ULL << 63) ? 63 :       \
81                 (n) & (1ULL << 62) ? 62 :       \
82                 (n) & (1ULL << 61) ? 61 :       \
83                 (n) & (1ULL << 60) ? 60 :       \
84                 (n) & (1ULL << 59) ? 59 :       \
85                 (n) & (1ULL << 58) ? 58 :       \
86                 (n) & (1ULL << 57) ? 57 :       \
87                 (n) & (1ULL << 56) ? 56 :       \
88                 (n) & (1ULL << 55) ? 55 :       \
89                 (n) & (1ULL << 54) ? 54 :       \
90                 (n) & (1ULL << 53) ? 53 :       \
91                 (n) & (1ULL << 52) ? 52 :       \
92                 (n) & (1ULL << 51) ? 51 :       \
93                 (n) & (1ULL << 50) ? 50 :       \
94                 (n) & (1ULL << 49) ? 49 :       \
95                 (n) & (1ULL << 48) ? 48 :       \
96                 (n) & (1ULL << 47) ? 47 :       \
97                 (n) & (1ULL << 46) ? 46 :       \
98                 (n) & (1ULL << 45) ? 45 :       \
99                 (n) & (1ULL << 44) ? 44 :       \
100                 (n) & (1ULL << 43) ? 43 :       \
101                 (n) & (1ULL << 42) ? 42 :       \
102                 (n) & (1ULL << 41) ? 41 :       \
103                 (n) & (1ULL << 40) ? 40 :       \
104                 (n) & (1ULL << 39) ? 39 :       \
105                 (n) & (1ULL << 38) ? 38 :       \
106                 (n) & (1ULL << 37) ? 37 :       \
107                 (n) & (1ULL << 36) ? 36 :       \
108                 (n) & (1ULL << 35) ? 35 :       \
109                 (n) & (1ULL << 34) ? 34 :       \
110                 (n) & (1ULL << 33) ? 33 :       \
111                 (n) & (1ULL << 32) ? 32 :       \
112                 (n) & (1ULL << 31) ? 31 :       \
113                 (n) & (1ULL << 30) ? 30 :       \
114                 (n) & (1ULL << 29) ? 29 :       \
115                 (n) & (1ULL << 28) ? 28 :       \
116                 (n) & (1ULL << 27) ? 27 :       \
117                 (n) & (1ULL << 26) ? 26 :       \
118                 (n) & (1ULL << 25) ? 25 :       \
119                 (n) & (1ULL << 24) ? 24 :       \
120                 (n) & (1ULL << 23) ? 23 :       \
121                 (n) & (1ULL << 22) ? 22 :       \
122                 (n) & (1ULL << 21) ? 21 :       \
123                 (n) & (1ULL << 20) ? 20 :       \
124                 (n) & (1ULL << 19) ? 19 :       \
125                 (n) & (1ULL << 18) ? 18 :       \
126                 (n) & (1ULL << 17) ? 17 :       \
127                 (n) & (1ULL << 16) ? 16 :       \
128                 (n) & (1ULL << 15) ? 15 :       \
129                 (n) & (1ULL << 14) ? 14 :       \
130                 (n) & (1ULL << 13) ? 13 :       \
131                 (n) & (1ULL << 12) ? 12 :       \
132                 (n) & (1ULL << 11) ? 11 :       \
133                 (n) & (1ULL << 10) ? 10 :       \
134                 (n) & (1ULL <<  9) ?  9 :       \
135                 (n) & (1ULL <<  8) ?  8 :       \
136                 (n) & (1ULL <<  7) ?  7 :       \
137                 (n) & (1ULL <<  6) ?  6 :       \
138                 (n) & (1ULL <<  5) ?  5 :       \
139                 (n) & (1ULL <<  4) ?  4 :       \
140                 (n) & (1ULL <<  3) ?  3 :       \
141                 (n) & (1ULL <<  2) ?  2 :       \
142                 (n) & (1ULL <<  1) ?  1 :       \
143                 (n) & (1ULL <<  0) ?  0 :       \
144                 ____ilog2_NaN()                 \
145                                    ) :          \
146         (sizeof(n) <= 4) ?                      \
147         __ilog2_u32(n) :                        \
148         __ilog2_u64(n)                          \
149  )
150
151 /**
152  * roundup_pow_of_two - round the given value up to nearest power of two
153  * @n - parameter
154  *
155  * round the given value up to the nearest power of two
156  * - the result is undefined when n == 0
157  * - this can be used to initialise global variables from constant data
158  */
159 #define roundup_pow_of_two(n)                   \
160 (                                               \
161         __builtin_constant_p(n) ? (             \
162                 (n == 1) ? 1 :                  \
163                 (1UL << (ilog2((n) - 1) + 1))   \
164                                    ) :          \
165         __roundup_pow_of_two(n)                 \
166  )
167
168 #endif /* _LWK_LOG2_H */