about summary refs log tree commit diff
path: root/math/s_fdimf.c
Commit message (Collapse)AuthorAgeFilesLines
* Use generic fdim on more architectures (bug 6796, bug 20255, bug 20256).Joseph Myers2016-06-141-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some architectures have their own versions of fdim functions, which are missing errno setting (bug 6796) and may also return sNaN instead of qNaN for sNaN input, in the case of the x86 / x86_64 long double versions (bug 20256). These versions are not actually doing anything that a compiler couldn't generate, just straightforward comparisons / arithmetic (and, in the x86 / x86_64 case, testing for NaNs with fxam, which isn't actually needed once you use an unordered comparison and let the NaNs pass through the same subtraction as non-NaN inputs). This patch removes the x86 / x86_64 / powerpc versions, so that those architectures use the generic C versions, which correctly handle setting errno and deal properly with sNaN inputs. This seems better than dealing with setting errno in lots of .S versions. The i386 versions also return results with excess range and precision, which is not appropriate for a function exactly defined by reference to IEEE operations. For errno setting to work correctly on overflow, it's necessary to remove excess range with math_narrow_eval, which this patch duly does in the float and double versions so that the tests can reliably pass on x86. For float, this avoids any double rounding issues as the long double precision is more than twice that of float. For double, double rounding issues will need to be addressed separately, so this patch does not fully fix bug 20255. Tested for x86_64, x86 and powerpc. [BZ #6796] [BZ #20255] [BZ #20256] * math/s_fdim.c: Include <math_private.h>. (__fdim): Use math_narrow_eval on result. * math/s_fdimf.c: Include <math_private.h>. (__fdimf): Use math_narrow_eval on result. * sysdeps/i386/fpu/s_fdim.S: Remove file. * sysdeps/i386/fpu/s_fdimf.S: Likewise. * sysdeps/i386/fpu/s_fdiml.S: Likewise. * sysdeps/i386/i686/fpu/s_fdim.S: Likewise. * sysdeps/i386/i686/fpu/s_fdimf.S: Likewise. * sysdeps/i386/i686/fpu/s_fdiml.S: Likewise. * sysdeps/powerpc/fpu/s_fdim.c: Likewise. * sysdeps/powerpc/fpu/s_fdimf.c: Likewise. * sysdeps/powerpc/powerpc32/fpu/s_fdim.c: Likewise. * sysdeps/powerpc/powerpc64/fpu/s_fdim.c: Likewise. * sysdeps/x86_64/fpu/s_fdiml.S: Likewise. * math/libm-test.inc (fdim_test_data): Expect errno setting on overflow. Add sNaN tests.
* Simplify generic fdim implementations.Joseph Myers2016-06-141-10/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The generic fdim implementations have unnecessarily complicated code, using fpclassify to determine whether the arguments are NaNs, subtracting NaNs if so and otherwise subtracting the non-NaN arguments if not (x <= y), then using fpclassify on the result to see if it is infinite. This patch simplifies the code. Instead of handling NaNs separately, it suffices to use an unordered comparison with islessequal (x, y) to determine whether to return zero, and otherwise NaNs can go through the same subtraction as non-NaN arguments; no explicit tests for NaN are needed at all. Then, isinf instead of fpclassify can be used to determine whether to set errno (in the normal non-overflow case, only one classification will need to occur, unlike the three in the previous code, of which two occurred even if returning zero, because the result will not be infinite in the normal case). The resulting logic is essentially the same as that in the powerpc version, except that the powerpc version is missing errno setting and uses <= not islessequal, so relying on <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58684>, the GCC bug that unordered comparison instructions are wrongly used on powerpc for ordered comparisons. The compiled code for fdim and fdimf on x86_64 is less than half the size of the previous code. Tested for x86_64. * math/s_fdim.c (__fdim): Use islessequal and isinf instead of fpclassify. * math/s_fdimf.c (__fdimf): Likewise. * math/s_fdiml.c (__fdiml): Likewise.
* Update copyright dates with scripts/update-copyrights.Joseph Myers2016-01-041-1/+1
|
* Update copyright dates with scripts/update-copyrights.Joseph Myers2015-01-021-1/+1
|
* Update copyright notices with scripts/update-copyrightsAllan McRae2014-01-011-1/+1
|
* Fix fdim handling of infinities (bug 15797).Joseph Myers2013-08-211-4/+4
|
* Update copyright notices with scripts/update-copyrights.Joseph Myers2013-01-021-1/+1
|
* Replace FSF snail mail address with URLs.Paul Eggert2012-02-091-3/+2
|
* Fix overflow handling in fdim.Ulrich Drepper2009-08-241-2/+10
|
* Moved to csu/errno-loc.c.Ulrich Drepper2005-12-141-0/+36
|
* (CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.Ulrich Drepper2004-12-221-36/+0
|
* 2.5-18.1Jakub Jelinek2007-07-121-0/+36