(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
nvptx/
atomic-exchange-1.c
       1  /* Test the atomic exchange expansion, shared state space.  */
       2  
       3  /* { dg-do compile } */
       4  /* { dg-options "-Wno-long-long" } */
       5  
       6  enum memmodel
       7  {
       8    MEMMODEL_SEQ_CST = 5
       9  };
      10  
      11  unsigned char u8 __attribute__((shared));
      12  unsigned short u16 __attribute__((shared));
      13  unsigned int u32 __attribute__((shared));
      14  unsigned long long int u64 __attribute__((shared));
      15  
      16  int
      17  main()
      18  {
      19    __atomic_exchange_n (&u8, 0, MEMMODEL_SEQ_CST);
      20    __atomic_exchange_n (&u16, 0, MEMMODEL_SEQ_CST);
      21    __atomic_exchange_n (&u32, 0, MEMMODEL_SEQ_CST);
      22    __atomic_exchange_n (&u64, 0, MEMMODEL_SEQ_CST);
      23  
      24    return 0;
      25  }
      26  
      27  
      28  /* Not ptx-native, fallback to libatomic.
      29     Libatomic uses generic addressing with a global lock and membar.sys barriers.
      30     We could implement these more efficiently by cloning libatomic for .shared,
      31     using a per-CTA lock and membar.cta barrier.  But we'd expect
      32     performance-critical code to use the ptx-native atomic sizes 32 and 64 bit,
      33     so that doesn't seem to be worth the trouble.  */
      34  /* { dg-final { scan-assembler-times "(?n)call .* __atomic_exchange_1" 1 } } */
      35  /* { dg-final { scan-assembler-times "(?n)call .* __atomic_exchange_2" 1 } } */
      36  
      37  /* { dg-final { scan-assembler-times "atom.shared.exch.b32" 1 } } */
      38  /* { dg-final { scan-assembler-times "atom.shared.exch.b64" 1 } } */
      39  /* { dg-final { scan-assembler-times "membar.cta" 4 } } */