Rich Felker [Wed, 21 Mar 2012 16:42:48 +0000 (12:42 -0400)]
fix DECIMAL_DIG definitions
DECIMAL_DIG is not the same as LDBL_DIG
type_DIG is the maximimum number of decimal digits that can survive a
round trip from decimal to type and back to decimal.
DECIMAL_DIG is the minimum number of decimal digits required in order
for any floating point type to survive the round trip to decimal and
back, and it is generally larger than LDBL_DIG. since the exact
formula is non-trivial, and defining it larger than necessary may be
legal but wasteful, just define the right value in bits/float.h.
Rich Felker [Wed, 21 Mar 2012 04:47:37 +0000 (00:47 -0400)]
initial, very primitive strfmon
Rich Felker [Wed, 21 Mar 2012 03:29:24 +0000 (23:29 -0400)]
x86_64 math asm, long double functions only
this has not been tested heavily, but it's known to at least assemble
and run in basic usage cases. it's nearly identical to the
corresponding i386 code, and thus expected to be just as correct or
just as incorrect.
Rich Felker [Wed, 21 Mar 2012 01:10:06 +0000 (21:10 -0400)]
limits.h: support gcc's -funsigned-char
some software apparently uses this and breaks with musl due to
mismatching definitions...
Rich Felker [Tue, 20 Mar 2012 23:51:11 +0000 (19:51 -0400)]
Merge remote branch 'nsz/master'
Rich Felker [Tue, 20 Mar 2012 23:44:05 +0000 (19:44 -0400)]
upgrade to latest upstream TRE regex code (0.8.0)
the main practical results of this change are
1. the regex code is no longer subject to LGPL; it's now 2-clause BSD
2. most (all?) popular nonstandard regex extensions are supported
I hesitate to call this a "sync" since both the old and new code are
heavily modified. in one sense, the old code was "more severely"
modified, in that it was actively hostile to non-strictly-conforming
expressions. on the other hand, the new code has eliminated the
useless translation of the entire regex string to wchar_t prior to
compiling, and now only converts multibyte character literals as
needed.
in the future i may use this modified TRE as a basis for writing the
long-planned new regex engine that will avoid multibyte-to-wide
character conversion entirely by compiling multibyte bracket
expressions specific to UTF-8.
nsz [Tue, 20 Mar 2012 21:49:19 +0000 (22:49 +0100)]
nearbyint optimization (only clear inexact when necessary)
old code saved/restored the fenv (the new code is only as slow
as that when inexact is not set before the call, but some other
flag is set and the rounding is inexact, which is rare)
before:
bench_nearbyint_exact
5000000 N 261 ns/op
bench_nearbyint_inexact_set
5000000 N 262 ns/op
bench_nearbyint_inexact_unset
5000000 N 261 ns/op
after:
bench_nearbyint_exact
10000000 N 94.99 ns/op
bench_nearbyint_inexact_set
25000000 N 65.81 ns/op
bench_nearbyint_inexact_unset
10000000 N 94.97 ns/op
nsz [Tue, 20 Mar 2012 19:08:35 +0000 (20:08 +0100)]
remove a fixme comment
nsz [Tue, 20 Mar 2012 19:04:53 +0000 (20:04 +0100)]
clean up pow.c and powf.c
fix comments about special cases
nsz [Tue, 20 Mar 2012 18:59:50 +0000 (19:59 +0100)]
clean up powl.c
fix special cases, use multiplication instead of scalbnl
nsz [Tue, 20 Mar 2012 14:17:15 +0000 (15:17 +0100)]
fix a cbrtl.c regression and remove x87 precision setting
nsz [Tue, 20 Mar 2012 09:25:02 +0000 (10:25 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl
Rich Felker [Tue, 20 Mar 2012 04:51:32 +0000 (00:51 -0400)]
optimize scalbn family
the fscale instruction is slow everywhere, probably because it
involves a costly and unnecessary integer truncation operation that
ends up being a no-op in common usages. instead, construct a floating
point scale value with integer arithmetic and simply multiply by it,
when possible.
for float and double, this is always possible by going to the
next-larger type. we use some cheap but effective saturating
arithmetic tricks to make sure even very large-magnitude exponents
fit. for long double, if the scaling exponent is too large to fit in
the exponent of a long double value, we simply fallback to the
expensive fscale method.
on atom cpu, these changes speed up scalbn by over 30%. (min rdtsc
timing dropped from 110 cycles to 70 cycles.)
Rich Felker [Tue, 20 Mar 2012 03:53:52 +0000 (23:53 -0400)]
remquo asm: return quotient mod 8, as intended by the spec
this is a lot more efficient and also what is generally wanted.
perhaps the bit shuffling could be more efficient...
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