1 /* { dg-do compile { target { ! ia32 } } } */ 2 /* { dg-options "-O2" } */ 3 4 #include <stdatomic.h> 5 #include <stdbool.h> 6 7 bool foo0(_Atomic long long * v)8foo0 (_Atomic long long *v) 9 { 10 #define BIT (1ll << 0) 11 return !(atomic_fetch_and_explicit (v, ~BIT, memory_order_relaxed) & BIT); 12 #undef BIT 13 } 14 15 bool foo30(_Atomic long long * v)16foo30 (_Atomic long long *v) 17 { 18 #define BIT (1ll << 62) 19 return !(atomic_fetch_and_explicit (v, ~BIT, memory_order_relaxed) & BIT); 20 #undef BIT 21 } 22 23 bool foo31(_Atomic long long * v)24foo31 (_Atomic long long *v) 25 { 26 #define BIT (1ll << 63) 27 return !(atomic_fetch_and_explicit (v, ~BIT, memory_order_relaxed) & BIT); 28 #undef BIT 29 } 30 31 /* { dg-final { scan-assembler-times "lock;?\[ \t\]*btrq" 3 } } */ 32 /* { dg-final { scan-assembler-not "cmpxchg" } } */ 33