PR libstdc++/24692
* include/bits/atomicity.h (__exchange_and_add_multi,
__atomic_add_multi): New, depending on _GLIBCXX_ATOMIC_BUILTINS,
inline the atomic builtins.
(__exchange_and_add_dispatch, __atomic_add_dispatch): Adjust.
* configure.ac: Define _GLIBCXX_ATOMIC_BUILTINS when the atomic
builtins are available.
* configure: Regenerate.
* config.h.in: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114215
138bc75d-0d04-0410-961f-
82ee72b054a4
+2006-05-29 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/24692
+ * include/bits/atomicity.h (__exchange_and_add_multi,
+ __atomic_add_multi): New, depending on _GLIBCXX_ATOMIC_BUILTINS,
+ inline the atomic builtins.
+ (__exchange_and_add_dispatch, __atomic_add_dispatch): Adjust.
+ * configure.ac: Define _GLIBCXX_ATOMIC_BUILTINS when the atomic
+ builtins are available.
+ * configure: Regenerate.
+ * config.h.in: Likewise.
+
2006-05-27 Paolo Carlini <pcarlini@suse.de>
* configure.host: If the CPU provides atomic builtins select
/* Version number of package */
#undef VERSION
+/* Define if atomic builtins are provided for this platform. */
+#undef _GLIBCXX_ATOMIC_BUILTINS
+
/* Define to use concept checking code from the boost libraries. */
#undef _GLIBCXX_CONCEPT_CHECKS
+# Atomic builtins can be inlined in bits/atomicity.h.
+if test $atomicity_dir = cpu/generic/atomic_builtins ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define _GLIBCXX_ATOMIC_BUILTINS 1
+_ACEOF
+
+fi
+
# Determine cross-compile flags and AM_CONDITIONALs.
#AC_SUBST(GLIBCXX_IS_NATIVE)
#AM_CONDITIONAL(CANADIAN, test $CANADIAN = yes)
AC_SUBST(ABI_TWEAKS_SRCDIR)
AC_SUBST(OS_INC_SRCDIR)
+# Atomic builtins can be inlined in bits/atomicity.h.
+if test $atomicity_dir = cpu/generic/atomic_builtins ; then
+ AC_DEFINE([_GLIBCXX_ATOMIC_BUILTINS], 1,
+ [Define if atomic builtins are provided for this platform.])
+fi
+
# Determine cross-compile flags and AM_CONDITIONALs.
#AC_SUBST(GLIBCXX_IS_NATIVE)
#AM_CONDITIONAL(CANADIAN, test $CANADIAN = yes)
__atomic_add(volatile _Atomic_word* __mem, int __val);
static inline _Atomic_word
+ __exchange_and_add_multi(volatile _Atomic_word* __mem, int __val)
+ {
+#ifdef _GLIBCXX_ATOMIC_BUILTINS
+
+ return __sync_fetch_and_add(__mem, __val);
+
+#else
+
+ return __exchange_and_add(__mem, __val);
+
+#endif
+ }
+
+ static inline void
+ __atomic_add_multi(volatile _Atomic_word* __mem, int __val)
+ {
+#ifdef _GLIBCXX_ATOMIC_BUILTINS
+
+ __sync_fetch_and_add(__mem, __val);
+
+#else
+
+ __atomic_add(__mem, __val);
+
+#endif
+ }
+
+ static inline _Atomic_word
__exchange_and_add_single(volatile _Atomic_word* __mem, int __val)
{
_Atomic_word __result = *__mem;
#ifdef __GTHREADS
if (__gthread_active_p())
- return __exchange_and_add(__mem, __val);
+ return __exchange_and_add_multi(__mem, __val);
else
return __exchange_and_add_single(__mem, __val);
#ifdef __GTHREADS
if (__gthread_active_p())
- __atomic_add(__mem, __val);
+ __atomic_add_multi(__mem, __val);
else
__atomic_add_single(__mem, __val);