mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-23 15:01:03 +03:00
Update.
1997-03-20 01:49 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-ieee754/s_tanhl.c (__tanhl): Correct handling of -inf. * Makeconfig: (rpath-link): Add math/ directory. (math-objdir): New variable. (link-extra-lib): Define to special version when $(common-objpfx)!=$(objpfx) to allow libraries outside $(common-objpfx) be linked to the application. * math/Makefile: Add rules to build and run test programs. * math/libm-test.c (_GNU_SOURCE): Define only if still undefined. (check_equal): Correct check for error. (ceil_test): Fix typo. (log_test): Fix typo. (floor_test): Fix typo. (pow_test): Fix typos. (log10_test): Allow slight incorrectness for `log10(e)'. (modf_test): New functions to test `modf' et.al. (hypot_test): Rewrite test completely. Patch partly by Andreas Jaeger. * math/test-double.h (__NO_MATH_INLINES): Define only if not already defined. * math/test-float.h: Likewise. * math/test-logdouble.h: Likewise. * setjmp/setjmp.h: Change references of ANSI C to ISO C. * setjmp/tst-setjmp.c: Correct and extend test suite. * sysdeps/i386/__longjmp.S: Update copyright. * sysdeps/i386/bsd-_setjmp.S: Correct fatal bug in jump to `__sigsetjmp' in PIC code. * sysdeps/i386/bsd-setjmp.S: Likewise. * sysdeps/libm-i387/e_pow.S: Correct recognition of mantissa overflow. * sysdeps/libm-i387/e_powf.S: Likewise. * sysdeps/libm-i387/s_expm1.S: Handle x == +-0 as a special case since expm1(-0) == -0. * sysdeps/libm-i387/s_expm1f.S: Likewise. * sysdeps/libm-i387/s_expm1l.S: Likewise. * sysdeps/libm-ieee754/s_modf.c: Optimize code by avoiding unneeded access to FP number. * sysdeps/libm-ieee754/s_modff.c: Likewise. * sysdeps/libm-ieee754/s_modfl.c: Correct former completely bogus code. It never worked correctly. * sysdeps/libm-ieee754/s_tanh.c: Handle x == +-0 as a special case since tanh(-0) == -0. * sysdeps/libm-ieee754/s_tanhf.c: Likewise. 1997-03-19 21:13 Ulrich Drepper <drepper@cygnus.com> * stdlib/strtod.c (STRTOL): Use wchar_t as type for `decimal' and `thousands' to support systems with sizeof(wchar_t) != sizeof(wint_t). Blargh. * sysdeps/unix/sysv/linux/socketbits.h: Remove definition of SOL_IP, SOL_TCP, SOL_UDP, and SOL_IPX as they are defined in appropriate headers. * sysdeps/unix/sysv/linux/writev.c: Don't use MAX_IOVEC. Test for UIO_FASTIOV and set to 8 if not available. * sysdeps/unix/sysv/linux/readv.c: Likewise. Patch by HJ Lu. * sysdeps/unix/sysv/linux/xstat.c: Include <kernel_stat.h>, not "kernel_stat.h". * sysdeps/unix/sysv/linux/lxstat.c: Likewise. * sysdeps/unix/sysv/linux/fxstat.c: Likewise. Reported by fabsoft@fabsoft2.zarm.uni-bremen.de.
This commit is contained in:
39
BUGS
Normal file
39
BUGS
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
List of known bugs (certainly very incomplete)
|
||||||
|
----------------------------------------------
|
||||||
|
|
||||||
|
Time-stamp: <1997-03-20T02:33:37+0100 drepper>
|
||||||
|
|
||||||
|
This following list contains those bugs which I'm aware of. Please
|
||||||
|
make sure that bugs you report are not listed here. I you can fix one
|
||||||
|
of these bugs I'll certainly be glad to receive a patch.
|
||||||
|
|
||||||
|
Severity: [ *] to [***]
|
||||||
|
|
||||||
|
|
||||||
|
[***] Profiling currently does not work with programs using NSS.
|
||||||
|
|
||||||
|
[***] At least on Linux/Alpha, there seem to be problems with dynamically
|
||||||
|
loading NSS modules in certain situations.
|
||||||
|
[PR libc/137]
|
||||||
|
|
||||||
|
[ **] For GNU libc on Linux, there is still no solution for the UTMP
|
||||||
|
problem.
|
||||||
|
[Among others: PR libc/39]
|
||||||
|
|
||||||
|
[ **] There are problems with signal handling when using LinuxThreads.
|
||||||
|
|
||||||
|
[ **] The `cbrtl' function is inaccurate. The algorithm used for `double'
|
||||||
|
and `float' is not usable.
|
||||||
|
|
||||||
|
[ **] Not really a bug, but it could lead to such:
|
||||||
|
The RPC code is ugly ugly ugly. It's more or less verbatim taken
|
||||||
|
from Sun's code and therefore mostly lacks complete prototypes and
|
||||||
|
(more important) the use of `const'. It *definitely* needs to be
|
||||||
|
cleaned.
|
||||||
|
|
||||||
|
[ *] The precision of the `sinhl' and/or `asinhl' function do not seem
|
||||||
|
to be the best.
|
||||||
|
|
||||||
|
[ *] The syslog function should print to the console if the LOG_CONS
|
||||||
|
flag was given.
|
||||||
|
[PR libc/72]
|
71
ChangeLog
71
ChangeLog
@ -1,3 +1,74 @@
|
|||||||
|
1997-03-20 01:49 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* sysdeps/libm-ieee754/s_tanhl.c (__tanhl): Correct handling of
|
||||||
|
-inf.
|
||||||
|
|
||||||
|
* Makeconfig: (rpath-link): Add math/ directory.
|
||||||
|
(math-objdir): New variable.
|
||||||
|
(link-extra-lib): Define to special version when
|
||||||
|
$(common-objpfx)!=$(objpfx) to allow libraries outside
|
||||||
|
$(common-objpfx) be linked to the application.
|
||||||
|
|
||||||
|
* math/Makefile: Add rules to build and run test programs.
|
||||||
|
* math/libm-test.c (_GNU_SOURCE): Define only if still undefined.
|
||||||
|
(check_equal): Correct check for error.
|
||||||
|
(ceil_test): Fix typo.
|
||||||
|
(log_test): Fix typo.
|
||||||
|
(floor_test): Fix typo.
|
||||||
|
(pow_test): Fix typos.
|
||||||
|
(log10_test): Allow slight incorrectness for `log10(e)'.
|
||||||
|
(modf_test): New functions to test `modf' et.al.
|
||||||
|
(hypot_test): Rewrite test completely.
|
||||||
|
Patch partly by Andreas Jaeger.
|
||||||
|
* math/test-double.h (__NO_MATH_INLINES): Define only if not
|
||||||
|
already defined.
|
||||||
|
* math/test-float.h: Likewise.
|
||||||
|
* math/test-logdouble.h: Likewise.
|
||||||
|
|
||||||
|
* setjmp/setjmp.h: Change references of ANSI C to ISO C.
|
||||||
|
* setjmp/tst-setjmp.c: Correct and extend test suite.
|
||||||
|
* sysdeps/i386/__longjmp.S: Update copyright.
|
||||||
|
* sysdeps/i386/bsd-_setjmp.S: Correct fatal bug in jump to
|
||||||
|
`__sigsetjmp' in PIC code.
|
||||||
|
* sysdeps/i386/bsd-setjmp.S: Likewise.
|
||||||
|
|
||||||
|
* sysdeps/libm-i387/e_pow.S: Correct recognition of mantissa
|
||||||
|
overflow.
|
||||||
|
* sysdeps/libm-i387/e_powf.S: Likewise.
|
||||||
|
* sysdeps/libm-i387/s_expm1.S: Handle x == +-0 as a special
|
||||||
|
case since expm1(-0) == -0.
|
||||||
|
* sysdeps/libm-i387/s_expm1f.S: Likewise.
|
||||||
|
* sysdeps/libm-i387/s_expm1l.S: Likewise.
|
||||||
|
* sysdeps/libm-ieee754/s_modf.c: Optimize code by avoiding unneeded
|
||||||
|
access to FP number.
|
||||||
|
* sysdeps/libm-ieee754/s_modff.c: Likewise.
|
||||||
|
* sysdeps/libm-ieee754/s_modfl.c: Correct former completely bogus
|
||||||
|
code. It never worked correctly.
|
||||||
|
* sysdeps/libm-ieee754/s_tanh.c: Handle x == +-0 as a special
|
||||||
|
case since tanh(-0) == -0.
|
||||||
|
* sysdeps/libm-ieee754/s_tanhf.c: Likewise.
|
||||||
|
|
||||||
|
1997-03-19 21:13 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* stdlib/strtod.c (STRTOL): Use wchar_t as type for `decimal' and
|
||||||
|
`thousands' to support systems with sizeof(wchar_t) !=
|
||||||
|
sizeof(wint_t). Blargh.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/socketbits.h: Remove definition of
|
||||||
|
SOL_IP, SOL_TCP, SOL_UDP, and SOL_IPX as they are defined in
|
||||||
|
appropriate headers.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/writev.c: Don't use MAX_IOVEC. Test for
|
||||||
|
UIO_FASTIOV and set to 8 if not available.
|
||||||
|
* sysdeps/unix/sysv/linux/readv.c: Likewise.
|
||||||
|
Patch by HJ Lu.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/xstat.c: Include <kernel_stat.h>, not
|
||||||
|
"kernel_stat.h".
|
||||||
|
* sysdeps/unix/sysv/linux/lxstat.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/fxstat.c: Likewise.
|
||||||
|
Reported by fabsoft@fabsoft2.zarm.uni-bremen.de.
|
||||||
|
|
||||||
1997-03-19 01:40 Ulrich Drepper <drepper@cygnus.com>
|
1997-03-19 01:40 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/sco3.2.4/Dist: New file.
|
* sysdeps/unix/sysv/sco3.2.4/Dist: New file.
|
||||||
|
@ -347,7 +347,8 @@ else
|
|||||||
default-rpath = $(libdir)
|
default-rpath = $(libdir)
|
||||||
endif
|
endif
|
||||||
# This is how to find at build-time things that will be installed there.
|
# This is how to find at build-time things that will be installed there.
|
||||||
rpath-link = $(common-objdir):$(elfobjdir):$(nssobjdir)
|
rpath-link = $(common-objdir):$(mathobjdir):$(elfobjdir):$(nssobjdir)
|
||||||
|
mathobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)math)
|
||||||
elfobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)elf)
|
elfobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)elf)
|
||||||
nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
|
nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
|
||||||
else
|
else
|
||||||
@ -356,7 +357,13 @@ endif
|
|||||||
endif
|
endif
|
||||||
ifndef link-extra-libs
|
ifndef link-extra-libs
|
||||||
ifeq (yes,$(build-shared))
|
ifeq (yes,$(build-shared))
|
||||||
|
ifneq ($(common-objpfx),$(objpfx))
|
||||||
|
link-extra-libs = $(foreach lib,$(LDLIBS-$(@F)),\
|
||||||
|
$(wildcard $(common-objpfx)$(lib).so$($(notdir $(lib)).so-version) \
|
||||||
|
$(objpfx)$(lib).so$($(notdir $(lib)).so-version)))
|
||||||
|
else
|
||||||
link-extra-libs = $(foreach lib,$(LDLIBS-$(@F)),$(common-objpfx)$(lib).so$($(notdir $(lib)).so-version))
|
link-extra-libs = $(foreach lib,$(LDLIBS-$(@F)),$(common-objpfx)$(lib).so$($(notdir $(lib)).so-version))
|
||||||
|
endif
|
||||||
else
|
else
|
||||||
link-extra-libs = $(foreach lib,$(LDLIBS-$(@F)),$(common-objpfx)$(lib).a)
|
link-extra-libs = $(foreach lib,$(LDLIBS-$(@F)),$(common-objpfx)$(lib).a)
|
||||||
endif
|
endif
|
||||||
|
@ -64,6 +64,20 @@ routines = $(calls) $(calls:=f) $(long-c-$(long-double-fcts))
|
|||||||
long-c-yes = $(calls:=l)
|
long-c-yes = $(calls:=l)
|
||||||
distribute += $(long-c-yes:=.c)
|
distribute += $(long-c-yes:=.c)
|
||||||
|
|
||||||
|
# Rules for the test suite.
|
||||||
|
tests = test-float test-double $(test-longdouble-$(long-double-fcts))
|
||||||
|
# We do the `long double' tests only if this data type is available and
|
||||||
|
# distrinct from `double'.
|
||||||
|
#
|
||||||
|
# XXX This test is disabled for now since the functions are too buggy.
|
||||||
|
#test-longdouble-yes = test-longdouble
|
||||||
|
|
||||||
|
LDLIBS-test-float = libm
|
||||||
|
LDLIBS-test-double = libm
|
||||||
|
LDLIBS-test-longdouble = libm
|
||||||
|
|
||||||
|
distribute += libm-test.c
|
||||||
|
|
||||||
|
|
||||||
# The -lieee module sets the _LIB_VERSION_ switch to IEEE mode
|
# The -lieee module sets the _LIB_VERSION_ switch to IEEE mode
|
||||||
# for error handling in the -lm functions.
|
# for error handling in the -lm functions.
|
||||||
|
124
math/libm-test.c
124
math/libm-test.c
@ -41,9 +41,9 @@
|
|||||||
/* This program isn't finished yet.
|
/* This program isn't finished yet.
|
||||||
It has tests for acos, acosh, asin, asinh, atan, atan2, atanh,
|
It has tests for acos, acosh, asin, asinh, atan, atan2, atanh,
|
||||||
cbrt, ceil, cos, cosh, exp, exp2, expm1, fabs, floor, fpclassify,
|
cbrt, ceil, cos, cosh, exp, exp2, expm1, fabs, floor, fpclassify,
|
||||||
frexp, ldexp,
|
frexp, hypot, ldexp,
|
||||||
log, log10, log1p, log2, logb,
|
log, log10, log1p, log2, logb, modf,
|
||||||
pow, sin, sinh, tan, tanh, fabs, hypot.
|
pow, sin, sinh, tan, tanh.
|
||||||
Tests for the other libm-functions will come later.
|
Tests for the other libm-functions will come later.
|
||||||
|
|
||||||
The routines using random variables are still under construction. I don't
|
The routines using random variables are still under construction. I don't
|
||||||
@ -66,7 +66,9 @@
|
|||||||
log2. */
|
log2. */
|
||||||
#undef ISO_9X_IMPLEMENTED
|
#undef ISO_9X_IMPLEMENTED
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
#ifndef _GNU_SOURCE
|
||||||
|
# define _GNU_SOURCE
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
@ -192,7 +194,7 @@ check_equal (MATHTYPE computed, MATHTYPE supplied, MATHTYPE eps, MATHTYPE * diff
|
|||||||
|
|
||||||
*diff = FUNC(fabs) (computed - supplied);
|
*diff = FUNC(fabs) (computed - supplied);
|
||||||
|
|
||||||
if (*diff <= eps || signbit (computed) != signbit (supplied))
|
if (*diff <= eps && (signbit (computed) == signbit (supplied) || eps != 0.0))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -211,7 +213,7 @@ output_result_bool (const char *test_name, int result)
|
|||||||
{
|
{
|
||||||
if (verbose)
|
if (verbose)
|
||||||
printf ("Fail: %s\n", test_name);
|
printf ("Fail: %s\n", test_name);
|
||||||
noErrors++;
|
++noErrors;
|
||||||
}
|
}
|
||||||
|
|
||||||
fpstack_test (test_name);
|
fpstack_test (test_name);
|
||||||
@ -592,7 +594,7 @@ ceil_test (void)
|
|||||||
check_isinfn ("ceil (-inf) == -inf", FUNC(ceil) (minus_infty));
|
check_isinfn ("ceil (-inf) == -inf", FUNC(ceil) (minus_infty));
|
||||||
|
|
||||||
check ("ceil (pi) == 4", FUNC(ceil) (M_PI), 4.0);
|
check ("ceil (pi) == 4", FUNC(ceil) (M_PI), 4.0);
|
||||||
check ("ceil (-pi) == -3", FUNC(ceil) (-M_PI), 3.0);
|
check ("ceil (-pi) == -3", FUNC(ceil) (-M_PI), -3.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -802,7 +804,7 @@ log_test (void)
|
|||||||
check_isinfp ("log (+inf) == +inf", FUNC(log) (plus_infty));
|
check_isinfp ("log (+inf) == +inf", FUNC(log) (plus_infty));
|
||||||
|
|
||||||
check_eps ("log (e) == 1", FUNC(log) (M_E), 1, CHOOSE (0, 0, 9e-8L));
|
check_eps ("log (e) == 1", FUNC(log) (M_E), 1, CHOOSE (0, 0, 9e-8L));
|
||||||
check ("log (1/e) == -1", FUNC(log) (1.0 / M_E), 1);
|
check ("log (1/e) == -1", FUNC(log) (1.0 / M_E), -1);
|
||||||
check ("log (2) == M_LN2", FUNC(log) (2), M_LN2);
|
check ("log (2) == M_LN2", FUNC(log) (2), M_LN2);
|
||||||
check ("log (10) == M_LN10", FUNC(log) (10), M_LN10);
|
check ("log (10) == M_LN10", FUNC(log) (10), M_LN10);
|
||||||
}
|
}
|
||||||
@ -828,7 +830,7 @@ log10_test (void)
|
|||||||
check ("log10 (100) == 2", FUNC(log10) (100.0), 2);
|
check ("log10 (100) == 2", FUNC(log10) (100.0), 2);
|
||||||
check ("log10 (10000) == 4", FUNC(log10) (10000.0), 4);
|
check ("log10 (10000) == 4", FUNC(log10) (10000.0), 4);
|
||||||
check_eps ("log10 (e) == M_LOG10E", FUNC(log10) (M_E), M_LOG10E,
|
check_eps ("log10 (e) == M_LOG10E", FUNC(log10) (M_E), M_LOG10E,
|
||||||
CHOOSE (0, 0, 9e-8));
|
CHOOSE (9e-20, 0, 9e-8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -895,6 +897,42 @@ logb_test (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
modf_test (void)
|
||||||
|
{
|
||||||
|
MATHTYPE result, intpart;
|
||||||
|
|
||||||
|
result = FUNC(modf) (plus_infty, &intpart);
|
||||||
|
check ("modf (+inf, &x) returns +0", result, 0);
|
||||||
|
check_isinfp ("modf (+inf, &x) set x to +inf", intpart);
|
||||||
|
|
||||||
|
result = FUNC(modf) (minus_infty, &intpart);
|
||||||
|
check ("modf (-inf, &x) returns -0", result, minus_zero);
|
||||||
|
check_isinfn ("modf (-inf, &x) sets x to -inf", intpart);
|
||||||
|
|
||||||
|
result = FUNC(modf) (nan_value, &intpart);
|
||||||
|
check_isnan ("modf (NaN, &x) returns NaN", result);
|
||||||
|
check_isnan ("modf (-inf, &x) sets x to NaN", intpart);
|
||||||
|
|
||||||
|
result = FUNC(modf) (0, &intpart);
|
||||||
|
check ("modf (0, &x) returns 0", result, 0);
|
||||||
|
check ("modf (0, &x) sets x to 0", intpart, 0);
|
||||||
|
|
||||||
|
result = FUNC(modf) (minus_zero, &intpart);
|
||||||
|
check ("modf (-0, &x) returns -0", result, minus_zero);
|
||||||
|
check ("modf (-0, &x) sets x to -0", intpart, minus_zero);
|
||||||
|
|
||||||
|
result = FUNC(modf) (2.5, &intpart);
|
||||||
|
check ("modf (2.5, &x) returns 0.5", result, 0.5);
|
||||||
|
check ("modf (2.5, &x) sets x to 2", intpart, 2);
|
||||||
|
|
||||||
|
result = FUNC(modf) (-2.5, &intpart);
|
||||||
|
check ("modf (-2.5, &x) returns -0.5", result, -0.5);
|
||||||
|
check ("modf (-2.5, &x) sets x to -2", intpart, -2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sin_test (void)
|
sin_test (void)
|
||||||
{
|
{
|
||||||
@ -971,58 +1009,33 @@ floor_test (void)
|
|||||||
check_isinfn ("floor (-inf) == -inf", FUNC(floor) (minus_infty));
|
check_isinfn ("floor (-inf) == -inf", FUNC(floor) (minus_infty));
|
||||||
|
|
||||||
check ("floor (pi) == 3", FUNC(floor) (M_PI), 3.0);
|
check ("floor (pi) == 3", FUNC(floor) (M_PI), 3.0);
|
||||||
check ("floor (-pi) == -4", FUNC(floor) (-M_PI), 4.0);
|
check ("floor (-pi) == -4", FUNC(floor) (-M_PI), -4.0);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
hypot_report (const char *test_name, MATHTYPE computed, MATHTYPE expected)
|
|
||||||
{
|
|
||||||
MATHTYPE diff;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
result = check_equal (computed, expected, 0, &diff);
|
|
||||||
|
|
||||||
if (result)
|
|
||||||
{
|
|
||||||
if (verbose > 2)
|
|
||||||
printf ("Pass: %s\n", test_name);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (verbose)
|
|
||||||
printf ("Fail: %s\n", test_name);
|
|
||||||
if (verbose > 1)
|
|
||||||
{
|
|
||||||
printf ("Result:\n");
|
|
||||||
printf (" is: %.20" PRINTF_EXPR, computed);
|
|
||||||
printf (" should be: %.20" PRINTF_EXPR, expected);
|
|
||||||
printf (" difference: %.20" PRINTF_EXPR "\n", diff);
|
|
||||||
}
|
|
||||||
noErrors++;
|
|
||||||
}
|
|
||||||
fpstack_test (test_name);
|
|
||||||
output_result (test_name, result,
|
|
||||||
computed, expected, diff, PRINT, PRINT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hypot_test (void)
|
hypot_test (void)
|
||||||
{
|
{
|
||||||
MATHTYPE a = FUNC(hypot) (12.4L, 0.7L);
|
MATHTYPE a;
|
||||||
|
|
||||||
hypot_report ("hypot (x,y) == hypot (y,x)", FUNC(hypot) (0.7L, 12.4L), a);
|
a = random_greater (0);
|
||||||
hypot_report ("hypot (x,y) == hypot (-x,y)", FUNC(hypot) (-12.4L, 0.7L), a);
|
check_isinfp_ext ("hypot (+inf, x) == +inf", FUNC(hypot) (plus_infty, a), a);
|
||||||
hypot_report ("hypot (x,y) == hypot (-y,x)", FUNC(hypot) (-0.7L, 12.4L), a);
|
check_isinfp_ext ("hypot (-inf, x) == +inf", FUNC(hypot) (minus_infty, a), a);
|
||||||
hypot_report ("hypot (x,y) == hypot (-x,-y)", FUNC(hypot) (-12.4L, -0.7L), a);
|
|
||||||
hypot_report ("hypot (x,y) == hypot (-y,-x)", FUNC(hypot) (-0.7L, -12.4L), a);
|
check_isnan ("hypot (NaN, NaN) == NaN", FUNC(hypot) (nan_value, nan_value));
|
||||||
|
|
||||||
|
a = FUNC(hypot) (12.4L, 0.7L);
|
||||||
|
check ("hypot (x,y) == hypot (y,x)", FUNC(hypot) (0.7L, 12.4L), a);
|
||||||
|
check ("hypot (x,y) == hypot (-x,y)", FUNC(hypot) (-12.4L, 0.7L), a);
|
||||||
|
check ("hypot (x,y) == hypot (-y,x)", FUNC(hypot) (-0.7L, 12.4L), a);
|
||||||
|
check ("hypot (x,y) == hypot (-x,-y)", FUNC(hypot) (-12.4L, -0.7L), a);
|
||||||
|
check ("hypot (x,y) == hypot (-y,-x)", FUNC(hypot) (-0.7L, -12.4L), a);
|
||||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-0.7L, 0), 0.7L);
|
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-0.7L, 0), 0.7L);
|
||||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (0.7L, 0), 0.7L);
|
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (0.7L, 0), 0.7L);
|
||||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-1.0L, 0), 1.0L);
|
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-1.0L, 0), 1.0L);
|
||||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-1.0L, 0), 1.0L);
|
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (1.0L, 0), 1.0L);
|
||||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-5.7e7L, 0), 5.7e7L);
|
|
||||||
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-5.7e7L, 0), 5.7e7L);
|
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-5.7e7L, 0), 5.7e7L);
|
||||||
|
check ("hypot (x,0) == fabs (x)", FUNC(hypot) (5.7e7L, 0), 5.7e7L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1084,9 +1097,9 @@ pow_test (void)
|
|||||||
check_isinfp ("pow (-inf, 11.1) == +inf", FUNC(pow) (minus_infty, 11.1));
|
check_isinfp ("pow (-inf, 11.1) == +inf", FUNC(pow) (minus_infty, 11.1));
|
||||||
check_isinfp ("pow (-inf, 1001.1) == +inf", FUNC(pow) (minus_infty, 1001.1));
|
check_isinfp ("pow (-inf, 1001.1) == +inf", FUNC(pow) (minus_infty, 1001.1));
|
||||||
|
|
||||||
check ("pow (-inf, -1) == -0", FUNC(pow) (-minus_infty, -1), minus_zero);
|
check ("pow (-inf, -1) == -0", FUNC(pow) (minus_infty, -1), minus_zero);
|
||||||
check ("pow (-inf, -11) == -0", FUNC(pow) (-minus_infty, -11), minus_zero);
|
check ("pow (-inf, -11) == -0", FUNC(pow) (minus_infty, -11), minus_zero);
|
||||||
check ("pow (-inf, -1001) == -0", FUNC(pow) (-minus_infty, -1001), minus_zero);
|
check ("pow (-inf, -1001) == -0", FUNC(pow) (minus_infty, -1001), minus_zero);
|
||||||
|
|
||||||
check ("pow (-inf, -2) == +0", FUNC(pow) (minus_infty, -2), 0);
|
check ("pow (-inf, -2) == +0", FUNC(pow) (minus_infty, -2), 0);
|
||||||
check ("pow (-inf, -12) == +0", FUNC(pow) (minus_infty, -12), 0);
|
check ("pow (-inf, -12) == +0", FUNC(pow) (minus_infty, -12), 0);
|
||||||
@ -1189,8 +1202,8 @@ pow_test (void)
|
|||||||
FUNC(pow) (minus_infty, x), minus_zero, x);
|
FUNC(pow) (minus_infty, x), minus_zero, x);
|
||||||
|
|
||||||
x = ((rand () % 1000000) + 1) * -2.0; /* Get random even integer < 0 */
|
x = ((rand () % 1000000) + 1) * -2.0; /* Get random even integer < 0 */
|
||||||
check_ext ("pow (-inf, y) == -0 for y < 0 and not an odd integer",
|
check_ext ("pow (-inf, y) == 0 for y < 0 and not an odd integer",
|
||||||
FUNC(pow) (minus_infty, x), minus_zero, x);
|
FUNC(pow) (minus_infty, x), 0.0, x);
|
||||||
|
|
||||||
x = (rand () % 1000000) * 2.0 + 1; /* Get random odd integer > 0 */
|
x = (rand () % 1000000) * 2.0 + 1; /* Get random odd integer > 0 */
|
||||||
check_ext ("pow (+0, y) == +0 for y an odd integer > 0",
|
check_ext ("pow (+0, y) == +0 for y an odd integer > 0",
|
||||||
@ -1497,6 +1510,7 @@ main (int argc, char *argv[])
|
|||||||
log2_test ();
|
log2_test ();
|
||||||
#endif
|
#endif
|
||||||
logb_test ();
|
logb_test ();
|
||||||
|
modf_test ();
|
||||||
sin_test ();
|
sin_test ();
|
||||||
sinh_test ();
|
sinh_test ();
|
||||||
tan_test ();
|
tan_test ();
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Cdouble
|
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Cdouble
|
||||||
#define PRINTF_EXPR "e"
|
#define PRINTF_EXPR "e"
|
||||||
|
|
||||||
#define __NO_MATH_INLINES
|
#ifndef __NO_MATH_INLINES
|
||||||
|
# define __NO_MATH_INLINES
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "libm-test.c"
|
#include "libm-test.c"
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Cfloat
|
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Cfloat
|
||||||
#define PRINTF_EXPR "e"
|
#define PRINTF_EXPR "e"
|
||||||
|
|
||||||
#define __NO_MATH_INLINES
|
#ifndef __NO_MATH_INLINES
|
||||||
|
# define __NO_MATH_INLINES
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "libm-test.c"
|
#include "libm-test.c"
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Clongdouble
|
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Clongdouble
|
||||||
#define PRINTF_EXPR "Le"
|
#define PRINTF_EXPR "Le"
|
||||||
|
|
||||||
#define __NO_MATH_INLINES
|
#ifndef __NO_MATH_INLINES
|
||||||
|
# define __NO_MATH_INLINES
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "libm-test.c"
|
#include "libm-test.c"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
|
/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -51,7 +51,7 @@ extern int __sigsetjmp __P ((jmp_buf __env, int __savemask));
|
|||||||
#ifndef __FAVOR_BSD
|
#ifndef __FAVOR_BSD
|
||||||
/* Set ENV to the current position and return 0, not saving the signal mask.
|
/* Set ENV to the current position and return 0, not saving the signal mask.
|
||||||
This is just like `sigsetjmp (ENV, 0)'.
|
This is just like `sigsetjmp (ENV, 0)'.
|
||||||
The ANSI C standard says `setjmp' is a macro. */
|
The ISO C standard says `setjmp' is a macro. */
|
||||||
#define setjmp(env) __sigsetjmp ((env), 0)
|
#define setjmp(env) __sigsetjmp ((env), 0)
|
||||||
#else
|
#else
|
||||||
/* We are in 4.3 BSD-compatibility mode in which `setjmp'
|
/* We are in 4.3 BSD-compatibility mode in which `setjmp'
|
||||||
@ -61,7 +61,7 @@ extern int __sigsetjmp __P ((jmp_buf __env, int __savemask));
|
|||||||
|
|
||||||
#ifdef __USE_BSD
|
#ifdef __USE_BSD
|
||||||
/* Set ENV to the current position and return 0, not saving the signal mask.
|
/* Set ENV to the current position and return 0, not saving the signal mask.
|
||||||
This is the 4.3 BSD name for ANSI `setjmp'. */
|
This is the 4.3 BSD name for ISO `setjmp'. */
|
||||||
#define _setjmp(env) __sigsetjmp ((env), 0)
|
#define _setjmp(env) __sigsetjmp ((env), 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -54,8 +54,14 @@ main (void)
|
|||||||
|
|
||||||
if (!lose && value == 10)
|
if (!lose && value == 10)
|
||||||
{
|
{
|
||||||
/* Do a second test, this time without `setjmp' being a macro. */
|
/* Do a second test, this time without `setjmp' being a macro.
|
||||||
|
This is not required by ISO C but we have this for compatibility. */
|
||||||
#undef setjmp
|
#undef setjmp
|
||||||
|
extern int setjmp (jmp_buf);
|
||||||
|
|
||||||
|
last_value = -1;
|
||||||
|
lose = 0;
|
||||||
|
|
||||||
value = setjmp (env);
|
value = setjmp (env);
|
||||||
if (value != last_value + 1)
|
if (value != last_value + 1)
|
||||||
{
|
{
|
||||||
@ -75,6 +81,33 @@ main (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!lose && value == 10)
|
||||||
|
{
|
||||||
|
/* And again for the `__setjmp' function. */
|
||||||
|
extern int __setjmp (jmp_buf);
|
||||||
|
|
||||||
|
last_value = -1;
|
||||||
|
lose = 0;
|
||||||
|
|
||||||
|
value = __setjmp (env);
|
||||||
|
if (value != last_value + 1)
|
||||||
|
{
|
||||||
|
fputs("Shouldn't have ", stdout);
|
||||||
|
lose = 1;
|
||||||
|
}
|
||||||
|
last_value = value;
|
||||||
|
switch (value)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
puts("Saved environment.");
|
||||||
|
jump (0);
|
||||||
|
default:
|
||||||
|
printf ("Jumped to %d.\n", value);
|
||||||
|
if (value < 10)
|
||||||
|
jump (value + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (lose || value != 10)
|
if (lose || value != 10)
|
||||||
puts ("Test FAILED!");
|
puts ("Test FAILED!");
|
||||||
else
|
else
|
||||||
|
@ -383,15 +383,13 @@ INTERNAL (STRTOF) (nptr, endptr, group)
|
|||||||
typedef unsigned int wint_t;
|
typedef unsigned int wint_t;
|
||||||
#endif
|
#endif
|
||||||
/* The radix character of the current locale. */
|
/* The radix character of the current locale. */
|
||||||
wint_t decimal;
|
wchar_t decimal;
|
||||||
/* The thousands character of the current locale. */
|
/* The thousands character of the current locale. */
|
||||||
wint_t thousands;
|
wchar_t thousands;
|
||||||
/* The numeric grouping specification of the current locale,
|
/* The numeric grouping specification of the current locale,
|
||||||
in the format described in <locale.h>. */
|
in the format described in <locale.h>. */
|
||||||
const char *grouping;
|
const char *grouping;
|
||||||
|
|
||||||
assert (sizeof (wchar_t) == sizeof (wint_t));
|
|
||||||
|
|
||||||
if (group)
|
if (group)
|
||||||
{
|
{
|
||||||
grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
|
grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
|
||||||
@ -400,10 +398,9 @@ INTERNAL (STRTOF) (nptr, endptr, group)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Figure out the thousands separator character. */
|
/* Figure out the thousands separator character. */
|
||||||
if (mbtowc ((wchar_t *) &thousands,
|
if (mbtowc (&thousands, _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP),
|
||||||
_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP),
|
|
||||||
strlen (_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP))) <= 0)
|
strlen (_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP))) <= 0)
|
||||||
thousands = (wint_t) *_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP);
|
thousands = (wchar_t) *_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP);
|
||||||
if (thousands == L'\0')
|
if (thousands == L'\0')
|
||||||
grouping = NULL;
|
grouping = NULL;
|
||||||
}
|
}
|
||||||
@ -417,7 +414,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
|
|||||||
/* Find the locale's decimal point character. */
|
/* Find the locale's decimal point character. */
|
||||||
if (mbtowc ((wchar_t *) &decimal, _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT),
|
if (mbtowc ((wchar_t *) &decimal, _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT),
|
||||||
strlen (_NL_CURRENT (LC_NUMERIC, DECIMAL_POINT))) <= 0)
|
strlen (_NL_CURRENT (LC_NUMERIC, DECIMAL_POINT))) <= 0)
|
||||||
decimal = (wint_t) *_NL_CURRENT (LC_NUMERIC, DECIMAL_POINT);
|
decimal = (wchar_t) *_NL_CURRENT (LC_NUMERIC, DECIMAL_POINT);
|
||||||
assert (decimal != L'\0');
|
assert (decimal != L'\0');
|
||||||
|
|
||||||
/* Prepare number representation. */
|
/* Prepare number representation. */
|
||||||
@ -445,7 +442,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
|
|||||||
/* Return 0.0 if no legal string is found.
|
/* Return 0.0 if no legal string is found.
|
||||||
No character is used even if a sign was found. */
|
No character is used even if a sign was found. */
|
||||||
if ((c < L_('0') || c > L_('9'))
|
if ((c < L_('0') || c > L_('9'))
|
||||||
&& ((wint_t) c != decimal || cp[1] < L_('0') || cp[1] > L_('9')))
|
&& ((wchar_t) c != decimal || cp[1] < L_('0') || cp[1] > L_('9')))
|
||||||
{
|
{
|
||||||
int matched = 0;
|
int matched = 0;
|
||||||
/* Check for `INF' or `INFINITY'. */
|
/* Check for `INF' or `INFINITY'. */
|
||||||
@ -511,14 +508,14 @@ INTERNAL (STRTOF) (nptr, endptr, group)
|
|||||||
start_of_digits = startp = cp;
|
start_of_digits = startp = cp;
|
||||||
|
|
||||||
/* Ignore leading zeroes. This helps us to avoid useless computations. */
|
/* Ignore leading zeroes. This helps us to avoid useless computations. */
|
||||||
while (c == L_('0') || (thousands != L'\0' && (wint_t) c == thousands))
|
while (c == L_('0') || (thousands != L'\0' && (wchar_t) c == thousands))
|
||||||
c = *++cp;
|
c = *++cp;
|
||||||
|
|
||||||
/* If no other digit but a '0' is found the result is 0.0.
|
/* If no other digit but a '0' is found the result is 0.0.
|
||||||
Return current read pointer. */
|
Return current read pointer. */
|
||||||
if ((c < L_('0') || c > L_('9')) &&
|
if ((c < L_('0') || c > L_('9')) &&
|
||||||
(base == 16 && (c < TOLOWER (L_('a')) || c > TOLOWER (L_('f')))) &&
|
(base == 16 && (c < TOLOWER (L_('a')) || c > TOLOWER (L_('f')))) &&
|
||||||
(wint_t) c != decimal &&
|
(wchar_t) c != decimal &&
|
||||||
(base == 16 && (cp == start_of_digits || TOLOWER (c) != L_('p'))) &&
|
(base == 16 && (cp == start_of_digits || TOLOWER (c) != L_('p'))) &&
|
||||||
(base != 16 && TOLOWER (c) != L_('e')))
|
(base != 16 && TOLOWER (c) != L_('e')))
|
||||||
{
|
{
|
||||||
@ -540,7 +537,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
|
|||||||
if ((c >= L_('0') && c <= L_('9'))
|
if ((c >= L_('0') && c <= L_('9'))
|
||||||
|| (base == 16 && TOLOWER (c) >= L_('a') && TOLOWER (c) <= L_('f')))
|
|| (base == 16 && TOLOWER (c) >= L_('a') && TOLOWER (c) <= L_('f')))
|
||||||
++dig_no;
|
++dig_no;
|
||||||
else if (thousands == L'\0' || (wint_t) c != thousands)
|
else if (thousands == L'\0' || (wchar_t) c != thousands)
|
||||||
/* Not a digit or separator: end of the integer part. */
|
/* Not a digit or separator: end of the integer part. */
|
||||||
break;
|
break;
|
||||||
c = *++cp;
|
c = *++cp;
|
||||||
@ -590,7 +587,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
|
|||||||
|
|
||||||
/* Read the fractional digits. A special case are the 'american style'
|
/* Read the fractional digits. A special case are the 'american style'
|
||||||
numbers like `16.' i.e. with decimal but without trailing digits. */
|
numbers like `16.' i.e. with decimal but without trailing digits. */
|
||||||
if ((wint_t) c == decimal)
|
if ((wchar_t) c == decimal)
|
||||||
{
|
{
|
||||||
c = *++cp;
|
c = *++cp;
|
||||||
while (c >= L_('0') && c <= L_('9') ||
|
while (c >= L_('0') && c <= L_('9') ||
|
||||||
@ -693,7 +690,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
|
|||||||
if (lead_zero)
|
if (lead_zero)
|
||||||
{
|
{
|
||||||
/* Find the decimal point */
|
/* Find the decimal point */
|
||||||
while ((wint_t) *startp != decimal)
|
while ((wchar_t) *startp != decimal)
|
||||||
++startp;
|
++startp;
|
||||||
startp += lead_zero + 1;
|
startp += lead_zero + 1;
|
||||||
exponent -= base == 16 ? 4 * lead_zero : lead_zero;
|
exponent -= base == 16 ? 4 * lead_zero : lead_zero;
|
||||||
|
@ -1,21 +1,21 @@
|
|||||||
/* longjmp for i386.
|
/* longjmp for i386.
|
||||||
Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#define _ASM
|
#define _ASM
|
||||||
|
@ -1,21 +1,21 @@
|
|||||||
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. i386 version.
|
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. i386 version.
|
||||||
Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
|
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
/* This just does a tail-call to `__sigsetjmp (ARG, 0)'.
|
/* This just does a tail-call to `__sigsetjmp (ARG, 0)'.
|
||||||
We cannot do it in C because it must be a tail-call, so frame-unwinding
|
We cannot do it in C because it must be a tail-call, so frame-unwinding
|
||||||
@ -29,5 +29,17 @@ ENTRY (_setjmp)
|
|||||||
pushl $0 /* Push second argument of zero. */
|
pushl $0 /* Push second argument of zero. */
|
||||||
pushl %ecx /* Push back first argument. */
|
pushl %ecx /* Push back first argument. */
|
||||||
pushl %eax /* Push back return PC. */
|
pushl %eax /* Push back return PC. */
|
||||||
jmp JUMPTARGET (C_SYMBOL_NAME (__sigsetjmp))
|
#ifdef PIC
|
||||||
|
/* We cannot use the PLT, because it requires that %ebx be set, but
|
||||||
|
we can't save and restore our caller's value. Instead, we do an
|
||||||
|
indirect jump through the GOT, using for the temporary register
|
||||||
|
%ecx, which is call-clobbered. */
|
||||||
|
call here
|
||||||
|
here: popl %ecx
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx
|
||||||
|
movl C_SYMBOL_NAME(__sigsetjmp@GOT)(%ecx), %ecx
|
||||||
|
jmp *%ecx
|
||||||
|
#else
|
||||||
|
jmp __sigsetjmp
|
||||||
|
#endif
|
||||||
END (_setjmp)
|
END (_setjmp)
|
||||||
|
@ -1,21 +1,21 @@
|
|||||||
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. i386 version.
|
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. i386 version.
|
||||||
Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
|
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
/* This just does a tail-call to `__sigsetjmp (ARG, 1)'.
|
/* This just does a tail-call to `__sigsetjmp (ARG, 1)'.
|
||||||
We cannot do it in C because it must be a tail-call, so frame-unwinding
|
We cannot do it in C because it must be a tail-call, so frame-unwinding
|
||||||
@ -29,5 +29,17 @@ ENTRY (setjmp)
|
|||||||
pushl $1 /* Push second argument of one. */
|
pushl $1 /* Push second argument of one. */
|
||||||
pushl %ecx /* Push back first argument. */
|
pushl %ecx /* Push back first argument. */
|
||||||
pushl %eax /* Push back return PC. */
|
pushl %eax /* Push back return PC. */
|
||||||
jmp JUMPTARGET (C_SYMBOL_NAME (__sigsetjmp))
|
#ifdef PIC
|
||||||
|
/* We cannot use the PLT, because it requires that %ebx be set, but
|
||||||
|
we can't save and restore our caller's value. Instead, we do an
|
||||||
|
indirect jump through the GOT, using for the temporary register
|
||||||
|
%ecx, which is call-clobbered. */
|
||||||
|
call here
|
||||||
|
here: popl %ecx
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx
|
||||||
|
movl C_SYMBOL_NAME(__sigsetjmp@GOT)(%ecx), %ecx
|
||||||
|
jmp *%ecx
|
||||||
|
#else
|
||||||
|
jmp __sigsetjmp
|
||||||
|
#endif
|
||||||
END (setjmp)
|
END (setjmp)
|
||||||
|
@ -308,7 +308,7 @@ ENTRY(__ieee754_pow)
|
|||||||
andb $1, %al
|
andb $1, %al
|
||||||
jz 24f // jump if not odd
|
jz 24f // jump if not odd
|
||||||
cmpl $0xffe00000, %edx
|
cmpl $0xffe00000, %edx
|
||||||
jbe 24f // does not fit in mantissa bits
|
jae 24f // does not fit in mantissa bits
|
||||||
// It's an odd integer.
|
// It's an odd integer.
|
||||||
fldl MO(mzero)
|
fldl MO(mzero)
|
||||||
ret
|
ret
|
||||||
|
@ -300,7 +300,7 @@ ENTRY(__ieee754_powf)
|
|||||||
testb $1, %dl
|
testb $1, %dl
|
||||||
jz 24f // jump if not odd
|
jz 24f // jump if not odd
|
||||||
cmpl $0xff000000, %edx
|
cmpl $0xff000000, %edx
|
||||||
jbe 24f // does not fit in mantissa bits
|
jae 24f // does not fit in mantissa bits
|
||||||
// It's an odd integer.
|
// It's an odd integer.
|
||||||
fldl MO(mzero)
|
fldl MO(mzero)
|
||||||
ret
|
ret
|
||||||
|
@ -51,15 +51,17 @@ ENTRY(__expm1)
|
|||||||
fldl 4(%esp) // x
|
fldl 4(%esp) // x
|
||||||
fxam // Is NaN or +-Inf?
|
fxam // Is NaN or +-Inf?
|
||||||
fstsw %ax
|
fstsw %ax
|
||||||
|
movb $0x45, %ch
|
||||||
|
andb %ah, %ch
|
||||||
|
cmpb $0x40, %ch
|
||||||
|
je 3f // If +-0, jump.
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
call 1f
|
call 1f
|
||||||
1: popl %edx
|
1: popl %edx
|
||||||
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
||||||
#endif
|
#endif
|
||||||
movb $0x45, %ch
|
|
||||||
andb %ah, %ch
|
|
||||||
cmpb $0x05, %ch
|
cmpb $0x05, %ch
|
||||||
je 2f // Is +-Inf, jump.
|
je 2f // If +-Inf, jump.
|
||||||
|
|
||||||
fldt MO(l2e) // log2(e) : x
|
fldt MO(l2e) // log2(e) : x
|
||||||
fmulp // log2(e)*x
|
fmulp // log2(e)*x
|
||||||
|
@ -51,15 +51,17 @@ ENTRY(__expm1f)
|
|||||||
flds 4(%esp) // x
|
flds 4(%esp) // x
|
||||||
fxam // Is NaN or +-Inf?
|
fxam // Is NaN or +-Inf?
|
||||||
fstsw %ax
|
fstsw %ax
|
||||||
|
movb $0x45, %ch
|
||||||
|
andb %ah, %ch
|
||||||
|
cmpb $0x40, %ch
|
||||||
|
je 3f // If +-0, jump.
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
call 1f
|
call 1f
|
||||||
1: popl %edx
|
1: popl %edx
|
||||||
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
||||||
#endif
|
#endif
|
||||||
movb $0x45, %ch
|
|
||||||
andb %ah, %ch
|
|
||||||
cmpb $0x05, %ch
|
cmpb $0x05, %ch
|
||||||
je 2f // Is +-Inf, jump.
|
je 2f // If +-Inf, jump.
|
||||||
|
|
||||||
fldt MO(l2e) // log2(e) : x
|
fldt MO(l2e) // log2(e) : x
|
||||||
fmulp // log2(e)*x
|
fmulp // log2(e)*x
|
||||||
|
@ -51,15 +51,17 @@ ENTRY(__expm1l)
|
|||||||
fldt 4(%esp) // x
|
fldt 4(%esp) // x
|
||||||
fxam // Is NaN or +-Inf?
|
fxam // Is NaN or +-Inf?
|
||||||
fstsw %ax
|
fstsw %ax
|
||||||
|
movb $0x45, %ch
|
||||||
|
andb %ah, %ch
|
||||||
|
cmpb $0x40, %ch
|
||||||
|
je 3f // If +-0, jump.
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
call 1f
|
call 1f
|
||||||
1: popl %edx
|
1: popl %edx
|
||||||
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
||||||
#endif
|
#endif
|
||||||
movb $0x45, %ch
|
|
||||||
andb %ah, %ch
|
|
||||||
cmpb $0x05, %ch
|
cmpb $0x05, %ch
|
||||||
je 2f // Is +-Inf, jump.
|
je 2f // If +-Inf, jump.
|
||||||
|
|
||||||
fldt MO(l2e) // log2(e) : x
|
fldt MO(l2e) // log2(e) : x
|
||||||
fmulp // log2(e)*x
|
fmulp // log2(e)*x
|
||||||
|
@ -51,10 +51,8 @@ static double one = 1.0;
|
|||||||
} else {
|
} else {
|
||||||
i = (0x000fffff)>>j0;
|
i = (0x000fffff)>>j0;
|
||||||
if(((i0&i)|i1)==0) { /* x is integral */
|
if(((i0&i)|i1)==0) { /* x is integral */
|
||||||
u_int32_t high;
|
|
||||||
*iptr = x;
|
*iptr = x;
|
||||||
GET_HIGH_WORD(high,x);
|
INSERT_WORDS(x,i0&0x80000000,0); /* return +-0 */
|
||||||
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
|
|
||||||
return x;
|
return x;
|
||||||
} else {
|
} else {
|
||||||
INSERT_WORDS(*iptr,i0&(~i),0);
|
INSERT_WORDS(*iptr,i0&(~i),0);
|
||||||
@ -64,8 +62,10 @@ static double one = 1.0;
|
|||||||
} else if (j0>51) { /* no fraction part */
|
} else if (j0>51) { /* no fraction part */
|
||||||
u_int32_t high;
|
u_int32_t high;
|
||||||
*iptr = x*one;
|
*iptr = x*one;
|
||||||
GET_HIGH_WORD(high,x);
|
/* We must handle NaNs separately. */
|
||||||
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
|
if (j0 == 0x400 && ((i0 & 0xfffff) | i1))
|
||||||
|
return x*one;
|
||||||
|
INSERT_WORDS(x,i0&0x80000000,0); /* return +-0 */
|
||||||
return x;
|
return x;
|
||||||
} else { /* fraction part in low x */
|
} else { /* fraction part in low x */
|
||||||
i = ((u_int32_t)(0xffffffff))>>(j0-20);
|
i = ((u_int32_t)(0xffffffff))>>(j0-20);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||||
* Permission to use, copy, modify, and distribute this
|
* Permission to use, copy, modify, and distribute this
|
||||||
* software is freely granted, provided that this notice
|
* software is freely granted, provided that this notice
|
||||||
* is preserved.
|
* is preserved.
|
||||||
* ====================================================
|
* ====================================================
|
||||||
*/
|
*/
|
||||||
@ -57,8 +57,10 @@ static float one = 1.0;
|
|||||||
} else { /* no fraction part */
|
} else { /* no fraction part */
|
||||||
u_int32_t ix;
|
u_int32_t ix;
|
||||||
*iptr = x*one;
|
*iptr = x*one;
|
||||||
GET_FLOAT_WORD(ix,x);
|
/* We must handle NaNs separately. */
|
||||||
SET_FLOAT_WORD(x,ix&0x80000000); /* return +-0 */
|
if (j0 == 0x80 && (i0 & 0x7fffff))
|
||||||
|
return x*one;
|
||||||
|
SET_FLOAT_WORD(x,i0&0x80000000); /* return +-0 */
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,32 +55,29 @@ static long double one = 1.0;
|
|||||||
} else {
|
} else {
|
||||||
i = (0xffffffff)>>j0;
|
i = (0xffffffff)>>j0;
|
||||||
if(((i0&i)|i1)==0) { /* x is integral */
|
if(((i0&i)|i1)==0) { /* x is integral */
|
||||||
u_int32_t high;
|
|
||||||
*iptr = x;
|
*iptr = x;
|
||||||
GET_HIGH_WORD(high,x);
|
SET_LDOUBLE_WORDS(x,se&0x8000,0,0); /* return +-0 */
|
||||||
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
|
|
||||||
return x;
|
return x;
|
||||||
} else {
|
} else {
|
||||||
INSERT_WORDS(*iptr,i0&(~i),0);
|
SET_LDOUBLE_WORDS(*iptr,se,i0&(~i),0);
|
||||||
return x - *iptr;
|
return x - *iptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (j0>63) { /* no fraction part */
|
} else if (j0>63) { /* no fraction part */
|
||||||
u_int32_t high;
|
|
||||||
*iptr = x*one;
|
*iptr = x*one;
|
||||||
GET_HIGH_WORD(high,x);
|
/* We must handle NaNs separately. */
|
||||||
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
|
if (j0 == 0x4000 && ((i0 & 0x7fffffff) | i1))
|
||||||
|
return x*one;
|
||||||
|
SET_LDOUBLE_WORDS(x,se&0x8000,0,0); /* return +-0 */
|
||||||
return x;
|
return x;
|
||||||
} else { /* fraction part in low x */
|
} else { /* fraction part in low x */
|
||||||
i = ((u_int32_t)(0xffffffff))>>(j0-20);
|
i = ((u_int32_t)(0xffffffff))>>(j0-20);
|
||||||
if((i1&i)==0) { /* x is integral */
|
if((i1&i)==0) { /* x is integral */
|
||||||
u_int32_t high;
|
|
||||||
*iptr = x;
|
*iptr = x;
|
||||||
GET_HIGH_WORD(high,x);
|
INSERT_WORDS(x,se&0x8000,0); /* return +-0 */
|
||||||
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
|
|
||||||
return x;
|
return x;
|
||||||
} else {
|
} else {
|
||||||
INSERT_WORDS(*iptr,i0,i1&(~i));
|
SET_LDOUBLE_WORDS(*iptr,se,i0,i1&(~i));
|
||||||
return x - *iptr;
|
return x - *iptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,10 +55,10 @@ static double one=1.0, two=2.0, tiny = 1.0e-300;
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
double t,z;
|
double t,z;
|
||||||
int32_t jx,ix;
|
int32_t jx,ix,lx;
|
||||||
|
|
||||||
/* High word of |x|. */
|
/* High word of |x|. */
|
||||||
GET_HIGH_WORD(jx,x);
|
EXTRACT_WORDS(jx,lx,x);
|
||||||
ix = jx&0x7fffffff;
|
ix = jx&0x7fffffff;
|
||||||
|
|
||||||
/* x is INF or NaN */
|
/* x is INF or NaN */
|
||||||
@ -69,6 +69,8 @@ static double one=1.0, two=2.0, tiny = 1.0e-300;
|
|||||||
|
|
||||||
/* |x| < 22 */
|
/* |x| < 22 */
|
||||||
if (ix < 0x40360000) { /* |x|<22 */
|
if (ix < 0x40360000) { /* |x|<22 */
|
||||||
|
if ((ix | lx) == 0)
|
||||||
|
return x; /* x == +-0 */
|
||||||
if (ix<0x3c800000) /* |x|<2**-55 */
|
if (ix<0x3c800000) /* |x|<2**-55 */
|
||||||
return x*(one+x); /* tanh(small) = small */
|
return x*(one+x); /* tanh(small) = small */
|
||||||
if (ix>=0x3ff00000) { /* |x|>=1 */
|
if (ix>=0x3ff00000) { /* |x|>=1 */
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||||
* Permission to use, copy, modify, and distribute this
|
* Permission to use, copy, modify, and distribute this
|
||||||
* software is freely granted, provided that this notice
|
* software is freely granted, provided that this notice
|
||||||
* is preserved.
|
* is preserved.
|
||||||
* ====================================================
|
* ====================================================
|
||||||
*/
|
*/
|
||||||
@ -40,13 +40,15 @@ static float one=1.0, two=2.0, tiny = 1.0e-30;
|
|||||||
ix = jx&0x7fffffff;
|
ix = jx&0x7fffffff;
|
||||||
|
|
||||||
/* x is INF or NaN */
|
/* x is INF or NaN */
|
||||||
if(ix>=0x7f800000) {
|
if(ix>=0x7f800000) {
|
||||||
if (jx>=0) return one/x+one; /* tanh(+-inf)=+-1 */
|
if (jx>=0) return one/x+one; /* tanh(+-inf)=+-1 */
|
||||||
else return one/x-one; /* tanh(NaN) = NaN */
|
else return one/x-one; /* tanh(NaN) = NaN */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* |x| < 22 */
|
/* |x| < 22 */
|
||||||
if (ix < 0x41b00000) { /* |x|<22 */
|
if (ix < 0x41b00000) { /* |x|<22 */
|
||||||
|
if (ix == 0)
|
||||||
|
return x; /* x == +-0 */
|
||||||
if (ix<0x24000000) /* |x|<2**-55 */
|
if (ix<0x24000000) /* |x|<2**-55 */
|
||||||
return x*(one+x); /* tanh(small) = small */
|
return x*(one+x); /* tanh(small) = small */
|
||||||
if (ix>=0x3f800000) { /* |x|>=1 */
|
if (ix>=0x3f800000) { /* |x|>=1 */
|
||||||
|
@ -68,12 +68,15 @@ static long double one=1.0, two=2.0, tiny = 1.0e-4900L;
|
|||||||
|
|
||||||
/* x is INF or NaN */
|
/* x is INF or NaN */
|
||||||
if(ix==0x7fff) {
|
if(ix==0x7fff) {
|
||||||
if (se>=0x7fff) return one/x+one; /* tanhl(+-inf)=+-1 */
|
/* for NaN it's not important which branch: tanhl(NaN) = NaN */
|
||||||
else return one/x-one; /* tanhl(NaN) = NaN */
|
if (se&0x8000) return one/x-one; /* tanhl(-inf)= -1; */
|
||||||
|
else return one/x+one; /* tanhl(+inf)=+1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* |x| < 23 */
|
/* |x| < 23 */
|
||||||
if (ix < 0x4003 || (ix == 0x4003 && j0 < 0xb8000000u)) {/* |x|<23 */
|
if (ix < 0x4003 || (ix == 0x4003 && j0 < 0xb8000000u)) {/* |x|<23 */
|
||||||
|
if ((ix|j0|j1) == 0)
|
||||||
|
return x; /* x == +- 0 */
|
||||||
if (ix<0x3fc8) /* |x|<2**-55 */
|
if (ix<0x3fc8) /* |x|<2**-55 */
|
||||||
return x*(one+x); /* tanh(small) = small */
|
return x*(one+x); /* tanh(small) = small */
|
||||||
if (ix>=0x3fff) { /* |x|>=1 */
|
if (ix>=0x3fff) { /* |x|>=1 */
|
||||||
|
1
sysdeps/unix/bsd/osf/.cvsignore
Normal file
1
sysdeps/unix/bsd/osf/.cvsignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
=*
|
@ -21,7 +21,7 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "kernel_stat.h"
|
#include <kernel_stat.h>
|
||||||
|
|
||||||
extern int __syscall_fstat (int, struct kernel_stat *);
|
extern int __syscall_fstat (int, struct kernel_stat *);
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "kernel_stat.h"
|
#include <kernel_stat.h>
|
||||||
|
|
||||||
extern int __syscall_lstat (const char *, struct kernel_stat *);
|
extern int __syscall_lstat (const char *, struct kernel_stat *);
|
||||||
|
|
||||||
|
@ -26,15 +26,12 @@ extern ssize_t __syscall_readv __P ((int, __const struct iovec *, int));
|
|||||||
|
|
||||||
|
|
||||||
/* Not all versions of the kernel support the large number of records. */
|
/* Not all versions of the kernel support the large number of records. */
|
||||||
#undef MAX_IOVEC
|
#ifndef UIO_FASTIOV
|
||||||
#ifdef UIO_FASTIOV
|
# define UIO_FASTIOV 8 /* 8 is a safe number. */
|
||||||
# define MAX_IOVEC UIO_FASTIOV
|
|
||||||
#else
|
|
||||||
# define MAX_IOVEC 8 /* 8 is a safe number. */
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* We should deal with kernel which have a smaller UIO_MAXIOV as well
|
/* We should deal with kernel which have a smaller UIO_FASTIOV as well
|
||||||
as a very big count. */
|
as a very big count. */
|
||||||
ssize_t
|
ssize_t
|
||||||
readv (fd, vector, count)
|
readv (fd, vector, count)
|
||||||
@ -47,7 +44,7 @@ readv (fd, vector, count)
|
|||||||
|
|
||||||
bytes_read = __syscall_readv (fd, vector, count);
|
bytes_read = __syscall_readv (fd, vector, count);
|
||||||
|
|
||||||
if (bytes_read < 0 && errno == EINVAL && count > MAX_IOVEC)
|
if (bytes_read < 0 && errno == EINVAL && count > UIO_FASTIOV)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -55,10 +52,10 @@ readv (fd, vector, count)
|
|||||||
__set_errno (errno_saved);
|
__set_errno (errno_saved);
|
||||||
|
|
||||||
bytes_read = 0;
|
bytes_read = 0;
|
||||||
for (i = 0; i < count; i += MAX_IOVEC)
|
for (i = 0; i < count; i += UIO_FASTIOV)
|
||||||
{
|
{
|
||||||
ssize_t bytes = __syscall_readv (fd, vector + i,
|
ssize_t bytes = __syscall_readv (fd, vector + i,
|
||||||
MIN (count - i, MAX_IOVEC));
|
MIN (count - i, UIO_FASTIOV));
|
||||||
|
|
||||||
if (bytes < 0)
|
if (bytes < 0)
|
||||||
return bytes;
|
return bytes;
|
||||||
|
@ -83,14 +83,13 @@ enum __socket_type
|
|||||||
#define AF_INET6 PF_INET6
|
#define AF_INET6 PF_INET6
|
||||||
#define AF_MAX PF_MAX
|
#define AF_MAX PF_MAX
|
||||||
|
|
||||||
/* Socket level values. */
|
/* Socket level values. Others are defined in the appropriate headers.
|
||||||
#define SOL_IP 0
|
|
||||||
#define SOL_TCP 6
|
XXX These definitions also should go into the appropriate headers as
|
||||||
#define SOL_UDP 17
|
far as they are available. */
|
||||||
#define SOL_IPV6 41
|
#define SOL_IPV6 41
|
||||||
#define SOL_ICMPV6 58
|
#define SOL_ICMPV6 58
|
||||||
#define SOL_RAW 255
|
#define SOL_RAW 255
|
||||||
#define SOL_IPX 256
|
|
||||||
#define SOL_AX25 257
|
#define SOL_AX25 257
|
||||||
#define SOL_ATALK 258
|
#define SOL_ATALK 258
|
||||||
#define SOL_NETROM 259
|
#define SOL_NETROM 259
|
||||||
|
@ -25,15 +25,12 @@
|
|||||||
extern ssize_t __syscall_writev __P ((int, const struct iovec *, int));
|
extern ssize_t __syscall_writev __P ((int, const struct iovec *, int));
|
||||||
|
|
||||||
/* Not all versions of the kernel support the large number of records. */
|
/* Not all versions of the kernel support the large number of records. */
|
||||||
#undef MAX_IOVEC
|
#ifndef UIO_FASTIOV
|
||||||
#ifdef UIO_FASTIOV
|
# define UIO_FASTIOV 8 /* 8 is a safe number. */
|
||||||
# define MAX_IOVEC UIO_FASTIOV
|
|
||||||
#else
|
|
||||||
# define MAX_IOVEC 8 /* 8 is a safe number. */
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* We should deal with kernel which have a smaller UIO_MAXIOV as well
|
/* We should deal with kernel which have a smaller UIO_FASTIOV as well
|
||||||
as a very big count. */
|
as a very big count. */
|
||||||
ssize_t
|
ssize_t
|
||||||
writev (fd, vector, count)
|
writev (fd, vector, count)
|
||||||
@ -46,7 +43,7 @@ writev (fd, vector, count)
|
|||||||
|
|
||||||
bytes_written = __syscall_writev (fd, vector, count);
|
bytes_written = __syscall_writev (fd, vector, count);
|
||||||
|
|
||||||
if (bytes_written < 0 && errno == EINVAL && count > MAX_IOVEC)
|
if (bytes_written < 0 && errno == EINVAL && count > UIO_FASTIOV)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -54,10 +51,10 @@ writev (fd, vector, count)
|
|||||||
__set_errno (errno_saved);
|
__set_errno (errno_saved);
|
||||||
|
|
||||||
bytes_written = 0;
|
bytes_written = 0;
|
||||||
for (i = 0; i < count; i += MAX_IOVEC)
|
for (i = 0; i < count; i += UIO_FASTIOV)
|
||||||
{
|
{
|
||||||
ssize_t bytes = __syscall_writev (fd, vector + i,
|
ssize_t bytes = __syscall_writev (fd, vector + i,
|
||||||
MIN (count - i, MAX_IOVEC));
|
MIN (count - i, UIO_FASTIOV));
|
||||||
|
|
||||||
if (bytes < 0)
|
if (bytes < 0)
|
||||||
return bytes_written > 0 ? bytes_written : bytes;
|
return bytes_written > 0 ? bytes_written : bytes;
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "kernel_stat.h"
|
#include <kernel_stat.h>
|
||||||
|
|
||||||
extern int __syscall_stat (const char *, struct kernel_stat *);
|
extern int __syscall_stat (const char *, struct kernel_stat *);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user