1 /* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
2 /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
3 /* { dg-require-effective-target powerpc_vsx_ok } */
4 /* { dg-options "-mcpu=power7 -O2" } */
5 /* { dg-final { scan-assembler-not "lbarx" } } */
6 /* { dg-final { scan-assembler-not "lharx" } } */
7 /* { dg-final { scan-assembler-times "lwarx" 18 } } */
8 /* { dg-final { scan-assembler-times "ldarx" 6 } } */
9 /* { dg-final { scan-assembler-not "lqarx" } } */
10 /* { dg-final { scan-assembler-not "stbcx" } } */
11 /* { dg-final { scan-assembler-not "sthcx" } } */
12 /* { dg-final { scan-assembler-times "stwcx" 18 } } */
13 /* { dg-final { scan-assembler-times "stdcx" 6 } } */
14 /* { dg-final { scan-assembler-not "stqcx" } } */
15 /* { dg-final { scan-assembler-times "bl __atomic" 6 } } */
16 /* { dg-final { scan-assembler-times "isync" 12 } } */
17 /* { dg-final { scan-assembler-times "lwsync" 8 } } */
18 /* { dg-final { scan-assembler-not "mtvsrd" } } */
19 /* { dg-final { scan-assembler-not "mtvsrwa" } } */
20 /* { dg-final { scan-assembler-not "mtvsrwz" } } */
21 /* { dg-final { scan-assembler-not "mfvsrd" } } */
22 /* { dg-final { scan-assembler-not "mfvsrwz" } } */
23 
24 /* Test for the byte atomic operations on power8 using lbarx/stbcx.  */
25 char
char_fetch_add_relaxed(char * ptr,int value)26 char_fetch_add_relaxed (char *ptr, int value)
27 {
28   return __atomic_fetch_add (ptr, value, __ATOMIC_RELAXED);
29 }
30 
31 char
char_fetch_sub_consume(char * ptr,int value)32 char_fetch_sub_consume (char *ptr, int value)
33 {
34   return __atomic_fetch_sub (ptr, value, __ATOMIC_CONSUME);
35 }
36 
37 char
char_fetch_and_acquire(char * ptr,int value)38 char_fetch_and_acquire (char *ptr, int value)
39 {
40   return __atomic_fetch_and (ptr, value, __ATOMIC_ACQUIRE);
41 }
42 
43 char
char_fetch_ior_release(char * ptr,int value)44 char_fetch_ior_release (char *ptr, int value)
45 {
46   return __atomic_fetch_or (ptr, value, __ATOMIC_RELEASE);
47 }
48 
49 char
char_fetch_xor_acq_rel(char * ptr,int value)50 char_fetch_xor_acq_rel (char *ptr, int value)
51 {
52   return __atomic_fetch_xor (ptr, value, __ATOMIC_ACQ_REL);
53 }
54 
55 char
char_fetch_nand_seq_cst(char * ptr,int value)56 char_fetch_nand_seq_cst (char *ptr, int value)
57 {
58   return __atomic_fetch_nand (ptr, value, __ATOMIC_SEQ_CST);
59 }
60 
61 /* Test for the half word atomic operations on power8 using lharx/sthcx.  */
62 short
short_fetch_add_relaxed(short * ptr,int value)63 short_fetch_add_relaxed (short *ptr, int value)
64 {
65   return __atomic_fetch_add (ptr, value, __ATOMIC_RELAXED);
66 }
67 
68 short
short_fetch_sub_consume(short * ptr,int value)69 short_fetch_sub_consume (short *ptr, int value)
70 {
71   return __atomic_fetch_sub (ptr, value, __ATOMIC_CONSUME);
72 }
73 
74 short
short_fetch_and_acquire(short * ptr,int value)75 short_fetch_and_acquire (short *ptr, int value)
76 {
77   return __atomic_fetch_and (ptr, value, __ATOMIC_ACQUIRE);
78 }
79 
80 short
short_fetch_ior_release(short * ptr,int value)81 short_fetch_ior_release (short *ptr, int value)
82 {
83   return __atomic_fetch_or (ptr, value, __ATOMIC_RELEASE);
84 }
85 
86 short
short_fetch_xor_acq_rel(short * ptr,int value)87 short_fetch_xor_acq_rel (short *ptr, int value)
88 {
89   return __atomic_fetch_xor (ptr, value, __ATOMIC_ACQ_REL);
90 }
91 
92 short
short_fetch_nand_seq_cst(short * ptr,int value)93 short_fetch_nand_seq_cst (short *ptr, int value)
94 {
95   return __atomic_fetch_nand (ptr, value, __ATOMIC_SEQ_CST);
96 }
97 
98 /* Test for the word atomic operations on power8 using lwarx/stwcx.  */
99 int
int_fetch_add_relaxed(int * ptr,int value)100 int_fetch_add_relaxed (int *ptr, int value)
101 {
102   return __atomic_fetch_add (ptr, value, __ATOMIC_RELAXED);
103 }
104 
105 int
int_fetch_sub_consume(int * ptr,int value)106 int_fetch_sub_consume (int *ptr, int value)
107 {
108   return __atomic_fetch_sub (ptr, value, __ATOMIC_CONSUME);
109 }
110 
111 int
int_fetch_and_acquire(int * ptr,int value)112 int_fetch_and_acquire (int *ptr, int value)
113 {
114   return __atomic_fetch_and (ptr, value, __ATOMIC_ACQUIRE);
115 }
116 
117 int
int_fetch_ior_release(int * ptr,int value)118 int_fetch_ior_release (int *ptr, int value)
119 {
120   return __atomic_fetch_or (ptr, value, __ATOMIC_RELEASE);
121 }
122 
123 int
int_fetch_xor_acq_rel(int * ptr,int value)124 int_fetch_xor_acq_rel (int *ptr, int value)
125 {
126   return __atomic_fetch_xor (ptr, value, __ATOMIC_ACQ_REL);
127 }
128 
129 int
int_fetch_nand_seq_cst(int * ptr,int value)130 int_fetch_nand_seq_cst (int *ptr, int value)
131 {
132   return __atomic_fetch_nand (ptr, value, __ATOMIC_SEQ_CST);
133 }
134 
135 /* Test for the double word atomic operations on power8 using ldarx/stdcx.  */
136 long
long_fetch_add_relaxed(long * ptr,long value)137 long_fetch_add_relaxed (long *ptr, long value)
138 {
139   return __atomic_fetch_add (ptr, value, __ATOMIC_RELAXED);
140 }
141 
142 long
long_fetch_sub_consume(long * ptr,long value)143 long_fetch_sub_consume (long *ptr, long value)
144 {
145   return __atomic_fetch_sub (ptr, value, __ATOMIC_CONSUME);
146 }
147 
148 long
long_fetch_and_acquire(long * ptr,long value)149 long_fetch_and_acquire (long *ptr, long value)
150 {
151   return __atomic_fetch_and (ptr, value, __ATOMIC_ACQUIRE);
152 }
153 
154 long
long_fetch_ior_release(long * ptr,long value)155 long_fetch_ior_release (long *ptr, long value)
156 {
157   return __atomic_fetch_or (ptr, value, __ATOMIC_RELEASE);
158 }
159 
160 long
long_fetch_xor_acq_rel(long * ptr,long value)161 long_fetch_xor_acq_rel (long *ptr, long value)
162 {
163   return __atomic_fetch_xor (ptr, value, __ATOMIC_ACQ_REL);
164 }
165 
166 long
long_fetch_nand_seq_cst(long * ptr,long value)167 long_fetch_nand_seq_cst (long *ptr, long value)
168 {
169   return __atomic_fetch_nand (ptr, value, __ATOMIC_SEQ_CST);
170 }
171 
172 /* Test for the quad word atomic operations on power8 using ldarx/stdcx.  */
173 __int128_t
quad_fetch_add_relaxed(__int128_t * ptr,__int128_t value)174 quad_fetch_add_relaxed (__int128_t *ptr, __int128_t value)
175 {
176   return __atomic_fetch_add (ptr, value, __ATOMIC_RELAXED);
177 }
178 
179 __int128_t
quad_fetch_sub_consume(__int128_t * ptr,__int128_t value)180 quad_fetch_sub_consume (__int128_t *ptr, __int128_t value)
181 {
182   return __atomic_fetch_sub (ptr, value, __ATOMIC_CONSUME);
183 }
184 
185 __int128_t
quad_fetch_and_acquire(__int128_t * ptr,__int128_t value)186 quad_fetch_and_acquire (__int128_t *ptr, __int128_t value)
187 {
188   return __atomic_fetch_and (ptr, value, __ATOMIC_ACQUIRE);
189 }
190 
191 __int128_t
quad_fetch_ior_release(__int128_t * ptr,__int128_t value)192 quad_fetch_ior_release (__int128_t *ptr, __int128_t value)
193 {
194   return __atomic_fetch_or (ptr, value, __ATOMIC_RELEASE);
195 }
196 
197 __int128_t
quad_fetch_xor_acq_rel(__int128_t * ptr,__int128_t value)198 quad_fetch_xor_acq_rel (__int128_t *ptr, __int128_t value)
199 {
200   return __atomic_fetch_xor (ptr, value, __ATOMIC_ACQ_REL);
201 }
202 
203 __int128_t
quad_fetch_nand_seq_cst(__int128_t * ptr,__int128_t value)204 quad_fetch_nand_seq_cst (__int128_t *ptr, __int128_t value)
205 {
206   return __atomic_fetch_nand (ptr, value, __ATOMIC_SEQ_CST);
207 }
208