summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-06-19 19:11:22 +0000
committerUlrich Drepper <drepper@redhat.com>1997-06-19 19:11:22 +0000
commitd705269e75ff9846000abea981774b381b076482 (patch)
tree7bd717a8489ad113cb0d10b7628a88d6a55cb836 /sysdeps
parente7f1f046f51d95d5d05ada3abd3f2e88219118e9 (diff)
downloadglibc-d705269e75ff9846000abea981774b381b076482.tar.gz
glibc-d705269e75ff9846000abea981774b381b076482.tar.xz
glibc-d705269e75ff9846000abea981774b381b076482.zip
1997-06-19 19:38  Ulrich Drepper  <drepper@cygnus.com>

	* features.h: Define __STDC_IEC_559__ and _STDC_IEC_559_COMPLEX__.

	* elf/dl-minimal.c (__dcgettext): Remove assertion.

	* inet/rcmd.c: Correct a few typos.  Reported by Eric Troan.

	* manual/Makefile (distribute): Add dir.
	* manual/dir: New file.

	* math/Makefile (libm-support): Rename s_rinttol, s_rinttoll,
	s_roundtol, and s_roundtoll to s_lrint, s_llrint, s_lround,
	and s_llround respectively.
	(libm-calls): Add e_gamma_r.
	* math/libm-test.c (check_int_exc): New function.
	(signbit_test): Remove test for sign of NaN.
	(gamma_test): Clear exception after test of existence.
	Correct tests and and epsilons.
	(lgamma_test): Likewise.
	(ilogb_test): Correct all tests.
	(scalb_test): Rewrite.
	(rinttol_test): Rename to lrint_test and correct tests.
	(rinttoll_test): Likewise.
	(roundtol_test): Likewise.
	(roundtoll_test): Likewise.
	(main): Call lrint/lround functions instead of rinttol/roundtol.
	* math/math.h: Change prototypes for rinttol/roundtol.
	* math/mathcalls.h: Rearrange prototypes according to ISO C9X draft.
	* sysdeps/generic/mathbits.h: Define FP_ILOGB0 and FP_ILOGBNAN.
	* sysdeps/i386/mathbits.h: Likewise.
	* sysdeps/libm-i387/e_scalb.S: Handle special cases correctly.
	* sysdeps/libm-i387/e_scalbf.S: Likewise.
	* sysdeps/libm-i387/e_scalbl.S: Likewise.
	* sysdeps/libm-i387/s_asinh.S: Handle -inf correctly.
	* sysdeps/libm-i387/s_asinhf.S: Likewise.
	* sysdeps/libm-i387/s_asinhl.S: Likewise.
	* sysdeps/libm-i387/s_ilogb.S: Optimize.
	* sysdeps/libm-i387/s_ilogbf.S: Likewise.
	* sysdeps/libm-i387/s_ilogbl.S: Likewise.
	* sysdeps/libm-i387/s_rinttol.S: Rename to...
	* sysdeps/libm-i387/s_lrint.S: ...this.
	* sysdeps/libm-i387/s_rinttoll.S: Rename to...
	* sysdeps/libm-i387/s_llrint.S: ...this.
	* sysdeps/libm-i387/s_remquo.S: Correctly set sign of remainder.
	* sysdeps/libm-i387/s_remquof.S: Likewise.
	* sysdeps/libm-i387/s_remquol.S: Likewise.
	* sysdeps/libm-i387/e_gamma_r.c: New file.  Implementation of gamma
	function according to ISO C.
	* sysdeps/libm-i387/e_gammaf_r.c: New file.
	* sysdeps/libm-i387/e_gammal_r.c: New file.
	* sysdeps/libm-i387/e_lgamma_r.c: Don't let optimize compile the
	generation of exceptions away.
	* sysdeps/libm-i387/e_lgammaf_r.c: Likewise.
	* sysdeps/libm-i387/k_standard.c: Correct return value for infinity
	points of gamma function when not SVID mode.
	* sysdeps/libm-i387/s_rinttoll.c: Renamed to...
	* sysdeps/libm-i387/s_llrint.c: ...this.
	* sysdeps/libm-i387/s_rinttol.c: Renamed to...
	* sysdeps/libm-i387/s_lrint.c: ...this.
	* sysdeps/libm-i387/s_roundtoll.c: Renamed to...
	* sysdeps/libm-i387/s_llround.c: ...this.
	* sysdeps/libm-i387/s_roundtol.c: Renamed to...
	* sysdeps/libm-i387/s_lround.c: ..this.
	* sysdeps/libm-i387/s_scalbn.c: Change second parameter according to
	ISO C.
	* sysdeps/libm-i387/s_scalbnf.c: Likewise.
	* sysdeps/libm-i387/s_scalbnl.c: Likewise.
	* sysdeps/libm-i387/w_gamma.c: Call __ieee754_gamma_r if library
	mode is not _SVID_.
	* sysdeps/libm-i387/w_gammaf.c: Likewise.
	* sysdeps/libm-i387/w_gammal.c: Likewise.
	* sysdeps/m68k/fpu/__math.h: Rename __rinttol to __lrint and
	rinttol to lrint.
	* sysdeps/m68k/fpu/s_rinttol.c: Renamed to...
	* sysdeps/m68k/fpu/s_lrint.c: ...this.
	* sysdeps/m68k/fpu/s_rinttoll.c: Renamed to...
	* sysdeps/m68k/fpu/s_llrint.c: ...this.

	* md5-crypt/Makefile: Link md5test program with md5.o.

	* stdio-common/temptest.c: Don't use __stdio_gen_tempname which
	is not exported by the libc.so.

	* stdio-common/vfscanf.c: Correct scanning of strings after last
	change.

	* sysdeps/unix/sysv/linux/i386/sysdep.S: Use .comm to define errno.

1997-06-19 07:37  H.J. Lu  <hjl@gnu.ai.mit.edu>

	* time/tzfile.c (__tzfile_read): Store getc () return in int.

1997-06-13  Miles Bader  <miles@gnu.ai.mit.edu>

	* argp/argp-parse.c (argp_version_parser): Include `(PROGRAM ERROR)' in
	the no-version error text to indicate that something's fucked.
	[!_] (N_): New macro.
	(argp_default_options, argp_version_options): Wrap doc strings in N_().

1997-06-12  Miles Bader  <miles@gnu.ai.mit.edu>

	* argp/argp-parse.c (parser_parse_opt): Detect and report unhandled
	options here.
	(parser_parse_arg): Handle ARGP_KEY_ARGS here.
	Adjust NEXT pointer back if we fail to parse anything.
	(parser_parse_next): Simplify arg code.  Leave state NEXT frobbing
	to parser_parse_arg.

1997-06-11  Miles Bader  <miles@gnu.ai.mit.edu>

	* argp/argp.h (ARGP_KEY_ARGS, ARGP_KEY_FINI): New macros.
	* argp/argp-parse.c (parser_finalize): Do another pass over the
	parsers with ARGP_KEY_FINI.

1997-06-18  Miles Bader  <miles@gnu.ai.mit.edu>

	* string/Makefile (routines): Add argz-replace.

1997-06-16 00:16  Miles Bader  <miles@gnu.ai.mit.edu>

	* manual/string.texi (Argz Functions): Document argz_replace.

1997-06-12  Miles Bader  <miles@gnu.ai.mit.edu>

	* string/argz.h (__argz_replace, argz_replace): New declarations.
	* string/argz-replace.c: New file.

1997-06-11  Miles Bader  <miles@gnu.ai.mit.edu>

	* manual/argp.texi (Argp Special Keys): Document ARGP_KEY_ARGS.

1997-06-16 23:08  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makeconfig (libc-map): Remove definition.
	* Makerules (libc-map): Define it here, using the full name.
	(load-map-file): Remove case for empty $(..).
	($(common-objpfx)libc.so): Revert last change.

1997-06-17 22:18  Mark Kettenis  <kettenis@phys.uva.nl>

	* login/programs/utmpd.c (main): Improve signal handling.

	* login/programs/request.c (do_setutent, do_updwtmp):
	Allow arbitrary length filenames.
	* login/programs/utmpd.h (setutent_request, updwtmp_request):
	Get rid of fixed length file field.
	* login/utmp_daemon.c (do_setutent, do_updwtmp):
	Allow arbitrary	length filenames.

	* login/programs/request.c (do_pututline):
	Don't fail if connection->position is -1 on entry.

1997-06-15 16:32  Mark Kettenis  <kettenis@phys.uva.nl>

	* login/utmp_file.c (updwtmp_file): Use the same method for
	appending an entry as in pututline_file.

1997-06-11 18:59  Mark Kettenis  <kettenis@phys.uva.nl>

	* login/utmp_file.c (getutent_r_file):
	Use read lock instead of write lock.
	(getutline_r_file, internal_getut_r): Lock utmp file.
	(updwtmp_file): Use fcntl to lock file instead of flock.

1997-06-18 00:11  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* stdio-common/vfscanf.c (inchar, ungetc): Don't count EOF as
	character read in/put back.
	* stdio-common/tstscanf.c: Add test case for this.

1997-06-17 22:17  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* libc.map: Add more symbols.

1997-06-18 12:01  Ulrich Drepper  <drepper@cygnus.com>

	* manual/Makefile (install): Make sure `dir' file exists if we use
	install-info.

1997-06-17 19:32  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* manual/Makefile (info): Depend on dir-add.info.

1997-06-17 17:19  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/ldd.bash.in: Fix spacing in message.

1997-06-17 14:28  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/do-rel.h (elf_dynamic_do_rel): Always use version
	information if available.

1997-06-17 11:34  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sunrpc/Makefile ($(rpcsvc:%.x=$(objpfx)rpcsvc/%.h)): Make
	command non-empty to force make to recheck modification time.
	($(rpcsvc:%.x=$(objpfx)x%.c)): Likewise.

1997-06-17 00:26  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/stub/e_acoshl.c: Set errno to ENOSYS.
	* sysdeps/stub/e_acosl.c: Likewise.
	* sysdeps/stub/e_asinl.c: Likewise.
	* sysdeps/stub/e_atan2l.c: Likewise.
	* sysdeps/stub/e_expl.c: Likewise.
	* sysdeps/stub/e_fmodl.c: Likewise.
	* sysdeps/stub/e_j0l.c: Likewise.
	* sysdeps/stub/e_j1l.c: Likewise.
	* sysdeps/stub/e_jnl.c: Likewise.
	* sysdeps/stub/e_lgammal_r.c: Likewise.
	* sysdeps/stub/e_log10l.c: Likewise.
	* sysdeps/stub/e_logl.c: Likewise.
	* sysdeps/stub/e_powl.c: Likewise.
	* sysdeps/stub/e_rem_pio2l.c: Likewise.
	* sysdeps/stub/e_sqrtl.c: Likewise.
	* sysdeps/stub/k_cosl.c: Likewise.
	* sysdeps/stub/k_rem_pio2l.c: Likewise.
	* sysdeps/stub/k_sinl.c: Likewise.
	* sysdeps/stub/k_tanl.c: Likewise.
	* sysdeps/stub/s_atanl.c: Likewise.
	* sysdeps/stub/s_erfl.c: Likewise.
	* sysdeps/stub/s_exp2.c: Likewise.
	* sysdeps/stub/s_exp2f.c: Likewise.
	* sysdeps/stub/s_exp2l.c: Likewise.
	* sysdeps/stub/s_expm1l.c: Likewise.
	* sysdeps/stub/s_log1pl.c: Likewise.
	* sysdeps/stub/s_log2l.c: Likewise.

1997-06-18 11:46  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/libm-ieee754/w_gamma.c: If _LIB_VERSION is _SVID_ compute
	result as before last change.
	* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
	* sysdeps/libm-ieee754/w_gammal.c: Likewise.

