xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/atomic-10.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /* { dg-do run } */
2*404b540aSrobert /* { dg-options "-O2 -fopenmp" } */
3*404b540aSrobert 
4*404b540aSrobert extern void abort (void);
5*404b540aSrobert int x1, x2, x3, x4, x5;
6*404b540aSrobert volatile int y6 = 9, y2, y3, y4, y5;
7*404b540aSrobert volatile unsigned char z1, z2, z3, z4, z5;
8*404b540aSrobert float a1, a2, a3, a4;
9*404b540aSrobert 
10*404b540aSrobert void
f1(void)11*404b540aSrobert f1 (void)
12*404b540aSrobert {
13*404b540aSrobert   #pragma omp atomic
14*404b540aSrobert     x1++;
15*404b540aSrobert   #pragma omp atomic
16*404b540aSrobert     x2--;
17*404b540aSrobert   #pragma omp atomic
18*404b540aSrobert     ++x3;
19*404b540aSrobert   #pragma omp atomic
20*404b540aSrobert     --x4;
21*404b540aSrobert   #pragma omp atomic
22*404b540aSrobert     x5 += 1;
23*404b540aSrobert   #pragma omp atomic
24*404b540aSrobert     x1 -= y6;
25*404b540aSrobert   #pragma omp atomic
26*404b540aSrobert     x2 |= 1;
27*404b540aSrobert   #pragma omp atomic
28*404b540aSrobert     x3 &= 1;
29*404b540aSrobert   #pragma omp atomic
30*404b540aSrobert     x4 ^= 1;
31*404b540aSrobert   #pragma omp atomic
32*404b540aSrobert     x5 *= 3;
33*404b540aSrobert   #pragma omp atomic
34*404b540aSrobert     x1 /= 3;
35*404b540aSrobert   #pragma omp atomic
36*404b540aSrobert     x2 /= 3;
37*404b540aSrobert   #pragma omp atomic
38*404b540aSrobert     x3 <<= 3;
39*404b540aSrobert   #pragma omp atomic
40*404b540aSrobert     x4 >>= 3;
41*404b540aSrobert }
42*404b540aSrobert 
43*404b540aSrobert void
f2(void)44*404b540aSrobert f2 (void)
45*404b540aSrobert {
46*404b540aSrobert   #pragma omp atomic
47*404b540aSrobert     y6++;
48*404b540aSrobert   #pragma omp atomic
49*404b540aSrobert     y2--;
50*404b540aSrobert   #pragma omp atomic
51*404b540aSrobert     ++y3;
52*404b540aSrobert   #pragma omp atomic
53*404b540aSrobert     --y4;
54*404b540aSrobert   #pragma omp atomic
55*404b540aSrobert     y5 += 1;
56*404b540aSrobert   #pragma omp atomic
57*404b540aSrobert     y6 -= x1;
58*404b540aSrobert   #pragma omp atomic
59*404b540aSrobert     y2 |= 1;
60*404b540aSrobert   #pragma omp atomic
61*404b540aSrobert     y3 &= 1;
62*404b540aSrobert   #pragma omp atomic
63*404b540aSrobert     y4 ^= 1;
64*404b540aSrobert   #pragma omp atomic
65*404b540aSrobert     y5 *= 3;
66*404b540aSrobert   #pragma omp atomic
67*404b540aSrobert     y6 /= 3;
68*404b540aSrobert   #pragma omp atomic
69*404b540aSrobert     y2 /= 3;
70*404b540aSrobert   #pragma omp atomic
71*404b540aSrobert     y3 <<= 3;
72*404b540aSrobert   #pragma omp atomic
73*404b540aSrobert     y4 >>= 3;
74*404b540aSrobert }
75*404b540aSrobert 
76*404b540aSrobert void
f3(void)77*404b540aSrobert f3 (void)
78*404b540aSrobert {
79*404b540aSrobert   #pragma omp atomic
80*404b540aSrobert     z1++;
81*404b540aSrobert   #pragma omp atomic
82*404b540aSrobert     z2--;
83*404b540aSrobert   #pragma omp atomic
84*404b540aSrobert     ++z3;
85*404b540aSrobert   #pragma omp atomic
86*404b540aSrobert     --z4;
87*404b540aSrobert   #pragma omp atomic
88*404b540aSrobert     z5 += 1;
89*404b540aSrobert   #pragma omp atomic
90*404b540aSrobert     z1 |= 1;
91*404b540aSrobert   #pragma omp atomic
92*404b540aSrobert     z2 &= 1;
93*404b540aSrobert   #pragma omp atomic
94*404b540aSrobert     z3 ^= 1;
95*404b540aSrobert   #pragma omp atomic
96*404b540aSrobert     z4 *= 3;
97*404b540aSrobert   #pragma omp atomic
98*404b540aSrobert     z5 /= 3;
99*404b540aSrobert   #pragma omp atomic
100*404b540aSrobert     z1 /= 3;
101*404b540aSrobert   #pragma omp atomic
102*404b540aSrobert     z2 <<= 3;
103*404b540aSrobert   #pragma omp atomic
104*404b540aSrobert     z3 >>= 3;
105*404b540aSrobert }
106*404b540aSrobert 
107*404b540aSrobert void
f4(void)108*404b540aSrobert f4 (void)
109*404b540aSrobert {
110*404b540aSrobert   #pragma omp atomic
111*404b540aSrobert     a1 += 8.0;
112*404b540aSrobert   #pragma omp atomic
113*404b540aSrobert     a2 *= 3.5;
114*404b540aSrobert   #pragma omp atomic
115*404b540aSrobert     a3 -= a1 + a2;
116*404b540aSrobert   #pragma omp atomic
117*404b540aSrobert     a4 /= 2.0;
118*404b540aSrobert }
119*404b540aSrobert 
120*404b540aSrobert int
main(void)121*404b540aSrobert main (void)
122*404b540aSrobert {
123*404b540aSrobert   f1 ();
124*404b540aSrobert   if (x1 != -2 || x2 != 0 || x3 != 8 || x4 != -1 || x5 != 3)
125*404b540aSrobert     abort ();
126*404b540aSrobert   f2 ();
127*404b540aSrobert   if (y6 != 4 || y2 != 0 || y3 != 8 || y4 != -1 || y5 != 3)
128*404b540aSrobert     abort ();
129*404b540aSrobert   f3 ();
130*404b540aSrobert   if (z1 != 0 || z2 != 8 || z3 != 0 || z4 != 253 || z5 != 0)
131*404b540aSrobert     abort ();
132*404b540aSrobert   a1 = 7;
133*404b540aSrobert   a2 = 10;
134*404b540aSrobert   a3 = 11;
135*404b540aSrobert   a4 = 13;
136*404b540aSrobert   f4 ();
137*404b540aSrobert   if (a1 != 15.0 || a2 != 35.0 || a3 != -39.0 || a4 != 6.5)
138*404b540aSrobert     abort ();
139*404b540aSrobert   return 0;
140*404b540aSrobert }
141