From owner-freebsd-numerics@freebsd.org Tue Feb 26 19:18:29 2019 Return-Path: Delivered-To: freebsd-numerics@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1D1ED15008AB for ; Tue, 26 Feb 2019 19:18:29 +0000 (UTC) (envelope-from sgk@troutmask.apl.washington.edu) Received: from troutmask.apl.washington.edu (troutmask.apl.washington.edu [128.95.76.21]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "troutmask", Issuer "troutmask" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4DD366EE8F for ; Tue, 26 Feb 2019 19:18:27 +0000 (UTC) (envelope-from sgk@troutmask.apl.washington.edu) Received: from troutmask.apl.washington.edu (localhost [127.0.0.1]) by troutmask.apl.washington.edu (8.15.2/8.15.2) with ESMTPS id x1QJIP5H068514 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO) for ; Tue, 26 Feb 2019 11:18:25 -0800 (PST) (envelope-from sgk@troutmask.apl.washington.edu) Received: (from sgk@localhost) by troutmask.apl.washington.edu (8.15.2/8.15.2/Submit) id x1QJIPcN068513 for freebsd-numerics@freebsd.org; Tue, 26 Feb 2019 11:18:25 -0800 (PST) (envelope-from sgk) Date: Tue, 26 Feb 2019 11:18:25 -0800 From: Steve Kargl To: freebsd-numerics@freebsd.org Subject: Update ENTERI() macro Message-ID: <20190226191825.GA68479@troutmask.apl.washington.edu> Reply-To: sgk@troutmask.apl.washington.edu MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.11.2 (2019-01-07) X-Rspamd-Queue-Id: 4DD366EE8F X-Spamd-Bar: + Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [1.35 / 15.00]; ARC_NA(0.00)[]; HAS_REPLYTO(0.00)[sgk@troutmask.apl.washington.edu]; FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; NEURAL_HAM_LONG(-0.29)[-0.288,0]; MIME_GOOD(-0.10)[text/plain]; PREVIOUSLY_DELIVERED(0.00)[freebsd-numerics@freebsd.org]; TO_DN_NONE(0.00)[]; AUTH_NA(1.00)[]; RCPT_COUNT_ONE(0.00)[1]; RCVD_COUNT_THREE(0.00)[3]; RCVD_TLS_LAST(0.00)[]; NEURAL_SPAM_SHORT(0.42)[0.417,0]; RCVD_IN_DNSWL_MED(-0.20)[21.76.95.128.list.dnswl.org : 127.0.11.2]; MX_GOOD(-0.01)[cached: troutmask.apl.washington.edu]; DMARC_NA(0.00)[washington.edu]; NEURAL_SPAM_MEDIUM(0.47)[0.475,0]; R_SPF_NA(0.00)[]; REPLYTO_ADDR_EQ_FROM(0.00)[]; FROM_EQ_ENVFROM(0.00)[]; R_DKIM_NA(0.00)[]; MIME_TRACE(0.00)[0:+]; ASN(0.00)[asn:73, ipnet:128.95.0.0/16, country:US]; MID_RHS_MATCH_FROM(0.00)[]; IP_SCORE(0.05)[ip: (0.11), ipnet: 128.95.0.0/16(0.16), asn: 73(0.06), country: US(-0.07)] X-BeenThere: freebsd-numerics@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Discussions of high quality implementation of libm functions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Feb 2019 19:18:29 -0000 I have submitted https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236063 Update the ENTERI() macro in math_private.h to take a parameter. This parameter is used by __typeof() to set the type for an intermediate variable that holds the return value of a function on i386 FreeBSD. The patch updates the consumers of ENTERI(). --- /data/kargl/freebsd/src/lib/msun/src/e_acoshl.c 2013-07-30 10:32:47.000000000 -0700 +++ ./src/e_acoshl.c 2019-02-25 16:36:08.532381000 -0800 @@ -68,7 +68,7 @@ long double t; int16_t hx; - ENTERI(); + ENTERI(x); GET_LDBL_EXPSIGN(hx, x); if (hx < 0x3fff) { /* x < 1, or misnormal */ RETURNI((x-x)/(x-x)); --- /data/kargl/freebsd/src/lib/msun/src/e_atanhl.c 2013-07-30 10:32:47.000000000 -0700 +++ ./src/e_atanhl.c 2019-02-25 16:36:24.414626000 -0800 @@ -57,7 +57,7 @@ long double t; uint16_t hx, ix; - ENTERI(); + ENTERI(x); GET_LDBL_EXPSIGN(hx, x); ix = hx & 0x7fff; if (ix >= 0x3fff) /* |x| >= 1, or NaN or misnormal */ --- /data/kargl/freebsd/src/lib/msun/src/e_coshl.c 2016-10-10 14:48:39.000000000 -0700 +++ ./src/e_coshl.c 2019-02-25 16:37:03.670060000 -0800 @@ -97,7 +97,7 @@ /* x is INF or NaN */ if(ix>=0x7fff) return x*x; - ENTERI(); + ENTERI(x); /* |x| < 1, return 1 or c(x) */ if(ix<0x3fff) { --- /data/kargl/freebsd/src/lib/msun/src/e_sinhl.c 2016-10-10 14:48:39.000000000 -0700 +++ ./src/e_sinhl.c 2019-02-25 16:37:14.623690000 -0800 @@ -97,7 +97,7 @@ /* x is INF or NaN */ if(ix>=0x7fff) return x+x; - ENTERI(); + ENTERI(x); s = 1; if (jx<0) s = -1; --- /data/kargl/freebsd/src/lib/msun/src/math_private.h 2018-10-31 16:15:21.809877000 -0700 +++ ./src/math_private.h 2019-02-25 16:54:26.897247000 -0800 @@ -335,15 +348,14 @@ /* Support switching the mode to FP_PE if necessary. */ #if defined(__i386__) && !defined(NO_FPSETPREC) -#define ENTERI() ENTERIT(long double) -#define ENTERIT(returntype) \ - returntype __retval; \ +#define ENTERI(a) \ + __typeof(a) __retval; \ fp_prec_t __oprec; \ \ if ((__oprec = fpgetprec()) != FP_PE) \ fpsetprec(FP_PE) -#define RETURNI(x) do { \ - __retval = (x); \ +#define RETURNI(a) do { \ + __retval = (a); \ if (__oprec != FP_PE) \ fpsetprec(__oprec); \ RETURNF(__retval); \ @@ -359,9 +371,8 @@ return; \ } while (0) #else -#define ENTERI() -#define ENTERIT(x) -#define RETURNI(x) RETURNF(x) +#define ENTERI(a) +#define RETURNI(a) RETURNF(a) #define ENTERV() #define RETURNV() return #endif --- /data/kargl/freebsd/src/lib/msun/src/s_asinhl.c 2013-07-30 10:32:47.000000000 -0700 +++ ./src/s_asinhl.c 2019-02-25 16:37:44.264923000 -0800 @@ -71,7 +71,7 @@ long double t, w; uint16_t hx, ix; - ENTERI(); + ENTERI(x); GET_LDBL_EXPSIGN(hx, x); ix = hx & 0x7fff; if (ix >= 0x7fff) RETURNI(x+x); /* x is inf, NaN or misnormal */ --- /data/kargl/freebsd/src/lib/msun/src/s_cbrtl.c 2012-07-30 14:58:28.000000000 -0700 +++ ./src/s_cbrtl.c 2019-02-25 16:43:03.606703000 -0800 @@ -53,7 +53,7 @@ if (k == BIAS + LDBL_MAX_EXP) return (x + x); - ENTERI(); + ENTERI(x); if (k == 0) { /* If x = +-0, then cbrt(x) = +-0. */ if ((u.bits.manh | u.bits.manl) == 0) --- /data/kargl/freebsd/src/lib/msun/src/s_clogl.c 2019-02-26 11:00:53.735653000 -0800 +++ ./src/s_clogl.c 2019-02-25 16:43:19.194615000 -0800 @@ -65,7 +65,7 @@ uint16_t hax, hay; int kx, ky; - ENTERIT(long double complex); + ENTERI(z); x = creall(z); y = cimagl(z); --- /data/kargl/freebsd/src/lib/msun/src/s_cosl.c 2017-12-01 13:29:36.000000000 -0800 +++ ./src/s_cosl.c 2019-02-25 16:43:29.546277000 -0800 @@ -68,7 +68,7 @@ if (z.bits.exp == 32767) return ((x - x) / (x - x)); - ENTERI(); + ENTERI(x); /* Optimize the case where x is already within range. */ if (z.e < M_PI_4) --- /data/kargl/freebsd/src/lib/msun/src/s_roundl.c 2017-12-01 13:29:36.000000000 -0800 +++ ./src/s_roundl.c 2019-02-25 16:43:42.814592000 -0800 @@ -48,7 +48,7 @@ if ((hx & 0x7fff) == 0x7fff) return (x + x); - ENTERI(); + ENTERI(x); if (!(hx & 0x8000)) { t = floorl(x); --- /data/kargl/freebsd/src/lib/msun/src/s_sinl.c 2017-12-01 13:29:36.000000000 -0800 +++ ./src/s_sinl.c 2019-02-25 16:43:49.574030000 -0800 @@ -64,7 +64,7 @@ if (z.bits.exp == 32767) return ((x - x) / (x - x)); - ENTERI(); + ENTERI(x); /* Optimize the case where x is already within range. */ if (z.e < M_PI_4) { --- /data/kargl/freebsd/src/lib/msun/src/s_tanhl.c 2016-10-10 14:48:39.000000000 -0700 +++ ./src/s_tanhl.c 2019-02-25 16:44:10.604476000 -0800 @@ -127,7 +127,7 @@ else return one/x-one; /* tanh(NaN) = NaN */ } - ENTERI(); + ENTERI(x); /* |x| < 40 */ if (ix < 0x4004 || fabsl(x) < 40) { /* |x|<40 */ --- /data/kargl/freebsd/src/lib/msun/src/s_tanl.c 2017-12-01 13:29:36.000000000 -0800 +++ ./src/s_tanl.c 2019-02-25 16:44:21.348406000 -0800 @@ -70,7 +70,7 @@ if (z.bits.exp == 32767) return ((x - x) / (x - x)); - ENTERI(); + ENTERI(x); /* Optimize the case where x is already within range. */ if (z.e < M_PI_4) { --- /data/kargl/freebsd/src/lib/msun/ld80/e_lgammal_r.c 2016-10-10 14:48:38.000000000 -0700 +++ ./ld80/e_lgammal_r.c 2019-02-26 11:04:45.992781000 -0800 @@ -261,7 +261,7 @@ ix = hx&0x7fff; if(ix==0x7fff) return x*x; - ENTERI(); + ENTERI(x); /* purge +-0 and tiny arguments */ *signgamp = 1-2*(hx>>15); --- /data/kargl/freebsd/src/lib/msun/ld80/s_erfl.c 2014-07-13 10:05:05.000000000 -0700 +++ ./ld80/s_erfl.c 2019-02-26 11:05:35.163816000 -0800 @@ -231,7 +231,7 @@ return (1-i)+one/x; /* erfl(+-inf)=+-1 */ } - ENTERI(); + ENTERI(x); ax = fabsl(x); if(ax < 0.84375) { @@ -284,7 +284,7 @@ return ((hx>>15)<<1)+one/x; } - ENTERI(); + ENTERI(x); ax = fabsl(x); if(ax < 0.84375L) { --- /data/kargl/freebsd/src/lib/msun/ld80/s_exp2l.c 2017-12-01 13:29:35.000000000 -0800 +++ ./ld80/s_exp2l.c 2019-02-25 16:31:42.300930000 -0800 @@ -242,7 +242,7 @@ return (1.0L + x); /* 1 with inexact */ } - ENTERI(); + ENTERI(x); /* * Reduce x, computing z, i0, and k. The low bits of x + redux --- /data/kargl/freebsd/src/lib/msun/ld80/s_expl.c 2018-10-31 16:15:21.293646000 -0700 +++ ./ld80/s_expl.c 2019-02-25 16:32:05.335182000 -0800 @@ -97,7 +97,7 @@ RETURN2P(1, x); /* 1 with inexact iff x != 0 */ } - ENTERI(); + ENTERI(x); twopk = 1; __k_expl(x, &hi, &lo, &k); @@ -193,7 +193,7 @@ RETURN2P(tiny, -1); /* good for x < -65ln2 - eps */ } - ENTERI(); + ENTERI(x); if (T1 < x && x < T2) { if (ix < BIAS - 74) { /* |x| < 0x1p-74 (includes pseudos) */ --- /data/kargl/freebsd/src/lib/msun/ld80/s_logl.c 2017-12-01 13:29:35.000000000 -0800 +++ ./ld80/s_logl.c 2019-02-25 16:34:17.938768000 -0800 @@ -481,7 +481,7 @@ /* log(pseudo-NaN) = qNaN */ /* log(unnormal) = qNaN */ #ifndef STRUCT_RETURN - ENTERI(); + ENTERI(x); #endif k += hx; ix = lx & 0x7fffffffffffffffULL; @@ -588,7 +588,7 @@ f_hi = x; f_lo = 0; /* avoid underflow of the P5 term */ } - ENTERI(); + ENTERI(x); x = f_hi + f_lo; f_lo = (f_hi - x) + f_lo; @@ -668,7 +668,7 @@ { struct ld r; - ENTERI(); + ENTERI(x); DOPRINT_START(&x); k_logl(x, &r); RETURNSPI(&r); @@ -686,7 +686,7 @@ struct ld r; long double hi, lo; - ENTERI(); + ENTERI(x); DOPRINT_START(&x); k_logl(x, &r); if (!r.lo_set) @@ -704,7 +704,7 @@ struct ld r; long double hi, lo; - ENTERI(); + ENTERI(x); DOPRINT_START(&x); k_logl(x, &r); if (!r.lo_set) --- /data/kargl/freebsd/src/lib/msun/ld128/s_expl.c 2018-10-31 16:15:21.240218000 -0700 +++ ./ld128/s_expl.c 2019-02-25 16:28:16.950376000 -0800 @@ -85,7 +85,7 @@ RETURN2P(1, x); /* 1 with inexact iff x != 0 */ } - ENTERI(); + ENTERI(x); twopk = 1; __k_expl(x, &hi, &lo, &k); @@ -232,7 +232,7 @@ RETURN2P(tiny, -1); /* good for x < -114ln2 - eps */ } - ENTERI(); + ENTERI(x); if (T1 < x && x < T2) { x2 = x * x; --- /data/kargl/freebsd/src/lib/msun/ld128/s_logl.c 2017-12-01 13:29:34.000000000 -0800 +++ ./ld128/s_logl.c 2019-02-25 16:30:18.608573000 -0800 @@ -478,7 +478,7 @@ } else if (hx >= 0x7fff) RETURN1(rp, x + x); /* log(Inf or NaN) = Inf or qNaN */ #ifndef STRUCT_RETURN - ENTERI(); + ENTERI(x); #endif k += hx; dk = k; @@ -597,7 +597,7 @@ f_hi = x; f_lo = 0; /* avoid underflow of the P3 term */ } - ENTERI(); + ENTERI(x); x = f_hi + f_lo; f_lo = (f_hi - x) + f_lo; @@ -678,7 +678,7 @@ { struct ld r; - ENTERI(); + ENTERI(x); DOPRINT_START(&x); k_logl(x, &r); RETURNSPI(&r); @@ -705,7 +705,7 @@ long double lo; float hi; - ENTERI(); + ENTERI(x); DOPRINT_START(&x); k_logl(x, &r); if (!r.lo_set) @@ -724,7 +724,7 @@ long double lo; float hi; - ENTERI(); + ENTERI(x); DOPRINT_START(&x); k_logl(x, &r); if (!r.lo_set) -- Steve