about summary refs log tree commit diff
path: root/src/math/__tan.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/__tan.c
parent2c184264eae3797de028403ed1e86c1f7ae5b813 (diff)
downloadmusl-e216951f509b71da193da2fc63e25b998740d58b.tar.gz
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/__tan.c')
-rw-r--r--src/math/__tan.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/math/__tan.c b/src/math/__tan.c
index 01e3fe48..fc739f95 100644
--- a/src/math/__tan.c
+++ b/src/math/__tan.c
@@ -65,7 +65,7 @@ pio4lo =     3.06161699786838301793e-17; /* 3C81A626, 33145C07 */
 
 double __tan(double x, double y, int iy)
 {
-	double z, r, v, w, s, sign;
+	double_t z, r, v, w, s, sign;
 	int32_t ix, hx;
 
 	GET_HIGH_WORD(hx,x);
@@ -106,7 +106,8 @@ double __tan(double x, double y, int iy)
 		 * -1.0 / (x+r) here
 		 */
 		/* compute -1.0 / (x+r) accurately */
-		double a, t;
+		double_t a;
+		double z, t;
 		z = w;
 		SET_LOW_WORD(z,0);
 		v = r - (z - x);        /* z+v = r+x */