implemented Setup.hs to build boehm cpp libs and install them;
[hs-boehmgc.git] / gc-7.2 / libatomic_ops / src / atomic_ops / generalize-small.template
1 /*
2  * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20  * SOFTWARE.
21  */
22
23 /* XSIZE_load */
24 #if defined(AO_HAVE_XSIZE_load_acquire) && !defined(AO_HAVE_XSIZE_load)
25 # define AO_XSIZE_load(addr) AO_XSIZE_load_acquire(addr)
26 # define AO_HAVE_XSIZE_load
27 #endif
28
29 #if defined(AO_HAVE_XSIZE_load_full) && !defined(AO_HAVE_XSIZE_load_acquire)
30 # define AO_XSIZE_load_acquire(addr) AO_XSIZE_load_full(addr)
31 # define AO_HAVE_XSIZE_load_acquire
32 #endif
33
34 #if defined(AO_HAVE_XSIZE_load_full) && !defined(AO_HAVE_XSIZE_load_read)
35 # define AO_XSIZE_load_read(addr) AO_XSIZE_load_full(addr)
36 # define AO_HAVE_XSIZE_load_read
37 #endif
38
39 #if !defined(AO_HAVE_XSIZE_load_acquire_read) \
40     && defined(AO_HAVE_XSIZE_load_acquire)
41 # define AO_XSIZE_load_acquire_read(addr) AO_XSIZE_load_acquire(addr)
42 # define AO_HAVE_XSIZE_load_acquire_read
43 #endif
44
45 #if defined(AO_HAVE_XSIZE_load) && defined(AO_HAVE_nop_full) \
46     && !defined(AO_HAVE_XSIZE_load_acquire)
47   AO_INLINE unsigned XCTYPE
48   AO_XSIZE_load_acquire(const volatile unsigned XCTYPE *addr)
49   {
50     unsigned XCTYPE result = AO_XSIZE_load(addr);
51     /* Acquire barrier would be useless, since the load could be delayed    */
52     /* beyond it.                                                           */
53     AO_nop_full();
54     return result;
55   }
56 # define AO_HAVE_XSIZE_load_acquire
57 #endif
58
59 #if defined(AO_HAVE_XSIZE_load) && defined(AO_HAVE_nop_read) \
60     && !defined(AO_HAVE_XSIZE_load_read)
61   AO_INLINE unsigned XCTYPE
62   AO_XSIZE_load_read(const volatile unsigned XCTYPE *addr)
63   {
64     unsigned XCTYPE result = AO_XSIZE_load(addr);
65     /* Acquire barrier would be useless, since the load could be delayed    */
66     /* beyond it.                                                           */
67     AO_nop_read();
68     return result;
69   }
70 # define AO_HAVE_XSIZE_load_read
71 #endif
72
73 #if defined(AO_HAVE_XSIZE_load_acquire) && defined(AO_HAVE_nop_full) \
74     && !defined(AO_HAVE_XSIZE_load_full)
75 # define AO_XSIZE_load_full(addr) (AO_nop_full(), AO_XSIZE_load_acquire(addr))
76 # define AO_HAVE_XSIZE_load_full
77 #endif
78
79 #if !defined(AO_HAVE_XSIZE_load_acquire_read) \
80     && defined(AO_HAVE_XSIZE_load_read)
81 # define AO_XSIZE_load_acquire_read(addr) AO_XSIZE_load_read(addr)
82 # define AO_HAVE_XSIZE_load_acquire_read
83 #endif
84
85 #if defined(AO_HAVE_XSIZE_load_acquire_read) && !defined(AO_HAVE_XSIZE_load)
86 # define AO_XSIZE_load(addr) AO_XSIZE_load_acquire_read(addr)
87 # define AO_HAVE_XSIZE_load
88 #endif
89
90 #ifdef AO_NO_DD_ORDERING
91 # if defined(AO_HAVE_XSIZE_load_acquire_read)
92 #   define AO_XSIZE_load_dd_acquire_read(addr) AO_XSIZE_load_acquire_read(addr)
93 #   define AO_HAVE_XSIZE_load_dd_acquire_read
94 # endif
95 #else
96 # if defined(AO_HAVE_XSIZE_load)
97 #   define AO_XSIZE_load_dd_acquire_read(addr) AO_XSIZE_load(addr)
98 #   define AO_HAVE_XSIZE_load_dd_acquire_read
99 # endif
100 #endif /* !AO_NO_DD_ORDERING */
101
102 /* XSIZE_store */
103 #if defined(AO_HAVE_XSIZE_store_release) && !defined(AO_HAVE_XSIZE_store)
104 # define AO_XSIZE_store(addr, val) AO_XSIZE_store_release(addr,val)
105 # define AO_HAVE_XSIZE_store
106 #endif
107
108 #if defined(AO_HAVE_XSIZE_store_full) && !defined(AO_HAVE_XSIZE_store_release)
109 # define AO_XSIZE_store_release(addr,val) AO_XSIZE_store_full(addr,val)
110 # define AO_HAVE_XSIZE_store_release
111 #endif
112
113 #if defined(AO_HAVE_XSIZE_store_full) && !defined(AO_HAVE_XSIZE_store_write)
114 # define AO_XSIZE_store_write(addr,val) AO_XSIZE_store_full(addr,val)
115 # define AO_HAVE_XSIZE_store_write
116 #endif
117
118 #if defined(AO_HAVE_XSIZE_store_release) \
119     && !defined(AO_HAVE_XSIZE_store_release_write)
120 # define AO_XSIZE_store_release_write(addr, val) \
121                             AO_XSIZE_store_release(addr,val)
122 # define AO_HAVE_XSIZE_store_release_write
123 #endif
124
125 #if defined(AO_HAVE_XSIZE_store_write) && !defined(AO_HAVE_XSIZE_store)
126 # define AO_XSIZE_store(addr, val) AO_XSIZE_store_write(addr,val)
127 # define AO_HAVE_XSIZE_store
128 #endif
129
130 #if defined(AO_HAVE_XSIZE_store) && defined(AO_HAVE_nop_full) \
131     && !defined(AO_HAVE_XSIZE_store_release)
132 # define AO_XSIZE_store_release(addr,val) \
133                                 (AO_nop_full(), AO_XSIZE_store(addr,val))
134 # define AO_HAVE_XSIZE_store_release
135 #endif
136
137 #if defined(AO_HAVE_nop_write) && defined(AO_HAVE_XSIZE_store) \
138     && !defined(AO_HAVE_XSIZE_store_write)
139 # define AO_XSIZE_store_write(addr, val) \
140                                 (AO_nop_write(), AO_XSIZE_store(addr,val))
141 # define AO_HAVE_XSIZE_store_write
142 #endif
143
144 #if defined(AO_HAVE_XSIZE_store_write) \
145     && !defined(AO_HAVE_XSIZE_store_release_write)
146 # define AO_XSIZE_store_release_write(addr, val) AO_XSIZE_store_write(addr,val)
147 # define AO_HAVE_XSIZE_store_release_write
148 #endif
149
150 #if defined(AO_HAVE_XSIZE_store_release) && defined(AO_HAVE_nop_full) \
151     && !defined(AO_HAVE_XSIZE_store_full)
152 # define AO_XSIZE_store_full(addr, val) \
153                         (AO_XSIZE_store_release(addr, val), AO_nop_full())
154 # define AO_HAVE_XSIZE_store_full
155 #endif
156
157 /* XSIZE_fetch_and_add */
158 #if defined(AO_HAVE_XSIZE_compare_and_swap_full) \
159     && !defined(AO_HAVE_XSIZE_fetch_and_add_full)
160   AO_INLINE unsigned XCTYPE
161   AO_XSIZE_fetch_and_add_full(volatile unsigned XCTYPE *addr,
162                               unsigned XCTYPE incr)
163   {
164     unsigned XCTYPE old;
165     do
166       {
167         old = *addr;
168       }
169     while (!AO_XSIZE_compare_and_swap_full(addr, old, old+incr));
170     return old;
171   }
172 # define AO_HAVE_XSIZE_fetch_and_add_full
173 #endif
174
175 #if defined(AO_HAVE_XSIZE_compare_and_swap_acquire) \
176     && !defined(AO_HAVE_XSIZE_fetch_and_add_acquire)
177   AO_INLINE unsigned XCTYPE
178   AO_XSIZE_fetch_and_add_acquire(volatile unsigned XCTYPE *addr,
179                                  unsigned XCTYPE incr)
180   {
181     unsigned XCTYPE old;
182     do
183       {
184         old = *addr;
185       }
186     while (!AO_XSIZE_compare_and_swap_acquire(addr, old, old+incr));
187     return old;
188   }
189 # define AO_HAVE_XSIZE_fetch_and_add_acquire
190 #endif
191
192 #if defined(AO_HAVE_XSIZE_compare_and_swap_release) \
193     && !defined(AO_HAVE_XSIZE_fetch_and_add_release)
194   AO_INLINE unsigned XCTYPE
195   AO_XSIZE_fetch_and_add_release(volatile unsigned XCTYPE *addr,
196                                  unsigned XCTYPE incr)
197   {
198     unsigned XCTYPE old;
199     do
200       {
201         old = *addr;
202       }
203     while (!AO_XSIZE_compare_and_swap_release(addr, old, old+incr));
204     return old;
205   }
206 # define AO_HAVE_XSIZE_fetch_and_add_release
207 #endif
208
209 #if defined(AO_HAVE_XSIZE_fetch_and_add_full)
210 # if !defined(AO_HAVE_XSIZE_fetch_and_add_release)
211 #   define AO_XSIZE_fetch_and_add_release(addr, val) \
212                                 AO_XSIZE_fetch_and_add_full(addr, val)
213 #   define AO_HAVE_XSIZE_fetch_and_add_release
214 # endif
215 # if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire)
216 #   define AO_XSIZE_fetch_and_add_acquire(addr, val) \
217                                 AO_XSIZE_fetch_and_add_full(addr, val)
218 #   define AO_HAVE_XSIZE_fetch_and_add_acquire
219 # endif
220 # if !defined(AO_HAVE_XSIZE_fetch_and_add_write)
221 #   define AO_XSIZE_fetch_and_add_write(addr, val) \
222                                 AO_XSIZE_fetch_and_add_full(addr, val)
223 #   define AO_HAVE_XSIZE_fetch_and_add_write
224 # endif
225 # if !defined(AO_HAVE_XSIZE_fetch_and_add_read)
226 #   define AO_XSIZE_fetch_and_add_read(addr, val) \
227                                 AO_XSIZE_fetch_and_add_full(addr, val)
228 #   define AO_HAVE_XSIZE_fetch_and_add_read
229 # endif
230 #endif /* AO_HAVE_XSIZE_fetch_and_add_full */
231
232 #if !defined(AO_HAVE_XSIZE_fetch_and_add) \
233     && defined(AO_HAVE_XSIZE_fetch_and_add_release)
234 # define AO_XSIZE_fetch_and_add(addr, val) \
235                                 AO_XSIZE_fetch_and_add_release(addr, val)
236 # define AO_HAVE_XSIZE_fetch_and_add
237 #endif
238 #if !defined(AO_HAVE_XSIZE_fetch_and_add) \
239     && defined(AO_HAVE_XSIZE_fetch_and_add_acquire)
240 # define AO_XSIZE_fetch_and_add(addr, val) \
241                                 AO_XSIZE_fetch_and_add_acquire(addr, val)
242 # define AO_HAVE_XSIZE_fetch_and_add
243 #endif
244 #if !defined(AO_HAVE_XSIZE_fetch_and_add) \
245     && defined(AO_HAVE_XSIZE_fetch_and_add_write)
246 # define AO_XSIZE_fetch_and_add(addr, val) \
247                                 AO_XSIZE_fetch_and_add_write(addr, val)
248 # define AO_HAVE_XSIZE_fetch_and_add
249 #endif
250 #if !defined(AO_HAVE_XSIZE_fetch_and_add) \
251     && defined(AO_HAVE_XSIZE_fetch_and_add_read)
252 # define AO_XSIZE_fetch_and_add(addr, val) \
253                                 AO_XSIZE_fetch_and_add_read(addr, val)
254 # define AO_HAVE_XSIZE_fetch_and_add
255 #endif
256
257 #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \
258     && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_XSIZE_fetch_and_add_full)
259 # define AO_XSIZE_fetch_and_add_full(addr, val) \
260                 (AO_nop_full(), AO_XSIZE_fetch_and_add_acquire(addr, val))
261 # define AO_HAVE_XSIZE_fetch_and_add_full
262 #endif
263
264 #if !defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \
265     && defined(AO_HAVE_XSIZE_fetch_and_add_write)
266 # define AO_XSIZE_fetch_and_add_release_write(addr, val) \
267                                 AO_XSIZE_fetch_and_add_write(addr, val)
268 # define AO_HAVE_XSIZE_fetch_and_add_release_write
269 #endif
270 #if !defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \
271     && defined(AO_HAVE_XSIZE_fetch_and_add_release)
272 # define AO_XSIZE_fetch_and_add_release_write(addr, val) \
273                                 AO_XSIZE_fetch_and_add_release(addr, val)
274 # define AO_HAVE_XSIZE_fetch_and_add_release_write
275 #endif
276
277 #if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \
278     && defined(AO_HAVE_XSIZE_fetch_and_add_read)
279 # define AO_XSIZE_fetch_and_add_acquire_read(addr, val) \
280                                 AO_XSIZE_fetch_and_add_read(addr, val)
281 # define AO_HAVE_XSIZE_fetch_and_add_acquire_read
282 #endif
283 #if !defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \
284     && defined(AO_HAVE_XSIZE_fetch_and_add_acquire)
285 # define AO_XSIZE_fetch_and_add_acquire_read(addr, val) \
286                                 AO_XSIZE_fetch_and_add_acquire(addr, val)
287 # define AO_HAVE_XSIZE_fetch_and_add_acquire_read
288 #endif
289
290 #ifdef AO_NO_DD_ORDERING
291 # if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read)
292 #   define AO_XSIZE_fetch_and_add_dd_acquire_read(addr, val) \
293                                 AO_XSIZE_fetch_and_add_acquire_read(addr, val)
294 #   define AO_HAVE_XSIZE_fetch_and_add_dd_acquire_read
295 # endif
296 #else
297 # if defined(AO_HAVE_XSIZE_fetch_and_add)
298 #   define AO_XSIZE_fetch_and_add_dd_acquire_read(addr, val) \
299                                 AO_XSIZE_fetch_and_add(addr, val)
300 #   define AO_HAVE_XSIZE_fetch_and_add_dd_acquire_read
301 # endif
302 #endif /* !AO_NO_DD_ORDERING */
303
304 /* XSIZE_fetch_and_add1 */
305 #if defined(AO_HAVE_XSIZE_fetch_and_add_full) \
306     && !defined(AO_HAVE_XSIZE_fetch_and_add1_full)
307 # define AO_XSIZE_fetch_and_add1_full(addr) \
308                                 AO_XSIZE_fetch_and_add_full(addr,1)
309 # define AO_HAVE_XSIZE_fetch_and_add1_full
310 #endif
311 #if defined(AO_HAVE_XSIZE_fetch_and_add_release) \
312     && !defined(AO_HAVE_XSIZE_fetch_and_add1_release)
313 # define AO_XSIZE_fetch_and_add1_release(addr) \
314                                 AO_XSIZE_fetch_and_add_release(addr,1)
315 # define AO_HAVE_XSIZE_fetch_and_add1_release
316 #endif
317 #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \
318     && !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire)
319 # define AO_XSIZE_fetch_and_add1_acquire(addr) \
320                                 AO_XSIZE_fetch_and_add_acquire(addr,1)
321 # define AO_HAVE_XSIZE_fetch_and_add1_acquire
322 #endif
323 #if defined(AO_HAVE_XSIZE_fetch_and_add_write) \
324     && !defined(AO_HAVE_XSIZE_fetch_and_add1_write)
325 # define AO_XSIZE_fetch_and_add1_write(addr) \
326                                 AO_XSIZE_fetch_and_add_write(addr,1)
327 # define AO_HAVE_XSIZE_fetch_and_add1_write
328 #endif
329 #if defined(AO_HAVE_XSIZE_fetch_and_add_read) \
330     && !defined(AO_HAVE_XSIZE_fetch_and_add1_read)
331 # define AO_XSIZE_fetch_and_add1_read(addr) \
332                                 AO_XSIZE_fetch_and_add_read(addr,1)
333 # define AO_HAVE_XSIZE_fetch_and_add1_read
334 #endif
335 #if defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \
336     && !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write)
337 # define AO_XSIZE_fetch_and_add1_release_write(addr) \
338                                 AO_XSIZE_fetch_and_add_release_write(addr,1)
339 # define AO_HAVE_XSIZE_fetch_and_add1_release_write
340 #endif
341 #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \
342     && !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read)
343 # define AO_XSIZE_fetch_and_add1_acquire_read(addr) \
344                                 AO_XSIZE_fetch_and_add_acquire_read(addr,1)
345 # define AO_HAVE_XSIZE_fetch_and_add1_acquire_read
346 #endif
347 #if defined(AO_HAVE_XSIZE_fetch_and_add) \
348     && !defined(AO_HAVE_XSIZE_fetch_and_add1)
349 # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add(addr,1)
350 # define AO_HAVE_XSIZE_fetch_and_add1
351 #endif
352
353 #if defined(AO_HAVE_XSIZE_fetch_and_add1_full)
354 # if !defined(AO_HAVE_XSIZE_fetch_and_add1_release)
355 #   define AO_XSIZE_fetch_and_add1_release(addr) \
356                                 AO_XSIZE_fetch_and_add1_full(addr)
357 #   define AO_HAVE_XSIZE_fetch_and_add1_release
358 # endif
359 # if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire)
360 #   define AO_XSIZE_fetch_and_add1_acquire(addr) \
361                                 AO_XSIZE_fetch_and_add1_full(addr)
362 #   define AO_HAVE_XSIZE_fetch_and_add1_acquire
363 # endif
364 # if !defined(AO_HAVE_XSIZE_fetch_and_add1_write)
365 #   define AO_XSIZE_fetch_and_add1_write(addr) \
366                                 AO_XSIZE_fetch_and_add1_full(addr)
367 #   define AO_HAVE_XSIZE_fetch_and_add1_write
368 # endif
369 # if !defined(AO_HAVE_XSIZE_fetch_and_add1_read)
370 #   define AO_XSIZE_fetch_and_add1_read(addr) \
371                                 AO_XSIZE_fetch_and_add1_full(addr)
372 #   define AO_HAVE_XSIZE_fetch_and_add1_read
373 # endif
374 #endif /* AO_HAVE_XSIZE_fetch_and_add1_full */
375
376 #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \
377     && defined(AO_HAVE_XSIZE_fetch_and_add1_release)
378 # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_release(addr)
379 # define AO_HAVE_XSIZE_fetch_and_add1
380 #endif
381 #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \
382     && defined(AO_HAVE_XSIZE_fetch_and_add1_acquire)
383 # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_acquire(addr)
384 # define AO_HAVE_XSIZE_fetch_and_add1
385 #endif
386 #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \
387     && defined(AO_HAVE_XSIZE_fetch_and_add1_write)
388 # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_write(addr)
389 # define AO_HAVE_XSIZE_fetch_and_add1
390 #endif
391 #if !defined(AO_HAVE_XSIZE_fetch_and_add1) \
392     && defined(AO_HAVE_XSIZE_fetch_and_add1_read)
393 # define AO_XSIZE_fetch_and_add1(addr) AO_XSIZE_fetch_and_add1_read(addr)
394 # define AO_HAVE_XSIZE_fetch_and_add1
395 #endif
396
397 #if defined(AO_HAVE_XSIZE_fetch_and_add1_acquire) \
398     && defined(AO_HAVE_nop_full) \
399     && !defined(AO_HAVE_XSIZE_fetch_and_add1_full)
400 # define AO_XSIZE_fetch_and_add1_full(addr) \
401                         (AO_nop_full(), AO_XSIZE_fetch_and_add1_acquire(addr))
402 # define AO_HAVE_XSIZE_fetch_and_add1_full
403 #endif
404
405 #if !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write) \
406     && defined(AO_HAVE_XSIZE_fetch_and_add1_write)
407 # define AO_XSIZE_fetch_and_add1_release_write(addr) \
408                                 AO_XSIZE_fetch_and_add1_write(addr)
409 # define AO_HAVE_XSIZE_fetch_and_add1_release_write
410 #endif
411 #if !defined(AO_HAVE_XSIZE_fetch_and_add1_release_write) \
412     && defined(AO_HAVE_XSIZE_fetch_and_add1_release)
413 # define AO_XSIZE_fetch_and_add1_release_write(addr) \
414                                 AO_XSIZE_fetch_and_add1_release(addr)
415 # define AO_HAVE_XSIZE_fetch_and_add1_release_write
416 #endif
417 #if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) \
418     && defined(AO_HAVE_XSIZE_fetch_and_add1_read)
419 # define AO_XSIZE_fetch_and_add1_acquire_read(addr) \
420                                 AO_XSIZE_fetch_and_add1_read(addr)
421 # define AO_HAVE_XSIZE_fetch_and_add1_acquire_read
422 #endif
423 #if !defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read) \
424     && defined(AO_HAVE_XSIZE_fetch_and_add1_acquire)
425 # define AO_XSIZE_fetch_and_add1_acquire_read(addr) \
426                                 AO_XSIZE_fetch_and_add1_acquire(addr)
427 # define AO_HAVE_XSIZE_fetch_and_add1_acquire_read
428 #endif
429
430 #ifdef AO_NO_DD_ORDERING
431 # if defined(AO_HAVE_XSIZE_fetch_and_add1_acquire_read)
432 #   define AO_XSIZE_fetch_and_add1_dd_acquire_read(addr) \
433                                 AO_XSIZE_fetch_and_add1_acquire_read(addr)
434 #   define AO_HAVE_XSIZE_fetch_and_add1_dd_acquire_read
435 # endif
436 #else
437 # if defined(AO_HAVE_XSIZE_fetch_and_add1)
438 #   define AO_XSIZE_fetch_and_add1_dd_acquire_read(addr) \
439                                 AO_XSIZE_fetch_and_add1(addr)
440 #   define AO_HAVE_XSIZE_fetch_and_add1_dd_acquire_read
441 # endif
442 #endif /* !AO_NO_DD_ORDERING */
443
444 /* XSIZE_fetch_and_sub1 */
445 #if defined(AO_HAVE_XSIZE_fetch_and_add_full) \
446     && !defined(AO_HAVE_XSIZE_fetch_and_sub1_full)
447 # define AO_XSIZE_fetch_and_sub1_full(addr) \
448                 AO_XSIZE_fetch_and_add_full(addr,(unsigned XCTYPE)(-1))
449 # define AO_HAVE_XSIZE_fetch_and_sub1_full
450 #endif
451 #if defined(AO_HAVE_XSIZE_fetch_and_add_release) \
452     && !defined(AO_HAVE_XSIZE_fetch_and_sub1_release)
453 # define AO_XSIZE_fetch_and_sub1_release(addr) \
454                 AO_XSIZE_fetch_and_add_release(addr,(unsigned XCTYPE)(-1))
455 # define AO_HAVE_XSIZE_fetch_and_sub1_release
456 #endif
457 #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire) \
458     && !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire)
459 # define AO_XSIZE_fetch_and_sub1_acquire(addr) \
460                 AO_XSIZE_fetch_and_add_acquire(addr,(unsigned XCTYPE)(-1))
461 # define AO_HAVE_XSIZE_fetch_and_sub1_acquire
462 #endif
463 #if defined(AO_HAVE_XSIZE_fetch_and_add_write) \
464     && !defined(AO_HAVE_XSIZE_fetch_and_sub1_write)
465 # define AO_XSIZE_fetch_and_sub1_write(addr) \
466                 AO_XSIZE_fetch_and_add_write(addr,(unsigned XCTYPE)(-1))
467 # define AO_HAVE_XSIZE_fetch_and_sub1_write
468 #endif
469 #if defined(AO_HAVE_XSIZE_fetch_and_add_read) \
470     && !defined(AO_HAVE_XSIZE_fetch_and_sub1_read)
471 # define AO_XSIZE_fetch_and_sub1_read(addr) \
472                 AO_XSIZE_fetch_and_add_read(addr,(unsigned XCTYPE)(-1))
473 # define AO_HAVE_XSIZE_fetch_and_sub1_read
474 #endif
475 #if defined(AO_HAVE_XSIZE_fetch_and_add_release_write) \
476     && !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write)
477 # define AO_XSIZE_fetch_and_sub1_release_write(addr) \
478         AO_XSIZE_fetch_and_add_release_write(addr,(unsigned XCTYPE)(-1))
479 # define AO_HAVE_XSIZE_fetch_and_sub1_release_write
480 #endif
481 #if defined(AO_HAVE_XSIZE_fetch_and_add_acquire_read) \
482     && !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read)
483 # define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \
484         AO_XSIZE_fetch_and_add_acquire_read(addr,(unsigned XCTYPE)(-1))
485 # define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read
486 #endif
487 #if defined(AO_HAVE_XSIZE_fetch_and_add) \
488     && !defined(AO_HAVE_XSIZE_fetch_and_sub1)
489 # define AO_XSIZE_fetch_and_sub1(addr) \
490                 AO_XSIZE_fetch_and_add(addr,(unsigned XCTYPE)(-1))
491 # define AO_HAVE_XSIZE_fetch_and_sub1
492 #endif
493
494 #if defined(AO_HAVE_XSIZE_fetch_and_sub1_full)
495 # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release)
496 #   define AO_XSIZE_fetch_and_sub1_release(addr) \
497                                 AO_XSIZE_fetch_and_sub1_full(addr)
498 #   define AO_HAVE_XSIZE_fetch_and_sub1_release
499 # endif
500 # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire)
501 #   define AO_XSIZE_fetch_and_sub1_acquire(addr) \
502                                 AO_XSIZE_fetch_and_sub1_full(addr)
503 #   define AO_HAVE_XSIZE_fetch_and_sub1_acquire
504 # endif
505 # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_write)
506 #   define AO_XSIZE_fetch_and_sub1_write(addr) \
507                                 AO_XSIZE_fetch_and_sub1_full(addr)
508 #   define AO_HAVE_XSIZE_fetch_and_sub1_write
509 # endif
510 # if !defined(AO_HAVE_XSIZE_fetch_and_sub1_read)
511 #   define AO_XSIZE_fetch_and_sub1_read(addr) \
512                                 AO_XSIZE_fetch_and_sub1_full(addr)
513 #   define AO_HAVE_XSIZE_fetch_and_sub1_read
514 # endif
515 #endif /* AO_HAVE_XSIZE_fetch_and_sub1_full */
516
517 #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \
518     && defined(AO_HAVE_XSIZE_fetch_and_sub1_release)
519 # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_release(addr)
520 # define AO_HAVE_XSIZE_fetch_and_sub1
521 #endif
522 #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \
523     && defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire)
524 # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_acquire(addr)
525 # define AO_HAVE_XSIZE_fetch_and_sub1
526 #endif
527 #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \
528     && defined(AO_HAVE_XSIZE_fetch_and_sub1_write)
529 # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_write(addr)
530 # define AO_HAVE_XSIZE_fetch_and_sub1
531 #endif
532 #if !defined(AO_HAVE_XSIZE_fetch_and_sub1) \
533     && defined(AO_HAVE_XSIZE_fetch_and_sub1_read)
534 # define AO_XSIZE_fetch_and_sub1(addr) AO_XSIZE_fetch_and_sub1_read(addr)
535 # define AO_HAVE_XSIZE_fetch_and_sub1
536 #endif
537
538 #if defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire) \
539     && defined(AO_HAVE_nop_full) \
540     && !defined(AO_HAVE_XSIZE_fetch_and_sub1_full)
541 # define AO_XSIZE_fetch_and_sub1_full(addr) \
542                         (AO_nop_full(), AO_XSIZE_fetch_and_sub1_acquire(addr))
543 # define AO_HAVE_XSIZE_fetch_and_sub1_full
544 #endif
545
546 #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write) \
547     && defined(AO_HAVE_XSIZE_fetch_and_sub1_write)
548 # define AO_XSIZE_fetch_and_sub1_release_write(addr) \
549                                 AO_XSIZE_fetch_and_sub1_write(addr)
550 # define AO_HAVE_XSIZE_fetch_and_sub1_release_write
551 #endif
552 #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_release_write) \
553     && defined(AO_HAVE_XSIZE_fetch_and_sub1_release)
554 # define AO_XSIZE_fetch_and_sub1_release_write(addr) \
555                                 AO_XSIZE_fetch_and_sub1_release(addr)
556 # define AO_HAVE_XSIZE_fetch_and_sub1_release_write
557 #endif
558 #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) \
559     && defined(AO_HAVE_XSIZE_fetch_and_sub1_read)
560 # define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \
561                                 AO_XSIZE_fetch_and_sub1_read(addr)
562 # define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read
563 #endif
564 #if !defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read) \
565     && defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire)
566 # define AO_XSIZE_fetch_and_sub1_acquire_read(addr) \
567                                 AO_XSIZE_fetch_and_sub1_acquire(addr)
568 # define AO_HAVE_XSIZE_fetch_and_sub1_acquire_read
569 #endif
570
571 #ifdef AO_NO_DD_ORDERING
572 # if defined(AO_HAVE_XSIZE_fetch_and_sub1_acquire_read)
573 #   define AO_XSIZE_fetch_and_sub1_dd_acquire_read(addr) \
574                                 AO_XSIZE_fetch_and_sub1_acquire_read(addr)
575 #   define AO_HAVE_XSIZE_fetch_and_sub1_dd_acquire_read
576 # endif
577 #else
578 # if defined(AO_HAVE_XSIZE_fetch_and_sub1)
579 #   define AO_XSIZE_fetch_and_sub1_dd_acquire_read(addr) \
580                                 AO_XSIZE_fetch_and_sub1(addr)
581 #   define AO_HAVE_XSIZE_fetch_and_sub1_dd_acquire_read
582 # endif
583 #endif /* !AO_NO_DD_ORDERING */