From e216951f509b71da193da2fc63e25b998740d58b Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Wed, 15 May 2013 23:08:52 +0000 Subject: 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 --- src/math/__tan.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/math/__tan.c') 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 */ -- cgit v1.2.1