From owner-svn-src-projects@FreeBSD.ORG Fri Jun 19 04:43:49 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A23601065674; Fri, 19 Jun 2009 04:43:49 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 907DD8FC16; Fri, 19 Jun 2009 04:43:49 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n5J4hntc031288; Fri, 19 Jun 2009 04:43:49 GMT (envelope-from gonzo@svn.freebsd.org) Received: (from gonzo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n5J4hnJo031286; Fri, 19 Jun 2009 04:43:49 GMT (envelope-from gonzo@svn.freebsd.org) Message-Id: <200906190443.n5J4hnJo031286@svn.freebsd.org> From: Oleksandr Tymoshenko Date: Fri, 19 Jun 2009 04:43:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r194469 - projects/mips/sys/mips/include X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Jun 2009 04:43:49 -0000 Author: gonzo Date: Fri Jun 19 04:43:49 2009 New Revision: 194469 URL: http://svn.freebsd.org/changeset/base/194469 Log: - Mark temp variable as "earlyclobber" in assembler inline in atomic_fetchadd_32. Without it gcc would use it as input register for v and sometimes generate following code for function call like atomic_fetchadd_32(&(fp)->f_count, -1): 801238b4: 2402ffff li v0,-1 801238b8: c2230018 ll v1,24(s1) 801238bc: 00431021 addu v0,v0,v1 801238c0: e2220018 sc v0,24(s1) 801238c4: 1040fffc beqz v0,801238b8 801238c8: 00000000 nop Which is definitly wrong because if sc fails v0 is set to 0 and previous value of -1 is overriden hence whole operation turns to bogus Modified: projects/mips/sys/mips/include/atomic.h Modified: projects/mips/sys/mips/include/atomic.h ============================================================================== --- projects/mips/sys/mips/include/atomic.h Fri Jun 19 04:25:44 2009 (r194468) +++ projects/mips/sys/mips/include/atomic.h Fri Jun 19 04:43:49 2009 (r194469) @@ -294,7 +294,7 @@ atomic_fetchadd_32(__volatile uint32_t * "addu %2, %3, %0\n\t" /* calculate new value */ "sc %2, %1\n\t" /* attempt to store */ "beqz %2, 1b\n\t" /* spin if failed */ - : "=&r" (value), "=m" (*p), "=r" (temp) + : "=&r" (value), "=m" (*p), "=&r" (temp) : "r" (v), "m" (*p)); return (value); }