From 463ac90dab7b90ba6089c1cadd980b6185d3cceb Mon Sep 17 00:00:00 2001 From: Siddhesh Poyarekar Date: Tue, 17 Nov 2015 16:20:20 +0530 Subject: [PATCH] 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. --- ChangeLog | 7 +++++++ sysdeps/ieee754/dbl-64/s_sin.c | 12 ++++++++++++ sysdeps/ieee754/dbl-64/s_sincos.c | 27 ++++++++------------------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1d223b3dc9..a915653ac5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2015-11-17 Siddhesh Poyarekar + * 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 diff --git a/sysdeps/ieee754/dbl-64/s_sin.c b/sysdeps/ieee754/dbl-64/s_sin.c index b8d49e2507..a635a86933 100644 --- a/sysdeps/ieee754/dbl-64/s_sin.c +++ b/sysdeps/ieee754/dbl-64/s_sin.c @@ -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]; diff --git a/sysdeps/ieee754/dbl-64/s_sincos.c b/sysdeps/ieee754/dbl-64/s_sincos.c index d7431b7144..2a3fc06386 100644 --- a/sysdeps/ieee754/dbl-64/s_sincos.c +++ b/sysdeps/ieee754/dbl-64/s_sincos.c @@ -22,29 +22,18 @@ #include +#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; - - /* 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); - } + SET_RESTORE_ROUND_53BIT (FE_TONEAREST); + + *sinx = __sin (x); + *cosx = __cos (x); } weak_alias (__sincos, sincos) #ifdef NO_LONG_DOUBLE -- 2.43.5