libc/newlib/libm/math
Szabolcs Nagy c156098271 New expf, exp2f, logf, log2f and powf implementations
Based on code from https://github.com/ARM-software/optimized-routines/

This patch adds a highly optimized generic implementation of expf,
exp2f, logf, log2f and powf.  The new functions are not only
faster (6x for powf!), but are also smaller and more accurate.
In order to achieve this, the algorithm uses double precision
arithmetic for accuracy, avoids divisions and uses small table
lookups to minimize the polynomials.  Special cases are handled
inline to avoid the unnecessary overhead of wrapper functions and
set errno to POSIX requirements.

The new functions are added under newlib/libm/common, but the old
implementations are kept (in newlib/libm/math) for non-IEEE or
pre-C99 systems.  Targets can enable the new math code by defining
__OBSOLETE_MATH_DEFAULT to 0 in newlib/libc/include/machine/ieeefp.h,
users can override the default by defining __OBSOLETE_MATH.
Currently the new code is enabled for AArch64 and AArch32 with VFP.
Targets with a single precision FPU may still prefer the old
implementation.

libm.a size changes:
arm: -1692
arm/thumb/v7-a/nofp: -878
arm/thumb/v7-a+fp/hard: -864
arm/thumb/v7-a+fp/softfp: -908
aarch64: -1476
2017-10-13 10:58:00 +02:00
..
Makefile.am New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
Makefile.in New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
e_acos.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
e_acosh.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
e_asin.c 2000-05-26 Marek Michalkiewicz <marekm@linux.org.pl> 2000-05-26 22:42:39 +00:00
e_atan2.c Throughout, run newlib with -Wall -Werror option and fix bugs and 2012-08-08 11:04:18 +00:00
e_atanh.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
e_cosh.c 2000-08-23 Werner Almesberger <Werner.Almesberger@epfl.ch> 2000-08-28 17:45:56 +00:00
e_exp.c Throughout, run newlib with -Wall -Werror option and fix bugs and 2012-08-08 11:04:18 +00:00
e_fmod.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
e_hypot.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
e_j0.c 2000-05-26 Marek Michalkiewicz <marekm@linux.org.pl> 2000-05-26 22:42:39 +00:00
e_j1.c 2000-05-26 Marek Michalkiewicz <marekm@linux.org.pl> 2000-05-26 22:42:39 +00:00
e_jn.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
e_log.c 2000-05-26 Marek Michalkiewicz <marekm@linux.org.pl> 2000-05-26 22:42:39 +00:00
e_log10.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
e_pow.c Throughout, run newlib with -Wall -Werror option and fix bugs and 2012-08-08 11:04:18 +00:00
e_rem_pio2.c Throughout, run newlib with -Wall -Werror option and fix bugs and 2012-08-08 11:04:18 +00:00
e_remainder.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
e_scalb.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
e_sinh.c 2000-08-23 Werner Almesberger <Werner.Almesberger@epfl.ch> 2000-08-28 17:45:56 +00:00
e_sqrt.c Avoid unneeded truncation to "int" 2015-05-27 13:30:20 +02:00
ef_acos.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
ef_acosh.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
ef_asin.c 2001-04-17 Stephen L. Moshier <moshier@moshier.ne.mediaone.net> 2001-04-17 17:13:00 +00:00
ef_atan2.c 2005-07-20 Bob Wilson <bob.wilson@acm.org> 2005-07-20 16:20:24 +00:00
ef_atanh.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
ef_cosh.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
ef_exp.c New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
ef_fmod.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
ef_hypot.c 2005-08-02 Bob Wilson <bob.wilson@acm.org> 2005-08-02 19:44:44 +00:00
ef_j0.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
ef_j1.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
ef_jn.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
ef_log.c New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
ef_log10.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
ef_pow.c New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
ef_rem_pio2.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
ef_remainder.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
ef_scalb.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
ef_sinh.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
ef_sqrt.c * libm/math/ef_sqrt.c: Delete unused variable sign. 2010-03-05 08:55:16 +00:00
el_hypot.c * libc/include/complex.h (cabsl): Add prototype. 2015-02-06 16:14:04 +00:00
er_gamma.c * libm/common/s_fdim.c: New file. 2002-06-07 21:59:57 +00:00
er_lgamma.c Throughout, run newlib with -Wall -Werror option and fix bugs and 2012-08-08 11:04:18 +00:00
erf_gamma.c * libm/common/s_fdim.c: New file. 2002-06-07 21:59:57 +00:00
erf_lgamma.c Throughout, run newlib with -Wall -Werror option and fix bugs and 2012-08-08 11:04:18 +00:00
k_cos.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
k_rem_pio2.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
k_sin.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
k_standard.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
k_tan.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
kf_cos.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
kf_rem_pio2.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
kf_sin.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
kf_tan.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
math.tex Use makedoc output files which are generated but aren't included 2015-06-24 12:23:55 +01:00
s_asinh.c 2003-10-20 Bob Wilson <bob.wilson@acm.org> 2003-10-20 18:46:38 +00:00
s_atan.c 2003-10-20 Bob Wilson <bob.wilson@acm.org> 2003-10-20 18:46:38 +00:00
s_ceil.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
s_cos.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
s_erf.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
s_fabs.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
s_floor.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
s_frexp.c 2003-10-20 Bob Wilson <bob.wilson@acm.org> 2003-10-20 18:46:38 +00:00
s_ldexp.c 2005-10-28 Bob Wilson <bob.wilson@acm.org> 2005-10-28 21:21:08 +00:00
s_signif.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
s_sin.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
s_tan.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
s_tanh.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
sf_asinh.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
sf_atan.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
sf_ceil.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
sf_cos.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
sf_erf.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
sf_fabs.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
sf_floor.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
sf_frexp.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
sf_ldexp.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
sf_signif.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
sf_sin.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
sf_tan.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
sf_tanh.c * libc/include/machine/ieeefp.h: Comment about new configuration 2001-04-04 13:33:01 +00:00
w_acos.c doc: Fix some inconsistent QUICKREF lines 2015-11-12 12:42:17 +00:00
w_acosh.c doc: Fix some inconsistent QUICKREF lines 2015-11-12 12:42:17 +00:00
w_asin.c doc: Fix some inconsistent QUICKREF lines 2015-11-12 12:42:17 +00:00
w_atan2.c 2007-05-17 Cary R. <cygcary <at> yahoo.com> 2007-05-17 21:52:11 +00:00
w_atanh.c 2003-10-20 Bob Wilson <bob.wilson@acm.org> 2003-10-20 18:46:38 +00:00
w_cosh.c Add missing semicolons to prototypes. 2015-11-02 16:34:49 -05:00
w_drem.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
w_exp.c 2003-10-20 Bob Wilson <bob.wilson@acm.org> 2003-10-20 18:46:38 +00:00
w_exp2.c Consistently use an em-dash in math functions. 2015-11-02 16:43:22 -05:00
w_fmod.c Add missing semicolons to prototypes. 2015-11-02 16:34:49 -05:00
w_gamma.c Consistently use an em-dash in math functions. 2015-11-02 16:43:22 -05:00
w_hypot.c 2003-10-20 Bob Wilson <bob.wilson@acm.org> 2003-10-20 18:46:38 +00:00
w_j0.c 2005-10-28 Bob Wilson <bob.wilson@acm.org> 2005-10-28 21:21:08 +00:00
w_j1.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
w_jn.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
w_lgamma.c * implement a new `struct _reent' that is significantly smaller. use this 2002-02-03 09:24:18 +00:00
w_log.c 2007-10-17 Jeff Johnston <jjohnstn@redhat.com> 2007-10-18 00:03:32 +00:00
w_log10.c 2007-10-17 Jeff Johnston <jjohnstn@redhat.com> 2007-10-18 00:03:32 +00:00
w_pow.c 2007-05-01 Cary R. <cygcary <at> yahoo.com> 2007-05-01 18:42:15 +00:00
w_remainder.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
w_scalb.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
w_sincos.c * libc/sys/linux/cmath: New directory. 2002-08-16 21:29:45 +00:00
w_sinh.c 2003-10-20 Bob Wilson <bob.wilson@acm.org> 2003-10-20 18:46:38 +00:00
w_sqrt.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
w_tgamma.c 2011-01-12 Ralf Corsépius <ralf.corsepius@rtems.org> 2011-01-12 22:25:15 +00:00
wf_acos.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_acosh.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_asin.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_atan2.c 2007-05-17 Cary R. <cygcary <at> yahoo.com> 2007-05-17 21:52:11 +00:00
wf_atanh.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_cosh.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_drem.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
wf_exp.c New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
wf_exp2.c New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
wf_fmod.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_gamma.c * implement a new `struct _reent' that is significantly smaller. use this 2002-02-03 09:24:18 +00:00
wf_hypot.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
wf_j0.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_j1.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_jn.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_lgamma.c * implement a new `struct _reent' that is significantly smaller. use this 2002-02-03 09:24:18 +00:00
wf_log.c New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
wf_log2.c New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
wf_log10.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_pow.c New expf, exp2f, logf, log2f and powf implementations 2017-10-13 10:58:00 +02:00
wf_remainder.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_scalb.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_sincos.c * libc/sys/linux/cmath: New directory. 2002-08-16 21:29:45 +00:00
wf_sinh.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
wf_sqrt.c 2009-07-09 Craig Howland <howland@LGSInnovations.com> 2009-07-09 17:04:56 +00:00
wf_tgamma.c 2011-01-12 Ralf Corsépius <ralf.corsepius@rtems.org> 2011-01-12 22:25:15 +00:00
wr_gamma.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
wr_lgamma.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
wrf_gamma.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00
wrf_lgamma.c import newlib-2000-02-17 snapshot 2000-02-17 19:39:52 +00:00