xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/atomic-2.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /* { dg-do run } */
2*404b540aSrobert /* { dg-options "-O2 -fopenmp" } */
3*404b540aSrobert /* { dg-options "-O2 -fopenmp -march=nocona" { target i?86-*-* x86_64-*-* } } */
4*404b540aSrobert /* { dg-options "-O2 -fopenmp" { target ilp32 } } */
5*404b540aSrobert 
6*404b540aSrobert double d = 1.5;
7*404b540aSrobert long double ld = 3;
8*404b540aSrobert extern void abort (void);
9*404b540aSrobert 
10*404b540aSrobert void
test(void)11*404b540aSrobert test (void)
12*404b540aSrobert {
13*404b540aSrobert #pragma omp atomic
14*404b540aSrobert   d *= 1.25;
15*404b540aSrobert #pragma omp atomic
16*404b540aSrobert   ld /= 0.75;
17*404b540aSrobert   if (d != 1.875 || ld != 4.0L)
18*404b540aSrobert     abort ();
19*404b540aSrobert }
20*404b540aSrobert 
21*404b540aSrobert int
main(void)22*404b540aSrobert main (void)
23*404b540aSrobert {
24*404b540aSrobert #ifdef __x86_64__
25*404b540aSrobert # define bit_SSE3 (1 << 0)
26*404b540aSrobert # define bit_CX16 (1 << 13)
27*404b540aSrobert   unsigned int ax, bx, cx, dx;
28*404b540aSrobert   __asm__ ("cpuid" : "=a" (ax), "=b" (bx), "=c" (cx), "=d" (dx)
29*404b540aSrobert            : "0" (1) : "cc");
30*404b540aSrobert   if ((cx & (bit_SSE3 | bit_CX16)) != (bit_SSE3 | bit_CX16))
31*404b540aSrobert     return 0;
32*404b540aSrobert #endif
33*404b540aSrobert   test ();
34*404b540aSrobert   return 0;
35*404b540aSrobert }
36