Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Sep 2020 05:28:31 +0000 (UTC)
From:      =?UTF-8?Q?Stefan_E=c3=9fer?= <se@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r365921 - in head/lib/msun: ld128 ld80
Message-ID:  <202009200528.08K5SVTd002323@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: se
Date: Sun Sep 20 05:28:31 2020
New Revision: 365921
URL: https://svnweb.freebsd.org/changeset/base/365921

Log:
  Apply fix for ld80 and ld128 submitted by Steve Kargl:
  
  - Micro-optimization: use sincosl(x) instead of a call to cosl(x) and
    a call to sinl(x).  Argument reduction is done once not twice.
  
  - Use a long double constant instead of an invalid double constant.
  
  - Spell scale2 correctly
  
  He could not test ld128, so that patch is untested.
  
  Submitted by:	sgk at troutmask.apl.washington.edu (Steve Kargl)

Modified:
  head/lib/msun/ld128/k_expl.h
  head/lib/msun/ld80/k_expl.h

Modified: head/lib/msun/ld128/k_expl.h
==============================================================================
--- head/lib/msun/ld128/k_expl.h	Sun Sep 20 05:23:16 2020	(r365920)
+++ head/lib/msun/ld128/k_expl.h	Sun Sep 20 05:28:31 2020	(r365921)
@@ -300,7 +300,7 @@ hexpl(long double x)
 static inline long double complex
 __ldexp_cexpl(long double complex z, int expt)
 {
-	long double exp_x, hi, lo;
+	long double c, exp_x, hi, lo, s;
 	long double x, y, scale1, scale2;
 	int half_expt, k;
 
@@ -308,16 +308,17 @@ __ldexp_cexpl(long double complex z, int expt)
 	y = cimagl(z);
 	__k_expl(x, &hi, &lo, &k);
 
-	exp_x = (lo + hi) * 0x1p16382;
+	exp_x = (lo + hi) * 0x1p16382L;
 	expt += k - 16382;
 
 	scale1 = 1;
 	half_expt = expt / 2;
 	SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
 	scale2 = 1;
-	SET_LDBL_EXPSIGN(scale1, BIAS + expt - half_expt);
+	SET_LDBL_EXPSIGN(scale2, BIAS + expt - half_expt);
 
-	return (CMPLXL(cos(y) * exp_x * scale1 * scale2,
-	    sinl(y) * exp_x * scale1 * scale2));
+	sincosl(y, &s, &c);
+	return (CMPLXL(c * exp_x * scale1 * scale2,
+	    s * exp_x * scale1 * scale2));
 }
 #endif /* _COMPLEX_H */

Modified: head/lib/msun/ld80/k_expl.h
==============================================================================
--- head/lib/msun/ld80/k_expl.h	Sun Sep 20 05:23:16 2020	(r365920)
+++ head/lib/msun/ld80/k_expl.h	Sun Sep 20 05:28:31 2020	(r365921)
@@ -277,7 +277,7 @@ hexpl(long double x)
 static inline long double complex
 __ldexp_cexpl(long double complex z, int expt)
 {
-	long double exp_x, hi, lo;
+	long double c, exp_x, hi, lo, s;
 	long double x, y, scale1, scale2;
 	int half_expt, k;
 
@@ -285,16 +285,17 @@ __ldexp_cexpl(long double complex z, int expt)
 	y = cimagl(z);
 	__k_expl(x, &hi, &lo, &k);
 
-	exp_x = (lo + hi) * 0x1p16382;
+	exp_x = (lo + hi) * 0x1p16382L;
 	expt += k - 16382;
 
 	scale1 = 1;
 	half_expt = expt / 2;
 	SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
 	scale2 = 1;
-	SET_LDBL_EXPSIGN(scale1, BIAS + expt - half_expt);
+	SET_LDBL_EXPSIGN(scale2, BIAS + expt - half_expt);
 
-	return (CMPLXL(cos(y) * exp_x * scale1 * scale2,
-	    sinl(y) * exp_x * scale1 * scale2));
+	sincosl(y, &s, &c);
+	return (CMPLXL(c * exp_x * scale1 * scale2,
+	    s * exp_x * scale1 * scale2));
 }
 #endif /* _COMPLEX_H */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202009200528.08K5SVTd002323>