diff options
Diffstat (limited to 'arch/x86/include/asm/bitops.h')
| -rw-r--r-- | arch/x86/include/asm/bitops.h | 24 | 
1 files changed, 4 insertions, 20 deletions
diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h index 41639ce8fd63..6d76d0935989 100644 --- a/arch/x86/include/asm/bitops.h +++ b/arch/x86/include/asm/bitops.h @@ -14,6 +14,7 @@  #include <linux/compiler.h>  #include <asm/alternative.h> +#include <asm/rmwcc.h>  #if BITS_PER_LONG == 32  # define _BITOPS_LONG_SHIFT 5 @@ -204,12 +205,7 @@ static inline void change_bit(long nr, volatile unsigned long *addr)   */  static inline int test_and_set_bit(long nr, volatile unsigned long *addr)  { -	int oldbit; - -	asm volatile(LOCK_PREFIX "bts %2,%1\n\t" -		     "sbb %0,%0" : "=r" (oldbit), ADDR : "Ir" (nr) : "memory"); - -	return oldbit; +	GEN_BINARY_RMWcc(LOCK_PREFIX "bts", *addr, nr, "%0", "c");  }  /** @@ -255,13 +251,7 @@ static inline int __test_and_set_bit(long nr, volatile unsigned long *addr)   */  static inline int test_and_clear_bit(long nr, volatile unsigned long *addr)  { -	int oldbit; - -	asm volatile(LOCK_PREFIX "btr %2,%1\n\t" -		     "sbb %0,%0" -		     : "=r" (oldbit), ADDR : "Ir" (nr) : "memory"); - -	return oldbit; +	GEN_BINARY_RMWcc(LOCK_PREFIX "btr", *addr, nr, "%0", "c");  }  /** @@ -314,13 +304,7 @@ static inline int __test_and_change_bit(long nr, volatile unsigned long *addr)   */  static inline int test_and_change_bit(long nr, volatile unsigned long *addr)  { -	int oldbit; - -	asm volatile(LOCK_PREFIX "btc %2,%1\n\t" -		     "sbb %0,%0" -		     : "=r" (oldbit), ADDR : "Ir" (nr) : "memory"); - -	return oldbit; +	GEN_BINARY_RMWcc(LOCK_PREFIX "btc", *addr, nr, "%0", "c");  }  static __always_inline int constant_test_bit(long nr, const volatile unsigned long *addr)  | 
