X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-m68k%2Fbitops.h;h=b1bcf7c66516f78bb4bbc553f0244f7b7535bb63;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=ec1e32ecb9144974acbf9a8469aed0740766d45a;hpb=db216c3d5e4c040e557a50f8f5d35d5c415e8c1c;p=linux-2.6.git diff --git a/include/asm-m68k/bitops.h b/include/asm-m68k/bitops.h index ec1e32ecb..b1bcf7c66 100644 --- a/include/asm-m68k/bitops.h +++ b/include/asm-m68k/bitops.h @@ -23,25 +23,24 @@ #define __test_and_set_bit(nr,vaddr) test_and_set_bit(nr,vaddr) -static inline int __constant_test_and_set_bit(int nr, - volatile unsigned long *vaddr) +static inline int __constant_test_and_set_bit(int nr, unsigned long *vaddr) { + char *p = (char *)vaddr + (nr ^ 31) / 8; char retval; __asm__ __volatile__ ("bset %2,%1; sne %0" - : "=d" (retval), "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) - : "di" (nr & 7)); + : "=d" (retval), "+m" (*p) + : "di" (nr & 7)); return retval; } -static inline int __generic_test_and_set_bit(int nr, - volatile unsigned long *vaddr) +static inline int __generic_test_and_set_bit(int nr, unsigned long *vaddr) { char retval; - __asm__ __volatile__ ("bfset %2@{%1:#1}; sne %0" - : "=d" (retval) : "d" (nr^31), "a" (vaddr) : "memory"); + __asm__ __volatile__ ("bfset %2{%1:#1}; sne %0" + : "=d" (retval) : "d" (nr^31), "o" (*vaddr) : "memory"); return retval; } @@ -55,14 +54,15 @@ static inline int __generic_test_and_set_bit(int nr, static inline void __constant_set_bit(int nr, volatile unsigned long *vaddr) { + char *p = (char *)vaddr + (nr ^ 31) / 8; __asm__ __volatile__ ("bset %1,%0" - : "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) : "di" (nr & 7)); + : "+m" (*p) : "di" (nr & 7)); } static inline void __generic_set_bit(int nr, volatile unsigned long *vaddr) { - __asm__ __volatile__ ("bfset %1@{%0:#1}" - : : "d" (nr^31), "a" (vaddr) : "memory"); + __asm__ __volatile__ ("bfset %1{%0:#1}" + : : "d" (nr^31), "o" (*vaddr) : "memory"); } #define test_and_clear_bit(nr,vaddr) \ @@ -72,25 +72,24 @@ static inline void __generic_set_bit(int nr, volatile unsigned long *vaddr) #define __test_and_clear_bit(nr,vaddr) test_and_clear_bit(nr,vaddr) -static inline int __constant_test_and_clear_bit(int nr, - volatile unsigned long *vaddr) +static inline int __constant_test_and_clear_bit(int nr, unsigned long *vaddr) { + char *p = (char *)vaddr + (nr ^ 31) / 8; char retval; __asm__ __volatile__ ("bclr %2,%1; sne %0" - : "=d" (retval), "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) - : "di" (nr & 7)); + : "=d" (retval), "+m" (*p) + : "di" (nr & 7)); return retval; } -static inline int __generic_test_and_clear_bit(int nr, - volatile unsigned long *vaddr) +static inline int __generic_test_and_clear_bit(int nr, unsigned long *vaddr) { char retval; - __asm__ __volatile__ ("bfclr %2@{%1:#1}; sne %0" - : "=d" (retval) : "d" (nr^31), "a" (vaddr) : "memory"); + __asm__ __volatile__ ("bfclr %2{%1:#1}; sne %0" + : "=d" (retval) : "d" (nr^31), "o" (*vaddr) : "memory"); return retval; } @@ -109,14 +108,15 @@ static inline int __generic_test_and_clear_bit(int nr, static inline void __constant_clear_bit(int nr, volatile unsigned long *vaddr) { + char *p = (char *)vaddr + (nr ^ 31) / 8; __asm__ __volatile__ ("bclr %1,%0" - : "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) : "di" (nr & 7)); + : "+m" (*p) : "di" (nr & 7)); } static inline void __generic_clear_bit(int nr, volatile unsigned long *vaddr) { - __asm__ __volatile__ ("bfclr %1@{%0:#1}" - : : "d" (nr^31), "a" (vaddr) : "memory"); + __asm__ __volatile__ ("bfclr %1{%0:#1}" + : : "d" (nr^31), "o" (*vaddr) : "memory"); } #define test_and_change_bit(nr,vaddr) \ @@ -127,25 +127,24 @@ static inline void __generic_clear_bit(int nr, volatile unsigned long *vaddr) #define __test_and_change_bit(nr,vaddr) test_and_change_bit(nr,vaddr) #define __change_bit(nr,vaddr) change_bit(nr,vaddr) -static inline int __constant_test_and_change_bit(int nr, - volatile unsigned long *vaddr) +static inline int __constant_test_and_change_bit(int nr, unsigned long *vaddr) { + char *p = (char *)vaddr + (nr ^ 31) / 8; char retval; __asm__ __volatile__ ("bchg %2,%1; sne %0" - : "=d" (retval), "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) - : "di" (nr & 7)); + : "=d" (retval), "+m" (*p) + : "di" (nr & 7)); return retval; } -static inline int __generic_test_and_change_bit(int nr, - volatile unsigned long *vaddr) +static inline int __generic_test_and_change_bit(int nr, unsigned long *vaddr) { char retval; - __asm__ __volatile__ ("bfchg %2@{%1:#1}; sne %0" - : "=d" (retval) : "d" (nr^31), "a" (vaddr) : "memory"); + __asm__ __volatile__ ("bfchg %2{%1:#1}; sne %0" + : "=d" (retval) : "d" (nr^31), "o" (*vaddr) : "memory"); return retval; } @@ -155,21 +154,22 @@ static inline int __generic_test_and_change_bit(int nr, __constant_change_bit(nr, vaddr) : \ __generic_change_bit(nr, vaddr)) -static inline void __constant_change_bit(int nr, volatile unsigned long *vaddr) +static inline void __constant_change_bit(int nr, unsigned long *vaddr) { + char *p = (char *)vaddr + (nr ^ 31) / 8; __asm__ __volatile__ ("bchg %1,%0" - : "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) : "di" (nr & 7)); + : "+m" (*p) : "di" (nr & 7)); } -static inline void __generic_change_bit(int nr, volatile unsigned long *vaddr) +static inline void __generic_change_bit(int nr, unsigned long *vaddr) { - __asm__ __volatile__ ("bfchg %1@{%0:#1}" - : : "d" (nr^31), "a" (vaddr) : "memory"); + __asm__ __volatile__ ("bfchg %1{%0:#1}" + : : "d" (nr^31), "o" (*vaddr) : "memory"); } -static inline int test_bit(int nr, const volatile unsigned long *vaddr) +static inline int test_bit(int nr, const unsigned long *vaddr) { - return ((1UL << (nr & 31)) & (((const volatile unsigned long *) vaddr)[nr >> 5])) != 0; + return (vaddr[nr >> 5] & (1UL << (nr & 31))) != 0; } static inline int find_first_zero_bit(const unsigned long *vaddr, @@ -364,76 +364,27 @@ static inline int minix_find_first_zero_bit(const void *vaddr, unsigned size) return ((p - addr) << 4) + (res ^ 31); } -static inline int minix_test_and_set_bit(int nr, volatile void *vaddr) -{ - char retval; - - __asm__ __volatile__ ("bfset %2{%1:#1}; sne %0" - : "=d" (retval) : "d" (nr^15), "m" (*(volatile char *)vaddr) : "memory"); - - return retval; -} - -#define minix_set_bit(nr,addr) ((void)minix_test_and_set_bit(nr,addr)) +#define minix_test_and_set_bit(nr, addr) test_and_set_bit((nr) ^ 16, (unsigned long *)(addr)) +#define minix_set_bit(nr,addr) set_bit((nr) ^ 16, (unsigned long *)(addr)) +#define minix_test_and_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 16, (unsigned long *)(addr)) -static inline int minix_test_and_clear_bit(int nr, volatile void *vaddr) +static inline int minix_test_bit(int nr, const void *vaddr) { - char retval; - - __asm__ __volatile__ ("bfclr %2{%1:#1}; sne %0" - : "=d" (retval) : "d" (nr^15), "m" (*(volatile char *) vaddr) : "memory"); - - return retval; -} - -static inline int minix_test_bit(int nr, const volatile void *vaddr) -{ - return ((1U << (nr & 15)) & (((const volatile unsigned short *) vaddr)[nr >> 4])) != 0; + const unsigned short *p = vaddr; + return (p[nr >> 4] & (1U << (nr & 15))) != 0; } /* Bitmap functions for the ext2 filesystem. */ -static inline int ext2_set_bit(int nr, volatile void *vaddr) -{ - char retval; - - __asm__ __volatile__ ("bfset %2{%1,#1}; sne %0" - : "=d" (retval) : "d" (nr^7), "m" (*(volatile char *) vaddr) : "memory"); - - return retval; -} - -static inline int ext2_clear_bit(int nr, volatile void *vaddr) -{ - char retval; - - __asm__ __volatile__ ("bfclr %2{%1,#1}; sne %0" - : "=d" (retval) : "d" (nr^7), "m" (*(volatile char *) vaddr) : "memory"); - - return retval; -} +#define ext2_set_bit(nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) +#define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) +#define ext2_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) +#define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) -#define ext2_set_bit_atomic(lock, nr, addr) \ - ({ \ - int ret; \ - spin_lock(lock); \ - ret = ext2_set_bit((nr), (addr)); \ - spin_unlock(lock); \ - ret; \ - }) - -#define ext2_clear_bit_atomic(lock, nr, addr) \ - ({ \ - int ret; \ - spin_lock(lock); \ - ret = ext2_clear_bit((nr), (addr)); \ - spin_unlock(lock); \ - ret; \ - }) - -static inline int ext2_test_bit(int nr, const volatile void *vaddr) +static inline int ext2_test_bit(int nr, const void *vaddr) { - return ((1U << (nr & 7)) & (((const volatile unsigned char *) vaddr)[nr >> 3])) != 0; + const unsigned char *p = vaddr; + return (p[nr >> 3] & (1U << (nr & 7))) != 0; } static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size)