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) AO_char_compare_and_swap(a,o,n)
61 # define AO_TS_COMPARE_AND_SWAP_FULL(a,o,n) AO_compare_and_swap_full(a,o,n)
62 # define AO_TS_COMPARE_AND_SWAP_ACQUIRE(a,o,n) \
63 AO_compare_and_swap_acquire(a,o,n)
64 # define AO_TS_COMPARE_AND_SWAP_RELEASE(a,o,n) \
65 AO_compare_and_swap_release(a,o,n)
66 # define AO_TS_COMPARE_AND_SWAP(a,o,n) AO_compare_and_swap(a,o,n)
69 /* Generate test_and_set_full, if necessary and possible. */
70 #if !defined(AO_HAVE_test_and_set) && !defined(AO_HAVE_test_and_set_release) \
71 && !defined(AO_HAVE_test_and_set_acquire) \
72 && !defined(AO_HAVE_test_and_set_read) \
73 && !defined(AO_HAVE_test_and_set_full)
74 # if (AO_AO_TS_T && defined(AO_HAVE_compare_and_swap_full)) \
75 || (AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap_full))
77 AO_test_and_set_full(volatile AO_TS_t *addr)
79 if (AO_TS_COMPARE_AND_SWAP_FULL(addr, AO_TS_CLEAR, AO_TS_SET))
84 # define AO_HAVE_test_and_set_full
85 # endif /* AO_HAVE_compare_and_swap_full */
87 # if (AO_AO_TS_T && defined(AO_HAVE_compare_and_swap_acquire)) \
88 || (AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap_acquire))
90 AO_test_and_set_acquire(volatile AO_TS_t *addr)
92 if (AO_TS_COMPARE_AND_SWAP_ACQUIRE(addr, AO_TS_CLEAR, AO_TS_SET))
97 # define AO_HAVE_test_and_set_acquire
98 # endif /* AO_HAVE_compare_and_swap_acquire */
100 # if (AO_AO_TS_T && defined(AO_HAVE_compare_and_swap_release)) \
101 || (AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap_release))
102 AO_INLINE AO_TS_VAL_t
103 AO_test_and_set_release(volatile AO_TS_t *addr)
105 if (AO_TS_COMPARE_AND_SWAP_RELEASE(addr, AO_TS_CLEAR, AO_TS_SET))
110 # define AO_HAVE_test_and_set_release
111 # endif /* AO_HAVE_compare_and_swap_release */
113 # if (AO_AO_TS_T && defined(AO_HAVE_compare_and_swap)) \
114 || (AO_CHAR_TS_T && defined(AO_HAVE_char_compare_and_swap))
115 AO_INLINE AO_TS_VAL_t
116 AO_test_and_set(volatile AO_TS_t *addr)
118 if (AO_TS_COMPARE_AND_SWAP(addr, AO_TS_CLEAR, AO_TS_SET))
123 # define AO_HAVE_test_and_set
124 # endif /* AO_HAVE_compare_and_swap */
126 # if defined(AO_HAVE_test_and_set) && defined(AO_HAVE_nop_full) \
127 && !defined(AO_HAVE_test_and_set_acquire)
128 AO_INLINE AO_TS_VAL_t
129 AO_test_and_set_acquire(volatile AO_TS_t *addr)
131 AO_TS_VAL_t result = AO_test_and_set(addr);
135 # define AO_HAVE_test_and_set_acquire
137 #endif /* No prior test and set */
140 #if !defined(AO_HAVE_nop)
141 AO_INLINE void AO_nop(void) {}
145 #if defined(AO_HAVE_test_and_set_full) && !defined(AO_HAVE_nop_full)
149 AO_TS_t dummy = AO_TS_INITIALIZER;
150 AO_test_and_set_full(&dummy);
152 # define AO_HAVE_nop_full
155 #if defined(AO_HAVE_nop_acquire)
156 # error AO_nop_acquire is useless: dont define.
158 #if defined(AO_HAVE_nop_release)
159 # error AO_nop_release is useless: dont define.
162 #if defined(AO_HAVE_nop_full) && !defined(AO_HAVE_nop_read)
163 # define AO_nop_read() AO_nop_full()
164 # define AO_HAVE_nop_read
167 #if defined(AO_HAVE_nop_full) && !defined(AO_HAVE_nop_write)
168 # define AO_nop_write() AO_nop_full()
169 # define AO_HAVE_nop_write
173 #if defined(AO_HAVE_load_full) && !defined(AO_HAVE_load_acquire)
174 # define AO_load_acquire(addr) AO_load_full(addr)
175 # define AO_HAVE_load_acquire
178 #if defined(AO_HAVE_load_acquire) && !defined(AO_HAVE_load)
179 # define AO_load(addr) AO_load_acquire(addr)
180 # define AO_HAVE_load
183 #if defined(AO_HAVE_load_full) && !defined(AO_HAVE_load_read)
184 # define AO_load_read(addr) AO_load_full(addr)
185 # define AO_HAVE_load_read
188 #if !defined(AO_HAVE_load_acquire_read) && defined(AO_HAVE_load_acquire)
189 # define AO_load_acquire_read(addr) AO_load_acquire(addr)
190 # define AO_HAVE_load_acquire_read
193 #if defined(AO_HAVE_load) && defined(AO_HAVE_nop_full) \
194 && !defined(AO_HAVE_load_acquire)
196 AO_load_acquire(const volatile AO_t *addr)
198 AO_t result = AO_load(addr);
199 /* Acquire barrier would be useless, since the load could be delayed */
204 # define AO_HAVE_load_acquire
207 #if defined(AO_HAVE_load) && defined(AO_HAVE_nop_read) \
208 && !defined(AO_HAVE_load_read)
210 AO_load_read(const volatile AO_t *addr)
212 AO_t result = AO_load(addr);
213 /* Acquire barrier would be useless, since the load could be delayed */
218 # define AO_HAVE_load_read
221 #if defined(AO_HAVE_load_acquire) && defined(AO_HAVE_nop_full) \
222 && !defined(AO_HAVE_load_full)
223 # define AO_load_full(addr) (AO_nop_full(), AO_load_acquire(addr))
224 # define AO_HAVE_load_full
227 #if !defined(AO_HAVE_load_acquire_read) && defined(AO_HAVE_load_read)
228 # define AO_load_acquire_read(addr) AO_load_read(addr)
229 # define AO_HAVE_load_acquire_read
232 #if defined(AO_HAVE_load_acquire_read) && !defined(AO_HAVE_load)
233 # define AO_load(addr) AO_load_acquire_read(addr)
234 # define AO_HAVE_load
237 #ifdef AO_NO_DD_ORDERING
238 # if defined(AO_HAVE_load_acquire_read)
239 # define AO_load_dd_acquire_read(addr) AO_load_acquire_read(addr)
240 # define AO_HAVE_load_dd_acquire_read
243 # if defined(AO_HAVE_load)
244 # define AO_load_dd_acquire_read(addr) AO_load(addr)
245 # define AO_HAVE_load_dd_acquire_read
250 #if defined(AO_HAVE_store_full) && !defined(AO_HAVE_store_release)
251 # define AO_store_release(addr,val) AO_store_full(addr,val)
252 # define AO_HAVE_store_release
255 #if defined(AO_HAVE_store_release) && !defined(AO_HAVE_store)
256 # define AO_store(addr,val) AO_store_release(addr,val)
257 # define AO_HAVE_store
260 #if defined(AO_HAVE_store_full) && !defined(AO_HAVE_store_write)
261 # define AO_store_write(addr,val) AO_store_full(addr,val)
262 # define AO_HAVE_store_write
265 #if defined(AO_HAVE_store_release) && !defined(AO_HAVE_store_release_write)
266 # define AO_store_release_write(addr,val) AO_store_release(addr,val)
267 # define AO_HAVE_store_release_write
270 #if defined(AO_HAVE_store_write) && !defined(AO_HAVE_store)
271 # define AO_store(addr,val) AO_store_write(addr,val)
272 # define AO_HAVE_store
275 #if defined(AO_HAVE_store) && defined(AO_HAVE_nop_full) \
276 && !defined(AO_HAVE_store_release)
277 # define AO_store_release(addr,val) (AO_nop_full(), AO_store(addr,val))
278 # define AO_HAVE_store_release
281 #if defined(AO_HAVE_nop_write) && defined(AO_HAVE_store) \
282 && !defined(AO_HAVE_store_write)
283 # define AO_store_write(addr,val) (AO_nop_write(), AO_store(addr,val))
284 # define AO_HAVE_store_write
287 #if defined(AO_HAVE_store_write) && !defined(AO_HAVE_store_release_write)
288 # define AO_store_release_write(addr,val) AO_store_write(addr,val)
289 # define AO_HAVE_store_release_write
292 #if defined(AO_HAVE_store_release) && defined(AO_HAVE_nop_full) \
293 && !defined(AO_HAVE_store_full)
294 # define AO_store_full(addr,val) (AO_store_release(addr,val), AO_nop_full())
295 # define AO_HAVE_store_full
298 /* NEC LE-IT: Test and set */
299 #if defined(AO_HAVE_test_and_set) && defined(AO_HAVE_nop_full) \
300 && !defined(AO_HAVE_test_and_set_release)
301 # define AO_test_and_set_release(addr) (AO_nop_full(), AO_test_and_set(addr))
302 # define AO_HAVE_test_and_set_release
305 #if defined(AO_HAVE_test_and_set) && defined(AO_HAVE_nop_full) \
306 && !defined(AO_HAVE_test_and_set_acquire)
307 AO_INLINE AO_TS_VAL_t
308 AO_test_and_set_acquire(volatile AO_TS_t *addr)
310 AO_TS_VAL_t result = AO_test_and_set(addr);
314 # define AO_HAVE_test_and_set_acquire
318 /* We first try to implement fetch_and_add variants in terms */
319 /* of the corresponding compare_and_swap variants to minimize */
320 /* adding barriers. */
321 #if defined(AO_HAVE_compare_and_swap_full) \
322 && !defined(AO_HAVE_fetch_and_add_full)
324 AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr)
331 while (!AO_compare_and_swap_full(addr, old, old+incr));
334 # define AO_HAVE_fetch_and_add_full
337 #if defined(AO_HAVE_compare_and_swap_acquire) \
338 && !defined(AO_HAVE_fetch_and_add_acquire)
340 AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr)
347 while (!AO_compare_and_swap_acquire(addr, old, old+incr));
350 # define AO_HAVE_fetch_and_add_acquire
353 #if defined(AO_HAVE_compare_and_swap_release) \
354 && !defined(AO_HAVE_fetch_and_add_release)
356 AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr)
363 while (!AO_compare_and_swap_release(addr, old, old+incr));
366 # define AO_HAVE_fetch_and_add_release
369 #if defined(AO_HAVE_compare_and_swap) && !defined(AO_HAVE_fetch_and_add)
371 AO_fetch_and_add(volatile AO_t *addr, AO_t incr)
378 while (!AO_compare_and_swap(addr, old, old+incr));
381 # define AO_HAVE_fetch_and_add
384 #if defined(AO_HAVE_fetch_and_add_full)
385 # if !defined(AO_HAVE_fetch_and_add_release)
386 # define AO_fetch_and_add_release(addr,val) AO_fetch_and_add_full(addr,val)
387 # define AO_HAVE_fetch_and_add_release
389 # if !defined(AO_HAVE_fetch_and_add_acquire)
390 # define AO_fetch_and_add_acquire(addr,val) AO_fetch_and_add_full(addr,val)
391 # define AO_HAVE_fetch_and_add_acquire
393 # if !defined(AO_HAVE_fetch_and_add_write)
394 # define AO_fetch_and_add_write(addr,val) AO_fetch_and_add_full(addr,val)
395 # define AO_HAVE_fetch_and_add_write
397 # if !defined(AO_HAVE_fetch_and_add_read)
398 # define AO_fetch_and_add_read(addr,val) AO_fetch_and_add_full(addr,val)
399 # define AO_HAVE_fetch_and_add_read
401 #endif /* AO_HAVE_fetch_and_add_full */
403 #if !defined(AO_HAVE_fetch_and_add) && defined(AO_HAVE_fetch_and_add_release)
404 # define AO_fetch_and_add(addr,val) AO_fetch_and_add_release(addr,val)
405 # define AO_HAVE_fetch_and_add
407 #if !defined(AO_HAVE_fetch_and_add) && defined(AO_HAVE_fetch_and_add_acquire)
408 # define AO_fetch_and_add(addr,val) AO_fetch_and_add_acquire(addr,val)
409 # define AO_HAVE_fetch_and_add
411 #if !defined(AO_HAVE_fetch_and_add) && defined(AO_HAVE_fetch_and_add_write)
412 # define AO_fetch_and_add(addr,val) AO_fetch_and_add_write(addr,val)
413 # define AO_HAVE_fetch_and_add
415 #if !defined(AO_HAVE_fetch_and_add) && defined(AO_HAVE_fetch_and_add_read)
416 # define AO_fetch_and_add(addr,val) AO_fetch_and_add_read(addr,val)
417 # define AO_HAVE_fetch_and_add
420 #if defined(AO_HAVE_fetch_and_add_acquire) && defined(AO_HAVE_nop_full) \
421 && !defined(AO_HAVE_fetch_and_add_full)
422 # define AO_fetch_and_add_full(addr,val) \
423 (AO_nop_full(), AO_fetch_and_add_acquire(addr,val))
424 # define AO_HAVE_fetch_and_add_full
427 #if !defined(AO_HAVE_fetch_and_add_release_write) \
428 && defined(AO_HAVE_fetch_and_add_write)
429 # define AO_fetch_and_add_release_write(addr,val) \
430 AO_fetch_and_add_write(addr,val)
431 # define AO_HAVE_fetch_and_add_release_write
433 #if !defined(AO_HAVE_fetch_and_add_release_write) \
434 && defined(AO_HAVE_fetch_and_add_release)
435 # define AO_fetch_and_add_release_write(addr,val) \
436 AO_fetch_and_add_release(addr,val)
437 # define AO_HAVE_fetch_and_add_release_write
439 #if !defined(AO_HAVE_fetch_and_add_acquire_read) \
440 && defined(AO_HAVE_fetch_and_add_read)
441 # define AO_fetch_and_add_acquire_read(addr,val) \
442 AO_fetch_and_add_read(addr,val)
443 # define AO_HAVE_fetch_and_add_acquire_read
445 #if !defined(AO_HAVE_fetch_and_add_acquire_read) \
446 && defined(AO_HAVE_fetch_and_add_acquire)
447 # define AO_fetch_and_add_acquire_read(addr,val) \
448 AO_fetch_and_add_acquire(addr,val)
449 # define AO_HAVE_fetch_and_add_acquire_read
452 #ifdef AO_NO_DD_ORDERING
453 # if defined(AO_HAVE_fetch_and_add_acquire_read)
454 # define AO_fetch_and_add_dd_acquire_read(addr,val) \
455 AO_fetch_and_add_acquire_read(addr,val)
456 # define AO_HAVE_fetch_and_add_dd_acquire_read
459 # if defined(AO_HAVE_fetch_and_add)
460 # define AO_fetch_and_add_dd_acquire_read(addr,val) \
461 AO_fetch_and_add(addr,val)
462 # define AO_HAVE_fetch_and_add_dd_acquire_read
464 #endif /* !AO_NO_DD_ORDERING */
468 #if defined(AO_HAVE_fetch_and_add_full) \
469 && !defined(AO_HAVE_fetch_and_add1_full)
470 # define AO_fetch_and_add1_full(addr) AO_fetch_and_add_full(addr,1)
471 # define AO_HAVE_fetch_and_add1_full
473 #if defined(AO_HAVE_fetch_and_add_release) \
474 && !defined(AO_HAVE_fetch_and_add1_release)
475 # define AO_fetch_and_add1_release(addr) AO_fetch_and_add_release(addr,1)
476 # define AO_HAVE_fetch_and_add1_release
478 #if defined(AO_HAVE_fetch_and_add_acquire) \
479 && !defined(AO_HAVE_fetch_and_add1_acquire)
480 # define AO_fetch_and_add1_acquire(addr) AO_fetch_and_add_acquire(addr,1)
481 # define AO_HAVE_fetch_and_add1_acquire
483 #if defined(AO_HAVE_fetch_and_add_write) \
484 && !defined(AO_HAVE_fetch_and_add1_write)
485 # define AO_fetch_and_add1_write(addr) AO_fetch_and_add_write(addr,1)
486 # define AO_HAVE_fetch_and_add1_write
488 #if defined(AO_HAVE_fetch_and_add_read) \
489 && !defined(AO_HAVE_fetch_and_add1_read)
490 # define AO_fetch_and_add1_read(addr) AO_fetch_and_add_read(addr,1)
491 # define AO_HAVE_fetch_and_add1_read
493 #if defined(AO_HAVE_fetch_and_add_release_write) \
494 && !defined(AO_HAVE_fetch_and_add1_release_write)
495 # define AO_fetch_and_add1_release_write(addr) \
496 AO_fetch_and_add_release_write(addr,1)
497 # define AO_HAVE_fetch_and_add1_release_write
499 #if defined(AO_HAVE_fetch_and_add_acquire_read) \
500 && !defined(AO_HAVE_fetch_and_add1_acquire_read)
501 # define AO_fetch_and_add1_acquire_read(addr) \
502 AO_fetch_and_add_acquire_read(addr,1)
503 # define AO_HAVE_fetch_and_add1_acquire_read
505 #if defined(AO_HAVE_fetch_and_add) && !defined(AO_HAVE_fetch_and_add1)
506 # define AO_fetch_and_add1(addr) AO_fetch_and_add(addr,1)
507 # define AO_HAVE_fetch_and_add1
510 #if defined(AO_HAVE_fetch_and_add1_full)
511 # if !defined(AO_HAVE_fetch_and_add1_release)
512 # define AO_fetch_and_add1_release(addr) AO_fetch_and_add1_full(addr)
513 # define AO_HAVE_fetch_and_add1_release
515 # if !defined(AO_HAVE_fetch_and_add1_acquire)
516 # define AO_fetch_and_add1_acquire(addr) AO_fetch_and_add1_full(addr)
517 # define AO_HAVE_fetch_and_add1_acquire
519 # if !defined(AO_HAVE_fetch_and_add1_write)
520 # define AO_fetch_and_add1_write(addr) AO_fetch_and_add1_full(addr)
521 # define AO_HAVE_fetch_and_add1_write
523 # if !defined(AO_HAVE_fetch_and_add1_read)
524 # define AO_fetch_and_add1_read(addr) AO_fetch_and_add1_full(addr)
525 # define AO_HAVE_fetch_and_add1_read
527 #endif /* AO_HAVE_fetch_and_add1_full */
529 #if !defined(AO_HAVE_fetch_and_add1) \
530 && defined(AO_HAVE_fetch_and_add1_release)
531 # define AO_fetch_and_add1(addr) AO_fetch_and_add1_release(addr)
532 # define AO_HAVE_fetch_and_add1
534 #if !defined(AO_HAVE_fetch_and_add1) \
535 && defined(AO_HAVE_fetch_and_add1_acquire)
536 # define AO_fetch_and_add1(addr) AO_fetch_and_add1_acquire(addr)
537 # define AO_HAVE_fetch_and_add1
539 #if !defined(AO_HAVE_fetch_and_add1) && defined(AO_HAVE_fetch_and_add1_write)
540 # define AO_fetch_and_add1(addr) AO_fetch_and_add1_write(addr)
541 # define AO_HAVE_fetch_and_add1
543 #if !defined(AO_HAVE_fetch_and_add1) && defined(AO_HAVE_fetch_and_add1_read)
544 # define AO_fetch_and_add1(addr) AO_fetch_and_add1_read(addr)
545 # define AO_HAVE_fetch_and_add1
548 #if defined(AO_HAVE_fetch_and_add1_acquire) && defined(AO_HAVE_nop_full) \
549 && !defined(AO_HAVE_fetch_and_add1_full)
550 # define AO_fetch_and_add1_full(addr) \
551 (AO_nop_full(), AO_fetch_and_add1_acquire(addr))
552 # define AO_HAVE_fetch_and_add1_full
555 #if !defined(AO_HAVE_fetch_and_add1_release_write) \
556 && defined(AO_HAVE_fetch_and_add1_write)
557 # define AO_fetch_and_add1_release_write(addr) AO_fetch_and_add1_write(addr)
558 # define AO_HAVE_fetch_and_add1_release_write
560 #if !defined(AO_HAVE_fetch_and_add1_release_write) \
561 && defined(AO_HAVE_fetch_and_add1_release)
562 # define AO_fetch_and_add1_release_write(addr) AO_fetch_and_add1_release(addr)
563 # define AO_HAVE_fetch_and_add1_release_write
565 #if !defined(AO_HAVE_fetch_and_add1_acquire_read) \
566 && defined(AO_HAVE_fetch_and_add1_read)
567 # define AO_fetch_and_add1_acquire_read(addr) AO_fetch_and_add1_read(addr)
568 # define AO_HAVE_fetch_and_add1_acquire_read
570 #if !defined(AO_HAVE_fetch_and_add1_acquire_read) \
571 && defined(AO_HAVE_fetch_and_add1_acquire)
572 # define AO_fetch_and_add1_acquire_read(addr) AO_fetch_and_add1_acquire(addr)
573 # define AO_HAVE_fetch_and_add1_acquire_read
576 #ifdef AO_NO_DD_ORDERING
577 # if defined(AO_HAVE_fetch_and_add1_acquire_read)
578 # define AO_fetch_and_add1_dd_acquire_read(addr) \
579 AO_fetch_and_add1_acquire_read(addr)
580 # define AO_HAVE_fetch_and_add1_dd_acquire_read
583 # if defined(AO_HAVE_fetch_and_add1)
584 # define AO_fetch_and_add1_dd_acquire_read(addr) AO_fetch_and_add1(addr)
585 # define AO_HAVE_fetch_and_add1_dd_acquire_read
587 #endif /* !AO_NO_DD_ORDERING */
590 #if defined(AO_HAVE_fetch_and_add_full) \
591 && !defined(AO_HAVE_fetch_and_sub1_full)
592 # define AO_fetch_and_sub1_full(addr) AO_fetch_and_add_full(addr,(AO_t)(-1))
593 # define AO_HAVE_fetch_and_sub1_full
595 #if defined(AO_HAVE_fetch_and_add_release) \
596 && !defined(AO_HAVE_fetch_and_sub1_release)
597 # define AO_fetch_and_sub1_release(addr) \
598 AO_fetch_and_add_release(addr,(AO_t)(-1))
599 # define AO_HAVE_fetch_and_sub1_release
601 #if defined(AO_HAVE_fetch_and_add_acquire) \
602 && !defined(AO_HAVE_fetch_and_sub1_acquire)
603 # define AO_fetch_and_sub1_acquire(addr) \
604 AO_fetch_and_add_acquire(addr,(AO_t)(-1))
605 # define AO_HAVE_fetch_and_sub1_acquire
607 #if defined(AO_HAVE_fetch_and_add_write) \
608 && !defined(AO_HAVE_fetch_and_sub1_write)
609 # define AO_fetch_and_sub1_write(addr) AO_fetch_and_add_write(addr,(AO_t)(-1))
610 # define AO_HAVE_fetch_and_sub1_write
612 #if defined(AO_HAVE_fetch_and_add_read) \
613 && !defined(AO_HAVE_fetch_and_sub1_read)
614 # define AO_fetch_and_sub1_read(addr) AO_fetch_and_add_read(addr,(AO_t)(-1))
615 # define AO_HAVE_fetch_and_sub1_read
617 #if defined(AO_HAVE_fetch_and_add_release_write) \
618 && !defined(AO_HAVE_fetch_and_sub1_release_write)
619 # define AO_fetch_and_sub1_release_write(addr) \
620 AO_fetch_and_add_release_write(addr,(AO_t)(-1))
621 # define AO_HAVE_fetch_and_sub1_release_write
623 #if defined(AO_HAVE_fetch_and_add_acquire_read) \
624 && !defined(AO_HAVE_fetch_and_sub1_acquire_read)
625 # define AO_fetch_and_sub1_acquire_read(addr) \
626 AO_fetch_and_add_acquire_read(addr,(AO_t)(-1))
627 # define AO_HAVE_fetch_and_sub1_acquire_read
629 #if defined(AO_HAVE_fetch_and_add) && !defined(AO_HAVE_fetch_and_sub1)
630 # define AO_fetch_and_sub1(addr) AO_fetch_and_add(addr,(AO_t)(-1))
631 # define AO_HAVE_fetch_and_sub1
634 #if defined(AO_HAVE_fetch_and_sub1_full)
635 # if !defined(AO_HAVE_fetch_and_sub1_release)
636 # define AO_fetch_and_sub1_release(addr) AO_fetch_and_sub1_full(addr)
637 # define AO_HAVE_fetch_and_sub1_release
639 # if !defined(AO_HAVE_fetch_and_sub1_acquire)
640 # define AO_fetch_and_sub1_acquire(addr) AO_fetch_and_sub1_full(addr)
641 # define AO_HAVE_fetch_and_sub1_acquire
643 # if !defined(AO_HAVE_fetch_and_sub1_write)
644 # define AO_fetch_and_sub1_write(addr) AO_fetch_and_sub1_full(addr)
645 # define AO_HAVE_fetch_and_sub1_write
647 # if !defined(AO_HAVE_fetch_and_sub1_read)
648 # define AO_fetch_and_sub1_read(addr) AO_fetch_and_sub1_full(addr)
649 # define AO_HAVE_fetch_and_sub1_read
651 #endif /* AO_HAVE_fetch_and_sub1_full */
653 #if !defined(AO_HAVE_fetch_and_sub1) \
654 && defined(AO_HAVE_fetch_and_sub1_release)
655 # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_release(addr)
656 # define AO_HAVE_fetch_and_sub1
658 #if !defined(AO_HAVE_fetch_and_sub1) \
659 && defined(AO_HAVE_fetch_and_sub1_acquire)
660 # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_acquire(addr)
661 # define AO_HAVE_fetch_and_sub1
663 #if !defined(AO_HAVE_fetch_and_sub1) && defined(AO_HAVE_fetch_and_sub1_write)
664 # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_write(addr)
665 # define AO_HAVE_fetch_and_sub1
667 #if !defined(AO_HAVE_fetch_and_sub1) && defined(AO_HAVE_fetch_and_sub1_read)
668 # define AO_fetch_and_sub1(addr) AO_fetch_and_sub1_read(addr)
669 # define AO_HAVE_fetch_and_sub1
672 #if defined(AO_HAVE_fetch_and_sub1_acquire) && defined(AO_HAVE_nop_full) \
673 && !defined(AO_HAVE_fetch_and_sub1_full)
674 # define AO_fetch_and_sub1_full(addr) \
675 (AO_nop_full(), AO_fetch_and_sub1_acquire(addr))
676 # define AO_HAVE_fetch_and_sub1_full
679 #if !defined(AO_HAVE_fetch_and_sub1_release_write) \
680 && defined(AO_HAVE_fetch_and_sub1_write)
681 # define AO_fetch_and_sub1_release_write(addr) AO_fetch_and_sub1_write(addr)
682 # define AO_HAVE_fetch_and_sub1_release_write
684 #if !defined(AO_HAVE_fetch_and_sub1_release_write) \
685 && defined(AO_HAVE_fetch_and_sub1_release)
686 # define AO_fetch_and_sub1_release_write(addr) AO_fetch_and_sub1_release(addr)
687 # define AO_HAVE_fetch_and_sub1_release_write
689 #if !defined(AO_HAVE_fetch_and_sub1_acquire_read) \
690 && defined(AO_HAVE_fetch_and_sub1_read)
691 # define AO_fetch_and_sub1_acquire_read(addr) AO_fetch_and_sub1_read(addr)
692 # define AO_HAVE_fetch_and_sub1_acquire_read
694 #if !defined(AO_HAVE_fetch_and_sub1_acquire_read) \
695 && defined(AO_HAVE_fetch_and_sub1_acquire)
696 # define AO_fetch_and_sub1_acquire_read(addr) AO_fetch_and_sub1_acquire(addr)
697 # define AO_HAVE_fetch_and_sub1_acquire_read
700 #ifdef AO_NO_DD_ORDERING
701 # if defined(AO_HAVE_fetch_and_sub1_acquire_read)
702 # define AO_fetch_and_sub1_dd_acquire_read(addr) \
703 AO_fetch_and_sub1_acquire_read(addr)
704 # define AO_HAVE_fetch_and_sub1_dd_acquire_read
707 # if defined(AO_HAVE_fetch_and_sub1)
708 # define AO_fetch_and_sub1_dd_acquire_read(addr) AO_fetch_and_sub1(addr)
709 # define AO_HAVE_fetch_and_sub1_dd_acquire_read
711 #endif /* !AO_NO_DD_ORDERING */
714 #if defined(AO_HAVE_compare_and_swap_full) && !defined(AO_HAVE_or_full)
716 AO_or_full(volatile AO_t *addr, AO_t incr)
723 while (!AO_compare_and_swap_full(addr, old, old | incr));
725 # define AO_HAVE_or_full
728 #if defined(AO_HAVE_or_full)
729 # if !defined(AO_HAVE_or_release)
730 # define AO_or_release(addr,val) AO_or_full(addr,val)
731 # define AO_HAVE_or_release
733 # if !defined(AO_HAVE_or_acquire)
734 # define AO_or_acquire(addr,val) AO_or_full(addr,val)
735 # define AO_HAVE_or_acquire
737 # if !defined(AO_HAVE_or_write)
738 # define AO_or_write(addr,val) AO_or_full(addr,val)
739 # define AO_HAVE_or_write
741 # if !defined(AO_HAVE_or_read)
742 # define AO_or_read(addr,val) AO_or_full(addr,val)
743 # define AO_HAVE_or_read
745 #endif /* AO_HAVE_or_full */
747 #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_release)
748 # define AO_or(addr,val) AO_or_release(addr,val)
751 #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_acquire)
752 # define AO_or(addr,val) AO_or_acquire(addr,val)
755 #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_write)
756 # define AO_or(addr,val) AO_or_write(addr,val)
759 #if !defined(AO_HAVE_or) && defined(AO_HAVE_or_read)
760 # define AO_or(addr,val) AO_or_read(addr,val)
764 #if defined(AO_HAVE_or_acquire) && defined(AO_HAVE_nop_full) \
765 && !defined(AO_HAVE_or_full)
766 # define AO_or_full(addr,val) (AO_nop_full(), AO_or_acquire(addr,val))
767 # define AO_HAVE_or_full
770 #if !defined(AO_HAVE_or_release_write) && defined(AO_HAVE_or_write)
771 # define AO_or_release_write(addr,val) AO_or_write(addr,val)
772 # define AO_HAVE_or_release_write
774 #if !defined(AO_HAVE_or_release_write) && defined(AO_HAVE_or_release)
775 # define AO_or_release_write(addr,val) AO_or_release(addr,val)
776 # define AO_HAVE_or_release_write
778 #if !defined(AO_HAVE_or_acquire_read) && defined(AO_HAVE_or_read)
779 # define AO_or_acquire_read(addr,val) AO_or_read(addr,val)
780 # define AO_HAVE_or_acquire_read
782 #if !defined(AO_HAVE_or_acquire_read) && defined(AO_HAVE_or_acquire)
783 # define AO_or_acquire_read(addr,val) AO_or_acquire(addr,val)
784 # define AO_HAVE_or_acquire_read
787 /* dd_aquire_read is meaningless. */
790 #if defined(AO_HAVE_test_and_set_full)
791 # if !defined(AO_HAVE_test_and_set_release)
792 # define AO_test_and_set_release(addr) AO_test_and_set_full(addr)
793 # define AO_HAVE_test_and_set_release
795 # if !defined(AO_HAVE_test_and_set_acquire)
796 # define AO_test_and_set_acquire(addr) AO_test_and_set_full(addr)
797 # define AO_HAVE_test_and_set_acquire
799 # if !defined(AO_HAVE_test_and_set_write)
800 # define AO_test_and_set_write(addr) AO_test_and_set_full(addr)
801 # define AO_HAVE_test_and_set_write
803 # if !defined(AO_HAVE_test_and_set_read)
804 # define AO_test_and_set_read(addr) AO_test_and_set_full(addr)
805 # define AO_HAVE_test_and_set_read
807 #endif /* AO_HAVE_test_and_set_full */
809 #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_release)
810 # define AO_test_and_set(addr) AO_test_and_set_release(addr)
811 # define AO_HAVE_test_and_set
813 #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_acquire)
814 # define AO_test_and_set(addr) AO_test_and_set_acquire(addr)
815 # define AO_HAVE_test_and_set
817 #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_write)
818 # define AO_test_and_set(addr) AO_test_and_set_write(addr)
819 # define AO_HAVE_test_and_set
821 #if !defined(AO_HAVE_test_and_set) && defined(AO_HAVE_test_and_set_read)
822 # define AO_test_and_set(addr) AO_test_and_set_read(addr)
823 # define AO_HAVE_test_and_set
826 #if defined(AO_HAVE_test_and_set_acquire) && defined(AO_HAVE_nop_full) \
827 && !defined(AO_HAVE_test_and_set_full)
828 # define AO_test_and_set_full(addr) \
829 (AO_nop_full(), AO_test_and_set_acquire(addr))
830 # define AO_HAVE_test_and_set_full
833 #if !defined(AO_HAVE_test_and_set_release_write) \
834 && defined(AO_HAVE_test_and_set_write)
835 # define AO_test_and_set_release_write(addr) AO_test_and_set_write(addr)
836 # define AO_HAVE_test_and_set_release_write
838 #if !defined(AO_HAVE_test_and_set_release_write) \
839 && defined(AO_HAVE_test_and_set_release)
840 # define AO_test_and_set_release_write(addr) AO_test_and_set_release(addr)
841 # define AO_HAVE_test_and_set_release_write
843 #if !defined(AO_HAVE_test_and_set_acquire_read) \
844 && defined(AO_HAVE_test_and_set_read)
845 # define AO_test_and_set_acquire_read(addr) AO_test_and_set_read(addr)
846 # define AO_HAVE_test_and_set_acquire_read
848 #if !defined(AO_HAVE_test_and_set_acquire_read) \
849 && defined(AO_HAVE_test_and_set_acquire)
850 # define AO_test_and_set_acquire_read(addr) AO_test_and_set_acquire(addr)
851 # define AO_HAVE_test_and_set_acquire_read
854 #ifdef AO_NO_DD_ORDERING
855 # if defined(AO_HAVE_test_and_set_acquire_read)
856 # define AO_test_and_set_dd_acquire_read(addr) \
857 AO_test_and_set_acquire_read(addr)
858 # define AO_HAVE_test_and_set_dd_acquire_read
861 # if defined(AO_HAVE_test_and_set)
862 # define AO_test_and_set_dd_acquire_read(addr) AO_test_and_set(addr)
863 # define AO_HAVE_test_and_set_dd_acquire_read
865 #endif /* !AO_NO_DD_ORDERING */
867 /* Compare_and_swap */
868 #if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \
869 && !defined(AO_HAVE_compare_and_swap_acquire)
871 AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val)
873 int result = AO_compare_and_swap(addr, old, new_val);
877 # define AO_HAVE_compare_and_swap_acquire
879 #if defined(AO_HAVE_compare_and_swap) && defined(AO_HAVE_nop_full) \
880 && !defined(AO_HAVE_compare_and_swap_release)
881 # define AO_compare_and_swap_release(addr,old,new_val) \
882 (AO_nop_full(), AO_compare_and_swap(addr,old,new_val))
883 # define AO_HAVE_compare_and_swap_release
885 #if defined(AO_HAVE_compare_and_swap_full)
886 # if !defined(AO_HAVE_compare_and_swap_release)
887 # define AO_compare_and_swap_release(addr,old,new_val) \
888 AO_compare_and_swap_full(addr,old,new_val)
889 # define AO_HAVE_compare_and_swap_release
891 # if !defined(AO_HAVE_compare_and_swap_acquire)
892 # define AO_compare_and_swap_acquire(addr,old,new_val) \
893 AO_compare_and_swap_full(addr,old,new_val)
894 # define AO_HAVE_compare_and_swap_acquire
896 # if !defined(AO_HAVE_compare_and_swap_write)
897 # define AO_compare_and_swap_write(addr,old,new_val) \
898 AO_compare_and_swap_full(addr,old,new_val)
899 # define AO_HAVE_compare_and_swap_write
901 # if !defined(AO_HAVE_compare_and_swap_read)
902 # define AO_compare_and_swap_read(addr,old,new_val) \
903 AO_compare_and_swap_full(addr,old,new_val)
904 # define AO_HAVE_compare_and_swap_read
906 #endif /* AO_HAVE_compare_and_swap_full */
908 #if !defined(AO_HAVE_compare_and_swap) \
909 && defined(AO_HAVE_compare_and_swap_release)
910 # define AO_compare_and_swap(addr,old,new_val) \
911 AO_compare_and_swap_release(addr,old,new_val)
912 # define AO_HAVE_compare_and_swap
914 #if !defined(AO_HAVE_compare_and_swap) \
915 && defined(AO_HAVE_compare_and_swap_acquire)
916 # define AO_compare_and_swap(addr,old,new_val) \
917 AO_compare_and_swap_acquire(addr,old,new_val)
918 # define AO_HAVE_compare_and_swap
920 #if !defined(AO_HAVE_compare_and_swap) \
921 && defined(AO_HAVE_compare_and_swap_write)
922 # define AO_compare_and_swap(addr,old,new_val) \
923 AO_compare_and_swap_write(addr,old,new_val)
924 # define AO_HAVE_compare_and_swap
926 #if !defined(AO_HAVE_compare_and_swap) \
927 && defined(AO_HAVE_compare_and_swap_read)
928 # define AO_compare_and_swap(addr,old,new_val) \
929 AO_compare_and_swap_read(addr,old,new_val)
930 # define AO_HAVE_compare_and_swap
933 #if defined(AO_HAVE_compare_and_swap_acquire) \
934 && defined(AO_HAVE_nop_full) && !defined(AO_HAVE_compare_and_swap_full)
935 # define AO_compare_and_swap_full(addr,old,new_val) \
936 (AO_nop_full(), AO_compare_and_swap_acquire(addr,old,new_val))
937 # define AO_HAVE_compare_and_swap_full
940 #if !defined(AO_HAVE_compare_and_swap_release_write) \
941 && defined(AO_HAVE_compare_and_swap_write)
942 # define AO_compare_and_swap_release_write(addr,old,new_val) \
943 AO_compare_and_swap_write(addr,old,new_val)
944 # define AO_HAVE_compare_and_swap_release_write
946 #if !defined(AO_HAVE_compare_and_swap_release_write) \
947 && defined(AO_HAVE_compare_and_swap_release)
948 # define AO_compare_and_swap_release_write(addr,old,new_val) \
949 AO_compare_and_swap_release(addr,old,new_val)
950 # define AO_HAVE_compare_and_swap_release_write
952 #if !defined(AO_HAVE_compare_and_swap_acquire_read) \
953 && defined(AO_HAVE_compare_and_swap_read)
954 # define AO_compare_and_swap_acquire_read(addr,old,new_val) \
955 AO_compare_and_swap_read(addr,old,new_val)
956 # define AO_HAVE_compare_and_swap_acquire_read
958 #if !defined(AO_HAVE_compare_and_swap_acquire_read) \
959 && defined(AO_HAVE_compare_and_swap_acquire)
960 # define AO_compare_and_swap_acquire_read(addr,old,new_val) \
961 AO_compare_and_swap_acquire(addr,old,new_val)
962 # define AO_HAVE_compare_and_swap_acquire_read
965 #ifdef AO_NO_DD_ORDERING
966 # if defined(AO_HAVE_compare_and_swap_acquire_read)
967 # define AO_compare_and_swap_dd_acquire_read(addr,old,new_val) \
968 AO_compare_and_swap_acquire_read(addr,old,new_val)
969 # define AO_HAVE_compare_and_swap_dd_acquire_read
972 # if defined(AO_HAVE_compare_and_swap)
973 # define AO_compare_and_swap_dd_acquire_read(addr,old,new_val) \
974 AO_compare_and_swap(addr,old,new_val)
975 # define AO_HAVE_compare_and_swap_dd_acquire_read
977 #endif /* !AO_NO_DD_ORDERING */
979 #include "generalize-small.h"
981 /* Compare_double_and_swap_double */
982 #if defined(AO_HAVE_compare_double_and_swap_double) \
983 && defined(AO_HAVE_nop_full) \
984 && !defined(AO_HAVE_compare_double_and_swap_double_acquire)
986 AO_compare_double_and_swap_double_acquire(volatile AO_double_t *addr,
990 int result = AO_compare_double_and_swap_double(addr, o1, o2, n1, n2);
994 # define AO_HAVE_compare_double_and_swap_double_acquire
996 #if defined(AO_HAVE_compare_double_and_swap_double) \
997 && defined(AO_HAVE_nop_full) \
998 && !defined(AO_HAVE_compare_double_and_swap_double_release)
999 # define AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) \
1000 (AO_nop_full(), AO_compare_double_and_swap_double(addr,o1,o2,n1,n2))
1001 # define AO_HAVE_compare_double_and_swap_double_release
1003 #if defined(AO_HAVE_compare_double_and_swap_double_full)
1004 # if !defined(AO_HAVE_compare_double_and_swap_double_release)
1005 # define AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2) \
1006 AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2)
1007 # define AO_HAVE_compare_double_and_swap_double_release
1009 # if !defined(AO_HAVE_compare_double_and_swap_double_acquire)
1010 # define AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2) \
1011 AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2)
1012 # define AO_HAVE_compare_double_and_swap_double_acquire
1014 # if !defined(AO_HAVE_compare_double_and_swap_double_write)
1015 # define AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2) \
1016 AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2)
1017 # define AO_HAVE_compare_double_and_swap_double_write
1019 # if !defined(AO_HAVE_compare_double_and_swap_double_read)
1020 # define AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2) \
1021 AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2)
1022 # define AO_HAVE_compare_double_and_swap_double_read
1024 #endif /* AO_HAVE_compare_double_and_swap_double_full */
1026 #if !defined(AO_HAVE_compare_double_and_swap_double) \
1027 && defined(AO_HAVE_compare_double_and_swap_double_release)
1028 # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \
1029 AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2)
1030 # define AO_HAVE_compare_double_and_swap_double
1032 #if !defined(AO_HAVE_compare_double_and_swap_double) \
1033 && defined(AO_HAVE_compare_double_and_swap_double_acquire)
1034 # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \
1035 AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2)
1036 # define AO_HAVE_compare_double_and_swap_double
1038 #if !defined(AO_HAVE_compare_double_and_swap_double) \
1039 && defined(AO_HAVE_compare_double_and_swap_double_write)
1040 # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \
1041 AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2)
1042 # define AO_HAVE_compare_double_and_swap_double
1044 #if !defined(AO_HAVE_compare_double_and_swap_double) \
1045 && defined(AO_HAVE_compare_double_and_swap_double_read)
1046 # define AO_compare_double_and_swap_double(addr,o1,o2,n1,n2) \
1047 AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2)
1048 # define AO_HAVE_compare_double_and_swap_double
1051 #if defined(AO_HAVE_compare_double_and_swap_double_acquire) \
1052 && defined(AO_HAVE_nop_full) \
1053 && !defined(AO_HAVE_compare_double_and_swap_double_full)
1054 # define AO_compare_double_and_swap_double_full(addr,o1,o2,n1,n2) \
1056 AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2))
1057 # define AO_HAVE_compare_double_and_swap_double_full
1060 #if !defined(AO_HAVE_compare_double_and_swap_double_release_write) \
1061 && defined(AO_HAVE_compare_double_and_swap_double_write)
1062 # define AO_compare_double_and_swap_double_release_write(addr,o1,o2,n1,n2) \
1063 AO_compare_double_and_swap_double_write(addr,o1,o2,n1,n2)
1064 # define AO_HAVE_compare_double_and_swap_double_release_write
1066 #if !defined(AO_HAVE_compare_double_and_swap_double_release_write) \
1067 && defined(AO_HAVE_compare_double_and_swap_double_release)
1068 # define AO_compare_double_and_swap_double_release_write(addr,o1,o2,n1,n2) \
1069 AO_compare_double_and_swap_double_release(addr,o1,o2,n1,n2)
1070 # define AO_HAVE_compare_double_and_swap_double_release_write
1072 #if !defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \
1073 && defined(AO_HAVE_compare_double_and_swap_double_read)
1074 # define AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2) \
1075 AO_compare_double_and_swap_double_read(addr,o1,o2,n1,n2)
1076 # define AO_HAVE_compare_double_and_swap_double_acquire_read
1078 #if !defined(AO_HAVE_compare_double_and_swap_double_acquire_read) \
1079 && defined(AO_HAVE_compare_double_and_swap_double_acquire)
1080 # define AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2) \
1081 AO_compare_double_and_swap_double_acquire(addr,o1,o2,n1,n2)
1082 # define AO_HAVE_compare_double_and_swap_double_acquire_read
1085 #ifdef AO_NO_DD_ORDERING
1086 # if defined(AO_HAVE_compare_double_and_swap_double_acquire_read)
1087 # define AO_compare_double_and_swap_double_dd_acquire_read(addr,o1,o2,n1,n2) \
1088 AO_compare_double_and_swap_double_acquire_read(addr,o1,o2,n1,n2)
1089 # define AO_HAVE_compare_double_and_swap_double_dd_acquire_read
1092 # if defined(AO_HAVE_compare_double_and_swap_double)
1093 # define AO_compare_double_and_swap_double_dd_acquire_read(addr,o1,o2,n1,n2) \
1094 AO_compare_double_and_swap_double(addr,o1,o2,n1,n2)
1095 # define AO_HAVE_compare_double_and_swap_double_dd_acquire_read
1097 #endif /* !AO_NO_DD_ORDERING */
1099 /* Compare_and_swap_double */
1100 #if defined(AO_HAVE_compare_and_swap_double) && defined(AO_HAVE_nop_full) \
1101 && !defined(AO_HAVE_compare_and_swap_double_acquire)
1103 AO_compare_and_swap_double_acquire(volatile AO_double_t *addr,
1107 int result = AO_compare_and_swap_double(addr, o1, n1, n2);
1111 # define AO_HAVE_compare_and_swap_double_acquire
1113 #if defined(AO_HAVE_compare_and_swap_double) \
1114 && defined(AO_HAVE_nop_full) \
1115 && !defined(AO_HAVE_compare_and_swap_double_release)
1116 # define AO_compare_and_swap_double_release(addr,o1,n1,n2) \
1117 (AO_nop_full(), AO_compare_and_swap_double(addr,o1,n1,n2))
1118 # define AO_HAVE_compare_and_swap_double_release
1120 #if defined(AO_HAVE_compare_and_swap_double_full)
1121 # if !defined(AO_HAVE_compare_and_swap_double_release)
1122 # define AO_compare_and_swap_double_release(addr,o1,n1,n2) \
1123 AO_compare_and_swap_double_full(addr,o1,n1,n2)
1124 # define AO_HAVE_compare_and_swap_double_release
1126 # if !defined(AO_HAVE_compare_and_swap_double_acquire)
1127 # define AO_compare_and_swap_double_acquire(addr,o1,n1,n2) \
1128 AO_compare_and_swap_double_full(addr,o1,n1,n2)
1129 # define AO_HAVE_compare_and_swap_double_acquire
1131 # if !defined(AO_HAVE_compare_and_swap_double_write)
1132 # define AO_compare_and_swap_double_write(addr,o1,n1,n2) \
1133 AO_compare_and_swap_double_full(addr,o1,n1,n2)
1134 # define AO_HAVE_compare_and_swap_double_write
1136 # if !defined(AO_HAVE_compare_and_swap_double_read)
1137 # define AO_compare_and_swap_double_read(addr,o1,n1,n2) \
1138 AO_compare_and_swap_double_full(addr,o1,n1,n2)
1139 # define AO_HAVE_compare_and_swap_double_read
1141 #endif /* AO_HAVE_compare_and_swap_double_full */
1143 #if !defined(AO_HAVE_compare_and_swap_double) \
1144 && defined(AO_HAVE_compare_and_swap_double_release)
1145 # define AO_compare_and_swap_double(addr,o1,n1,n2) \
1146 AO_compare_and_swap_double_release(addr,o1,n1,n2)
1147 # define AO_HAVE_compare_and_swap_double
1149 #if !defined(AO_HAVE_compare_and_swap_double) \
1150 && defined(AO_HAVE_compare_and_swap_double_acquire)
1151 # define AO_compare_and_swap_double(addr,o1,n1,n2) \
1152 AO_compare_and_swap_double_acquire(addr,o1,n1,n2)
1153 # define AO_HAVE_compare_and_swap_double
1155 #if !defined(AO_HAVE_compare_and_swap_double) \
1156 && defined(AO_HAVE_compare_and_swap_double_write)
1157 # define AO_compare_and_swap_double(addr,o1,n1,n2) \
1158 AO_compare_and_swap_double_write(addr,o1,n1,n2)
1159 # define AO_HAVE_compare_and_swap_double
1161 #if !defined(AO_HAVE_compare_and_swap_double) \
1162 && defined(AO_HAVE_compare_and_swap_double_read)
1163 # define AO_compare_and_swap_double(addr,o1,n1,n2) \
1164 AO_compare_and_swap_double_read(addr,o1,n1,n2)
1165 # define AO_HAVE_compare_and_swap_double
1168 #if defined(AO_HAVE_compare_and_swap_double_acquire) \
1169 && defined(AO_HAVE_nop_full) \
1170 && !defined(AO_HAVE_compare_and_swap_double_full)
1171 # define AO_compare_and_swap_double_full(addr,o1,n1,n2) \
1172 (AO_nop_full(), AO_compare_and_swap_double_acquire(addr,o1,n1,n2))
1173 # define AO_HAVE_compare_and_swap_double_full
1176 #if !defined(AO_HAVE_compare_and_swap_double_release_write) \
1177 && defined(AO_HAVE_compare_and_swap_double_write)
1178 # define AO_compare_and_swap_double_release_write(addr,o1,n1,n2) \
1179 AO_compare_and_swap_double_write(addr,o1,n1,n2)
1180 # define AO_HAVE_compare_and_swap_double_release_write
1182 #if !defined(AO_HAVE_compare_and_swap_double_release_write) \
1183 && defined(AO_HAVE_compare_and_swap_double_release)
1184 # define AO_compare_and_swap_double_release_write(addr,o1,n1,n2) \
1185 AO_compare_and_swap_double_release(addr,o1,n1,n2)
1186 # define AO_HAVE_compare_and_swap_double_release_write
1188 #if !defined(AO_HAVE_compare_and_swap_double_acquire_read) \
1189 && defined(AO_HAVE_compare_and_swap_double_read)
1190 # define AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2) \
1191 AO_compare_and_swap_double_read(addr,o1,n1,n2)
1192 # define AO_HAVE_compare_and_swap_double_acquire_read
1194 #if !defined(AO_HAVE_compare_and_swap_double_acquire_read) \
1195 && defined(AO_HAVE_compare_and_swap_double_acquire)
1196 # define AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2) \
1197 AO_compare_and_swap_double_acquire(addr,o1,n1,n2)
1198 # define AO_HAVE_compare_and_swap_double_acquire_read
1201 #ifdef AO_NO_DD_ORDERING
1202 # if defined(AO_HAVE_compare_and_swap_double_acquire_read)
1203 # define AO_compare_and_swap_double_dd_acquire_read(addr,o1,n1,n2) \
1204 AO_compare_and_swap_double_acquire_read(addr,o1,n1,n2)
1205 # define AO_HAVE_compare_and_swap_double_dd_acquire_read
1208 # if defined(AO_HAVE_compare_and_swap_double)
1209 # define AO_compare_and_swap_double_dd_acquire_read(addr,o1,n1,n2) \
1210 AO_compare_and_swap_double(addr,o1,n1,n2)
1211 # define AO_HAVE_compare_and_swap_double_dd_acquire_read
1215 /* NEC LE-IT: Convenience functions for AO_double compare and swap which */
1216 /* types and reads easier in code */
1217 #if defined(AO_HAVE_compare_double_and_swap_double_release) \
1218 && !defined(AO_HAVE_double_compare_and_swap_release)
1220 AO_double_compare_and_swap_release(volatile AO_double_t *addr,
1221 AO_double_t old_val, AO_double_t new_val)
1223 return AO_compare_double_and_swap_double_release(addr,
1224 old_val.AO_val1, old_val.AO_val2,
1225 new_val.AO_val1, new_val.AO_val2);
1227 # define AO_HAVE_double_compare_and_swap_release
1230 #if defined(AO_HAVE_compare_double_and_swap_double_acquire) \
1231 && !defined(AO_HAVE_double_compare_and_swap_acquire)
1233 AO_double_compare_and_swap_acquire(volatile AO_double_t *addr,
1234 AO_double_t old_val, AO_double_t new_val)
1236 return AO_compare_double_and_swap_double_acquire(addr,
1237 old_val.AO_val1, old_val.AO_val2,
1238 new_val.AO_val1, new_val.AO_val2);
1240 # define AO_HAVE_double_compare_and_swap_acquire
1243 #if defined(AO_HAVE_compare_double_and_swap_double_full) \
1244 && !defined(AO_HAVE_double_compare_and_swap_full)
1246 AO_double_compare_and_swap_full(volatile AO_double_t *addr,
1247 AO_double_t old_val, AO_double_t new_val)
1249 return AO_compare_double_and_swap_double_full(addr,
1250 old_val.AO_val1, old_val.AO_val2,
1251 new_val.AO_val1, new_val.AO_val2);
1253 # define AO_HAVE_double_compare_and_swap_full