(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
pr103194-4.c
       1  /* { dg-do compile } */
       2  /* { dg-options "-O2" } */
       3  #include <stdatomic.h>
       4  #include <stdbool.h>
       5  
       6  #define FOO(RTYPE,TYPE)							\
       7    __attribute__((noinline,noclone)) RTYPE				\
       8    atomic_fetch_or_##TYPE##_##MASK (_Atomic TYPE* a, TYPE MASK)		\
       9    {									\
      10      TYPE mask = 1 << MASK;						\
      11      return __atomic_fetch_or (a, mask, __ATOMIC_RELAXED) & mask;	\
      12    }									\
      13    __attribute__((noinline,noclone)) RTYPE				\
      14    atomic_fetch_xor_##TYPE##_##MASK (_Atomic TYPE* a, TYPE MASK)		\
      15    {									\
      16      TYPE mask = 1 << MASK;						\
      17      return __atomic_fetch_xor (a, mask, __ATOMIC_RELAXED) & mask;	\
      18    }									\
      19    __attribute__((noinline,noclone)) RTYPE				\
      20    atomic_xor_fetch_##TYPE##_##MASK (_Atomic TYPE* a, TYPE MASK)		\
      21    {									\
      22      TYPE mask = 1 << MASK;						\
      23      return __atomic_xor_fetch (a, mask, __ATOMIC_RELAXED) & mask;	\
      24    }									\
      25    __attribute__((noinline,noclone)) RTYPE				\
      26    atomic_fetch_and_##TYPE##_##MASK (_Atomic TYPE* a, TYPE MASK)		\
      27    {									\
      28      TYPE mask = 1 << MASK;						\
      29      return __atomic_fetch_and (a, ~mask, __ATOMIC_RELAXED) & mask;	\
      30    }									\
      31    __attribute__((noinline,noclone)) RTYPE				\
      32    sync_fetch_and_or_##TYPE##_##MASK (_Atomic TYPE* a, TYPE MASK)	\
      33    {									\
      34      TYPE mask = 1 << MASK;						\
      35      return __sync_fetch_and_or (a, mask) & mask;			\
      36    }									\
      37    __attribute__((noinline,noclone)) RTYPE				\
      38    sync_fetch_and_xor_##TYPE##_##MASK (_Atomic TYPE* a, TYPE MASK)	\
      39    {									\
      40      TYPE mask = 1 << MASK;						\
      41      return __sync_fetch_and_xor (a, mask) & mask;			\
      42    }									\
      43    __attribute__((noinline,noclone)) RTYPE				\
      44    sync_xor_and_fetch_##TYPE##_##MASK (_Atomic TYPE* a, TYPE MASK)	\
      45    {									\
      46      TYPE mask = 1 << MASK;						\
      47      return __sync_xor_and_fetch (a, mask) & mask;			\
      48    }									\
      49    __attribute__((noinline,noclone)) RTYPE				\
      50    sync_fetch_and_and_##TYPE##_##MASK (_Atomic TYPE* a, TYPE MASK)	\
      51    {									\
      52      TYPE mask = 1 << MASK;						\
      53      return __sync_fetch_and_and (a, ~mask) & mask;			\
      54    }									\
      55  
      56  FOO(short, int);
      57  
      58  /* { dg-final { scan-assembler-times "lock;?\[ \t\]*bts" 2 } } */
      59  /* { dg-final { scan-assembler-times "lock;?\[ \t\]*btc" 4 } } */
      60  /* { dg-final { scan-assembler-times "lock;?\[ \t\]*btr" 2 } } */
      61  /* { dg-final { scan-assembler-not "cmpxchg" } } */