1997-06-16 23:37  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/libm-ieee754/s_remquo.c: Fix off-by-one when computing
	quotient.
	* sysdeps/libm-ieee754/s_remquof.c: Likewise.
	* sysdeps/libm-ieee754/s_remquol.c: Likewise.

	* sysdeps/m68k/fpu/s_remquo.c: Remove FIXME and special case for
	quotient.

	* sysdeps/libm-ieee754/w_gamma.c: Add missing call to exp
	function.  Don't use global signgam.
	* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
	* sysdeps/libm-ieee754/w_gammal.c: Likewise.

	* math/Makefile (libm-calls): Remove w_gamma_r.
	* sysdeps/libm-ieee754/w_gamma_r.c: Remove file.
	* sysdeps/libm-ieee754/w_gammaf_r.c: Remove file.
	* sysdeps/libm-ieee754/w_gammal_r.c: Remove file.

	* math/libm-test.c (atanh_test): Declare x only if needed.
	(signbit_test): Fix typo.
	(gamma_test): Check whether function is implemented.  Add
	epsilons.
	(lgamma_test): Likewise.
	(fmod_test): Add epsilons.
	(exp2_test): Use right function for existence test.

1997-06-07 09:20  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/powerpc/Dist: Add fenv_const.c.
	* sysdeps/unix/sysv/linux/Dist: Add net/if_slip.h.
	* sysdeps/unix/sysv/linux/powerpc/Dist: Add init-first.h and
	syscall.h.
	* sysdeps/unix/sysv/linux/sparc/Dist: Add init-first.h.
	* string/Makefile (distribute): Add tst-svc.expect.
	* nis/Makefile (distribute): Add nis_intern.h and Banner.
	* elf/Makefile (distribute): Add dl-hash.h.
	* Rules (subdir_echo-distinfo): Add headers from $(distribute).

	* login/Makefile (others): Add utmpdump.
	* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add
	net/if_slip.h.

	* manual/Makefile (dir-add.texi): Also look in indirectly included
	files.

1997-06-16 23:15  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/configure.in: Remove commands to
	generate stdio_lim.h.
	* sysdeps/unix/sysv/linux/mk-stdiolim.c: Remove.
	* sysdeps/unix/sysv/linux/Makefile: Add rules to generate
	stdio_lim.h here.
	(common-generated): Add generated files.
	(inhibit-stdio_lim): Define.
	* sysdeps/posix/Makefile [$(inhibit-stdio_lim)=yes]: Disable rules
	to generate stdio_lim.h.

	* sysdeps/unix/sysv/linux/Makefile: Suppress inclusion of
	dependecy files if no_deps is set.
	($(objpfx)syscall-%.d): Add header file as target to dependency
	generation.

1997-06-14 19:19  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/arm/Dist: New file.

1997-06-14 17:59  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* extra-lib.mk (others): Depend on versioned shared library, not
	the unversioned one.
	* Makerules (build-shlib): Don't make the version link here.
	($(common-objpfx)libc.so$(libc.so-version)): New rule for libc
	version link.

