about summary refs log tree commit diff
path: root/ChangeLog
Commit message (Collapse)AuthorAgeFilesLines
* Cleanup a few cases where isinf is used to get the signbit to improve the ↵Wilco Dijkstra2015-09-181-0/+10
| | | | | | | | | | | | | | readability and maintainability and allow inlining. 2015-09-18 Wilco Dijkstra <wdijkstr@arm.com> * math/w_tgamma.c (__ieee754_gamma_r): Use explicit sign check. * math/w_tgammaf.c (__ieee754_gammaf_r): Likewise. * math/w_tgammal.c (__ieee754_gammal_r): Likewise. * stdio-common/printf_fp.c (___printf_fp): Use signbit to get the sign. Use isinf macro to allow inlining. * stdio-common/printf_fphex.c (__printf_fphex): Likewise. * stdio-common/printf_size.c (__printf_size): Likewise.
* timezone: fix parallel check failuresMike Frysinger2015-09-181-0/+4
| | | | | | | | | | | | | | | | | The XT testdata install rules expect the testdata dir to already exist in the build tree, but it doesn't actually create it. Instead, it relies on the build-testdata define happening to be executed before it (which runs zic which creates the dir). When we run in parallel though, it's easy to hit a failure: $ cd timezone $ rm -rf $objdir/timezone/testdata $ make check -j ... cp testdata/XT1 .../timezone/testdata/XT1 cp: cannot create regular file '.../timezone/testdata/XT1': No such file or directory Makefile:116: recipe for target '.../timezone/testdata/XT1' failed make: *** [.../timezone/testdata/XT1] Error 1 make: *** Waiting for unfinished jobs....
* Avoid excess range overflowing results from cosh, sinh, lgamma (bug 18980).Joseph Myers2015-09-181-0/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Various i386 libm functions return values with excess range and precision; Wilco Dijkstra's patches to make isfinite etc. expand inline cause this pre-existing issue to result in test failures (when e.g. a result that overflows float but not long double gets counted as overflowing for some purposes but not others). This patch addresses those cases arising from functions defined in C, adding a math_narrow_eval macro that forces values to memory to eliminate excess precision if FLT_EVAL_METHOD indicates this is needed, and is a no-op otherwise. I'll convert existing uses of volatile and asm for this purpose to use the new macro later, once i386 has clean test results again (which requires fixes for .S files as well). Tested for x86_64 and x86. Committed. [BZ #18980] * sysdeps/generic/math_private.h: Include <float.h>. (math_narrow_eval): New macro. [FLT_EVAL_METHOD != 0] (excess_precision): Likewise. * sysdeps/ieee754/dbl-64/e_cosh.c (__ieee754_cosh): Use math_narrow_eval on overflowing return value. * sysdeps/ieee754/dbl-64/e_lgamma_r.c (__ieee754_lgamma_r): Likewise. * sysdeps/ieee754/dbl-64/e_sinh.c (__ieee754_sinh): Likewise. * sysdeps/ieee754/flt-32/e_coshf.c (__ieee754_coshf): Likewise. * sysdeps/ieee754/flt-32/e_lgammaf_r.c (__ieee754_lgammaf_r): Likewise. * sysdeps/ieee754/flt-32/e_sinhf.c (__ieee754_sinhf): Likewise.
* Since we now inline isinf, isnan and isfinite in math.h, replace uses of ↵Wilco Dijkstra2015-09-181-0/+50
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | __isinf_ns(l/f) with isinf, and remove the unused inlines __isinf_ns(l/f), __isnan(f) and __finite(f). 2015-09-18 Wilco Dijkstra <wdijkstr@arm.com> * include/math.h: Remove __isinf_ns, __isinf_nsf, __isinf_nsl. * math/Makefile: Remove isinf_ns.c. * math/divtc3.c (__divtc3): Replace __isinf_nsl with isinf. * math/multc3.c (__multc3): Likewise. * math/s_casin.c (__casin): Likewise. * math/s_casinf.c (__casinf): Likewise. * math/s_casinl.c (__casinl): Likewise. * math/s_cproj.c (__cproj): Likewise. * math/s_cprojf.c (__cprojf): Likewise. * math/s_cprojl.c (__cprofl): Likewise. * math/s_ctan.c (__ctan): Likewise. * math/s_ctanf.c (__ctanf): Likewise. * math/s_ctanh.c (__ctanh): Likewise. * math/s_ctanhf.c (__ctanhf): Likewise. * math/s_ctanhl.c (__ctanhl): Likewise. * math/s_ctanl.c (__ctanl): Likewise. * math/w_fmod.c (__fmod): Likewise. * math/w_fmodf.c (__fmodf): Likewise. * math/w_fmodl.c (_fmodl): Likewise. * math/w_remainder.c (__remainder): Likewise. * math/w_remainderf.c (__remainderf): Likewise. * math/w_remainderl.c (__remainderl): Likewise. * math/w_scalb.c (__scalb): Likewise. * math/w_scalbf.c (__scalbf): Likewise. * math/w_scalbl.c (__scalbl): Likewise. * sysdeps/ieee754/dbl-64/s_isinf_ns.c: Deleted file. * sysdeps/ieee754/dbl-64/s_sincos.c (__sincos): Replace __isinf_ns with isinf. * sysdeps/ieee754/dbl-64/wordsize-64/math_private.h: Deleted file. * sysdeps/ieee754/dbl-64/wordsize-64/s_isinf_ns.c: Deleted file. * sysdeps/ieee754/flt-32/e_exp2f.c (__ieee754_exp2f): Replace __isinf_nsf with isinf. * sysdeps/ieee754/flt-32/math_private.h: Deleted file. * sysdeps/ieee754/flt-32/s_isinf_nsf.c: Deleted file. * sysdeps/ieee754/ldbl-128/s_isinf_nsl.c: Deleted file. * sysdeps/ieee754/ldbl-128/s_sincosl.c (__sincosl): Replace __isinf_nsl with isinf. * sysdeps/ieee754/ldbl-128ibm/s_cprojl.c(__cprojll): Replace __isinf_nsl with isinf. * sysdeps/ieee754/ldbl-128ibm/s_ctanl.c(__ctanl): Replace __isinf_nsl with isinf. * sysdeps/ieee754/ldbl-128ibm/s_isinf_nsl.c: Deleted file. * sysdeps/ieee754/ldbl-128ibm/s_sincosl.c (__sincosl): Replace __isinf_nsl with isinf. * sysdeps/ieee754/ldbl-96/s_isinf_nsl.c: Deleted file. * sysdeps/ieee754/ldbl-96/s_sincosl.c (__sincosl): Replace __isinf_nsl with isinf.
* Fix several build failures with GCC6 due to unused static variables.Wilco Dijkstra2015-09-181-0/+15
| | | | | | | | | | | | | | | | | 2015-09-18 Wilco Dijkstra <wdijkstr@arm.com> * resolv/base64.c (rcsid): Remove unused static. * sysdeps/ieee754/dbl-64/atnat2.h (qpi1): Remove unused static. (tqpi1): Likewise. * sysdeps/ieee754/dbl-64/uexp.h (one): Likewise. * sysdeps/ieee754/dbl-64/upow.h (sqrt_2): Likewise. * sysdeps/ieee754/flt-32/e_log10f.c (one): Likewise. * sysdeps/ieee754/flt-32/s_cosf.c (one): Likewise. * sysdeps/ieee754/ldbl-128/e_lgammal_r.c (zero): Likewise. * sysdeps/ieee754/ldbl-128/s_erfl.c (half): Likewise. * sysdeps/ieee754/ldbl-128/s_log1pl.c (maxlog): Likewise. * timezone/private.h (time_t_min): Likewise. (time_t_max): Likewise.
* Use __libc_ptf_call in _longjmp_unwindH.J. Lu2015-09-181-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Use __libc_ptf_call in _longjmp_unwind to avoid duplicated logic. On x86-64, I got jmp-unwind.os: _longjmp_unwind: movl __libc_pthread_functions_init(%rip), %eax testl %eax, %eax jne .L4 rep ret .L4: movq 304+__libc_pthread_functions(%rip), %rax movq %rsp, %rsi ror $2*8+1, %rax xor %fs:48, %rax jmp *%rax jmp-unwind.o: _longjmp_unwind: movl $__pthread_cleanup_upto, %eax testq %rax, %rax je .L1 movq %rsp, %rsi jmp __pthread_cleanup_upto .L1: rep ret * sysdeps/nptl/jmp-unwind.c: Include <libc-lock.h> instead of <nptl/pthreadP.h>. (_longjmp_unwind): Use __libc_ptf_call. * sysdeps/unix/sysv/linux/s390/jmp-unwind.c: Likewise.
* arm: setjmp/longjmp: fix PIC vs SHARED thinkosDavid Lamparter2015-09-181-0/+5
| | | | | | | | | | The logic in setjmp/__longjmp incorrectly uses "PIC" to figure out whether the code is going into a shared library when it should be using "SHARED". If you build glibc with a gcc version that has PIE enabled by default, then the code will try to use symbols that are only in the shared library. URL: https://bugs.gentoo.org/336914
* Use the GCC builtin functions for the non-inlined signbit implementations.Wilco Dijkstra2015-09-181-0/+11
| | | | | | | | | | | | | 2015-09-18 Wilco Dijkstra <wdijkstr@arm.com> * sysdeps/ieee754/dbl-64/s_signbit.c (__signbit): Use __builtin_signbit. * sysdeps/ieee754/flt-32/s_signbitf.c (__signbitf): Use __builtin_signbitf. * sysdeps/ieee754/ldbl-128/s_signbitl.c (__signbitl): Use __builtin_signbitl. * sysdeps/ieee754/ldbl-128ibm/s_signbitl.c (___signbitl): Likewise. * sysdeps/ieee754/ldbl-96/s_signbitl.c (__signbitl): Likewise.
* Add inlining of the C99 math functions ↵Wilco Dijkstra2015-09-181-0/+12
| | | | | | | | | | | | | | | | | | | | | isinf/isnan/signbit/isfinite/isnormal/fpclassify using GCC built-ins when available. Since going through the PLT is expensive for these small functions, inlining results in major speedups (about 7x on Cortex-A57 for isinf). The GCC built-ins are not correct if signalling NaN support is required, and thus are turned off in that case (see GCC bug 66462). The test-snan.c tests sNaNs and so must be explicitly built with -fsignaling-nans. 2015-09-18 Wilco Dijkstra <wdijkstr@arm.com> [BZ #15367] [BZ #17441] * math/Makefile: Build test-snan.c with -fsignaling-nans. * math/math.h (fpclassify): Use __builtin_fpclassify when available. (signbit): Use __builtin_signbit(f/l). (isfinite): Use__builtin_isfinite. (isnormal): Use __builtin_isnormal. (isnan): Use __builtin_isnan. (isinf): Use __builtin_isinf_sign.
* Add a new benchmark for isinf/isnan/isnormal/isfinite/fpclassify. The test ↵Wilco Dijkstra2015-09-181-0/+8
| | | | | | | | | | | | | uses 2 arrays with 1024 doubles, one with 99% finite FP numbers (10% zeroes, 10% negative) and 1% inf/NaN, the other with 50% inf, and 50% Nan. ChangeLog: 2015-09-18 Wilco Dijkstra <wdijkstr@arm.com> * benchtests/Makefile: Add bench-math-inlines, link with libm. * benchtests/bench-math-inlines.c: New benchmark. * benchtests/bench-util.h: New file. * benchtests/bench-util.c: New file. * benchtests/bench-skeleton.c: Add include of bench-util.c/h.
* Fix error messages in elf/tst-dlmopen1.c.Carlos O'Donell2015-09-181-0/+3
| | | | | | | The test error messages incorrectly reference LIBC_SO when they should reference the dlmopen'd library tst-dlmopen1mod.so. Define TEST_SO and use it in all the error messages.
* Use ALIGN_* macros in _dl_map_object_from_fd.Carlos O'Donell2015-09-181-0/+5
| | | | | | | | | Cleanup _dl_map_object_from_fd to make it clear exactly what we're doing with the mappings i.e. extending the the start of the map down to a page boundary, extending the end of the map up to a page boundary, and offset itself also to page boundary. The result is much easier to read as expected from the ALIGN_* cleanups.
* time: in strptime(), make %z accept [+-]HH:MM tz [BZ #17887]Vincent Bernat2015-09-181-0/+6
| | | | | | In ISO 8601, +03:30 is a valid time zone. Currently, strptime() only parses it as a 2-digit time zone an believes this is +03:00. This change makes it accept a single colon.
* time: in strptime(), make %z accept Z as a time zone [BZ #17886]Vincent Bernat2015-09-181-0/+6
| | | | | | In ISO 8601, the timezone can be 'Z' instead of using digits. 2014-08-17T12:33:12+0000 is often expressed as 2014-08-17T12:33:12Z.
* alpha: drop __ASSUME_FDATASYNCMike Frysinger2015-09-171-0/+7
| | | | | | Since we require a new enough kernel all the time, the __ASSUME_FDATASYNC define has been hardcoded to 1. That means we can delete the alpha file for fdatasync now and rely on the syscalls list like other ports.
* Test for weak undefined symbols in linknamespace.pl.Joseph Myers2015-09-181-0/+7
| | | | | | | | | | | | | | | This patch makes linknamespace.pl require weak undefined symbols to be within the standard namespace. (It remains the case that linknamespace.pl does not look for definitions of such symbols or require symbols used in those definitions to be within the standard namespace.) Tested for x86_64 and x86. * conform/linknamespace.pl: Require weak undefined symbols to be in the standard namespace. (%strong_syms): Rename to %seen_syms. (%strong_seen): Rename to %seen_where.
* Use __pthread_setcancelstate in libc.aH.J. Lu2015-09-171-0/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | This patch references __pthread_setcancelstate instead of pthread_setcancelstate in libc.a. [BZ #18970] * misc/error.c (error): Replace pthread_setcancelstate with __pthread_setcancelstate. (error_at_line): Likewise. * posix/wordexp.c (parse_comm): Likewise. * stdlib/fmtmsg.c (fmtmsg): Likewise. * nptl/forward.c (pthread_setcancelstate): Renamed to ... (__pthread_setcancelstate): This. (pthread_setcancelstate): Add an alias. * nptl/nptl-init.c (pthread_functions): Replace ptr_pthread_setcancelstate with ptr___pthread_setcancelstate. * sysdeps/nptl/pthread-functions.h (pthread_functions): Likewise. * nptl/pthreadP.h (__pthread_setcancelstate): Mark it with hidden_proto. * nptl/pthread_setcancelstate.c (__pthread_setcancelstate): Mark it with hidden_def. * sysdeps/nptl/libc-lockP.h (__pthread_setcancelstate): New. (pthread_setcancelstate): Renamed to ... (__pthread_setcancelstate): This. * sysdeps/unix/sysv/linux/fatal-prepare.h (FATAL_PREPARE): Use __libc_ptf_call with __pthread_setcancelstate.
* Fix sign of zero part from ctan / ctanh when argument infinite (bug 17118).Joseph Myers2015-09-171-0/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | C99/C11 Annex G specifies the sign of the zero part of the result of ctan (x +/- i * Inf) and ctanh (+/-Inf + i * y). This patch fixes glibc to follow that specification, along the lines I described in my review of Andreas's previous patch for this issue <https://sourceware.org/ml/libc-alpha/2014-08/msg00142.html>. Tested for x86_64. 2015-09-17 Joseph Myers <joseph@codesourcery.com> Andreas Schwab <schwab@suse.de> [BZ #17118] * math/s_ctan.c (__ctan): Determine sign of zero real part of result when imaginary part of argument is infinite using sine and cosine. * math/s_ctanf.c (__ctanf): Likewise. * math/s_ctanl.c (__ctanl): Likewise. * math/s_ctanh.c (__ctanh): Determine sign of zero imaginary part of result when real part of argument is infinite using sine and cosine. * math/s_ctanhf.c (__ctanhf): Likewise. * math/s_ctanhl.c (__ctanhl): Likewise. * math/libm-test.inc (ctan_test_data): Add more tests of ctan. (ctanh_test_data): Add more tests of ctanh.
* Reduce number of constants in __finite* (bug 15384).Joseph Myers2015-09-171-0/+9
| | | | | | | | | | | | | | | | | | | Bug 15384 notes that in __finite, two different constants are used that could be the same constant (the result only depends on the exponent of the floating-point representation), and that using the same constant is better for architectures where constants need loading from a constant pool. This patch implements that change. Tested for x86_64, mips64 and powerpc. [BZ #15384] * sysdeps/ieee754/dbl-64/s_finite.c (FINITE): Use same constant as bit-mask as in subtraction. * sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c (__finite): Likewise. * sysdeps/ieee754/flt-32/s_finitef.c (FINITEF): Likewise. * sysdeps/ieee754/ldbl-128/s_finitel.c (__finitel): Likewise. * sysdeps/ieee754/ldbl-128ibm/s_finitel.c (__finitel): Likewise.
* Fix tgamma missing underflows (bug 18951).Joseph Myers2015-09-171-0/+16
| | | | | | | | | | | | | | | | | | | | | | | | Similar to various other bugs in this area, tgamma functions can fail to raise the underflow exception when the result is tiny and inexact but one or more low bits of the intermediate result that is scaled down are zero. This patch forces the exception in a similar way to previous fixes. Tested for x86_64, x86, mips64 and powerpc. [BZ #18951] * sysdeps/ieee754/dbl-64/e_gamma_r.c (__ieee754_gamma_r): Force underflow exception for small results. * sysdeps/ieee754/flt-32/e_gammaf_r.c (__ieee754_gammaf_r): Likewise. * sysdeps/ieee754/ldbl-128/e_gammal_r.c (__ieee754_gammal_r): Likewise. * sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c (__ieee754_gammal_r): Likewise. * sysdeps/ieee754/ldbl-96/e_gammal_r.c (__ieee754_gammal_r): Likewise. * math/auto-libm-test-in: Add more tests of tgamma. * math/auto-libm-test-out: Regenerated.
* Restore sparc64 implementation of semctlAndreas Schwab2015-09-171-0/+4
| | | | | The sparc64 variant of the ipc syscall does not dereference the pointer argument for the SEMCTL operation.
* Don't declare float / long double Bessel functions for XSI POSIX (bug 18977).Joseph Myers2015-09-161-0/+29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The float and long double versions of Bessel function (j0f, y1l, etc.) are not in POSIX; only the double versions are. This patch accordingly limits the declarations of those functions to __USE_MISC, and fixes the conform/ test expectations which matched the previous incorrect declarations. Tested for x86_64 and x86 (testsuite, and that installed stripped shared libraries are unchanged by this patch). [BZ #18977] * math/bits/mathcalls.h [!__USE_MISC && __USE_XOPEN && !__MATH_DECLARING_DOUBLE] (j0): Do not declare. [!__USE_MISC && __USE_XOPEN && !__MATH_DECLARING_DOUBLE] (j1): Likewise. [!__USE_MISC && __USE_XOPEN && !__MATH_DECLARING_DOUBLE] (jn): Likewise. [!__USE_MISC && __USE_XOPEN && !__MATH_DECLARING_DOUBLE] (y0): Likewise. [!__USE_MISC && __USE_XOPEN && !__MATH_DECLARING_DOUBLE] (y1): Likewise. [!__USE_MISC && __USE_XOPEN && !__MATH_DECLARING_DOUBLE] (yn): Likewise. * conform/data/math.h-data [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (j0f): Do not expect function. [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (j1f): Likewise. [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (jnf): Likewise. [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (y0f): Likewise. [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (y1f): Likewise. [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (ynf): Likewise. [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (j0l): Likewise. [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (j1l): Likewise. [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (jnl): Likewise. [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (y0l): Likewise. [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (y1l): Likewise. [!ISO99 && !ISO11 && !POSIX && !POSIX2008] (ynl): Likewise.
* Make scalbn set errno (bug 6803).Joseph Myers2015-09-161-0/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As noted in bug 6803, scalbn fails to set errno on overflow and underflow. This patch fixes this by making scalbn an alias of ldexp, which has exactly the same semantics (for floating-point types with radix 2) and already has wrappers that deal with setting errno, instead of an alias of the internal __scalbn (which ldexp calls). Notes: * Where compat symbols were defined for scalbn functions, I didn't change what they point to (to keep the patch minimal), so such compat symbols continue to go directly to the non-errno-setting functions. * Mike, I didn't do anything with the IA64 versions of these functions, where I think both the ldexp and scalbn functions already deal with setting errno. As a cleanup (not needed to fix this bug) however you might want to make those functions into aliases for IA64; there is no need for them to be separate function implementations at all. * This concludes the fix for bug 6803 since the scalb and scalbln cases of that bug were fixed some time ago. Tested for x86_64, x86, mips64 and powerpc. [BZ #6803] * math/s_ldexp.c (scalbn): Define as weak alias of __ldexp. [NO_LONG_DOUBLE] (scalbnl): Define as weak alias of __ldexp. * math/s_ldexpf.c (scalbnf): Define as weak alias of __ldexpf. * math/s_ldexpl.c (scalbnl): Define as weak alias of __ldexpl. * sysdeps/i386/fpu/s_scalbn.S (scalbn): Remove alias. * sysdeps/i386/fpu/s_scalbnf.S (scalbnf): Likewise. * sysdeps/i386/fpu/s_scalbnl.S (scalbnl): Likewise. * sysdeps/ieee754/dbl-64/s_scalbn.c (scalbn): Likewise. [NO_LONG_DOUBLE] (scalbnl): Likewise. * sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c (scalbn): Likewise. [NO_LONG_DOUBLE] (scalbnl): Likewise. * sysdeps/ieee754/flt-32/s_scalbnf.c (scalbnf): Likewise. * sysdeps/ieee754/ldbl-128/s_scalbnl.c (scalbnl): Likewise. * sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c (scalbnl): Remove long_double_symbol calls. * sysdeps/ieee754/ldbl-64-128/s_scalbnl.c (scalbnl): Likewise. * sysdeps/ieee754/ldbl-opt/s_ldexpl.c (__ldexpl_2): Define as strong alias of __ldexpl. (scalbnl): Define using long_double_symbol. * sysdeps/m68k/m680x0/fpu/s_scalbn.c (__CONCATX(scalbn,suffix)): Remove alias. * sysdeps/sparc/sparc64/soft-fp/s_scalbnl.c (scalbnl): Likewise. * sysdeps/x86_64/fpu/s_scalbnl.S (scalbnl): Likewise. * math/libm-test.inc (scalbn_test_data): Add errno expectations. (scalbln_test_data): Add more errno expectations.
* Cache the host port like we cache the task portJustus Winter2015-09-161-0/+16
| | | | | | | | | | | | | | | | This way we do not need to call the kernel just to get the port. Furthermore, we no longer increase the reference count on every invocation of `mach_host_self'. * mach/mach/mach_traps.h (__mach_host_self, mach_host_self): Protect declarations against the macro expansion. * mach/mach_init.c (__mach_host_self_): New variable. (mach_init): Initialize `__mach_host_self_'. * mach/mach_init.h (__mach_host_self_): New declaration. (__mach_host_self, mach_host_self): New macros. * sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_start_cleanup): Release reference.
* Update de.po from Translation Project (bug 4404).Joseph Myers2015-09-161-0/+3
| | | | | [BZ #4404] * po/de.po: Update from Translation Project.
* Clean up ldbl-128 / ldbl-128ibm expm1l dead code (bug 16415).Joseph Myers2015-09-161-0/+9
| | | | | | | | | | | | | | | | The ldbl-128 and ldbl-128ibm expm1l implementations have code to handle +Inf and finite arguments above an overflow threshold. Since they now use __expl for large positive arguments to fix other problems, this code is unreachable; this patch removes it. Tested for mips64 and powerpc. [BZ #16415] * sysdeps/ieee754/ldbl-128/s_expm1l.c (maxlog): Remove variable. (__expm1l): Remove code to handle positive infinity and overflow. * sysdeps/ieee754/ldbl-128ibm/s_expm1l.c (maxlog): Remove variable. (__expm1l): Remove code to handle positive infinity and overflow.
* Fix BZ #18872 -- memory leak in printf_positional.Paul Pluzhnikov2015-09-161-0/+9
|
* Remove extra va_start/va_end calls (bug 17244)Andreas Schwab2015-09-161-0/+4
|
* Add missing va_end calls (bug 17243)Andreas Schwab2015-09-161-0/+7
|
* Use HOST_NAME_MAX for MAXHOSTNAMELEN in <sys/param.h>.Roland McGrath2015-09-151-0/+5
|
* Fix math.h, tgmath.h XSI POSIX namespace (gamma, isnan, scalb) (bug 18967).Joseph Myers2015-09-151-0/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | math.h incorrectly declares various functions for XSI POSIX 2001 and 2008 editions. gamma was removed in the 2001 edition but is still declared, along with gammaf and gammal which were never standard functions. isnan is still declared as a function, along with isnanf and isnanl which were never standard functions, although in 2001 the function was replaced by the type-generic macro. scalbf and scalbl are declared although never standard, and scalb was removed in the 2008 edition but is still declared. The scalb type-generic macro in tgmath.h shouldn't be present for any POSIX version, since POSIX never had such a type-generic macro. This patch disables all those declarations in the relevant cases (as a minimal fix, it leaves them enabled for __USE_MISC). For the matter of declaring scalb but not scalbf or scalbl for the 2001 edition, a new macro __MATH_DECLARING_DOUBLE is added, defined by math.h around includes of bits/mathcalls.h, for bits/mathcalls.h to use to test which type's functions are being declared. Tested for x86_64 and x86 (testsuite, and that installed stripped shared libraries are unchanged by the patch). [BZ #18967] * math/math.h (__MATH_DECLARING_DOUBLE): New macro. Define and undefine around includes of <bits/mathcalls.h>. * math/bits/mathcalls.h [!__USE_MISC && __USE_XOPEN2K] (isnan): Do not declare function. [!__USE_MISC && __USE_XOPEN2K] (gamma): Likewise. [!__USE_MISC && (!__MATH_DECLARING_DOUBLE || __USE_XOPEN2K8)] (scalb): Likewise. * math/tgmath.h [!__USE_MISC && __USE_XOPEN_EXTENDED] (scalb): Do not define macro. * conform/Makefile (test-xfail-XOPEN2K/math.h/conform): Remove variable. (test-xfail-XOPEN2K/tgmath.h/conform): Likewise. (test-xfail-XOPEN2K8/math.h/conform): Likewise. (test-xfail-XOPEN2K8/tgmath.h/conform): Likewise.
* Fix ldbl-128ibm nearbyintl use of signaling comparisons on NaNs (bug 18857).Joseph Myers2015-09-151-0/+5
| | | | | | | | | | | | | | | | | | | | | | The ldbl-128ibm implementation of nearbyintl wrongly uses signaling comparisons such as "if (fabs (u.d[0].d) < TWO52)" on arguments that might be NaNs, when "invalid" exceptions should not be raised. (For hard float, this issue may be hidden by <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58684>, powerpc GCC wrongly only using unordered comparison instructions.) This patch fixes this by just returning the argument if it is not finite (because of the arbitrary value of the low part of a NaN in IBM long double, there are quite a lot of comparisons that could end up involving a NaN when the argument to nearbyintl is a NaN, so excluding NaN arguments at the start is the simplest and safest fix). Tested for powerpc-nofpu, where it removes failures for spurious "invalid" exceptions from nearbyintl. [BZ #18857] * sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c (__nearbyintl): Just return non-finite argument without doing ordered comparisons on it.
* Mark fegetround pure (bug 16296).Joseph Myers2015-09-151-0/+4
| | | | | | | | | | | | Bug 16296 notes that fegetround is a pure function and should be marked as such in fenv.h. This patch implements that. Tested for x86_64 and x86 (testsuite, and that installed stripped shared libraries are unchanged by this patch). [BZ #16296] * math/fenv.h (fegetround): Use __attribute_pure__. * include/fenv.h (__fegetround): Likewise.
* Fix ctan, ctanh missing underflows (bug 18595).Joseph Myers2015-09-151-0/+11
| | | | | | | | | | | | | | | | | | | | Similar to various other bugs in this area, ctan and ctanh can fail to raise the underflow exception for some cases of results that are tiny and inexact. This patch forces the exception in a similar way to previous fixes. Tested for x86_64 and x86. [BZ #18595] * math/s_ctan.c (__ctan): Force underflow exception for results whose real or imaginary part has small absolute value. * math/s_ctanf.c (__ctanf): Likewise. * math/s_ctanh.c (__ctanh): Likewise. * math/s_ctanhf.c (__ctanhf): Likewise. * math/s_ctanhl.c (__ctanhl): Likewise. * math/s_ctanl.c (__ctanl): Likewise. * math/auto-libm-test-in: Do not allow missing underflow for ctan and ctanh. Add more tests of ctan and ctanh.
* Simplify hypotf infinity handling (bug 15918).Joseph Myers2015-09-151-0/+4
| | | | | | | | | | | | | | Bug 15918 points out that the handling of infinities in hypotf can be simplified: it's enough to return the absolute value of the infinite argument without first comparing it to the other argument and possibly returning that other argument's absolute value. This patch makes that cleanup (which should not change how hypotf behaves on any input). Tested for x86_64. [BZ #15918] * sysdeps/ieee754/flt-32/e_hypotf.c (__ieee754_hypotf): Simplify handling of cases where one argument is an infinity.
* Fix i386 exp10 missing underflows (bug 18966).Joseph Myers2015-09-151-0/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | On i386, the double version of exp10 can miss underflow exceptions if the result is in the subnormal range for double but the last 11 bits of the 64-bit extended-precision mantissa happen to be zero. This patch forces the exception in a similar way to previous fixes. As with the exp2 and exp fixes, the exp10f changes may in fact not be needed to ensure underflow exceptions, but are included for consistency and to fix the exp10 part of bug 18875 by ensuring that excess range and precision is removed from underflowing return values. Tested for x86_64 and x86. [BZ #18875] [BZ #18966] * sysdeps/i386/fpu/e_exp10.S (dbl_min): New object. (MO): New macro. (__ieee754_exp10): For small results, force underflow exception and remove excess range and precision from return value. * sysdeps/i386/fpu/e_exp10f.S (flt_min): New object. (MO): New macro. (__ieee754_exp10f): For small results, force underflow exception and remove excess range and precision from return value. * math/auto-libm-test-in: Add more tests of exp10. * math/auto-libm-test-out: Regenerated.
* Fix i386 exp missing underflows (bug 18961).Joseph Myers2015-09-141-0/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | On i386, the double version of exp can miss underflow exceptions if the result is in the subnormal range for double but the last 11 bits of the 64-bit extended-precision mantissa happen to be zero. This patch forces the exception in a similar way to previous fixes. As with the exp2 fixes, the expf changes may in fact not be needed to ensure underflow exceptions, but are included for consistency and to fix the exp part of bug 18875 by ensuring that excess range and precision is removed from underflowing return values. Tested for x86_64 and x86. [BZ #18875] [BZ #18961] * sysdeps/i386/fpu/e_exp.S (dbl_min): New object. (MO): New macro. (__ieee754_exp): For small results, force underflow exception and remove excess range and precision from return value. (__exp_finite): Likewise. * sysdeps/i386/fpu/e_expf.S (flt_min): New object. (MO): New macro. (__ieee754_expf): For small results, force underflow exception and remove excess range and precision from return value. (__expf_finite): Likewise. * math/auto-libm-test-in: Add more tests of exp. * math/auto-libm-test-out: Regenerated.
* Fix exp2 missing underflows (bug 16521).Joseph Myers2015-09-141-0/+25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Various exp2 implementations in glibc can miss underflow exceptions when the scaling down part of the calculation is exact (or, in the x86 case, when the conversion from extended precision to the target precision is exact). This patch forces the exception in a similar way to previous fixes. The x86 exp2f changes may in fact not be needed for this purpose - it's likely to be the case that no argument of type float has an exp2 result so close to an exact subnormal float value that it equals that value when rounded to 64 bits (even taking account of variation between different x86 implementations). However, they are included for consistency with the changes to exp2 and so as to fix the exp2f part of bug 18875 by ensuring that excess range and precision is removed from underflowing return values. Tested for x86_64, x86 and mips64. [BZ #16521] [BZ #18875] * math/e_exp2l.c (__ieee754_exp2l): Force underflow exception for small results. * sysdeps/i386/fpu/e_exp2.S (dbl_min): New object. (MO): New macro. (__ieee754_exp2): For small results, force underflow exception and remove excess range and precision from return value. * sysdeps/i386/fpu/e_exp2f.S (flt_min): New object. (MO): New macro. (__ieee754_exp2f): For small results, force underflow exception and remove excess range and precision from return value. * sysdeps/i386/fpu/e_exp2l.S (ldbl_min): New object. (MO): New macro. (__ieee754_exp2l): Force underflow exception for small results. * sysdeps/ieee754/dbl-64/e_exp2.c (__ieee754_exp2): Likewise. * sysdeps/ieee754/flt-32/e_exp2f.c (__ieee754_exp2f): Likewise. * sysdeps/x86_64/fpu/e_exp2l.S (ldbl_min): New object. (MO): New macro. (__ieee754_exp2l): Force underflow exception for small results. * math/auto-libm-test-in: Add more tests or exp2. * math/auto-libm-test-out: Regenerated.
* Use ALIGN_DOWN in systrim.Carlos O'Donell2015-09-141-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | While doing code review I converted another bespoke round down, and corrected a comment. The comment spoke about keeping at least one page allocated even during systrim, which is not correct. The code does nothing to keep a page allocated. The code does attempt to keep PAD padding as documented in comments and MINSIZE as required by design. Historically in 2002 when Ulrich wrote the code (fa8d436c) the math was inlined into one statement which did reserve an extra page: extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz; There is no reason given for this extra page. In 2010 Anton Branchard's change (b9b42ee0) from division to shifts removed the extra page by dropping the "+ (pagesiz-1), which mean we might have attempted to return -0 via MORECORE. The fix by Will Newton in 2014 added a check for extra being zero (51a7380b). From first principles I see no reason why we should keep an extra page of memory from being trimmed back to the OS. The only sensible interface is to honour PAD padding as the function is documented, with the caveat the MINSIZE is maintained for the top chunk. Given that we've been using this code for 5+ years with no extra page allocated is sufficient evidence that the comment should be changed to match the code that I'm touching. Tested on x86_64 and i686, no regressions.
* Prevent check-local-headers.sh hang.Carlos O'Donell2015-09-141-0/+5
| | | | | | | | | | | | Consensus in [1] was that the right way to fix this was simply to redirect from /dev/null to terminate the test if no inputs was found by the tests own globbing e.g. "*/*.{o,os,oS}.d" This can happen when the build is incomplete and the tests are started. This failure causes check-local-headers.sh to hang forever waiting for input from stdin. This change makes the test terminate immediately if the glob doesn't return any files. [1] https://sourceware.org/ml/libc-alpha/2014-12/msg00337.html
* Fix typoSamuel Thibault2015-09-131-0/+5
| | | | | * sysdeps/mach/hurd/Makefile ($(patsubst %,$(hurd-objpfx)hurd/%.%,auth io fs process)): Drop spurious backslash.
* linux/getsysstats.c: use sysinfo() instead of parsing /proc/meminfoRasmus Villemoes2015-09-121-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Profiling git's test suite, Linus noted [1] that a disproportionately large amount of time was spent reading /proc/meminfo. This is done by the glibc functions get_phys_pages and get_avphys_pages, but they only need the MemTotal and MemFree fields, respectively. That same information can be obtained with a single syscall, sysinfo, instead of six: open, fstat, mmap, read, close, munmap. While sysinfo also provides more than necessary, it does a lot less work than what the kernel needs to do to provide the entire /proc/meminfo. Both strace -T and in-app microbenchmarks shows that the sysinfo() approach is roughly an order of magnitude faster. sysinfo() is much older than what glibc currently requires, so I don't think there's any reason to keep the old parsing code. Moreover, this makes get_[av]phys_pages work even in the absence of /proc. Linus noted that something as simple as 'bash -c "echo"' would trigger the reading of /proc/meminfo, but gdb says that many more applications than just bash are affected: Starting program: /bin/bash "-c" "echo" Breakpoint 1, __get_phys_pages () at ../sysdeps/unix/sysv/linux/getsysstats.c:283 283 ../sysdeps/unix/sysv/linux/getsysstats.c: No such file or directory. (gdb) bt So it seems that any application that uses qsort on a moderately sized array will incur this cost (once), which is obviously proportionately more expensive for lots of short-lived processes (such as the git test suite). [1] http://thread.gmane.org/gmane.linux.kernel/2019285 Signed-off-by: Rasmus Villemoes <rv@rasmusvillemoes.dk> * sysdeps/unix/sysv/linux/getsysstats.c (__get_phys_pages): Use sysinfo system call instead of parsing /proc/meminfo. * sysdeps/unix/sysv/linux/getsysstats.c (__get_avphys_pages): Likewise.
* localedef: improve error message [BZ #16985]Mike Frysinger2015-09-111-0/+6
| | | | | | | | If you pass in a path that fails to be opened, then output_path is set to NULL, and an error is flagged. Then at the end, we use both of those: cannot write output files to `(null)': No such file or directory Tweak the message to use the user's input when output_path is NULL.
* Add more random libm test inputs (mainly for ldbl-128).Joseph Myers2015-09-121-0/+12
| | | | | | | | | | | | | | | | | | | | | This patch adds more libm test inputs found through random test generation to increase previously known ulps. This particular test generation was run for mips64, so most of the increased ulps are for ldbl-128 (float and double having been fairly well covered by such testing for x86_64), but there's the odd ulps increase for other formats. Tested for x86_64, x86 and mips64. * math/auto-libm-test-in: Add more tests of acos, acosh, asin, asinh, atan, atan2, atanh, cabs, carg, cos, csqrt, erfc, exp, exp10, exp2, log, log1p, log2, pow, sin, sincos, sinh, tan and tanh. * math/auto-libm-test-out: Regenerated. * sysdeps/i386/fpu/libm-test-ulps: Update. * sysdeps/mips/mips32/libm-test-ulps: Likewise. * sysdeps/mips/mips64/libm-test-ulps: Likewise. * sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
* NaCl: Do not install <sys/mtio.h>.Roland McGrath2015-09-111-0/+6
|
* Move bits/atomic.h to atomic-machine.h (bug 14912).Joseph Myers2015-09-111-0/+75
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It was noted in <https://sourceware.org/ml/libc-alpha/2012-09/msg00305.html> that the bits/*.h naming scheme should only be used for installed headers. This patch renames bits/atomic.h to atomic-machine.h to follow that convention. This is the only change in this series that needs to change the filename rather than simply removing a directory level (because both atomic.h and bits/atomic.h exist at present). Tested for x86_64 (testsuite, and that installed stripped shared libraries are unchanged by the patch). [BZ #14912] * sysdeps/aarch64/bits/atomic.h: Move to ... * sysdeps/aarch64/atomic-machine.h: ...here. (_AARCH64_BITS_ATOMIC_H): Rename macro to _AARCH64_ATOMIC_MACHINE_H. * sysdeps/alpha/bits/atomic.h: Move to ... * sysdeps/alpha/atomic-machine.h: ...here. * sysdeps/arm/bits/atomic.h: Move to ... * sysdeps/arm/atomic-machine.h: ...here. Update comments. * bits/atomic.h: Move to ... * sysdeps/generic/atomic-machine.h: ...here. (_BITS_ATOMIC_H): Rename macro to _ATOMIC_MACHINE_H. * sysdeps/i386/bits/atomic.h: Move to ... * sysdeps/i386/atomic-machine.h: ...here. * sysdeps/ia64/bits/atomic.h: Move to ... * sysdeps/ia64/atomic-machine.h: ...here. * sysdeps/m68k/coldfire/bits/atomic.h: Move to ... * sysdeps/m68k/coldfire/atomic-machine.h: ...here. (_BITS_ATOMIC_H): Rename macro to _ATOMIC_MACHINE_H. * sysdeps/m68k/m680x0/m68020/bits/atomic.h: Move to ... * sysdeps/m68k/m680x0/m68020/atomic-machine.h: ...here. * sysdeps/microblaze/bits/atomic.h: Move to ... * sysdeps/microblaze/atomic-machine.h: ...here. * sysdeps/mips/bits/atomic.h: Move to ... * sysdeps/mips/atomic-machine.h: ...here. (_MIPS_BITS_ATOMIC_H): Rename macro to _MIPS_ATOMIC_MACHINE_H. * sysdeps/powerpc/bits/atomic.h: Move to ... * sysdeps/powerpc/atomic-machine.h: ...here. Update comments. * sysdeps/powerpc/powerpc32/bits/atomic.h: Move to ... * sysdeps/powerpc/powerpc32/atomic-machine.h: ...here. Update comments. Include <atomic-machine.h> instead of <bits/atomic.h>. * sysdeps/powerpc/powerpc64/bits/atomic.h: Move to ... * sysdeps/powerpc/powerpc64/atomic-machine.h: ...here. Include <atomic-machine.h> instead of <bits/atomic.h>. * sysdeps/s390/bits/atomic.h: Move to ... * sysdeps/s390/atomic-machine.h: ...here. * sysdeps/sparc/sparc32/bits/atomic.h: Move to ... * sysdeps/sparc/sparc32/atomic-machine.h: ...here. (_BITS_ATOMIC_H): Rename macro to _ATOMIC_MACHINE_H. * sysdeps/sparc/sparc32/sparcv9/bits/atomic.h: Move to ... * sysdeps/sparc/sparc32/sparcv9/atomic-machine.h: ...here. * sysdeps/sparc/sparc64/bits/atomic.h: Move to ... * sysdeps/sparc/sparc64/atomic-machine.h: ...here. * sysdeps/tile/bits/atomic.h: Move to ... * sysdeps/tile/atomic-machine.h: ...here. * sysdeps/tile/tilegx/bits/atomic.h: Move to ... * sysdeps/tile/tilegx/atomic-machine.h: ...here. Include <sysdeps/tile/atomic-machine.h> instead of <sysdeps/tile/bits/atomic.h>. (_BITS_ATOMIC_H): Rename macro to _ATOMIC_MACHINE_H. * sysdeps/tile/tilepro/bits/atomic.h: Move to ... * sysdeps/tile/tilepro/atomic-machine.h: ...here. Include <sysdeps/tile/atomic-machine.h> instead of <sysdeps/tile/bits/atomic.h>. (_BITS_ATOMIC_H): Rename macro to _ATOMIC_MACHINE_H. * sysdeps/unix/sysv/linux/arm/bits/atomic.h: Move to ... * sysdeps/unix/sysv/linux/arm/atomic-machine.h: ...here. Include <sysdeps/arm/atomic-machine.h> instead of <sysdeps/arm/bits/atomic.h>. * sysdeps/unix/sysv/linux/hppa/bits/atomic.h: Move to ... * sysdeps/unix/sysv/linux/hppa/atomic-machine.h: ...here. (_BITS_ATOMIC_H): Rename macro to _ATOMIC_MACHINE_H. * sysdeps/unix/sysv/linux/m68k/coldfire/bits/atomic.h: Move to ... * sysdeps/unix/sysv/linux/m68k/coldfire/atomic-machine.h: ...here. (_BITS_ATOMIC_H): Rename macro to _ATOMIC_MACHINE_H. * sysdeps/unix/sysv/linux/nios2/bits/atomic.h: Move to ... * sysdeps/unix/sysv/linux/nios2/atomic-machine.h: ...here. (_NIOS2_BITS_ATOMIC_H): Rename macro to _NIOS2_ATOMIC_MACHINE_H. * sysdeps/unix/sysv/linux/sh/bits/atomic.h: Move to ... * sysdeps/unix/sysv/linux/sh/atomic-machine.h: ...here. * sysdeps/x86_64/bits/atomic.h: Move to ... * sysdeps/x86_64/atomic-machine.h: ...here. * include/atomic.h: Include <atomic-machine.h> instead of <bits/atomic.h>.
* Update libm-test-ulps for MIPS.Joseph Myers2015-09-111-0/+3
| | | | | * sysdeps/mips/mips32/libm-test-ulps: Update. * sysdeps/mips/mips64/libm-test-ulps: Likewise.
* Fix ldbl-128/ldbl-128ibm lgamma spurious "invalid", incorrect signgam (bug ↵Joseph Myers2015-09-111-0/+7
| | | | | | | | | | | | | | | | | | | | 18952). The ldbl-128 / ldbl-128ibm implementation of lgammal converts (the floor of minus) non-integer negative arguments to int to determine the value of signgam. When those values are outside the range of int, this produces spurious "invalid" exceptions and incorrect values of signgam. This patch fixes this by instead determining signgam through comparing half the integer in question to floor of half the integer. Tested for mips64, x86_64 and x86. [BZ #18952] * sysdeps/ieee754/ldbl-128/e_lgammal_r.c (__ieee754_lgammal_r): Do not convert non-integer negative arguments to int to determine the value of signgam. * math/auto-libm-test-in: Add more tests of lgamma. * math/auto-libm-test-out: Regenerated.
* Add more randomly-generated libm tests.Joseph Myers2015-09-111-0/+8
| | | | | | | | | | | | | This patch adds more libm test inputs found through random test generation to increase observed ulps on x86_64. Tested for x86_64 and x86. * math/auto-libm-test-in: Add more tests of acosh, atanh, cbrt, cosh, csqrt, erfc, expm1 and lgamma. * math/auto-libm-test-out: Regenerated. * sysdeps/i386/fpu/libm-test-ulps: Update. * sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
* Fix lgamma (negative) inaccuracy (bug 2542, bug 2543, bug 2558).Joseph Myers2015-09-101-0/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The existing implementations of lgamma functions (except for the ia64 versions) use the reflection formula for negative arguments. This suffers large inaccuracy from cancellation near zeros of lgamma (near where the gamma function is +/- 1). This patch fixes this inaccuracy. For arguments above -2, there are no zeros and no large cancellation, while for sufficiently large negative arguments the zeros are so close to integers that even for integers +/- 1ulp the log(gamma(1-x)) term dominates and cancellation is not significant. Thus, it is only necessary to take special care about cancellation for arguments around a limited number of zeros. Accordingly, this patch uses precomputed tables of relevant zeros, expressed as the sum of two floating-point values. The log of the ratio of two sines can be computed accurately using log1p in cases where log would lose accuracy. The log of the ratio of two gamma(1-x) values can be computed using Stirling's approximation (the difference between two values of that approximation to lgamma being computable without computing the two values and then subtracting), with appropriate adjustments (which don't reduce accuracy too much) in cases where 1-x is too small to use Stirling's approximation directly. In the interval from -3 to -2, using the ratios of sines and of gamma(1-x) can still produce too much cancellation between those two parts of the computation (and that interval is also the worst interval for computing the ratio between gamma(1-x) values, which computation becomes more accurate, while being less critical for the final result, for larger 1-x). Because this can result in errors slightly above those accepted in glibc, this interval is instead dealt with by polynomial approximations. Separate polynomial approximations to (|gamma(x)|-1)(x-n)/(x-x0) are used for each interval of length 1/8 from -3 to -2, where n (-3 or -2) is the nearest integer to the 1/8-interval and x0 is the zero of lgamma in the relevant half-integer interval (-3 to -2.5 or -2.5 to -2). Together, the two approaches are intended to give sufficient accuracy for all negative arguments in the problem range. Outside that range, the previous implementation continues to be used. Tested for x86_64, x86, mips64 and powerpc. The mips64 and powerpc testing shows up pre-existing problems for ldbl-128 and ldbl-128ibm with large negative arguments giving spurious "invalid" exceptions (exposed by newly added tests for cases this patch doesn't affect the logic for); I'll address those problems separately. [BZ #2542] [BZ #2543] [BZ #2558] * sysdeps/ieee754/dbl-64/e_lgamma_r.c (__ieee754_lgamma_r): Call __lgamma_neg for arguments from -28.0 to -2.0. * sysdeps/ieee754/flt-32/e_lgammaf_r.c (__ieee754_lgammaf_r): Call __lgamma_negf for arguments from -15.0 to -2.0. * sysdeps/ieee754/ldbl-128/e_lgammal_r.c (__ieee754_lgammal_r): Call __lgamma_negl for arguments from -48.0 or -50.0 to -2.0. * sysdeps/ieee754/ldbl-96/e_lgammal_r.c (__ieee754_lgammal_r): Call __lgamma_negl for arguments from -33.0 to -2.0. * sysdeps/ieee754/dbl-64/lgamma_neg.c: New file. * sysdeps/ieee754/dbl-64/lgamma_product.c: Likewise. * sysdeps/ieee754/flt-32/lgamma_negf.c: Likewise. * sysdeps/ieee754/flt-32/lgamma_productf.c: Likewise. * sysdeps/ieee754/ldbl-128/lgamma_negl.c: Likewise. * sysdeps/ieee754/ldbl-128/lgamma_productl.c: Likewise. * sysdeps/ieee754/ldbl-128ibm/lgamma_negl.c: Likewise. * sysdeps/ieee754/ldbl-128ibm/lgamma_productl.c: Likewise. * sysdeps/ieee754/ldbl-96/lgamma_negl.c: Likewise. * sysdeps/ieee754/ldbl-96/lgamma_product.c: Likewise. * sysdeps/ieee754/ldbl-96/lgamma_productl.c: Likewise. * sysdeps/generic/math_private.h (__lgamma_negf): New prototype. (__lgamma_neg): Likewise. (__lgamma_negl): Likewise. (__lgamma_product): Likewise. (__lgamma_productl): Likewise. * math/Makefile (libm-calls): Add lgamma_neg and lgamma_product. * math/auto-libm-test-in: Add more tests of lgamma. * math/auto-libm-test-out: Regenerated. * sysdeps/i386/fpu/libm-test-ulps: Update. * sysdeps/x86_64/fpu/libm-test-ulps: Likewise.