aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--sysdeps/ieee754/dbl-64/s_sin.c12
-rw-r--r--sysdeps/ieee754/dbl-64/s_sincos.c27
3 files changed, 27 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 1d223b3..a915653 100644
--- 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
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;
-
- /* 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