1997-06-16 03:07  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/libm-ieee754/k_standard.c: Undo change of Tue Aug 6
	01:13:56 1996.

	* argp/argp-help.c (argp_args_usage): Supply correct argp to
	filter_doc.
	* argp/argp-help.c (hol_add_cluster): Initialize CL->depth.
	* argp/argp-help.c (_help): Supply STATE to argp_args_usage.
	* argp/argp.h (ARGP_KEY_HELP_ARGS_DOC): New macro.
	* argp/argp-fmtstream.c: Add casts to prevent warnings.
	* argp/argp.h (OPTION_NO_USAGE): New macro.
	* argp/argp-help.c (usage_long_opt, usage_argful_short_opt,
	* argp/argp-fmtstream.c (__argp_fmtstream_update): Account for case
	* argp/argp-help.c <stddef.h>: New include.
	* argp/argp.h (argp_state_help, __argp_state_help, argp_usage,
	* argp/argp.h (argp_program_bug_address): Make const.
	* argp/argp-parse.c (argp_default_parser): Set STATE->name for OPT_PROGNAME.
	* argp/argp-help.c (__argp_error, __argp_failure, __argp_state_help):
	* argp/argp-parse.c (parser_init): Set PARSER->state.flags.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/mathbits.h5
-rw-r--r--sysdeps/i386/fpu/mathbits.h5
-rw-r--r--sysdeps/libm-i387/e_scalb.S78
-rw-r--r--sysdeps/libm-i387/e_scalbf.S79
-rw-r--r--sysdeps/libm-i387/e_scalbl.S78
-rw-r--r--sysdeps/libm-i387/s_asinh.S11
-rw-r--r--sysdeps/libm-i387/s_asinhf.S11
-rw-r--r--sysdeps/libm-i387/s_asinhl.S11
-rw-r--r--sysdeps/libm-i387/s_ilogb.S12
-rw-r--r--sysdeps/libm-i387/s_ilogbf.S12
-rw-r--r--sysdeps/libm-i387/s_ilogbl.S13
-rw-r--r--sysdeps/libm-i387/s_llrint.S (renamed from sysdeps/libm-i387/s_rinttoll.S)6
-rw-r--r--sysdeps/libm-i387/s_lrint.S (renamed from sysdeps/libm-i387/s_rinttol.S)6
-rw-r--r--sysdeps/libm-i387/s_remquo.S7
-rw-r--r--sysdeps/libm-i387/s_remquof.S7
-rw-r--r--sysdeps/libm-i387/s_remquol.S7
-rw-r--r--sysdeps/libm-ieee754/e_gamma_r.c47
-rw-r--r--sysdeps/libm-ieee754/e_gammaf_r.c46
-rw-r--r--sysdeps/libm-ieee754/e_gammal_r.c46
-rw-r--r--sysdeps/libm-ieee754/e_lgamma_r.c40
-rw-r--r--sysdeps/libm-ieee754/e_lgammaf_r.c22
-rw-r--r--sysdeps/libm-ieee754/s_llrint.c (renamed from sysdeps/libm-ieee754/s_rinttoll.c)6
-rw-r--r--sysdeps/libm-ieee754/s_llround.c (renamed from sysdeps/libm-ieee754/s_roundtoll.c)6
-rw-r--r--sysdeps/libm-ieee754/s_lrint.c (renamed from sysdeps/libm-ieee754/s_rinttol.c)6
-rw-r--r--sysdeps/libm-ieee754/s_lround.c (renamed from sysdeps/libm-ieee754/s_roundtol.c)6
-rw-r--r--sysdeps/libm-ieee754/s_remquo.c2
-rw-r--r--sysdeps/libm-ieee754/s_remquof.c2
-rw-r--r--sysdeps/libm-ieee754/s_remquol.c2
-rw-r--r--sysdeps/libm-ieee754/s_scalbn.c13
-rw-r--r--sysdeps/libm-ieee754/s_scalbnf.c20
-rw-r--r--sysdeps/libm-ieee754/s_scalbnl.c34
-rw-r--r--sysdeps/libm-ieee754/w_gamma.c22
-rw-r--r--sysdeps/libm-ieee754/w_gamma_r.c51
-rw-r--r--sysdeps/libm-ieee754/w_gammaf.c21
-rw-r--r--sysdeps/libm-ieee754/w_gammaf_r.c52
-rw-r--r--sysdeps/libm-ieee754/w_gammal.c21
-rw-r--r--sysdeps/libm-ieee754/w_gammal_r.c52
-rw-r--r--sysdeps/m68k/fpu/__math.h4
-rw-r--r--sysdeps/m68k/fpu/s_llrint.c (renamed from sysdeps/m68k/fpu/s_rinttoll.c)4
-rw-r--r--sysdeps/m68k/fpu/s_lrint.c (renamed from sysdeps/m68k/fpu/s_rinttol.c)6
-rw-r--r--sysdeps/m68k/fpu/s_remquo.c9
-rw-r--r--sysdeps/posix/Makefile5
-rw-r--r--sysdeps/powerpc/Dist1
-rw-r--r--sysdeps/stub/e_acoshl.c2
-rw-r--r--sysdeps/stub/e_acosl.c2
-rw-r--r--sysdeps/stub/e_asinl.c2
-rw-r--r--sysdeps/stub/e_atan2l.c2
-rw-r--r--sysdeps/stub/e_expl.c2
-rw-r--r--sysdeps/stub/e_fmodl.c2
-rw-r--r--sysdeps/stub/e_j0l.c3
-rw-r--r--sysdeps/stub/e_j1l.c3
-rw-r--r--sysdeps/stub/e_jnl.c3
-rw-r--r--sysdeps/stub/e_lgammal_r.c2
-rw-r--r--sysdeps/stub/e_log10l.c2
-rw-r--r--sysdeps/stub/e_logl.c2
-rw-r--r--sysdeps/stub/e_powl.c2
-rw-r--r--sysdeps/stub/e_rem_pio2l.c2
-rw-r--r--sysdeps/stub/e_sqrtl.c2
-rw-r--r--sysdeps/stub/k_cosl.c2
-rw-r--r--sysdeps/stub/k_rem_pio2l.c2
-rw-r--r--sysdeps/stub/k_sinl.c2
-rw-r--r--sysdeps/stub/k_tanl.c2
-rw-r--r--sysdeps/stub/s_atanl.c2
-rw-r--r--sysdeps/stub/s_erfl.c3
-rw-r--r--sysdeps/stub/s_exp2.c2
-rw-r--r--sysdeps/stub/s_exp2f.c2
-rw-r--r--sysdeps/stub/s_exp2l.c2
-rw-r--r--sysdeps/stub/s_expm1l.c2
-rw-r--r--sysdeps/stub/s_log1pl.c2
-rw-r--r--sysdeps/stub/s_log2l.c2
-rw-r--r--sysdeps/unix/sysv/linux/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/Makefile34
-rw-r--r--sysdeps/unix/sysv/linux/arm/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/configure24
-rw-r--r--sysdeps/unix/sysv/linux/configure.in24
-rw-r--r--sysdeps/unix/sysv/linux/i386/sysdep.S9
-rw-r--r--sysdeps/unix/sysv/linux/mk-stdiolim.c4
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/Dist2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/Dist1
79 files changed, 673 insertions, 379 deletions
diff --git a/sysdeps/generic/mathbits.h b/sysdeps/generic/mathbits.h
index e4db3dcf19..b14b52d901 100644
--- a/sysdeps/generic/mathbits.h
+++ b/sysdeps/generic/mathbits.h
@@ -32,4 +32,9 @@ typedef double double_t;	/* `double' expressions are evaluated as
 /* Define `INFINITY' as value of type `float_t'.  */
 #define INFINITY	HUGE_VAL
 
+
+/* The values returned by `ilogb' for 0 and NaN respectively.  */
+#define FP_ILOGB0	0x80000001
+#define FP_ILOGBNAN	0x7fffffff
+
 #endif /* mathbits.h */
diff --git a/sysdeps/i386/fpu/mathbits.h b/sysdeps/i386/fpu/mathbits.h
index 7885afeec0..f4a22c0757 100644
--- a/sysdeps/i386/fpu/mathbits.h
+++ b/sysdeps/i386/fpu/mathbits.h
@@ -33,4 +33,9 @@ typedef long double double_t;	/* `double' expressions are evaluated as
 /* Define `INFINITY' as value of type `float_t'.  */
 #define INFINITY	HUGE_VALL
 
+
+/* The values returned by `ilogb' for 0 and NaN respectively.  */
+#define FP_ILOGB0	0x80000000
+#define FP_ILOGBNAN	0x80000000
+
 #endif /* mathbits.h */
diff --git a/sysdeps/libm-i387/e_scalb.S b/sysdeps/libm-i387/e_scalb.S
index 427a3b905e..790f1c1d56 100644
--- a/sysdeps/libm-i387/e_scalb.S
+++ b/sysdeps/libm-i387/e_scalb.S
@@ -1,16 +1,94 @@
 /*
  * Written by J.T. Conklin <jtc@netbsd.org>.
  * Public domain.
+ *
+ * Correct handling of y==-inf <drepper@gnu>
  */
 
 #include <machine/asm.h>
 
 RCSID("$NetBSD: e_scalb.S,v 1.4 1995/05/08 23:49:52 jtc Exp $")
 
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(zero_nan,@object)
+zero_nan:
+	.double 0.0
+nan:	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+minus_zero:
+	.byte 0, 0, 0, 0, 0, 0, 0, 0x80
+	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+	ASM_SIZE_DIRECTIVE(zero_nan)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+
 ENTRY(__ieee754_scalb)
 	fldl	12(%esp)
+	fxam
+	fnstsw
 	fldl	4(%esp)
+	andl	$0x4700, %eax
+	cmpl	$0x0700, %eax
+	je	1f
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fxam
+	fnstsw
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fld	%st(1)
+	frndint
+	fcomp	%st(2)
+	fnstsw
+	sahf
+	jne	2f
 	fscale
 	fstp	%st(1)
 	ret
+
+	/* y is -inf */
+1:	fxam
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fnstsw
+	movl	8(%esp), %edx
+	shrl	$5, %eax
+	fstp	%st(1)
+	andl	$0x80000000, %edx
+	andl	$8, %eax
+	fstp	%st(1)
+	shrl	$27, %edx
+	addl	%edx, %eax
+	fldl	MOX(zero_nan, %eax, 1)
+	ret
+
+	/* The result is NaN, but we must not raise an exception.
+	   So use a variable.  */
+2:	fstp	%st
+	fstp	%st
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fldl	MO(nan)
+	ret
 END(__ieee754_scalb)
diff --git a/sysdeps/libm-i387/e_scalbf.S b/sysdeps/libm-i387/e_scalbf.S
index 4c62134a0c..c869da9b38 100644
--- a/sysdeps/libm-i387/e_scalbf.S
+++ b/sysdeps/libm-i387/e_scalbf.S
@@ -2,16 +2,95 @@
  * Written by J.T. Conklin <jtc@netbsd.org>.
  * Public domain.
  * Adapted for float type by Ulrich Drepper <drepper@cygnus.com>.
+ *
+ * Correct handling of y==-inf <drepper@gnu>
  */
 
 #include <machine/asm.h>
 
 RCSID("$NetBSD: $")
 
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(zero_nan,@object)
+zero_nan:
+	.double 0.0
+nan:	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+minus_zero:
+	.byte 0, 0, 0, 0, 0, 0, 0, 0x80
+	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+	ASM_SIZE_DIRECTIVE(zero_nan)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+
+	.text
 ENTRY(__ieee754_scalbf)
 	flds	8(%esp)
+	fxam
+	fnstsw
 	flds	4(%esp)
+	andl	$0x4700, %eax
+	cmpl	$0x0700, %eax
+	je	1f
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fxam
+	fnstsw
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fld	%st(1)
+	frndint
+	fcomp	%st(2)
+	fnstsw
+	sahf
+	jne	2f
 	fscale
 	fstp	%st(1)
 	ret
+
+	/* y is -inf */
+1:	fxam
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fnstsw
+	movl	4(%esp), %edx
+	shrl	$5, %eax
+	fstp	%st(1)
+	andl	$0x80000000, %edx
+	andl	$8, %eax
+	fstp	%st(1)
+	shrl	$27, %edx
+	addl	%edx, %eax
+	fldl	MOX(zero_nan, %eax, 1)
+	ret
+
+	/* The result is NaN, but we must not raise an exception.
+	   So use a variable.  */
+2:	fstp	%st
+	fstp	%st
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fldl	MO(nan)
+	ret
 END(__ieee754_scalbf)
diff --git a/sysdeps/libm-i387/e_scalbl.S b/sysdeps/libm-i387/e_scalbl.S
index 3b746ad363..e272614acf 100644
--- a/sysdeps/libm-i387/e_scalbl.S
+++ b/sysdeps/libm-i387/e_scalbl.S
@@ -3,16 +3,94 @@
  * Public domain.
  *
  * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ *
+ * Correct handling of y==-inf <drepper@gnu>
  */
 
 #include <machine/asm.h>
 
 RCSID("$NetBSD: $")
 
+#ifdef __ELF__
+	.section .rodata
+#else
+	.text
+#endif
+
+	.align ALIGNARG(4)
+	ASM_TYPE_DIRECTIVE(zero_nan,@object)
+zero_nan:
+	.double 0.0
+nan:	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+minus_zero:
+	.byte 0, 0, 0, 0, 0, 0, 0, 0x80
+	.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
+	ASM_SIZE_DIRECTIVE(zero_nan)
+
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+
 ENTRY(__ieee754_scalbl)
 	fldt	16(%esp)
+	fxam
+	fnstsw
 	fldt	4(%esp)
+	andl	$0x4700, %eax
+	cmpl	$0x0700, %eax
+	je	1f
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fxam
+	fnstsw
+	andl	$0x4500, %eax
+	cmpl	$0x0100, %eax
+	je	2f
+	fld	%st(1)
+	frndint
+	fcomp	%st(2)
+	fnstsw
+	sahf
+	jne	2f
 	fscale
 	fstp	%st(1)
 	ret
+
+	/* y is -inf */
+1:	fxam
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fnstsw
+	movl	12(%esp), %edx
+	shrl	$5, %eax
+	fstp	%st(1)
+	andl	$0x8000, %edx
+	andl	$8, %eax
+	fstp	%st(1)
+	shrl	$11, %edx
+	addl	%edx, %eax
+	fldl	MOX(zero_nan, %eax, 1)
+	ret
+
+	/* The result is NaN, but we must not raise an exception.
+	   So use a variable.  */
+2:	fstp	%st
+	fstp	%st
+#ifdef  PIC
+        call    1f
+1:      popl    %ecx
+        addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+	fldl	MO(nan)
+	ret
 END(__ieee754_scalbl)
diff --git a/sysdeps/libm-i387/s_asinh.S b/sysdeps/libm-i387/s_asinh.S
index 45153fe2d3..a4c52cb67c 100644
--- a/sysdeps/libm-i387/s_asinh.S
+++ b/sysdeps/libm-i387/s_asinh.S
@@ -49,14 +49,14 @@ ENTRY(__asinh)
 	movl	$0x7fffffff, %eax
 	andl	%ecx, %eax
 	andl	$0x80000000, %ecx
+	movl	%eax, %edx
+	orl	$0x800fffff, %edx
+	incl	%edx
+	jz	7f			// x in ±Inf or NaN
 	xorl	%ecx, 8(%esp)
 	fldl	4(%esp)			// |x|
-	movl	%eax, %edx
 	cmpl	$0x3e300000, %eax
 	jb	2f			// |x| < 2^-28
-	orl	$0x800fffff, %edx
-	incl	%edx
-	jz	4f			// x in ±Inf or NaN
 	fldln2				// log(2) : |x|
 	cmpl	$0x41b00000, %eax
 	fxch				// |x| : log(2)
@@ -87,6 +87,9 @@ ENTRY(__asinh)
 	fchs
 4:	ret
 
+7:	fldl	4(%esp)
+	ret
+
 6:	faddl	MO(one)
 	fyl2x
 	jecxz	4f
diff --git a/sysdeps/libm-i387/s_asinhf.S b/sysdeps/libm-i387/s_asinhf.S
index 7e5176c4a6..6369e19ac6 100644
--- a/sysdeps/libm-i387/s_asinhf.S
+++ b/sysdeps/libm-i387/s_asinhf.S
@@ -49,14 +49,14 @@ ENTRY(__asinhf)
 	movl	$0x7fffffff, %eax
 	andl	%ecx, %eax
 	andl	$0x80000000, %ecx
+	movl	%eax, %edx
+	orl	$0x807fffff, %edx
+	incl	%edx
+	jz	7f			// x in ±Inf or NaN
 	xorl	%ecx, 8(%esp)
 	flds	4(%esp)			// |x|
-	movl	%eax, %edx
 	cmpl	$0x38000000, %eax
 	jb	2f			// |x| < 2^-14
-	orl	$0x807fffff, %edx
-	incl	%edx
-	jz	4f			// x in ±Inf or NaN
 	fldln2				// log(2) : |x|
 	cmpl	$0x47000000, %eax
 	fxch				// |x| : log(2)
@@ -87,6 +87,9 @@ ENTRY(__asinhf)
 	fchs
 4:	ret
 
+7:	flds	4(%esp)
+	ret
+
 6:	faddl	MO(one)
 	fyl2x
 	jecxz	4f
diff --git a/sysdeps/libm-i387/s_asinhl.S b/sysdeps/libm-i387/s_asinhl.S
index f764381aab..62e29bc58e 100644
--- a/sysdeps/libm-i387/s_asinhl.S
+++ b/sysdeps/libm-i387/s_asinhl.S
@@ -56,14 +56,14 @@ ENTRY(__asinhl)
 	movl	$0x7fff, %eax
 	andl	%ecx, %eax
 	andl	$0x8000, %ecx
+	movl	%eax, %edx
+	orl	$0xffff8000, %edx
+	incl	%edx
+	jz	7f			// x in ±Inf or NaN
 	xorl	%ecx, 12(%esp)
 	fldt	4(%esp)			// |x|
-	movl	%eax, %edx
 	cmpl	$0x3fde, %eax
 	jb	2f			// |x| < 2^-34
-	orl	$0xffff8000, %edx
-	incl	%edx
-	jz	4f			// x in ±Inf or NaN
 	fldln2				// log(2) : |x|
 	cmpl	$0x4020, %eax
 	fxch				// |x| : log(2)
@@ -94,6 +94,9 @@ ENTRY(__asinhl)
 	fchs
 4:	ret
 
+7:	fldt	4(%esp)
+	ret
+
 6:	faddl	MO(one)
 	fyl2x
 	jecxz	4f
diff --git a/sysdeps/libm-i387/s_ilogb.S b/sysdeps/libm-i387/s_ilogb.S
index 01b8afac10..6c125586c7 100644
--- a/sysdeps/libm-i387/s_ilogb.S
+++ b/sysdeps/libm-i387/s_ilogb.S
@@ -8,18 +8,14 @@
 RCSID("$NetBSD: s_ilogb.S,v 1.5 1995/10/12 15:53:09 jtc Exp $")
 
 ENTRY(__ilogb)
-	pushl	%ebp
-	movl	%esp,%ebp
-	subl	$4,%esp
-
-	fldl	8(%ebp)
+	fldl	4(%esp)
 	fxtract
+	pushl	%eax
 	fstpl	%st
 
-	fistpl	-4(%ebp)
-	movl	-4(%ebp),%eax
+	fistpl	(%esp)
+	popl	%eax
 
-	leave
 	ret
 END (__ilogb)
 weak_alias (__ilogb, ilogb)
diff --git a/sysdeps/libm-i387/s_ilogbf.S b/sysdeps/libm-i387/s_ilogbf.S
index 6a943265b2..b08a32f4ef 100644
--- a/sysdeps/libm-i387/s_ilogbf.S
+++ b/sysdeps/libm-i387/s_ilogbf.S
@@ -8,18 +8,14 @@
 RCSID("$NetBSD: s_ilogbf.S,v 1.4 1995/10/22 20:32:43 pk Exp $")
 
 ENTRY(__ilogbf)
-	pushl	%ebp
-	movl	%esp,%ebp
-	subl	$4,%esp
-
-	flds	8(%ebp)
+	flds	4(%esp)
 	fxtract
+	pushl	%eax
 	fstpl	%st
 
-	fistpl	-4(%ebp)
-	movl	-4(%ebp),%eax
+	fistpl	(%esp)
+	popl	%eax
 
-	leave
 	ret
 END (__ilogbf)
 weak_alias (__ilogbf, ilogbf)
diff --git a/sysdeps/libm-i387/s_ilogbl.S b/sysdeps/libm-i387/s_ilogbl.S
index 2422a41355..adc88aabab 100644
--- a/sysdeps/libm-i387/s_ilogbl.S
+++ b/sysdeps/libm-i387/s_ilogbl.S
@@ -9,17 +9,14 @@
 RCSID("$NetBSD: $")
 
 ENTRY(__ilogbl)
-	pushl	%ebp
-	movl	%esp,%ebp
-	subl	$4,%esp
-
-	fldt	8(%ebp)
+	fldt	4(%esp)
 	fxtract
+	pushl	%eax
+	fstp	%st
 
-	fistpl	-4(%ebp)
-	movl	-4(%ebp),%eax
+	fistpl	(%esp)
+	popl	%eax
 
-	leave
 	ret
 END (__ilogbl)
 weak_alias (__ilogbl, ilogbl)
diff --git a/sysdeps/libm-i387/s_rinttoll.S b/sysdeps/libm-i387/s_llrint.S
index 99395052de..cfb8e86f7d 100644
--- a/sysdeps/libm-i387/s_rinttoll.S
+++ b/sysdeps/libm-i387/s_llrint.S
@@ -22,12 +22,12 @@
 #include <sysdep.h>
 
 	.text
-ENTRY(__rinttoll)
+ENTRY(__llrint)
 	fldt	4(%esp)
 	subl	$8, %esp
 	fistpll	(%esp)
 	popl	%eax
 	popl	%edx
 	ret
-END(__rinttoll)
-weak_alias (__rinttoll, rinttoll)
+END(__llrint)
+weak_alias (__llrint, llrint)
diff --git a/sysdeps/libm-i387/s_rinttol.S b/sysdeps/libm-i387/s_lrint.S
index 22a3e46bd6..19241456a8 100644
--- a/sysdeps/libm-i387/s_rinttol.S
+++ b/sysdeps/libm-i387/s_lrint.S
@@ -22,11 +22,11 @@
 #include <sysdep.h>
 
 	.text
-ENTRY(__rinttol)
+ENTRY(__lrint)
 	fldt	4(%esp)
 	subl	$4, %esp
 	fistpl	(%esp)
 	popl	%eax
 	ret
-END(__rinttol)
-weak_alias (__rinttol, rinttol)
+END(__lrint)
+weak_alias (__lrint, lrint)
diff --git a/sysdeps/libm-i387/s_remquo.S b/sysdeps/libm-i387/s_remquo.S
index a4c5a35468..252bf2678a 100644
--- a/sysdeps/libm-i387/s_remquo.S
+++ b/sysdeps/libm-i387/s_remquo.S
@@ -25,7 +25,12 @@ ENTRY(__remquo)
 	shrl	%cl, %eax
 	andl	$3, %eax
 	movl	20(%esp), %ecx
-	movl	%eax, (%ecx)
+	movl	8(%esp), %edx
+	xorl	16(%esp), %edx
+	testl	$0x80000000, %edx
+	jz	1f
+	negl	%eax
+1:	movl	%eax, (%ecx)
 	ret
 END (__remquo)
 weak_alias (__remquo, remquo)
diff --git a/sysdeps/libm-i387/s_remquof.S b/sysdeps/libm-i387/s_remquof.S
index 56954323a6..144eb3034c 100644
--- a/sysdeps/libm-i387/s_remquof.S
+++ b/sysdeps/libm-i387/s_remquof.S
@@ -25,7 +25,12 @@ ENTRY(__remquof)
 	shrl	%cl, %eax
 	andl	$3, %eax
 	movl	12(%esp), %ecx
-	movl	%eax, (%ecx)
+	movl	4(%esp), %edx
+	xorl	8(%esp), %edx
+	testl	$0x80000000, %edx
+	jz	1f
+	negl	%eax
+1:	movl	%eax, (%ecx)
 	ret
 END (__remquof)
 weak_alias (__remquof, remquof)
diff --git a/sysdeps/libm-i387/s_remquol.S b/sysdeps/libm-i387/s_remquol.S
index 9c91d90c45..2cbcdf18af 100644
--- a/sysdeps/libm-i387/s_remquol.S
+++ b/sysdeps/libm-i387/s_remquol.S
@@ -25,7 +25,12 @@ ENTRY(__remquol)
 	shrl	%cl, %eax
 	andl	$3, %eax
 	movl	28(%esp), %ecx
-	movl	%eax, (%ecx)
+	movl	12(%esp), %edx
+	xorl	24(%esp), %edx
+	testl	$0x8000, %edx
+	jz	1f
+	negl	%eax
+1:	movl	%eax, (%ecx)
 	ret
 END (__remquol)
 weak_alias (__remquol, remquol)
diff --git a/sysdeps/libm-ieee754/e_gamma_r.c b/sysdeps/libm-ieee754/e_gamma_r.c
new file mode 100644
index 0000000000..eb80809843
--- /dev/null
+++ b/sysdeps/libm-ieee754/e_gamma_r.c
@@ -0,0 +1,47 @@
+/* Implementation of gamma function according to ISO C.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <math.h>
+#include <math_private.h>
+
+
+double
+__ieee754_gamma_r (double x, int *signgamp)
+{
+  /* We don't have a real gamma implementation now.  We'll use lgamma
+     and the exp function.  But due to the required boundary
+     conditions we must check some values separately.  */
+  int32_t hx;
+  u_int32_t lx;
+
+  EXTRACT_WORDS (hx, lx, x);
+
+  if ((hx & 0x7fffffff | lx) == 0)
+    /* Return value for x == 0 is NaN with invalid exception.  */
+    return x / x;
+  if (hx < 0 && (u_int32_t) hx < 0xfff00000 && __rint (x) == x)
+    {
+      /* Return value for integer x < 0 is NaN with invalid exception.  */
+      return (x - x) / (x - x);
+    }
+
+  /* XXX FIXME.  */
+  return __ieee754_exp (__ieee754_lgamma_r (x, signgamp));
+}
diff --git a/sysdeps/libm-ieee754/e_gammaf_r.c b/sysdeps/libm-ieee754/e_gammaf_r.c
new file mode 100644
index 0000000000..bf79ffeb57
--- /dev/null
+++ b/sysdeps/libm-ieee754/e_gammaf_r.c
@@ -0,0 +1,46 @@
+/* Implementation of gamma function according to ISO C.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <math.h>
+#include <math_private.h>
+
+
+float
+__ieee754_gammaf_r (float x, int *signgamp)
+{
+  /* We don't have a real gamma implementation now.  We'll use lgamma
+     and the exp function.  But due to the required boundary
+     conditions we must check some values separately.  */
+  int32_t hx;
+
+  GET_FLOAT_WORD (hx, x);
+
+  if ((hx & 0x7fffffff) == 0)
+    /* Return value for x == 0 is NaN with invalid exception.  */
+    return x / x;
+  if (hx < 0 && (u_int32_t) hx < 0xff800000 && __rintf (x) == x)
+    {
+      /* Return value for integer x < 0 is NaN with invalid exception.  */
+      return (x - x) / (x - x);
+    }
+
+  /* XXX FIXME.  */
+  return __ieee754_expf (__ieee754_lgammaf_r (x, signgamp));
+}
diff --git a/sysdeps/libm-ieee754/e_gammal_r.c b/sysdeps/libm-ieee754/e_gammal_r.c
new file mode 100644
index 0000000000..4fd49886d1
--- /dev/null
+++ b/sysdeps/libm-ieee754/e_gammal_r.c
@@ -0,0 +1,46 @@
+/* Implementation of gamma function according to ISO C.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+   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
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <math.h>
+#include <math_private.h>
+
+
+long double
+__ieee754_gammal_r (long double x, int *signgamp)
+{
+  /* We don't have a real gamma implementation now.  We'll use lgamma
+     and the exp function.  But due to the required boundary
+     conditions we must check some values separately.  */
+  u_int32_t es, hx, lx;
+
+  GET_LDOUBLE_WORDS (es, hx, lx, x);
+
+  if (((es & 0x7fff) | hx | lx) == 0)
+    /* Return value for x == 0 is NaN with invalid exception.  */
+    return x / x;
+  if ((hx & 0x8000) != 0 && (hx & 0x7fff) != 0x7fff && __rintl (x) == x)
+    {
+      /* Return value for integer x < 0 is NaN with invalid exception.  */
+      return (x - x) / (x - x);
+    }
+
+  /* XXX FIXME.  */
+  return __ieee754_expl (__ieee754_lgammal_r (x, signgamp));
+}
diff --git a/sysdeps/libm-ieee754/e_lgamma_r.c b/sysdeps/libm-ieee754/e_lgamma_r.c
index 1be4ddad8f..92e9556568 100644
--- a/sysdeps/libm-ieee754/e_lgamma_r.c
+++ b/sysdeps/libm-ieee754/e_lgamma_r.c
@@ -5,7 +5,7 @@
  *
  * Developed at SunPro, a Sun Microsystems, Inc. business.
  * 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.
  * ====================================================
  */
