2005-04-16 16:20:36 -06:00
|
|
|
#ifndef _LINUX_BITOPS_H
|
|
|
|
#define _LINUX_BITOPS_H
|
|
|
|
#include <asm/types.h>
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Include this here because some architectures need generic_ffs/fls in
|
|
|
|
* scope
|
|
|
|
*/
|
|
|
|
#include <asm/bitops.h>
|
|
|
|
|
|
|
|
static __inline__ int get_bitmask_order(unsigned int count)
|
|
|
|
{
|
|
|
|
int order;
|
|
|
|
|
|
|
|
order = fls(count);
|
|
|
|
return order; /* We could be slightly more clever with -1 here... */
|
|
|
|
}
|
|
|
|
|
2005-11-05 09:25:54 -07:00
|
|
|
static __inline__ int get_count_order(unsigned int count)
|
|
|
|
{
|
|
|
|
int order;
|
|
|
|
|
|
|
|
order = fls(count) - 1;
|
|
|
|
if (count & (count - 1))
|
|
|
|
order++;
|
|
|
|
return order;
|
|
|
|
}
|
|
|
|
|
2005-04-16 16:20:36 -06:00
|
|
|
static inline unsigned long hweight_long(unsigned long w)
|
|
|
|
{
|
2006-03-26 02:39:55 -07:00
|
|
|
return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
|
2005-04-16 16:20:36 -06:00
|
|
|
}
|
|
|
|
|
2007-01-26 01:57:09 -07:00
|
|
|
/**
|
2005-04-16 16:20:36 -06:00
|
|
|
* rol32 - rotate a 32-bit value left
|
|
|
|
* @word: value to rotate
|
|
|
|
* @shift: bits to roll
|
|
|
|
*/
|
|
|
|
static inline __u32 rol32(__u32 word, unsigned int shift)
|
|
|
|
{
|
|
|
|
return (word << shift) | (word >> (32 - shift));
|
|
|
|
}
|
|
|
|
|
2007-01-26 01:57:09 -07:00
|
|
|
/**
|
2005-04-16 16:20:36 -06:00
|
|
|
* ror32 - rotate a 32-bit value right
|
|
|
|
* @word: value to rotate
|
|
|
|
* @shift: bits to roll
|
|
|
|
*/
|
|
|
|
static inline __u32 ror32(__u32 word, unsigned int shift)
|
|
|
|
{
|
|
|
|
return (word >> shift) | (word << (32 - shift));
|
|
|
|
}
|
|
|
|
|
2006-03-25 04:08:01 -07:00
|
|
|
static inline unsigned fls_long(unsigned long l)
|
|
|
|
{
|
|
|
|
if (sizeof(l) == 4)
|
|
|
|
return fls(l);
|
|
|
|
return fls64(l);
|
|
|
|
}
|
|
|
|
|
2005-04-16 16:20:36 -06:00
|
|
|
#endif
|