00001
00002
00003
00004 #ifdef __i386__
00005 #include "cpuid.h"
00006 #endif
00007
00008 extern void abort (void);
00009 double d;
00010 struct
00011 {
00012 int i;
00013 double e;
00014 int j;
00015 } x;
00016
00017 void
00018 f1 (void)
00019 {
00020 #pragma omp atomic
00021 d += 7.5;
00022 #pragma omp atomic
00023 d *= 2.5;
00024 #pragma omp atomic
00025 d /= 0.25;
00026 }
00027
00028 void
00029 f2 (void)
00030 {
00031 #pragma omp atomic
00032 x.e += 7.5;
00033 #pragma omp atomic
00034 x.e *= 2.5;
00035 #pragma omp atomic
00036 x.e /= 0.25;
00037 }
00038
00039 int
00040 main (void)
00041 {
00042 #ifdef __i386__
00043 unsigned int eax, ebx, ecx, edx;
00044
00045 if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
00046 return 0;
00047
00048 if (!(edx & bit_CMPXCHG8B))
00049 return 0;
00050 #endif
00051
00052 d = 1.0;
00053 f1 ();
00054 if (d != 85.0)
00055 abort ();
00056
00057 x.e = 1.0;
00058 f2 ();
00059 if (x.i != 0 || x.e != 85.0 || x.j != 0)
00060 abort ();
00061 return 0;
00062 }