xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/atomic-1.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /* { dg-do run } */
2*404b540aSrobert /* { dg-options "-O2 -fopenmp" } */
3*404b540aSrobert /* { dg-options "-O2 -fopenmp -march=pentium" { target i?86-*-* x86_64-*-* } } */
4*404b540aSrobert /* { dg-options "-O2 -fopenmp" { target lp64 } } */
5*404b540aSrobert 
6*404b540aSrobert #ifdef __i386__
7*404b540aSrobert #include "../../../gcc/testsuite/gcc.dg/i386-cpuid.h"
8*404b540aSrobert #define bit_CX8 (1 << 8)
9*404b540aSrobert #endif
10*404b540aSrobert 
11*404b540aSrobert extern void abort (void);
12*404b540aSrobert double d;
13*404b540aSrobert struct
14*404b540aSrobert {
15*404b540aSrobert   int i;
16*404b540aSrobert   double e;
17*404b540aSrobert   int j;
18*404b540aSrobert } x;
19*404b540aSrobert 
20*404b540aSrobert void
f1(void)21*404b540aSrobert f1 (void)
22*404b540aSrobert {
23*404b540aSrobert   #pragma omp atomic
24*404b540aSrobert     d += 7.5;
25*404b540aSrobert   #pragma omp atomic
26*404b540aSrobert     d *= 2.5;
27*404b540aSrobert   #pragma omp atomic
28*404b540aSrobert     d /= 0.25;
29*404b540aSrobert }
30*404b540aSrobert 
31*404b540aSrobert void
f2(void)32*404b540aSrobert f2 (void)
33*404b540aSrobert {
34*404b540aSrobert   #pragma omp atomic
35*404b540aSrobert     x.e += 7.5;
36*404b540aSrobert   #pragma omp atomic
37*404b540aSrobert     x.e *= 2.5;
38*404b540aSrobert   #pragma omp atomic
39*404b540aSrobert     x.e /= 0.25;
40*404b540aSrobert }
41*404b540aSrobert 
42*404b540aSrobert int
main(void)43*404b540aSrobert main (void)
44*404b540aSrobert {
45*404b540aSrobert #ifdef __i386__
46*404b540aSrobert   unsigned long cpu_facilities;
47*404b540aSrobert 
48*404b540aSrobert   cpu_facilities = i386_cpuid ();
49*404b540aSrobert 
50*404b540aSrobert   if ((cpu_facilities & bit_CX8) == 0)
51*404b540aSrobert     return 0;
52*404b540aSrobert #endif
53*404b540aSrobert 
54*404b540aSrobert   d = 1.0;
55*404b540aSrobert   f1 ();
56*404b540aSrobert   if (d != 85.0)
57*404b540aSrobert     abort ();
58*404b540aSrobert 
59*404b540aSrobert   x.e = 1.0;
60*404b540aSrobert   f2 ();
61*404b540aSrobert   if (x.i != 0 || x.e != 85.0 || x.j != 0)
62*404b540aSrobert     abort ();
63*404b540aSrobert   return 0;
64*404b540aSrobert }
65