aboutsummaryrefslogtreecommitdiff
path: root/newlib
AgeCommit message (Collapse)AuthorFilesLines
2020-07-03libm: machine: Add missing sparc and mips configurationCorinna Vinschen7-3/+12683
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2020-07-03mips fenv supportEshan dhawan via Newlib19-0/+662
Signed-off-by: Eshan dhawan <eshandhawan51@gmail.com>
2020-07-03SPARC fenv supportEshan dhawan via Newlib17-0/+546
Signed-off-by: Eshan dhawan <eshandhawan51@gmail.com>
2020-07-02fenv aarch64 supportEshan dhawan via Newlib16-3/+515
Signed-off-by: Eshan dhawan <eshandhawan51@gmail.com>
2020-06-09fenv support armEshan dhawan via Newlib22-3/+1339
Signed-off-by: Eshan dhawan <eshandhawan51@gmail.com>
2020-06-09Regenerate libm/machine configuration files for powerpcJeff Johnston4-3/+6342
2020-06-03hard float support for PowerPC taken from FreeBSDEshan dhawan via Newlib18-0/+491
Signed-off-by: Eshan dhawan <eshandhawan51@gmail.com>
2020-05-19Reimplement aligned_allocSzabolcs Nagy1-32/+30
The original implementation had multiple issues: - Only worked when posix_memalign was available (Linux, RTEMS). - Violated C11 link namespace rules by calling posix_memalign. - Failed to set errno on error. These can be fixed by essentially using the same implementation for aligned_alloc as for memalign, i.e. simply calling _memalign_r (which is always available and a "more reserved name" although technically still not in the reserved link namespace, at least code written in c cannot define a colliding symbol, newlib has plenty such namespace issues so this is fine). It is not clear what the right policy is when MALLOC_PROVIDED is set, currently that does not cover aligned_alloc so it is kept that way. Tested on aarch64-none-elf
2020-03-26newlib/libm/math: Make pow/powf return qnan for snan argKeith Packard via Newlib2-7/+16
The IEEE spec for pow only has special case for x**0 and 1**y when x/y are quiet NaN. For signaling NaN, the general case applies and these functions should signal the invalid exception and return a quiet NaN. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-03-26newlib/libm/common: Don't re-convert float to bits in modf/modffKeith Packard via Newlib2-15/+5
These functions shared a pattern of re-converting the argument to bits when returning +/-0. Skip that as the initial conversion still has the sign bit. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-03-26newlib/libm/common: Fix modf/modff returning snanKeith Packard via Newlib2-16/+4
Recent GCC appears to elide multiplication by 1, which causes snan parameters to be returned unchanged through *iptr. Use the existing conversion of snan to qnan to also set the correct result in *iptr instead. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-03-26Fix spurious underflow exceptions for Bessel functions for double(from glibc ↵Joseph S. Myers4-9/+13
bug 14155) This fix comes from glibc, from files which originated from the same place as the newlib files. Those files in glibc carry the same license as the newlib files. Bug 14155 is spurious underflow exceptions from Bessel functions for large arguments. (The correct results for large x are roughly constant * sin or cos (x + constant) / sqrt (x), so no underflow exceptions should occur based on the final result.) There are various places underflows may occur in the intermediate calculations that cause the failures listed in that bug. This patch fixes problems for the double version where underflows occur in calculating the intermediate functions P and Q (in particular, x**-12 gets computed while calculating Q). Appropriate approximations are used for P and Q for arguments at least 0x1p28 and above to avoid the underflows. For sufficiently large x - 0x1p129 and above - the code already has a cut-off to avoid calculating P and Q at all, which means the approximations -0.125 / x and 0.375 / x can't themselves cause underflows calculating Q. This cut-off is heuristically reasonable for the point beyond which Q can be neglected (based on expecting around 0x1p-64 to be the least absolute value of sin or cos for large arguments representable in double). The float versions use a cut-off 0x1p17, which is less heuristically justifiable but should still only affect values near zeroes of the Bessel functions where these implementations are intrinsically inaccurate anyway (bugs 14469-14472), and should serve to avoid underflows (the float underflow for jn in bug 14155 probably comes from the recurrence to compute jn). ldbl-96 uses 0x1p129, which may not really be enough heuristically (0x1p143 or so might be safer - 143 = 64 + 79, number of mantissa bits plus total number of significant bits in representation) but again should avoid underflows and only affect values where the code is substantially inaccurate anyway. ldbl-128 and ldbl-128ibm share a completely different implementation with no such cut-off, which I propose to fix separately. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-03-19Fix hypotf missing mask in hi+lo decompositionFabian Schriever1-2/+2
Add the missing mask for the decomposition of hi+lo which caused some errors of 1-2 ULP. This change is taken over from FreeBSD: https://github.com/freebsd/freebsd/commit/95436ce20dab5a34ba46373410b96411b1734578 Additionally I've removed some variable assignments which were never read before being overwritten again in the next 2 lines.
2020-03-19Fix modf/f for NaN inputFabian Schriever2-0/+2
For NaN input the modf/f procedures should return NaN instead of zero with the sign of the input.
2020-03-18Fix for k_tan.c specific inputsFabian Schriever1-8/+21
This fix for k_tan.c is a copy from fdlibm version 5.3 (see also http://www.netlib.org/fdlibm/readme), adjusted to use the macros available in newlib (SET_LOW_WORD). This fix reduces the ULP error of the value shown in the fdlibm readme (tan(1.7765241907548024E+269)) to 0.45 (thereby reducing the error by 1). This issue only happens for large numbers that get reduced by the range reduction to a value smaller in magnitude than 2^-28, that is also reduced an uneven number of times. This seems rather unlikely given that one ULP is (much) larger than 2^-28 for the values that may cause an issue. Although given the sheer number of values a double can represent, it is still possible that there are more affected values, finding them however will be quite hard, if not impossible. We also took a look at how another library (libm in FreeBSD) handles the issue: In FreeBSD the complete if branch which checks for values smaller than 2^-28 (or rather 2^-27, another change done by FreeBSD) is moved out of the kernel function and into the external function. This means that the value that gets checked for this condition is the unreduced value. Therefore the input value which caused a problem in the fdlibm/newlib kernel tan will run through the full polynomial, including the careful calculation of -1/(x+r). So the difference is really whether r or y is used. r = y + p with p being the result of the polynomial with 1/3*x^3 being the largest (and magnitude defining) value. With x being <2^-27 we therefore know that p is smaller than y (y has to be at least the size of the value of x last mantissa bit divided by 2, which is at least x*2^-51 for doubles) by enough to warrant saying that r ~ y. So we can conclude that the general implementation of this special case is the same, FreeBSD simply has a different philosophy on when to handle especially small numbers.
2020-03-13RTEMS: Include missing header and fix stubSebastian Huber1-1/+2
Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
2020-03-11Fix truncf for sNaN inputFabian Schriever1-1/+1
Make line 47 in sf_trunc.c reachable. While converting the double precision function trunc to the single precision version truncf an error was introduced into the special case. This special case is meant to catch both NaNs and infinities, however qNaNs and infinities work just fine with the simple return of x (line 51). The only error occurs for sNaNs where the same sNaN is returned and no invalid exception is raised.
2020-03-10i386/fenv.c: Include fenv.c implementation shared with x86_64, not stubJoel Sherrill1-1/+1
2020-03-10Fix error in fdim/f for infinitiesFabian Schriever2-8/+2
The comparison c == FP_INFINITE causes the function to return +inf as it expects x = +inf to always be larger than y. This shortcut causes several issues as it also returns +inf for the following cases: - fdim(+inf, +inf), expected (as per C99): +0.0 - fdim(-inf, any non NaN), expected: +0.0 I don't see a reason to keep the comparison as all the infinity cases return the correct result using just the ternary operation.
2020-03-09Fix error in exp in magnitude [2e-32,2e-28]Fabian Schriever2-2/+2
While testing the exp function we noticed some errors at the specified magnitude. Within this range the exp function returns the input value +1 as an output. We chose to run a test of 1m exponentially spaced values in the ranges [-2^-27,-2^-32] and [2^-32,2^-27] which showed 7603 and 3912 results with an error of >=0.5 ULP (compared with MPFR in 128 bit) with the highest being 0.56 ULP and 0.53 ULP. It's easy to fix by changing the magnitude at which the input value +1 is returned from <2^-28 to <2^-32 and using the polynomial instead. This reduces the number of results with an error of >=0.5 ULP to 485 and 479 in above tests, all of which are exactly 0.5 ULP. As we were already checking on exp we also took a look at expf. For expf the magnitude where the input value +1 is returned can be increased from <2^-28 to <2^-23 without accuracy loss for a slight performance improvement. To ensure this was the correct value we tested all values in the ranges [-2^-17,-2^-28] and [2^-28,2^-17] (~92.3m values each).
2020-03-03Fix error in float trig. function range reductionFabian Schriever1-1/+1
The single-precision trigonometric functions show rather high errors in specific ranges starting at about 30000 radians. For example the sinf procedure produces an error of 7626.55 ULP with the input 5.195880078125e+04 (0x474AF6CD) (compared with MPFR in 128bit precision). For the test we used 100k values evenly spaced in the range of [30k, 70k]. The issues are periodic at higher ranges. This error was introduced when the double precision range reduction was first converted to float. The shift by 8 bits always returns 0 as iq is never higher than 255. The fix reduces the error of the example above to 0.45 ULP, highest error within the test set fell to 1.31 ULP, which is not perfect, but still a significant improvement. Testing other previously erroneous ranges no longer show particularly large accuracy errors.
2020-03-02Fix error in powf for (-1.0, NaN) inputFabian Schriever1-1/+1
Prevent confusion between -1.0 and 1.0 in powf. The corresponding similar error was previously fixed for pow (see commit bb25dd1b)
2020-03-02arm: Finish moving newlib to unified syntax for Thumb1Richard Earnshaw1-7/+8
Most code in newlib already uses unified syntax, but just a couple of laggards remain. This patch removes these and means the the entire code base has now been converted.
2020-02-25x86_64/i386 fenv: Replace symlink with include fenv_stub.cJoel Sherrill23-23/+161
Having symlinks for these files led to an issue reported to the RTEMS Project that showed up using some tar for native Windows to unpack the newlib sources. It creates symlinks in the tar file as copies of the files the symlinks point to. If the links appear in the tar file before the source exists, it cannot copy the file. The solution in this patch is to convert the files that are symbolic links into simple files which include the file they were linked to. This should be more portable and avoids the symbolinc link problem.
2020-02-20newlib/libc/include/devctl.h: Add extern "C" wrapperJoel Sherrill1-0/+8
Adding this was necessary to allow posix_devctl() from C++.
2020-02-18Locale modifier "@cjksingle" to enforce single-width CJK width.Thomas Wolff2-4/+17
This option follows a proposal in the Terminals Working Group Specifications (https://gitlab.freedesktop.org/terminal-wg/specifications/issues/9#note_406682). It makes locale width consistent with the corresponding mintty feature.
2020-02-14pow: fix pow(-1.0, NaN)Nicolas Brunie1-1/+1
I think I may have encountered a bug in the implementation of pow: pow(-1.0, NaN) returns 1.0 when it should return NaN. Because ix is used to check input vs 1.0 rather than hx, -1.0 is mistaken for 1.0
2020-02-06Typo in license for newlib/libc/stdio/flags.cKeith Packard1-1/+1
Fix spelling: MERCHANT I BILITY -> MERCHANT A BILITY Signed-off-by: Keith Packard <keithp@keithp.com>
2020-02-06Typo in license terms for newlib/libm/common/log2.cKeith Packard1-1/+1
The closing quotes were in the wrong place Signed-off-by: Keith Packard <keithp@keithp.com>
2020-01-29Use remove-advertising-clause script to edit BSD licensesKeith Packard274-924/+281
This edits licenses held by Berkeley and NetBSD, both of which have removed the advertising requirement from their licenses. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-01-29Revert "newlib: fix fseek optimization with SEEK_CUR"Corinna Vinschen2-12/+50
This reverts commit 59362c80e3a02c011fd0ef3d7f07a20098d2a9d5. This breaks gnulib's autoconf test for POSIX compatibility of fflush/fseek. After fflush/fseek, ftello and lseek are out of sync, with lseek having the wrong offset. This breaks backward compatibility with Cygwin applications. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2020-01-21Bump up newlib release to 3.3.0Jeff Johnston109-1083/+1083
2020-01-21Change the reent verify check option to document disabling itJeff Johnston3-5/+5
- also change the handling of default_newlib_reent_check_verify to be the same as other default variables in configure.host - regenerate newlib/configure
2020-01-21Default newlib_reent_check_verify to yes in configure.hostJeff Johnston1-3/+3
2020-01-21riscv: Map between ieeefp.h exception bits and RISC-V FCSR bitsKeith Packard1-3/+37
If we had architecture-specific exception bits, we could just set them to match the processor, but instead ieeefp.h is shared by all targets so we need to map between the public values and the register contents. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-01-21riscv: Add 'break' statements to fpsetround switchKeith Packard1-4/+4
This makes the fpsetround function actually do something rather than just return -1 due to the default 'fall-through' behavior of the switch statement. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-01-21riscv: Use current pseudo-instructions to access the FCSR registerKeith Packard1-2/+2
Use fscsr and frcsr to store and read the FCSR register instead of fssr and frsr. Signed-off-by: Keith Packard <keithp@keithp.com>
2020-01-09Prevent more NULL ptr accesses due to Balloc out of memoryJeff Johnston3-9/+9
- fix gdtoa-gethex.c, ldtoa.c, and strtodg.c to use eBalloc
2020-01-02Bump up release to 3.2.0 for yearly snapshotnewlib-snapshot-20200102newlib-3.2.0Jeff Johnston111-1094/+1111
2019-12-29doc: add more details about adding documentation to HOWTOJon Turney1-2/+4
Add a little more detail to the checklist for adding documentation Also update the list of supported sections
2019-12-20Optimize setjmp/longjmp for moxie.Anthony Green2-87/+39
We don't need to save/restore every register -- just those we don't expect to be trashed by function calls.
2019-12-18Don't display trailing '.' in _dcvtKeith Packard1-3/+12
In the two helper functions that _dcvt calls for 'f' and 'e' mode, if there are no digits to display after the decimal point, don't add one. Signed-off-by: Keith Packard <keithp@keithp.com>
2019-12-18Fix gcvt to always show 'ndigits' of precisionKeith Packard1-11/+7
Leading zeros after the decimal point should not count towards the 'ndigits' limit. This makes gcvt match glibc and the posix gcvt man page. Signed-off-by: Keith Packard <keithp@keithp.com>
2019-12-18Fix fcvt to only show 'ndigit' past decimalKeith Packard1-8/+1
Even if the number is really small and this means showing *no* digits. This makes newlib match glibc, and the fcvt posix man page. Signed-off-by: Keith Packard <keithp@keithp.com>
2019-12-18doc: Untabify python scripts used for making man pagesJon Turney2-219/+219
These scripts fail with a TabError exception if 'python' is python3, as mixing tabs and spaces in indentation is forbidden in python3.
2019-12-17Set __IEEE_LITTLE_ENDIAN for _XTENSA_EL__ (ESP32)Keith Packard1-0/+4
Signed-off-by: Keith Packard <keithp@keithp.com>
2019-12-17Return EINVAL for illegal base in strtolKeith Packard1-2/+7
Signed-off-by: Keith Packard <keithp@keithp.com>
2019-12-16strtold: set errno to ERANGE on underflow per POSIXBruno Haible1-0/+21
https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtod.html
2019-12-13Fix setjmp/longjmp for the moxie port.Anthony Green2-25/+48
These functions needs to save and restore the stack frame, because that's where the return address is stored.
2019-12-02libm: switch sf_log1p from double error routines to floatKeith Packard2-4/+2
sf_log1p was using __math_divzero and __math_invalid, which drag in a pile of double-precision code. Switch to using the single-precision variants. This also required making those available in __OBSOLETE_MATH mode. Signed-off-by: Keith Packard <keithp@keithp.com>