oweals/musl.git
12 years agotgmath.h: suppress any existing macro definitions before defining macros
Rich Felker [Thu, 22 Mar 2012 19:36:56 +0000 (15:36 -0400)]
tgmath.h: suppress any existing macro definitions before defining macros

this is necessary so that we can freely add macro versions of some of
the math/complex functions without worrying about breaking tgmath.

12 years agoacos.s fix: use the formula acos(x) = atan2(sqrt(1-x),sqrt(1+x))
nsz [Thu, 22 Mar 2012 13:54:47 +0000 (14:54 +0100)]
acos.s fix: use the formula acos(x) = atan2(sqrt(1-x),sqrt(1+x))

the old formula atan2(1,sqrt((1+x)/(1-x))) was faster but
could give nan result at x=1 when the rounding mode is
FE_DOWNWARD (so 1-1 == -0 and 2/-0 == -inf), the new formula
gives -0 at x=+-1 with downward rounding.

12 years agosysconf support for dynamic limits (open files and processes)
Rich Felker [Thu, 22 Mar 2012 05:00:35 +0000 (01:00 -0400)]
sysconf support for dynamic limits (open files and processes)

12 years agofix DECIMAL_DIG definitions
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.

12 years agoinitial, very primitive strfmon
Rich Felker [Wed, 21 Mar 2012 04:47:37 +0000 (00:47 -0400)]
initial, very primitive strfmon

12 years agox86_64 math asm, long double functions only
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.

12 years agolimits.h: support gcc's -funsigned-char
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...

12 years agoMerge remote branch 'nsz/master'
Rich Felker [Tue, 20 Mar 2012 23:51:11 +0000 (19:51 -0400)]
Merge remote branch 'nsz/master'

12 years agoupgrade to latest upstream TRE regex code (0.8.0)
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.

12 years agonearbyint optimization (only clear inexact when necessary)
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

12 years agoremove a fixme comment
nsz [Tue, 20 Mar 2012 19:08:35 +0000 (20:08 +0100)]
remove a fixme comment

12 years agoclean up pow.c and powf.c
nsz [Tue, 20 Mar 2012 19:04:53 +0000 (20:04 +0100)]
clean up pow.c and powf.c
fix comments about special cases

12 years agoclean up powl.c
nsz [Tue, 20 Mar 2012 18:59:50 +0000 (19:59 +0100)]
clean up powl.c
fix special cases, use multiplication instead of scalbnl

12 years agofix a cbrtl.c regression and remove x87 precision setting
nsz [Tue, 20 Mar 2012 14:17:15 +0000 (15:17 +0100)]
fix a cbrtl.c regression and remove x87 precision setting

