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
41 #define AO_HAVE_nop_full
44 AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val)
46 register int was_equal = 0;
62 : "=&r" (temp), "+R" (*addr), "+r" (was_equal)
63 : "r" (new_val), "r" (old)
67 #define AO_HAVE_compare_and_swap
69 /* FIXME: I think the implementations below should be automatically */
70 /* generated if we omit them. - HB */
73 AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) {
74 int result = AO_compare_and_swap(addr, old, new_val);
78 #define AO_HAVE_compare_and_swap_acquire
81 AO_compare_and_swap_release(volatile AO_t *addr, AO_t old, AO_t new_val) {
83 return AO_compare_and_swap(addr, old, new_val);
85 #define AO_HAVE_compare_and_swap_release
88 AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) {
91 result = AO_compare_and_swap(addr, old, new_val);
95 #define AO_HAVE_compare_and_swap_full
98 * FIXME: We should also implement fetch_and_add and or primitives
102 #include "../ao_t_is_int.h"