1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -mtune-ctrl=^himode_math" } */
       3  
       4  extern short foo;
       5  extern unsigned short 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\]*btrw" 2 } } */
      44  /* { dg-final { scan-assembler-times "lock;?\[ \t\]*btsw" 2 } } */
      45  /* { dg-final { scan-assembler-times "lock;?\[ \t\]*btcw" 2 } } */
      46  /* { dg-final { scan-assembler-not "cmpxchgw" } } */