This is the mail archive of the gcc@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]

Re: locking problem with mips atomicity


Phil Edwards wrote:
> 
> On Tue, Mar 16, 2004 at 04:51:26PM -0800, Michael Eager wrote:
> > Phil Edwards wrote:
> > >
> > > 1)  libstdc++-v3 is temporarily frozen.  (This is /why/ you need to cc: the
> > >     list, so that you'll know when it's open for commits again.)
> > >
> > > 2)  Remove 'libstdc++-v3/' from the front of the pathname, please, and
> > >     add the log entry to libstdc++-v3/ChangeLog, not the toplevel file
> > >     (when the library is unfrozen, of course).
> >
> > Updated patch attached.
> >
> > I don't have check-in privs, so who can/should do this?
> 
> I can do it.  Things should be thawed again in a day or so.

With a bit of help from Paul Koning and a bit of head scratching, I've
modified the patch to only have constraints which are referenced.  I also
added a "memory" clobber.

Revised patch attached (hopefully, the last) and revised test case which
also invokes __atomic_add.

Thanks, Paul!

--
Michael Eager     eager@mvista.com	408-328-8426	
MontaVista Software, Inc. 1237 E. Arques Ave., Sunnyvale, CA  94085
2004-03-16  Michael Eager  <eager@mvista.com>

	* config/cpu/mips/atomicity.h:  Prevent reg loads 
	between LL and SC instructions.

Index: config/cpu/mips/atomicity.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/cpu/mips/atomicity.h,v
retrieving revision 1.9
diff -u -r1.9 atomicity.h
--- ./libstdc++-v3/config/cpu/mips/atomicity.h	27 Feb 2004 00:49:48 -0000	1.9
+++ ./libstdc++-v3/config/cpu/mips/atomicity.h	17 Mar 2004 22:34:09 -0000
@@ -44,14 +44,15 @@
 #if _MIPS_SIM == _ABIO32
        ".set	mips2\n\t"
 #endif
-       "ll	%0,%3\n\t"
-       "addu	%1,%4,%0\n\t"
-       "sc	%1,%2\n\t"
+       "ll	%0,0(%2)\n\t"
+       "addu	%1,%3,%0\n\t"
+       "sc	%1,0(%2)\n\t"
        ".set	pop\n\t"
        "beqz	%1,1b\n\t"
        "/* End exchange & add */"
-       : "=&r"(__result), "=&r"(__tmp), "=m"(*__mem)
-       : "m" (*__mem), "r"(__val));
+       : "=&r"(__result), "=&r"(__tmp), "+r"(__mem)
+       : "r"(__val)
+       :  "memory" );
     
     return __result;
   }
@@ -69,13 +70,14 @@
 #if _MIPS_SIM == _ABIO32
        ".set	mips2\n\t"
 #endif
-       "ll	%0,%2\n\t"
-       "addu	%0,%3,%0\n\t"
-       "sc	%0,%1\n\t"
+       "ll	%0,0(%1)\n\t"
+       "addu	%0,%2,%0\n\t"
+       "sc	%0,0(%1)\n\t"
        ".set	pop\n\t"
        "beqz	%0,1b\n\t"
        "/* End atomic add */"
-       : "=&r"(__result), "=m"(*__mem)
-     : "m" (*__mem), "r"(__val));
+       : "=&r"(__result), "+r"(__mem)
+       : "r"(__val)
+       : "memory" );
   }
 } // namespace __gnu_cxx
#include "atomicity.h"

struct gmonparam {
        long int state;
};

extern struct gmonparam _gmonparam ;


static void __attribute__ ((__used__)) __mcount ()
{
        register struct gmonparam *p;

        p = &_gmonparam;


        if (! compare_and_swap (&p->state, 0, 1))
          return;

        p->state = 0;
}



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