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.
15 * FIXME: This should probably make finer distinctions. SGI MIPS is
16 * much more strongly ordered, and in fact closer to sequentially
17 * consistent. This is really aimed at modern embedded implementations.
18 * It looks to me like this assumes a 32-bit ABI. -HB
21 #include "../all_aligned_atomic_load_store.h"
22 #include "../acquire_release_volatile.h"
23 #include "../test_and_set_t_is_ao_t.h"
24 #include "../standard_ao_double_t.h"
26 /* Data dependence does not imply read ordering. */
27 #define AO_NO_DD_ORDERING
42 #define AO_HAVE_nop_full
45 AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val)
47 register int was_equal = 0;
63 : "=&r" (temp), "+R" (*addr), "+r" (was_equal)
64 : "r" (new_val), "r" (old)
69 #define AO_HAVE_compare_and_swap
71 /* FIXME: I think the implementations below should be automatically */
72 /* generated if we omit them. - HB */
75 AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) {
76 int result = AO_compare_and_swap(addr, old, new_val);
81 #define AO_HAVE_compare_and_swap_acquire
84 AO_compare_and_swap_release(volatile AO_t *addr, AO_t old, AO_t new_val) {
86 return AO_compare_and_swap(addr, old, new_val);
89 #define AO_HAVE_compare_and_swap_release
92 AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) {
95 result = AO_compare_and_swap(addr, old, new_val);
100 #define AO_HAVE_compare_and_swap_full
103 * FIXME: We should also implement fetch_and_add and or primitives
107 #include "../ao_t_is_int.h"