Update ENTERI() macro

Steve Kargl sgk at troutmask.apl.washington.edu
Tue Feb 26 19:18:29 UTC 2019


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


More information about the freebsd-numerics mailing list