1 /* Test the nvptx atomic instructions for __atomic_fetch_OP for SM_35
2 targets. */
3
4 /* { dg-do compile } */
5 /* { dg-options "-O2 -misa=sm_35" } */
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.and.b64" 1 } } */
70 /* { dg-final { scan-assembler-times "atom.or.b64" 1 } } */
71 /* { dg-final { scan-assembler-times "atom.xor.b64" 1 } } */
72
73 /* { dg-final { scan-assembler-times "atom.add.u32" 1 } } */
74 /* { dg-final { scan-assembler-times "atom.and.b32" 1 } } */
75 /* { dg-final { scan-assembler-times "atom.or.b32" 1 } } */
76 /* { dg-final { scan-assembler-times "atom.xor.b32" 1 } } */
77
78 /* Global. */
79
80 /* { dg-final { scan-assembler-times "atom.global.add.u64" 1 } } */
81 /* { dg-final { scan-assembler-times "atom.global.and.b64" 1 } } */
82 /* { dg-final { scan-assembler-times "atom.global.or.b64" 1 } } */
83 /* { dg-final { scan-assembler-times "atom.global.xor.b64" 1 } } */
84
85 /* { dg-final { scan-assembler-times "atom.global.add.u32" 1 } } */
86 /* { dg-final { scan-assembler-times "atom.global.and.b32" 1 } } */
87 /* { dg-final { scan-assembler-times "atom.global.or.b32" 1 } } */
88 /* { dg-final { scan-assembler-times "atom.global.xor.b32" 1 } } */
89
90 /* Shared. */
91
92 /* { dg-final { scan-assembler-times "atom.shared.add.u64" 1 } } */
93 /* { dg-final { scan-assembler-times "atom.shared.and.b64" 1 } } */
94 /* { dg-final { scan-assembler-times "atom.shared.or.b64" 1 } } */
95 /* { dg-final { scan-assembler-times "atom.shared.xor.b64" 1 } } */
96
97 /* { dg-final { scan-assembler-times "atom.shared.add.u32" 1 } } */
98 /* { dg-final { scan-assembler-times "atom.shared.and.b32" 1 } } */
99 /* { dg-final { scan-assembler-times "atom.shared.or.b32" 1 } } */
100 /* { dg-final { scan-assembler-times "atom.shared.xor.b32" 1 } } */