atomic-1.c 822 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /* { dg-do run } */
  2. /* { dg-options "-O2 -march=pentium" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
  3. #ifdef __i386__
  4. #include "cpuid.h"
  5. #endif
  6. extern void abort (void);
  7. double d;
  8. struct
  9. {
  10. int i;
  11. double e;
  12. int j;
  13. } x;
  14. void
  15. f1 (void)
  16. {
  17. #pragma omp atomic
  18. d += 7.5;
  19. #pragma omp atomic
  20. d *= 2.5;
  21. #pragma omp atomic
  22. d /= 0.25;
  23. }
  24. void
  25. f2 (void)
  26. {
  27. #pragma omp atomic
  28. x.e += 7.5;
  29. #pragma omp atomic
  30. x.e *= 2.5;
  31. #pragma omp atomic
  32. x.e /= 0.25;
  33. }
  34. int
  35. main (void)
  36. {
  37. #ifdef __i386__
  38. unsigned int eax, ebx, ecx, edx;
  39. if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
  40. return 0;
  41. if (!(edx & bit_CMPXCHG8B))
  42. return 0;
  43. #endif
  44. d = 1.0;
  45. f1 ();
  46. if (d != 85.0)
  47. abort ();
  48. x.e = 1.0;
  49. f2 ();
  50. if (x.i != 0 || x.e != 85.0 || x.j != 0)
  51. abort ();
  52. return 0;
  53. }