summaryrefslogtreecommitdiffstats
path: root/newlib
Commit message (Collapse)AuthorAgeFilesLines
* newlib: fix various gcc warningsCorinna Vinschen2018-08-0811-18/+24
| | | | | | | | | * unused variables * potentially used uninitialized * suggested bracketing * misleading indentation Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
* newlib: wordexp: drop dangerous fprintfCorinna Vinschen2018-08-081-2/+2
| | | | | | | | wordexp uses fprintf in a dangerous way. It uses an unchecked input string as format string, rather than as parameter to a %s. Replace fprintf with fputs. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
* newlib: newlocale: fix typo rendering ctype_ptr invalidCorinna Vinschen2018-08-081-1/+1
| | | | Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
* newlib: strftime: fix gcc warning on __ctlocCorinna Vinschen2018-08-081-5/+3
| | | | Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
* RTEMS: Add aligned_alloc() to crt0Sebastian Huber2018-08-081-1/+3
| | | | | | | | This is necessary to build the latest GCC 7 branch. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85904 Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
* Declare GNU-specific sched_getcpu()Sebastian Huber2018-08-071-0/+4
| | | | | | This is a glibc extension. Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
* RISC-V: Do not use _init/_finiSebastian Huber2018-07-303-0/+16
| | | | | | | Introduce new host configuration variable "have_init_fini" which is set to "yes" by default. Override it for RISC-V to "no". Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
* Add attributes to allocator functionsSebastian Huber2018-07-301-4/+5
| | | | Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
* FreeBSD compat. __alloc_size(), __alloc_align()Sebastian Huber2018-07-302-5/+5
| | | | | | | | Restore FreeBSD compatibility for __alloc_size() and __alloc_align(). This is a follow-up to commit e494b560350cabef94126a4478096aae89ae35a0. Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
* Define a new __alloc_size2 attribute to complement the exiting support.pfg2018-07-301-0/+2
| | | | | | | | | | | | | At least on GCC7 calling __alloc_size(x) twice is not equivalent to calling using the attribute once with two arguments. The later is the documented use in GCC documentation so add a new alloc_size(n, x) alternative to cover for the few places where it is used: basically: calloc(3), reallocarray(3) and mallocarray(9). Submitted by: Mark Millard MFC after: 3 days Reference: http://docs.freebsd.org/cgi/mid.cgi?F227842D-6BE2-4680-82E7-07906AF61CD7
* Remove lint support from system headers and MD x86 headers.kib2018-07-301-15/+3
| | | | | | | Reviewed by: dim, jhb Discussed with: imp Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D13156
* sys: further adoption of SPDX licensing ID tags.pfg2018-07-301-0/+2
| | | | | | | | | | | | | | Mainly focus on files that use BSD 3-Clause license. The Software Package Data Exchange (SPDX) group provides a specification to make it easier for automated tools to detect and summarize well known opensource licenses. We are gradually adopting the specification, noting that the tags are considered only advisory and do not, in any way, superceed or replace the license texts. Special thanks to Wind River for providing access to "The Duke of Highlander" tool: an older (2014) run over FreeBSD tree was useful as a starting point.
* Make _Static_assert() work with GCC in older C++ standards.ed@FreeBSD.org2018-07-301-1/+1
| | | | | | | | | | | GCC only activates C11 keywords in C mode, not C++ mode. This means that when targeting an older C++ standard, we cannot fall back to using _Static_assert(). In this case, do define _Static_assert() as a macro that uses a typedef'ed array. Discussed in: r322875 commit thread Reported by: Mark MIllard MFC after: 1 month
* ctype: Avoid GCC note in towctrans_l.cSebastian Huber2018-07-301-2/+2
| | | | | | | | | | The previous version genenerated the following GCC note: towctrans_l.c:44:1: note: offset of packed bit-field 'diff' has changed in GCC 4.4 caseconv_table [] = { ^~~~~~~~~~~~~~ Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
* ctype: Fix integer type for caseconv_entry::deltaSebastian Huber2018-07-301-1/+1
| | | | | | | | | | | | | | | The commit 46ba1675c457324b0eeef4670a09101ef3f34c50 accidently changed a bit-field from signed to unsigned. The caseconv_entry::delta must be a signed integer, see also "newlib/libc/ctype/caseconv.t". Unfortunately, a standard GCC/Newlib build is done without -Wsign-conversion. Using this warning option would have helped to avoid this bug: caseconv.t:2:22: warning: unsigned conversion from 'int' to 'unsigned int:17' changes value from '-32' to '131040' [-Wsign-conversion] {0x0061, 25, TOUP, -32}, Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
* Fix comparison between two character arraysJordi Sanfeliu2018-07-301-1/+1
| | | | | | | Hello, The member 'id' in the 'utmp' struct is not a numeric but a character array, hence the strncmp() function is needed to compare two members.
* Cygwin: define _POSIX_ASYNCHRONOUS_IOYaakov Selkowitz2018-07-251-1/+1
| | | | | | This feature is now available as of the recent AIO commits. Signed-off-by: Yaakov Selkowitz <yselkowi@redhat.com>
* ctype: Fix bitfield types on 16-bit targetsnewlib-snapshot-20180720Sebastian Huber2018-07-202-6/+8
| | | | | | | | | | This prevents errors like this: newlib/libc/ctype/categories.c:6:3: error: width of 'first' exceeds its type unsigned int first: 24; ^ Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
* RTEMS: Unconditionally define _off_t to int64_tSebastian Huber2018-07-201-4/+0
| | | | | | | Exotic RTEMS targets can define this back to int32_t as an exception if there are good reasons. Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
* Remove myself from MAINTAINERSDJ Delorie2018-07-191-4/+1
| | | | Stepping down from target-specific maintainerships.
* Print sign of NaN values to nano-vfprintf.Kumar Gala2018-07-171-0/+2
| | | | Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
* Fix to stop a fall-through in a switch statementJordi Sanfeliu2018-07-131-0/+1
| | | | | The following fixes a fall-through that prevented from reading the next entry in the UTMP file and terminated the program with an abort().
* strcmp.S: Improve performance for misaligned stringsSiddhesh Poyarekar2018-07-131-11/+40
| | | | | | | | | | | Replace the simple byte-wise compare in the misaligned case with a dword compare with page boundary checks in place. For simplicity I've chosen a 4K page boundary so that we don't have to query the actual page size on the system. This results in up to 3x improvement in performance in the unaligned case on falkor and about 2.5x improvement on mustang as measured using bench-strcmp in glibc.
* memcmp.S: optimize for medium to large sizesSiddhesh Poyarekar2018-07-131-44/+100
| | | | | | | | | | This improved memcmp provides a fast path for compares up to 16 bytes and then compares 16 bytes at a time, thus optimizing loads from both sources. The glibc memcmp microbenchmark retains performance (with an error of ~1ns) for smaller compare sizes and reduces up to 31% of execution time for compares up to 4K on the APM Mustang. On Qualcomm Falkor this improves to almost 48%, i.e. it is almost 2x improvement for sizes of 2K and above.
* Improve strncmp for mutually misaligned inputsSiddhesh Poyarekar2018-07-131-17/+79
| | | | | | | | | | | | | | | | The mutually misaligned inputs on aarch64 are compared with a simple byte copy, which is not very efficient. Enhance the comparison similar to strcmp by loading a double-word at a time. The peak performance improvement (i.e. 4k maxlen comparisons) due to this on the strncmp microbenchmark in glibc is as follows: falkor: 3.5x (up to 72% time reduction) cortex-a73: 3.5x (up to 71% time reduction) cortex-a53: 3.5x (up to 71% time reduction) All mutually misaligned inputs from 16 bytes maxlen onwards show upwards of 15% improvement and there is no measurable effect on the performance of aligned/mutually aligned inputs.
* Remove float compare option from sincosfSzabolcs Nagy2018-07-111-10/+1
| | | | | | | | | PREFER_FLOAT_COMPARISON setting was not correct as it could raise spurious exceptions. Fixing it is easy: just use ISLESS(x, y) instead of abstop12(x) < abstop12(y) with appropriate non-signaling definition for ISLESS. However it seems this setting is not very useful (there is only minor performance difference on various architectures), so remove this option for now.
* Fix the documentation comments for log_inline in powSzabolcs Nagy2018-07-111-3/+3
| | | | There was a typo and the arguments were not explained clearly.
* Fix namespace issues in sinf, cosf and sincosfSzabolcs Nagy2018-07-065-18/+19
| | | | | | Use const sincos_t for clarity instead of making the typedef const. Use __inv_pi4 and __sincosf_table to avoid namespace issues with static linking.
* Fix large ulp error in pow without fma very near 1.0Szabolcs Nagy2018-07-061-2/+4
| | | | | | | | | | | The !HAVE_FAST_FMA code path split r = z/c - 1 into r = rhi + rlo such that when z = 1-tiny and c = 1 then rlo and rhi could have much larger magnitude than r which later caused large rounding errors. So do a nearest rounding instead of truncation at the split. In newlib with default settings this was observable on some arm targets that enable the new math code but has no fma.
* Change the return type of converttoint and document the semanticsSzabolcs Nagy2018-07-061-1/+9
| | | | | | | | | | | | | | | | | | | The roundtoint and converttoint internal functions are only called with small values, so 32 bit result is enough for converttoint and it is a signed int conversion so the natural return type is int32_t. The original idea was to help the compiler keeping the result in uint64_t, then it's clear that no sign extension is needed and there is no accidental undefined or implementation defined signed int arithmetics. But it turns out gcc does a good job with inlining so changing the type has no overhead and the semantics of the conversion is less surprising this way. Since we want to allow the asuint64 (x + 0x1.8p52) style conversion, the top bits were never usable and the existing code ensures that only the bottom 32 bits of the conversion result are used. In newlib with default settings only aarch64 is affected and there is no significant code generation change with gcc after the patch.
* Remove unused TOINT_RINT and TOINT_SHIFT macrosSzabolcs Nagy2018-07-062-10/+1
| | | | Only have separate code paths for TOINT_INTRINSICS and !TOINT_INTRINSICS.
* Move __HAVE_FAST_FMA to math_config.hSzabolcs Nagy2018-07-067-35/+21
| | | | | | Define it consistently with other HAVE_* macros that only affect code using math_config.h. This is also closer to the Arm Optimized Routines code.
* Fix code style and comments of new math codeSzabolcs Nagy2018-07-068-74/+134
| | | | | | | Synchronize code style and comments with Arm Optimized Routines, there are no code changes in this patch. This ensures different projects using the same code have consistent code style so bug fix patches can be applied more easily.
* Fix newlib functions perror()/psignal() not to use writev().Takashi Yano2018-07-052-37/+39
| | | | | | | | This fix is for some platforms which do not have writev(). *perror.c: Use _write_r() instead of writev(). *psignal.c: Use write() insetad of writev(). Revise commit: d4f4e7ae1be1bcf8c021f2b0865aafc16b338aa3
* Fix a bug of perror()/psignal() that changes the orientation of stderr.Takashi Yano2018-07-042-8/+54
| | | | | | * perror.c: Fix the problem that perror() changes the orientation of stderr to byte-oriented mode if stderr is not oriented yet. * psignal.c: Ditto.
* newlib: enable new math functions on CygwinCorinna Vinschen2018-06-271-0/+4
| | | | Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
* New pow implementationSzabolcs Nagy2018-06-278-5/+607
| | | | | | | | | | | | The new implementation is provided under !__OBSOLETE_MATH, it uses ISO C99 code. With default settings the worst case error in nearest rounding mode is 0.54 ULP with inlined fma and fma contraction. It uses a 4 KB lookup table in addition to the table in exp_data.c, on aarch64 .text+.rodata size of libm.a is increased by 2295 bytes. Improvements on Cortex-A72: latency: 3.3x thruput: 4.9x
* New log2 implementationSzabolcs Nagy2018-06-276-4/+399
| | | | | | | | | | | | | | | The new implementation is provided under !__OBSOLETE_MATH, it uses ISO C99 code. With default settings the worst case error in nearest rounding mode is 0.547 ULP with inlined fma and fma contraction. It uses a 1 KB lookup table, on aarch64 .text+.rodata size of libm.a is increased by 1584 bytes. Note that the math.h header defines log2(x) to be log(x)/Ln2, this is not changed, so the new code is only used if that macro is suppressed. Improvements on Cortex-A72: latency: 2.0x thruput: 2.2x
* New log implementationSzabolcs Nagy2018-06-279-4/+744
| | | | | | | | | | | | | | | | | | | | The new implementations are provided under !__OBSOLETE_MATH, it uses ISO C99 code. With default settings the worst case error in nearest rounding mode is 0.519 ULP with inlined fma and fma contraction. It uses a 2 KB lookup table, on aarch64 .text+.rodata size of libm.a is increased by 1703 bytes. The w_log.c wrapper is disabled since error handling is inline in the new code. New __HAVE_FAST_FMA and __HAVE_FAST_FMA_DEFAULT feature macros were added to enable selecting between the code path that uses fma and the one that does not. Targets supposed to set __HAVE_FAST_FMA_DEFAULT if they have single instruction fma and the compiler can actually inline it (gcc has __FP_FAST_FMA macro but that does not guarantee inlining with -fno-builtin-fma). Improvements on Cortex-A72: latency: 1.9x thruput: 2.3x
* New exp and exp2 implementationsSzabolcs Nagy2018-06-2711-5/+1138
| | | | | | | | | | | | | | | | | | | | | | The new implementations are provided under !__OBSOLETE_MATH, they use ISO C99 code. There are several settings, with the default one the worst case error in nearest rounding mode is 0.509 ULP for exp and 0.507 ULP for exp2 when a multiply and add is contracted into an fma. They use a shared 2 KB lookup table, on aarch64 .text+.rodata size of libm.a is increased by 1868 bytes. The w_*.c wrappers are disabled for the new code as it takes care of error handling inline. The old exp2(x) code used to be just pow(2,x) so the speedup there is more significant. The file name has no special prefix to avoid any name collision with existing files. Improvements on Cortex-A72: exp latency: 3.2x exp thruput: 4.1x exp2 latency: 7.8x exp2 thruput: 18.8x
* Use uint32_t sign argument to math error functionsSzabolcs Nagy2018-06-273-13/+13
| | | | | | | | | | This change is equivalent to the commit https://github.com/ARM-software/optimized-routines/commit/c65db17340782d647c49e17cbba244862dc38402 and only affects code that is from the Arm optimized-routines project. It does not affect the observable behaviour, but the code generation can be different on 64bit targets. The intention is to make the portable semantics of the code obvious by using a fixed size type.
* Fix Unicode table.Takashi Yano2018-06-262-26/+16
| | | | | | | | | * (mkcategories): Fix a bug that outputs incorrect Unicode category table for code point ranges. * (categories.t): Rebuild it using the bug-fixed mkcategories. This fixes the problem reported in the following post. https://cygwin.com/ml/cygwin/2018-06/msg00248.html
* Revert "Remove -fno-builtin to allow gcc to inline functions such as fabs, ↵Corinna Vinschen2018-06-268-8/+8
| | | | | | | | floor, creal, imag." This reverts commit c077b9de99c6980a0c1631ec2938f6ff2cf0c289. Yet another accidental commit...
* Remove -fno-builtin to allow gcc to inline functions such as fabs, floor, ↵Jon Beniston2018-06-258-8/+8
| | | | creal, imag.
* Improve performance of sinf/cosf/sincosfWilco Dijkstra2018-06-2111-6/+667
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Here is the correct patch with both filenames and int cast fixed: This patch is a complete rewrite of sinf, cosf and sincosf. The new version is significantly faster, as well as simple and accurate. The worst-case ULP is 0.56072, maximum relative error is 0.5303p-23 over all 4 billion inputs. In non-nearest rounding modes the error is 1ULP. The algorithm uses 3 main cases: small inputs which don't need argument reduction, small inputs which need a simple range reduction and large inputs requiring complex range reduction. The code uses approximate integer comparisons to quickly decide between these cases - on some targets this may be slow, so this can be configured to use floating point comparisons. The small range reducer uses a single reduction step to handle values up to 120.0. It is fastest on targets which support inlined round instructions. The large range reducer uses integer arithmetic for simplicity. It does a 32x96 bit multiply to compute a 64-bit modulo result. This is more than accurate enough to handle the worst-case cancellation for values close to an integer multiple of PI/4. It could be further optimized, however it is already much faster than necessary. Simple benchmark showing speedup factor on AArch64 for various ranges: range 0.7853982 sinf 1.7 cosf 2.2 sincosf 2.8 range 1.570796 sinf 1.9 cosf 1.9 sincosf 2.7 range 3.141593 sinf 2.0 cosf 2.0 sincosf 3.5 range 6.283185 sinf 2.3 cosf 2.3 sincosf 4.2 range 125.6637 sinf 2.9 cosf 3.0 sincosf 5.1 range 1.1259e15 sinf 26.8 cosf 26.8 sincosf 45.2 ChangeLog: 2018-05-18 Wilco Dijkstra <wdijkstr@arm.com> * newlib/libm/common/Makefile.in: Regenerated. * newlib/libm/common/Makefile.am: Add sinf.c, cosf.c, sincosf.c sincosf.h, sincosf_data.c. Add -fbuiltin -fno-math-errno to CFLAGS. * newlib/libm/common/math_config.h: Add HAVE_FAST_ROUND, HAVE_FAST_LROUND, roundtoint, converttoint, force_eval_float, force_eval_double, eval_as_float, eval_as_double, likely, unlikely. * newlib/libm/common/cosf.c: New file. * newlib/libm/common/sinf.c: Likewise. * newlib/libm/common/sincosf.h: Likewise. * newlib/libm/common/sincosf.c: Likewise. * newlib/libm/common/sincosf_data.c: Likewise. * newlib/libm/math/sf_cos.c: Add #if to build conditionally. * newlib/libm/math/sf_sin.c: Likewise. * newlib/libm/math/wf_sincos.c: Likewise. --
* Revert "Improve performance of sinf/cosf/sincosf"Corinna Vinschen2018-06-2111-667/+6
| | | | | | This reverts commit fca80a9d1b3fa6620cdaccec6b726eef1a6530a1. Accidentally pushed a preliminary version
* libm/common/s_round.c (round): Add cast for 16-bit CPUsJon Beniston2018-06-211-1/+1
|
* Improve performance of sinf/cosf/sincosfWilco Dijkstra2018-06-1911-6/+667
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch is a complete rewrite of sinf, cosf and sincosf. The new version is significantly faster, as well as simple and accurate. The worst-case ULP is 0.56072, maximum relative error is 0.5303p-23 over all 4 billion inputs. In non-nearest rounding modes the error is 1ULP. The algorithm uses 3 main cases: small inputs which don't need argument reduction, small inputs which need a simple range reduction and large inputs requiring complex range reduction. The code uses approximate integer comparisons to quickly decide between these cases - on some targets this may be slow, so this can be configured to use floating point comparisons. The small range reducer uses a single reduction step to handle values up to 120.0. It is fastest on targets which support inlined round instructions. The large range reducer uses integer arithmetic for simplicity. It does a 32x96 bit multiply to compute a 64-bit modulo result. This is more than accurate enough to handle the worst-case cancellation for values close to an integer multiple of PI/4. It could be further optimized, however it is already much faster than necessary. Simple benchmark showing speedup factor on AArch64 for various ranges: range 0.7853982 sinf 1.7 cosf 2.2 sincosf 2.8 range 1.570796 sinf 1.9 cosf 1.9 sincosf 2.7 range 3.141593 sinf 2.0 cosf 2.0 sincosf 3.5 range 6.283185 sinf 2.3 cosf 2.3 sincosf 4.2 range 125.6637 sinf 2.9 cosf 3.0 sincosf 5.1 range 1.1259e15 sinf 26.8 cosf 26.8 sincosf 45.2 ChangeLog: 2018-06-18 Wilco Dijkstra <wdijkstr@arm.com> * newlib/libm/common/Makefile.in: Regenerated. * newlib/libm/common/Makefile.am: Add sinf.c, cosf.c, sincosf.c sincosf.h, sincosf_data.c. Add -fbuiltin -fno-math-errno to CFLAGS. * newlib/libm/common/math_config.h: Add HAVE_FAST_ROUND, HAVE_FAST_LROUND, roundtoint, converttoint, force_eval_float, force_eval_double, eval_as_float, eval_as_double, likely, unlikely. * newlib/libm/common/cosf.c: New file. * newlib/libm/common/sinf.c: Likewise. * newlib/libm/common/sincosf.h: Likewise. * newlib/libm/common/sincosf.c: Likewise. * newlib/libm/common/sincosf_data.c: Likewise. * newlib/libm/math/sf_cos.c: Add #if to build conditionally. * newlib/libm/math/sf_sin.c: Likewise. * newlib/libm/math/wf_sincos.c: Likewise. --
* newlib: getopt now permutes multi-flag options correctlyThomas Kindler2018-06-182-13/+23
| | | | | | | Previously, "test 1 2 3 -a -b -c" was permuted to "test -a -b -c 1 2 3", but "test 1 2 3 -abc" was left as "test 1 2 3 -abc". Signed-off-by: Thomas Kindler <mail+newlib@t-kindler.de>
* Fix issue with malloc_extend_topJeff Johnston2018-05-291-1/+6
| | | | | | | | | - when calculating a correction to align next brk to page boundary, ensure that the correction is less than a page size - if allocating the correction fails, ensure that the top size is set to brk + sbrk_size (minus any front alignment made) Signed-off-by: Jeff Johnston <jjohnstn@redhat.com>