(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
quad-atomic.c
       1  /* { dg-do run { target { powerpc*-*-linux* && lp64 } } } */
       2  /* { dg-skip-if "" { powerpc*-*-darwin* } } */
       3  /* { dg-require-effective-target p8vector_hw } */
       4  /* { dg-options "-mdejagnu-cpu=power8 -O2 -Wno-shift-overflow" } */
       5  
       6  /* Test whether we get the right bits for quad word atomic instructions.  */
       7  #include <stdlib.h>
       8  
       9  static __int128_t quad_fetch_and (__int128_t *, __int128_t value) __attribute__((__noinline__));
      10  static __int128_t quad_fetch_or  (__int128_t *, __int128_t value) __attribute__((__noinline__));
      11  static __int128_t quad_fetch_add (__int128_t *, __int128_t value) __attribute__((__noinline__));
      12  
      13  static __int128_t
      14  quad_fetch_and (__int128_t *ptr, __int128_t value)
      15  {
      16    return __atomic_fetch_and (ptr, value, __ATOMIC_ACQUIRE);
      17  }
      18  
      19  static __int128_t
      20  quad_fetch_or (__int128_t *ptr, __int128_t value)
      21  {
      22    return __atomic_fetch_or (ptr, value, __ATOMIC_ACQUIRE);
      23  }
      24  
      25  static __int128_t
      26  quad_fetch_add (__int128_t *ptr, __int128_t value)
      27  {
      28    return __atomic_fetch_add (ptr, value, __ATOMIC_ACQUIRE);
      29  }
      30  
      31  int
      32  main (void)
      33  {
      34    __int128_t result;
      35    __int128_t value;
      36    __int128_t and_input	= ((((__int128_t) 0x1234567890abcdefULL) << 64) | ((__int128_t) 0xfedcba0987654321ULL));
      37    __int128_t and_value	= ((((__int128_t) 0xfffffffffffffff0ULL) << 64) | ((__int128_t) 0xfffffffffffffff0ULL));
      38    __int128_t and_exp	= ((((__int128_t) 0x1234567890abcde0ULL) << 64) | ((__int128_t) 0xfedcba0987654320ULL));
      39  
      40    __int128_t or_input	= ((((__int128_t) 0x1234567890abcdefULL) << 64) | ((__int128_t) 0xfedcba0987654321ULL));
      41    __int128_t or_value	= ((((__int128_t) 0x0000000000000010ULL) << 64) | ((__int128_t) 0x000000000000000eULL));
      42    __int128_t or_exp	= ((((__int128_t) 0x1234567890abcdffULL) << 64) | ((__int128_t) 0xfedcba098765432fULL));
      43  
      44    __int128_t add_input	= ((((__int128_t) 0x1234567890abcdefULL) << 64) | ((__int128_t) 0xfedcba0987654321ULL));
      45    __int128_t add_value	= ((((__int128_t) 0x0000000001000000ULL) << 64) | ((__int128_t) 0x0000001000000000ULL));
      46    __int128_t add_exp	= ((((__int128_t) 0x1234567891abcdefULL) << 64) | ((__int128_t) 0xfedcba1987654321ULL));
      47  
      48  
      49    value = and_input;
      50    result = quad_fetch_and (&value, and_value);
      51    if (result != and_input || value != and_exp)
      52      abort ();
      53  
      54    value = or_input;
      55    result = quad_fetch_or (&value, or_value);
      56    if (result != or_input || value != or_exp)
      57      abort ();
      58  
      59    value = add_input;
      60    result = quad_fetch_add (&value, add_value);
      61    if (result != add_input || value != add_exp)
      62      abort ();
      63  
      64    return 0;
      65  }
      66