atomic-21.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /* { dg-do run } */
  2. double d;
  3. long double ld;
  4. int
  5. main ()
  6. {
  7. double e = __builtin_copysign (0.0, -1.0), v;
  8. long double le = __builtin_copysignl (0.0L, -1.0L), lv;
  9. if (__builtin_memcmp (&d, &e, sizeof (d)) != 0)
  10. {
  11. /* Verify == comparison for atomics is done as with memcmp. */
  12. #pragma omp atomic compare
  13. d = d == e ? 5.0 : d;
  14. #pragma omp atomic read
  15. v = d;
  16. if (v != 0.0)
  17. __builtin_abort ();
  18. #pragma omp atomic compare
  19. d = d == 0.0 ? 5.0 : d;
  20. #pragma omp atomic read
  21. v = d;
  22. if (v != 5.0)
  23. __builtin_abort ();
  24. }
  25. if (__builtin_memcmp (&ld, &le, sizeof (ld)) != 0)
  26. {
  27. __builtin_memset (&ld, 0xff, sizeof (ld));
  28. #pragma omp atomic write
  29. ld = 0.0L;
  30. __asm volatile ("" : : "g" (&ld) : "memory");
  31. /* Verify == comparison for atomics is done as with memcmp
  32. with __builtin_clear_padding if needed. */
  33. #pragma omp atomic compare
  34. ld = ld == le ? 5.0L : ld;
  35. #pragma omp atomic read
  36. lv = ld;
  37. if (lv != 0.0L)
  38. __builtin_abort ();
  39. #pragma omp atomic compare
  40. ld = ld == 0.0L ? 5.0L : ld;
  41. #pragma omp atomic read
  42. lv = ld;
  43. if (lv != 5.0L)
  44. __builtin_abort ();
  45. }
  46. return 0;
  47. }