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