OSDN Git Service

PR debug/54694
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / atomic-exchange-5.c
1 /* Test __atomic routines for existence and proper execution on 16 byte 
2    values with each valid memory model.  */
3 /* { dg-do run } */
4 /* { dg-require-effective-target sync_int_128_runtime } */
5 /* { dg-options "-mcx16" { target { i?86-*-* x86_64-*-* } } } */
6
7 /* Test the execution of the __atomic_X builtin for a 16 byte value.  */
8
9 extern void abort(void);
10
11 __int128_t v, count, ret;
12
13 main ()
14 {
15   v = 0;
16   count = 0;
17
18   if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELAXED) !=  count++) 
19     abort ();
20
21   if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQUIRE) !=  count++) 
22     abort ();
23
24   if (__atomic_exchange_n (&v, count + 1, __ATOMIC_RELEASE) !=  count++) 
25     abort ();
26
27   if (__atomic_exchange_n (&v, count + 1, __ATOMIC_ACQ_REL) !=  count++) 
28     abort ();
29
30   if (__atomic_exchange_n (&v, count + 1, __ATOMIC_SEQ_CST) !=  count++) 
31     abort ();
32
33   /* Now test the generic version.  */
34
35   count++;
36
37   __atomic_exchange (&v, &count, &ret, __ATOMIC_RELAXED);
38   if (ret != count - 1 || v != count)
39     abort ();
40   count++;
41
42   __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQUIRE);
43   if (ret != count - 1 || v != count)
44     abort ();
45   count++;
46
47   __atomic_exchange (&v, &count, &ret, __ATOMIC_RELEASE);
48   if (ret != count - 1 || v != count)
49     abort ();
50   count++;
51
52   __atomic_exchange (&v, &count, &ret, __ATOMIC_ACQ_REL);
53   if (ret != count - 1 || v != count)
54     abort ();
55   count++;
56
57   __atomic_exchange (&v, &count, &ret, __ATOMIC_SEQ_CST);
58   if (ret != count - 1 || v != count)
59     abort ();
60   count++;
61
62   return 0;
63 }