diff options
author | Paolo Carlini <pcarlini@suse.de> | 2006-05-29 20:00:29 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2006-05-29 20:00:29 +0000 |
commit | 9268b7cb5f1d111b638ca275007415ec580aebf5 (patch) | |
tree | f42102a03cc9d8999b5f5f2e7b0f5aacc5ceff7f | |
parent | acb69f1c028c9967eab7675135171531727072c2 (diff) | |
download | gcc-9268b7cb5f1d111b638ca275007415ec580aebf5.zip gcc-9268b7cb5f1d111b638ca275007415ec580aebf5.tar.gz gcc-9268b7cb5f1d111b638ca275007415ec580aebf5.tar.bz2 |
re PR libstdc++/24692 (Atomic builtins for v3)
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.
From-SVN: r114215
-rw-r--r-- | libstdc++-v3/ChangeLog | 12 | ||||
-rw-r--r-- | libstdc++-v3/config.h.in | 3 | ||||
-rwxr-xr-x | libstdc++-v3/configure | 9 | ||||
-rw-r--r-- | libstdc++-v3/configure.ac | 6 | ||||
-rw-r--r-- | 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 aea6f28..791b42f 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 5c373f5..a75af38 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 72dceb4..68e2f6c 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 d6a7b98..45dd410 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 53ab6fa..c6a9883 100644 --- a/libstdc++-v3/include/bits/atomicity.h +++ b/libstdc++-v3/include/bits/atomicity.h @@ -50,6 +50,34 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) __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; @@ -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); |