12 years agoMerge branch 'master' of git://git.etalabs.net/musl
nsz [Tue, 20 Mar 2012 09:25:02 +0000 (10:25 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl

12 years agooptimize scalbn family
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.)

12 years agoremquo asm: return quotient mod 8, as intended by the spec
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...

12 years agoMerge branch 'master' of git://git.etalabs.net/musl
nsz [Tue, 20 Mar 2012 03:09:14 +0000 (04:09 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl

12 years agouse alternate formula for acos asm to avoid loss of precision
Rich Felker [Tue, 20 Mar 2012 03:08:49 +0000 (23:08 -0400)]
use alternate formula for acos asm to avoid loss of precision

12 years agoMerge branch 'master' of git://git.etalabs.net/musl
nsz [Tue, 20 Mar 2012 02:13:26 +0000 (03:13 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl

12 years agoMerge remote branch 'nsz/master'
Rich Felker [Tue, 20 Mar 2012 02:07:43 +0000 (22:07 -0400)]
Merge remote branch 'nsz/master'

12 years agofix exp asm
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.

12 years agoMerge branch 'master' of git://git.etalabs.net/musl
nsz [Mon, 19 Mar 2012 22:55:06 +0000 (23:55 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl

12 years agocode cleanup of named constants
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).

12 years agofix remainder*.c: remove useless long double cast
nsz [Mon, 19 Mar 2012 22:39:47 +0000 (23:39 +0100)]
fix remainder*.c: remove useless long double cast

12 years agodon't try to create non-standard denormalization signal
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.

12 years agoMerge remote branch 'nsz/master'
Rich Felker [Mon, 19 Mar 2012 22:30:35 +0000 (18:30 -0400)]
Merge remote branch 'nsz/master'

12 years agonew modff.c code, fix nan handling in modfl
nsz [Mon, 19 Mar 2012 22:27:45 +0000 (23:27 +0100)]
new modff.c code, fix nan handling in modfl

12 years agouse scalbn or *2.0 instead of ldexp, fix fmal
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.

12 years agofix long double const workaround in cbrtl
nsz [Mon, 19 Mar 2012 21:49:03 +0000 (22:49 +0100)]
fix long double const workaround in cbrtl

12 years agodon't inline __rem_pio2l so the code size is smaller
nsz [Mon, 19 Mar 2012 18:26:31 +0000 (19:26 +0100)]
don't inline __rem_pio2l so the code size is smaller

12 years agominor fix in __tanl (get sign properly)
nsz [Mon, 19 Mar 2012 18:14:32 +0000 (19:14 +0100)]
minor fix in __tanl (get sign properly)

12 years agobug fix: wrong opcode for writing long long
Rich Felker [Mon, 19 Mar 2012 17:58:47 +0000 (13:58 -0400)]
bug fix: wrong opcode for writing long long

12 years agoremove long double const workarounds
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).

12 years agofix erfl wrapper for long double==double case
nsz [Mon, 19 Mar 2012 17:06:06 +0000 (18:06 +0100)]
fix erfl wrapper for long double==double case

12 years agoasm for log1p
Rich Felker [Mon, 19 Mar 2012 14:59:41 +0000 (10:59 -0400)]
asm for log1p

12 years agoasm for log2
Rich Felker [Mon, 19 Mar 2012 14:43:28 +0000 (10:43 -0400)]
asm for log2

12 years agoasm for remquo
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.

12 years agooptimize exponential asm for i386
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).

12 years agoMerge remote branch 'nsz/master'
Rich Felker [Mon, 19 Mar 2012 10:28:22 +0000 (06:28 -0400)]
Merge remote branch 'nsz/master'

12 years agofix broken modf family functions
Rich Felker [Mon, 19 Mar 2012 10:22:54 +0000 (06:22 -0400)]
fix broken modf family functions

12 years agoasm for modf functions
Rich Felker [Mon, 19 Mar 2012 09:56:41 +0000 (05:56 -0400)]
asm for modf functions

12 years agosimplify scalbn*.c implementations
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)

12 years agoMerge branch 'master' of git://git.etalabs.net/musl
nsz [Mon, 19 Mar 2012 09:50:42 +0000 (10:50 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl

12 years agoasm for floor/ceil/trunc
Rich Felker [Mon, 19 Mar 2012 09:42:04 +0000 (05:42 -0400)]
asm for floor/ceil/trunc

12 years agoMerge branch 'master' of git://git.etalabs.net/musl
nsz [Mon, 19 Mar 2012 09:20:24 +0000 (10:20 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl

12 years agoasm for scalbn family
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.

12 years agoasm for inverse trig functions
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.

12 years agoMerge branch 'master' of git://git.etalabs.net/musl
nsz [Mon, 19 Mar 2012 07:01:21 +0000 (08:01 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl

12 years agoasm for log functions
Rich Felker [Mon, 19 Mar 2012 03:50:54 +0000 (23:50 -0400)]
asm for log functions

12 years agofix broken exponential asm
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.

12 years agoasm for lrint family on i386
Rich Felker [Mon, 19 Mar 2012 02:05:20 +0000 (22:05 -0400)]
asm for lrint family on i386

12 years agoMerge branch 'master' of git://git.etalabs.net/musl
nsz [Mon, 19 Mar 2012 01:55:31 +0000 (02:55 +0100)]
Merge branch 'master' of git://git.etalabs.net/musl

12 years agoasm exponential functions for i386
Rich Felker [Mon, 19 Mar 2012 01:43:43 +0000 (21:43 -0400)]
asm exponential functions for i386

12 years agoremove unnecessary TODO comments from fma.c
nsz [Mon, 19 Mar 2012 01:05:57 +0000 (02:05 +0100)]
remove unnecessary TODO comments from fma.c

12 years agofmal bug fix: nan input should not raise exception
nsz [Sun, 18 Mar 2012 23:59:16 +0000 (00:59 +0100)]
fmal bug fix: nan input should not raise exception

12 years agoadd fma implementation for x86
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)

12 years agoassembly optimizations for fmod/remainder functions
Rich Felker [Sun, 18 Mar 2012 21:09:34 +0000 (17:09 -0400)]
assembly optimizations for fmod/remainder functions

12 years agoasm versions of some simple math functions for i386 and x86_64
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.

12 years agosimplify lround and llround functions
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.

12 years agomake lrint and llrint functions work without fenv support
nsz [Sun, 18 Mar 2012 19:40:43 +0000 (20:40 +0100)]
make lrint and llrint functions work without fenv support

12 years agofaster lrint and llrint functions
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.

12 years agofix loads of missing const in new libm, and some global vars (?!) in powl
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

12 years agomove nonstandard gamma() etc. to _GNU_SOURCE only
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.

12 years agoc++ seems to want some casts in the float representation-access macros
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

12 years agorelease notes for 0.8.7 v0.8.7
Rich Felker [Sun, 18 Mar 2012 00:35:25 +0000 (20:35 -0400)]
release notes for 0.8.7

12 years agotry fixing/optimizing x86_64 fenv exception code
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.

12 years agooptimize x86 feclearexcept
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.

12 years agofix x86_64 fe[gs]etround, analogous to nsz's x86 changes
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

12 years agominor 387 fenv optimizations
Rich Felker [Sat, 17 Mar 2012 21:49:10 +0000 (17:49 -0400)]
minor 387 fenv optimizations

12 years agoMerge remote branch 'nsz/master'
Rich Felker [Sat, 17 Mar 2012 21:34:30 +0000 (17:34 -0400)]
Merge remote branch 'nsz/master'

12 years agofix i386 fegetround and make fesetround faster
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).

12 years agodon't fail on inability to install dynamic linker (e.g. if not root)
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)

12 years agoone more fenv availability issue: lround
Rich Felker [Sat, 17 Mar 2012 04:02:36 +0000 (00:02 -0400)]
one more fenv availability issue: lround

12 years agomake fma and lrint functions build without full fenv support
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.

12 years agoother side of the signgam namespace fix: use the internal name
Rich Felker [Sat, 17 Mar 2012 01:20:53 +0000 (21:20 -0400)]
other side of the signgam namespace fix: use the internal name

12 years agomake signgam a weak alias for an internal symbol
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.

12 years agofix namespace issues for lgamma, etc.
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

12 years agoMerge remote branch 'nsz/master'
Rich Felker [Sat, 17 Mar 2012 01:01:34 +0000 (21:01 -0400)]
Merge remote branch 'nsz/master'

12 years agoremove junk sincos implementations in preparation to merge nsz's real ones
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

12 years agorevert COPYRIGHT file changes in preparation to merge nsz's math branch
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

12 years agoupdate copyright status (math library and new year)
Rich Felker [Fri, 16 Mar 2012 23:18:00 +0000 (19:18 -0400)]
update copyright status (math library and new year)

12 years agoremove special nan handling from x86 sqrt asm
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.

12 years agosimplify nan check in sqrt (x86 asm); result of sqrt is never negative
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

12 years agoin math.h make lgamma_r and non-double bessel _GNU_SOURCE only
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

12 years agoefficient sincos based on sin and cos
nsz [Thu, 15 Mar 2012 07:17:28 +0000 (08:17 +0100)]
efficient sincos based on sin and cos

12 years agoimplement sincosf and sincosl functions; add prototypes
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.

12 years agoavoid changing NaNs in sqrt (x86 asm) to satisfy c99 f.9 recommendation
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

12 years agocorrectly rounded sqrt() asm for x86 (i387)
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.

12 years agocorrect rounding for i387 sqrtf function
Rich Felker [Wed, 14 Mar 2012 02:15:52 +0000 (22:15 -0400)]
correct rounding for i387 sqrtf function

12 years agomath cleanup: use 1.0f instead of 1.0F
nsz [Tue, 13 Mar 2012 20:11:46 +0000 (21:11 +0100)]
math cleanup: use 1.0f instead of 1.0F

12 years agomath cleanup: use 1.0f instead of (float)1.0
nsz [Tue, 13 Mar 2012 19:24:23 +0000 (20:24 +0100)]
math cleanup: use 1.0f instead of (float)1.0

12 years agoremove libm.h includes when math.h and float.h are enough
nsz [Tue, 13 Mar 2012 18:51:14 +0000 (19:51 +0100)]
remove libm.h includes when math.h and float.h are enough

12 years agofix scanf handling of "0" (followed by immediate EOF) with "%x"
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.

12 years agoclean up __expo2.c, use a slightly better k constant
nsz [Tue, 13 Mar 2012 15:38:22 +0000 (16:38 +0100)]
clean up __expo2.c, use a slightly better k constant

12 years agofix copyright notice for the math lib
nsz [Tue, 13 Mar 2012 15:06:43 +0000 (16:06 +0100)]
fix copyright notice for the math lib

12 years agoimplement nan, nanf, nanl
Rich Felker [Tue, 13 Mar 2012 05:55:25 +0000 (01:55 -0400)]
implement nan, nanf, nanl

12 years agofirst commit of the new libm!
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.

12 years agoadd .gitignore file
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.

12 years agofix nan/infinity macros in math.h, etc.
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.