(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
nvptx/
atomic_fetch-2.c
       1  /* Test the nvptx atomic instructions for __atomic_fetch_OP for SM_30
       2     targets.  */
       3  
       4  /* { dg-do compile } */
       5  /* { dg-options "-O2 -misa=sm_30" } */
       6  
       7  enum memmodel
       8  {
       9    MEMMODEL_RELAXED = 0
      10  };
      11  
      12  unsigned long long int *p64;
      13  unsigned int *p32;
      14  
      15  unsigned long long int g64;
      16  unsigned int g32;
      17  
      18  unsigned int s32 __attribute__((shared));
      19  unsigned long long int s64 __attribute__((shared));
      20  
      21  unsigned long long int v64;
      22  unsigned int v32;
      23  
      24  int
      25  main()
      26  {
      27    /* Generic.  */
      28  
      29    __atomic_fetch_add (p64, v64, MEMMODEL_RELAXED);
      30    __atomic_fetch_and (p64, v64, MEMMODEL_RELAXED);
      31    __atomic_fetch_or (p64, v64, MEMMODEL_RELAXED);
      32    __atomic_fetch_xor (p64, v64, MEMMODEL_RELAXED);
      33    
      34    __atomic_fetch_add (p32, v32, MEMMODEL_RELAXED);
      35    __atomic_fetch_and (p32, v32, MEMMODEL_RELAXED);
      36    __atomic_fetch_or (p32, v32, MEMMODEL_RELAXED);
      37    __atomic_fetch_xor (p32, v32, MEMMODEL_RELAXED);
      38  
      39    /* Global.  */
      40  
      41    __atomic_fetch_add (&g64, v64, MEMMODEL_RELAXED);
      42    __atomic_fetch_and (&g64, v64, MEMMODEL_RELAXED);
      43    __atomic_fetch_or (&g64, v64, MEMMODEL_RELAXED);
      44    __atomic_fetch_xor (&g64, v64, MEMMODEL_RELAXED);
      45    
      46    __atomic_fetch_add (&g32, v32, MEMMODEL_RELAXED);
      47    __atomic_fetch_and (&g32, v32, MEMMODEL_RELAXED);
      48    __atomic_fetch_or (&g32, v32, MEMMODEL_RELAXED);
      49    __atomic_fetch_xor (&g32, v32, MEMMODEL_RELAXED);
      50  
      51    /* Shared.  */
      52  
      53    __atomic_fetch_add (&s64, v64, MEMMODEL_RELAXED);
      54    __atomic_fetch_and (&s64, v64, MEMMODEL_RELAXED);
      55    __atomic_fetch_or (&s64, v64, MEMMODEL_RELAXED);
      56    __atomic_fetch_xor (&s64, v64, MEMMODEL_RELAXED);
      57    
      58    __atomic_fetch_add (&s32, v32, MEMMODEL_RELAXED);
      59    __atomic_fetch_and (&s32, v32, MEMMODEL_RELAXED);
      60    __atomic_fetch_or (&s32, v32, MEMMODEL_RELAXED);
      61    __atomic_fetch_xor (&s32, v32, MEMMODEL_RELAXED);
      62  
      63    return 0;
      64  }
      65  
      66  /* Generic.  */
      67  
      68  /* { dg-final { scan-assembler-times "atom.add.u64" 1 } } */
      69  /* { dg-final { scan-assembler-times "atom.cas.b64" 3 } } */
      70  
      71  /* { dg-final { scan-assembler-times "atom.add.u32" 1 } } */
      72  /* { dg-final { scan-assembler-times "atom.and.b32" 1 } } */
      73  /* { dg-final { scan-assembler-times "atom.or.b32" 1 } } */
      74  /* { dg-final { scan-assembler-times "atom.xor.b32" 1 } } */
      75  
      76  /* Global.  */
      77  
      78  /* { dg-final { scan-assembler-times "atom.global.add.u64" 1 } } */
      79  /* { dg-final { scan-assembler-times "atom.global.cas.b64" 3 } } */
      80  
      81  /* { dg-final { scan-assembler-times "atom.global.add.u32" 1 } } */
      82  /* { dg-final { scan-assembler-times "atom.global.and.b32" 1 } } */
      83  /* { dg-final { scan-assembler-times "atom.global.or.b32" 1 } } */
      84  /* { dg-final { scan-assembler-times "atom.global.xor.b32" 1 } } */
      85  
      86  /* Shared.  */
      87  
      88  /* { dg-final { scan-assembler-times "atom.shared.add.u64" 1 } } */
      89  /* { dg-final { scan-assembler-times "atom.shared.cas.b64" 3 } } */
      90  
      91  /* { dg-final { scan-assembler-times "atom.shared.add.u32" 1 } } */
      92  /* { dg-final { scan-assembler-times "atom.shared.and.b32" 1 } } */
      93  /* { dg-final { scan-assembler-times "atom.shared.or.b32" 1 } } */
      94  /* { dg-final { scan-assembler-times "atom.shared.xor.b32" 1 } } */