void SIZE(libat_store) (UTYPE *mptr, UTYPE newval, int smodel) { UWORD magic; pre_seq_barrier (smodel); magic = protect_start (mptr); *mptr = newval; protect_end (mptr, magic); post_seq_barrier (smodel); }
UTYPE SIZE(libat_load) (UTYPE *mptr, int smodel) { UTYPE ret; UWORD magic; pre_seq_barrier (smodel); magic = protect_start (mptr); ret = *mptr; protect_end (mptr, magic); post_seq_barrier (smodel); return ret; }
bool SIZE(libat_test_and_set) (UTYPE *mptr, int smodel) { UTYPE oldval; UWORD magic; pre_seq_barrier (smodel); magic = protect_start (mptr); oldval = *mptr; *mptr = __GCC_ATOMIC_TEST_AND_SET_TRUEVAL; protect_end (mptr, magic); post_seq_barrier (smodel); return oldval != 0; }
UTYPE SIZE(libat_exchange) (UTYPE *mptr, UTYPE newval, int smodel UNUSED) { UTYPE oldval; UWORD magic; pre_seq_barrier (smodel); magic = protect_start (mptr); oldval = *mptr; *mptr = newval; protect_end (mptr, magic); post_seq_barrier (smodel); return oldval; }
UTYPE SIZE(C3(libat_,NAME,_fetch)) (UTYPE *mptr, UTYPE opval, int smodel UNUSED) { UTYPE ret; UWORD magic; pre_seq_barrier (smodel); magic = protect_start (mptr); ret = OP (*mptr, opval); *mptr = ret; protect_end (mptr, magic); post_seq_barrier (smodel); return ret; }
bool SIZE(libat_compare_exchange) (UTYPE *mptr, UTYPE *eptr, UTYPE newval, int smodel, int fmodel UNUSED) { UTYPE oldval; UWORD magic; bool ret; pre_seq_barrier (smodel); magic = protect_start (mptr); oldval = *mptr; ret = (oldval == *eptr); if (ret) *mptr = newval; else *eptr = oldval; protect_end (mptr, magic); post_seq_barrier (smodel); return ret; }