nsz [Tue, 20 Mar 2012 03:09:14 +0000 (04:09 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl
Rich Felker [Tue, 20 Mar 2012 03:08:49 +0000 (23:08 -0400)]
use alternate formula for acos asm to avoid loss of precision
nsz [Tue, 20 Mar 2012 02:13:26 +0000 (03:13 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl
Rich Felker [Tue, 20 Mar 2012 02:07:43 +0000 (22:07 -0400)]
Merge remote branch 'nsz/master'
Rich Felker [Tue, 20 Mar 2012 01:55:53 +0000 (21:55 -0400)]
fix exp asm
exponents (base 2) near 16383 were broken due to (1) wrong cutoff, and
(2) inability to fit the necessary range of scalings into a long
double value.
as a solution, we fall back to using frndint/fscale for insanely large
exponents, and also have to special-case infinities here to avoid
inf-inf generating nan.
thankfully the costly code never runs in normal usage cases.
nsz [Mon, 19 Mar 2012 22:55:06 +0000 (23:55 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl
nsz [Mon, 19 Mar 2012 22:41:19 +0000 (23:41 +0100)]
code cleanup of named constants
zero, one, two, half are replaced by const literals
The policy was to use the f suffix for float consts (1.0f),
but don't use suffix for long double consts (these consts
can be exactly represented as double).
nsz [Mon, 19 Mar 2012 22:39:47 +0000 (23:39 +0100)]
fix remainder*.c: remove useless long double cast
nsz [Mon, 19 Mar 2012 22:30:45 +0000 (23:30 +0100)]
don't try to create non-standard denormalization signal
Underflow exception is only raised when the result is
invalid, but fmod is always exact. x87 has a denormalization
exception, but that's nonstandard. And the superflous *1.0
will be optimized away by any compiler that does not honor
signaling nans.
Rich Felker [Mon, 19 Mar 2012 22:30:35 +0000 (18:30 -0400)]
Merge remote branch 'nsz/master'
nsz [Mon, 19 Mar 2012 22:27:45 +0000 (23:27 +0100)]
new modff.c code, fix nan handling in modfl
nsz [Mon, 19 Mar 2012 21:57:58 +0000 (22:57 +0100)]
use scalbn or *2.0 instead of ldexp, fix fmal
Some code assumed ldexp(x, 1) is faster than 2.0*x,
but ldexp is a wrapper around scalbn which uses
multiplications inside, so this optimization is
wrong.
This commit also fixes fmal which accidentally
used ldexp instead of ldexpl loosing precision.
There are various additional changes from the
work-in-progress const cleanups.
nsz [Mon, 19 Mar 2012 21:49:03 +0000 (22:49 +0100)]
fix long double const workaround in cbrtl
nsz [Mon, 19 Mar 2012 18:26:31 +0000 (19:26 +0100)]
don't inline __rem_pio2l so the code size is smaller
nsz [Mon, 19 Mar 2012 18:14:32 +0000 (19:14 +0100)]
minor fix in __tanl (get sign properly)
Rich Felker [Mon, 19 Mar 2012 17:58:47 +0000 (13:58 -0400)]
bug fix: wrong opcode for writing long long
nsz [Mon, 19 Mar 2012 17:52:17 +0000 (18:52 +0100)]
remove long double const workarounds
Some long double consts were stored in two doubles as a workaround
for x86_64 and i386 with the following comment:
/* Long double constants are slow on these arches, and broken on i386. */
This is most likely old gcc bug related to the default x87 fpu
precision setting (it's double instead of double extended on BSD).
nsz [Mon, 19 Mar 2012 17:06:06 +0000 (18:06 +0100)]
fix erfl wrapper for long double==double case
Rich Felker [Mon, 19 Mar 2012 14:59:41 +0000 (10:59 -0400)]
asm for log1p
Rich Felker [Mon, 19 Mar 2012 14:43:28 +0000 (10:43 -0400)]
asm for log2
Rich Felker [Mon, 19 Mar 2012 13:42:51 +0000 (09:42 -0400)]
asm for remquo
this could perhaps use some additional testing for corner cases, but
it seems to be correct.
Rich Felker [Mon, 19 Mar 2012 13:00:30 +0000 (09:00 -0400)]
optimize exponential asm for i386
up to 30% faster exp2 by avoiding slow frndint and fscale functions.
expm1 also takes a much more direct path for small arguments (the
expected usage case).
Rich Felker [Mon, 19 Mar 2012 10:28:22 +0000 (06:28 -0400)]
Merge remote branch 'nsz/master'
Rich Felker [Mon, 19 Mar 2012 10:22:54 +0000 (06:22 -0400)]
fix broken modf family functions
Rich Felker [Mon, 19 Mar 2012 09:56:41 +0000 (05:56 -0400)]
asm for modf functions
nsz [Mon, 19 Mar 2012 09:54:07 +0000 (10:54 +0100)]
simplify scalbn*.c implementations
The old scalbn.c was wrong and slow, the new one is just slow.
(scalbn(0x1p+1023,-2097) should give 0x1p-1074, but the old code gave 0)
nsz [Mon, 19 Mar 2012 09:50:42 +0000 (10:50 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl
Rich Felker [Mon, 19 Mar 2012 09:42:04 +0000 (05:42 -0400)]
asm for floor/ceil/trunc
nsz [Mon, 19 Mar 2012 09:20:24 +0000 (10:20 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl
Rich Felker [Mon, 19 Mar 2012 09:15:30 +0000 (05:15 -0400)]
asm for scalbn family
unlike some implementations, these functions perform the equivalent of
gcc's -ffloat-store on the result before returning. this is necessary
to raise underflow/overflow/inexact exceptions, perform the correct
rounding with denormals, etc.
Rich Felker [Mon, 19 Mar 2012 08:56:07 +0000 (04:56 -0400)]
asm for inverse trig functions
unlike trig functions, these are easy to do in asm because they do not
involve (arbitrary-precision) argument reduction. fpatan automatically
takes care of domain issues, and in asin and acos, fsqrt takes care of
them for us.
nsz [Mon, 19 Mar 2012 07:01:21 +0000 (08:01 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl
Rich Felker [Mon, 19 Mar 2012 03:50:54 +0000 (23:50 -0400)]
asm for log functions
Rich Felker [Mon, 19 Mar 2012 03:17:28 +0000 (23:17 -0400)]
fix broken exponential asm
infinities were getting converted into nans. the new code simply tests
for infinity and replaces it with a large magnitude value of the same
sign.
also, the fcomi instruction is apparently not part of the i387
instruction set, so avoid using it.
Rich Felker [Mon, 19 Mar 2012 02:05:20 +0000 (22:05 -0400)]
asm for lrint family on i386
nsz [Mon, 19 Mar 2012 01:55:31 +0000 (02:55 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl
Rich Felker [Mon, 19 Mar 2012 01:43:43 +0000 (21:43 -0400)]
asm exponential functions for i386
nsz [Mon, 19 Mar 2012 01:05:57 +0000 (02:05 +0100)]
remove unnecessary TODO comments from fma.c
nsz [Sun, 18 Mar 2012 23:59:16 +0000 (00:59 +0100)]
fmal bug fix: nan input should not raise exception
nsz [Sun, 18 Mar 2012 23:36:55 +0000 (00:36 +0100)]
add fma implementation for x86
correctly rounded double precision fma using extended
precision arithmetics for ld80 systems (x87)
Rich Felker [Sun, 18 Mar 2012 21:09:34 +0000 (17:09 -0400)]
assembly optimizations for fmod/remainder functions
Rich Felker [Sun, 18 Mar 2012 20:43:54 +0000 (16:43 -0400)]
asm versions of some simple math functions for i386 and x86_64
these are functions that have direct fpu approaches to implementation
without problematic exception or rounding issues. x86_64 lacks
float/double versions because i'm unfamiliar with the necessary sse
code for performing these operations.
nsz [Sun, 18 Mar 2012 19:52:33 +0000 (20:52 +0100)]
simplify lround and llround functions
Simple wrappers around round is enough because
spurious inexact exception is allowed.
nsz [Sun, 18 Mar 2012 19:40:43 +0000 (20:40 +0100)]
make lrint and llrint functions work without fenv support
nsz [Sun, 18 Mar 2012 18:27:39 +0000 (19:27 +0100)]
faster lrint and llrint functions
A faster workaround for spurious inexact exceptions
when the result cannot be represented. The old code
actually could be wrong, because gcc reordered the
integer conversion and the exception check.
Rich Felker [Sun, 18 Mar 2012 05:58:28 +0000 (01:58 -0400)]
fix loads of missing const in new libm, and some global vars (?!) in powl
Rich Felker [Sun, 18 Mar 2012 01:48:48 +0000 (21:48 -0400)]
move nonstandard gamma() etc. to _GNU_SOURCE only
it's not even provided in the library at the moment, but could easily
be provided with weak aliases if desired.
Rich Felker [Sun, 18 Mar 2012 01:40:10 +0000 (21:40 -0400)]
c++ seems to want some casts in the float representation-access macros
Rich Felker [Sun, 18 Mar 2012 00:35:25 +0000 (20:35 -0400)]
release notes for 0.8.7
Rich Felker [Sun, 18 Mar 2012 00:10:02 +0000 (20:10 -0400)]
try fixing/optimizing x86_64 fenv exception code
untested; may need followup-fixes.
Rich Felker [Sat, 17 Mar 2012 23:29:00 +0000 (19:29 -0400)]
optimize x86 feclearexcept
if all exception flags will be cleared, we can avoid the expensive
store/reload of the environment and just use the fnclex instruction.
Rich Felker [Sat, 17 Mar 2012 22:02:20 +0000 (18:02 -0400)]
fix x86_64 fe[gs]etround, analogous to nsz's x86 changes
Rich Felker [Sat, 17 Mar 2012 21:49:10 +0000 (17:49 -0400)]
minor 387 fenv optimizations
Rich Felker [Sat, 17 Mar 2012 21:34:30 +0000 (17:34 -0400)]
Merge remote branch 'nsz/master'
nsz [Sat, 17 Mar 2012 12:46:15 +0000 (13:46 +0100)]
fix i386 fegetround and make fesetround faster
Note that the new fesetround has slightly different semantics:
Storing the floating-point environment with fnstenv makes the
next fldenv (or fldcw) "non-signaling", so unmasked and pending
exceptions does not invoke the exception handler.
(These are rare since exceptions are handled immediately and by
default all exceptions are masked anyway. But if one manually
unmasks an exception in the control word then either sets the
corresponding exception flag in the status word or the execution
of an exception raising floating-point operation gets interrupted
then it may happen).
So the old implementation did not trap in some rare cases
where the new implementation traps.
However POSIX does not specify anything like the x87 exception
handling traps and the fnstenv/fldenv pair is significantly slower
than the fnstcw/fldcw pair (new code is about 5x faster here and
it's dominated by the function call overhead).
Rich Felker [Sat, 17 Mar 2012 04:48:55 +0000 (00:48 -0400)]
don't fail on inability to install dynamic linker (e.g. if not root)
Rich Felker [Sat, 17 Mar 2012 04:02:36 +0000 (00:02 -0400)]
one more fenv availability issue: lround
Rich Felker [Sat, 17 Mar 2012 03:58:49 +0000 (23:58 -0400)]
make fma and lrint functions build without full fenv support
this is necessary to support archs where fenv is incomplete or
unavailable (presently arm). fma, fmal, and the lrint family should
work perfectly fine with this change; fmaf is slightly broken with
respect to rounding as it depends on non-default rounding modes to do
its work.
Rich Felker [Sat, 17 Mar 2012 01:20:53 +0000 (21:20 -0400)]
other side of the signgam namespace fix: use the internal name
Rich Felker [Sat, 17 Mar 2012 01:18:48 +0000 (21:18 -0400)]
make signgam a weak alias for an internal symbol
otherwise, the standard C lgamma function will clobber a symbol in the
namespace reserved for the application.
Rich Felker [Sat, 17 Mar 2012 01:16:32 +0000 (21:16 -0400)]
fix namespace issues for lgamma, etc.
standard functions cannot depend on nonstandard symbols
Rich Felker [Sat, 17 Mar 2012 01:01:34 +0000 (21:01 -0400)]
Merge remote branch 'nsz/master'
Rich Felker [Sat, 17 Mar 2012 00:53:05 +0000 (20:53 -0400)]
remove junk sincos implementations in preparation to merge nsz's real ones
Rich Felker [Sat, 17 Mar 2012 00:52:00 +0000 (20:52 -0400)]
revert COPYRIGHT file changes in preparation to merge nsz's math branch
Rich Felker [Fri, 16 Mar 2012 23:18:00 +0000 (19:18 -0400)]
update copyright status (math library and new year)
Rich Felker [Thu, 15 Mar 2012 23:56:36 +0000 (19:56 -0400)]
remove special nan handling from x86 sqrt asm
a double precision nan, when converted to extended (80-bit) precision,
will never end in 0x400, since the corresponding bits do not exist in
the original double precision value. thus there's no need to waste
time and code size on this check.
Rich Felker [Thu, 15 Mar 2012 16:16:51 +0000 (12:16 -0400)]
simplify nan check in sqrt (x86 asm); result of sqrt is never negative
nsz [Thu, 15 Mar 2012 08:29:53 +0000 (09:29 +0100)]
in math.h make lgamma_r and non-double bessel _GNU_SOURCE only
long double and float bessel functions are no longer xsi extensions
nsz [Thu, 15 Mar 2012 07:17:28 +0000 (08:17 +0100)]
efficient sincos based on sin and cos
Rich Felker [Thu, 15 Mar 2012 06:38:42 +0000 (02:38 -0400)]
implement sincosf and sincosl functions; add prototypes
presumably broken gcc may generate calls to these, and it's said that
ffmpeg makes use of sincosf.
Rich Felker [Thu, 15 Mar 2012 05:55:54 +0000 (01:55 -0400)]
avoid changing NaNs in sqrt (x86 asm) to satisfy c99 f.9 recommendation
Rich Felker [Thu, 15 Mar 2012 05:29:03 +0000 (01:29 -0400)]
correctly rounded sqrt() asm for x86 (i387)
the fsqrt opcode is correctly rounded, but only in the fpu's selected
precision mode, which is 80-bit extended precision. to get a correctly
rounded double precision output, we check for the only corner cases
where two-step rounding could give different results than one-step
(extended-precision mantissa ending in 0x400) and adjust the mantissa
slightly in the opposite direction of the rounding which the fpu
already did (reported in the c1 flag of the fpu status word).
this should have near-zero cost in the non-corner cases and at worst
very low cost.
note that in order for sqrt() to get used when compiling with gcc, the
broken, non-conformant builtin sqrt must be disabled.
Rich Felker [Wed, 14 Mar 2012 02:15:52 +0000 (22:15 -0400)]
correct rounding for i387 sqrtf function
nsz [Tue, 13 Mar 2012 20:11:46 +0000 (21:11 +0100)]
math cleanup: use 1.0f instead of 1.0F
nsz [Tue, 13 Mar 2012 19:24:23 +0000 (20:24 +0100)]
math cleanup: use 1.0f instead of (float)1.0
nsz [Tue, 13 Mar 2012 18:51:14 +0000 (19:51 +0100)]
remove libm.h includes when math.h and float.h are enough
Rich Felker [Tue, 13 Mar 2012 16:37:51 +0000 (12:37 -0400)]
fix scanf handling of "0" (followed by immediate EOF) with "%x"
other cases with %x were probably broken too.
I would actually like to go ahead and replace this code in scanf with
calls to the new __intparse framework, but for now this calls for a
quick and unobtrusive fix without the risk of breaking other things.
nsz [Tue, 13 Mar 2012 15:38:22 +0000 (16:38 +0100)]
clean up __expo2.c, use a slightly better k constant
nsz [Tue, 13 Mar 2012 15:06:43 +0000 (16:06 +0100)]
fix copyright notice for the math lib
Rich Felker [Tue, 13 Mar 2012 05:55:25 +0000 (01:55 -0400)]
implement nan, nanf, nanl
Rich Felker [Tue, 13 Mar 2012 05:17:53 +0000 (01:17 -0400)]
first commit of the new libm!
thanks to the hard work of Szabolcs Nagy (nsz), identifying the best
(from correctness and license standpoint) implementations from freebsd
and openbsd and cleaning them up! musl should now fully support c99
float and long double math functions, and has near-complete complex
math support. tgmath should also work (fully on gcc-compatible
compilers, and mostly on any c99 compiler).
based largely on commit
0376d44a890fea261506f1fc63833e7a686dca19 from
nsz's libm git repo, with some additions (dummy versions of a few
missing long double complex functions, etc.) by me.
various cleanups still need to be made, including re-adding (if
they're correct) some asm functions that were dropped.
Rich Felker [Fri, 9 Mar 2012 08:39:28 +0000 (03:39 -0500)]
add .gitignore file
I've had this around for a long time but somehow it never got
committed.
Rich Felker [Sat, 3 Mar 2012 03:35:37 +0000 (22:35 -0500)]
fix nan/infinity macros in math.h, etc.
the previous version not only failed to work in c++, but also failed
to produce constant expressions, making the macros useless as
initializers for objects of static storage duration.
gcc 3.3 and later have builtins for these, which sadly seem to be the
most "portable" solution. the alternative definitions produce
exceptions (for NAN) and compiler warnings (for INFINITY) on newer
versions of gcc.
Rich Felker [Fri, 2 Mar 2012 17:48:17 +0000 (12:48 -0500)]
fix obscure bug in strtoull reading the highest 16 possible values
Rich Felker [Fri, 2 Mar 2012 16:38:39 +0000 (11:38 -0500)]
typo in math.h c version check
Rich Felker [Fri, 2 Mar 2012 05:36:26 +0000 (00:36 -0500)]
make math.h compatibe with c89
Rich Felker [Fri, 2 Mar 2012 05:24:49 +0000 (00:24 -0500)]
remove debug cruft that was left in getdate
Rich Felker [Fri, 2 Mar 2012 05:24:17 +0000 (00:24 -0500)]
first try at implementing getdate function
Rich Felker [Fri, 2 Mar 2012 05:23:43 +0000 (00:23 -0500)]
fix bugs in strptime handling of string day/month names, literals
Rich Felker [Fri, 2 Mar 2012 04:43:31 +0000 (23:43 -0500)]
implement a64l and l64a (legacy xsi stuff)
Rich Felker [Fri, 2 Mar 2012 04:24:45 +0000 (23:24 -0500)]
add all missing wchar functions except floating point parsers
these are mostly untested and adapted directly from corresponding byte
string functions and similar.
Rich Felker [Fri, 2 Mar 2012 03:08:05 +0000 (22:08 -0500)]
support null buffer argument to getcwd, auto-allocating behavior
this is a popular extension some programs depend on, and by using a
temporary buffer and strdup rather than malloc prior to the syscall,
i've avoided the dependency on free and thus minimized the bloat cost
of supporting this feature.
Rich Felker [Thu, 1 Mar 2012 06:34:58 +0000 (01:34 -0500)]
add memory.h, bogus legacy alias for string.h
Rich Felker [Thu, 1 Mar 2012 05:21:20 +0000 (00:21 -0500)]
search internal headers first
this is necessitated by the ugly <syscall.h> just added
Rich Felker [Thu, 1 Mar 2012 03:55:08 +0000 (22:55 -0500)]
use c++-friendly initializers for pthread initializer definitions
these will also avoid obnoxious warnings with gcc -Wbraces.
Rich Felker [Thu, 1 Mar 2012 03:36:06 +0000 (22:36 -0500)]
add <syscall.h> as an alias for <sys/syscall.h>
apparently some broken stuff (libstdc++) needs this.
Rich Felker [Tue, 28 Feb 2012 20:59:01 +0000 (15:59 -0500)]
implement wcsftime function
Rich Felker [Tue, 28 Feb 2012 16:56:13 +0000 (11:56 -0500)]
release notes for 0.8.6
Rich Felker [Tue, 28 Feb 2012 15:13:35 +0000 (10:13 -0500)]
fix pthread_cleanup_pop(1) crash in non-thread-capable, static-linked programs
Rich Felker [Tue, 28 Feb 2012 01:12:06 +0000 (20:12 -0500)]
update release notes for 0.8.5