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)
This commit is contained in:
Stefan Eßer 2020-09-20 05:28:31 +00:00
parent 85ee267a3e
commit a67cc94327
2 changed files with 12 additions and 10 deletions

View File

@ -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 */

View File

@ -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 */