(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
atomic-compare-exchange-1.c
       1  /* Test __atomic routines for existence and proper execution on 1 byte 
       2     values with each valid memory model.  */
       3  /* { dg-do run } */
       4  /* { dg-require-effective-target sync_char_short } */
       5  
       6  /* Test the execution of the __atomic_compare_exchange_n builtin for a char.  */
       7  
       8  extern void abort(void);
       9  
      10  char v = 0;
      11  char expected = 0;
      12  char max = ~0;
      13  char desired = ~0;
      14  char zero = 0;
      15  
      16  #define STRONG 0
      17  #define WEAK 1
      18  
      19  int
      20  main ()
      21  {
      22  
      23    if (!__atomic_compare_exchange_n (&v, &expected, max, STRONG , __ATOMIC_RELAXED, __ATOMIC_RELAXED)) 
      24      abort ();
      25    if (expected != 0)
      26      abort ();
      27  
      28    if (__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) 
      29      abort ();
      30    if (expected != max)
      31      abort ();
      32  
      33    if (!__atomic_compare_exchange_n (&v, &expected, 0, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) 
      34      abort ();
      35    if (expected != max)
      36      abort ();
      37    if (v != 0)
      38      abort ();
      39  
      40    if (__atomic_compare_exchange_n (&v, &expected, desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) 
      41      abort ();
      42    if (expected != 0)
      43      abort ();
      44  
      45    if (!__atomic_compare_exchange_n (&v, &expected, desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) 
      46      abort ();
      47    if (expected != 0)
      48      abort ();
      49    if (v != max)
      50      abort ();
      51  
      52    /* Now test the generic version.  */
      53  
      54    v = 0;
      55  
      56    if (!__atomic_compare_exchange (&v, &expected, &max, STRONG, __ATOMIC_RELAXED, __ATOMIC_RELAXED))
      57      abort ();
      58    if (expected != 0)
      59      abort ();
      60  
      61    if (__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) 
      62      abort ();
      63    if (expected != max)
      64      abort ();
      65  
      66    if (!__atomic_compare_exchange (&v, &expected, &zero, STRONG , __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) 
      67      abort ();
      68    if (expected != max)
      69      abort ();
      70    if (v != 0)
      71      abort ();
      72  
      73    if (__atomic_compare_exchange (&v, &expected, &desired, WEAK, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE)) 
      74      abort ();
      75    if (expected != 0)
      76      abort ();
      77  
      78    if (!__atomic_compare_exchange (&v, &expected, &desired, STRONG , __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) 
      79      abort ();
      80    if (expected != 0)
      81      abort ();
      82    if (v != max)
      83      abort ();
      84  
      85    return 0;
      86  }