From owner-freebsd-sparc Tue Jan 14 18:15:34 2003 Delivered-To: freebsd-sparc@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 39D7C37B401 for ; Tue, 14 Jan 2003 18:15:33 -0800 (PST) Received: from mail.gmx.net (mail.gmx.net [213.165.65.60]) by mx1.FreeBSD.org (Postfix) with SMTP id 1AD7743EB2 for ; Tue, 14 Jan 2003 18:15:32 -0800 (PST) (envelope-from tmoestl@gmx.net) Received: (qmail 8657 invoked by uid 0); 15 Jan 2003 02:15:30 -0000 Received: from p508e6a74.dip.t-dialin.net (HELO galatea.local) (80.142.106.116) by mail.gmx.net (mp008-rz3) with SMTP; 15 Jan 2003 02:15:30 -0000 Received: from localhost ([127.0.0.1] helo=galatea.local) by galatea.local with esmtp (Exim 4.12 #1) id 18Yd78-0001hv-00; Wed, 15 Jan 2003 03:17:10 +0100 Received: (from tmm@localhost) by galatea.local (8.12.6/8.12.6/Submit) id h0F2H6xo006566; Wed, 15 Jan 2003 03:17:06 +0100 (CET) Date: Wed, 15 Jan 2003 03:17:06 +0100 From: Thomas Moestl To: John Polstra Cc: sparc@freebsd.org Subject: Re: Sparc64 floating point questions Message-ID: <20030115021706.GA5902@crow.dom2ip.de> Mail-Followup-To: John Polstra , sparc@freebsd.org References: <20030115003013.GA3536@crow.dom2ip.de> <200301150047.h0F0lNFc037477@vashon.polstra.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200301150047.h0F0lNFc037477@vashon.polstra.com> User-Agent: Mutt/1.4i Sender: owner-freebsd-sparc@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org On Tue, 2003/01/14 at 16:47:23 -0800, John Polstra wrote: > In article <20030115003013.GA3536@crow.dom2ip.de>, > Thomas Moestl wrote: > > On Tue, 2003/01/14 at 14:48:25 -0800, John Polstra wrote: > > > I need to find out how to do that. It > > > looks like if I save and restore the FSR and the FPRS and %q0 through > > > %q60, that will do it. Am I missing anything? > > > > Yes, that should do it. > > Good, and thanks. Oh, I should have mentioned that %fprs is a bit special; the kernel uses the FEF bit to test whether floating point support is enabled for the process, and will only save the state across context switches in that case. It will also lazily restore the context, i.e. it will disable the FEF bit and reload the registers only when the process uses floating point operations for the next time (which triggers an exception in that case). That means that %fprs must be restored first, otherwise this might clear FEF and cause stale values to be reloaded later. In fact, you do not need to save it at all; the only other bits in that register are the DU (upper fp register file half dirty) and DL (lower half dirty) bits, which are automatically maintained. For performance, it would probably be best to always just set the FEF bit before reloading the other registers (this is not required though), like: wr %g0, FPRS_FEF, %fprs - Thomas -- Thomas Moestl http://www.tu-bs.de/~y0015675/ http://people.FreeBSD.org/~tmm/ PGP fingerprint: 1C97 A604 2BD0 E492 51D0 9C0F 1FE6 4F1D 419C 776C To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-sparc" in the body of the message