According to https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html, there's:
type __atomic_load_n (type *ptr, int memorder)
and (the "generic"):
void __atomic_load (type *ptr, type *ret, int memorder)
then
void __atomic_store_n (type *ptr, type val, int memorder)
and ("the generic")
void __atomic_store (type *ptr, type *val, int memorder)
etc.
What is generic about the latter versions (that's not generic about the former ones) and why are they needed?