Date: Tue, 5 Mar 2019 21:52:01 -0800 From: Steve Kargl <sgk@troutmask.apl.washington.edu> To: Bruce Evans <brde@optusnet.com.au> Cc: freebsd-numerics@freebsd.org Subject: Re: Update ENTERI() macro Message-ID: <20190306055201.GA40298@troutmask.apl.washington.edu> In-Reply-To: <20190305153243.Y1349@besplex.bde.org> References: <20190226191825.GA68479@troutmask.apl.washington.edu> <20190227145002.P907@besplex.bde.org> <20190227074811.GA75972@troutmask.apl.washington.edu> <20190227201214.V1823@besplex.bde.org> <20190227161906.GA77785@troutmask.apl.washington.edu> <20190228060920.R4413@besplex.bde.org> <20190304212159.GA12587@troutmask.apl.washington.edu> <20190305153243.Y1349@besplex.bde.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Mar 05, 2019 at 03:48:11PM +1100, Bruce Evans wrote: > On Mon, 4 Mar 2019, Steve Kargl wrote: > > > On Thu, Feb 28, 2019 at 07:15:14AM +1100, Bruce Evans wrote: > >> ... > >> I said to use your method of __typeof(). I tested this: > >> > >> XX --- /tmp/math_private.h Sun Nov 27 17:58:57 2005 > >> XX +++ ./math_private.h Thu Feb 28 06:17:26 2019 > >> XX @@ -474,21 +474,22 @@ > >> XX /* Support switching the mode to FP_PE if necessary. */ > >> XX #if defined(__i386__) && !defined(NO_FPSETPREC) > >> XX -#define ENTERI() ENTERIT(long double) > >> XX -#define ENTERIT(returntype) \ > >> XX - returntype __retval; \ > >> XX +#define ENTERI() \ > >> XX fp_prec_t __oprec; \ > >> XX \ > >> XX if ((__oprec = fpgetprec()) != FP_PE) \ > >> XX fpsetprec(FP_PE) > >> XX -#define RETURNI(x) do { \ > >> XX - __retval = (x); \ > >> XX - if (__oprec != FP_PE) \ > >> XX - fpsetprec(__oprec); \ > >> XX +#define LEAVEI() \ > >> XX + if ((__oprec = fpgetprec()) != FP_PE) \ > >> XX + fpsetprec(FP_PE) > > > > Am I reading this diff wrong? Should LEAVEI() be > > > > #define LEAVEI() \ > > if (__oprec != FP_PE) \ > > fpsetprec(__oprec) > > > > That is, we want to reset the precision to what ENTERI > > grabbed in its conditinal expression. > > Oops. I wrote it wrong by copying the wrong clause. > > The broken version even passed quick runtime tests. This is because > the tests know that most long double functions are missing ENTERI(), > so they set the precision to FP_PE before the call. So both ENTERI() > and LEAVEI() find (__oprec = fpgetprec() equal to FP_PE and do nothing. > My math_private.h has a few additions, which meant I applied your diff manually. As I was reading it, I came across the issue. I think I have the s_cexpl.c file fixed to use LDBL_EXTRACT_WORDS instead of the new macro I introduced. I however cannot figure out what David Das did to arrive at k_exp.c, so I cannot write a similar k_cexpl.c. Yes, I added the 'c' in the name to avoid confusion in ld80/. In particular, I have no idea how he found his scaling value 'k'. Any insights? -- Steve
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20190306055201.GA40298>