From aa475990872e5592825ef29489259ad386e5127a Mon Sep 17 00:00:00 2001
From: paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Mon, 29 May 2006 20:00:29 +0000
Subject: [PATCH] 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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114215 138bc75d-0d04-0410-961f-82ee72b054a4
---
 libstdc++-v3/ChangeLog                | 12 ++++++++++
 libstdc++-v3/config.h.in              |  3 +++
 libstdc++-v3/configure                |  9 ++++++++
 libstdc++-v3/configure.ac             |  6 +++++
 libstdc++-v3/include/bits/atomicity.h | 32 +++++++++++++++++++++++++--
 5 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index aea6f284c28d..791b42f9dc8d 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,15 @@
+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
diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in
index 5c373f53fedd..a75af3835d07 100644
--- a/libstdc++-v3/config.h.in
+++ b/libstdc++-v3/config.h.in
@@ -655,6 +655,9 @@
 /* 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
 
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 72dceb408914..68e2f6c0d371 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -109856,6 +109856,15 @@ ABI_TWEAKS_SRCDIR=config/${abi_tweaks_dir}
 
 
 
+# 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)
diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
index d6a7b98c2359..45dd410ae0cf 100644
--- a/libstdc++-v3/configure.ac
+++ b/libstdc++-v3/configure.ac
@@ -318,6 +318,12 @@ AC_SUBST(CPU_DEFINES_SRCDIR)
 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)
diff --git a/libstdc++-v3/include/bits/atomicity.h b/libstdc++-v3/include/bits/atomicity.h
index 53ab6fad7034..c6a98833a2fa 100644
--- a/libstdc++-v3/include/bits/atomicity.h
+++ b/libstdc++-v3/include/bits/atomicity.h
@@ -49,6 +49,34 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
   __attribute__ ((__unused__))
   __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)
   {
@@ -68,7 +96,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
 #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);
 
@@ -86,7 +114,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
 #ifdef __GTHREADS
 
     if (__gthread_active_p())
-      __atomic_add(__mem, __val);
+      __atomic_add_multi(__mem, __val);
     else
       __atomic_add_single(__mem, __val);
 
-- 
GitLab