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