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 * Generalize atomic operations for atomic_ops.h.
25 * Should not be included directly.
27 * We make no attempt to define useless operations, such as
31 * We have also so far neglected to define some others, which
32 * do not appear likely to be useful, e.g. stores with acquire
35 * This file is sometimes included twice by atomic_ops.h.
36 * All definitions include explicit checks that we are not replacing
37 * an earlier definition. In general, more desirable expansions
38 * appear earlier so that we are more likely to use them.
40 * We only make safe generalizations, except that by default we define
41 * the ...dd_acquire_read operations to be equivalent to those without
42 * a barrier. On platforms for which this is unsafe, the platform-specific
43 * file must define AO_NO_DD_ORDERING.
47 # error Atomic_ops_generalize.h should not be included directly.
51 # define AO_TS_COMPARE_AND_SWAP_FULL(a,o,n) \
52 AO_char_compare_and_swap_full(a,o,n)
53 # define AO_TS_COMPARE_AND_SWAP_ACQUIRE(a,o,n) \
54 AO_char_compare_and_swap_acquire(a,o,n)
55 # define AO_TS_COMPARE_AND_SWAP_RELEASE(a,o,n) \
56 AO_char_compare_and_swap_release(a,o,n)
57 # define AO_TS_COMPARE_AND_SWAP(a,o,n) \
58 AO_char_compare_and_swap(a,o,n)
62 # define AO_TS_COMPARE_AND_SWAP_FULL(a,o,n) \
63 AO_compare_and_swap_full(a,o,n)
64 # define AO_TS_COMPARE_AND_SWAP_ACQUIRE(a,o,n) \
65 AO_compare_and_swap_acquire(a,o,n)
66 # define AO_TS_COMPARE_AND_SWAP_RELEASE(a,o,n) \
67 AO_compare_and_swap_release(a,o,n)
68 # define AO_TS_COMPARE_AND_SWAP(a,o,n) \
69 AO_compare_and_swap(a,o,n)
72 /* Generate test_and_set_full, if necessary and possible. */
73 #if !defined(AO_HAVE_test_and_set) && \
74 !defined(AO_HAVE_test_and_set_release) && \
75 !defined(AO_HAVE_test_and_set_acquire) && \
76 !defined(AO_HAVE_test_and_set_read) && \
77 !defined(AO_HAVE_test_and_set_full)
78 # if AO_AO_TS_T && defined(AO_HAVE_compare_and_swap_full) || \
79 AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap_full)
81 AO_test_and_set_full(volatile AO_TS_t *addr)
83 if (AO_TS_COMPARE_AND_SWAP_FULL(addr, AO_TS_CLEAR, AO_TS_SET))
88 # define AO_HAVE_test_and_set_full
89 # endif /* AO_HAVE_compare_and_swap_full */
91 # if AO_AO_TS_T && defined(AO_HAVE_compare_and_swap_acquire) || \
92 AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap_acquire)
94 AO_test_and_set_acquire(volatile AO_TS_t *addr)
96 if (AO_TS_COMPARE_AND_SWAP_ACQUIRE(addr, AO_TS_CLEAR, AO_TS_SET))
101 # define AO_HAVE_test_and_set_acquire
102 # endif /* AO_HAVE_compare_and_swap_acquire */
104 # if AO_AO_TS_T && defined(AO_HAVE_compare_and_swap_release) || \
105 AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap_release)
106 AO_INLINE AO_TS_VAL_t
107 AO_test_and_set_release(volatile AO_TS_t *addr)
109 if (AO_TS_COMPARE_AND_SWAP_RELEASE(addr, AO_TS_CLEAR, AO_TS_SET))
114 # define AO_HAVE_test_and_set_release
115 # endif /* AO_HAVE_compare_and_swap_release */
117 # if AO_AO_TS_T && defined(AO_HAVE_compare_and_swap) || \
118 AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap)
119 AO_INLINE AO_TS_VAL_t
120 AO_test_and_set(volatile AO_TS_t *addr)
122 if (AO_TS_COMPARE_AND_SWAP(addr, AO_TS_CLEAR, AO_TS_SET))
127 # define AO_HAVE_test_and_set
128 # endif /* AO_HAVE_compare_and_swap */
130 # if defined(AO_HAVE_test_and_set) && defined(AO_HAVE_nop_full) \
131 && !defined(AO_HAVE_test_and_set_acquire)
132 AO_INLINE AO_TS_VAL_t
133 AO_test_and_set_acquire(volatile AO_TS_t *addr)
135 AO_TS_VAL_t result = AO_test_and_set(addr);
139 # define AO_HAVE_test_and_set_acquire
142 #endif /* No prior test and set */
145 #if !defined(AO_HAVE_nop)
146 AO_INLINE void AO_nop(void) {}
150 #if defined(AO_HAVE_test_and_set_full) && !defined(AO_HAVE_nop_full)
154 AO_TS_t dummy = AO_TS_INITIALIZER;
155 AO_test_and_set_full(&dummy);
157 # define AO_HAVE_nop_full
160 #if defined(AO_HAVE_nop_acquire)
161 # error AO_nop_acquire is useless: dont define.
163 #if defined(AO_HAVE_nop_release)
164 # error AO_nop_release is useless: dont define.
167 #if defined(AO_HAVE_nop_full) && !defined(AO_HAVE_nop_read)
168 # define AO_nop_read() AO_nop_full()
169 # define AO_HAVE_nop_read
172 #if defined(AO_HAVE_nop_full) && !defined(AO_HAVE_nop_write)
173 # define AO_nop_write() AO_nop_full()
174 # define AO_HAVE_nop_write
178 #if defined(AO_HAVE_load_full) && !defined(AO_HAVE_load_acquire)
179 # define AO_load_acquire(addr) AO_load_full(addr)
180 # define AO_HAVE_load_acquire
183 #if defined(AO_HAVE_load_acquire) && !defined(AO_HAVE_load)
184 # define AO_load(addr) AO_load_acquire(addr)
185 # define AO_HAVE_load
188 #if defined(AO_HAVE_load_full) && !defined(AO_HAVE_load_read)
189 # define AO_load_read(addr) AO_load_full(addr)
190 # define AO_HAVE_load_read
193 #if !defined(AO_HAVE_load_acquire_read) && defined(AO_HAVE_load_acquire)
194 # define AO_load_acquire_read(addr) AO_load_acquire(addr)
195 # define AO_HAVE_load_acquire_read
198 #if defined(AO_HAVE_load) && defined(AO_HAVE_nop_full) && \
199 !defined(AO_HAVE_load_acquire)
201 AO_load_acquire(const volatile AO_t *addr)
203 AO_t result = AO_load(addr);
204 /* Acquire barrier would be useless, since the load could be delayed */
209 # define AO_HAVE_load_acquire
212 #if defined(AO_HAVE_load) && defined(AO_HAVE_nop_read) && \
213 !defined(AO_HAVE_load_read)
215 AO_load_read(const volatile AO_t *addr)
217 AO_t result = AO_load(addr);
218 /* Acquire barrier would be useless, since the load could be delayed */
223 # define AO_HAVE_load_read
226 #if defined(AO_HAVE_load_acquire) && defined(AO_HAVE_nop_full) && \
227 !defined(AO_HAVE_load_full)
228 # define AO_load_full(addr) (AO_nop_full(), AO_load_acquire(addr))
229 # define AO_HAVE_load_full
232 #if !defined(AO_HAVE_load_acquire_read) && defined(AO_HAVE_load_read)
233 # define AO_load_acquire_read(addr) AO_load_read(addr)
234 # define AO_HAVE_load_acquire_read
237 #if defined(AO_HAVE_load_acquire_read) && !defined(AO_HAVE_load)
238 # define AO_load(addr) AO_load_acquire_read(addr)
239 # define AO_HAVE_load
242 #ifdef AO_NO_DD_ORDERING
243 # if defined(AO_HAVE_load_acquire_read)
244 # define AO_load_dd_acquire_read(addr) AO_load_acquire_read(addr)
245 # define AO_HAVE_load_dd_acquire_read
248 # if defined(AO_HAVE_load)
249 # define AO_load_dd_acquire_read(addr) AO_load(addr)
250 # define AO_HAVE_load_dd_acquire_read
257 #if defined(AO_HAVE_store_full) && !defined(AO_HAVE_store_release)
258 # define AO_store_release(addr,val) AO_store_full(addr,val)
259 # define AO_HAVE_store_release
262 #if defined(AO_HAVE_store_release) && !defined(AO_HAVE_store)
263 # define AO_store(addr, val) AO_store_release(addr,val)
264 # define AO_HAVE_store
267 #if defined(AO_HAVE_store_full) && !defined(AO_HAVE_store_write)
268 # define AO_store_write(addr,val) AO_store_full(addr,val)
269 # define AO_HAVE_store_write
272 #if defined(AO_HAVE_store_release) && !defined(AO_HAVE_store_release_write)
273 # define AO_store_release_write(addr, val) AO_store_release(addr,val)
274 # define AO_HAVE_store_release_write
277 #if defined(AO_HAVE_store_write) && !defined(AO_HAVE_store)
278 # define AO_store(addr, val) AO_store_write(addr,val)
279 # define AO_HAVE_store
282 #if defined(AO_HAVE_store) && defined(AO_HAVE_nop_full) && \
283 !defined(AO_HAVE_store_release)
284 # define AO_store_release(addr,val) (AO_nop_full(), AO_store(addr,val))
285 # define AO_HAVE_store_release
288 #if defined(AO_HAVE_nop_write) && defined(AO_HAVE_store) && \
289 !defined(AO_HAVE_store_write)
290 # define AO_store_write(addr, val) (AO_nop_write(), AO_store(addr,val))
291 # define AO_HAVE_store_write
294 #if defined(AO_HAVE_store_write) && !defined(AO_HAVE_store_release_write)
295 # define AO_store_release_write(addr, val) AO_store_write(addr,val)
296 # define AO_HAVE_store_release_write
299 #if defined(AO_HAVE_store_release) && defined(AO_HAVE_nop_full) && \
300 !defined(AO_HAVE_store_full)
301 # define AO_store_full(addr, val) (AO_store_release(addr, val), AO_nop_full())
302 # define AO_HAVE_store_full
305 /* NEC LE-IT: Test and set */
306 #if defined(AO_HAVE_test_and_set) && \
307 defined(AO_HAVE_nop_full) && \
308 !defined(AO_HAVE_test_and_set_release)
309 # define AO_test_and_set_release(addr) \
310 (AO_nop_full(), AO_test_and_set(addr))
311 # define AO_HAVE_test_and_set_release
314 #if defined(AO_HAVE_test_and_set) && \
315 defined(AO_HAVE_nop_full) && \
316 !defined(AO_HAVE_test_and_set_acquire)
318 AO_test_and_set_acquire(volatile AO_TS_t *addr)
320 AO_TS_t res = AO_test_and_set(addr);
324 # define AO_HAVE_test_and_set_acquire
329 /* We first try to implement fetch_and_add variants in terms */
330 /* of the corresponding compare_and_swap variants to minimize */
331 /* adding barriers. */
332 #if defined(AO_HAVE_compare_and_swap_full) && \
333 !defined(AO_HAVE_fetch_and_add_full)
335 AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr)
342 while (!AO_compare_and_swap_full(addr, old, old+incr));
345 # define AO_HAVE_fetch_and_add_full
348 #if defined(AO_HAVE_compare_and_swap_acquire) && \
349 !defined(AO_HAVE_fetch_and_add_acquire)
351 AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr)
358 while (!AO_compare_and_swap_acquire(addr, old, old+incr));
361 # define AO_HAVE_fetch_and_add_acquire
364 #if defined(AO_HAVE_compare_and_swap_release) && \
365 !defined(AO_HAVE_fetch_and_add_release)
367 AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr)
374 while (!AO_compare_and_swap_release(addr, old, old+incr));
377 # define AO_HAVE_fetch_and_add_release
380 #if defined(AO_HAVE_compare_and_swap) && \
381 !defined(AO_HAVE_fetch_and_add)
383 AO_fetch_and_add(volatile AO_t *addr, AO_t incr)
390 while (!AO_compare_and_swap(addr, old, old+incr));
393 # define AO_HAVE_fetch_and_add
396 #if defined(AO_HAVE_fetch_and_add_full)
397 # if !defined(AO_HAVE_fetch_and_add_release)
398 # define AO_fetch_and_add_release(addr, val) \
399 AO_fetch_and_add_full(addr, val)
400 # define AO_HAVE_fetch_and_add_release
402 # if !defined(AO_HAVE_fetch_and_add_acquire)
403 # define AO_fetch_and_add_acquire(addr, val) \
404 AO_fetch_and_add_full(addr, val)
405 # define AO_HAVE_fetch_and_add_acquire
407 # if !defined(AO_HAVE_fetch_and_add_write)
408 # define AO_fetch_and_add_write(addr, val) \
409 AO_fetch_and_add_full(addr, val)
410 # define AO_HAVE_fetch_and_add_write
412 # if !defined(AO_HAVE_fetch_and_add_read)
413 # define AO_fetch_and_add_read(addr, val) \
414 AO_fetch_and_add_full(addr, val)
415 # define AO_HAVE_fetch_and_add_read
417 #endif /* AO_HAVE_fetch_and_add_full */
419 #if !defined(AO_HAVE_fetch_and_add) && \
420 defined(AO_HAVE_fetch_and_add_release)
421 # define AO_fetch_and_add(addr, val) \
422 AO_fetch_and_add_release(addr, val)
423 # define AO_HAVE_fetch_and_add
425 #if !defined(AO_HAVE_fetch_and_add) && \
426 defined(AO_HAVE_fetch_and_add_acquire)
427 # define AO_fetch_and_add(addr, val) \
428 AO_fetch_and_add_acquire(addr, val)
429 # define AO_HAVE_fetch_and_add
431 #if !defined(AO_HAVE_fetch_and_add) && \
432 defined(AO_HAVE_fetch_and_add_write)
433 # define AO_fetch_and_add(addr, val) \
434 AO_fetch_and_add_write(addr, val)
435 # define AO_HAVE_fetch_and_add
437 #if !defined(AO_HAVE_fetch_and_add) && \
438 defined(AO_HAVE_fetch_and_add_read)
439 # define AO_fetch_and_add(addr, val) \
440 AO_fetch_and_add_read(addr, val)
441 # define AO_HAVE_fetch_and_add
444 #if defined(AO_HAVE_fetch_and_add_acquire) &&\
445 defined(AO_HAVE_nop_full) && \
446 !defined(AO_HAVE_fetch_and_add_full)
447 # define AO_fetch_and_add_full(addr, val) \
448 (AO_nop_full(), AO_fetch_and_add_acquire(addr, val))
449 # define AO_HAVE_fetch_and_add_full
452 #if !defined(AO_HAVE_fetch_and_add_release_write) && \
453 defined(AO_HAVE_fetch_and_add_write)
454 # define AO_fetch_and_add_release_write(addr, val) \
455 AO_fetch_and_add_write(addr, val)
456 # define AO_HAVE_fetch_and_add_release_write
458 #if !defined(AO_HAVE_fetch_and_add_release_write) && \
459 defined(AO_HAVE_fetch_and_add_release)
460 # define AO_fetch_and_add_release_write(addr, val) \
461 AO_fetch_and_add_release(addr, val)
462 # define AO_HAVE_fetch_and_add_release_write
464 #if !defined(AO_HAVE_fetch_and_add_acquire_read) && \
465 defined(AO_HAVE_fetch_and_add_read)
466 # define AO_fetch_and_add_acquire_read(addr, val) \
467 AO_fetch_and_add_read(addr, val)
468 # define AO_HAVE_fetch_and_add_acquire_read
470 #if !defined(AO_HAVE_fetch_and_add_acquire_read) && \
471 defined(AO_HAVE_fetch_and_add_acquire)
472 # define AO_fetch_and_add_acquire_read(addr, val) \
473 AO_fetch_and_add_acquire(addr, val)
474 # define AO_HAVE_fetch_and_add_acquire_read
477 #ifdef AO_NO_DD_ORDERING
478 # if defined(AO_HAVE_fetch_and_add_acquire_read)
479 # define AO_fetch_and_add_dd_acquire_read(addr, val) \
480 AO_fetch_and_add_acquire_read(addr, val)
481 # define AO_HAVE_fetch_and_add_dd_acquire_read
484 # if defined(AO_HAVE_fetch_and_add)
485 # define AO_fetch_and_add_dd_acquire_read(addr, val) \
486 AO_fetch_and_add(addr, val)
487 # define AO_HAVE_fetch_and_add_dd_acquire_read
493 #if defined(AO_HAVE_fetch_and_add_full) &&\
494 !defined(AO_HAVE_fetch_and_add1_full)
495 # define AO_fetch_and_add1_full(addr) AO_fetch_and_add_full(addr,1)
496 # define AO_HAVE_fetch_and_add1_full
498 #if defined(AO_HAVE_fetch_and_add_release) &&\
499 !defined(AO_HAVE_fetch_and_add1_release)
500 # define AO_fetch_and_add1_release(addr) AO_fetch_and_add_release(addr,1)
501 # define AO_HAVE_fetch_and_add1_release
503 #if defined(AO_HAVE_fetch_and_add_acquire) &&\
504 !defined(AO_HAVE_fetch_and_add1_acquire)
505 # define AO_fetch_and_add1_acquire(addr) AO_fetch_and_add_acquire(addr,1)
506 # define AO_HAVE_fetch_and_add1_acquire
508 #if defined(AO_HAVE_fetch_and_add_write) &&\
509 !defined(AO_HAVE_fetch_and_add1_write)
510 # define AO_fetch_and_add1_write(addr) AO_fetch_and_add_write(addr,1)
511 # define AO_HAVE_fetch_and_add1_write
513 #if defined(AO_HAVE_fetch_and_add_read) &&\
514 !defined(AO_HAVE_fetch_and_add1_read)
515 # define AO_fetch_and_add1_read(addr) AO_fetch_and_add_read(addr,1)
516 # define AO_HAVE_fetch_and_add1_read
518 #if defined(AO_HAVE_fetch_and_add_release_write) &&\
519 !defined(AO_HAVE_fetch_and_add1_release_write)
520 # define AO_fetch_and_add1_release_write(addr) \
521 AO_fetch_and_add_release_write(addr,1)
522 # define AO_HAVE_fetch_and_add1_release_write
524 #if defined(AO_HAVE_fetch_and_add_acquire_read) &&\
525 !defined(AO_HAVE_fetch_and_add1_acquire_read)
526 # define AO_fetch_and_add1_acquire_read(addr) \
527 AO_fetch_and_add_acquire_read(addr,1)
528 # define AO_HAVE_fetch_and_add1_acquire_read
530 #if defined(AO_HAVE_fetch_and_add) &&\
531 !defined(AO_HAVE_fetch_and_add1)
532 # define AO_fetch_and_add1(addr) \
533 AO_fetch_and_add(addr,1)
534 # define AO_HAVE_fetch_and_add1
537 #if defined(AO_HAVE_fetch_and_add1_full)
538 # if !defined(AO_HAVE_fetch_and_add1_release)
539 # define AO_fetch_and_add1_release(addr) \
540 AO_fetch_and_add1_full(addr)
541 # define AO_HAVE_fetch_and_add1_release
543 # if !defined(AO_HAVE_fetch_and_add1_acquire)
544 # define AO_fetch_and_add1_acquire(addr) \
545 AO_fetch_and_add1_full(addr)
546 # define AO_HAVE_fetch_and_add1_acquire
548 # if !defined(AO_HAVE_fetch_and_add1_write)
549 # define AO_fetch_and_add1_write(addr) \
550 AO_fetch_and_add1_full(addr)
551 # define AO_HAVE_fetch_and_add1_write
553 # if !defined(AO_HAVE_fetch_and_add1_read)
554 # define AO_fetch_and_add1_read(addr) \
555 AO_fetch_and_add1_full(addr)
556 # define AO_HAVE_fetch_and_add1_read
558 #endif /* AO_HAVE_fetch_and_add1_full */
560 #if !defined(AO_HAVE_fetch_and_add1) && \
561 defined(AO_HAVE_fetch_and_add1_release)
562 # define AO_fetch_and_add1(addr) \
563 AO_fetch_and_add1_release(addr)
564 # define AO_HAVE_fetch_and_add1
566 #if !defined(AO_HAVE_fetch_and_add1) && \
567 defined(AO_HAVE_fetch_and_add1_acquire)
568 # define AO_fetch_and_add1(addr) \
569 AO_fetch_and_add1_acquire(addr)
570 # define AO_HAVE_fetch_and_add1
572 #if !defined(AO_HAVE_fetch_and_add1) && \
573 defined(AO_HAVE_fetch_and_add1_write)
574 # define AO_fetch_and_add1(addr) \
575 AO_fetch_and_add1_write(addr)
576 # define AO_HAVE_fetch_and_add1
578 #if !defined(AO_HAVE_fetch_and_add1) && \
579 defined(AO_HAVE_fetch_and_add1_read)
580 # define AO_fetch_and_add1(addr) \
581 AO_fetch_and_add1_read(addr)
582 # define AO_HAVE_fetch_and_add1
585 #if defined(AO_HAVE_fetch_and_add1_acquire) &&\
586 defined(AO_HAVE_nop_full) && \
587 !defined(AO_HAVE_fetch_and_add1_full)
588 # define AO_fetch_and_add1_full(addr) \
589 (AO_nop_full(), AO_fetch_and_add1_acquire(addr))
590 # define AO_HAVE_fetch_and_add1_full
593 #if !defined(AO_HAVE_fetch_and_add1_release_write) && \
594 defined(AO_HAVE_fetch_and_add1_write)
595 # define AO_fetch_and_add1_release_write(addr) \
596 AO_fetch_and_add1_write(addr)
597 # define AO_HAVE_fetch_and_add1_release_write
599 #if !defined(AO_HAVE_fetch_and_add1_release_write) && \
600 defined(AO_HAVE_fetch_and_add1_release)
601 # define AO_fetch_and_add1_release_write(addr) \
602 AO_fetch_and_add1_release(addr)
603 # define AO_HAVE_fetch_and_add1_release_write
605 #if !defined(AO_HAVE_fetch_and_add1_acquire_read) && \
606 defined(AO_HAVE_fetch_and_add1_read)
607 # define AO_fetch_and_add1_acquire_read(addr) \
608 AO_fetch_and_add1_read(addr)
609 # define AO_HAVE_fetch_and_add1_acquire_read
611 #if !defined(AO_HAVE_fetch_and_add1_acquire_read) && \
612 defined(AO_HAVE_fetch_and_add1_acquire)
613 # define AO_fetch_and_add1_acquire_read(addr) \
614 AO_fetch_and_add1_acquire(addr)
615 # define AO_HAVE_fetch_and_add1_acquire_read
618 #ifdef AO_NO_DD_ORDERING
619 # if defined(AO_HAVE_fetch_and_add1_acquire_read)
620 # define AO_fetch_and_add1_dd_acquire_read(addr) \
621 AO_fetch_and_add1_acquire_read(addr)
622 # define AO_HAVE_fetch_and_add1_dd_acquire_read
625 # if defined(AO_HAVE_fetch_and_add1)
626 # define AO_fetch_and_add1_dd_acquire_read(addr) AO_fetch_and_add1(addr)
627 # define AO_HAVE_fetch_and_add1_dd_acquire_read
633 #if defined(AO_HAVE_fetch_and_add_full) &&\
634 !defined(AO_HAVE_fetch_and_sub1_full)
635 # define AO_fetch_and_sub1_full(addr) AO_fetch_and_add_full(addr,(AO_t)(-1))
636 # define AO_HAVE_fetch_and_sub1_full
638 #if defined(AO_HAVE_fetch_and_add_release) &&\
639 !defined(AO_HAVE_fetch_and_sub1_release)
640 # define AO_fetch_and_sub1_release(addr) \
641 AO_fetch_and_add_release(addr,(AO_t)(-1))
642 # define AO_HAVE_fetch_and_sub1_release
644 #if defined(AO_HAVE_fetch_and_add_acquire) &&\
645 !defined(AO_HAVE_fetch_and_sub1_acquire)
646 # define AO_fetch_and_sub1_acquire(addr) \
647 AO_fetch_and_add_acquire(addr,(AO_t)(-1))
648 # define AO_HAVE_fetch_and_sub1_acquire
650 #if defined(AO_HAVE_fetch_and_add_write) &&\
651 !defined(AO_HAVE_fetch_and_sub1_write)
652 # define AO_fetch_and_sub1_write(addr) \
653 AO_fetch_and_add_write(addr,(AO_t)(-1))
654 # define AO_HAVE_fetch_and_sub1_write
656 #if defined(AO_HAVE_fetch_and_add_read) &&\
657 !defined(AO_HAVE_fetch_and_sub1_read)
658 # define AO_fetch_and_sub1_read(addr) \
659 AO_fetch_and_add_read(addr,(AO_t)(-1))
660 # define AO_HAVE_fetch_and_sub1_read
662 #if defined(AO_HAVE_fetch_and_add_release_write) &&\
663 !defined(AO_HAVE_fetch_and_sub1_release_write)
664 # define AO_fetch_and_sub1_release_write(addr) \
665 AO_fetch_and_add_release_write(addr,(AO_t)(-1))
666 # define AO_HAVE_fetch_and_sub1_release_write
668 #if defined(AO_HAVE_fetch_and_add_acquire_read) &&\
669 !defined(AO_HAVE_fetch_and_sub1_acquire_read)
670 # define AO_fetch_and_sub1_acquire_read(addr) \
671 AO_fetch_and_add_acquire_read(addr,(AO_t)(-1))
672 # define AO_HAVE_fetch_and_sub1_acquire_read
674 #if defined(AO_HAVE_fetch_and_add) &&\
675 !defined(AO_HAVE_fetch_and_sub1)
676 # define AO_fetch_and_sub1(addr) \
677 AO_fetch_and_add(addr,(AO_t)(-1))
678 # define AO_HAVE_fetch_and_sub1
681 #if defined(AO_HAVE_fetch_and_sub1_full)
682 # if !defined(AO_HAVE_fetch_and_sub1_release)
683 # define AO_fetch_and_sub1_release(addr) \
684 AO_fetch_and_sub1_full(addr)
685 # define AO_HAVE_fetch_and_sub1_release
687 # if !defined(AO_HAVE_fetch_and_sub1_acquire)
688 # define AO_fetch_and_sub1_acquire(addr) \
689 AO_fetch_and_sub1_full(addr)
690 # define AO_HAVE_fetch_and_sub1_acquire
692 # if !defined(AO_HAVE_fetch_and_sub1_write)
693 # define AO_fetch_and_sub1_write(addr) \
694 AO_fetch_and_sub1_full(addr)
695 # define AO_HAVE_fetch_and_sub1_write
697 # if !defined(AO_HAVE_fetch_and_sub1_read)
698 # define AO_fetch_and_sub1_read(addr) \
699 AO_fetch_and_sub1_full(addr)
700 # define AO_HAVE_fetch_and_sub1_read
702 #endif /* AO_HAVE_fetch_and_sub1_full */
704 #if !defined(AO_HAVE_fetch_and_sub1) && \
705 defined(AO_HAVE_fetch_and_sub1_release)
706 # define AO_fetch_and_sub1(addr) \
707 AO_fetch_and_sub1_release(addr)
708 # define AO_HAVE_fetch_and_sub1
710 #if !defined(AO_HAVE_fetch_and_sub1) && \
711 defined(AO_HAVE_fetch_and_sub1_acquire)
712 # define AO_fetch_and_sub1(addr) \
713 AO_fetch_and_sub1_acquire(addr)
714 # define AO_HAVE_fetch_and_sub1
716 #if !defined(AO_HAVE_fetch_and_sub1) && \
717 defined(AO_HAVE_fetch_and_sub1_write)
718 # define AO_fetch_and_sub1(addr) \
719 AO_fetch_and_sub1_write(addr)
720 # define AO_HAVE_fetch_and_sub1
722 #if !defined(AO_HAVE_fetch_and_sub1) && \
723 defined(AO_HAVE_fetch_and_sub1_read)
724 # define AO_fetch_and_sub1(addr) \
725 AO_fetch_and_sub1_read(addr)
726 # define AO_HAVE_fetch_and_sub1
729 #if defined(AO_HAVE_fetch_and_sub1_acquire) &&\
730 defined(AO_HAVE_nop_full) && \
731 !defined(AO_HAVE_fetch_and_sub1_full)
732 # define AO_fetch_and_sub1_full(addr) \
733 (AO_nop_full(), AO_fetch_and_sub1_acquire(addr))
734 # define AO_HAVE_fetch_and_sub1_full
737 #if !defined(AO_HAVE_fetch_and_sub1_release_write) && \
738 defined(AO_HAVE_fetch_and_sub1_write)
739 # define AO_fetch_and_sub1_release_write(addr) \
740 AO_fetch_and_sub1_write(addr)
741 # define AO_HAVE_fetch_and_sub1_release_write
743 #if !defined(AO_HAVE_fetch_and_sub1_release_write) && \
744 defined(AO_HAVE_fetch_and_sub1_release)
745 # define AO_fetch_and_sub1_release_write(addr) \
746 AO_fetch_and_sub1_release(addr)
747 # define AO_HAVE_fetch_and_sub1_release_write
749 #if !defined(AO_HAVE_fetch_and_sub1_acquire_read) && \
750 defined(AO_HAVE_fetch_and_sub1_read)
751 # define AO_fetch_and_sub1_acquire_read(addr) \
752 AO_fetch_and_sub1_read(addr)
753 # define AO_HAVE_fetch_and_sub1_acquire_read
755 #if !defined(AO_HAVE_fetch_and_sub1_acquire_read) && \
756 defined(AO_HAVE_fetch_and_sub1_acquire)
757 # define AO_fetch_and_sub1_acquire_read(addr) \
758 AO_fetch_and_sub1_acquire(addr)
759 # define AO_HAVE_fetch_and_sub1_acquire_read
762 #ifdef AO_NO_DD_ORDERING
763 # if defined(AO_HAVE_fetch_and_sub1_acquire_read)
764 # define AO_fetch_and_sub1_dd_acquire_read(addr) \
765 AO_fetch_and_sub1_acquire_read(addr)
766 # define AO_HAVE_fetch_and_sub1_dd_acquire_read
769 # if defined(AO_HAVE_fetch_and_sub1)
770 # define AO_fetch_and_sub1_dd_acquire_read(addr) AO_fetch_and_sub1(addr)
771 # define AO_HAVE_fetch_and_sub1_dd_acquire_read
776 #if defined(AO_HAVE_compare_and_swap_full) && \
777 !defined(AO_HAVE_or_full)
779 AO_or_full(volatile AO_t *addr, AO_t incr)
786 while (!AO_compare_and_swap_full(addr, old, (old | incr)));
788 # define AO_HAVE_or_full
791 #if defined(AO_HAVE_or_full)
792 # if !defined(AO_HAVE_or_release)
793 # define AO_or_release(addr, val) \
794 AO_or_full(addr, val)
795 # define AO_HAVE_or_release
797 # if !defined(AO_HAVE_or_acquire)
798 # define AO_or_acquire(addr, val) \
799 AO_or_full(addr, val)
800 # define AO_HAVE_or_acquire
802 # if !defined(AO_HAVE_or_write)
803 # define AO_or_write(addr, val) \
804 AO_or_full(addr, val)
805 # define AO_HAVE_or_write
807 # if !defined(AO_HAVE_or_read)
808 # define AO_or_read(addr, val) \
809 AO_or_full(addr, val)
810 # define AO_HAVE_or_read
812 #endif /* AO_HAVE_or_full */
814 #if !defined(AO_HAVE_or) && \
815 defined(AO_HAVE_or_release)
816 # define AO_or(addr, val) \
817 AO_or_release(addr, val)
820 #if !defined(AO_HAVE_or) && \
821 defined(AO_HAVE_or_acquire)
822 # define AO_or(addr, val) \
823 AO_or_acquire(addr, val)
826 #if !defined(AO_HAVE_or) && \
827 defined(AO_HAVE_or_write)
828 # define AO_or(addr, val) \
829 AO_or_write(addr, val)
832 #if !defined(AO_HAVE_or) && \
833 defined(AO_HAVE_or_read)
834 # define AO_or(addr, val) \
835 AO_or_read(addr, val)
839 #if defined(AO_HAVE_or_acquire) &&\
840 defined(AO_HAVE_nop_full) && \
841 !defined(AO_HAVE_or_full)
842 # define AO_or_full(addr, val) \
843 (AO_nop_full(), AO_or_acquire(addr, val))
846 #if !defined(AO_HAVE_or_release_write) && \
847 defined(AO_HAVE_or_write)
848 # define AO_or_release_write(addr, val) \
849 AO_or_write(addr, val)
850 # define AO_HAVE_or_release_write
852 #if !defined(AO_HAVE_or_release_write) && \
853 defined(AO_HAVE_or_release)
854 # define AO_or_release_write(addr, val) \
855 AO_or_release(addr, val)
856 # define AO_HAVE_or_release_write
858 #if !defined(AO_HAVE_or_acquire_read) && \
859 defined(AO_HAVE_or_read)
860 # define AO_or_acquire_read(addr, val) \
861 AO_or_read(addr, val)
862 # define AO_HAVE_or_acquire_read
864 #if !defined(AO_HAVE_or_acquire_read) && \
865 defined(AO_HAVE_or_acquire)
866 # define AO_or_acquire_read(addr, val) \
867 AO_or_acquire(addr, val)
868 # define AO_HAVE_or_acquire_read
871 /* dd_aquire_read is meaningless. */
875 #if defined(AO_HAVE_test_and_set_full)
876 # if !defined(AO_HAVE_test_and_set_release)
877 # define AO_test_and_set_release(addr) \
878 AO_test_and_set_full(addr)
879 # define AO_HAVE_test_and_set_release
881 # if !defined(AO_HAVE_test_and_set_acquire)
882 # define AO_test_and_set_acquire(addr) \
883 AO_test_and_set_full(addr)
884 # define AO_HAVE_test_and_set_acquire
886 # if !defined(AO_HAVE_test_and_set_write)
887 # define AO_test_and_set_write(addr) \
888 AO_test_and_set_full(addr)
889 # define AO_HAVE_test_and_set_write
891 # if !defined(AO_HAVE_test_and_set_read)
892 # define AO_test_and_set_read(addr) \
893 AO_test_and_set_full(addr)
894 # define AO_HAVE_test_and_set_read
896 #endif /* AO_HAVE_test_and_set_full */
898 #if !defined(AO_HAVE_test_and_set) && \
899 defined(AO_HAVE_test_and_set_release)
900 # define AO_test_and_set(addr) \
901 AO_test_and_set_release(addr)
902 # define AO_HAVE_test_and_set
904 #if !defined(AO_HAVE_test_and_set) && \
905 defined(AO_HAVE_test_and_set_acquire)
906 # define AO_test_and_set(addr) \
907 AO_test_and_set_acquire(addr)
908 # define AO_HAVE_test_and_set
910 #if !defined(AO_HAVE_test_and_set) && \
911 defined(AO_HAVE_test_and_set_write)
912 # define AO_test_and_set(addr) \
913 AO_test_and_set_write(addr)
914 # define AO_HAVE_test_and_set
916 #if !defined(AO_HAVE_test_and_set) && \
917 defined(AO_HAVE_test_and_set_read)
918 # define AO_test_and_set(addr) \
919 AO_test_and_set_read(addr)
920 # define AO_HAVE_test_and_set
923 #if defined(AO_HAVE_test_and_set_acquire) &&\
924 defined(AO_HAVE_nop_full) && \
925 !defined(AO_HAVE_test_and_set_full)
926 # define AO_test_and_set_full(addr) \
927 (AO_nop_full(), AO_test_and_set_acquire(addr))
928 # define AO_HAVE_test_and_set_full
931 #if !defined(AO_HAVE_test_and_set_release_write) && \
932 defined(AO_HAVE_test_and_set_write)
933 # define AO_test_and_set_release_write(addr) \
934 AO_test_and_set_write(addr)
935 # define AO_HAVE_test_and_set_release_write
937 #if !defined(AO_HAVE_test_and_set_release_write) && \
938 defined(AO_HAVE_test_and_set_release)
939 # define AO_test_and_set_release_write(addr) \
940 AO_test_and_set_release(addr)
941 # define AO_HAVE_test_and_set_release_write
943 #if !defined(AO_HAVE_test_and_set_acquire_read) && \
944 defined(AO_HAVE_test_and_set_read)
945 # define AO_test_and_set_acquire_read(addr) \
946 AO_test_and_set_read(addr)
947 # define AO_HAVE_test_and_set_acquire_read
949 #if !defined(AO_HAVE_test_and_set_acquire_read) && \
950 defined(AO_HAVE_test_and_set_acquire)
951 # define AO_test_and_set_acquire_read(addr) \
952 AO_test_and_set_acquire(addr)
953 # define AO_HAVE_test_and_set_acquire_read
956 #ifdef AO_NO_DD_ORDERING
957 # if defined(AO_HAVE_test_and_set_acquire_read)
958 # define AO_test_and_set_dd_acquire_read(addr) \
959 AO_test_and_set_acquire_read(addr)
960 # define AO_HAVE_test_and_set_dd_acquire_read
963 # if defined(AO_HAVE_test_and_set)
964 # define AO_test_and_set_dd_acquire_read(addr) AO_test_and_set(addr)
965 # define AO_HAVE_test_and_set_dd_acquire_read
969 /* Compare_and_swap */
970 #if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full)\
971 && !defined(AO_HAVE_compare_and_swap_acquire)
973 AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val)
975 int result = AO_compare_and_swap(addr, old, new_val);
979 # define AO_HAVE_compare_and_swap_acquire
981 #if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full)\
982 && !defined(AO_HAVE_compare_and_swap_release)
983 # define AO_compare_and_swap_release(addr, old, new_val) \
984 (AO_nop_full(), AO_compare_and_swap(addr, old, new_val))
985 # define AO_HAVE_compare_and_swap_release
987 #if defined(AO_HAVE_compare_and_swap_full)
988 # if !defined(AO_HAVE_compare_and_swap_release)
989 # define AO_compare_and_swap_release(addr, old, new_val) \
990 AO_compare_and_swap_full(addr, old, new_val)
991 # define AO_HAVE_compare_and_swap_release
993 # if !defined(AO_HAVE_compare_and_swap_acquire)
994 # define AO_compare_and_swap_acquire(addr, old, new_val) \
995 AO_compare_and_swap_full(addr, old, new_val)
996 # define AO_HAVE_compare_and_swap_acquire
998 # if !defined(AO_HAVE_compare_and_swap_write)
999 # define AO_compare_and_swap_write(addr, old, new_val) \
1000 AO_compare_and_swap_full(addr, old, new_val)
1001 # define AO_HAVE_compare_and_swap_write
1003 # if !defined(AO_HAVE_compare_and_swap_read)
1004 # define AO_compare_and_swap_read(addr, old, new_val) \
1005 AO_compare_and_swap_full(addr, old, new_val)
1006 # define AO_HAVE_compare_and_swap_read
1008 #endif /* AO_HAVE_compare_and_swap_full */
1010 #if !defined(AO_HAVE_compare_and_swap) && \
1011 defined(AO_HAVE_compare_and_swap_release)
1012 # define AO_compare_and_swap(addr, old, new_val) \
1013 AO_compare_and_swap_release(addr, old, new_val)
1014 # define AO_HAVE_compare_and_swap
1016 #if !defined(AO_HAVE_compare_and_swap) && \
1017 defined(AO_HAVE_compare_and_swap_acquire)
1018 # define AO_compare_and_swap(addr, old, new_val) \
1019 AO_compare_and_swap_acquire(addr, old, new_val)
1020 # define AO_HAVE_compare_and_swap
1022 #if !defined(AO_HAVE_compare_and_swap) && \
1023 defined(AO_HAVE_compare_and_swap_write)
1024 # define AO_compare_and_swap(addr, old, new_val) \
1025 AO_compare_and_swap_write(addr, old, new_val)
1026 # define AO_HAVE_compare_and_swap
1028 #if !defined(AO_HAVE_compare_and_swap) && \
1029 defined(AO_HAVE_compare_and_swap_read)
1030 # define AO_compare_and_swap(addr, old, new_val) \
1031 AO_compare_and_swap_read(addr, old, new_val)
1032 # define AO_HAVE_compare_and_swap
1035 #if defined(AO_HAVE_compare_and_swap_acquire) &&\
1036 defined(AO_HAVE_nop_full) && \
1037 !defined(AO_HAVE_compare_and_swap_full)
1038 # define AO_compare_and_swap_full(addr, old, new_val) \
1039 (AO_nop_full(), AO_compare_and_swap_acquire(addr, old, new_val))
1040 # define AO_HAVE_compare_and_swap_full
1043 #if !defined(AO_HAVE_compare_and_swap_release_write) && \
1044 defined(AO_HAVE_compare_and_swap_write)
1045 # define AO_compare_and_swap_release_write(addr, old, new_val) \
1046 AO_compare_and_swap_write(addr, old, new_val)
1047 # define AO_HAVE_compare_and_swap_release_write
1049 #if !defined(AO_HAVE_compare_and_swap_release_write) && \
1050 defined(AO_HAVE_compare_and_swap_release)
1051 # define AO_compare_and_swap_release_write(addr, old, new_val) \
1052 AO_compare_and_swap_release(addr, old, new_val)
1053 # define AO_HAVE_compare_and_swap_release_write
1055 #if !defined(AO_HAVE_compare_and_swap_acquire_read) && \
1056 defined(AO_HAVE_compare_and_swap_read)
1057 # define AO_compare_and_swap_acquire_read(addr, old, new_val) \
1058 AO_compare_and_swap_read(addr, old, new_val)
1059 # define AO_HAVE_compare_and_swap_acquire_read
1061 #if !defined(AO_HAVE_compare_and_swap_acquire_read) && \
1062 defined(AO_HAVE_compare_and_swap_acquire)
1063 # define AO_compare_and_swap_acquire_read(addr, old, new_val) \
1064 AO_compare_and_swap_acquire(addr, old, new_val)
1065 # define AO_HAVE_compare_and_swap_acquire_read
1068 #ifdef AO_NO_DD_ORDERING
1069 # if defined(AO_HAVE_compare_and_swap_acquire_read)
1070 # define AO_compare_and_swap_dd_acquire_read(addr, old, new_val) \
1071 AO_compare_and_swap_acquire_read(addr, old, new_val)
1072 # define AO_HAVE_compare_and_swap_dd_acquire_read
1075 # if defined(AO_HAVE_compare_and_swap)
1076 # define AO_compare_and_swap_dd_acquire_read(addr, old, new_val) \
1077 AO_compare_and_swap(addr, old, new_val)
1078 # define AO_HAVE_compare_and_swap_dd_acquire_read
1082 #include "generalize-small.h"
1084 /* Compare_double_and_swap_double */
1085 #if defined(AO_HAVE_compare_double_and_swap_double) && defined(AO_HAVE_nop_full)\
1086 && !defined(AO_HAVE_compare_double_and_swap_double_acquire)
1088 AO_compare_double_and_swap_double_acquire(volatile AO_double_t *addr,
1092 int result = AO_compare_double_and_swap_double(addr, o1, o2, n1, n2);
1096 # define AO_HAVE_compare_double_and_swap_double_acquire
1098 #if defined(AO_HAVE_compare_double_and_swap_double) \
1099 && defined(AO_HAVE_nop_full)\
1100 && !defined(AO_HAVE_compare_double_and_swap_double_release)
1101 # define AO_compare_double_and_swap_double_release(addr, o1, o2, n1, n2) \
1102 (AO_nop_full(), AO_compare_double_and_swap_double(addr, o1, o2, n1, n2))
1103 # define AO_HAVE_compare_double_and_swap_double_release
1105 #if defined(AO_HAVE_compare_double_and_swap_double_full)
1106 # if !defined(AO_HAVE_compare_double_and_swap_double_release)
1107 # define AO_compare_double_and_swap_double_release(addr, o1, o2, n1, n2) \
1108 AO_compare_double_and_swap_double_full(addr, o1, o2, n1, n2)
1109 # define AO_HAVE_compare_double_and_swap_double_release
1111 # if !defined(AO_HAVE_compare_double_and_swap_double_acquire)
1112 # define AO_compare_double_and_swap_double_acquire(addr, o1, o2, n1, n2) \
1113 AO_compare_double_and_swap_double_full(addr, o1, o2, n1, n2)
1114 # define AO_HAVE_compare_double_and_swap_double_acquire
1116 # if !defined(AO_HAVE_compare_double_and_swap_double_write)
1117 # define AO_compare_double_and_swap_double_write(addr, o1, o2, n1, n2) \
1118 AO_compare_double_and_swap_double_full(addr, o1, o2, n1, n2)
1119 # define AO_HAVE_compare_double_and_swap_double_write
1121 # if !defined(AO_HAVE_compare_double_and_swap_double_read)
1122 # define AO_compare_double_and_swap_double_read(addr, o1, o2, n1, n2) \
1123 AO_compare_double_and_swap_double_full(addr, o1, o2, n1, n2)
1124 # define AO_HAVE_compare_double_and_swap_double_read
1126 #endif /* AO_HAVE_compare_double_and_swap_double_full */
1128 #if !defined(AO_HAVE_compare_double_and_swap_double) && \
1129 defined(AO_HAVE_compare_double_and_swap_double_release)
1130 # define AO_compare_double_and_swap_double(addr, o1, o2, n1, n2) \
1131 AO_compare_double_and_swap_double_release(addr, o1, o2, n1, n2)
1132 # define AO_HAVE_compare_double_and_swap_double
1134 #if !defined(AO_HAVE_compare_double_and_swap_double) && \
1135 defined(AO_HAVE_compare_double_and_swap_double_acquire)
1136 # define AO_compare_double_and_swap_double(addr, o1, o2, n1, n2) \
1137 AO_compare_double_and_swap_double_acquire(addr, o1, o2, n1, n2)
1138 # define AO_HAVE_compare_double_and_swap_double
1140 #if !defined(AO_HAVE_compare_double_and_swap_double) && \
1141 defined(AO_HAVE_compare_double_and_swap_double_write)
1142 # define AO_compare_double_and_swap_double(addr, o1, o2, n1, n2) \
1143 AO_compare_double_and_swap_double_write(addr, o1, o2, n1, n2)
1144 # define AO_HAVE_compare_double_and_swap_double
1146 #if !defined(AO_HAVE_compare_double_and_swap_double) && \
1147 defined(AO_HAVE_compare_double_and_swap_double_read)
1148 # define AO_compare_double_and_swap_double(addr, o1, o2, n1, n2) \
1149 AO_compare_double_and_swap_double_read(addr, o1, o2, n1, n2)
1150 # define AO_HAVE_compare_double_and_swap_double
1153 #if defined(AO_HAVE_compare_double_and_swap_double_acquire) &&\
1154 defined(AO_HAVE_nop_full) && \
1155 !defined(AO_HAVE_compare_double_and_swap_double_full)
1156 # define AO_compare_double_and_swap_double_full(addr, o1, o2, n1, n2) \
1157 (AO_nop_full(), AO_compare_double_and_swap_double_acquire(addr, o1, o2, n1, n2))
1158 # define AO_HAVE_compare_double_and_swap_double_full
1161 #if !defined(AO_HAVE_compare_double_and_swap_double_release_write) && \
1162 defined(AO_HAVE_compare_double_and_swap_double_write)
1163 # define AO_compare_double_and_swap_double_release_write(addr, o1, o2, n1, n2) \
1164 AO_compare_double_and_swap_double_write(addr, o1, o2, n1, n2)
1165 # define AO_HAVE_compare_double_and_swap_double_release_write
1167 #if !defined(AO_HAVE_compare_double_and_swap_double_release_write) && \
1168 defined(AO_HAVE_compare_double_and_swap_double_release)
1169 # define AO_compare_double_and_swap_double_release_write(addr, o1, o2, n1, n2) \
1170 AO_compare_double_and_swap_double_release(addr, o1, o2, n1, n2)
1171 # define AO_HAVE_compare_double_and_swap_double_release_write
1173 #if !defined(AO_HAVE_compare_double_and_swap_double_acquire_read) && \
1174 defined(AO_HAVE_compare_double_and_swap_double_read)
1175 # define AO_compare_double_and_swap_double_acquire_read(addr, o1, o2, n1, n2) \
1176 AO_compare_double_and_swap_double_read(addr, o1, o2, n1, n2)
1177 # define AO_HAVE_compare_double_and_swap_double_acquire_read
1179 #if !defined(AO_HAVE_compare_double_and_swap_double_acquire_read) && \
1180 defined(AO_HAVE_compare_double_and_swap_double_acquire)
1181 # define AO_compare_double_and_swap_double_acquire_read(addr, o1, o2, n1, n2) \
1182 AO_compare_double_and_swap_double_acquire(addr, o1, o2, n1, n2)
1183 # define AO_HAVE_compare_double_and_swap_double_acquire_read
1186 #ifdef AO_NO_DD_ORDERING
1187 # if defined(AO_HAVE_compare_double_and_swap_double_acquire_read)
1188 # define AO_compare_double_and_swap_double_dd_acquire_read(addr, o1, o2, n1, n2) \
1189 AO_compare_double_and_swap_double_acquire_read(addr, o1, o2, n1, n2)
1190 # define AO_HAVE_compare_double_and_swap_double_dd_acquire_read
1193 # if defined(AO_HAVE_compare_double_and_swap_double)
1194 # define AO_compare_double_and_swap_double_dd_acquire_read(addr, o1, o2, n1, n2) \
1195 AO_compare_double_and_swap_double(addr, o1, o2, n1, n2)
1196 # define AO_HAVE_compare_double_and_swap_double_dd_acquire_read
1200 /* Compare_and_swap_double */
1201 #if defined(AO_HAVE_compare_and_swap_double) && defined(AO_HAVE_nop_full)\
1202 && !defined(AO_HAVE_compare_and_swap_double_acquire)
1204 AO_compare_and_swap_double_acquire(volatile AO_double_t *addr,
1208 int result = AO_compare_and_swap_double(addr, o1, n1, n2);
1212 # define AO_HAVE_compare_and_swap_double_acquire
1214 #if defined(AO_HAVE_compare_and_swap_double) \
1215 && defined(AO_HAVE_nop_full)\
1216 && !defined(AO_HAVE_compare_and_swap_double_release)
1217 # define AO_compare_and_swap_double_release(addr, o1, n1, n2) \
1218 (AO_nop_full(), AO_compare_and_swap_double(addr, o1, n1, n2))
1219 # define AO_HAVE_compare_and_swap_double_release
1221 #if defined(AO_HAVE_compare_and_swap_double_full)
1222 # if !defined(AO_HAVE_compare_and_swap_double_release)
1223 # define AO_compare_and_swap_double_release(addr, o1, n1, n2) \
1224 AO_compare_and_swap_double_full(addr, o1, n1, n2)
1225 # define AO_HAVE_compare_and_swap_double_release
1227 # if !defined(AO_HAVE_compare_and_swap_double_acquire)
1228 # define AO_compare_and_swap_double_acquire(addr, o1, n1, n2) \
1229 AO_compare_and_swap_double_full(addr, o1, n1, n2)
1230 # define AO_HAVE_compare_and_swap_double_acquire
1232 # if !defined(AO_HAVE_compare_and_swap_double_write)
1233 # define AO_compare_and_swap_double_write(addr, o1, n1, n2) \
1234 AO_compare_and_swap_double_full(addr, o1, n1, n2)
1235 # define AO_HAVE_compare_and_swap_double_write
1237 # if !defined(AO_HAVE_compare_and_swap_double_read)
1238 # define AO_compare_and_swap_double_read(addr, o1, n1, n2) \
1239 AO_compare_and_swap_double_full(addr, o1, n1, n2)
1240 # define AO_HAVE_compare_and_swap_double_read
1242 #endif /* AO_HAVE_compare_and_swap_double_full */
1244 #if !defined(AO_HAVE_compare_and_swap_double) && \
1245 defined(AO_HAVE_compare_and_swap_double_release)
1246 # define AO_compare_and_swap_double(addr, o1, n1, n2) \
1247 AO_compare_and_swap_double_release(addr, o1, n1, n2)
1248 # define AO_HAVE_compare_and_swap_double
1250 #if !defined(AO_HAVE_compare_and_swap_double) && \
1251 defined(AO_HAVE_compare_and_swap_double_acquire)
1252 # define AO_compare_and_swap_double(addr, o1, n1, n2) \
1253 AO_compare_and_swap_double_acquire(addr, o1, n1, n2)
1254 # define AO_HAVE_compare_and_swap_double
1256 #if !defined(AO_HAVE_compare_and_swap_double) && \
1257 defined(AO_HAVE_compare_and_swap_double_write)
1258 # define AO_compare_and_swap_double(addr, o1, n1, n2) \
1259 AO_compare_and_swap_double_write(addr, o1, n1, n2)
1260 # define AO_HAVE_compare_and_swap_double
1262 #if !defined(AO_HAVE_compare_and_swap_double) && \
1263 defined(AO_HAVE_compare_and_swap_double_read)
1264 # define AO_compare_and_swap_double(addr, o1, n1, n2) \
1265 AO_compare_and_swap_double_read(addr, o1, n1, n2)
1266 # define AO_HAVE_compare_and_swap_double
1269 #if defined(AO_HAVE_compare_and_swap_double_acquire) &&\
1270 defined(AO_HAVE_nop_full) && \
1271 !defined(AO_HAVE_compare_and_swap_double_full)
1272 # define AO_compare_and_swap_double_full(addr, o1, n1, n2) \
1273 (AO_nop_full(), AO_compare_and_swap_double_acquire(addr, o1, n1, n2))
1274 # define AO_HAVE_compare_and_swap_double_full
1277 #if !defined(AO_HAVE_compare_and_swap_double_release_write) && \
1278 defined(AO_HAVE_compare_and_swap_double_write)
1279 # define AO_compare_and_swap_double_release_write(addr, o1, n1, n2) \
1280 AO_compare_and_swap_double_write(addr, o1, n1, n2)
1281 # define AO_HAVE_compare_and_swap_double_release_write
1283 #if !defined(AO_HAVE_compare_and_swap_double_release_write) && \
1284 defined(AO_HAVE_compare_and_swap_double_release)
1285 # define AO_compare_and_swap_double_release_write(addr, o1, n1, n2) \
1286 AO_compare_and_swap_double_release(addr, o1, n1, n2)
1287 # define AO_HAVE_compare_and_swap_double_release_write
1289 #if !defined(AO_HAVE_compare_and_swap_double_acquire_read) && \
1290 defined(AO_HAVE_compare_and_swap_double_read)
1291 # define AO_compare_and_swap_double_acquire_read(addr, o1, n1, n2) \
1292 AO_compare_and_swap_double_read(addr, o1, n1, n2)
1293 # define AO_HAVE_compare_and_swap_double_acquire_read
1295 #if !defined(AO_HAVE_compare_and_swap_double_acquire_read) && \
1296 defined(AO_HAVE_compare_and_swap_double_acquire)
1297 # define AO_compare_and_swap_double_acquire_read(addr, o1, n1, n2) \
1298 AO_compare_and_swap_double_acquire(addr, o1, n1, n2)
1299 # define AO_HAVE_compare_and_swap_double_acquire_read
1302 #ifdef AO_NO_DD_ORDERING
1303 # if defined(AO_HAVE_compare_and_swap_double_acquire_read)
1304 # define AO_compare_and_swap_double_dd_acquire_read(addr, o1, n1, n2) \
1305 AO_compare_and_swap_double_acquire_read(addr, o1, n1, n2)
1306 # define AO_HAVE_compare_and_swap_double_dd_acquire_read
1309 # if defined(AO_HAVE_compare_and_swap_double)
1310 # define AO_compare_and_swap_double_dd_acquire_read(addr, o1, n1, n2) \
1311 AO_compare_and_swap_double(addr, o1, n1, n2)
1312 # define AO_HAVE_compare_and_swap_double_dd_acquire_read
1316 /* NEC LE-IT: Convenience functions for AO_double compare and swap which */
1317 /* types and reads easier in code */
1318 #if defined(AO_HAVE_compare_double_and_swap_double_release) && \
1319 !defined(AO_HAVE_double_compare_and_swap_release)
1321 AO_double_compare_and_swap_release(volatile AO_double_t *addr,
1322 AO_double_t old_val, AO_double_t new_val)
1324 return AO_compare_double_and_swap_double_release(addr,
1325 old_val.AO_val1, old_val.AO_val2,
1326 new_val.AO_val1, new_val.AO_val2);
1328 #define AO_HAVE_double_compare_and_swap_release
1331 #if defined(AO_HAVE_compare_double_and_swap_double_acquire) && \
1332 !defined(AO_HAVE_double_compare_and_swap_acquire)
1334 AO_double_compare_and_swap_acquire(volatile AO_double_t *addr,
1335 AO_double_t old_val, AO_double_t new_val)
1337 return AO_compare_double_and_swap_double_acquire(addr,
1338 old_val.AO_val1, old_val.AO_val2,
1339 new_val.AO_val1, new_val.AO_val2);
1341 #define AO_HAVE_double_compare_and_swap_acquire
1344 #if defined(AO_HAVE_compare_double_and_swap_double_full) && \
1345 !defined(AO_HAVE_double_compare_and_swap_full)
1347 AO_double_compare_and_swap_full(volatile AO_double_t *addr,
1348 AO_double_t old_val, AO_double_t new_val)
1350 return AO_compare_double_and_swap_double_full(addr,
1351 old_val.AO_val1, old_val.AO_val2,
1352 new_val.AO_val1, new_val.AO_val2);
1354 #define AO_HAVE_double_compare_and_swap_full