2 * Copyright (c) 2005,2007 Thiemo Seufer <ths@networkno.de>
4 * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
5 * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
7 * Permission is hereby granted to use or copy this program
8 * for any purpose, provided the above notices are retained on all copies.
9 * Permission to modify the code and to distribute modified code is granted,
10 * provided the above notices are retained, and a notice that the code was
11 * modified is included with the above copyright notice.
14 #include "../all_aligned_atomic_load_store.h"
15 #include "../acquire_release_volatile.h"
16 #include "../test_and_set_t_is_ao_t.h"
17 #include "../standard_ao_double_t.h"
19 /* Data dependence does not imply read ordering. */
20 #define AO_NO_DD_ORDERING
35 #define AO_HAVE_nop_full
38 AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val)
40 register int was_equal = 0;
56 : "=&r" (temp), "+R" (*addr), "+r" (was_equal)
57 : "r" (new_val), "r" (old)
62 #define AO_HAVE_compare_and_swap
65 AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) {
66 int result = AO_compare_and_swap(addr, old, new_val);
71 #define AO_HAVE_compare_and_swap_acquire
74 AO_compare_and_swap_release(volatile AO_t *addr, AO_t old, AO_t new_val) {
76 return AO_compare_and_swap(addr, old, new_val);
79 #define AO_HAVE_compare_and_swap_release
82 AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) {
85 result = AO_compare_and_swap(addr, old, new_val);
90 #define AO_HAVE_compare_and_swap_full
93 * FIXME: We should also implement fetch_and_add and or primitives
97 #include "../ao_t_is_int.h"