summaryrefslogtreecommitdiff
path: root/src/math/j1.c
diff options
context:
space:
mode:
authorSzabolcs Nagy <nsz@port70.net>2013-05-15 23:08:52 +0000
committerSzabolcs Nagy <nsz@port70.net>2013-05-15 23:08:52 +0000
commite216951f509b71da193da2fc63e25b998740d58b (patch)
tree391381eafd8b0b7eb4fdbb693608072df5c181d5 /src/math/j1.c
parent2c184264eae3797de028403ed1e86c1f7ae5b813 (diff)
downloadmusl-e216951f509b71da193da2fc63e25b998740d58b.tar.gz
musl-e216951f509b71da193da2fc63e25b998740d58b.tar.bz2
musl-e216951f509b71da193da2fc63e25b998740d58b.tar.xz
musl-e216951f509b71da193da2fc63e25b998740d58b.zip
math: use double_t for temporaries to avoid stores on i386
When FLT_EVAL_METHOD!=0 (only i386 with x87 fp) the excess precision of an expression must be removed in an assignment. (gcc needs -fexcess-precision=standard or -std=c99 for this) This is done by extra load/store instructions which adds code bloat when lot of temporaries are used and it makes the result less precise in many cases. Using double_t and float_t avoids these issues on i386 and it makes no difference on other archs. For now only a few functions are modified where the excess precision is clearly beneficial (mostly polynomial evaluations with temporaries). object size differences on i386, gcc-4.8: old new __cosdf.o 123 95 __cos.o 199 169 __sindf.o 131 95 __sin.o 225 203 __tandf.o 207 151 __tan.o 605 499 erff.o 1470 1416 erf.o 1703 1649 j0f.o 1779 1745 j0.o 2308 2274 j1f.o 1602 1568 j1.o 2286 2252 tgamma.o 1431 1424 math/*.o 64164 63635
Diffstat (limited to 'src/math/j1.c')
-rw-r--r--src/math/j1.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/math/j1.c b/src/math/j1.c
index ac7bb1eb..df724d17 100644
--- a/src/math/j1.c
+++ b/src/math/j1.c
@@ -250,7 +250,7 @@ static const double ps2[5] = {
static double pone(double x)
{
const double *p,*q;
- double z,r,s;
+ double_t z,r,s;
uint32_t ix;
GET_HIGH_WORD(ix, x);
@@ -346,7 +346,7 @@ static const double qs2[6] = {
static double qone(double x)
{
const double *p,*q;
- double s,r,z;
+ double_t s,r,z;
uint32_t ix;
GET_HIGH_WORD(ix, x);