aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert P. J. Day <rpjday@mindspring.com>2007-10-17 02:29:32 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-17 11:42:56 -0400
commitb311e921b385b5a848f0806df16276aca1ecae07 (patch)
tree957947e319b23150ddbbf7db52f9bdd24b6cdba5
parentd9aacccf457d07d729cfc7bf20ff0c7428357a9f (diff)
Add a "rounddown_pow_of_two" routine to log2.h
To go along with the existing "roundup_pow_of_two" routine, add one for rounding down since that operation appears to crop up on a regular basis in the source tree. [m.kozlowski@tuxland.pl: fix unbalanced parentheses] Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> Signed-off-by: Mariusz Kozlowski <m.kozlowski@tuxland.pl> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/log2.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/include/linux/log2.h b/include/linux/log2.h
index 1b8a2c1cb0e3..c8cf5e8ef171 100644
--- a/include/linux/log2.h
+++ b/include/linux/log2.h
@@ -63,6 +63,15 @@ unsigned long __roundup_pow_of_two(unsigned long n)
63 return 1UL << fls_long(n - 1); 63 return 1UL << fls_long(n - 1);
64} 64}
65 65
66/*
67 * round down to nearest power of two
68 */
69static inline __attribute__((const))
70unsigned long __rounddown_pow_of_two(unsigned long n)
71{
72 return 1UL << (fls_long(n) - 1);
73}
74
66/** 75/**
67 * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value 76 * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
68 * @n - parameter 77 * @n - parameter
@@ -165,4 +174,20 @@ unsigned long __roundup_pow_of_two(unsigned long n)
165 __roundup_pow_of_two(n) \ 174 __roundup_pow_of_two(n) \
166 ) 175 )
167 176
177/**
178 * rounddown_pow_of_two - round the given value down to nearest power of two
179 * @n - parameter
180 *
181 * round the given value down to the nearest power of two
182 * - the result is undefined when n == 0
183 * - this can be used to initialise global variables from constant data
184 */
185#define rounddown_pow_of_two(n) \
186( \
187 __builtin_constant_p(n) ? ( \
188 (n == 1) ? 0 : \
189 (1UL << ilog2(n))) : \
190 __rounddown_pow_of_two(n) \
191 )
192
168#endif /* _LINUX_LOG2_H */ 193#endif /* _LINUX_LOG2_H */