@ -3,6 +3,11 @@
*
* Copyright ( C ) 2006 Red Hat , Inc . All Rights Reserved .
* Written by David Howells ( dhowells @ redhat . com )
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
# ifndef _LINUX_LOG2_H
@ -12,12 +17,6 @@
# include <linux/bitops.h>
/*
* deal with unrepresentable constant logarithms
*/
extern __attribute__ ( ( const , noreturn ) )
int ____ilog2_NaN ( void ) ;
/*
* 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 ( )
@ -39,19 +38,23 @@ int __ilog2_u64(u64 n)
}
# endif
/*
* Determine whether some value is a power of two , where zero is
/**
* 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
* * not * considered a power of two .
* Return : true if @ n is a power of 2 , otherwise false .
*/
static inline __attribute__ ( ( const ) )
bool is_power_of_2 ( unsigned long n )
{
return ( n ! = 0 & & ( ( n & ( n - 1 ) ) = = 0 ) ) ;
}
/*
* round up to nearest power of two
/**
* __roundup_pow_of_two ( ) - round up to nearest power of two
* @ n : value to round up
*/
static inline __attribute__ ( ( const ) )
unsigned long __roundup_pow_of_two ( unsigned long n )
@ -59,8 +62,9 @@ unsigned long __roundup_pow_of_two(unsigned long n)
return 1UL < < fls_long ( n - 1 ) ;
}
/*
* round down to nearest power of two
/**
* __rounddown_pow_of_two ( ) - round down to nearest power of two
* @ n : value to round down
*/
static inline __attribute__ ( ( const ) )
unsigned long __rounddown_pow_of_two ( unsigned long n )
@ -69,19 +73,19 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
}
/**
* ilog2 - log of base 2 of 32 - bit or a 64 - bit unsigned value
* @ n - parameter
* 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
* the massive ternary operator construction
*
* selects the appropriately - sized optimised version depending on sizeof ( n )
*/
# define ilog2(n) \
( \
__builtin_constant_p ( n ) ? ( \
( n ) < 1 ? ____ilog2_NaN ( ) : \
( n ) < 2 ? 0 : \
( n ) & ( 1ULL < < 63 ) ? 63 : \
( n ) & ( 1ULL < < 62 ) ? 62 : \
( n ) & ( 1ULL < < 61 ) ? 61 : \
@ -144,10 +148,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
( n ) & ( 1ULL < < 4 ) ? 4 : \
( n ) & ( 1ULL < < 3 ) ? 3 : \
( n ) & ( 1ULL < < 2 ) ? 2 : \
( n ) & ( 1ULL < < 1 ) ? 1 : \
( n ) & ( 1ULL < < 0 ) ? 0 : \
____ilog2_NaN ( ) \
) : \
1 ) : \
( sizeof ( n ) < = 4 ) ? \
__ilog2_u32 ( n ) : \
__ilog2_u64 ( n ) \
@ -155,7 +156,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
/**
* roundup_pow_of_two - round the given value up to nearest power of two
* @ n - parameter
* @ n : parameter
*
* round the given value up to the nearest power of two
* - the result is undefined when n = = 0
@ -172,7 +173,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
/**
* rounddown_pow_of_two - round the given value down to nearest power of two
* @ n - parameter
* @ n : parameter
*
* round the given value down to the nearest power of two
* - the result is undefined when n = = 0
@ -185,6 +186,12 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
__rounddown_pow_of_two ( n ) \
)
static inline __attribute_const__
int __order_base_2 ( unsigned long n )
{
return n > 1 ? ilog2 ( n - 1 ) + 1 : 0 ;
}
/**
* order_base_2 - calculate the ( rounded up ) base 2 order of the argument
* @ n : parameter
@ -198,7 +205,11 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
* ob2 ( 5 ) = 3
* . . . and so on .
*/
# define order_base_2(n) ilog2(roundup_pow_of_two(n))
# define order_base_2(n) \
( \
__builtin_constant_p ( n ) ? ( \
( ( n ) = = 0 | | ( n ) = = 1 ) ? 0 : \
ilog2 ( ( n ) - 1 ) + 1 ) : \
__order_base_2 ( n ) \
)
# endif /* _LINUX_LOG2_H */