mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-10 19:30:10 +00:00
Include s_sin.c in s_sincos.c
Include the __sin and __cos functions as local static copies to allow deper optimization of the functions. This change shows an improvement of about 17% in the min case and 12.5% in the mean case for the sincos microbenchmark on x86_64. * sysdeps/ieee754/dbl-64/s_sin.c (__sin)[IN_SINCOS]: Mark function static and don't set or restore rounding. (__cos)[IN_SINCOS]: Likewise. * sysdeps/ieee754/dbl-64/s_sincos.c: Include s_sin.c. (__sincos): Set and restore rounding mode. Remove check for infinite or NaN input.
This commit is contained in:
parent
b7665e5163
commit
463ac90dab
@ -1,5 +1,12 @@
|
||||
2015-11-17 Siddhesh Poyarekar <siddhesh.poyarekar@linaro.org>
|
||||
|
||||
* sysdeps/ieee754/dbl-64/s_sin.c (__sin)[IN_SINCOS]: Mark function
|
||||
static and don't set or restore rounding.
|
||||
(__cos)[IN_SINCOS]: Likewise.
|
||||
* sysdeps/ieee754/dbl-64/s_sincos.c: Include s_sin.c.
|
||||
(__sincos): Set and restore rounding mode. Remove check for infinite
|
||||
or NaN input.
|
||||
|
||||
* sysdeps/ieee754/dbl-64/s_sin.c: Remove redundant else clauses.
|
||||
|
||||
* benchtests/scripts/bench.py (_print_arg_data): Mark output variables
|
||||
|
@ -280,8 +280,12 @@ reduce_and_compute (double x, unsigned int k)
|
||||
/* An ultimate sin routine. Given an IEEE double machine number x */
|
||||
/* it computes the correctly rounded (to nearest) value of sin(x) */
|
||||
/*******************************************************************/
|
||||
#ifdef IN_SINCOS
|
||||
static double
|
||||
#else
|
||||
double
|
||||
SECTION
|
||||
#endif
|
||||
__sin (double x)
|
||||
{
|
||||
double xx, res, t, cor, y, s, c, sn, ssn, cs, ccs, xn, a, da, db, eps, xn1,
|
||||
@ -290,7 +294,9 @@ __sin (double x)
|
||||
int4 k, m, n;
|
||||
double retval = 0;
|
||||
|
||||
#ifndef IN_SINCOS
|
||||
SET_RESTORE_ROUND_53BIT (FE_TONEAREST);
|
||||
#endif
|
||||
|
||||
u.x = x;
|
||||
m = u.i[HIGH_HALF];
|
||||
@ -512,8 +518,12 @@ __sin (double x)
|
||||
/* it computes the correctly rounded (to nearest) value of cos(x) */
|
||||
/*******************************************************************/
|
||||
|
||||
#ifdef IN_SINCOS
|
||||
static double
|
||||
#else
|
||||
double
|
||||
SECTION
|
||||
#endif
|
||||
__cos (double x)
|
||||
{
|
||||
double y, xx, res, t, cor, xn, a, da, db, eps, xn1,
|
||||
@ -523,7 +533,9 @@ __cos (double x)
|
||||
|
||||
double retval = 0;
|
||||
|
||||
#ifndef IN_SINCOS
|
||||
SET_RESTORE_ROUND_53BIT (FE_TONEAREST);
|
||||
#endif
|
||||
|
||||
u.x = x;
|
||||
m = u.i[HIGH_HALF];
|
||||
|
@ -22,29 +22,18 @@
|
||||
|
||||
#include <math_private.h>
|
||||
|
||||
#define __sin __sin_local
|
||||
#define __cos __cos_local
|
||||
#define IN_SINCOS 1
|
||||
#include "s_sin.c"
|
||||
|
||||
void
|
||||
__sincos (double x, double *sinx, double *cosx)
|
||||
{
|
||||
int32_t ix;
|
||||
SET_RESTORE_ROUND_53BIT (FE_TONEAREST);
|
||||
|
||||
/* High word of x. */
|
||||
GET_HIGH_WORD (ix, x);
|
||||
|
||||
/* |x| ~< pi/4 */
|
||||
ix &= 0x7fffffff;
|
||||
if (ix >= 0x7ff00000)
|
||||
{
|
||||
/* sin(Inf or NaN) is NaN */
|
||||
*sinx = *cosx = x - x;
|
||||
if (isinf (x))
|
||||
__set_errno (EDOM);
|
||||
}
|
||||
else
|
||||
{
|
||||
*sinx = __sin (x);
|
||||
*cosx = __cos (x);
|
||||
}
|
||||
*sinx = __sin (x);
|
||||
*cosx = __cos (x);
|
||||
}
|
||||
weak_alias (__sincos, sincos)
|
||||
#ifdef NO_LONG_DOUBLE
|
||||
|
Loading…
Reference in New Issue
Block a user