mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
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>
This commit is contained in:
parent
d9aacccf45
commit
b311e921b3
@ -63,6 +63,15 @@ unsigned long __roundup_pow_of_two(unsigned long n)
|
|||||||
return 1UL << fls_long(n - 1);
|
return 1UL << fls_long(n - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* round down to nearest power of two
|
||||||
|
*/
|
||||||
|
static inline __attribute__((const))
|
||||||
|
unsigned long __rounddown_pow_of_two(unsigned long n)
|
||||||
|
{
|
||||||
|
return 1UL << (fls_long(n) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
|
* ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
|
||||||
* @n - parameter
|
* @n - parameter
|
||||||
@ -165,4 +174,20 @@ unsigned long __roundup_pow_of_two(unsigned long n)
|
|||||||
__roundup_pow_of_two(n) \
|
__roundup_pow_of_two(n) \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rounddown_pow_of_two - round the given value down to nearest power of two
|
||||||
|
* @n - parameter
|
||||||
|
*
|
||||||
|
* 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) ? ( \
|
||||||
|
(n == 1) ? 0 : \
|
||||||
|
(1UL << ilog2(n))) : \
|
||||||
|
__rounddown_pow_of_two(n) \
|
||||||
|
)
|
||||||
|
|
||||||
#endif /* _LINUX_LOG2_H */
|
#endif /* _LINUX_LOG2_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user