summaryrefslogtreecommitdiffstats
path: root/lib/msun/i387
Commit message (Collapse)AuthorAgeFilesLines
* Synchronize most of libm with head as of r323004. This excludes a fewdim2018-02-243-4/+75
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | arch-specific updates for powerpcspe, mips and riscv, for which support has not been merged yet. Bump __FreeBSD_version for the addition of cacoshl, cacosl, casinhl, casinl, catanl, catanhl, sincos, sincosf, and sincosl. MFC r305382 (by bde): Add asm versions of fmod(), fmodf() and fmodl() on amd64. Add asm versions of fmodf() amd fmodl() on i387. fmod is similar to remainder, and the C versions are 3 to 9 times slower than the asm versions on x86 for both, but we had the strange mixture of all 6 variants of remainder in asm and only 1 of 6 variants of fmod in asm. MFC r305384 (by bde): Disconnect the "optimized" asm variants of cos(), sin() and tan() from the build on i386. Leave them in the source tree for regression tests. The asm functions were always much less accurate (by a factor of more than 10**18 in the worst case). They were faster on old CPUs. But with each new generation of CPUs they get relatively slower. The double precision C version's average advantage is about a factor of 2 on Haswell. The asm functions were already intentionally avoided in float and long double precision on i386 and in all precisions on amd64. Float precision and amd64 give larger advantages to the C version. The long double precision C code and compilers' understanding of long double precision are not so good, so the i387 is still slightly faster for long double precision, except for the unimportant subcase of huge args where the sub-optimal C code now somehow beats the i387 by about a factor of 2. MFC r305385 (by bde): Oops, the previous i386 version of e_fmodf.S and e_fmodl.S was actually the amd64 version. MFC r306409 (by emaste): libm: fix some unused variable (rcsid) and dangling else warnings s_{fabs,fmax,logb,scalb}{,f,l}.c may be built elsewhere with a higher WARNS setting. Reviewed by: ed Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D8061 MFC r306410 (by emaste): libm: simplify i387 subdir logic with make's :S substitution MFC r306527 (by emaste): libm: remove unused variables for LDBL_MANT_DIG != 113 Sponsored by: The FreeBSD Foundation MFC r306709 (by emaste): libm: remove unused variables Sponsored by: The FreeBSD Foundation MFC r307066 (by br): Don't use fmaxl/fminl on platforms with no long double support, use fmax/fmin instead. This fixes fmaxmin test failure on MIPS64. Reviewed by: emaste Sponsored by: DARPA, AFRL Sponsored by: HEIF5 Differential Revision: https://reviews.freebsd.org/D8216 MFC r308172 (by emaste): libm: add braces around initialization of subobjects This cleans up a warning when building libm at higher WARNS levels and makes the intent more clear. By the C standard the values are assigned to subobject members in order so this change introduces no functional change. (6.7.9 20) Reviewed by: kib Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D8333 MFC r313761 (by mmokhi): Add casinl() cacosl() catanl() casinhl() cacoshl() catanhl() APIs to msun to improve C11 conformance. PR: 216850 216851 216852 216856 216857 216858 Submitted by: mmokhi Reported by: sgk@troutmask.apl.washington.edu Reviewed by: bde, mat, theraven Approved by: bde (src committer), mat (mentor) Differential Revision: https://reviews.freebsd.org/D9491 MFC r313863 (by mmokhi): Fix building of r313761 on platforms that `long double` is alias of `double` (MIPS, etc) PR: 216850 216851 216852 216856 216857 216858 Reported by: emsate Reviewed by: bde emaste hselasky Approved by: bde emaste hselasky Differential Revision: https://reviews.freebsd.org/D9491 MFC r313864 (by mmokhi): Add documentations related to new APIs of r313761 PR: 216850 216851 216852 216856 216857 216858 Submitted by: sgk@troutmask.apl.washington.edu Reported by: sgk@troutmask.apl.washington.edu Reviewed by: bde emaste hselasky Approved by: bde emaste hselasky Differential Revision: https://reviews.freebsd.org/D9491 MFC r314950 (by ngie): Don't expect :test_large_inputs to fail with i386 anymore Recent changes (maybe a side-effect of the ATF-ification in r314649) invalidate the failure expectation. PR: 205446 Sponsored by: Dell EMC Isilon MFC r317349 (by pfg): msun: Remove trailing space in Sunsoft copyright statement. Submittedby: kargl MFC r319047 (by mmel): Implement sincos, sincosf, and sincosl. The primary benefit of these functions is that argument reduction is done once instead of twice in independent calls to sin() and cos(). * lib/msun/Makefile: . Add s_sincos[fl].c to the build. . Add sincos.3 documentation. . Add appropriate MLINKS. * lib/msun/Symbol.map: . Expose sincos[fl] symbols in dynamic libm.so. * lib/msun/man/sincos.3: . Documentation for sincos[fl]. * lib/msun/src/k_sincos.h: . Kernel for sincos() function. This merges the individual kernels for sin() and cos(). The merger offered an opportunity to re-arrange the individual kernels for better performance. * lib/msun/src/k_sincosf.h: . Kernel for sincosf() function. This merges the individual kernels for sinf() and cosf(). The merger offered an opportunity to re-arrange the individual kernels for better performance. * lib/msun/src/k_sincosl.h: . Kernel for sincosl() function. This merges the individual kernels for sinl() and cosl(). The merger offered an opportunity to re-arrange the individual kernels for better performance. * lib/msun/src/math.h: . Add prototytpes for sincos[fl](). * lib/msun/src/math_private.h: . Add RETURNV macros. This is needed to reset fpsetprec on I386 hardware for a function with type void. * lib/msun/src/s_sincos.c: . Implementation of sincos() where sin() and cos() were merged into one routine and possibly re-arranged for better performance. * lib/msun/src/s_sincosf.c: . Implementation of sincosf() where sinf() and cosf() were merged into one routine and possibly re-arranged for better performance. * lib/msun/src/s_sincosl.c: . Implementation of sincosl() where sinl() and cosl() were merged into one routine and possibly re-arranged for better performance. PR: 215977, 218300 Submitted by: Steven G. Kargl <sgk@troutmask.apl.washington.edu> Differential Revision: https://reviews.freebsd.org/D10765 MFC r321457 (by ngie): Mark :reduction as an expected failure It fails with clang 5.0+. PR: 220989 Reported by: Jenkins MFC r322418 (by rlibby): lib/msun: avoid referring to broken LDBL_MAX LDBL_MAX is broken on i386: https://lists.freebsd.org/pipermail/freebsd-numerics/2012-September/000288.html Gcc has produced +Infinity for LDBL_MAX on i386 and amd64 with -m32 for some time, and newer versions of gcc are now warning that the "floating constant exceeds range of 'long double'". Avoid this by referring to half the value of LDBL_MAX instead. Reviewed by: bde Approved by: markj (mentor) Sponsored by: Dell EMC Isilon MFC r322435 (by rlibby): Revert r322418, LDBL_MAX_EXP unsuitable for macro pasting on some arches Either need a different way to spell HALF_LDBL_MAX, or a different way to spell LDBL_MAX_EXP, or a different approach. Reported by: ian MFC r322921 (by ngie): Revert r321457 It doesn't fail after ^/head@r322855 (the releng_50 clang merge). PR: 220989 (cherry picked from commit 68896d08c13fabea18690d4c5369de8a5e24ba82)
* Merge the 386 and amd64 versions of the fenv.h, to make cc -m32kib2013-04-211-259/+0
| | | | | | | compilations which use fenv.h work. Reviewed by: tjil Sponsored by: The FreeBSD Foundation
* Optimise i387 trigonometric functions. Replace "andw 0x400,%ax \ jnz" withtijl2012-09-163-16/+16
| | | | "sahf \ jp", "fprem1" with "fprem" and "fstsw %ax" with "fnstsw %ax".
* Bugfix: feenableexcept() and fedisableexcept() should just return thedas2011-10-211-4/+4
| | | | | | old exception mask, not mask | ~FE_ALL_EXCEPT. MFC after: 2 weeks
* Use #include "fenv.h" instead of #include <fenv.h>. This makes itdas2011-10-161-1/+1
| | | | | | more convenient to compile the math library by itself. Requested by: bde
* Replace two lines accidentally removed in r226218. Thanks to bdedas2011-10-151-0/+3
| | | | for noticing this.
* Provide external definitions of all of the standardized functions indas2011-10-103-13/+28
| | | | | | | | | | | | | | | | | fenv.h that are currently inlined. The definitions are provided in fenv.c via 'extern inline' declaractions. This assumes the compiler handles 'extern inline' as specified in C99, which has been true under FreeBSD since 8.0. The goal is to eventually remove the 'static' keyword from the inline definitions in fenv.h, so that non-inlined references all wind up pointing to the same external definition like they're supposed to. I am deferring the second step to provide a window where newly-compiled apps will still link against old math libraries. (This isn't supported, but there's no need to cause undue breakage.) Reviewed by: stefanf, bde
* Add section .note.GNU-stack for assembly files used by 386 and amd64.kib2011-01-0748-0/+96
|
* Use __FBSDID() instead of RCSID() in most .S files under lib/msun/i386,dim2010-10-0120-40/+20
| | | | | | | | and one under lib/msun/amd64. This avoids adding the identifiers to the .text section, and moves them to the .comment section instead. Suggested by: bde Approved by: rpaulo (mentor)
* Placate new binutils, by using 16-bit %ax instead of 32-bit %eax as ankib2010-02-032-13/+19
| | | | | | | | | argument for fnstsw. Explicitely specify sizes for the XMM control and status word and X87 control and status words. Reviewed by: das Tested by: avg MFC after: 2 weeks
* Use, in uncovered part, the END() macro in order to improve debugging.attilio2009-05-2540-0/+40
| | | | | | | | | In this specific case, Valgrind won't get confused when analyzing such functions. Sponsored by: Sandvine Incorporated Tested by: emaste MFC: 3 days
* On i386, gcc truncates long double constants to double precisiondas2008-08-021-0/+86
| | | | | | | | | | | | | | | | at compile time regardless of the dynamic precision, and there's no way to disable this misfeature at compile time. Hence, it's impossible to generate the appropriate tables of constants for the long double inverse trig functions in a straightforward way on i386; this change hacks around the problem by encoding the underlying bits in the table. Note that these functions won't pass the regression test on i386, even with the FPU set to extended precision, because the regression test is similarly damaged by gcc. However, the tests all pass when compiled with a modified version of gcc. Reported by: bde
* Add assembly versions of remquol() and remainderl().das2008-03-303-2/+114
|
* Hook up sqrtl() to the build.das2008-03-021-1/+1
|
* MD implementations of sqrtl().das2008-03-021-0/+43
|
* Implement rintl(), nearbyintl(), lrintl(), and llrintl().das2008-01-144-1/+116
| | | | Thanks to bde@ for feedback and testing of rintl().
* Add logbl(3) to libm.das2007-12-172-1/+45
|
* Use C comments since we now preprocess these files with CPP.deischen2007-04-291-1/+3
|
* Fix a problem relating to fesetenv() clobbering i387 register stack.das2007-01-061-1/+12
| | | | | | | | | | | Details: As a side-effect of restoring a saved FP environment, fesetenv() overwrites the tag word, which indicates which i387 registers are in use. Normally this isn't a problem because the calling convention requires the register stack to be empty on function entry and exit. However, fesetenv() is inlined, so we need to tell gcc explicitly that the i387 registers get clobbered. PR: 85101
* Remove an unneeded fnstcw instruction.das2007-01-051-6/+5
| | | | Noticed by: bde
* Moved __BEGIN_DECLS up a little so that it covers __test_sse() and C++bde2006-10-141-2/+2
| | | | | | isn't broken, PR: 104425
* Removed the optimized asm versions of scalb() and scalbf(). Thesebde2006-07-053-62/+2
| | | | | | | | | | | | | | | | | | | | | | | | | functions are only for compatibility with obsolete standards. They shouldn't be used, so they shouldn't be optimized. Use the generic versions instead. This fixes scalbf() as a side effect. The optimized asm version left garbage on the FP stack. I fixed the corresponding bug in the optimized asm scalb() and scalbn() in 1996. NetBSD fixed it in scalb(), scalbn() and scalbnf() in 1999 but missed fixing it in scalbf(). Then in 2005 the bug was reimplemented in FreeBSD by importing NetBSD's scalbf(). The generic versions have slightly different error handling: - the asm versions blindly round the second parameter to a (floating point) integer and proceed, while the generic versions return NaN if this rounding changes the value. POSIX permits both behaviours (these functions are XSI extensions and the behaviour for a bogus non-integral second parameter is unspecified). Apart from this and the bug in scalbf(), the behaviour of the generic versions seems to be identical. (I only exhusatively tested generic_scalbf(1.0F, anyfloat) == asm_scalb(1.0F, anyfloat). This covers many representative corner cases involving NaNs and Infs but doesn't test exception flags. The brokenness of scalbf() showed up as weird behaviour after testing just 7 integer cases sequentially.)
* Add symbol versioning to libm.deischen2006-03-272-0/+15
|
* Fixed some comments added in rev.1.5.bde2005-10-301-5/+7
| | | | | | | | | | | The log message for 1.5 said that some small (one or two ulp) inaccuracies were fixed, and a comment implied that the critical change is to switch the rounding mode to to-nearest, with a switch of the precision to extended at no extra cost. Actually, the errors are very large (ucbtest finds ones of several hundred ulps), and it is the switch of the precision that is critical. Another comment was wrong about NaNs being handled sloppily.
* Prevent these functions from using stack outside of their frame.deischen2005-05-063-15/+15
| | | | | Reported by: Marc Olzheim <marcolz at stack dot nl> OK'd by: das
* More optimized math functions.das2005-04-169-4/+226
|
* Implement and document remquo() and remquof().das2005-03-253-2/+126
|
* Make the fenv.h routines work for programs that use SSE fordas2005-03-172-85/+262
| | | | | | | | | | | | | | | | | | | | | | | | | floating-point arithmetic on i386. Now I'm going to make excuses for why this code is kinda scary: - To avoid breaking the ABI with 5.3-RELEASE, we can't change sizeof(fenv_t). I stuck the saved mxcsr in some discontiguous reserved bits in the existing structure. - Attempting to access the mxcsr on older processors results in an illegal instruction exception, so support for SSE must be detected at runtime. (The extra baggage is optimized away if either the application or libm is compiled with -msse{,2}.) I didn't run tests to ensure that this doesn't SIGILL on older 486's lacking the cpuid instruction or on other processors lacking SSE. Results from running the fenv regression test on these processors would be appreciated. (You'll need to compile the test with -DNO_STRICT_DFL_ENV.) If you have an 80386, or if your processor supports SSE but the kernel didn't enable it, then you're probably out of luck. Also, I un-inlined some of the functions that grew larger as a result of this change, moving them from fenv.h to fenv.c.
* Replace fegetmask() and fesetmask() with feenableexcept(),das2005-03-161-4/+15
| | | | | | | | | | fedisableexcept(), and fegetexcept(). These two sets of routines provide the same functionality. I implemented the former as an undocumented internal interface to make the regression test easier to write. However, fe(enable|disable|get)except() is already part of glibc, and I would like to avoid gratuitous differences. The only major flaw in the glibc API is that there's no good way to report errors on processors that don't support all the unmasked exceptions.
* - Define the LDBL_PREC to be the number of significant bits in a longdas2005-03-071-0/+5
| | | | | double's mantissa. - Add an assembly version of scalbnl.
* Add scalbnl, also known as as ldexpl.das2005-03-071-0/+19
|
* Alias scalbnf as ldexpf. The two are identical in binarydas2005-03-071-0/+3
| | | | floating-point formats.
* Remove the i387 versions of atan(), atan2(), and atan2f().das2005-02-214-106/+3
| | | | | | | They are slower than the MI routines on modern hardware, except for degenerate cases such as the Pentium 4. PR: 67469
* Remove i387 versions of asin() and acos(). Although the hardwaredas2005-02-203-112/+1
| | | | | | | | instruction was faster on the 486, it's slower than our MD version on modern processors. Determined by: bde PR: 67469
* Remove the float versions of the i387 trig functions obtained fromdas2005-02-204-48/+2
| | | | | | | | NetBSD. They're buggy, giving particularly for inputs larger in magnitude than 2**63. Noticed by: bde PR: 67469
* Move machine-dependent crud to its own makefile.das2005-02-041-0/+11
|
* Remove wrappers and other cruft intended to support SVID, mistakes indas2005-02-0416-16/+16
| | | | | | | C90, and other arcana. Most of these features were never fully supported or enabled by default. Ok: bde, stefanf
* Mark all inline asms that read the floating-point control or statusdas2005-01-141-3/+3
| | | | | | | registers as volatile. Instructions that *wrote* to FP state were already marked volatile, but apparently gcc has license to move non-volatile asms past volatile asms. This broke amd64's feupdateenv at -O2 due to a WAR conflict between fnstsw and fldenv there.
* Import the subset of J.T. Conklin's single-precision x86-optimizeddas2005-01-1316-0/+276
| | | | | | | math routines that appear to be (a) correct and (b) faster than their MI counterparts on my Pentium 4. Obtained from: NetBSD
* Things that are broken, unneeded, and unused since 1997 belong in the attic.das2005-01-131-55/+0
|
* Faster lrint() and llrint() implementations for x86.das2005-01-112-0/+71
|
* Completely remove s_ilogb.S as the assembler implementation gives very littlestefanf2004-06-201-83/+0
| | | | | | speed improvement to none at all over the MI version. Submitted by: bde
* Return the same result as the MI version for 0.0, INFINITY and NaN.stefanf2004-06-191-1/+31
| | | | Reviewed by: standards@
* Add an fenv.h implementation for the i386 port.das2004-06-062-0/+263
| | | | Reviewed by: standards@
* Removed bogus 'l' suffixes in FP register to register instructions.bde2000-06-066-8/+8
|
* $Id$ -> $FreeBSD$peter1999-08-2824-24/+24
|
* Fixed wrong mnemonic `setnel' that gas happened to generate correct objectbde1997-04-301-2/+2
| | | | | | code for. Obtained from: a slightly different fix in NetBSD
* Include <machine/asm.h> instead of kernel-only <machine/asmacros.h>.bde1997-03-0924-48/+48
|
* Revert $FreeBSD$ to $Id$peter1997-02-2224-24/+24
|
* Compute (1 - x^2) as ((1 - x) * (1 + x)) instead of as (1 - x * x) tobde1997-02-202-11/+23
| | | | | | | | | | | | | | | avoid easily avoidable loss of precision when |x| is nearly 1. Extended (64-bit) precision only moves the meaning of "nearly" here. This probably could be done better by splitting up the range into |x| <= 0.5 and |x| > 0.5 like the C version. However, ucbtest does't report any errors in this version. Perhaps the C version should be used anyway. It's only 25% slower now on a P5, provided the C version of sqrt() isn't used, and the C version could be optimized better. Errors checked by: ucbtest
OpenPOWER on IntegriCloud