aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2017-12-05 15:27:03 -0200
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2017-12-05 16:27:44 -0200
commit94d80dfc7349b3545942fbbb1d5ff05f354afdf8 (patch)
tree07984816a08b1592f3a765cc211752fd2a7d3598
parent00d54af7c86cdcabc18c00619c229f49f4978610 (diff)
downloadglibc-94d80dfc7349b3545942fbbb1d5ff05f354afdf8.zip
glibc-94d80dfc7349b3545942fbbb1d5ff05f354afdf8.tar.gz
glibc-94d80dfc7349b3545942fbbb1d5ff05f354afdf8.tar.bz2
math: Use sign as double for reduced case in sinf
This patch avoid an extra floating point to integer conversion in reduced internal function for generic sinf by defining the sign as double instead of integers. There is no much difference on Haswell with GCC 7.2.1: Before After min 9.11 9.108 mean 21.982 21.9224 However H.J. Lu reported gains on Skylake: Before: "sinf": { "": { "duration": 3.4044e+10, "iterations": 1.9942e+09, "max": 141.106, "min": 7.704, "mean": 17.0715 } } After: "sinf": { "": { "duration": 3.40665e+10, "iterations": 2.03199e+09, "max": 95.994, "min": 7.704, "mean": 16.765 } } Checked on x86_64-linux-gnu. * sysdeps/ieee754/flt-32/s_sinf.c (ones): Define as double. (reduced): Use ones as double instead of integer.
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/ieee754/flt-32/s_sinf.c4
2 files changed, 7 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 15da4e7..bac6b8c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-12-05 Adhemerval Zanella <adhemerval.zanella@linaro.org>
+
+ * sysdeps/ieee754/flt-32/s_sinf.c (ones): Define as double.
+ (reduced): Use ones as double instead of integer.
+
2017-12-05 Szabolcs Nagy <szabolcs.nagy@arm.com>
* sysdeps/ieee754/flt-32/s_sinf.c (sinf): Use isless.
diff --git a/sysdeps/ieee754/flt-32/s_sinf.c b/sysdeps/ieee754/flt-32/s_sinf.c
index 8b98573..418d448 100644
--- a/sysdeps/ieee754/flt-32/s_sinf.c
+++ b/sysdeps/ieee754/flt-32/s_sinf.c
@@ -75,7 +75,7 @@ static const double invpio4_table[] = {
0x1.0e4107cp-169
};
-static const int ones[] = { +1, -1 };
+static const double ones[] = { 1.0, -1.0 };
/* Compute the sine value using Chebyshev polynomials where
THETA is the range reduced absolute value of the input
@@ -92,7 +92,7 @@ reduced (const double theta, const unsigned int n,
const double theta2 = theta * theta;
/* We are operating on |x|, so we need to add back the original
signbit for sinf. */
- int sign;
+ double sign;
/* Determine positive or negative primary interval. */
sign = ones[((n >> 2) & 1) ^ signbit];
/* Are we in the primary interval of sin or cos? */