s_sinf.c: Replace floor with simple casts

Since s_sinf.c either assigns the return value of floor to integer or
passes double converted from integer to floor, this patch replaces
floor with simple casts.

Also since long == int for 32-bit targets, we can use long instead of
int to avoid 64-bit integer for 64-bit targets.

On Skylake, bench-sinf reports performance improvement:

           Before        After         Improvement
max        130.566       129.564           30%
min        7.704         7.706             0%
mean       21.8188       19.1363           30%

	* sysdeps/ieee754/flt-32/s_sinf.c (reduced): Replace long with
	int.
	(SINF_FUNC): Likewise.  Replace floor with simple casts.
This commit is contained in:
H.J. Lu 2017-12-05 08:32:19 -08:00
parent c7e882b705
commit 91c318e7b9
2 changed files with 12 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2017-12-05 H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/ieee754/flt-32/s_sinf.c (reduced): Replace long with
int.
(SINF_FUNC): Likewise. Replace floor with simple casts.
2017-12-05 Mike FABIAN <mfabian@redhat.com> 2017-12-05 Mike FABIAN <mfabian@redhat.com>
[BZ #22517] [BZ #22517]

View File

@ -85,8 +85,8 @@ static const int ones[] = { +1, -1 };
SIGNBIT is used to add the correct sign after the Chebyshev SIGNBIT is used to add the correct sign after the Chebyshev
polynomial is computed. */ polynomial is computed. */
static inline float static inline float
reduced (const double theta, const unsigned long int n, reduced (const double theta, const unsigned int n,
const unsigned long int signbit) const unsigned int signbit)
{ {
double sx; double sx;
const double theta2 = theta * theta; const double theta2 = theta * theta;
@ -162,14 +162,14 @@ SINF_FUNC (float x)
} }
else /* |x| >= Pi/4. */ else /* |x| >= Pi/4. */
{ {
unsigned long int signbit = (x < 0); unsigned int signbit = (x < 0);
if (abstheta < 9 * M_PI_4) /* |x| < 9*Pi/4. */ if (abstheta < 9 * M_PI_4) /* |x| < 9*Pi/4. */
{ {
/* There are cases where FE_UPWARD rounding mode can /* There are cases where FE_UPWARD rounding mode can
produce a result of abstheta * inv_PI_4 == 9, produce a result of abstheta * inv_PI_4 == 9,
where abstheta < 9pi/4, so the domain for where abstheta < 9pi/4, so the domain for
pio2_table must go to 5 (9 / 2 + 1). */ pio2_table must go to 5 (9 / 2 + 1). */
unsigned long int n = (abstheta * inv_PI_4) + 1; unsigned int n = (abstheta * inv_PI_4) + 1;
theta = abstheta - pio2_table[n / 2]; theta = abstheta - pio2_table[n / 2];
return reduced (theta, n, signbit); return reduced (theta, n, signbit);
} }
@ -177,8 +177,8 @@ SINF_FUNC (float x)
{ {
if (abstheta < 0x1p+23) /* |x| < 2^23. */ if (abstheta < 0x1p+23) /* |x| < 2^23. */
{ {
unsigned long int n = __floor (abstheta * inv_PI_4) + 1.0; unsigned int n = ((unsigned int) (abstheta * inv_PI_4)) + 1;
double x = __floor (n / 2.0); double x = n / 2;
theta = x * PI_2_lo + (x * PI_2_hi + abstheta); theta = x * PI_2_lo + (x * PI_2_hi + abstheta);
/* Argument reduction needed. */ /* Argument reduction needed. */
return reduced (theta, n, signbit); return reduced (theta, n, signbit);