void test_atomic_bool (_Atomic _Bool *a) { enum { SEQ_CST = __ATOMIC_SEQ_CST }; __atomic_fetch_add (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_fetch_add." } */ __atomic_fetch_sub (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_fetch_sub." } */ __atomic_fetch_and (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_fetch_and." } */ __atomic_fetch_xor (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_fetch_xor." } */ __atomic_fetch_or (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_fetch_or." } */ __atomic_fetch_nand (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_fetch_nand." } */ __atomic_add_fetch (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_add_fetch." } */ __atomic_sub_fetch (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_sub_fetch." } */ __atomic_and_fetch (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_and_fetch." } */ __atomic_xor_fetch (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_xor_fetch." } */ __atomic_or_fetch (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_or_fetch." } */ __atomic_nand_fetch (a, 1, SEQ_CST); /* { dg-error "operand type ._Atomic _Bool \\*. is incompatible with argument 1 of .__atomic_nand_fetch." } */ /* The following are valid and must be accepted. */ _Bool val = 0, ret = 0; __atomic_exchange (a, &val, &ret, SEQ_CST); __atomic_exchange_n (a, val, SEQ_CST); __atomic_compare_exchange (a, &val, &ret, !1, SEQ_CST, SEQ_CST); __atomic_compare_exchange_n (a, &val, ret, !1, SEQ_CST, SEQ_CST); __atomic_test_and_set (a, SEQ_CST); __atomic_clear (a, SEQ_CST); }
__host__ __device__ typename enable_if< sizeof(Integer64) == 8, Integer64 >::type atomic_fetch_xor(Integer64 *x, Integer64 y) { #if defined(__CUDA_ARCH__) return atomicXor(x, y); #elif defined(__GNUC__) return __atomic_fetch_xor(x, y, __ATOMIC_SEQ_CST); #elif defined(_MSC_VER) return InterlockedOr64(x, y); #elif defined(__clang__) return __c11_atomic_fetch_xor(x, y) #else #error "No atomic_fetch_xor implementation." #endif }
void test_fetch_xor () { v = init; count = 0; if (__atomic_fetch_xor (&v, count, __ATOMIC_RELAXED) != init) abort (); if (__atomic_fetch_xor (&v, ~count, __ATOMIC_CONSUME) != init) abort (); if (__atomic_fetch_xor (&v, 0, __ATOMIC_ACQUIRE) != 0) abort (); if (__atomic_fetch_xor (&v, ~count, __ATOMIC_RELEASE) != 0) abort (); if (__atomic_fetch_xor (&v, 0, __ATOMIC_ACQ_REL) != init) abort (); if (__atomic_fetch_xor (&v, ~count, __ATOMIC_SEQ_CST) != init) abort (); }
int atomic_fetch_xor_ACQUIRE (int a) { return __atomic_fetch_xor (&v, a, __ATOMIC_ACQUIRE); }
short short_fetch_xor_acq_rel (short *ptr, int value) { return __atomic_fetch_xor (ptr, value, __ATOMIC_ACQ_REL); }
char char_fetch_xor_acq_rel (char *ptr, int value) { return __atomic_fetch_xor (ptr, value, __ATOMIC_ACQ_REL); }
__int128_t quad_fetch_xor_acq_rel (__int128_t *ptr, __int128_t value) { return __atomic_fetch_xor (ptr, value, __ATOMIC_ACQ_REL); }
long long_fetch_xor_acq_rel (long *ptr, long value) { return __atomic_fetch_xor (ptr, value, __ATOMIC_ACQ_REL); }
long atomic_fetch_xor_RELAXED (long a) { return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED); }
P_LIB_API puint p_atomic_int_xor (volatile puint *atomic, puint val) { return (puint) __atomic_fetch_xor (atomic, val, __ATOMIC_SEQ_CST); }
P_LIB_API psize p_atomic_pointer_xor (volatile void *atomic, psize val) { return (psize) __atomic_fetch_xor ((volatile pssize *) atomic, val, __ATOMIC_SEQ_CST); }
int atomic_fetch_xor_CONSUME () { return __atomic_fetch_xor (&v, 4096, __ATOMIC_CONSUME); }