math: use double_t for temporaries to avoid stores on i386
authorSzabolcs Nagy <nsz@port70.net>
Wed, 15 May 2013 23:08:52 +0000 (23:08 +0000)
committerSzabolcs Nagy <nsz@port70.net>
Wed, 15 May 2013 23:08:52 +0000 (23:08 +0000)
commite216951f509b71da193da2fc63e25b998740d58b
tree391381eafd8b0b7eb4fdbb693608072df5c181d5
parent2c184264eae3797de028403ed1e86c1f7ae5b813
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
21 files changed:
src/math/__cos.c
src/math/__cosdf.c
src/math/__log1p.h
src/math/__log1pf.h
src/math/__sin.c
src/math/__sindf.c
src/math/__tan.c
src/math/__tandf.c
src/math/acos.c
src/math/acosf.c
src/math/asin.c
src/math/asinf.c
src/math/atan.c
src/math/atanf.c
src/math/erf.c
src/math/erff.c
src/math/j0.c
src/math/j0f.c
src/math/j1.c
src/math/j1f.c
src/math/tgamma.c