glibc/sysdeps
Szabolcs Nagy 424c4f60ed Add new pow implementation
The algorithm is exp(y * log(x)), where log(x) is computed with about
1.3*2^-68 relative error (1.5*2^-68 without fma), returning the result
in two doubles, and the exp part uses the same algorithm (and lookup
tables) as exp, but takes the input as two doubles and a sign (to handle
negative bases with odd integer exponent).  The __exp1 internal symbol
is no longer necessary.

There is separate code path when fma is not available but the worst case
error is about 0.54 ULP in both cases.  The lookup table and consts for
log are 4168 bytes.  The .rodata+.text is decreased by 37908 bytes on
aarch64.  The non-nearest rounding error is less than 1 ULP.

Improvements on Cortex-A72 compared to current glibc master:
pow thruput: 2.40x in [0.01 11.1]x[0.01 11.1]
pow latency: 1.84x in [0.01 11.1]x[0.01 11.1]

Tested on
aarch64-linux-gnu (defined __FP_FAST_FMA, TOINT_INTRINSICS) and
arm-linux-gnueabihf (!defined __FP_FAST_FMA, !TOINT_INTRINSICS) and
x86_64-linux-gnu (!defined __FP_FAST_FMA, !TOINT_INTRINSICS) and
powerpc64le-linux-gnu (defined __FP_FAST_FMA, !TOINT_INTRINSICS) targets.

	* NEWS: Mention pow improvements.
	* math/Makefile (type-double-routines): Add e_pow_log_data.
	* sysdeps/generic/math_private.h (__exp1): Remove.
	* sysdeps/i386/fpu/e_pow_log_data.c: New file.
	* sysdeps/ia64/fpu/e_pow_log_data.c: New file.
	* sysdeps/ieee754/dbl-64/Makefile (CFLAGS-e_pow.c): Allow fma
	contraction.
	* sysdeps/ieee754/dbl-64/e_exp.c (__exp1): Remove.
	(exp_inline): Remove.
	(__ieee754_exp): Only single double input is handled.
	* sysdeps/ieee754/dbl-64/e_pow.c: Rewrite.
	* sysdeps/ieee754/dbl-64/e_pow_log_data.c: New file.
	* sysdeps/ieee754/dbl-64/math_config.h (issignaling_inline): Define.
	(__pow_log_data): Define.
	* sysdeps/ieee754/dbl-64/upow.h: Remove.
	* sysdeps/ieee754/dbl-64/upow.tbl: Remove.
	* sysdeps/m68k/m680x0/fpu/e_pow_log_data.c: New file.
	* sysdeps/x86_64/fpu/multiarch/Makefile (CFLAGS-e_pow-fma.c): Allow fma
	contraction.
	(CFLAGS-e_pow-fma4.c): Likewise.
2018-09-19 10:04:51 +01:00
..
aarch64 Use ceil functions not __ceil functions in glibc libm. 2018-09-17 20:42:06 +00:00
alpha Use rint functions not __rint functions in glibc libm. 2018-09-14 13:10:39 +00:00
arm Add new exp and exp2 implementations 2018-09-05 16:22:00 +01:00
generic Add new pow implementation 2018-09-19 10:04:51 +01:00
gnu Update netinet/udp.h from Linux 4.18. 2018-08-27 13:43:05 +00:00
hppa
htl
hurd
i386 Add new pow implementation 2018-09-19 10:04:51 +01:00
ia64 Add new pow implementation 2018-09-19 10:04:51 +01:00
ieee754 Add new pow implementation 2018-09-19 10:04:51 +01:00
init_array
m68k Add new pow implementation 2018-09-19 10:04:51 +01:00
mach
microblaze
mips Split fenv_private.h out of math_private.h more consistently. 2018-08-28 20:48:49 +00:00
nios2 Move EXCEPTION_TESTS_* out of math-tests.h 2018-08-23 23:41:13 +00:00
nptl [BZ #20271] Add newlines in __libc_fatal calls. 2018-08-31 18:04:32 -07:00
posix
powerpc Use ceil functions not __ceil functions in glibc libm. 2018-09-17 20:42:06 +00:00
pthread
riscv Use ceil functions not __ceil functions in glibc libm. 2018-09-17 20:42:06 +00:00
s390 S390: Regenerate ULPs. 2018-09-06 14:29:01 +02:00
sh
sparc Use ceil functions not __ceil functions in glibc libm. 2018-09-17 20:42:06 +00:00
unix Unify many bits/mman.h headers. 2018-09-18 16:12:56 +00:00
wordsize-32
wordsize-64
x86 Split fenv_private.h out of math_private.h more consistently. 2018-08-28 20:48:49 +00:00
x86_64 Add new pow implementation 2018-09-19 10:04:51 +01:00