aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/nvptx/atomic_fetch-2.c
blob: fa8d158cac3d3a8cc23cee0f7e603b77c23cbf05 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* Test the nvptx atomic instructions for __atomic_fetch_OP for SM_30
   targets.  */

/* { dg-do compile } */
/* { dg-options "-O2 -misa=sm_30" } */

enum memmodel
{
  MEMMODEL_RELAXED = 0
};

unsigned long long int *p64;
unsigned int *p32;

unsigned long long int g64;
unsigned int g32;

unsigned int s32 __attribute__((shared));
unsigned long long int s64 __attribute__((shared));

unsigned long long int v64;
unsigned int v32;

int
main()
{
  /* Generic.  */

  __atomic_fetch_add (p64, v64, MEMMODEL_RELAXED);
  __atomic_fetch_and (p64, v64, MEMMODEL_RELAXED);
  __atomic_fetch_or (p64, v64, MEMMODEL_RELAXED);
  __atomic_fetch_xor (p64, v64, MEMMODEL_RELAXED);
  
  __atomic_fetch_add (p32, v32, MEMMODEL_RELAXED);
  __atomic_fetch_and (p32, v32, MEMMODEL_RELAXED);
  __atomic_fetch_or (p32, v32, MEMMODEL_RELAXED);
  __atomic_fetch_xor (p32, v32, MEMMODEL_RELAXED);

  /* Global.  */

  __atomic_fetch_add (&g64, v64, MEMMODEL_RELAXED);
  __atomic_fetch_and (&g64, v64, MEMMODEL_RELAXED);
  __atomic_fetch_or (&g64, v64, MEMMODEL_RELAXED);
  __atomic_fetch_xor (&g64, v64, MEMMODEL_RELAXED);
  
  __atomic_fetch_add (&g32, v32, MEMMODEL_RELAXED);
  __atomic_fetch_and (&g32, v32, MEMMODEL_RELAXED);
  __atomic_fetch_or (&g32, v32, MEMMODEL_RELAXED);
  __atomic_fetch_xor (&g32, v32, MEMMODEL_RELAXED);

  /* Shared.  */

  __atomic_fetch_add (&s64, v64, MEMMODEL_RELAXED);
  __atomic_fetch_and (&s64, v64, MEMMODEL_RELAXED);
  __atomic_fetch_or (&s64, v64, MEMMODEL_RELAXED);
  __atomic_fetch_xor (&s64, v64, MEMMODEL_RELAXED);
  
  __atomic_fetch_add (&s32, v32, MEMMODEL_RELAXED);
  __atomic_fetch_and (&s32, v32, MEMMODEL_RELAXED);
  __atomic_fetch_or (&s32, v32, MEMMODEL_RELAXED);
  __atomic_fetch_xor (&s32, v32, MEMMODEL_RELAXED);

  return 0;
}

/* Generic.  */

/* { dg-final { scan-assembler-times "atom.add.u64" 1 } } */
/* { dg-final { scan-assembler-times "atom.cas.b64" 3 } } */

/* { dg-final { scan-assembler-times "atom.add.u32" 1 } } */
/* { dg-final { scan-assembler-times "atom.and.b32" 1 } } */
/* { dg-final { scan-assembler-times "atom.or.b32" 1 } } */
/* { dg-final { scan-assembler-times "atom.xor.b32" 1 } } */

/* Global.  */

/* { dg-final { scan-assembler-times "atom.global.add.u64" 1 } } */
/* { dg-final { scan-assembler-times "atom.global.cas.b64" 3 } } */

/* { dg-final { scan-assembler-times "atom.global.add.u32" 1 } } */
/* { dg-final { scan-assembler-times "atom.global.and.b32" 1 } } */
/* { dg-final { scan-assembler-times "atom.global.or.b32" 1 } } */
/* { dg-final { scan-assembler-times "atom.global.xor.b32" 1 } } */

/* Shared.  */

/* { dg-final { scan-assembler-times "atom.shared.add.u64" 1 } } */
/* { dg-final { scan-assembler-times "atom.shared.cas.b64" 3 } } */

/* { dg-final { scan-assembler-times "atom.shared.add.u32" 1 } } */
/* { dg-final { scan-assembler-times "atom.shared.and.b32" 1 } } */
/* { dg-final { scan-assembler-times "atom.shared.or.b32" 1 } } */
/* { dg-final { scan-assembler-times "atom.shared.xor.b32" 1 } } */