1  /* { dg-do compile } */
       2  /* { dg-options "-O2" } */
       3  
       4  extern char foo;
       5  extern unsigned char bar;
       6  
       7  int
       8  foo1 (void)
       9  {
      10    return __sync_fetch_and_and (&foo, ~1) & 1;
      11  }
      12  
      13  int
      14  foo2 (void)
      15  {
      16    return __sync_fetch_and_or (&foo, 1) & 1;
      17  }
      18  
      19  int
      20  foo3 (void)
      21  {
      22    return __sync_fetch_and_xor (&foo, 1) & 1;
      23  }
      24  
      25  unsigned short
      26  bar1 (void)
      27  {
      28    return __sync_fetch_and_and (&bar, ~1) & 1;
      29  }
      30  
      31  unsigned short
      32  bar2 (void)
      33  {
      34    return __sync_fetch_and_or (&bar, 1) & 1;
      35  }
      36  
      37  unsigned short
      38  bar3 (void)
      39  {
      40    return __sync_fetch_and_xor (&bar, 1) & 1;
      41  }
      42  
      43  /* { dg-final { scan-assembler-times "lock;?\[ \t\]*cmpxchgb" 6 { target { x86_64-*-* i?86-*-* } } } } */