1  /* { dg-do compile } */
       2  /* { dg-options "-O2" } */
       3  
       4  #include <stdatomic.h>
       5  #include <stdbool.h>
       6  
       7  #define MASK 0x1234
       8  
       9  bool
      10  foo1 (_Atomic long *v)
      11  {
      12    return atomic_fetch_and_explicit (v, ~MASK, memory_order_relaxed) & MASK;
      13  }
      14  
      15  bool
      16  foo2 (_Atomic long *v, long mask)
      17  {
      18    return atomic_fetch_and_explicit (v, ~mask, memory_order_relaxed) & mask;
      19  }
      20  
      21  bool
      22  foo3 (_Atomic long *v, long mask)
      23  {
      24    return !(atomic_fetch_and_explicit (v, ~mask, memory_order_relaxed) & mask);
      25  }
      26  
      27  /* { dg-final { scan-assembler-times "lock;?\[ \t\]*cmpxchg" 3 } } */
      28  /* { dg-final { scan-assembler-not "btr" } } */