diff options
Diffstat (limited to 'arch/m68k/include/asm/bitops.h')
| -rw-r--r-- | arch/m68k/include/asm/bitops.h | 57 | 
1 files changed, 26 insertions, 31 deletions
diff --git a/arch/m68k/include/asm/bitops.h b/arch/m68k/include/asm/bitops.h index ad971b4f3..525d90ccb 100644 --- a/arch/m68k/include/asm/bitops.h +++ b/arch/m68k/include/asm/bitops.h @@ -17,41 +17,36 @@ extern int test_and_change_bit(int nr, volatile void *addr);  #ifdef __KERNEL__ -/* - * ffs: find first bit set. This is defined the same way as - * the libc and compiler builtin ffs routines, therefore - * differs in spirit from the above ffz (man ffs). - */ -extern __inline__ int ffs(int x) + +extern inline int test_bit(int nr, __const__ volatile void *addr) +{ +	__const__ unsigned int *p = (__const__ unsigned int *) addr; + +	return (p[nr >> 5] & (1UL << (nr & 31))) != 0; +} + +extern inline int test_and_set_bit(int nr, volatile void *vaddr)  { -	int r = 1; +	char retval; + +	volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; +	__asm__ __volatile__ ("bset %2,(%4); sne %0" +	     : "=d" (retval), "=m" (*p) +	     : "di" (nr & 7), "m" (*p), "a" (p)); -	if (!x) -		return 0; -	if (!(x & 0xffff)) { -		x >>= 16; -		r += 16; -	} -	if (!(x & 0xff)) { -		x >>= 8; -		r += 8; -	} -	if (!(x & 0xf)) { -		x >>= 4; -		r += 4; -	} -	if (!(x & 3)) { -		x >>= 2; -		r += 2; -	} -	if (!(x & 1)) { -		x >>= 1; -		r += 1; -	} -	return r; +	return retval;  } +  #define __ffs(x) (ffs(x) - 1) -#define PLATFORM_FFS + +/* + *  * hweightN: returns the hamming weight (i.e. the number + *   * of bits set) of a N-bit word + *    */ + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x)  #endif /* __KERNEL__ */  |