📄 powerpc.h
字号:
/* FIXME. This is only a placeholder for the AIX compiler. *//* It doesn't work. Please send a patch. *//* Memory model documented at http://www-106.ibm.com/developerworks/ *//* eserver/articles/archguide.html and (clearer) *//* http://www-106.ibm.com/developerworks/eserver/articles/powerpc.html. *//* There appears to be no implicit ordering between any kind of *//* independent memory references. *//* Architecture enforces some ordering based on control dependence. *//* I don't know if that could help. *//* Data-dependent loads are always ordered. *//* Based on the above references, eieio is intended for use on *//* uncached memory, which we don't support. It does not order loads *//* from cached memory. *//* Thanks to Maged Michael, Doug Lea, and Roger Hoover for helping to *//* track some of this down and correcting my misunderstandings. -HB */#include "../all_aligned_atomic_load_store.h"void AO_sync(void);#pragma mc_func AO_sync { "7c0004ac" }void AO_lwsync(void);#pragma mc_func AO_lwsync { "7c2004ac" }#define AO_nop_write() AO_lwsync()#define AO_HAVE_nop_write#define AO_nop_read() AO_lwsync()#define AO_HAVE_nop_read/* We explicitly specify load_acquire and store_release, since these *//* rely on the fact that lwsync is also a LoadStore barrier. */AO_INLINE AO_tAO_load_acquire(volatile AO_t *addr){ AO_t result = *addr; AO_lwsync(); return result;}#define AO_HAVE_load_acquireAO_INLINE voidAO_store_release(volatile AO_t *addr, AO_t value){ AO_lwsync(); *addr = value;}#define AO_HAVE_load_acquire/* This is similar to the code in the garbage collector. Deleting *//* this and having it synthesized from compare_and_swap would probably *//* only cost us a load immediate instruction. */AO_INLINE AO_TS_VAL_tAO_test_and_set(volatile AO_TS_t *addr) {# error Implement me}#define AO_have_test_and_setAO_INLINE AO_TS_VAL_tAO_test_and_set_acquire(volatile AO_TS_t *addr) { AO_TS_VAL_t result = AO_test_and_set(addr); AO_lwsync(); return result;}#define AO_HAVE_test_and_set_acquireAO_INLINE AO_TS_VAL_tAO_test_and_set_release(volatile AO_TS_t *addr) { AO_lwsync(); return AO_test_and_set(addr);}#define AO_HAVE_test_and_set_releaseAO_INLINE AO_TS_VAL_tAO_test_and_set_full(volatile AO_TS_t *addr) { AO_TS_VAL_t result; AO_lwsync(); result = AO_test_and_set(addr); AO_lwsync(); return result;}#define AO_HAVE_test_and_set_fullAO_INLINE AO_tAO_compare_and_swap(volatile AO_t *addr, AO_t old, AO_t new_val) {# error Implement me}#define AO_HAVE_compare_and_swapAO_INLINE AO_tAO_compare_and_swap_acquire(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_t result = AO_compare_and_swap(addr, old, new_val); AO_lwsync(); return result;}#define AO_HAVE_compare_and_swap_acquireAO_INLINE AO_tAO_compare_and_swap_release(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_lwsync(); return AO_compare_and_swap(addr, old, new_val);}#define AO_HAVE_compare_and_swap_releaseAO_INLINE AO_tAO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) { AO_t result; AO_lwsync(); result = AO_compare_and_swap(addr, old, new_val); AO_lwsync(); return result;}#define AO_HAVE_compare_and_swap_full/* FIXME: We should also implement fetch_and_add and or primitives *//* directly. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -