Commit Graph

970 Commits

Author SHA1 Message Date
Rich Felker
5bd0ab8af6 work around nasty gcc bug in the i386 syscall asm
when the "r" (register) constraint is used to let gcc choose a
register, gcc will sometimes assign the same register that was used
for one of the other fixed-register operands, if it knows the values
are the same. one common case is multiple zero arguments to a syscall.
this horribly breaks the intended usage, which is swapping the GOT
pointer from ebx into the temp register and back to perform the
syscall.

presumably there is a way to fix this with advanced usage of register
constaints on the inline asm, but having bad memories about hellish
compatibility issues with different gcc versions, for the time being
i'm just going to hard-code specific registers to be used. this may
hurt the compiler's ability to optimize, but it will fix serious
miscompilation issues.

so far the only function i know what compiled incorrectly is
getrlimit.c, and naturally the bug only applies to shared (PIC)
builds, but it may be more extensive and may have gone undetected..
2012-04-04 00:37:33 -04:00
Rich Felker
450f2c4a85 remove useless (at best, harmful) feature test checks in aio.h 2012-04-03 19:16:51 -04:00
Rich Felker
4f346b08b3 improve name lookup performance in corner cases
the buffer in getaddrinfo really only matters when /etc/hosts is huge,
but in that case, the huge number of syscalls resulting from a tiny
buffer would seriously impact the performance of every name lookup.

the buffer in __dns.c has also been enlarged a bit so that typical
resolv.conf files will fit fully in the buffer. there's no need to
make it so large as to dominate the syscall overhead for large files,
because resolv.conf should never be large.
2012-04-01 23:22:16 -04:00
Rich Felker
4dbd94112f optimize signbit macro 2012-03-30 23:41:43 -04:00
Rich Felker
93a18a15e4 make math.h more c++-friendly 2012-03-30 23:33:00 -04:00
nsz
7eabe8e690 math: minor cleanups in ceil and floor 2012-03-29 14:09:57 +02:00
nsz
d79ac8c38f math: remove x86 modf asm
the int part was wrong when -1 < x <= -0 (+0.0 instead of -0.0)
and the size and performace gain of the asm version was negligible
2012-03-29 14:05:16 +02:00
nsz
f6ceccd922 math: rewrite modf.c and clean up modff.c
cleaner implementation with unions and unsigned arithmetic
2012-03-29 14:03:18 +02:00
nsz
9f58d06007 math: fix modfl.c bug
modfl(+-inf) was wrong on ld80 because the explicit msb
was not taken into account during inf vs nan check
2012-03-28 23:51:09 +02:00
nsz
cf682072ce math: fix a regression in powl and do some cleanups
previously a division was accidentally turned into integer div
(w = -i/NXT;) instead of long double div (w = -i; w /= NXT;)
2012-03-27 22:49:37 +02:00
nsz
bbfbc7edaf math: add dummy tgamma and tgammaf implementations 2012-03-27 22:17:36 +02:00
nsz
1b229a2098 math: remove comment about aliasing lgamma as gamma
It is probably not worth supporting gamma.
(it was already deprecated in 4.3BSD)
2012-03-27 22:12:20 +02:00
nsz
ad23771c32 math: fix typo in i386 remquof and remquol asm
(fldl instruction was used instead of flds and fldt)
2012-03-27 22:01:21 +02:00
nsz
e68a4633e0 Merge branch 'master' of git://git.etalabs.net/musl 2012-03-26 13:47:31 +02:00
Rich Felker
a9014ac1b9 Merge remote branch 'nsz/master' 2012-03-25 00:42:51 -04:00
Rich Felker
bff650df9f add strfmon_l variant (still mostly incomplete) 2012-03-25 00:21:20 -04:00
Rich Felker
df82f8f2dc update COPYRIGHT status of TRE regex code 2012-03-24 17:46:42 -04:00
Rich Felker
db0da51b5c update README to remove information no longer relevant as of 0.8.7 2012-03-24 17:43:07 -04:00
nsz
c5ec5b2ce9 Merge branch 'master' of git://git.etalabs.net/musl 2012-03-23 11:16:56 +01:00
Rich Felker
ad2d2b963a asm for hypot and hypotf
special care is made to avoid any inexact computations when either arg
is zero (in which case the exact absolute value of the other arg
should be returned) and to support the special condition that
hypot(±inf,nan) yields inf.

hypotl is not yet implemented since avoiding overflow is nontrivial.
2012-03-23 01:52:49 -04:00
Rich Felker
a9e85c0a5c make dlerror conform to posix
the error status is required to be sticky after failure of dlopen or
dlsym until cleared by dlerror. applications and especially libraries
should never rely on this since it is not thread-safe and subject to
race conditions, but glib does anyway.
2012-03-23 00:28:20 -04:00
nsz
6d8df2b972 minor rintl.c fix: remove unsupported ldbl format message 2012-03-23 01:26:04 +01:00
nsz
cb8fce4b4f fix tgammal: don't set the signgam global
(tgamma must be thread-safe, signgam is for lgamma* functions)
2012-03-23 01:18:12 +01:00
Rich Felker
494ba80e9a simplify creal and cimag macros 2012-03-22 20:00:58 -04:00
Rich Felker
13e400b355 add creal/cimag macros in complex.h (and use them in the functions defs) 2012-03-22 15:54:55 -04:00
Rich Felker
132f0a0083 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.
2012-03-22 15:36:56 -04:00
nsz
a4a0c91275 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.
2012-03-22 14:54:47 +01:00
Rich Felker
2e0c1fed36 sysconf support for dynamic limits (open files and processes) 2012-03-22 01:00:35 -04:00
Rich Felker
47db8903f6 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.
2012-03-21 12:42:48 -04:00
Rich Felker
25501c1079 initial, very primitive strfmon 2012-03-21 00:47:37 -04:00
Rich Felker
30df206cb0 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.
2012-03-20 23:29:24 -04:00
Rich Felker
80949ccdc6 limits.h: support gcc's -funsigned-char
some software apparently uses this and breaks with musl due to
mismatching definitions...
2012-03-20 21:10:06 -04:00
Rich Felker
58bf74850f Merge remote branch 'nsz/master' 2012-03-20 19:51:11 -04:00
Rich Felker
ad47d45e9d 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.
2012-03-20 19:44:05 -04:00
nsz
91c28f61f4 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
2012-03-20 22:49:19 +01:00
nsz
8c6fc860a9 remove a fixme comment 2012-03-20 20:08:35 +01:00
nsz
f1347a3a45 clean up pow.c and powf.c
fix comments about special cases
2012-03-20 20:04:53 +01:00
nsz
615bbd365f clean up powl.c
fix special cases, use multiplication instead of scalbnl
2012-03-20 19:59:50 +01:00
nsz
1e2fea632b fix a cbrtl.c regression and remove x87 precision setting 2012-03-20 15:17:15 +01:00
nsz
03c52e137a Merge branch 'master' of git://git.etalabs.net/musl 2012-03-20 10:25:02 +01:00
Rich Felker
baa43bca0a 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.)
2012-03-20 00:51:32 -04:00
Rich Felker
7513d3ecab 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...
2012-03-19 23:53:52 -04:00
nsz
c879a9592f Merge branch 'master' of git://git.etalabs.net/musl 2012-03-20 04:09:14 +01:00
Rich Felker
804fbf0b8c use alternate formula for acos asm to avoid loss of precision 2012-03-19 23:08:49 -04:00
nsz
0b0735af45 Merge branch 'master' of git://git.etalabs.net/musl 2012-03-20 03:13:26 +01:00
Rich Felker
97721a5508 Merge remote branch 'nsz/master' 2012-03-19 22:07:43 -04:00
Rich Felker
acb744921b 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.
2012-03-19 21:55:53 -04:00
nsz
634c3a6302 Merge branch 'master' of git://git.etalabs.net/musl 2012-03-19 23:55:06 +01:00
nsz
0cbb654791 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).
2012-03-19 23:41:19 +01:00
nsz
b03255af77 fix remainder*.c: remove useless long double cast 2012-03-19 23:39:47 +01:00