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