1 /* Test generic __atomic routines for proper function calling.
2    memory model.  */
3 /* { dg-options "-w -fno-inline-atomics" } */
4 /* { dg-do run } */
5 /* { dg-additional-sources "atomic-noinline-aux.c" } */
6 
7 /* Test that -fno-inline-atomics works as expected.
8    atomic-generic-aux provide the expected routines which simply set the
9    value of the first parameter to */
10 
11 #include <stdlib.h>
12 #include <stdbool.h>
13 
14 extern void abort (void);
15 
16 short as,bs,cs,ds;
17 char ac,bc,cc;
18 
19 int
main(void)20 main (void)
21 {
22 
23   ac = __atomic_exchange_n (&bc, cc, __ATOMIC_RELAXED);
24   if (bc != 1)
25     abort ();
26 
27   as = __atomic_load_n (&bs, __ATOMIC_SEQ_CST);
28   if (bs != 1)
29     abort ();
30 
31   __atomic_store_n (&ac, bc, __ATOMIC_RELAXED);
32   if (ac != 1)
33     abort ();
34 
35   __atomic_compare_exchange_n (&as, &bs, cs, 0, __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE);
36   if (as != 1)
37     abort ();
38 
39   ac = __atomic_fetch_add (&cc, 15, __ATOMIC_SEQ_CST);
40   if (cc != 1)
41     abort ();
42 
43   /* This should be translated to __atomic_fetch_add for the library */
44   as = __atomic_add_fetch (&cs, 10, __ATOMIC_RELAXED);
45   if (cs != 1)
46     abort ();
47 
48   /* PR 51040 was caused by arithmetic code not patching up nand_fetch properly
49      when used an an external function.  Look for proper return value here.  */
50   ac = 0x3C;
51   bc = __atomic_nand_fetch (&ac, 0x0f, __ATOMIC_RELAXED);
52   if (bc != ac)
53     abort ();
54 
55   if (!__atomic_is_lock_free (2, &ds))
56     abort ();
57   if (ds != 1)
58     abort ();
59 
60   return 0;
61 }
62