Include s_sin.c in s_sincos.c
authorSiddhesh Poyarekar <siddhesh.poyarekar@linaro.org>
Tue, 17 Nov 2015 10:50:20 +0000 (16:20 +0530)
committerSiddhesh Poyarekar <siddhesh.poyarekar@linaro.org>
Tue, 17 Nov 2015 15:41:31 +0000 (21:11 +0530)
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
sysdeps/ieee754/dbl-64/s_sin.c
sysdeps/ieee754/dbl-64/s_sincos.c

index 1d223b3..a915653 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index b8d49e2..a635a86 100644 (file)
@@ -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];
index d7431b7..2a3fc06 100644 (file)
 
 #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;
-
-  /* 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