62 lines
1.4 KiB
C
62 lines
1.4 KiB
C
/* Test generic __atomic routines for proper function calling.
|
|
memory model. */
|
|
/* { dg-options "-w -fno-inline-atomics" } */
|
|
/* { dg-do run } */
|
|
/* { dg-additional-sources "atomic-noinline-aux.c" } */
|
|
|
|
/* Test that -fno-inline-atomics works as expected.
|
|
atomic-generic-aux provide the expected routines which simply set the
|
|
value of the first parameter to */
|
|
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
|
|
extern void abort (void);
|
|
|
|
short as,bs,cs,ds;
|
|
char ac,bc,cc;
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
|
|
ac = __atomic_exchange_n (&bc, cc, __ATOMIC_RELAXED);
|
|
if (bc != 1)
|
|
abort ();
|
|
|
|
as = __atomic_load_n (&bs, __ATOMIC_SEQ_CST);
|
|
if (bs != 1)
|
|
abort ();
|
|
|
|
__atomic_store_n (&ac, bc, __ATOMIC_RELAXED);
|
|
if (ac != 1)
|
|
abort ();
|
|
|
|
__atomic_compare_exchange_n (&as, &bs, cs, 0, __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE);
|
|
if (as != 1)
|
|
abort ();
|
|
|
|
ac = __atomic_fetch_add (&cc, 15, __ATOMIC_SEQ_CST);
|
|
if (cc != 1)
|
|
abort ();
|
|
|
|
/* This should be translated to __atomic_fetch_add for the library */
|
|
as = __atomic_add_fetch (&cs, 10, __ATOMIC_RELAXED);
|
|
if (cs != 1)
|
|
abort ();
|
|
|
|
/* PR 51040 was caused by arithmetic code not patching up nand_fetch properly
|
|
when used an an external function. Look for proper return value here. */
|
|
ac = 0x3C;
|
|
bc = __atomic_nand_fetch (&ac, 0x0f, __ATOMIC_RELAXED);
|
|
if (bc != ac)
|
|
abort ();
|
|
|
|
if (!__atomic_is_lock_free (2, &ds))
|
|
abort ();
|
|
if (ds != 1)
|
|
abort ();
|
|
|
|
return 0;
|
|
}
|