@@ -15,12 +15,12 @@ static char rcsid[] = "$NetBSD: e_lgamma_r.c,v 1.7 1995/05/10 20:45:42 jtc Exp $
 #endif
 
 /* __ieee754_lgamma_r(x, signgamp)
- * Reentrant version of the logarithm of the Gamma function 
- * with user provide pointer for the sign of Gamma(x). 
+ * Reentrant version of the logarithm of the Gamma function
+ * with user provide pointer for the sign of Gamma(x).
  *
  * Method:
  *   1. Argument Reduction for 0 < x <= 8
- * 	Since gamma(1+s)=s*gamma(s), for x in [0,8], we may 
+ * 	Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
  * 	reduce x to a number in [1.5,2.5] by
  * 		lgamma(1+s) = log(s) + lgamma(s)
  *	for example,
@@ -58,36 +58,36 @@ static char rcsid[] = "$NetBSD: e_lgamma_r.c,v 1.7 1995/05/10 20:45:42 jtc Exp $
  *	by
  *	  			    3       5             11
  *		w = w0 + w1*z + w2*z  + w3*z  + ... + w6*z
- *	where 
+ *	where
  *		|w - f(z)| < 2**-58.74
- *		
+ *
  *   4. For negative x, since (G is gamma function)
  *		-x*G(-x)*G(x) = pi/sin(pi*x),
  * 	we have
  * 		G(x) = pi/(sin(pi*x)*(-x)*G(-x))
  *	since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
- *	Hence, for x<0, signgam = sign(sin(pi*x)) and 
+ *	Hence, for x<0, signgam = sign(sin(pi*x)) and
  *		lgamma(x) = log(|Gamma(x)|)
  *			  = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
- *	Note: one should avoid compute pi*(-x) directly in the 
+ *	Note: one should avoid compute pi*(-x) directly in the
  *	      computation of sin(pi*(-x)).
- *		
+ *
  *   5. Special Cases
  *		lgamma(2+s) ~ s*(1-Euler) for tiny s
  *		lgamma(1)=lgamma(2)=0
  *		lgamma(x) ~ -log(x) for tiny x
  *		lgamma(0) = lgamma(inf) = inf
  *	 	lgamma(-integer) = +-inf
- *	
+ *
  */
 
 #include "math.h"
 #include "math_private.h"
 
 #ifdef __STDC__
-static const double 
+static const double
 #else
-static double 
+static double
 #endif
 two52=  4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
 half=  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
