This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH (libstdc++-v3 mainline): Re-enable i386/atomicity.h


Back in Nov. 2002, a bug was fixed on mainline/3.3 whereby an >=i486
implementation had been incorrectly enabled on a plain i386
configuration of libstdc++-v3.  This bug existed since gcc 3.0 was
released yet it was plain to see and had to be fixed for 3.3.  This
mainly matters when a target was not under-configured to be an i386
but was really an e.g. i686 (such under configuration is typical for
both FreeBSD and Debian, to name two such ports).  Plain i386 targets
were downgraded to the generic/atomicity.h implementation.  The
generic/atomicity.h implementation was then made correct by adding
mutex protection around affected _Atomic_word.  I.e. this was a
correct path to fixing the bug.  However, we hoped for a better "fix".
The right people came together to build an implementation that works
for plain i386 (mainly Joel, even though he was attempting to raise
the issue as it relates to gcc 3.2.X).

Even for a fairly fast mutex implementation, use of a mutex instead of
a spinlock resulted in a sizable performance drop for MT test cases
(over twice as slow on i386-unknown-freebsd4.8).  This implementation
follows the "one guard spinlock" form of sparc32 and some other
atomicity.h implementations.  It is about 2-3% slower than the i486
lock implementation when compared on an i686.  More details of the
speed analysis are here:  http://gcc.gnu.org/ml/libstdc++/2003-04/msg00485.html

There are some remaining issues to ponder before this work could be
moved to the 3.3 branch.  However, shipping as-configured i386 ports
pointing to generic/atomicity.h for even one public release is quite
unattractive now that I/we understand the performance profile we are
about to lock users into for one full gcc release cycle (this is an
effective ABI change given the way we expose atomicity.h).

This patch has seen enough eyes to warrant mainline installation thus
now committed.  It is believed to work in all configurations of an
IA32 system including SMP.  We shall give it some time on mainline and
I will file a PR against 3.3 RE the issue.

Rebuilt libstdc++-v3 from scratch and checked without regression:
	i386-unknown-freebsd4.8 (mainline)
	i386-unknown-freebsd4.8 (3.3)
	i386-unknown-freebsd5.0 (mainline)

I'd be interested to know what the speed up is versus a different
mutex library (I guess glibc) and the situation on SMP.  Although I've
been cranky, I'd still want to do anything additional to improve RTEMS
situation, if still required.  Given the minimal slowdown for what I
consider very heav-duty threaded test cases, my recommendation is to
remove the i486 implementation entirely for the 3.3 release, if that
help linkage ABI issues...

2003-04-29 Joel Sherrill  <joel.sherrill@OARcorp.com>
	   Loren J. Rittle <ljrittle@acm.org>
	   Martin v. Loewis  <martin@v.loewis.de>

	* config/cpu/i386/atomicity.h: New file.

Index: libstdc++-v3/config/cpu/i386/atomicity.h
===================================================================
RCS file: libstdc++-v3/config/cpu/i386/atomicity.h
diff -N libstdc++-v3/config/cpu/i386/atomicity.h
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- libstdc++-v3/config/cpu/i386/atomicity.h	29 Apr 2003 21:08:52 -0000
***************
*** 0 ****
--- 1,75 ----
+ // Low-level functions for atomic operations: x86, x >= 3 version  -*- C++ -*-
+ 
+ // Copyright (C) 2003 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library is distributed in the hope that it will be useful,
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ // GNU General Public License for more details.
+ 
+ // You should have received a copy of the GNU General Public License along
+ // with this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _BITS_ATOMICITY_H
+ #define _BITS_ATOMICITY_H	1
+ 
+ typedef int _Atomic_word;
+ 
+ template <int __inst>
+ struct __Atomicity_lock
+ {
+   static volatile _Atomic_word _S_atomicity_lock;
+ };
+ 
+ template <int __inst>
+ volatile _Atomic_word __Atomicity_lock<__inst>::_S_atomicity_lock = 0;
+ 
+ template volatile _Atomic_word __Atomicity_lock<0>::_S_atomicity_lock;
+ 
+ static inline _Atomic_word 
+ __attribute__ ((__unused__))
+ __exchange_and_add (volatile _Atomic_word *__mem, int __val)
+ {
+   register _Atomic_word __result, __tmp = 1;
+ 
+   /* obtain the atomic exchange/add spin lock */
+   do {
+     __asm__ __volatile__ ("xchgl %0,%1"
+ 			  : "+m" (__Atomicity_lock<0>::_S_atomicity_lock),
+ 			    "+r" (__tmp));
+   } while (__tmp);
+ 
+   __result = *__mem;
+   *__mem += __val;
+ 
+   /* release spin lock */
+   __Atomicity_lock<0>::_S_atomicity_lock = 0;
+ 
+   return __result;
+ }
+ 
+ static inline void
+ __attribute__ ((__unused__))
+ __atomic_add (volatile _Atomic_word* __mem, int __val)
+ {
+   __exchange_and_add (__mem, __val);
+ }
+ 
+ #endif /* atomicity.h */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]