atomic-5.c 635 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /* PR middle-end/36106 */
  2. /* { dg-additional-options "-mcx16" { target { { i?86-*-* x86_64-*-* } && lp64 } } } */
  3. #ifdef __x86_64__
  4. # include "cpuid.h"
  5. #endif
  6. extern void abort (void);
  7. int __attribute__((noinline))
  8. do_test (void)
  9. {
  10. long double d = .0L;
  11. int i;
  12. #pragma omp parallel for shared (d)
  13. for (i = 0; i < 10; i++)
  14. #pragma omp atomic
  15. d += 1.0L;
  16. if (d != 10.0L)
  17. abort ();
  18. return 0;
  19. }
  20. int
  21. main (void)
  22. {
  23. #ifdef __x86_64__
  24. unsigned int eax, ebx, ecx, edx;
  25. if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
  26. return 0;
  27. if (!(ecx & bit_CMPXCHG16B))
  28. return 0;
  29. #endif
  30. do_test ();
  31. return 0;
  32. }