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