changing shared macro doesn't effect other atomic_ops because (*ptr [+|^] delta) and (delta [+|^] *ptr) have same result. atomic_sub_*() haven't used because non standard API?