2 * Copyright (c) 2003-2004 Hewlett-Packard Development Company, L.P.
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:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
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
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
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
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
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
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)
50 unsigned XCTYPE result = AO_XSIZE_load(addr);
51 /* Acquire barrier would be useless, since the load could be delayed */
56 # define AO_HAVE_XSIZE_load_acquire
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)
64 unsigned XCTYPE result = AO_XSIZE_load(addr);
65 /* Acquire barrier would be useless, since the load could be delayed */
70 # define AO_HAVE_XSIZE_load_read
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
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
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
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
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
100 #endif /* !AO_NO_DD_ORDERING */
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
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
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
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
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
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
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
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
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
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)
169 while (!AO_XSIZE_compare_and_swap_full(addr, old, old+incr));
172 # define AO_HAVE_XSIZE_fetch_and_add_full
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)
186 while (!AO_XSIZE_compare_and_swap_acquire(addr, old, old+incr));
189 # define AO_HAVE_XSIZE_fetch_and_add_acquire
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)
203 while (!AO_XSIZE_compare_and_swap_release(addr, old, old+incr));
206 # define AO_HAVE_XSIZE_fetch_and_add_release
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
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
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
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
230 #endif /* AO_HAVE_XSIZE_fetch_and_add_full */
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
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
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
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
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
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
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
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
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
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
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
302 #endif /* !AO_NO_DD_ORDERING */
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
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
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
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
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
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
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
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
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
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
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
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
374 #endif /* AO_HAVE_XSIZE_fetch_and_add1_full */
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
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
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
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
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
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
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
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
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
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
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
442 #endif /* !AO_NO_DD_ORDERING */
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
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
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
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
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
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
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
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
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
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
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
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
515 #endif /* AO_HAVE_XSIZE_fetch_and_sub1_full */
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
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
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
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
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
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
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
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
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
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
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
583 #endif /* !AO_NO_DD_ORDERING */