diff mbox

Include s_sin.c in s_sincos.c

Message ID 20151117111557.GA27201@linaro-laptop.intra.reserved-bit.com
State New
Headers show

Commit Message

Siddhesh Poyarekar Nov. 17, 2015, 11:15 a.m. UTC
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.

Siddhesh

	* 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    | 12 ++++++++++++
 sysdeps/ieee754/dbl-64/s_sincos.c | 25 +++++++------------------
 2 files changed, 19 insertions(+), 18 deletions(-)

Comments

Joseph Myers Nov. 17, 2015, 2:59 p.m. UTC | #1
On Tue, 17 Nov 2015, Siddhesh Poyarekar wrote:

> 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.

OK.  I imagine there should be more optimization scope from sharing the 
range reduction between sin and cos, though that might be harder given how 
the code is structured.
Siddhesh Poyarekar Nov. 17, 2015, 3:37 p.m. UTC | #2
On Tuesday 17 November 2015 08:29 PM, Joseph Myers wrote:
> OK.  I imagine there should be more optimization scope from sharing the 
> range reduction between sin and cos, though that might be harder given how 
> the code is structured.

Yeah, I tried consolidating some of the overlapping ranges by hand, but
did not get any interesting results.  The compiler seems to do a better
job without any help.

Siddhesh
diff mbox

Patch

diff --git a/sysdeps/ieee754/dbl-64/s_sin.c b/sysdeps/ieee754/dbl-64/s_sin.c
index b8d49e2..a635a86 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 d7431b7..2a3fc06 100644
--- a/sysdeps/ieee754/dbl-64/s_sincos.c
+++ b/sysdeps/ieee754/dbl-64/s_sincos.c
@@ -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