1 /* FIXME. This is only a placeholder for the AIX compiler. */
2 /* It doesn't work. Please send a patch. */
3 /* Memory model documented at http://www-106.ibm.com/developerworks/ */
4 /* eserver/articles/archguide.html and (clearer) */
5 /* http://www-106.ibm.com/developerworks/eserver/articles/powerpc.html. */
6 /* There appears to be no implicit ordering between any kind of */
7 /* independent memory references. */
8 /* Architecture enforces some ordering based on control dependence. */
9 /* I don't know if that could help. */
10 /* Data-dependent loads are always ordered. */
11 /* Based on the above references, eieio is intended for use on */
12 /* uncached memory, which we don't support. It does not order loads */
13 /* from cached memory. */
14 /* Thanks to Maged Michael, Doug Lea, and Roger Hoover for helping to */
15 /* track some of this down and correcting my misunderstandings. -HB */
17 #include "../all_aligned_atomic_load_store.h"
20 #pragma mc_func AO_sync { "7c0004ac" }
23 # define AO_lwsync AO_sync
26 #pragma mc_func AO_lwsync { "7c2004ac" }
29 #define AO_nop_write() AO_lwsync()
30 #define AO_HAVE_nop_write
32 #define AO_nop_read() AO_lwsync()
33 #define AO_HAVE_nop_read
35 /* We explicitly specify load_acquire and store_release, since these */
36 /* rely on the fact that lwsync is also a LoadStore barrier. */
38 AO_load_acquire(const volatile AO_t *addr)
45 #define AO_HAVE_load_acquire
48 AO_store_release(volatile AO_t *addr, AO_t value)
54 #define AO_HAVE_load_acquire
56 /* This is similar to the code in the garbage collector. Deleting */
57 /* this and having it synthesized from compare_and_swap would probably */
58 /* only cost us a load immediate instruction. */
59 /*AO_INLINE AO_TS_VAL_t
60 AO_test_and_set(volatile AO_TS_t *addr) {
61 # error FIXME Implement me
64 #define AO_HAVE_test_and_set*/
67 AO_test_and_set_acquire(volatile AO_TS_t *addr) {
68 AO_TS_VAL_t result = AO_test_and_set(addr);
73 #define AO_HAVE_test_and_set_acquire
76 AO_test_and_set_release(volatile AO_TS_t *addr) {
78 return AO_test_and_set(addr);
81 #define AO_HAVE_test_and_set_release
84 AO_test_and_set_full(volatile AO_TS_t *addr) {
87 result = AO_test_and_set(addr);
92 #define AO_HAVE_test_and_set_full
95 AO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) {
96 # error FIXME Implement me
99 #define AO_HAVE_compare_and_swap*/
102 AO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) {
103 AO_t result = AO_compare_and_swap(addr, old, new_val);
108 #define AO_HAVE_compare_and_swap_acquire
111 AO_compare_and_swap_release(volatile AO_t *addr, AO_t old, AO_t new_val) {
113 return AO_compare_and_swap(addr, old, new_val);
116 #define AO_HAVE_compare_and_swap_release
119 AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) {
122 result = AO_compare_and_swap(addr, old, new_val);
127 #define AO_HAVE_compare_and_swap_full
129 /* FIXME: We should also implement fetch_and_add and or primitives */