@@ -200,9 +200,9 @@ static double zero=  0.00000000000000000000e+00;
         }
 	switch (n) {
 	    case 0:   y =  __kernel_sin(pi*y,zero,0); break;
-	    case 1:   
+	    case 1:
 	    case 2:   y =  __kernel_cos(pi*(0.5-y),zero); break;
-	    case 3:  
+	    case 3:
 	    case 4:   y =  __kernel_sin(pi*(one-y),zero,0); break;
 	    case 5:
 	    case 6:   y = -__kernel_cos(pi*(y-1.5),zero); break;
@@ -226,9 +226,11 @@ static double zero=  0.00000000000000000000e+00;
 
     /* purge off +-inf, NaN, +-0, and negative arguments */
 	*signgamp = 1;
+	if ((unsigned int) hx==0xfff00000&&lx==0)
+	  return x-x;
 	ix = hx&0x7fffffff;
 	if(ix>=0x7ff00000) return x*x;
-	if((ix|lx)==0) return one/zero;
+	if((ix|lx)==0) return one/fabs(x);
 	if(ix<0x3b900000) {	/* |x|<2**-70, return -log(|x|) */
 	    if(hx<0) {
 	        *signgamp = -1;
@@ -237,9 +239,9 @@ static double zero=  0.00000000000000000000e+00;
 	}
 	if(hx<0) {
 	    if(ix>=0x43300000) 	/* |x|>=2**52, must be -integer */
-		return one/zero;
+		return x/zero;
 	    t = sin_pi(x);
-	    if(t==zero) return one/zero; /* -integer */
+	    if(t==zero) return one/fabsf(t); /* -integer */
 	    nadj = __ieee754_log(pi/fabs(t*x));
 	    if(t<zero) *signgamp = -1;
 	    x = -x;
@@ -275,7 +277,7 @@ static double zero=  0.00000000000000000000e+00;
 		p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
 		p  = z*p1-(tt-w*(p2+y*p3));
 		r += (tf + p); break;
-	      case 2:	
+	      case 2:
 		p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
 		p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
 		r += (-0.5*y + p1/p2);
@@ -304,7 +306,7 @@ static double zero=  0.00000000000000000000e+00;
 	    y = z*z;
 	    w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
 	    r = (x-half)*(t-one)+w;
-	} else 
+	} else
     /* 2**58 <= x <= inf */
 	    r =  x*(__ieee754_log(x)-one);
 	if(hx<0) r = nadj - r;
diff --git a/sysdeps/libm-ieee754/e_lgammaf_r.c b/sysdeps/libm-ieee754/e_lgammaf_r.c
index 1d0122dbb2..f744d5320e 100644
--- a/sysdeps/libm-ieee754/e_lgammaf_r.c
+++ b/sysdeps/libm-ieee754/e_lgammaf_r.c
@@ -8,7 +8,7 @@
  *
  * Developed at SunPro, a Sun Microsystems, Inc. business.
  * 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.
  * ====================================================
  */
@@ -21,9 +21,9 @@ static char rcsid[] = "$NetBSD: e_lgammaf_r.c,v 1.3 1995/05/10 20:45:47 jtc Exp
 #include "math_private.h"
 
 #ifdef __STDC__
-static const float 
+static const float
 #else
-static float 
+static float
 #endif
 two23=  8.3886080000e+06, /* 0x4b000000 */
 half=  5.0000000000e-01, /* 0x3f000000 */
@@ -136,9 +136,9 @@ static float zero=  0.0000000000e+00;
         }
 	switch (n) {
 	    case 0:   y =  __kernel_sinf(pi*y,zero,0); break;
-	    case 1:   
+	    case 1:
 	    case 2:   y =  __kernel_cosf(pi*((float)0.5-y),zero); break;
-	    case 3:  
+	    case 3:
 	    case 4:   y =  __kernel_sinf(pi*(one-y),zero,0); break;
 	    case 5:
 	    case 6:   y = -__kernel_cosf(pi*(y-(float)1.5),zero); break;
@@ -162,9 +162,11 @@ static float zero=  0.0000000000e+00;
 
     /* purge off +-inf, NaN, +-0, and negative arguments */
 	*signgamp = 1;
+	if ((unsigned int)hx==0xff800000)
+	  return x-x;
 	ix = hx&0x7fffffff;
 	if(ix>=0x7f800000) return x*x;
-	if(ix==0) return one/zero;
+	if(ix==0) return one/fabsf(x);
 	if(ix<0x1c800000) {	/* |x|<2**-70, return -log(|x|) */
 	    if(hx<0) {
 	        *signgamp = -1;
@@ -173,9 +175,9 @@ static float zero=  0.0000000000e+00;
 	}
 	if(hx<0) {
 	    if(ix>=0x4b000000) 	/* |x|>=2**23, must be -integer */
-		return one/zero;
+		return x/zero;
 	    t = sin_pif(x);
-	    if(t==zero) return one/zero; /* -integer */
+	    if(t==zero) return one/fabsf(t); /* -integer */
 	    nadj = __ieee754_logf(pi/fabsf(t*x));
 	    if(t<zero) *signgamp = -1;
 	    x = -x;
@@ -211,7 +213,7 @@ static float zero=  0.0000000000e+00;
 		p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
 		p  = z*p1-(tt-w*(p2+y*p3));
 		r += (tf + p); break;
-	      case 2:	
+	      case 2:
 		p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
 		p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
 		r += (-(float)0.5*y + p1/p2);
@@ -240,7 +242,7 @@ static float zero=  0.0000000000e+00;
 	    y = z*z;
 	    w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
 	    r = (x-half)*(t-one)+w;
-	} else 
+	} else
     /* 2**58 <= x <= inf */
 	    r =  x*(__ieee754_logf(x)-one);
 	if(hx<0) r = nadj - r;
diff --git a/sysdeps/libm-ieee754/s_rinttoll.c b/sysdeps/libm-ieee754/s_llrint.c
index b2fccd17b7..faae106ece 100644
--- a/sysdeps/libm-ieee754/s_rinttoll.c
+++ b/sysdeps/libm-ieee754/s_llrint.c
@@ -33,7 +33,7 @@ static long double two52[2] =
 
 
 long long int
-__rinttoll (long double x)
+__llrint (long double x)
 {
   int32_t j0,sx;
   u_int32_t i0, i1, i;
@@ -141,7 +141,7 @@ static long double two63[2] =
 
 
 long long int
-__rinttoll (long double x)
+__llrint (long double x)
 {
   int32_t se,j0,sx;
   u_int32_t i0, i1, i;
@@ -239,4 +239,4 @@ __rinttoll (long double x)
 }
 #endif
 
-weak_alias (__rinttoll, rinttoll)
+weak_alias (__llrint, llrint)
diff --git a/sysdeps/libm-ieee754/s_roundtoll.c b/sysdeps/libm-ieee754/s_llround.c
index 49167236a6..aee0e31fc0 100644
--- a/sysdeps/libm-ieee754/s_roundtoll.c
+++ b/sysdeps/libm-ieee754/s_llround.c
@@ -27,7 +27,7 @@
 /* The `long double' is in fact the IEEE `double' type.  */
 
 long long int
-__roundtoll (long double x)
+__llround (long double x)
 {
   int32_t j0;
   u_int32_t i1, i0;
@@ -103,7 +103,7 @@ __roundtoll (long double x)
 }
 #else
 long long int
-__roundtoll (long double x)
+__llround (long double x)
 {
   int32_t j0;
   u_int32_t se, i1, i0;
@@ -176,4 +176,4 @@ __roundtoll (long double x)
   return se & 0x8000 ? -result : result;
 }
 #endif
-weak_alias (__roundtoll, roundtoll)
+weak_alias (__llround, llround)
diff --git a/sysdeps/libm-ieee754/s_rinttol.c b/sysdeps/libm-ieee754/s_lrint.c
index 257bdc744c..6779f974bd 100644
--- a/sysdeps/libm-ieee754/s_rinttol.c
+++ b/sysdeps/libm-ieee754/s_lrint.c
@@ -33,7 +33,7 @@ static long double two52[2] =
 
 
 long int
-__rinttol (long double x)
+__lrint (long double x)
 {
   int32_t j0,sx;
   u_int32_t i0,i1,i;
@@ -141,7 +141,7 @@ static long double two63[2] =
 
 
 long int
-__rinttol (long double x)
+__lrint (long double x)
 {
   int32_t se,j0,sx;
   u_int32_t i0,i1,i;
@@ -239,4 +239,4 @@ __rinttol (long double x)
 }
 #endif
 
-weak_alias (__rinttol, rinttol)
+weak_alias (__lrint, lrint)
diff --git a/sysdeps/libm-ieee754/s_roundtol.c b/sysdeps/libm-ieee754/s_lround.c
index bc0ceae0f8..0f91280a79 100644
--- a/sysdeps/libm-ieee754/s_roundtol.c
+++ b/sysdeps/libm-ieee754/s_lround.c
@@ -27,7 +27,7 @@
 /* The `long double' is in fact the IEEE `double' type.  */
 
 long int
-__roundtol (long double x)
+__lround (long double x)
 {
   int32_t j0;
   u_int32_t i1, i0;
@@ -101,7 +101,7 @@ __roundtol (long double x)
 }
 #else
 long int
-__roundtol (long double x)
+__lround (long double x)
 {
   int32_t j0;
   u_int32_t se, i1, i0;
@@ -174,4 +174,4 @@ __roundtol (long double x)
   return se & 0x8000 ? -result : result;
 }
 #endif
-weak_alias (__roundtol, roundtol)
+weak_alias (__lround, lround)
diff --git a/sysdeps/libm-ieee754/s_remquo.c b/sysdeps/libm-ieee754/s_remquo.c
index f0a32130a2..39f6ceab2e 100644
--- a/sysdeps/libm-ieee754/s_remquo.c
+++ b/sysdeps/libm-ieee754/s_remquo.c
@@ -82,6 +82,7 @@ __remquo (double x, double y, int *quo)
       if (x + x > y)
 	{
 	  x -= y;
+	  ++cquo;
 	  if (x + x >= y)
 	    {
 	      x -= y;
@@ -95,6 +96,7 @@ __remquo (double x, double y, int *quo)
       if (x > y_half)
 	{
 	  x -= y;
+	  ++cquo;
 	  if (x >= y_half)
 	    {
 	      x -= y;
diff --git a/sysdeps/libm-ieee754/s_remquof.c b/sysdeps/libm-ieee754/s_remquof.c
index 6fa02e47b3..b3870f4b02 100644
--- a/sysdeps/libm-ieee754/s_remquof.c
+++ b/sysdeps/libm-ieee754/s_remquof.c
@@ -81,6 +81,7 @@ __remquof (float x, float y, int *quo)
       if (x + x > y)
 	{
 	  x -= y;
+	  ++cquo;
 	  if (x + x >= y)
 	    {
 	      x -= y;
@@ -94,6 +95,7 @@ __remquof (float x, float y, int *quo)
       if (x > y_half)
 	{
 	  x -= y;
+	  ++cquo;
 	  if (x >= y_half)
 	    {
 	      x -= y;
diff --git a/sysdeps/libm-ieee754/s_remquol.c b/sysdeps/libm-ieee754/s_remquol.c
index 9ef424901b..b7835e6dc7 100644
--- a/sysdeps/libm-ieee754/s_remquol.c
+++ b/sysdeps/libm-ieee754/s_remquol.c
@@ -82,6 +82,7 @@ __remquol (long double x, long double p, int *quo)
       if (x + x > p)
 	{
 	  x -= p;
+	  ++cquo;
 	  if (x + x >= p)
 	    {
 	      x -= p;
@@ -95,6 +96,7 @@ __remquol (long double x, long double p, int *quo)
       if (x > p_half)
 	{
 	  x -= p;
+	  ++cquo;
 	  if (x >= p_half)
 	    {
 	      x -= p;
diff --git a/sysdeps/libm-ieee754/s_scalbn.c b/sysdeps/libm-ieee754/s_scalbn.c
index 439b966e69..0ce0ffdf2f 100644
--- a/sysdeps/libm-ieee754/s_scalbn.c
+++ b/sysdeps/libm-ieee754/s_scalbn.c
@@ -35,10 +35,10 @@ huge   = 1.0e+300,
 tiny   = 1.0e-300;
 
 #ifdef __STDC__
-	double __scalbn (double x, int n)
+	double __scalbn (double x, long int n)
 #else
 	double __scalbn (x,n)
-	double x; int n;
+	double x; long int n;
 #endif
 {
 	int32_t k,hx,lx;
@@ -49,17 +49,16 @@ tiny   = 1.0e-300;
 	    x *= two54;
 	    GET_HIGH_WORD(hx,x);
 	    k = ((hx&0x7ff00000)>>20) - 54;
-            if (n< -50000) return tiny*x; 	/*underflow*/
 	    }
         if (k==0x7ff) return x+x;		/* NaN or Inf */
         k = k+n;
-        if (k >  0x7fe) return huge*__copysign(huge,x); /* overflow  */
+        if (n> 50000 || k >  0x7fe)
+	  return huge*__copysign(huge,x); /* overflow  */
+	if (n< -50000) return tiny*__copysign(tiny,x); /*underflow*/
         if (k > 0) 				/* normal result */
 	    {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
         if (k <= -54)
-            if (n > 50000) 	/* in case integer overflow in n+k */
-		return huge*__copysign(huge,x);	/*overflow*/
-	    else return tiny*__copysign(tiny,x); 	/*underflow*/
+	  return tiny*__copysign(tiny,x); 	/*underflow*/
         k += 54;				/* subnormal result */
 	SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
         return x*twom54;
diff --git a/sysdeps/libm-ieee754/s_scalbnf.c b/sysdeps/libm-ieee754/s_scalbnf.c
index 3a83e54c56..4799c825c9 100644
--- a/sysdeps/libm-ieee754/s_scalbnf.c
+++ b/sysdeps/libm-ieee754/s_scalbnf.c
@@ -8,7 +8,7 @@
  *
  * Developed at SunPro, a Sun Microsystems, Inc. business.
  * 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.
  * ====================================================
  */
@@ -31,10 +31,10 @@ huge   = 1.0e+30,
 tiny   = 1.0e-30;
 
 #ifdef __STDC__
-	float __scalbnf (float x, int n)
+	float __scalbnf (float x, long int n)
 #else
 	float __scalbnf (x,n)
-	float x; int n;
+	float x; long int n;
 #endif
 {
 	int32_t k,ix;
@@ -44,18 +44,18 @@ tiny   = 1.0e-30;
             if ((ix&0x7fffffff)==0) return x; /* +-0 */
 	    x *= two25;
 	    GET_FLOAT_WORD(ix,x);
-	    k = ((ix&0x7f800000)>>23) - 25; 
-            if (n< -50000) return tiny*x; 	/*underflow*/
+	    k = ((ix&0x7f800000)>>23) - 25;
 	    }
         if (k==0xff) return x+x;		/* NaN or Inf */
-        k = k+n; 
-        if (k >  0xfe) return huge*copysignf(huge,x); /* overflow  */
+        k = k+n;
+        if (n> 50000 || k >  0xfe)
+	  return huge*copysignf(huge,x); /* overflow  */
+	if (n< -50000)
+	  return tiny*copysignf(tiny,x);	/*underflow*/
         if (k > 0) 				/* normal result */
 	    {SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23)); return x;}
         if (k <= -25)
-            if (n > 50000) 	/* in case integer overflow in n+k */
-		return huge*copysignf(huge,x);	/*overflow*/
-	    else return tiny*copysignf(tiny,x);	/*underflow*/
+	    return tiny*copysignf(tiny,x);	/*underflow*/
         k += 25;				/* subnormal result */
 	SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23));
         return x*twom25;
diff --git a/sysdeps/libm-ieee754/s_scalbnl.c b/sysdeps/libm-ieee754/s_scalbnl.c
index 6825e9c7b3..3e80d85136 100644
--- a/sysdeps/libm-ieee754/s_scalbnl.c
+++ b/sysdeps/libm-ieee754/s_scalbnl.c
@@ -33,16 +33,16 @@ static const long double
 #else
 static long double
 #endif
-two54   =  1.80143985094819840000e+16, /* 0x4035, 0x00000000, 0x00000000 */
-twom54  =  5.55111512312578270212e-17, /* 0x3FC9, 0x00000000, 0x00000000 */
+two63   =  4.50359962737049600000e+15,
+twom63  =  1.08420217248550443400e-19;
 huge   = 1.0e+4900L,
 tiny   = 1.0e-4900L;
 
 #ifdef __STDC__
-	long double __scalbnl (long double x, int n)
+	long double __scalbnl (long double x, long int n)
 #else
 	long double __scalbnl (x,n)
-	long double x; int n;
+	long double x; long int n;
 #endif
 {
 	int32_t k,es,hx,lx;
@@ -50,22 +50,22 @@ tiny   = 1.0e-4900L;
         k = es&0x7fff;				/* extract exponent */
         if (k==0) {				/* 0 or subnormal x */
             if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
-	    x *= two54;
-	    GET_HIGH_WORD(hx,x);
-	    k = ((hx&0x7ff00000)>>20) - 54;
-            if (n< -50000) return tiny*x; 	/*underflow*/
+	    x *= two63;
+	    GET_LDOUBLE_EXP(es,x);
+	    k = (hx&0x7fff) - 63;
 	    }
-        if (k==0x7ff) return x+x;		/* NaN or Inf */
+        if (k==0x7fff) return x+x;		/* NaN or Inf */
         k = k+n;
-        if (k >  0x7fe) return huge*__copysign(huge,x); /* overflow  */
+        if (n> 50000 || k > 0x7ffe)
+	  return huge*__copysignl(huge,x); /* overflow  */
+	if (n< -50000)
+	  return tiny*__copysignl(tiny,x);
         if (k > 0) 				/* normal result */
-	    {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
-        if (k <= -54)
-            if (n > 50000) 	/* in case integer overflow in n+k */
-		return huge*__copysign(huge,x);	/*overflow*/
-	    else return tiny*__copysign(tiny,x); 	/*underflow*/
+	    {SET_LDOUBLE_EXP(x,(es&0x8000)|k); return x;}
+        if (k <= -63)
+	    return tiny*__copysignl(tiny,x); 	/*underflow*/
         k += 54;				/* subnormal result */
-	SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
-        return x*twom54;
+	SET_LDOUBLE_EXP(x,(es&0x8000)|k);
+        return x*twom63;
 }
 weak_alias (__scalbnl, scalbnl)
diff --git a/sysdeps/libm-ieee754/w_gamma.c b/sysdeps/libm-ieee754/w_gamma.c
index 49e4bcf3c3..87a3408c3f 100644
--- a/sysdeps/libm-ieee754/w_gamma.c
+++ b/sysdeps/libm-ieee754/w_gamma.c
@@ -15,16 +15,13 @@ static char rcsid[] = "$NetBSD: w_gamma.c,v 1.7 1995/11/20 22:06:43 jtc Exp $";
 #endif
 
 /* double gamma(double x)
- * Return the logarithm of the Gamma function of x.
- *
- * Method: call gamma_r
+ * Return  the logarithm of the Gamma function of x or the Gamma function of x,
+ * depending on the library mode.
  */
 
 #include "math.h"
 #include "math_private.h"
 
-extern int signgam;
-
 #ifdef __STDC__
 	double __gamma(double x)
 #else
@@ -32,12 +29,19 @@ extern int signgam;
 	double x;
 #endif
 {
+	int signgam;
+        double y;
+	if (_LIB_VERSION == _SVID_)
+	  y = __ieee754_lgamma_r(x,&signgam);
+	else
+	  {
+	    y = __ieee754_gamma_r(x,&signgam);
+	    if (signgam < 0) y = -y;
 #ifdef _IEEE_LIBM
-	return __ieee754_lgamma_r(x,&signgam);
+	    return y;
 #else
-        double y;
-        y = __ieee754_lgamma_r(x,&signgam);
-        if(_LIB_VERSION == _IEEE_) return y;
+	    if(_LIB_VERSION == _IEEE_) return y;
+	  }
         if(!__finite(y)&&__finite(x)) {
             if(__floor(x)==x&&x<=0.0)
                 return __kernel_standard(x,x,41); /* gamma pole */
diff --git a/sysdeps/libm-ieee754/w_gamma_r.c b/sysdeps/libm-ieee754/w_gamma_r.c
deleted file mode 100644
index f9efc8cf2e..0000000000
--- a/sysdeps/libm-ieee754/w_gamma_r.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* @(#)wr_gamma.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: w_gamma_r.c,v 1.7 1995/11/20 22:06:45 jtc Exp $";
-#endif
-
-/*
- * wrapper double gamma_r(double x, int *signgamp)
- */
-
-#include "math.h"
-#include "math_private.h"
-
-
-#ifdef __STDC__
-	double __gamma_r(double x, int *signgamp) /* wrapper lgamma_r */
-#else
-	double __gamma_r(x,signgamp)              /* wrapper lgamma_r */
-        double x; int *signgamp;
-#endif
-{
-#ifdef _IEEE_LIBM
-	return __ieee754_lgamma_r(x,signgamp);
-#else
-        double y;
-        y = __ieee754_lgamma_r(x,signgamp);
-        if(_LIB_VERSION == _IEEE_) return y;
-        if(!__finite(y)&&__finite(x)) {
-            if(__floor(x)==x&&x<=0.0)
-                return __kernel_standard(x,x,41); /* gamma pole */
-            else
-                return __kernel_standard(x,x,40); /* gamma overflow */
-        } else
-            return y;
-#endif
-}
-weak_alias (__gamma_r, gamma_r)
-#ifdef NO_LONG_DOUBLE
-strong_alias (__gamma_r, __gammal_r)
-weak_alias (__gamma_r, gammal_r)
-#endif
diff --git a/sysdeps/libm-ieee754/w_gammaf.c b/sysdeps/libm-ieee754/w_gammaf.c
index c2d21daf47..ecde183824 100644
--- a/sysdeps/libm-ieee754/w_gammaf.c
+++ b/sysdeps/libm-ieee754/w_gammaf.c
@@ -8,7 +8,7 @@
  *
  * Developed at SunPro, a Sun Microsystems, Inc. business.
  * 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.
  * ====================================================
  */
@@ -20,8 +20,6 @@ static char rcsid[] = "$NetBSD: w_gammaf.c,v 1.4 1995/11/20 22:06:48 jtc Exp $";
 #include "math.h"
 #include "math_private.h"
 
-extern int signgam;
-
 #ifdef __STDC__
 	float __gammaf(float x)
 #else
@@ -29,12 +27,19 @@ extern int signgam;
 	float x;
 #endif
 {
+	int signgam;
+        float y;
+	if (_LIB_VERSION == _SVID_)
+	  y = __ieee754_lgammaf_r(x,&signgam);
+	else
+	  {
+	    y = __ieee754_gammaf_r(x,&signgam);
+	    if (signgam < 0) y = -y;
 #ifdef _IEEE_LIBM
-	return __ieee754_lgammaf_r(x,&signgam);
+	    return y;
 #else
-        float y;
-        y = __ieee754_lgammaf_r(x,&signgam);
-        if(_LIB_VERSION == _IEEE_) return y;
+	    if(_LIB_VERSION == _IEEE_) return y;
+	  }
         if(!__finitef(y)&&__finitef(x)) {
             if(__floorf(x)==x&&x<=(float)0.0)
 	        /* gammaf pole */
@@ -45,5 +50,5 @@ extern int signgam;
         } else
             return y;
 #endif
-}             
+}
 weak_alias (__gammaf, gammaf)
diff --git a/sysdeps/libm-ieee754/w_gammaf_r.c b/sysdeps/libm-ieee754/w_gammaf_r.c
deleted file mode 100644
index b15d5e84bb..0000000000
--- a/sysdeps/libm-ieee754/w_gammaf_r.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* w_gammaf_r.c -- float version of w_gamma_r.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
- * is preserved.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: w_gammaf_r.c,v 1.4 1995/11/20 22:06:50 jtc Exp $";
-#endif
-
-/* 
- * wrapper float gammaf_r(float x, int *signgamp)
- */
-
-#include "math.h"
-#include "math_private.h"
-
-
-#ifdef __STDC__
-	float __gammaf_r(float x, int *signgamp) /* wrapper lgammaf_r */
-#else
-	float __gammaf_r(x,signgamp)              /* wrapper lgammaf_r */
-        float x; int *signgamp;
-#endif
-{
-#ifdef _IEEE_LIBM
-	return __ieee754_lgammaf_r(x,signgamp);
-#else
-        float y;
-        y = __ieee754_lgammaf_r(x,signgamp);
-        if(_LIB_VERSION == _IEEE_) return y;
-        if(!__finitef(y)&&__finitef(x)) {
-            if(__floorf(x)==x&&x<=(float)0.0)
-	        /* gammaf pole */
-                return (float)__kernel_standard((double)x,(double)x,141);
-            else
-	        /* gamma overflow */
-                return (float)__kernel_standard((double)x,(double)x,140);
-        } else
-            return y;
-#endif
-}             
-weak_alias (__gammaf_r, gammaf_r)
diff --git a/sysdeps/libm-ieee754/w_gammal.c b/sysdeps/libm-ieee754/w_gammal.c
index f72e2e7e44..605a4167c4 100644
--- a/sysdeps/libm-ieee754/w_gammal.c
+++ b/sysdeps/libm-ieee754/w_gammal.c
@@ -19,16 +19,12 @@ static char rcsid[] = "$NetBSD: $";
 #endif
 
 /* long double gammal(double x)
- * Return the logarithm of the Gamma function of x.
- *
- * Method: call gammal_r
+ * Return the Gamma function of x.
  */
 
 #include "math.h"
 #include "math_private.h"
 
-extern int signgam;
-
 #ifdef __STDC__
 	long double __gammal(long double x)
 #else
@@ -36,12 +32,19 @@ extern int signgam;
 	long double x;
 #endif
 {
+        long double y;
+	int signgam;
+	if (_LIB_VERSION == _SVID_)
+	  y = __ieee754_lgammal_r(x,&signgam);
+	else
+	  {
+	    y = __ieee754_gammal_r(x,&signgam);
+	    if (signgam < 0) y = -y;
 #ifdef _IEEE_LIBM
-	return __ieee754_lgammal_r(x,&signgam);
+	    return y;
 #else
-        long double y;
-        y = __ieee754_lgammal_r(x,&signgam);
-        if(_LIB_VERSION == _IEEE_) return y;
+	    if(_LIB_VERSION == _IEEE_) return y;
+	  }
         if(!__finitel(y)&&__finitel(x)) {
             if(__floorl(x)==x&&x<=0.0)
                 return __kernel_standard(x,x,241); /* gamma pole */
diff --git a/sysdeps/libm-ieee754/w_gammal_r.c b/sysdeps/libm-ieee754/w_gammal_r.c
deleted file mode 100644
index ad6a43ae9b..0000000000
--- a/sysdeps/libm-ieee754/w_gammal_r.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* w_gammal_r.c -- long double version of w_gamma_r.c.
- * Conversion to long double by Ulrich Drepper,
- * Cygnus Support, drepper@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: $";
-#endif
-
-/*
- * wrapper long double gammal_r(long double x, int *signgamp)
- */
-
-#include "math.h"
-#include "math_private.h"
-
-
-#ifdef __STDC__
-	long double __gammal_r(long double x, int *signgamp)
-						/* wrapper lgammal_r */
-#else
-	long double __gammal_r(x,signgamp)	/* wrapper lgamma_r */
-        long double x; int *signgamp;
-#endif
-{
-#ifdef _IEEE_LIBM
-	return __ieee754_lgammal_r(x,signgamp);
-#else
-        long double y;
-        y = __ieee754_lgammal_r(x,signgamp);
-        if(_LIB_VERSION == _IEEE_) return y;
-        if(!__finitel(y)&&__finitel(x)) {
-            if(__floorl(x)==x&&x<=0.0)
-                return __kernel_standard(x,x,241); /* gamma pole */
-            else
-                return __kernel_standard(x,x,240); /* gamma overflow */
-        } else
-            return y;
-#endif
-}
-weak_alias (__gammal_r, gammal_r)
diff --git a/sysdeps/m68k/fpu/__math.h b/sysdeps/m68k/fpu/__math.h
index fd90a2de1b..bdeaa9efb0 100644
--- a/sysdeps/m68k/fpu/__math.h
+++ b/sysdeps/m68k/fpu/__math.h
@@ -309,7 +309,7 @@ __inline_functions (float,f)
 __inline_functions (long double,l)
 #undef __inline_functions
 
-__m81_defun (long int, __rinttol, (long double __x))
+__m81_defun (long int, __lrint, (long double __x))
 {
   long int __result;
   __asm ("fmove%.l %1, %0" : "=dm" (__result) : "f" (__x));
@@ -391,7 +391,7 @@ __inline_forward_c(int,ilogbl, (long double __value), (__value))
 #endif
 #ifdef __USE_ISOC9X
 __inline_forward_c(long double,nearbyintl, (long double __value), (__value))
-__inline_forward_c(long int,rinttol, (long double __value), (__value))
+__inline_forward_c(long int,lrint, (long double __value), (__value))
 #endif
 #ifdef __USE_GNU
 __inline_forward(void,sincosl,
diff --git a/sysdeps/m68k/fpu/s_rinttoll.c b/sysdeps/m68k/fpu/s_llrint.c
index bad8082bd1..f5d0d51122 100644
--- a/sysdeps/m68k/fpu/s_rinttoll.c
+++ b/sysdeps/m68k/fpu/s_llrint.c
@@ -24,7 +24,7 @@
 #include "math_private.h"
 
 long long int
-__rinttoll (long double x)
+__llrint (long double x)
 {
   int32_t se, sx;
   u_int32_t h, l;
@@ -59,4 +59,4 @@ __rinttoll (long double x)
   return result;
 }
 
-weak_alias (__rinttoll, rinttoll)
+weak_alias (__llrint, llrint)
diff --git a/sysdeps/m68k/fpu/s_rinttol.c b/sysdeps/m68k/fpu/s_lrint.c
index 7476d785a6..a7044113af 100644
--- a/sysdeps/m68k/fpu/s_rinttol.c
+++ b/sysdeps/m68k/fpu/s_lrint.c
@@ -23,9 +23,9 @@
 #include <math.h>
 
 long int
-__rinttol (long double x)
+__lrint (long double x)
 {
-  return __m81_u(__rinttol) (x);
+  return __m81_u(__lrint) (x);
 }
 
-weak_alias (__rinttol, rinttol)
+weak_alias (__lrint, lrint)
diff --git a/sysdeps/m68k/fpu/s_remquo.c b/sysdeps/m68k/fpu/s_remquo.c
index 3682ba7896..0332eccfd0 100644
--- a/sysdeps/m68k/fpu/s_remquo.c
+++ b/sysdeps/m68k/fpu/s_remquo.c
@@ -37,18 +37,9 @@ s(__remquo) (float_type x, float_type y, int *quo)
   float_type result;
   int cquo, fpsr;
 
-  /* FIXME: Which of frem and fmod is correct?  */
-#if 1
   __asm ("frem%.x %2,%0\n\tfmove%.l %/fpsr,%1"
 	 : "=f" (result), "=dm" (fpsr) : "f" (y), "0" (x));
   cquo = (fpsr >> 16) & 0x7f;
-  if ((result > 0) != (x > 0))
-    cquo--;
-#else
-  __asm ("fmod%.x %2,%0\n\tfmove%.l %/fpsr,%1"
-	 : "=f" (result), "=dm" (fpsr) : "f" (y), "0" (x));
-  cquo = (fpsr >> 16) & 0x7f;
-#endif
   if (fpsr & (1 << 23))
     cquo = -cquo;
   *quo = cquo;
diff --git a/sysdeps/posix/Makefile b/sysdeps/posix/Makefile
index 7c1013ad2b..a47f77af32 100644
--- a/sysdeps/posix/Makefile
+++ b/sysdeps/posix/Makefile
@@ -16,6 +16,9 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 # Boston, MA 02111-1307, USA.
 
+ifneq (yes,$(inhibit-stdio_lim))
+# Disable these rules if we generate stdio_lim.h by other means.
+
 ifeq (yes,$(cross-compiling))
 $(common-objpfx)stdio_lim.h:
 	@echo
@@ -38,3 +41,5 @@ $(common-objpfx)mk-stdiolim: $(sysdep_dir)/posix/mk-stdiolim.c \
 
 common-generated := $(common-generated) stdio_lim.h mk-stdiolim
 before-compile := $(before-compile) $(common-objpfx)stdio_lim.h
+
+endif # inhibit-stdio_lim
diff --git a/sysdeps/powerpc/Dist b/sysdeps/powerpc/Dist
index ba908dc0cb..ae16c0f8fb 100644
--- a/sysdeps/powerpc/Dist
+++ b/sysdeps/powerpc/Dist
@@ -1 +1,2 @@
+fenv_const.c
 fenv_libc.h
diff --git a/sysdeps/stub/e_acoshl.c b/sysdeps/stub/e_acoshl.c
index 6ec9a15d38..3383c14872 100644
--- a/sysdeps/stub/e_acoshl.c
+++ b/sysdeps/stub/e_acoshl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_acoshl (long double x)
 {
   fputs ("__ieee754_acoshl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_acosl.c b/sysdeps/stub/e_acosl.c
index 5c10b526cc..af1e6261c3 100644
--- a/sysdeps/stub/e_acosl.c
+++ b/sysdeps/stub/e_acosl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_acosl (long double x)
 {
   fputs ("__ieee754_acosl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_asinl.c b/sysdeps/stub/e_asinl.c
index f9260913e8..ce8c8cdaea 100644
--- a/sysdeps/stub/e_asinl.c
+++ b/sysdeps/stub/e_asinl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_asinl (long double x)
 {
   fputs ("__ieee754_asinl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_atan2l.c b/sysdeps/stub/e_atan2l.c
index 3edfacd68a..6c500d4c8a 100644
--- a/sysdeps/stub/e_atan2l.c
+++ b/sysdeps/stub/e_atan2l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_atan2l (long double x, long double y)
 {
   fputs ("__ieee754_atan2l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_expl.c b/sysdeps/stub/e_expl.c
index 246b5ae83f..4ea8c79597 100644
--- a/sysdeps/stub/e_expl.c
+++ b/sysdeps/stub/e_expl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_expl (long double x)
 {
   fputs ("__ieee754_expl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_fmodl.c b/sysdeps/stub/e_fmodl.c
index b47912581b..25cc114808 100644
--- a/sysdeps/stub/e_fmodl.c
+++ b/sysdeps/stub/e_fmodl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_fmodl (long double x, long double y)
 {
   fputs ("__ieee754_fmodl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_j0l.c b/sysdeps/stub/e_j0l.c
index c16e8a8a9d..ecb8a8ed16 100644
--- a/sysdeps/stub/e_j0l.c
+++ b/sysdeps/stub/e_j0l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_j0l (long double x)
 {
   fputs ("__ieee754_j0l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
@@ -14,6 +16,7 @@ long double
 __ieee754_y0l (long double x)
 {
   fputs ("__ieee754_y0l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_j1l.c b/sysdeps/stub/e_j1l.c
index 0a781e5cc1..24655700e3 100644
--- a/sysdeps/stub/e_j1l.c
+++ b/sysdeps/stub/e_j1l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_j1l (long double x)
 {
   fputs ("__ieee754_j1l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
@@ -14,6 +16,7 @@ long double
 __ieee754_y1l (long double x)
 {
   fputs ("__ieee754_y1l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_jnl.c b/sysdeps/stub/e_jnl.c
index 86ff03b031..8ced34d461 100644
--- a/sysdeps/stub/e_jnl.c
+++ b/sysdeps/stub/e_jnl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_jnl (int n, long double x)
 {
   fputs ("__ieee754_jnl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
@@ -14,6 +16,7 @@ long double
 __ieee754_ynl (int n, long double x)
 {
   fputs ("__ieee754_ynl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_lgammal_r.c b/sysdeps/stub/e_lgammal_r.c
index 015511818c..d7fbbca4df 100644
--- a/sysdeps/stub/e_lgammal_r.c
+++ b/sysdeps/stub/e_lgammal_r.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_lgammal_r (long double x, int *signgamp)
 {
   fputs ("__ieee754_lgammal_r not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_log10l.c b/sysdeps/stub/e_log10l.c
index 0e8cdcaaa9..a414d04d74 100644
--- a/sysdeps/stub/e_log10l.c
+++ b/sysdeps/stub/e_log10l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_log10l (long double x)
 {
   fputs ("__ieee754_log10l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_logl.c b/sysdeps/stub/e_logl.c
index b8357543b0..45248a375a 100644
--- a/sysdeps/stub/e_logl.c
+++ b/sysdeps/stub/e_logl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_logl (long double x)
 {
   fputs ("__ieee754_logl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_powl.c b/sysdeps/stub/e_powl.c
index 2fa7862ea5..611dfb583c 100644
--- a/sysdeps/stub/e_powl.c
+++ b/sysdeps/stub/e_powl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_powl (long double x, long double y)
 {
   fputs ("__ieee754_powl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_rem_pio2l.c b/sysdeps/stub/e_rem_pio2l.c
index 0a9ac79917..eec7d793bb 100644
--- a/sysdeps/stub/e_rem_pio2l.c
+++ b/sysdeps/stub/e_rem_pio2l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_rem_pio2l (long double x, long double *y)
 {
   fputs ("__ieee754_rem_pio2l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/e_sqrtl.c b/sysdeps/stub/e_sqrtl.c
index 88a7668330..c583a27673 100644
--- a/sysdeps/stub/e_sqrtl.c
+++ b/sysdeps/stub/e_sqrtl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __ieee754_sqrtl (long double x)
 {
   fputs ("__ieee754_sqrtl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/k_cosl.c b/sysdeps/stub/k_cosl.c
index 3e6c9688f0..10016ab72e 100644
--- a/sysdeps/stub/k_cosl.c
+++ b/sysdeps/stub/k_cosl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __kernel_cosl (long double x, long double y)
 {
   fputs ("__kernel_cosl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/k_rem_pio2l.c b/sysdeps/stub/k_rem_pio2l.c
index a51c44546b..01bf158249 100644
--- a/sysdeps/stub/k_rem_pio2l.c
+++ b/sysdeps/stub/k_rem_pio2l.c
@@ -1,12 +1,14 @@
 #include <math.h>
 #include <math_private.h>
 #include <stdio.h>
+#include <errno.h>
 
 int
 __kernel_rem_pio2l (long double *x, long double *y, int e0, int nx, int prec,
 		    const int *ipio2)
 {
   fputs ("__kernel_rem_pio2l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/k_sinl.c b/sysdeps/stub/k_sinl.c
index 2057bf8bff..40cf22a596 100644
--- a/sysdeps/stub/k_sinl.c
+++ b/sysdeps/stub/k_sinl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __kernel_sinl (long double x, long double y)
 {
   fputs ("__kernel_sinl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/k_tanl.c b/sysdeps/stub/k_tanl.c
index 713c8cdfe6..95ffc23bd9 100644
--- a/sysdeps/stub/k_tanl.c
+++ b/sysdeps/stub/k_tanl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __kernel_tanl (long double x, long double y, int iy)
 {
   fputs ("__kernel_tanl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 
diff --git a/sysdeps/stub/s_atanl.c b/sysdeps/stub/s_atanl.c
index 38dd6f5991..2957d702d5 100644
--- a/sysdeps/stub/s_atanl.c
+++ b/sysdeps/stub/s_atanl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __atanl (long double x)
 {
   fputs ("__atanl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__atanl, atanl)
diff --git a/sysdeps/stub/s_erfl.c b/sysdeps/stub/s_erfl.c
index efcf490fa7..7ae25d6252 100644
--- a/sysdeps/stub/s_erfl.c
+++ b/sysdeps/stub/s_erfl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __erfl (long double x)
 {
   fputs ("__erfl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__erfl, erfl)
@@ -15,6 +17,7 @@ long double
 __erfcl (long double x)
 {
   fputs ("__erfcl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__erfcl, erfcl)
diff --git a/sysdeps/stub/s_exp2.c b/sysdeps/stub/s_exp2.c
index a3d0906a33..5adda4107a 100644
--- a/sysdeps/stub/s_exp2.c
+++ b/sysdeps/stub/s_exp2.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 double
 __exp2 (double x)
 {
   fputs ("__exp2 not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__exp2, exp2)
diff --git a/sysdeps/stub/s_exp2f.c b/sysdeps/stub/s_exp2f.c
index 5d6540e074..51b268c9e0 100644
--- a/sysdeps/stub/s_exp2f.c
+++ b/sysdeps/stub/s_exp2f.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 float
 __exp2f (float x)
 {
   fputs ("__exp2f not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__exp2f, exp2f)
diff --git a/sysdeps/stub/s_exp2l.c b/sysdeps/stub/s_exp2l.c
index 4c52fc904d..cab2cb2a69 100644
--- a/sysdeps/stub/s_exp2l.c
+++ b/sysdeps/stub/s_exp2l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __exp2l (long double x)
 {
   fputs ("__exp2l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__exp2l, exp2l)
diff --git a/sysdeps/stub/s_expm1l.c b/sysdeps/stub/s_expm1l.c
index fb8bda5eca..38798812ff 100644
--- a/sysdeps/stub/s_expm1l.c
+++ b/sysdeps/stub/s_expm1l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __expm1l (long double x)
 {
   fputs ("__expm1l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__expm1l, expm1l)
diff --git a/sysdeps/stub/s_log1pl.c b/sysdeps/stub/s_log1pl.c
index 07282482f3..9e51ce2d43 100644
--- a/sysdeps/stub/s_log1pl.c
+++ b/sysdeps/stub/s_log1pl.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __log1pl (long double x)
 {
   fputs ("__log1pl not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__log1pl, log1pl)
diff --git a/sysdeps/stub/s_log2l.c b/sysdeps/stub/s_log2l.c
index d8d86af995..cc09569422 100644
--- a/sysdeps/stub/s_log2l.c
+++ b/sysdeps/stub/s_log2l.c
@@ -1,10 +1,12 @@
 #include <math.h>
 #include <stdio.h>
+#include <errno.h>
 
 long double
 __log2l (long double x)
 {
   fputs ("__log2l not implemented\n", stderr);
+  __set_errno (ENOSYS);
   return 0.0;
 }
 weak_alias (__log2l, log2l)
diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist
index fc403871f3..ae79600717 100644
--- a/sysdeps/unix/sysv/linux/Dist
+++ b/sysdeps/unix/sysv/linux/Dist
@@ -10,6 +10,7 @@ net/ethernet.h
 net/if.h
 net/if_arp.h
 net/if_ppp.h
+net/if_slip.h
 net/ppp-comp.h
 net/ppp_defs.h
 net/route.h
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index c61904a3b8..7255a69ece 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -19,13 +19,15 @@ $(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/sys/syscal
 	echo > $(@:.d=.h).new \
 	     '/* Generated at libc build time from kernel syscall list.  */'
 	SUNPRO_DEPENDENCIES='$(@:.h=.d) $(patsubst $(objpfx)%,$$(objpfx)%,\
-			     $(@:.h=.d))' \
+						   $(@:.d=.h) $(@:.h=.d))' \
 	$(CC) -E -x c $< -D_LIBC -dM | \
 	sed -n >> $(@:.d=.h).new \
 	      's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p'
 	mv -f $(@:.d=.h).new $(@:.d=.h)
+ifndef no_deps
 # Get the generated list of dependencies (probably /usr/include/asm/unistd.h).
 -include $(objpfx)syscall-list.d
+endif
 generated += syscall-list.h syscall-list.d
 endif
 
@@ -35,7 +37,8 @@ endif
 
 ifeq ($(subdir),socket)
 sysdep_headers += sys/socketcall.h net/if.h net/if_ppp.h net/ppp-comp.h \
-		  net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h
+		  net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
+		  net/if_slip.h
 sysdep_routines += cmsg_nxthdr
 endif
 
@@ -61,3 +64,30 @@ endif
 
 # Don't compile the ctype glue code, since there is no old non-GNU C library.
 inhibit-glue = yes
+
+# Tell sysdeps/posix/Makefile that we create stdio_lim.h differently.
+inhibit-stdio_lim = yes
+
+$(common-objpfx)stdio_%.h $(common-objpfx)stdio_%.d: \
+ $(..)sysdeps/unix/sysv/linux/stdio_%.h.in
+	rm -f $(@:.h=.d) $(@:.d=.h)-t
+	echo '#include <linux/limits.h>' | \
+	SUNPRO_DEPENDENCIES='$(@:.h=.d) \
+			     $(patsubst $(common-objpfx)%,$$(common-objpfx)%,\
+					$(@:.d=.h) $(@:.h=.d))' \
+	$(CC) -E -dM - > $(@:.d=.h)-t
+	fopen_max=`sed -n 's/^#define OPEN_MAX //p' $(@:.d=.h)-t`; \
+	filename_max=`sed -n 's/^#define PATH_MAX //p' $(@:.d=.h)-t`; \
+	if test -n "$$fopen_max" && test -n "$$filename_max"; then \
+		sed -e "s/DEFAULT_FOPEN_MAX/$$fopen_max/" \
+		    -e "s/DEFAULT_FILENAME_MAX/$$filename_max/" $< \
+		    > $(@:.d=.h).new && \
+		mv -f $(@:.d=.h).new $(@:.d=.h); \
+	else exit 1; fi
+# Remove this last so that it can be examined if something went wrong.
+	rm -f $(@:.d=.h)-t
+ifndef no_deps
+# Get the list of dependencies (probably /usr/include/linux/limits.h).
+-include $(common-objpfx)stdio_lim.d
+endif
+common-generated += stdio_lim.h stdio_lim.d
diff --git a/sysdeps/unix/sysv/linux/arm/Dist b/sysdeps/unix/sysv/linux/arm/Dist
new file mode 100644
index 0000000000..738b9cc542
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/Dist
@@ -0,0 +1 @@
+clone.S
diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure
index a8780df917..79dbf16912 100644
--- a/sysdeps/unix/sysv/linux/configure
+++ b/sysdeps/unix/sysv/linux/configure
@@ -98,27 +98,3 @@ fi
 if test -f $srcdir/elf/ldconfig.c; then
   has_ldconfig=yes
 fi
-
-# Generate stdio_lim.h
-default_fopen_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FOPEN_MAX | cut -f2 -d':'`"
-default_filename_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FILENAME_MAX | cut -f2 -d':'`"
-# We double check if "default_fopen_max" and "default_filename_max" are
-# ok or not.
-if test "x$default_fopen_max" != "xOPEN_MAX" \
-	-a "x$default_filename_max" != "xPATH_MAX"
-then
-  sed -e "s/DEFAULT_FOPEN_MAX/$default_fopen_max/" \
-	-e "s/DEFAULT_FILENAME_MAX/$default_filename_max/" \
-	$srcdir/sysdeps/unix/sysv/linux/stdio_lim.h.in > stdio_lim.h.new
-  if test -r stdio_lim.h.new && cmp -s stdio_lim.h.new stdio_lim.h
-  then
-    echo stdio_lim.h unchanged
-    rm -f stdio_lim.h.new
-  else
-    mv -f stdio_lim.h.new stdio_lim.h
-  fi
-else
-  # We remove the old one if we cannot generate the new one during
-  # configure.
-  rm -f stdio_lim.h
-fi
diff --git a/sysdeps/unix/sysv/linux/configure.in b/sysdeps/unix/sysv/linux/configure.in
index f24af67f1e..18bb6dc469 100644
--- a/sysdeps/unix/sysv/linux/configure.in
+++ b/sysdeps/unix/sysv/linux/configure.in
@@ -83,27 +83,3 @@ fi
 if test -f $srcdir/elf/ldconfig.c; then
   has_ldconfig=yes
 fi
-
-# Generate stdio_lim.h
-default_fopen_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FOPEN_MAX | cut -f2 -d':'`"
-default_filename_max="`${CC-gcc} -E $srcdir/sysdeps/unix/sysv/linux/mk-stdiolim.c | grep DEFAULT_FILENAME_MAX | cut -f2 -d':'`"
-# We double check if "default_fopen_max" and "default_filename_max" are
-# ok or not.
-if test "x$default_fopen_max" != "xOPEN_MAX" \
-	-a "x$default_filename_max" != "xPATH_MAX"
-then
-  sed -e "s/DEFAULT_FOPEN_MAX/$default_fopen_max/" \
-	-e "s/DEFAULT_FILENAME_MAX/$default_filename_max/" \
-	$srcdir/sysdeps/unix/sysv/linux/stdio_lim.h.in > stdio_lim.h.new
-  if test -r stdio_lim.h.new && cmp -s stdio_lim.h.new stdio_lim.h
-  then
-    echo stdio_lim.h unchanged
-    rm -f stdio_lim.h.new
-  else
-    mv -f stdio_lim.h.new stdio_lim.h
-  fi
-else
-  # We remove the old one if we cannot generate the new one during
-  # configure.
-  rm -f stdio_lim.h
-fi
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.S b/sysdeps/unix/sysv/linux/i386/sysdep.S
index a686495818..5a615efecb 100644
--- a/sysdeps/unix/sysv/linux/i386/sysdep.S
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.S
@@ -25,15 +25,8 @@
    it somewhere else.
 
    ...and this place is here.  */
-	.bss
-	.globl errno
-	.type errno,@object
-	.size errno,4
-errno:	.zero 4
-	.globl _errno
-	.type _errno,@object
+	.comm errno,4,4
 _errno = errno	/* This name is expected by hj's libc.so.5 startup code.  */
-	.text
 
 /* The following code is only used in the shared library when we
    compile the reentrant version.  Otherwise each system call defines
diff --git a/sysdeps/unix/sysv/linux/mk-stdiolim.c b/sysdeps/unix/sysv/linux/mk-stdiolim.c
deleted file mode 100644
index 23295f007d..0000000000
--- a/sysdeps/unix/sysv/linux/mk-stdiolim.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <linux/limits.h>
-
-DEFAULT_FOPEN_MAX:OPEN_MAX
-DEFAULT_FILENAME_MAX:PATH_MAX
diff --git a/sysdeps/unix/sysv/linux/powerpc/Dist b/sysdeps/unix/sysv/linux/powerpc/Dist
index 27a951f169..4410266d71 100644
--- a/sysdeps/unix/sysv/linux/powerpc/Dist
+++ b/sysdeps/unix/sysv/linux/powerpc/Dist
@@ -4,3 +4,5 @@ termbits.h
 kernel_stat.h
 kernel_termios.h
 sys/kernel_termios.h
+init-first.h
+syscall.h
diff --git a/sysdeps/unix/sysv/linux/sparc/Dist b/sysdeps/unix/sysv/linux/sparc/Dist
index c31f140137..d93c648651 100644
--- a/sysdeps/unix/sysv/linux/sparc/Dist
+++ b/sysdeps/unix/sysv/linux/sparc/Dist
@@ -4,3 +4,4 @@ pipe.S
 fork.S
 kernel_stat.h
 kernel_sigaction.h
+init-first.h