svn commit: r365921 - in head/lib/msun: ld128 ld80
Stefan Eßer
se at FreeBSD.org
Sun Sep 20 05:28:32 UTC 2020
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 */
More information about the svn-src-all
mailing list