2005-04-17 02:20:36 +04:00
/*
2005-11-02 06:58:39 +03:00
* Copyright ( c ) 2000 , 2002 , 2005 Silicon Graphics , Inc .
* All Rights Reserved .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
2005-04-17 02:20:36 +04:00
* published by the Free Software Foundation .
*
2005-11-02 06:58:39 +03:00
* This program is distributed in the hope that it would be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
2005-04-17 02:20:36 +04:00
*/
# ifndef __XFS_BIT_H__
# define __XFS_BIT_H__
/*
* XFS bit manipulation routines .
*/
/*
2009-01-09 07:53:54 +03:00
* masks with n high / low bits set , 64 - bit values
2005-04-17 02:20:36 +04:00
*/
2005-11-02 06:38:42 +03:00
static inline __uint64_t xfs_mask64hi ( int n )
{
return ( __uint64_t ) - 1 < < ( 64 - ( n ) ) ;
}
static inline __uint32_t xfs_mask32lo ( int n )
{
return ( ( __uint32_t ) 1 < < ( n ) ) - 1 ;
}
static inline __uint64_t xfs_mask64lo ( int n )
{
return ( ( __uint64_t ) 1 < < ( n ) ) - 1 ;
}
2005-04-17 02:20:36 +04:00
/* Get high bit set out of 32-bit argument, -1 if none set */
2008-08-13 09:41:12 +04:00
static inline int xfs_highbit32 ( __uint32_t v )
{
return fls ( v ) - 1 ;
}
/* Get high bit set out of 64-bit argument, -1 if none set */
static inline int xfs_highbit64 ( __uint64_t v )
{
return fls64 ( v ) - 1 ;
}
/* Get low bit set out of 32-bit argument, -1 if none set */
static inline int xfs_lowbit32 ( __uint32_t v )
{
2008-10-30 09:05:38 +03:00
return ffs ( v ) - 1 ;
2008-08-13 09:41:12 +04:00
}
2007-11-23 08:27:59 +03:00
/* Get low bit set out of 64-bit argument, -1 if none set */
2008-08-13 09:41:12 +04:00
static inline int xfs_lowbit64 ( __uint64_t v )
{
__uint32_t w = ( __uint32_t ) v ;
int n = 0 ;
2008-02-26 09:00:22 +03:00
2008-08-13 09:41:12 +04:00
if ( w ) { /* lower bits */
n = ffs ( w ) ;
} else { /* upper bits */
w = ( __uint32_t ) ( v > > 32 ) ;
if ( w & & ( n = ffs ( w ) ) )
n + = 32 ;
}
return n - 1 ;
}
2005-04-17 02:20:36 +04:00
2007-06-28 10:43:30 +04:00
/* Return whether bitmap is empty (1 == empty) */
extern int xfs_bitmap_empty ( uint * map , uint size ) ;
2005-04-17 02:20:36 +04:00
/* Count continuous one bits in map starting with start_bit */
extern int xfs_contig_bits ( uint * map , uint size , uint start_bit ) ;
/* Find next set bit in map */
extern int xfs_next_bit ( uint * map , uint size , uint start_bit ) ;
# endif /* __XFS_BIT_H__ */