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:
Ulrich Drepper 1997-03-20 02:20:57 +00:00
parent e61abf8398
commit c57abfa735
32 changed files with 394 additions and 183 deletions

39
BUGS Normal file
View 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]

View File

@ -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>
* sysdeps/unix/sysv/sco3.2.4/Dist: New file.

View File

@ -347,7 +347,8 @@ else
default-rpath = $(libdir)
endif
# 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)
nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
else
@ -356,7 +357,13 @@ endif
endif
ifndef link-extra-libs
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))
endif
else
link-extra-libs = $(foreach lib,$(LDLIBS-$(@F)),$(common-objpfx)$(lib).a)
endif

View File

@ -64,6 +64,20 @@ routines = $(calls) $(calls:=f) $(long-c-$(long-double-fcts))
long-c-yes = $(calls:=l)
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
# for error handling in the -lm functions.

View File

@ -41,9 +41,9 @@
/* This program isn't finished yet.
It has tests for acos, acosh, asin, asinh, atan, atan2, atanh,
cbrt, ceil, cos, cosh, exp, exp2, expm1, fabs, floor, fpclassify,
frexp, ldexp,
log, log10, log1p, log2, logb,
pow, sin, sinh, tan, tanh, fabs, hypot.
frexp, hypot, ldexp,
log, log10, log1p, log2, logb, modf,
pow, sin, sinh, tan, tanh.
Tests for the other libm-functions will come later.
The routines using random variables are still under construction. I don't
@ -66,7 +66,9 @@
log2. */
#undef ISO_9X_IMPLEMENTED
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#include <math.h>
#include <float.h>
@ -192,7 +194,7 @@ check_equal (MATHTYPE computed, MATHTYPE supplied, MATHTYPE eps, MATHTYPE * diff
*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 0;
@ -211,7 +213,7 @@ output_result_bool (const char *test_name, int result)
{
if (verbose)
printf ("Fail: %s\n", test_name);
noErrors++;
++noErrors;
}
fpstack_test (test_name);
@ -592,7 +594,7 @@ ceil_test (void)
check_isinfn ("ceil (-inf) == -inf", FUNC(ceil) (minus_infty));
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_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 (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 (10000) == 4", FUNC(log10) (10000.0), 4);
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
sin_test (void)
{
@ -971,58 +1009,33 @@ floor_test (void)
check_isinfn ("floor (-inf) == -inf", FUNC(floor) (minus_infty));
check ("floor (pi) == 3", FUNC(floor) (M_PI), 3.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);
check ("floor (-pi) == -4", FUNC(floor) (-M_PI), -4.0);
}
static 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);
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);
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);
a = random_greater (0);
check_isinfp_ext ("hypot (+inf, x) == +inf", FUNC(hypot) (plus_infty, a), a);
check_isinfp_ext ("hypot (-inf, x) == +inf", FUNC(hypot) (minus_infty, a), 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) (-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) (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);
}
@ -1084,9 +1097,9 @@ pow_test (void)
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 ("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, -1001) == -0", FUNC(pow) (-minus_infty, -1001), 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, -1001) == -0", FUNC(pow) (minus_infty, -1001), minus_zero);
check ("pow (-inf, -2) == +0", FUNC(pow) (minus_infty, -2), 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);
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",
FUNC(pow) (minus_infty, x), minus_zero, x);
check_ext ("pow (-inf, y) == 0 for y < 0 and not an odd integer",
FUNC(pow) (minus_infty, x), 0.0, x);
x = (rand () % 1000000) * 2.0 + 1; /* Get random 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 ();
#endif
logb_test ();
modf_test ();
sin_test ();
sinh_test ();
tan_test ();

View File

@ -24,6 +24,8 @@
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Cdouble
#define PRINTF_EXPR "e"
#ifndef __NO_MATH_INLINES
# define __NO_MATH_INLINES
#endif
#include "libm-test.c"

View File

@ -24,6 +24,8 @@
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Cfloat
#define PRINTF_EXPR "e"
#ifndef __NO_MATH_INLINES
# define __NO_MATH_INLINES
#endif
#include "libm-test.c"

View File

@ -24,6 +24,8 @@
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Clongdouble
#define PRINTF_EXPR "Le"
#ifndef __NO_MATH_INLINES
# define __NO_MATH_INLINES
#endif
#include "libm-test.c"

View File

@ -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.
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
/* Set ENV to the current position and return 0, not saving the signal mask.
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)
#else
/* 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
/* 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)
#endif

View File

@ -54,8 +54,14 @@ main (void)
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
extern int setjmp (jmp_buf);
last_value = -1;
lose = 0;
value = setjmp (env);
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)
puts ("Test FAILED!");
else

View File

@ -383,15 +383,13 @@ INTERNAL (STRTOF) (nptr, endptr, group)
typedef unsigned int wint_t;
#endif
/* The radix character of the current locale. */
wint_t decimal;
wchar_t decimal;
/* The thousands character of the current locale. */
wint_t thousands;
wchar_t thousands;
/* The numeric grouping specification of the current locale,
in the format described in <locale.h>. */
const char *grouping;
assert (sizeof (wchar_t) == sizeof (wint_t));
if (group)
{
grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
@ -400,10 +398,9 @@ INTERNAL (STRTOF) (nptr, endptr, group)
else
{
/* Figure out the thousands separator character. */
if (mbtowc ((wchar_t *) &thousands,
_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP),
if (mbtowc (&thousands, _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP),
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')
grouping = NULL;
}
@ -417,7 +414,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
/* Find the locale's decimal point character. */
if (mbtowc ((wchar_t *) &decimal, _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT),
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');
/* Prepare number representation. */
@ -445,7 +442,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
/* Return 0.0 if no legal string is found.
No character is used even if a sign was found. */
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;
/* Check for `INF' or `INFINITY'. */
@ -511,14 +508,14 @@ INTERNAL (STRTOF) (nptr, endptr, group)
start_of_digits = startp = cp;
/* 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;
/* If no other digit but a '0' is found the result is 0.0.
Return current read pointer. */
if ((c < L_('0') || c > L_('9')) &&
(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 && TOLOWER (c) != L_('e')))
{
@ -540,7 +537,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
if ((c >= L_('0') && c <= L_('9'))
|| (base == 16 && TOLOWER (c) >= L_('a') && TOLOWER (c) <= L_('f')))
++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. */
break;
c = *++cp;
@ -590,7 +587,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
/* Read the fractional digits. A special case are the 'american style'
numbers like `16.' i.e. with decimal but without trailing digits. */
if ((wint_t) c == decimal)
if ((wchar_t) c == decimal)
{
c = *++cp;
while (c >= L_('0') && c <= L_('9') ||
@ -693,7 +690,7 @@ INTERNAL (STRTOF) (nptr, endptr, group)
if (lead_zero)
{
/* Find the decimal point */
while ((wint_t) *startp != decimal)
while ((wchar_t) *startp != decimal)
++startp;
startp += lead_zero + 1;
exponent -= base == 16 ? 4 * lead_zero : lead_zero;

View File

@ -1,5 +1,5 @@
/* 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.
The GNU C Library is free software; you can redistribute it and/or
@ -13,9 +13,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
#define _ASM

View File

@ -1,5 +1,5 @@
/* 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.
The GNU C Library is free software; you can redistribute it and/or
@ -13,9 +13,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* 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
@ -29,5 +29,17 @@ ENTRY (_setjmp)
pushl $0 /* Push second argument of zero. */
pushl %ecx /* Push back first argument. */
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)

View File

@ -1,5 +1,5 @@
/* 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.
The GNU C Library is free software; you can redistribute it and/or
@ -13,9 +13,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* 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
@ -29,5 +29,17 @@ ENTRY (setjmp)
pushl $1 /* Push second argument of one. */
pushl %ecx /* Push back first argument. */
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)

View File

@ -308,7 +308,7 @@ ENTRY(__ieee754_pow)
andb $1, %al
jz 24f // jump if not odd
cmpl $0xffe00000, %edx
jbe 24f // does not fit in mantissa bits
jae 24f // does not fit in mantissa bits
// It's an odd integer.
fldl MO(mzero)
ret

View File

@ -300,7 +300,7 @@ ENTRY(__ieee754_powf)
testb $1, %dl
jz 24f // jump if not odd
cmpl $0xff000000, %edx
jbe 24f // does not fit in mantissa bits
jae 24f // does not fit in mantissa bits
// It's an odd integer.
fldl MO(mzero)
ret

View File

@ -51,15 +51,17 @@ ENTRY(__expm1)
fldl 4(%esp) // x
fxam // Is NaN or +-Inf?
fstsw %ax
movb $0x45, %ch
andb %ah, %ch
cmpb $0x40, %ch
je 3f // If +-0, jump.
#ifdef PIC
call 1f
1: popl %edx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
movb $0x45, %ch
andb %ah, %ch
cmpb $0x05, %ch
je 2f // Is +-Inf, jump.
je 2f // If +-Inf, jump.
fldt MO(l2e) // log2(e) : x
fmulp // log2(e)*x

View File

@ -51,15 +51,17 @@ ENTRY(__expm1f)
flds 4(%esp) // x
fxam // Is NaN or +-Inf?
fstsw %ax
movb $0x45, %ch
andb %ah, %ch
cmpb $0x40, %ch
je 3f // If +-0, jump.
#ifdef PIC
call 1f
1: popl %edx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
movb $0x45, %ch
andb %ah, %ch
cmpb $0x05, %ch
je 2f // Is +-Inf, jump.
je 2f // If +-Inf, jump.
fldt MO(l2e) // log2(e) : x
fmulp // log2(e)*x

View File

@ -51,15 +51,17 @@ ENTRY(__expm1l)
fldt 4(%esp) // x
fxam // Is NaN or +-Inf?
fstsw %ax
movb $0x45, %ch
andb %ah, %ch
cmpb $0x40, %ch
je 3f // If +-0, jump.
#ifdef PIC
call 1f
1: popl %edx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
#endif
movb $0x45, %ch
andb %ah, %ch
cmpb $0x05, %ch
je 2f // Is +-Inf, jump.
je 2f // If +-Inf, jump.
fldt MO(l2e) // log2(e) : x
fmulp // log2(e)*x

View File

@ -51,10 +51,8 @@ static double one = 1.0;
} else {
i = (0x000fffff)>>j0;
if(((i0&i)|i1)==0) { /* x is integral */
u_int32_t high;
*iptr = x;
GET_HIGH_WORD(high,x);
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
INSERT_WORDS(x,i0&0x80000000,0); /* return +-0 */
return x;
} else {
INSERT_WORDS(*iptr,i0&(~i),0);
@ -64,8 +62,10 @@ static double one = 1.0;
} else if (j0>51) { /* no fraction part */
u_int32_t high;
*iptr = x*one;
GET_HIGH_WORD(high,x);
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
/* We must handle NaNs separately. */
if (j0 == 0x400 && ((i0 & 0xfffff) | i1))
return x*one;
INSERT_WORDS(x,i0&0x80000000,0); /* return +-0 */
return x;
} else { /* fraction part in low x */
i = ((u_int32_t)(0xffffffff))>>(j0-20);

View File

@ -57,8 +57,10 @@ static float one = 1.0;
} else { /* no fraction part */
u_int32_t ix;
*iptr = x*one;
GET_FLOAT_WORD(ix,x);
SET_FLOAT_WORD(x,ix&0x80000000); /* return +-0 */
/* We must handle NaNs separately. */
if (j0 == 0x80 && (i0 & 0x7fffff))
return x*one;
SET_FLOAT_WORD(x,i0&0x80000000); /* return +-0 */
return x;
}
}

View File

@ -55,32 +55,29 @@ static long double one = 1.0;
} else {
i = (0xffffffff)>>j0;
if(((i0&i)|i1)==0) { /* x is integral */
u_int32_t high;
*iptr = x;
GET_HIGH_WORD(high,x);
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
SET_LDOUBLE_WORDS(x,se&0x8000,0,0); /* return +-0 */
return x;
} else {
INSERT_WORDS(*iptr,i0&(~i),0);
SET_LDOUBLE_WORDS(*iptr,se,i0&(~i),0);
return x - *iptr;
}
}
} else if (j0>63) { /* no fraction part */
u_int32_t high;
*iptr = x*one;
GET_HIGH_WORD(high,x);
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
/* We must handle NaNs separately. */
if (j0 == 0x4000 && ((i0 & 0x7fffffff) | i1))
return x*one;
SET_LDOUBLE_WORDS(x,se&0x8000,0,0); /* return +-0 */
return x;
} else { /* fraction part in low x */
i = ((u_int32_t)(0xffffffff))>>(j0-20);
if((i1&i)==0) { /* x is integral */
u_int32_t high;
*iptr = x;
GET_HIGH_WORD(high,x);
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
INSERT_WORDS(x,se&0x8000,0); /* return +-0 */
return x;
} else {
INSERT_WORDS(*iptr,i0,i1&(~i));
SET_LDOUBLE_WORDS(*iptr,se,i0,i1&(~i));
return x - *iptr;
}
}

View File

@ -55,10 +55,10 @@ static double one=1.0, two=2.0, tiny = 1.0e-300;
#endif
{
double t,z;
int32_t jx,ix;
int32_t jx,ix,lx;
/* High word of |x|. */
GET_HIGH_WORD(jx,x);
EXTRACT_WORDS(jx,lx,x);
ix = jx&0x7fffffff;
/* x is INF or NaN */
@ -69,6 +69,8 @@ static double one=1.0, two=2.0, tiny = 1.0e-300;
/* |x| < 22 */
if (ix < 0x40360000) { /* |x|<22 */
if ((ix | lx) == 0)
return x; /* x == +-0 */
if (ix<0x3c800000) /* |x|<2**-55 */
return x*(one+x); /* tanh(small) = small */
if (ix>=0x3ff00000) { /* |x|>=1 */

View File

@ -47,6 +47,8 @@ static float one=1.0, two=2.0, tiny = 1.0e-30;
/* |x| < 22 */
if (ix < 0x41b00000) { /* |x|<22 */
if (ix == 0)
return x; /* x == +-0 */
if (ix<0x24000000) /* |x|<2**-55 */
return x*(one+x); /* tanh(small) = small */
if (ix>=0x3f800000) { /* |x|>=1 */

View File

@ -68,12 +68,15 @@ static long double one=1.0, two=2.0, tiny = 1.0e-4900L;
/* x is INF or NaN */
if(ix==0x7fff) {
if (se>=0x7fff) return one/x+one; /* tanhl(+-inf)=+-1 */
else return one/x-one; /* tanhl(NaN) = NaN */
/* for NaN it's not important which branch: tanhl(NaN) = NaN */
if (se&0x8000) return one/x-one; /* tanhl(-inf)= -1; */
else return one/x+one; /* tanhl(+inf)=+1 */
}
/* |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 */
return x*(one+x); /* tanh(small) = small */
if (ix>=0x3fff) { /* |x|>=1 */

View File

@ -0,0 +1 @@
=*

View File

@ -21,7 +21,7 @@
#include <stddef.h>
#include <sys/stat.h>
#include "kernel_stat.h"
#include <kernel_stat.h>
extern int __syscall_fstat (int, struct kernel_stat *);

View File

@ -21,7 +21,7 @@
#include <stddef.h>
#include <sys/stat.h>
#include "kernel_stat.h"
#include <kernel_stat.h>
extern int __syscall_lstat (const char *, struct kernel_stat *);

View File

@ -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. */
#undef MAX_IOVEC
#ifdef UIO_FASTIOV
# define MAX_IOVEC UIO_FASTIOV
#else
# define MAX_IOVEC 8 /* 8 is a safe number. */
#ifndef UIO_FASTIOV
# define UIO_FASTIOV 8 /* 8 is a safe number. */
#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. */
ssize_t
readv (fd, vector, count)
@ -47,7 +44,7 @@ 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;
@ -55,10 +52,10 @@ readv (fd, vector, count)
__set_errno (errno_saved);
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,
MIN (count - i, MAX_IOVEC));
MIN (count - i, UIO_FASTIOV));
if (bytes < 0)
return bytes;

View File

@ -83,14 +83,13 @@ enum __socket_type
#define AF_INET6 PF_INET6
#define AF_MAX PF_MAX
/* Socket level values. */
#define SOL_IP 0
#define SOL_TCP 6
#define SOL_UDP 17
/* Socket level values. Others are defined in the appropriate headers.
XXX These definitions also should go into the appropriate headers as
far as they are available. */
#define SOL_IPV6 41
#define SOL_ICMPV6 58
#define SOL_RAW 255
#define SOL_IPX 256
#define SOL_AX25 257
#define SOL_ATALK 258
#define SOL_NETROM 259

View File

@ -25,15 +25,12 @@
extern ssize_t __syscall_writev __P ((int, const struct iovec *, int));
/* Not all versions of the kernel support the large number of records. */
#undef MAX_IOVEC
#ifdef UIO_FASTIOV
# define MAX_IOVEC UIO_FASTIOV
#else
# define MAX_IOVEC 8 /* 8 is a safe number. */
#ifndef UIO_FASTIOV
# define UIO_FASTIOV 8 /* 8 is a safe number. */
#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. */
ssize_t
writev (fd, vector, count)
@ -46,7 +43,7 @@ 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;
@ -54,10 +51,10 @@ writev (fd, vector, count)
__set_errno (errno_saved);
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,
MIN (count - i, MAX_IOVEC));
MIN (count - i, UIO_FASTIOV));
if (bytes < 0)
return bytes_written > 0 ? bytes_written : bytes;

View File

@ -21,7 +21,7 @@
#include <stddef.h>
#include <sys/stat.h>
#include "kernel_stat.h"
#include <kernel_stat.h>
extern int __syscall_stat (const char *, struct kernel_stat *);