mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			63 lines
		
	
	
		
			829 B
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			829 B
		
	
	
	
		
			C
		
	
	
	
| /* { dg-do run } */
 | |
| /* { dg-additional-options "-march=pentium" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
 | |
| 
 | |
| #ifdef __i386__
 | |
| #include "cpuid.h"
 | |
| #endif
 | |
| 
 | |
| extern void abort (void);
 | |
| double d;
 | |
| struct
 | |
| {
 | |
|   int i;
 | |
|   double e;
 | |
|   int j;
 | |
| } x;
 | |
| 
 | |
| void
 | |
| f1 (void)
 | |
| {
 | |
|   #pragma omp atomic
 | |
|     d += 7.5;
 | |
|   #pragma omp atomic
 | |
|     d *= 2.5;
 | |
|   #pragma omp atomic
 | |
|     d /= 0.25;
 | |
| }
 | |
| 
 | |
| void
 | |
| f2 (void)
 | |
| {
 | |
|   #pragma omp atomic
 | |
|     x.e += 7.5;
 | |
|   #pragma omp atomic
 | |
|     x.e *= 2.5;
 | |
|   #pragma omp atomic
 | |
|     x.e /= 0.25;
 | |
| }
 | |
| 
 | |
| int
 | |
| main (void)
 | |
| {
 | |
| #ifdef __i386__
 | |
|   unsigned int eax, ebx, ecx, edx;
 | |
| 
 | |
|   if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
 | |
|     return 0;
 | |
| 
 | |
|   if (!(edx & bit_CMPXCHG8B))
 | |
|     return 0;
 | |
| #endif
 | |
| 
 | |
|   d = 1.0;
 | |
|   f1 ();
 | |
|   if (d != 85.0)
 | |
|     abort ();
 | |
| 
 | |
|   x.e = 1.0;
 | |
|   f2 ();
 | |
|   if (x.i != 0 || x.e != 85.0 || x.j != 0)
 | |
|     abort ();
 | |
|   return 0;
 | |
| }
 |