Author: faridz Date: Thu Oct 2 07:17:49 2008 New Revision: 701135 URL: http://svn.apache.org/viewvc?rev=701135&view=rev Log: 2008-10-02 Farid Zaripov <[EMAIL PROTECTED]>
* include/rw/_atomic-sync.h: New header file with definitions of inline functions for atomic operations using __sync_xxx() built-in functions set. * include/rw/_atomic.h: #include <rw/_atomic-sync.h> with gcc >= 4.1 on x86, x86_64, ia64 platforms and icc on ia64 platform. Added: stdcxx/branches/4.2.x/include/rw/_atomic-sync.h (with props) Modified: stdcxx/branches/4.2.x/include/rw/_atomic.h Added: stdcxx/branches/4.2.x/include/rw/_atomic-sync.h URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_atomic-sync.h?rev=701135&view=auto ============================================================================== --- stdcxx/branches/4.2.x/include/rw/_atomic-sync.h (added) +++ stdcxx/branches/4.2.x/include/rw/_atomic-sync.h Thu Oct 2 07:17:49 2008 @@ -0,0 +1,338 @@ +/*************************************************************************** + * + * _atomic-sync.h - definitions of inline functions for atomic + * operations using __sync_xxx() functions set + * + * This is an internal header file used to implement the C++ Standard + * Library. It should never be #included directly by a program. + * + * $Id$ + * + *************************************************************************** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + * + * Copyright 1994-2008 Rogue Wave Software, Inc. + * + **************************************************************************/ + +#if defined (__ia64) && defined (__INTEL_COMPILER) +# include <ia64intrin.h> +#endif + +_RWSTD_NAMESPACE (__rw) { + +inline char +__rw_atomic_preincrement (char &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (1 == sizeof (char)); + return __sync_add_and_fetch (&__x, 1); +} + + +inline signed char +__rw_atomic_preincrement (signed char &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (1 == sizeof (signed char)); + return __sync_add_and_fetch (&__x, 1); +} + + +inline unsigned char +__rw_atomic_preincrement (unsigned char &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (1 == sizeof (unsigned char)); + return __sync_add_and_fetch (&__x, 1); +} + + +inline short +__rw_atomic_preincrement (short &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (2 == sizeof (short)); + return __sync_add_and_fetch (&__x, 1); +} + + +inline unsigned short +__rw_atomic_preincrement (unsigned short &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (2 == sizeof (unsigned short)); + return __sync_add_and_fetch (&__x, 1); +} + + +inline int +__rw_atomic_preincrement (int &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (4 == sizeof (int)); + return __sync_add_and_fetch (&__x, 1); +} + + +inline unsigned int +__rw_atomic_preincrement (unsigned int &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (4 == sizeof (unsigned int)); + return __sync_add_and_fetch (&__x, 1); +} + + +#if defined (__ia64) || defined (__x86_64) +# if 4 < _RWSTD_LONG_SIZE + +inline long +__rw_atomic_preincrement (long &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (long)); + return __sync_add_and_fetch (&__x, 1); +} + + +inline unsigned long +__rw_atomic_preincrement (unsigned long &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned long)); + return __sync_add_and_fetch (&__x, 1); +} + +# endif // _RWSTD_LONG_SIZE + + +# ifdef _RWSTD_LONG_LONG +# if _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE + +inline _RWSTD_LONG_LONG +__rw_atomic_preincrement (_RWSTD_LONG_LONG &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (_RWSTD_LONG_LONG)); + return __sync_add_and_fetch (&__x, 1); +} + + +inline unsigned _RWSTD_LONG_LONG +__rw_atomic_preincrement (unsigned _RWSTD_LONG_LONG &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned _RWSTD_LONG_LONG)); + return __sync_add_and_fetch (&__x, 1); +} + +# endif // _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE +# endif // _RWSTD_LONG_LONG +#endif // __ia64 || __x86_64 + +inline char +__rw_atomic_predecrement (char &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (1 == sizeof (char)); + return __sync_sub_and_fetch (&__x, 1); +} + + +inline signed char +__rw_atomic_predecrement (signed char &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (1 == sizeof (signed char)); + return __sync_sub_and_fetch (&__x, 1); +} + + +inline unsigned char +__rw_atomic_predecrement (unsigned char &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (1 == sizeof (unsigned char)); + return __sync_sub_and_fetch (&__x, 1); +} + + +inline short +__rw_atomic_predecrement (short &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (2 == sizeof (short)); + return __sync_sub_and_fetch (&__x, 1); +} + + +inline unsigned short +__rw_atomic_predecrement (unsigned short &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (2 == sizeof (unsigned short)); + return __sync_sub_and_fetch (&__x, 1); +} + + +inline int +__rw_atomic_predecrement (int &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (4 == sizeof (int)); + return __sync_sub_and_fetch (&__x, 1); +} + + +inline unsigned int +__rw_atomic_predecrement (unsigned int &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (4 == sizeof (unsigned int)); + return __sync_sub_and_fetch (&__x, 1); +} + + +#if defined (__ia64) || defined (__x86_64) +# if 4 < _RWSTD_LONG_SIZE + +inline long +__rw_atomic_predecrement (long &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (long)); + return __sync_sub_and_fetch (&__x, 1); +} + + +inline unsigned long +__rw_atomic_predecrement (unsigned long &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned long)); + return __sync_sub_and_fetch (&__x, 1); +} + +# endif // _RWSTD_LONG_SIZE + + +# ifdef _RWSTD_LONG_LONG +# if _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE + +inline _RWSTD_LONG_LONG +__rw_atomic_predecrement (_RWSTD_LONG_LONG &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (_RWSTD_LONG_LONG)); + return __sync_sub_and_fetch (&__x, 1); +} + + +inline unsigned _RWSTD_LONG_LONG +__rw_atomic_predecrement (unsigned _RWSTD_LONG_LONG &__x, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned _RWSTD_LONG_LONG)); + return __sync_sub_and_fetch (&__x, 1); +} + +# endif // _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE +# endif // _RWSTD_LONG_LONG +#endif // __ia64 || __x86_64 + + +inline char +__rw_atomic_exchange (char &__x, char __y, bool) +{ + _RWSTD_COMPILE_ASSERT (1 == sizeof (char)); + return __sync_lock_test_and_set (&__x, __y); +} + + +inline signed char +__rw_atomic_exchange (signed char &__x, signed char __y, bool) +{ + _RWSTD_COMPILE_ASSERT (1 == sizeof (signed char)); + return __sync_lock_test_and_set (&__x, __y); +} + + +inline unsigned char +__rw_atomic_exchange (unsigned char &__x, unsigned char __y, bool) +{ + _RWSTD_COMPILE_ASSERT (1 == sizeof (unsigned char)); + return __sync_lock_test_and_set (&__x, __y); +} + + +inline short +__rw_atomic_exchange (short &__x, short __y, bool) +{ + _RWSTD_COMPILE_ASSERT (2 == sizeof (short)); + return __sync_lock_test_and_set (&__x, __y); +} + + +inline unsigned short +__rw_atomic_exchange (unsigned short &__x, unsigned short __y, bool) +{ + _RWSTD_COMPILE_ASSERT (2 == sizeof (unsigned short)); + return __sync_lock_test_and_set (&__x, __y); +} + + +inline int +__rw_atomic_exchange (int &__x, int __y, bool) +{ + _RWSTD_COMPILE_ASSERT (4 == sizeof (int)); + return __sync_lock_test_and_set (&__x, __y); +} + + +inline unsigned int +__rw_atomic_exchange (unsigned int &__x, unsigned int __y, bool) +{ + _RWSTD_COMPILE_ASSERT (4 == sizeof (unsigned int)); + return __sync_lock_test_and_set (&__x, __y); +} + + +#if defined (__ia64) || defined (__x86_64) +# if 4 < _RWSTD_LONG_SIZE + +inline long +__rw_atomic_exchange (long &__x, long __y, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (long)); + return __sync_lock_test_and_set (&__x, __y); +} + + +inline unsigned long +__rw_atomic_exchange (unsigned long &__x, unsigned long __y, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned long)); + return __sync_lock_test_and_set (&__x, __y); +} + +# endif // _RWSTD_LONG_SIZE == _RWSTD_INT_SIZE + + +# ifdef _RWSTD_LONG_LONG +# if _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE + +inline _RWSTD_LONG_LONG +__rw_atomic_exchange (_RWSTD_LONG_LONG &__x, _RWSTD_LONG_LONG __y, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (_RWSTD_LONG_LONG)); + return __sync_lock_test_and_set (&__x, __y); +} + + +inline unsigned _RWSTD_LONG_LONG +__rw_atomic_exchange (unsigned _RWSTD_LONG_LONG &__x, + unsigned _RWSTD_LONG_LONG __y, bool) +{ + _RWSTD_COMPILE_ASSERT (8 == sizeof (unsigned _RWSTD_LONG_LONG)); + return __sync_lock_test_and_set (&__x, __y); +} + +# endif // _RWSTD_LLONG_SIZE > _RWSTD_LONG_SIZE +# endif // _RWSTD_LONG_LONG +#endif // __ia64 || __x86_64 + +} // namespace __rw Propchange: stdcxx/branches/4.2.x/include/rw/_atomic-sync.h ------------------------------------------------------------------------------ svn:eol-style = native Propchange: stdcxx/branches/4.2.x/include/rw/_atomic-sync.h ------------------------------------------------------------------------------ svn:keywords = Id Modified: stdcxx/branches/4.2.x/include/rw/_atomic.h URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/rw/_atomic.h?rev=701135&r1=701134&r2=701135&view=diff ============================================================================== --- stdcxx/branches/4.2.x/include/rw/_atomic.h (original) +++ stdcxx/branches/4.2.x/include/rw/_atomic.h Thu Oct 2 07:17:49 2008 @@ -57,6 +57,10 @@ # include <rw/_atomic-mipspro.h> # elif defined (_PA_RISC2_0) # include <rw/_atomic-parisc.h> +# elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 401) \ + && (defined (__i386__) || defined (__x86_64) || defined (__ia64)) \ + || (defined (__INTEL_COMPILER) && defined (__ia64)) +# include <rw/_atomic-sync.h> # elif defined (__i386__) && (defined (__GNUG__) \ || defined (__INTEL_COMPILER)) || defined (_M_IX86) # include <rw/_atomic-x86.h>