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