summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog182
-rw-r--r--FAQ51
-rwxr-xr-xconfig.sub11
-rwxr-xr-xconfigure2
-rw-r--r--configure.in2
-rw-r--r--csu/Makefile4
-rw-r--r--elf/dl-deps.c241
-rw-r--r--elf/dl-load.c47
-rw-r--r--elf/dl-lookup.c11
-rw-r--r--elf/dl-runtime.c26
-rw-r--r--elf/dl-version.c15
-rw-r--r--elf/elf.h7
-rw-r--r--elf/rtld.c139
-rw-r--r--intl/finddomain.c6
-rw-r--r--intl/localealias.c2
-rw-r--r--libc.map2
-rw-r--r--libio/stdio.h82
-rw-r--r--locale/iso-4217.def333
-rw-r--r--locale/loadlocale.c2
-rw-r--r--manual/message.texi132
-rw-r--r--math/libm-test.c2
-rw-r--r--po/libc.pot828
-rw-r--r--posix/getopt_init.c14
-rw-r--r--posix/glob.c5
-rw-r--r--sysdeps/generic/dl-sysdep.c16
-rw-r--r--sysdeps/i386/dl-machine.h17
-rw-r--r--sysdeps/i386/fpu/bits/mathinline.h157
-rw-r--r--sysdeps/i386/fpu/fraiseexcpt.c23
-rw-r--r--sysdeps/powerpc/dl-machine.h2
-rwxr-xr-xsysdeps/sparc/configure4
-rw-r--r--sysdeps/sparc/configure.in6
-rw-r--r--sysdeps/sparc/fpu/bits/mathdef.h4
-rw-r--r--sysdeps/sparc/fpu/fraiseexcpt.c22
-rw-r--r--sysdeps/sparc/sparc32/Makefile4
-rw-r--r--sysdeps/sparc/sparc32/__longjmp.S43
-rw-r--r--sysdeps/sparc/sparc32/add_n.S294
-rw-r--r--sysdeps/sparc/sparc32/addmul_1.S50
-rw-r--r--sysdeps/sparc/sparc32/alloca.S3
-rw-r--r--sysdeps/sparc/sparc32/bsd-_setjmp.S41
-rw-r--r--sysdeps/sparc/sparc32/bsd-setjmp.S41
-rw-r--r--sysdeps/sparc/sparc32/divrem.m462
-rw-r--r--sysdeps/sparc/sparc32/dl-machine.h372
-rw-r--r--sysdeps/sparc/sparc32/dotmul.S10
-rw-r--r--sysdeps/sparc/sparc32/elf/start.S86
-rw-r--r--sysdeps/sparc/sparc32/elf/start.c68
-rw-r--r--sysdeps/sparc/sparc32/fpu/bits/fenv.h4
-rw-r--r--sysdeps/sparc/sparc32/fpu/fpu_control.h8
-rw-r--r--sysdeps/sparc/sparc32/lshift.S50
-rw-r--r--sysdeps/sparc/sparc32/mul_1.S50
-rw-r--r--sysdeps/sparc/sparc32/rem.S190
-rw-r--r--sysdeps/sparc/sparc32/rshift.S48
-rw-r--r--sysdeps/sparc/sparc32/sdiv.S190
-rw-r--r--sysdeps/sparc/sparc32/setjmp.S52
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/addmul_1.S85
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/dotmul.S13
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/mul_1.S76
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/rem.S18
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/sdiv.S14
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/submul_1.S14
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/udiv.S13
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S157
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/umul.S13
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/urem.S15
-rw-r--r--sysdeps/sparc/sparc32/sub_n.S406
-rw-r--r--sysdeps/sparc/sparc32/submul_1.S50
-rw-r--r--sysdeps/sparc/sparc32/udiv.S186
-rw-r--r--sysdeps/sparc/sparc32/udiv_qrnnd.S65
-rw-r--r--sysdeps/sparc/sparc32/umul.S26
-rw-r--r--sysdeps/sparc/sparc32/urem.S186
-rw-r--r--sysdeps/sparc/sparc64/dl-machine.h15
-rw-r--r--sysdeps/sparc/sparc64/fpu/fpu_control.h4
-rw-r--r--sysdeps/standalone/i386/i386.h10
-rw-r--r--sysdeps/standalone/i960/i960ca.h10
-rw-r--r--sysdeps/unix/sysv/linux/init-first.c4
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S21
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/getpagesize.c39
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h98
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h59
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h8
80 files changed, 3163 insertions, 2507 deletions
diff --git a/ChangeLog b/ChangeLog
index fc08e51511..11481cac4a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,181 @@
+1997-08-24 12:24 Ulrich Drepper <drepper@cygnus.com>
+
+ * configure.in (INSTALL): Quote `$'.
+
+ * libc.map: Add __xpg_basename.
+
+ * csu/Makefile (initfini.s): Disable optimization.
+
+ * elf/dl-deps.c: Implement handling of DL_FILTER.
+
+ * elf/dl-load.c (_dl_init_paths): Add error check.
+
+ * intl/finddomain.c (_nl_find_domain): Correct comment.
+ * intl/localealias.c: Include <bits/libc-lock.h> not <libc-lock.h>.
+
+ * libio/stdio.h: Make {,v}snprintf available if __USE_BSD.
+ Change extern inline functions to work correctly in C++.
+
+ * locale/iso-4217.def: Update for more recent ISO 4217 version.
+
+ * locale/loadlocale.c (_nl_load_locale): Add cast.
+
+ * manual/message.texi: Finish gettext section.
+
+ * posix/getopt_init.c: Don't use relative #include path.
+ (__getopt_clean_environment): Change function to take pointer to
+ environment as argument. Optimize generation of test string a bit.
+ * sysdeps/unix/sysv/linux/init-first.c: Call __getopt_clean_environment
+ with additional argument.
+
+ * poisx/glob.c: Add prototype for next_brace_sub.
+
+ * sysdeps/generic/dl-sysdep.c: Recognize AT_BASE value on auxiliary
+ vector.
+
+ * sysdeps/i386/dl-machine.h (elf_machine_load_address): Rewrite
+ to not generate relocation entry. Suggested by Richard Henderson.
+ (ELF_MACHINE_BEFORE_RTLD_RELOC): Removed.
+ (elf_machine_runtime_setup): Add .aligns.
+
+ * sysdeps/i386/fpu/fraiseexcpt.c: Add volatile to asms.
+
+ * sysdeps/i386/fpu/bits/mathinline.h: Partially undo change of
+ 1997-08-14 03:14. gcc 2.7.2* is really broken in some aspects.
+
+ * sysdeps/standalone/i386/i386.h: Clean up asm statements a bit.
+ * sysdeps/standalone/i960/i960ca.h: Likewise.
+
+1997-08-22 19:04 Richard Henderson <rth@cygnus.com>
+
+ * elf/rtld.c (_dl_start): Init _dl_rtld_map.l_opencount due to
+ undocumented test addition in _dl_map_object.
+
+ Support ET_EXEC versions of ld.so, for debugging at least:
+
+ * elf/dl-load.c (_dl_map_object): Add_name_to_object could get
+ called despite the DT_SONAME != NULL test, segfaulting. Simplify
+ the code here as well.
+ * elf/dl-lookup.c (do_lookup): Skip objects with no symtab.
+ (_dl_setup_hash): Likewise for hash tables.
+ * elf/dl-version.c (_dl_check_map_versions): Likewise for strtabs.
+ * elf/rtld.c (_dl_start): Likewise for rpath.
+ (_dl_rtld_libname2): New variable.
+ (dl_main): Use it to add an soname for ourselves when we don't have
+ one of our own. Base it on the target's .interp.
+ (dl_main): Again, skip printing of objects that don't have strtabs.
+
+ Sparc 32 merge:
+
+ * elf/dl-runtime.c (ELF_FIXUP_RETURN_VALUE): Provide default value.
+ (fixup): Simplify code. Use ELF_FIXUP_RETURN_VALUE.
+ (profile_fixup): Likewise, though this still needs fixing for
+ Sparc32 and PPC.
+ * sysdeps/powerpc/dl-machine.h: Transmute ELF_FIXUP_RETURNS_ADDRESS
+ to ELF_FIXUP_RETURN_VALUE.
+
+ * sysdeps/sparc/sparc32/dl-machine.h: Implement lazy relocation.
+ Fix up _dl_start_user to handle _dl_skip_args properly.
+ Use _dl_hwcap to determine if "flush" is available/needed.
+
+ * sysdeps/sparc/configure.in: Remove. It doesn't actually do
+ anything anymore, and what it did do is done somewhere else.
+ * sysdeps/sparc/configure: Likewise.
+
+ * sysdeps/sparc/fpu/bits/mathdef.h (FP_ILOGB0, FP_ILOGBNAN): New.
+
+ * sysdeps/sparc/fpu/fraiseexcpt.c: Rearrange for smaller code.
+
+ * sysdeps/sparc/sparc32/Makefile: Fix sparc->sparc/sparc32 bits
+ in divrem expansions.
+
+ * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h (END, LOC): New
+ definitions for assembly syntax differences.
+
+ * sysdeps/sparc/sparc32/__longjmp.S: %g6,%g7 are reserved to the
+ "system". Use %g2,%g3 instead. Use new local label macro.
+ * sysdeps/sparc/sparc32/add_n.S: Use <sysdep.h> and ENTRY, END,
+ and LOC for proper assembly headers/footers.
+ * sysdeps/sparc/sparc32/addmul_1.S: Likewise.
+ * sysdeps/sparc/sparc32/alloca.S: Likewise.
+ * sysdeps/sparc/sparc32/dotmul.S: Likewise.
+ * sysdeps/sparc/sparc32/lshift.S: Likewise.
+ * sysdeps/sparc/sparc32/mul_1.S: Likewise.
+ * sysdeps/sparc/sparc32/rshift.S: Likewise.
+ * sysdeps/sparc/sparc32/sparcv8/addmul_1.S: Likewise.
+ * sysdeps/sparc/sparc32/sparcv8/mul_1.S: Likewise.
+ * sysdeps/sparc/sparc32/sparcv8/submul_1.S: Likewise.
+ * sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S: Likewise.
+ * sysdeps/sparc/sparc32/sub_n.S: Likewise.
+ * sysdeps/sparc/sparc32/submul_1.S: Likewise.
+ * sysdeps/sparc/sparc32/udiv_qrnnd.S: Likewise.
+ * sysdeps/sparc/sparc32/umul.S: Likewise.
+ * sysdeps/sparc/sparc32/divrem.m4: Likewise.
+ * sysdeps/sparc/sparc32/rem.S: Regenerate.
+ * sysdeps/sparc/sparc32/sdiv.S: Regenerate.
+ * sysdeps/sparc/sparc32/udiv.S: Regenerate.
+ * sysdeps/sparc/sparc32/urem.S: Regenerate.
+
+ * sysdeps/sparc/sparc32/sparcv8/dotmul.S: New file.
+ * sysdeps/sparc/sparc32/sparcv8/rem.S: New file.
+ * sysdeps/sparc/sparc32/sparcv8/sdiv.S: New file.
+ * sysdeps/sparc/sparc32/sparcv8/udiv.S: New file.
+ * sysdeps/sparc/sparc32/sparcv8/umul.S: New file.
+ * sysdeps/sparc/sparc32/sparcv8/urem.S: New file.
+
+ * sysdeps/sparc/sparc32/bsd-_setjmp.S: Dike out.
+ * sysdeps/sparc/sparc32/bsd-setjmp.S: Likewise.
+ * sysdeps/sparc/sparc32/setjmp.S: Add _setjmp and setjmp entry points.
+
+ * sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S:
+ Clean up PIC code.
+
+ * sysdeps/sparc/sparc32/elf/start.S: New file, slightly modified
+ from the sparc64 version.
+ * sysdeps/sparc/sparc32/elf/start.c: Removed.
+
+ * sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h: Rewrite in
+ assembly based on the sparc64 version.
+
+ * sysdeps/sparc/sparc32/fpu/bits/fenv.h: Duh. Use proper syntax
+ for manipulating %fsr.
+ * sysdeps/sparc/sparc32/fpu/fpu_control.h: Make IEEE conformance
+ be the default.
+
+ * elf/elf.h (HWCAP_SPARC_*): New definitions.
+ * elf/rtld.c (_dl_hwcap): New variable.
+ * sysdeps/generic/dl-sysdep.c (_dl_sysdep_start): Record AT_HWCAP.
+
+ * sysdeps/unix/sysv/linux/sparc/sparc32/getpagesize.c: New file.
+ Attempt to get hold of the page size based on what we might have
+ been told at startup time in _dl_pagesize. This will be obsolete
+ when I finish the kernel hooks for a proper sysconf(), stay tuned.
+
+ Sparc 64 merge:
+
+ * sysdeps/sparc/sparc64/dl-machine.h (ELF_FIXUP_RETURN_VALUE): New.
+ Figure out the right thing to return based on the .plt format.
+
+ * sysdeps/sparc/sparc64/fpu/fpu_control.h: Update comment.
+
+ * sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h (__dev_t):
+ Should have been 64-bits wide.
+
+ * sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h: sll->sllx,
+ optimize for branch delay slot usage.
+
+1997-08-22 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * csu/Makefile ($(objpfx)crt%.o): Fix a missing *.so -> *.os
+ change.
+
+1997-08-20 Andreas Jaeger <aj@arthur.rhein-neckar.de>
+
+ * math/libm-test.c (identities): Change epsilon.
+
+ * sysdeps/i386/fpu/bits/mathinline.h: Correct arguments to fabs,
+ fabsf, fabsl, __fabsl.
+
1997-08-20 05:30 Ulrich Drepper <drepper@cygnus.com>
* catgets/catgets.c (catclose): Use __munmap instead of munmap.
@@ -120,10 +298,10 @@
* sysdeps/libm-i387/e_remainder.S: Pretty print.
* sysdeps/libm-i387/e_remainderf.S: Likewise.
- * sysdeps/libm-i387/e_remainderl.S: Pop extra value for FPU stack.
+ * sysdeps/libm-i387/e_remainderl.S: Pop extra value from FPU stack.
* sysdeps/libm-i387/s_cexp.S: Little optimization.
* sysdeps/libm-i387/s_cexpl.S: Likewise.
- * sysdep/libm-ieee754/s_csinhl.c: Include <fenv.h>.
+ * sysdeps/libm-ieee754/s_csinhl.c: Include <fenv.h>.
1997-08-18 15:21 Ulrich Drepper <drepper@cygnus.com>
diff --git a/FAQ b/FAQ
index df2686e243..d4af13b05b 100644
--- a/FAQ
+++ b/FAQ
@@ -565,7 +565,7 @@ by
in the above example specs file to make it work for other systems.
-Version 2.7.2.2 does and future versions of GCC will automatically
+Version 2.7.2.3 does and future versions of GCC will automatically
provide the correct specs.
@@ -595,13 +595,9 @@ GROUP ( libc.so.6 ld-linux.so.2 libc.a )
any other system I saw. This is a bug, isn't it?''
[A18] {UD} No, this is no bug. This version of the GNU libc already
-follows the to-be-released POSIX.1g standard. In this standard
-the type `size_t' is used for all parameters which describe a size.
-So better change now.
-
-This change is critical for system which have
- sizeof (int) != sizeof (size_t)
-like the Alpha.
+follows the Single Unix specifications (and I think the POSIX.1g
+draft which adopted the solution). The type for parameter describing
+a size is now `socklen_t', a new type.
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@@ -617,28 +613,9 @@ invalid. I.e., an emulated FPU is for the libc as good as a real one.
[Q20] ``How can I compile gcc 2.7.2.1 from the gcc source code using
glibc 2.x?
-[A20] {AJ} There's only support for glibc 2.0 in gcc 2.7.2.2 or later.
-
-gcc 2.7.2.2 has also a nasty bug. It installs its own version of
-assert.h into /usr/<machine>/include that is not compatible with
-glibc. Please remove this file - otherwise you get lots of problems
-with configure.
-
-For 2.7.2.2 you should also use the following patch and configure for
-e.g. i486-linux.
------------------------------------------------------------------------
---- configure Tue Feb 11 15:57:17 1997
-+++ configure Wed Feb 12 23:09:29 1997
-@@ -1021,7 +1021,7 @@
- gnu_ld=yes
- # GNU libc version 2 does not supply these;
- # we want them from GCC.
-- extra_parts="crtbegin.o crtend.o"
-+ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
- ;;
- i[3456]86-go32-msdos | i[3456]86-*-go32)
- cpu_type=i386
------------------------------------------------------------------------
+[A20] {AJ} There's only correct support for glibc 2.0.x in gcc 2.7.2.3
+or later. You should get at least gcc 2.7.2.3. All previous versions
+had problems with glibc support.
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@@ -698,13 +675,13 @@ very beginning and if it is not usable `configure' will bark.
[Q24] ``I have set up /etc/nis.conf, and the Linux libc 5 with NYS
works great. But the glibc NIS+ doesn't seem to work.''
-[A24] The glibc NIS+ implementation uses a /var/nis/NIS_COLD_START
- file for storing information about the NIS+ server and their
- public keys, because the nis.conf file do not contain all
- necessary information. You have to copy a NIS_COLD_START file
- from a Solaris client (the NIS_COLD_START file is byte order
- independend) or generate it new with nisinit from the nis-tools
- (look at http://www-vt.uni-paderborn.de/~kukuk/linux/nisplus.html).
+[A24] The glibc NIS+ implementation uses a /var/nis/NIS_COLD_START
+file for storing information about the NIS+ server and their public
+keys, because the nis.conf file do not contain all necessary
+information. You have to copy a NIS_COLD_START file from a Solaris
+client (the NIS_COLD_START file is byte order independend) or generate
+it new with nisinit from the nis-tools (look at
+http://www-vt.uni-paderborn.de/~kukuk/linux/nisplus.html).
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
diff --git a/config.sub b/config.sub
index eb4fca1a84..0ac2ca1bee 100755
--- a/config.sub
+++ b/config.sub
@@ -155,6 +155,7 @@ case $basic_machine in
| alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
| i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
| mips64 | mipsel | mips64el | mips64orion | mips64orionel \
+ | mipstx39 | mipstx39el \
| sparc | sparclet | sparclite | sparc64)
basic_machine=$basic_machine-unknown
;;
@@ -179,7 +180,9 @@ case $basic_machine in
| ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
| sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
| sparc64-* | mips64-* | mipsel-* \
- | mips64el-* | mips64orion-* | mips64orionel-* | f301-*)
+ | mips64el-* | mips64orion-* | mips64orionel-* \
+ | mipstx39-* | mipstx39el-* \
+ | f301-*)
;;
# Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS.
@@ -568,6 +571,12 @@ case $basic_machine in
basic_machine=i386-sequent
os=-dynix
;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
tower | tower-32)
basic_machine=m68k-ncr
;;
diff --git a/configure b/configure
index cd07ec9b8f..1e18d28155 100755
--- a/configure
+++ b/configure
@@ -1091,7 +1091,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
if test "$INSTALL" = "${srcdir}/install-sh -c"; then
# The makefiles need to use a different form to find it in $srcdir.
- INSTALL='$(..)./install-sh -c'
+ INSTALL='\$(..)./install-sh -c'
fi
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
echo "configure:1098: checking whether ln -s works" >&5
diff --git a/configure.in b/configure.in
index 481a1e3003..b1e1bf7d12 100644
--- a/configure.in
+++ b/configure.in
@@ -371,7 +371,7 @@ AC_MSG_RESULT(sysdeps/generic sysdeps/stub)
AC_PROG_INSTALL
if test "$INSTALL" = "${srcdir}/install-sh -c"; then
# The makefiles need to use a different form to find it in $srcdir.
- INSTALL='$(..)./install-sh -c'
+ INSTALL='\$(..)./install-sh -c'
fi
AC_PROG_LN_S
AC_CHECK_PROGS(MSGFMT, msgfmt gmsgfmt, :)
diff --git a/csu/Makefile b/csu/Makefile
index 6c8c87723b..993053fb33 100644
--- a/csu/Makefile
+++ b/csu/Makefile
@@ -59,10 +59,10 @@ omit-deps += $(crtstuff)
# Special rules for the building of crti.o and crtn.o
$(objpfx)crt%.o: $(objpfx)crt%.S $(objpfx)defs.h
- $(compile.S) -g0 $(ASFLAGS-.so) -o $@
+ $(compile.S) -g0 $(ASFLAGS-.os) -o $@
$(objpfx)initfini.s: initfini.c
- $(compile.c) -g0 -S -fPIC -finhibit-size-directive \
+ $(compile.c) -O0 -g0 -S -fPIC -finhibit-size-directive \
$(no-exceptions) -o $@
# We only have one kind of startup code files. Static binaries and
diff --git a/elf/dl-deps.c b/elf/dl-deps.c
index 3fbb3dbf92..38db7677b0 100644
--- a/elf/dl-deps.c
+++ b/elf/dl-deps.c
@@ -28,6 +28,10 @@
is signaled by the AUXTAG entry in l_info. */
#define AUXTAG (DT_NUM + DT_PROCNUM + DT_VERSIONTAGNUM \
+ DT_EXTRATAGIDX (DT_AUXILIARY))
+/* Whether an shared object references one or more auxiliary objects
+ is signaled by the AUXTAG entry in l_info. */
+#define FILTERTAG (DT_NUM + DT_PROCNUM + DT_VERSIONTAGNUM \
+ + DT_EXTRATAGIDX (DT_FILTER))
/* When loading auxiliary objects we must ignore errors. It's ok if
@@ -138,7 +142,7 @@ _dl_map_object_deps (struct link_map *map,
{
struct link_map *l = runp->map;
- if (l->l_info[AUXTAG] || l->l_info[DT_NEEDED])
+ if (l->l_info[AUXTAG] || l->l_info[FILTERTAG] || l->l_info[DT_NEEDED])
{
const char *strtab = ((void *) l->l_addr
+ l->l_info[DT_STRTAB]->d_un.d_ptr);
@@ -190,119 +194,87 @@ _dl_map_object_deps (struct link_map *map,
dep->l_reserved = 1;
}
}
- else if (d->d_tag == DT_AUXILIARY)
+ else if (d->d_tag == DT_AUXILIARY || d->d_tag == DT_FILTER)
{
char *errstring;
const char *objname;
+ struct list *newp;
- /* Store the tag in the argument structure. */
- args.d = d;
-
- if (_dl_catch_error (&errstring, &objname, openaux, &args))
+ if (d->d_tag == DT_AUXILIARY)
{
- /* We are not interested in the error message. */
- assert (errstring != NULL);
- free (errstring);
+ /* Store the tag in the argument structure. */
+ args.d = d;
+
+ /* We must be prepared that the addressed shared
+ object is not available. */
+ if (_dl_catch_error (&errstring, &objname, openaux, &args))
+ {
+ /* We are not interested in the error message. */
+ assert (errstring != NULL);
+ free (errstring);
+
+ /* Simply ignore this error and continue the work. */
+ continue;
+ }
}
else
+ /* For filter objects the dependency must be available. */
+ args.aux = _dl_map_object (l, strtab + d->d_un.d_val,
+ (l->l_type == lt_executable
+ ? lt_library : l->l_type),
+ trace_mode);
+
+ /* The auxiliary object is actually available.
+ Incorporate the map in all the lists. */
+
+ /* Allocate new entry. This always has to be done. */
+ newp = alloca (sizeof (struct list));
+
+ /* Copy the content of the current entry over. */
+ memcpy (newp, orig, sizeof (*newp));
+
+ /* Initialize new entry. */
+ orig->done = 0;
+ orig->map = args.aux;
+ orig->dup = newp;
+
+ /* We must handle two situations here: the map is new,
+ so we must add it in all three lists. If the map
+ is already known, we have two further possibilities:
+ - if the object is before the current map in the
+ search list, we do nothing. It is already found
+ early
+ - if the object is after the current one, we must
+ move it just before the current map to make sure
+ the symbols are found early enough
+ */
+ if (args.aux->l_reserved)
{
- /* The auxiliary object is actually available.
- Incorporate the map in all the lists. */
-
- /* Allocate new entry. This always has to be done. */
- struct list *newp = alloca (sizeof (struct list));
-
- /* Copy the content of the current entry over. */
- memcpy (newp, orig, sizeof (*newp));
-
- /* Initialize new entry. */
- orig->done = 0;
- orig->map = args.aux;
- orig->dup = newp;
-
- /* We must handle two situations here: the map is new,
- so we must add it in all three lists. If the map
- is already known, we have two further possibilities:
- - if the object is before the current map in the
- search list, we do nothing. It is already found
- early
- - if the object is after the current one, we must
- move it just before the current map to make sure
- the symbols are found early enough
- */
- if (args.aux->l_reserved)
- {
- /* The object is already somewhere in the
- list. Locate it first. */
- struct list *late;
-
- /* This object is already in the search list
- we are building. Don't add a duplicate
- pointer. Release the reference just added
- by _dl_map_object. */
- --args.aux->l_opencount;
-
- for (late = orig; late->unique; late = late->unique)
- if (late->unique->map == args.aux)
- break;
-
- if (late->unique)
- {
- /* The object is somewhere behind the current
- position in the search path. We have to
- move it to this earlier position. */
- orig->unique = newp;
-
- /* Now remove the later entry from the unique
- list. */
- late->unique = late->unique->unique;
-
- /* We must move the earlier in the chain. */
- if (args.aux->l_prev)
- args.aux->l_prev->l_next = args.aux->l_next;
- if (args.aux->l_next)
- args.aux->l_next->l_prev = args.aux->l_prev;
-
- args.aux->l_prev = newp->map->l_prev;
- newp->map->l_prev = args.aux;
- if (args.aux->l_prev != NULL)
- args.aux->l_prev->l_next = args.aux;
- args.aux->l_next = newp->map;
- }
- else
- {
- /* The object must be somewhere earlier in
- the list. That's good, we only have to
- insert an entry for the duplicate list. */
- orig->unique = NULL; /* Never used. */
-
- /* Now we have a problem. The element pointing
- to ORIG in the unique list must point to
- NEWP now. This is the only place where we
- need this backreference and this situation
- is really not that frequent. So we don't
- use a double-linked list but instead search
- for the preceding element. */
- late = head;
- while (late->unique != orig)
- late = late->unique;
- late->unique = newp;
- }
- }
- else
+ /* The object is already somewhere in the list.
+ Locate it first. */
+ struct list *late;
+
+ /* This object is already in the search list we
+ are building. Don't add a duplicate pointer.
+ Release the reference just added by
+ _dl_map_object. */
+ --args.aux->l_opencount;
+
+ for (late = orig; late->unique; late = late->unique)
+ if (late->unique->map == args.aux)
+ break;
+
+ if (late->unique)
{
- /* This is easy. We just add the symbol right
- here. */
+ /* The object is somewhere behind the current
+ position in the search path. We have to
+ move it to this earlier position. */
orig->unique = newp;
- ++nlist;
- /* Set the mark bit that says it's already in
- the list. */
- args.aux->l_reserved = 1;
-
- /* The only problem is that in the double linked
- list of all objects we don't have this new
- object at the correct place. Correct this
- here. */
+
+ /* Now remove the later entry from the unique list. */
+ late->unique = late->unique->unique;
+
+ /* We must move the earlier in the chain. */
if (args.aux->l_prev)
args.aux->l_prev->l_next = args.aux->l_next;
if (args.aux->l_next)
@@ -314,19 +286,60 @@ _dl_map_object_deps (struct link_map *map,
args.aux->l_prev->l_next = args.aux;
args.aux->l_next = newp->map;
}
+ else
+ {
+ /* The object must be somewhere earlier in the
+ list. That's good, we only have to insert
+ an entry for the duplicate list. */
+ orig->unique = NULL; /* Never used. */
+
+ /* Now we have a problem. The element
+ pointing to ORIG in the unique list must
+ point to NEWP now. This is the only place
+ where we need this backreference and this
+ situation is really not that frequent. So
+ we don't use a double-linked list but
+ instead search for the preceding element. */
+ late = head;
+ while (late->unique != orig)
+ late = late->unique;
+ late->unique = newp;
+ }
+ }
+ else
+ {
+ /* This is easy. We just add the symbol right here. */
+ orig->unique = newp;
+ ++nlist;
+ /* Set the mark bit that says it's already in the list. */
+ args.aux->l_reserved = 1;
+
+ /* The only problem is that in the double linked
+ list of all objects we don't have this new
+ object at the correct place. Correct this here. */
+ if (args.aux->l_prev)
+ args.aux->l_prev->l_next = args.aux->l_next;
+ if (args.aux->l_next)
+ args.aux->l_next->l_prev = args.aux->l_prev;
+
+ args.aux->l_prev = newp->map->l_prev;
+ newp->map->l_prev = args.aux;
+ if (args.aux->l_prev != NULL)
+ args.aux->l_prev->l_next = args.aux;
+ args.aux->l_next = newp->map;
+ }
- /* Move the tail pointers if necessary. */
- if (orig == utail)
- utail = newp;
- if (orig == dtail)
- dtail = newp;
+ /* Move the tail pointers if necessary. */
+ if (orig == utail)
+ utail = newp;
+ if (orig == dtail)
+ dtail = newp;
- /* Move on the insert point. */
- orig = newp;
+ /* Move on the insert point. */
+ orig = newp;
- /* We always add an entry to the duplicate list. */
- ++nduplist;
- }
+ /* We always add an entry to the duplicate list. */
+ ++nduplist;
}
}
else
diff --git a/elf/dl-load.c b/elf/dl-load.c
index ce3bd9fb94..9a6aae6a93 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -406,6 +406,9 @@ _dl_init_paths (void)
{
fake_path_list = (struct r_search_path_elem **)
malloc ((nllp + 1) * sizeof (struct r_search_path_elem *));
+ if (fake_path_list == NULL)
+ _dl_signal_error (ENOMEM, NULL,
+ "cannot create cache for search path");
(void) fillin_rpath (local_strdup (llp), fake_path_list, ":;",
__libc_enable_secure ? trusted_dirs : NULL);
@@ -901,23 +904,33 @@ _dl_map_object (struct link_map *loader, const char *name, int type,
/* Look for this name among those already loaded. */
for (l = _dl_loaded; l; l = l->l_next)
- if (l->l_opencount > 0 && _dl_name_match_p (name, l) ||
- /* If the requested name matches the soname of a loaded object,
- use that object. */
- (l->l_info[DT_SONAME] &&
- ! strcmp (name, (const char *) (l->l_addr +
- l->l_info[DT_STRTAB]->d_un.d_ptr +
- l->l_info[DT_SONAME]->d_un.d_val))))
- {
- /* The object is already loaded.
- Just bump its reference count and return it. */
- const char *soname = (const char *) (l->l_addr +
- l->l_info[DT_STRTAB]->d_un.d_ptr +
- l->l_info[DT_SONAME]->d_un.d_val);
- add_name_to_object (l, local_strdup (soname));
- ++l->l_opencount;
- return l;
- }
+ {
+ /* If the requested name matches the soname of a loaded object,
+ use that object. Elide this check for names that have not
+ yet been opened. */
+ if (l->l_opencount <= 0)
+ continue;
+ if (!_dl_name_match_p (name, l))
+ {
+ const char *soname;
+
+ if (l->l_info[DT_SONAME] == NULL)
+ continue;
+
+ soname = (const char *) (l->l_addr
+ + l->l_info[DT_STRTAB]->d_un.d_ptr
+ + l->l_info[DT_SONAME]->d_un.d_val);
+ if (strcmp (name, soname) != 0)
+ continue;
+
+ /* We have a match on a new name -- cache it. */
+ add_name_to_object (l, local_strdup (soname));
+ }
+
+ /* We have a match -- bump the reference count and return it. */
+ ++l->l_opencount;
+ return l;
+ }
if (strchr (name, '/') == NULL)
{
diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
index 4cc1f2d468..c3a67ffcc6 100644
--- a/elf/dl-lookup.c
+++ b/elf/dl-lookup.c
@@ -93,6 +93,10 @@ do_lookup (const char *undef_name, unsigned long int hash,
map->l_type == lt_executable)
continue;
+ /* Skip objects without symbol tables. */
+ if (map->l_info[DT_SYMTAB] == NULL)
+ continue;
+
symtab = ((void *) map->l_addr + map->l_info[DT_SYMTAB]->d_un.d_ptr);
strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr);
if (map->l_nversions > 0 && map->l_info[VERSTAG (DT_VERSYM)] != NULL)
@@ -364,8 +368,13 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
void
_dl_setup_hash (struct link_map *map)
{
- ElfW(Symndx) *hash = (void *)(map->l_addr + map->l_info[DT_HASH]->d_un.d_ptr);
+ ElfW(Symndx) *hash;
ElfW(Symndx) nchain;
+
+ if (!map->l_info[DT_HASH])
+ return;
+ hash = (void *)(map->l_addr + map->l_info[DT_HASH]->d_un.d_ptr);
+
map->l_nbuckets = *hash++;
nchain = *hash++;
map->l_buckets = hash;
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
index 8ee1838df9..46c0e1b8ab 100644
--- a/elf/dl-runtime.c
+++ b/elf/dl-runtime.c
@@ -87,6 +87,10 @@ _dl_object_relocation_scope (struct link_map *l)
# define VERSYMIDX(sym) (DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (sym))
#endif
+#ifndef ELF_FIXUP_RETURN_VALUE
+#define ELF_FIXUP_RETURN_VALUE(map, result) (result)
+#endif
+
/* We need to define the function as a local symbol so that the reference
in the trampoline code will be a local PC-relative call. Tell the
compiler not to worry that the function appears not to be called. */
@@ -120,6 +124,7 @@ fixup (
const PLTREL *const reloc
= (const void *) (l->l_addr + l->l_info[DT_JMPREL]->d_un.d_ptr +
reloc_offset);
+ ElfW(Addr) *const rel_addr = (ElfW(Addr) *)(l->l_addr + reloc->r_offset);
/* Set up the scope to find symbols referenced by this object. */
struct link_map **scope = _dl_object_relocation_scope (l);
@@ -144,21 +149,17 @@ fixup (
elf_machine_relplt (l, reloc, &symtab[ELFW(R_SYM) (reloc->r_info)],
&l->l_versions[ndx],
- (void *) (l->l_addr + reloc->r_offset));
+ (void *) rel_addr);
}
else
elf_machine_relplt (l, reloc, &symtab[ELFW(R_SYM) (reloc->r_info)],
- NULL, (void *) (l->l_addr + reloc->r_offset));
+ NULL, (void *) rel_addr);
}
*_dl_global_scope_end = NULL;
/* Return the address that was written by the relocation. */
-#ifdef ELF_FIXUP_RETURNS_ADDRESS
- return (ElfW(Addr))(l->l_addr + reloc->r_offset);
-#else
- return *(ElfW(Addr) *) (l->l_addr + reloc->r_offset);
-#endif
+ return ELF_FIXUP_RETURN_VALUE(l, *rel_addr);
}
@@ -219,17 +220,10 @@ profile_fixup (
}
*_dl_global_scope_end = NULL;
-
- /* Return the address that was written by the relocation. */
-#ifdef ELF_FIXUP_RETURNS_ADDRESS
(*mcount_fct) (retaddr, result);
- return &result; /* XXX This cannot work. What to do??? --drepper */
-#else
- (*mcount_fct) (retaddr, result);
-
- return result;
-#endif
+ /* Return the address that was written by the relocation. */
+ return ELF_FIXUP_RETURN_VALUE(l, result);
}
#endif
diff --git a/elf/dl-version.c b/elf/dl-version.c
index 0675b1c8ec..b5515c86e0 100644
--- a/elf/dl-version.c
+++ b/elf/dl-version.c
@@ -155,16 +155,23 @@ int
_dl_check_map_versions (struct link_map *map, int verbose)
{
int result = 0;
- const char *strtab = (const char *) (map->l_addr
- + map->l_info[DT_STRTAB]->d_un.d_ptr);
+ const char *strtab;
/* Pointer to section with needed versions. */
- ElfW(Dyn) *dyn = map->l_info[VERSTAG (DT_VERNEED)];
+ ElfW(Dyn) *dyn;
/* Pointer to dynamic section with definitions. */
- ElfW(Dyn) *def = map->l_info[VERSTAG (DT_VERDEF)];
+ ElfW(Dyn) *def;
/* We need to find out which is the highest version index used
in a dependecy. */
unsigned int ndx_high = 0;
+ /* If we don't have a string table, we must be ok. */
+ if (map->l_info[DT_STRTAB] == NULL)
+ return 0;
+ strtab = (const char *) (map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr);
+
+ dyn = map->l_info[VERSTAG (DT_VERNEED)];
+ def = map->l_info[VERSTAG (DT_VERDEF)];
+
if (dyn != NULL)
{
/* This file requires special versions from its dependencies. */
diff --git a/elf/elf.h b/elf/elf.h
index e78bcb5102..cf8403b2cd 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -783,6 +783,13 @@ typedef struct
#define DT_SPARC_PLTFMT 0x70000001 /* .plt format version/type */
#define DT_SPARC_NUM 2
+/* Bits present in AT_HWCAP, primarily for Sparc32. */
+
+#define HWCAP_SPARC_FLUSH 1 /* The cpu supports flush insn. */
+#define HWCAP_SPARC_STBAR 2
+#define HWCAP_SPARC_SWAP 4
+#define HWCAP_SPARC_MULDIV 8
+
/* MIPS R3000 specific definitions. */
/* Legal values for e_flags field of Elf32_Ehdr. */
diff --git a/elf/rtld.c b/elf/rtld.c
index c3d81e198f..60a102a85c 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -53,13 +53,13 @@ static void print_unresolved (int errcode, const char *objname,
static void print_missing_version (int errcode, const char *objname,
const char *errsting);
-
int _dl_argc;
char **_dl_argv;
const char *_dl_rpath;
int _dl_verbose;
const char *_dl_platform;
size_t _dl_platformlen;
+unsigned long _dl_hwcap;
struct r_search_path *_dl_search_paths;
const char *_dl_profile;
const char *_dl_profile_output;
@@ -80,6 +80,7 @@ static void dl_main (const ElfW(Phdr) *phdr,
struct link_map _dl_rtld_map;
struct libname_list _dl_rtld_libname;
+struct libname_list _dl_rtld_libname2;
#ifdef RTLD_START
RTLD_START
@@ -119,19 +120,22 @@ _dl_start (void *arg)
the operating system's program loader where to find the program
header table in core. */
-
/* Transfer data about ourselves to the permanent link_map structure. */
_dl_rtld_map.l_addr = bootstrap_map.l_addr;
_dl_rtld_map.l_ld = bootstrap_map.l_ld;
+ _dl_rtld_map.l_opencount = 1;
memcpy (_dl_rtld_map.l_info, bootstrap_map.l_info,
sizeof _dl_rtld_map.l_info);
_dl_setup_hash (&_dl_rtld_map);
/* Cache the DT_RPATH stored in ld.so itself; this will be
the default search path. */
- _dl_rpath = (void *) (_dl_rtld_map.l_addr +
- _dl_rtld_map.l_info[DT_STRTAB]->d_un.d_ptr +
- _dl_rtld_map.l_info[DT_RPATH]->d_un.d_val);
+ if (_dl_rtld_map.l_info[DT_STRTAB] && _dl_rtld_map.l_info[DT_RPATH])
+ {
+ _dl_rpath = (void *) (_dl_rtld_map.l_addr +
+ _dl_rtld_map.l_info[DT_STRTAB]->d_un.d_ptr +
+ _dl_rtld_map.l_info[DT_RPATH]->d_un.d_val);
+ }
/* Call the OS-dependent function to set up life so we can do things like
file access. It will call `dl_main' (below) to do all the real work
@@ -416,6 +420,23 @@ of this helper program; chances are you did not intend to run this program.\n",
_dl_rtld_libname.name = (const char *) main_map->l_addr + ph->p_vaddr;
_dl_rtld_libname.next = NULL;
_dl_rtld_map.l_libname = &_dl_rtld_libname;
+
+ /* Ordinarilly, we would get additional names for the loader from
+ our DT_SONAME. This can't happen if we were actually linked as
+ a static executable (detect this case when we have no DYNAMIC).
+ If so, assume the filename component of the interpreter path to
+ be our SONAME, and add it to our name list. */
+ if (_dl_rtld_map.l_ld == NULL)
+ {
+ char *p = strrchr (_dl_rtld_libname.name, '/');
+ if (p)
+ {
+ _dl_rtld_libname2.name = p+1;
+ _dl_rtld_libname2.next = NULL;
+ _dl_rtld_libname.next = &_dl_rtld_libname2;
+ }
+ }
+
has_interp = 1;
break;
}
@@ -696,74 +717,70 @@ of this helper program; chances are you did not intend to run this program.\n",
for (map = _dl_loaded; map != NULL; map = map->l_next)
{
- const char *strtab =
- (const char *) (map->l_addr
- + map->l_info[DT_STRTAB]->d_un.d_ptr);
+ const char *strtab;
ElfW(Dyn) *dyn = map->l_info[VERNEEDTAG];
+ ElfW(Verneed) *ent;
+
+ if (dyn == NULL)
+ continue;
+
+ strtab = (const char *)
+ (map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr);
+ ent = (ElfW(Verneed) *) (map->l_addr + dyn->d_un.d_ptr);
- if (dyn != NULL)
+ if (first)
{
- ElfW(Verneed) *ent =
- (ElfW(Verneed) *) (map->l_addr + dyn->d_un.d_ptr);
+ _dl_sysdep_message ("\n\tVersion information:\n", NULL);
+ first = 0;
+ }
- if (first)
- {
- _dl_sysdep_message ("\n\tVersion information:\n",
- NULL);
- first = 0;
- }
+ _dl_sysdep_message ("\t", (map->l_name[0]
+ ? map->l_name : _dl_argv[0]),
+ ":\n", NULL);
+
+ while (1)
+ {
+ ElfW(Vernaux) *aux;
+ struct link_map *needed;
- _dl_sysdep_message ("\t", (map->l_name[0]
- ? map->l_name
- : _dl_argv[0]), ":\n",
- NULL);
+ needed = find_needed (strtab + ent->vn_file);
+ aux = (ElfW(Vernaux) *) ((char *) ent + ent->vn_aux);
while (1)
{
- ElfW(Vernaux) *aux;
- struct link_map *needed;
-
- needed = find_needed (strtab + ent->vn_file);
- aux = (ElfW(Vernaux) *) ((char *) ent + ent->vn_aux);
-
- while (1)
- {
- const char *fname = NULL;
-
- _dl_sysdep_message ("\t\t",
- strtab + ent->vn_file,
- " (", strtab + aux->vna_name,
- ") ",
- (aux->vna_flags
- & VER_FLG_WEAK
- ? "[WEAK] " : ""),
- "=> ", NULL);
-
- if (needed != NULL
- && match_version (strtab + aux->vna_name,
- needed))
- fname = needed->l_name;
-
- _dl_sysdep_message (fname ?: "not found", "\n",
- NULL);
-
- if (aux->vna_next == 0)
- /* No more symbols. */
- break;
-
- /* Next symbol. */
- aux = (ElfW(Vernaux) *) ((char *) aux
- + aux->vna_next);
- }
+ const char *fname = NULL;
+
+ _dl_sysdep_message ("\t\t",
+ strtab + ent->vn_file,
+ " (", strtab + aux->vna_name,
+ ") ",
+ (aux->vna_flags
+ & VER_FLG_WEAK
+ ? "[WEAK] " : ""),
+ "=> ", NULL);
+
+ if (needed != NULL
+ && match_version (strtab+aux->vna_name, needed))
+ fname = needed->l_name;
+
+ _dl_sysdep_message (fname ?: "not found", "\n",
+ NULL);
- if (ent->vn_next == 0)
- /* No more dependencies. */
+ if (aux->vna_next == 0)
+ /* No more symbols. */
break;
- /* Next dependency. */
- ent = (ElfW(Verneed) *) ((char *) ent
- + ent->vn_next);
+ /* Next symbol. */
+ aux = (ElfW(Vernaux) *) ((char *) aux
+ + aux->vna_next);
}
+
+ if (ent->vn_next == 0)
+ /* No more dependencies. */
+ break;
+
+ /* Next dependency. */
+ ent = (ElfW(Verneed) *) ((char *) ent + ent->vn_next);
}
}
}
diff --git a/intl/finddomain.c b/intl/finddomain.c
index c1ab68bfed..769bd93eee 100644
--- a/intl/finddomain.c
+++ b/intl/finddomain.c
@@ -99,9 +99,9 @@ _nl_find_domain (dirname, locale, domainname)
language[_territory][+audience][+special][,[sponsor][_revision]]
- Beside the first all of them are allowed to be missing. If the
- full specified locale is not found, the less specific one are
- looked for. The various part will be stripped of according to
+ Beside the first part all of them are allowed to be missing. If
+ the full specified locale is not found, the less specific one are
+ looked for. The various parts will be stripped off according to
the following order:
(1) revision
(2) sponsor
diff --git a/intl/localealias.c b/intl/localealias.c
index 99fcfa511f..c77f12527e 100644
--- a/intl/localealias.c
+++ b/intl/localealias.c
@@ -85,7 +85,7 @@ void free ();
# define strdup __strdup
/* We need locking here since we can be called from different palces. */
-# include <libc-lock.h>
+# include <bits/libc-lock.h>
__libc_lock_define_initialized (static, lock);
#endif
diff --git a/libc.map b/libc.map
index e503c9c060..fc6c9fe6c9 100644
--- a/libc.map
+++ b/libc.map
@@ -41,7 +41,7 @@ GLIBC_2.0 {
# functions with required interface outside normal name space
_exit; __ivaliduser; __open_catalog;
__argz_count; __argz_stringify; __argz_next;
- __check_rhosts_file; __rcmd_errstr;
+ __check_rhosts_file; __rcmd_errstr; __xpg_basename;
# functions from the experimental locale implementation
__*_l; __newlocale; __duplocale; __freelocale;
diff --git a/libio/stdio.h b/libio/stdio.h
index 24e0fa99ba..2062fa4f23 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -51,6 +51,12 @@ typedef struct _IO_FILE FILE;
#include <libio.h>
+#ifdef __cplusplus
+# define __STDIO_INLINE __inline
+#else
+# define __STDIO_INLINE extern __inline
+#endif
+
/* The type of the second argument to `fgetpos' and `fsetpos'. */
typedef _G_fpos_t fpos_t;
@@ -235,36 +241,40 @@ extern int vsprintf __P ((char *__restrict __s,
_G_va_list __arg));
#ifdef __OPTIMIZE__
-extern __inline int
+__STDIO_INLINE int
vprintf (const char *__restrict __fmt, _G_va_list __arg)
{
return vfprintf (stdout, __fmt, __arg);
}
#endif /* Optimizing. */
-#if defined __USE_GNU || defined __USE_ISOC9X
+#if defined __USE_BSD || defined __USE_ISOC9X
/* Maximum chars of output to write in MAXLEN. */
-extern int __snprintf __P ((char *__s, size_t __maxlen,
- __const char *__format, ...));
-extern int snprintf __P ((char *__s, size_t __maxlen,
- __const char *__format, ...));
-
-extern int __vsnprintf __P ((char *__s, size_t __maxlen,
- __const char *__format, _G_va_list __arg));
-extern int vsnprintf __P ((char *__s, size_t __maxlen,
- __const char *__format, _G_va_list __arg));
+extern int __snprintf __P ((char *__restrict __s, size_t __maxlen,
+ __const char *__restrict __format, ...));
+extern int snprintf __P ((char *__restrict __s, size_t __maxlen,
+ __const char *__restrict __format, ...));
+
+extern int __vsnprintf __P ((char *__restrict __s, size_t __maxlen,
+ __const char *__restrict __format,
+ _G_va_list __arg));
+extern int vsnprintf __P ((char *__restrict __s, size_t __maxlen,
+ __const char *__restrict __format,
+ _G_va_list __arg));
#endif
#ifdef __USE_GNU
/* Write formatted output to a string dynamically allocated with `malloc'.
Store the address of the string in *PTR. */
-extern int vasprintf __P ((char **__ptr, __const char *__f,
- _G_va_list __arg));
-extern int asprintf __P ((char **__ptr, __const char *__fmt, ...));
+extern int vasprintf __P ((char **__restrict __ptr,
+ __const char *__restrict __f, _G_va_list __arg));
+extern int asprintf __P ((char **__restrict __ptr,
+ __const char *__restrict __fmt, ...));
/* Write formatted output to a file descriptor. */
-extern int vdprintf __P ((int __fd, __const char *__fmt, _G_va_list __arg));
-extern int dprintf __P ((int __fd, __const char *__fmt, ...));
+extern int vdprintf __P ((int __fd, __const char *__restrict __fmt,
+ _G_va_list __arg));
+extern int dprintf __P ((int __fd, __const char *__restrict __fmt, ...));
#endif
@@ -279,19 +289,24 @@ extern int sscanf __P ((__const char *__restrict __s,
#ifdef __USE_GNU
/* Read formatted input from S into argument list ARG. */
-extern int __vfscanf __P ((FILE *__s, __const char *__format,
+extern int __vfscanf __P ((FILE *__restrict __s,
+ __const char *__restrict __format,
_G_va_list __arg));
-extern int vfscanf __P ((FILE *__s, __const char *__format,
+extern int vfscanf __P ((FILE *__restrict __s,
+ __const char *__restrict __format,
_G_va_list __arg));
/* Read formatted input from stdin into argument list ARG. */
-extern int __vscanf __P ((__const char *__format, _G_va_list __arg));
-extern int vscanf __P ((__const char *__format, _G_va_list __arg));
+extern int __vscanf __P ((__const char *__restrict __format,
+ _G_va_list __arg));
+extern int vscanf __P ((__const char *__restrict __format, _G_va_list __arg));
/* Read formatted input from S into argument list ARG. */
-extern int __vsscanf __P ((__const char *__s, __const char *__format,
+extern int __vsscanf __P ((__const char *__restrict __s,
+ __const char *__restrict __format,
_G_va_list __arg));
-extern int vsscanf __P ((__const char *__s, __const char *__format,
+extern int vsscanf __P ((__const char *__restrict __s,
+ __const char *__restrict __format,
_G_va_list __arg));
#endif /* Use GNU. */
@@ -308,7 +323,7 @@ extern int getchar __P ((void));
#define getc(_fp) _IO_getc (_fp)
#ifdef __OPTIMIZE__
-extern __inline int
+__STDIO_INLINE int
getchar (void)
{
return _IO_getc (stdin);
@@ -321,13 +336,13 @@ extern int getc_unlocked __P ((FILE *__stream));
extern int getchar_unlocked __P ((void));
#ifdef __OPTIMIZE__
-extern __inline int
+__STDIO_INLINE int
getc_unlocked (FILE *__fp)
{
return _IO_getc_unlocked (__fp);
}
-extern __inline int
+__STDIO_INLINE int
getchar_unlocked (void)
{
return _IO_getc_unlocked (stdin);
@@ -348,7 +363,7 @@ extern int putchar __P ((int __c));
#define putc(_ch, _fp) _IO_putc (_ch, _fp)
#ifdef __OPTIMIZE__
-extern __inline int
+__STDIO_INLINE int
putchar (int __c)
{
return _IO_putc (__c, stdout);
@@ -360,7 +375,7 @@ putchar (int __c)
extern int fputc_unlocked __P ((int __c, FILE *__stream));
#ifdef __OPTIMIZE__
-extern __inline int
+__STDIO_INLINE int
fputc_unlocked (int __c, FILE *__stream)
{
return _IO_putc_unlocked (__c, __stream);
@@ -374,13 +389,13 @@ extern int putc_unlocked __P ((int __c, FILE *__stream));
extern int putchar_unlocked __P ((int __c));
#ifdef __OPTIMIZE__
-extern __inline int
+__STDIO_INLINE int
putc_unlocked (int __c, FILE *__stream)
{
return _IO_putc_unlocked (__c, __stream);
}
-extern __inline int
+__STDIO_INLINE int
putchar_unlocked (int __c)
{
return _IO_putc_unlocked (__c, stdout);
@@ -423,7 +438,7 @@ _IO_ssize_t __getline __P ((char **__lineptr, size_t *__n, FILE *__stream));
_IO_ssize_t getline __P ((char **__lineptr, size_t *__n, FILE *__stream));
#ifdef __OPTIMIZE__
-extern __inline _IO_ssize_t
+__STDIO_INLINE _IO_ssize_t
getline (char **__lineptr, size_t *__n, FILE *__stream)
{
return __getdelim (__lineptr, __n, '\n', __stream);
@@ -488,13 +503,13 @@ extern int feof_unlocked __P ((FILE *__stream));
extern int ferror_unlocked __P ((FILE *__stream));
#ifdef __OPTIMIZE__
-extern __inline int
+__STDIO_INLINE int
feof_unlocked (FILE *__stream)
{
return _IO_feof_unlocked (__stream);
}
-extern __inline int
+__STDIO_INLINE int
ferror_unlocked (FILE *__stream)
{
return _IO_ferror_unlocked (__stream);
@@ -579,6 +594,9 @@ extern void funlockfile __P ((FILE *__stream));
__END_DECLS
+/* Define helper macro. */
+#undef __STDIO_INLINE
+
#endif /* <stdio.h> included. */
#endif /* !_STDIO_H */
diff --git a/locale/iso-4217.def b/locale/iso-4217.def
index 46880a2348..d7a0f37482 100644
--- a/locale/iso-4217.def
+++ b/locale/iso-4217.def
@@ -1,171 +1,190 @@
/*
- * Defines the valid international currency symbols according to ISO-4217.
+ * Defines the valid international currency symbols according to ISO 4217.
* This is used in monetary.c(monetary_check).
*
* If you find something missing or wrong contact <bug-glibc@prep.ai.mit.edu>
*
* !!! The list has to be sorted !!!
*/
-DEFINE_INT_CURR("AED ") /* United Arab Emirates */
-DEFINE_INT_CURR("AFA ") /* Afghanistan */
-DEFINE_INT_CURR("ALL ") /* Albania */
+DEFINE_INT_CURR("ADP ") /* Andorran Peseta */
+DEFINE_INT_CURR("AED ") /* United Arab Emirates Dirham */
+DEFINE_INT_CURR("AFA ") /* Afghanistan Afgani */
+DEFINE_INT_CURR("ALL ") /* Albanian Lek */
+DEFINE_INT_CURR("AMD ") /* Armenia Dram */
DEFINE_INT_CURR("ANG ") /* Netherlands Antilles */
-DEFINE_INT_CURR("AOK ") /* Angola */
-DEFINE_INT_CURR("ARP ") /* Argentina */
-DEFINE_INT_CURR("ATS ") /* Austria */
-DEFINE_INT_CURR("AUD ") /* Australia */
-DEFINE_INT_CURR("BBD ") /* Barbados */
-DEFINE_INT_CURR("BDT ") /* Bangladesh */
-DEFINE_INT_CURR("BEF ") /* Belgium */
-DEFINE_INT_CURR("BGL ") /* Bulgaria */
-DEFINE_INT_CURR("BHD ") /* Bahrain */
+DEFINE_INT_CURR("AOK ") /* Angolan Kwanza */
+DEFINE_INT_CURR("AON ") /* Angolan New Kwanza */
+DEFINE_INT_CURR("ARP ") /* Argentine Peso */
+DEFINE_INT_CURR("ATS ") /* Austrian Schilling */
+DEFINE_INT_CURR("AUD ") /* Australian Dollar */
+DEFINE_INT_CURR("AZM ") /* Azerbaijan Manat */
+DEFINE_INT_CURR("BBD ") /* Barbados Dollar */
+DEFINE_INT_CURR("BDT ") /* Bangladesh Taka */
+DEFINE_INT_CURR("BEF ") /* Belgian Franc */
+DEFINE_INT_CURR("BGL ") /* Bulgarian Lev */
+DEFINE_INT_CURR("BHD ") /* Bahraini Dinar */
DEFINE_INT_CURR("BIF ") /* Burundi */
-DEFINE_INT_CURR("BMD ") /* Burmuda */
-DEFINE_INT_CURR("BND ") /* Brunei */
-DEFINE_INT_CURR("BOP ") /* Bolivia */
-DEFINE_INT_CURR("BRC ") /* Brazil */
-DEFINE_INT_CURR("BSD ") /* Bahamas */
+DEFINE_INT_CURR("BMD ") /* Burmudian Dollar */
+DEFINE_INT_CURR("BND ") /* Brunei Dollar */
+DEFINE_INT_CURR("BOP ") /* Bolivian Boliviano */
+DEFINE_INT_CURR("BPS ") /* Canton and Enderbury Islands */
+DEFINE_INT_CURR("BRC ") /* Brazil Real */
+DEFINE_INT_CURR("BRL ") /* Brazil Cruzeiro */
+DEFINE_INT_CURR("BRR ") /* Brazil Real */
+DEFINE_INT_CURR("BSD ") /* Bahamas Dollar */
+DEFINE_INT_CURR("BTN ") /* Bhutan Ngultrum */
DEFINE_INT_CURR("BUK ") /* Burma */
-DEFINE_INT_CURR("BWP ") /* Botswana */
-DEFINE_INT_CURR("BZD ") /* Belize */
-DEFINE_INT_CURR("CAD ") /* Canada */
-DEFINE_INT_CURR("CHF ") /* Switzerland, Liechtenstein */
-DEFINE_INT_CURR("CLP ") /* Chile */
-DEFINE_INT_CURR("CNY ") /* China */
-DEFINE_INT_CURR("COP ") /* Colombia */
-DEFINE_INT_CURR("CRC ") /* Costa Rica */
-DEFINE_INT_CURR("CSK ") /* Czechoslovakia */
-DEFINE_INT_CURR("CUP ") /* Cuba */
-DEFINE_INT_CURR("CVE ") /* Cape Verde */
-DEFINE_INT_CURR("CYP ") /* Cyprus */
-DEFINE_INT_CURR("DEM ") /* Germany */
-DEFINE_INT_CURR("DJF ") /* Djibouti */
-DEFINE_INT_CURR("DKK ") /* Denmark */
+DEFINE_INT_CURR("BWP ") /* Botswana Pula */
+DEFINE_INT_CURR("BZD ") /* Belize Dollar */
+DEFINE_INT_CURR("CAD ") /* Canadian Dollar */
+DEFINE_INT_CURR("CFP ") /* French Pacific Island Franc */
+DEFINE_INT_CURR("CHF ") /* Swiss Franc (Liechtenstein) */
+DEFINE_INT_CURR("CLP ") /* Chilean Peso */
+DEFINE_INT_CURR("CNY ") /* China Yuan Renminbi */
+DEFINE_INT_CURR("COP ") /* Colombian Peso */
+DEFINE_INT_CURR("CRC ") /* Costa Rican Colon */
+DEFINE_INT_CURR("CUP ") /* Cuban Peso */
+DEFINE_INT_CURR("CVE ") /* Cape Verde Escudo */
+DEFINE_INT_CURR("CYP ") /* Cypriot Pound */
+DEFINE_INT_CURR("CZK ") /* Czech Koruna */
+DEFINE_INT_CURR("DEM ") /* German Mark */
+DEFINE_INT_CURR("DJF ") /* Djibouti Franc */
+DEFINE_INT_CURR("DKK ") /* Danish Krone (Faroe Islands, Greenland) */
DEFINE_INT_CURR("DOP ") /* Dominican Republic */
-DEFINE_INT_CURR("DZD ") /* Algeria */
-DEFINE_INT_CURR("ECS ") /* Ecuador */
-DEFINE_INT_CURR("EEK ") /* Estonia */
-DEFINE_INT_CURR("EGP ") /* Egypt */
-DEFINE_INT_CURR("ESP ") /* Spain */
-DEFINE_INT_CURR("ETB ") /* Ethiopia */
-DEFINE_INT_CURR("FIM ") /* Finland */
-DEFINE_INT_CURR("FJD ") /* Fiji */
-DEFINE_INT_CURR("FKP ") /* Falkland Islands (Malvinas) */
-DEFINE_INT_CURR("FRF ") /* France */
-DEFINE_INT_CURR("GBP ") /* Great Britain */
-DEFINE_INT_CURR("GHC ") /* Ghana */
-DEFINE_INT_CURR("GIP ") /* Gibraltar */
-DEFINE_INT_CURR("GMD ") /* Gambia */
-DEFINE_INT_CURR("GNS ") /* Guinea */
-DEFINE_INT_CURR("GQE ") /* Equatorial Guinea */
-DEFINE_INT_CURR("GRD ") /* Greece */
-DEFINE_INT_CURR("GTQ ") /* Guatemala */
-DEFINE_INT_CURR("GWP ") /* Guinea-Bissau */
-DEFINE_INT_CURR("GYD ") /* Guyana */
-DEFINE_INT_CURR("HKD ") /* Hong Kong */
-DEFINE_INT_CURR("HNL ") /* Honduras */
-DEFINE_INT_CURR("HRD ") /* Croatia */
-DEFINE_INT_CURR("HTG ") /* Haiti */
-DEFINE_INT_CURR("HUF ") /* Hungary */
-DEFINE_INT_CURR("IDR ") /* Indonesia */
-DEFINE_INT_CURR("IEP ") /* Ireland */
-DEFINE_INT_CURR("ILS ") /* Israel */
-DEFINE_INT_CURR("INR ") /* India, Bhutan */
-DEFINE_INT_CURR("IQD ") /* Iraq */
-DEFINE_INT_CURR("IRR ") /* Iran */
-DEFINE_INT_CURR("ISK ") /* Iceland */
-DEFINE_INT_CURR("ITL ") /* Italy */
-DEFINE_INT_CURR("JMD ") /* Jamaica */
-DEFINE_INT_CURR("JOD ") /* Jordan */
-DEFINE_INT_CURR("JPY ") /* Japan */
-DEFINE_INT_CURR("KES ") /* Kenya */
-DEFINE_INT_CURR("KHR ") /* Democratic Kampuchea */
-DEFINE_INT_CURR("KMF ") /* Comoros */
-DEFINE_INT_CURR("KPW ") /* Democratic People's of Korea */
-DEFINE_INT_CURR("KRW ") /* Republic of Korea */
-DEFINE_INT_CURR("KWD ") /* Kuwait */
+DEFINE_INT_CURR("DZD ") /* Algerian Dinar */
+DEFINE_INT_CURR("ECS ") /* Ecuadoran Sucre */
+DEFINE_INT_CURR("EEK ") /* Estonian Kroon */
+DEFINE_INT_CURR("EGP ") /* Egyptian Pound */
+DEFINE_INT_CURR("ESP ") /* Spanish Peseta */
+DEFINE_INT_CURR("ETB ") /* Ethiopian Birr */
+DEFINE_INT_CURR("EUR ") /* European Union Euro */
+DEFINE_INT_CURR("FIM ") /* Finnish Markka */
+DEFINE_INT_CURR("FJD ") /* Fiji Dollar */
+DEFINE_INT_CURR("FKP ") /* Falkland Islands Pound (Malvinas) */
+DEFINE_INT_CURR("FRF ") /* French Franc */
+DEFINE_INT_CURR("GBP ") /* British Pound */
+DEFINE_INT_CURR("GEK ") /* Georgia Lari */
+DEFINE_INT_CURR("GHC ") /* Ghana Cedi */
+DEFINE_INT_CURR("GIP ") /* Gibraltar Pound */
+DEFINE_INT_CURR("GMD ") /* Gambian Dalasi */
+DEFINE_INT_CURR("GNS ") /* Guinea Syli */
+DEFINE_INT_CURR("GQE ") /* Equatorial Guinea Ekwele */
+DEFINE_INT_CURR("GRD ") /* Greek Drachma */
+DEFINE_INT_CURR("GTQ ") /* Guatemala Quetzal */
+DEFINE_INT_CURR("GWP ") /* Guinea-Bissau Peso */
+DEFINE_INT_CURR("GYD ") /* Guyana Dollar */
+DEFINE_INT_CURR("HKD ") /* Hong Kong Dollar */
+DEFINE_INT_CURR("HNL ") /* Honduras Lempira */
+DEFINE_INT_CURR("HRK ") /* Croatia Kuna */
+DEFINE_INT_CURR("HTG ") /* Haiti Gourde */
+DEFINE_INT_CURR("HUF ") /* Hungarian Forint */
+DEFINE_INT_CURR("IDR ") /* Indonesia Rupiah */
+DEFINE_INT_CURR("IEP ") /* Irish Pound */
+DEFINE_INT_CURR("ILS ") /* Israeli Shekel */
+DEFINE_INT_CURR("INR ") /* Indian Rupee (Bhutan) */
+DEFINE_INT_CURR("IQD ") /* Iraqi Dinar */
+DEFINE_INT_CURR("IRR ") /* Iranian Rial */
+DEFINE_INT_CURR("ISK ") /* Iceland Krona */
+DEFINE_INT_CURR("ITL ") /* Italian Lira (San Marino, Vatican City) */
+DEFINE_INT_CURR("JMD ") /* Jamaican Dollar */
+DEFINE_INT_CURR("JOD ") /* Jordanian Dinar */
+DEFINE_INT_CURR("JPY ") /* Japanese Yen */
+DEFINE_INT_CURR("KES ") /* Kenyan Shilling */
+DEFINE_INT_CURR("KGS ") /* Kyrgyzstan Som */
+DEFINE_INT_CURR("KHR ") /* Democratic Kampuchea Riel */
+DEFINE_INT_CURR("KMF ") /* Comoros Franc */
+DEFINE_INT_CURR("KPW ") /* Democratic People's of Korea Won */
+DEFINE_INT_CURR("KRW ") /* Republic of Korea Won */
+DEFINE_INT_CURR("KWD ") /* Kuwaiti Dinar */
DEFINE_INT_CURR("KYD ") /* Cayman Islands */
-DEFINE_INT_CURR("LAK ") /* Lao People's Democratic Republic */
-DEFINE_INT_CURR("LBP ") /* Lebanon */
-DEFINE_INT_CURR("LKR ") /* Sri Lanka */
-DEFINE_INT_CURR("LRD ") /* Liberia */
-DEFINE_INT_CURR("LSM ") /* Lesotho */
-DEFINE_INT_CURR("LTL ") /* Lithuania */
-DEFINE_INT_CURR("LUF ") /* Luxembourg */
-DEFINE_INT_CURR("LVL ") /* Latvia */
-DEFINE_INT_CURR("LYD ") /* Libyan Arab Jamahiriya */
-DEFINE_INT_CURR("MAD ") /* Morocco */
-DEFINE_INT_CURR("MGF ") /* Madagascar */
-DEFINE_INT_CURR("MLF ") /* Mali */
-DEFINE_INT_CURR("MNT ") /* Mongolia */
-DEFINE_INT_CURR("MOP ") /* Macau */
-DEFINE_INT_CURR("MRO ") /* Mauritania */
-DEFINE_INT_CURR("MTP ") /* Malta */
-DEFINE_INT_CURR("MUR ") /* Mauritius */
-DEFINE_INT_CURR("MVR ") /* Maldives */
-DEFINE_INT_CURR("MWK ") /* Malawi */
-DEFINE_INT_CURR("MXP ") /* Mexico */
-DEFINE_INT_CURR("MYR ") /* Malaysia */
-DEFINE_INT_CURR("MZM ") /* Mozambique */
-DEFINE_INT_CURR("NGN ") /* Nigeria */
-DEFINE_INT_CURR("NIC ") /* Nicaragua */
-DEFINE_INT_CURR("NLG ") /* Netherlands */
-DEFINE_INT_CURR("NOK ") /* Norway */
-DEFINE_INT_CURR("NPR ") /* Nepal */
-DEFINE_INT_CURR("NZD ") /* New Zealand */
-DEFINE_INT_CURR("OMR ") /* Oman */
-DEFINE_INT_CURR("PAB ") /* Panama */
-DEFINE_INT_CURR("PES ") /* Peru */
-DEFINE_INT_CURR("PGK ") /* Papau New Guinea */
-DEFINE_INT_CURR("PHP ") /* Philippines */
-DEFINE_INT_CURR("PKR ") /* Pakistan */
-DEFINE_INT_CURR("PLZ ") /* Poland */
-DEFINE_INT_CURR("PTE ") /* Portugal */
-DEFINE_INT_CURR("PYG ") /* Paraguay */
-DEFINE_INT_CURR("QAR ") /* Qatar */
-DEFINE_INT_CURR("ROL ") /* Romania */
-DEFINE_INT_CURR("RUR ") /* Russia */
-DEFINE_INT_CURR("RWF ") /* Rwanda */
-DEFINE_INT_CURR("SAR ") /* Saudi Arabia */
-DEFINE_INT_CURR("SBD ") /* Solomon Islands */
-DEFINE_INT_CURR("SCR ") /* Seychelles */
-DEFINE_INT_CURR("SDP ") /* Sudan */
-DEFINE_INT_CURR("SEK ") /* Sweden */
-DEFINE_INT_CURR("SGD ") /* Singapore */
-DEFINE_INT_CURR("SHP ") /* St. Helena */
-DEFINE_INT_CURR("SIT ") /* Slovenia */
-DEFINE_INT_CURR("SLL ") /* Sierra Leone */
-DEFINE_INT_CURR("SOS ") /* Somalia */
-DEFINE_INT_CURR("SRG ") /* Suriname */
-DEFINE_INT_CURR("STD ") /* Sao Tome and Principe */
-DEFINE_INT_CURR("SUR ") /* Ukrainian, Byelorussion */
-DEFINE_INT_CURR("SVC ") /* El Salvador */
-DEFINE_INT_CURR("SYP ") /* Syrian Arab Republic */
-DEFINE_INT_CURR("SZL ") /* Swaziland */
-DEFINE_INT_CURR("THB ") /* Thailand */
-DEFINE_INT_CURR("TND ") /* Tunisia */
-DEFINE_INT_CURR("TOP ") /* Tonga */
-DEFINE_INT_CURR("TPE ") /* East Timor */
-DEFINE_INT_CURR("TRL ") /* Turkey */
+DEFINE_INT_CURR("KZT ") /* Kazakhstan Tenge */
+DEFINE_INT_CURR("LAK ") /* Lao People's Democratic Republic New Kip */
+DEFINE_INT_CURR("LBP ") /* Lebanese Pound */
+DEFINE_INT_CURR("LKR ") /* Sri Lankan Rupee */
+DEFINE_INT_CURR("LRD ") /* Liberian Dollar */
+DEFINE_INT_CURR("LSM ") /* Lesotho Maloti */
+DEFINE_INT_CURR("LTL ") /* Lithuanian Litas */
+DEFINE_INT_CURR("LUF ") /* Luxembourg Franc */
+DEFINE_INT_CURR("LVL ") /* Latvia Lat */
+DEFINE_INT_CURR("LYD ") /* Libyan Arab Jamahiriya Dinar */
+DEFINE_INT_CURR("MAD ") /* Moroccan Dirham */
+DEFINE_INT_CURR("MDL ") /* Moldova Lei */
+DEFINE_INT_CURR("MGF ") /* Madagasy Franc */
+DEFINE_INT_CURR("MLF ") /* Mali Franc */
+DEFINE_INT_CURR("MMK ") /* Myanmar Kyat */
+DEFINE_INT_CURR("MNT ") /* Mongolia Tugrik */
+DEFINE_INT_CURR("MOP ") /* Macau Pataca */
+DEFINE_INT_CURR("MRO ") /* Mauritania Ouguiya */
+DEFINE_INT_CURR("MTP ") /* Maltese Lira */
+DEFINE_INT_CURR("MUR ") /* Mauritius Rupee */
+DEFINE_INT_CURR("MVR ") /* Maldives Rupee */
+DEFINE_INT_CURR("MWK ") /* Malawi Kwacha */
+DEFINE_INT_CURR("MXP ") /* Mexican Peso */
+DEFINE_INT_CURR("MYR ") /* Malaysian Ringgit */
+DEFINE_INT_CURR("MZM ") /* Mozambique Metical */
+DEFINE_INT_CURR("NGN ") /* Nigeria Naira */
+DEFINE_INT_CURR("NIC ") /* Nicaragua Cordoba */
+DEFINE_INT_CURR("NLG ") /* Netherlands Guilder */
+DEFINE_INT_CURR("NOK ") /* Norwegian Krone */
+DEFINE_INT_CURR("NPR ") /* Nepalese Rupee */
+DEFINE_INT_CURR("NZD ") /* New Zealand Dollar */
+DEFINE_INT_CURR("OMR ") /* Omani Rial */
+DEFINE_INT_CURR("PAB ") /* Panamaniam Balboa */
+DEFINE_INT_CURR("PEN ") /* Peruvian New Sol */
+DEFINE_INT_CURR("PGK ") /* Papau New Guinea Kina */
+DEFINE_INT_CURR("PHP ") /* Philippines Peso */
+DEFINE_INT_CURR("PKR ") /* Pakistan Rupee */
+DEFINE_INT_CURR("PLZ ") /* Polish Zloty */
+DEFINE_INT_CURR("PTE ") /* Portugese Escudo */
+DEFINE_INT_CURR("PYG ") /* Paraguay Guarani */
+DEFINE_INT_CURR("QAR ") /* Qatar Rial */
+DEFINE_INT_CURR("ROL ") /* Romanian Leu */
+DEFINE_INT_CURR("RUR ") /* Russian Ruble */
+DEFINE_INT_CURR("RWF ") /* Rwanda Franc */
+DEFINE_INT_CURR("SAR ") /* Saudi Arabia Riyal */
+DEFINE_INT_CURR("SBD ") /* Solomon Islands Dollar */
+DEFINE_INT_CURR("SCR ") /* Seychelles Rupee */
+DEFINE_INT_CURR("SDP ") /* Sudanese Pound */
+DEFINE_INT_CURR("SEK ") /* Swedish Krona */
+DEFINE_INT_CURR("SGD ") /* Singapore Dollar */
+DEFINE_INT_CURR("SHP ") /* St. Helena Pound */
+DEFINE_INT_CURR("SIT ") /* Slovenian Tolar */
+DEFINE_INT_CURR("SKK ") /* Slovakian Koruna */
+DEFINE_INT_CURR("SLL ") /* Sierra Leone Leone */
+DEFINE_INT_CURR("SOS ") /* Somalia Schilling */
+DEFINE_INT_CURR("SRG ") /* Suriname Guilder */
+DEFINE_INT_CURR("STD ") /* Sao Tome and Principe Dobra */
+DEFINE_INT_CURR("SUR ") /* Soviet Union Rubel (Ukrainian, Byelorussion) */
+DEFINE_INT_CURR("SVC ") /* El Salvador Colon */
+DEFINE_INT_CURR("SYP ") /* Syrian Arab Republic Pound */
+DEFINE_INT_CURR("SZL ") /* Swaziland Lilangeni */
+DEFINE_INT_CURR("THB ") /* Thai Baht */
+DEFINE_INT_CURR("TMM ") /* Turkmenistan Manet */
+DEFINE_INT_CURR("TND ") /* Tunisian Dinar */
+DEFINE_INT_CURR("TOP ") /* Tonga Pa'Anga */
+DEFINE_INT_CURR("TPE ") /* East Timor Escudo */
+DEFINE_INT_CURR("TRL ") /* Turkish Lira */
DEFINE_INT_CURR("TTD ") /* Trinidad and Tobago */
-DEFINE_INT_CURR("TWD ") /* Taiwan, Province of China */
-DEFINE_INT_CURR("TZS ") /* United Republic of Tanzania */
-DEFINE_INT_CURR("UGS ") /* Uganda */
-DEFINE_INT_CURR("USD ") /* United States */
-DEFINE_INT_CURR("UYP ") /* Uruguay */
-DEFINE_INT_CURR("VEB ") /* Venezuela */
-DEFINE_INT_CURR("VND ") /* Viet Nam */
-DEFINE_INT_CURR("VUV ") /* Vanuatu */
-DEFINE_INT_CURR("WST ") /* Samoa */
-DEFINE_INT_CURR("XAF ") /* United Republic of Cameroon, Central African Republic, Chad, Congo, Gabon */
-DEFINE_INT_CURR("XCD ") /* Antiqua, Dominica, Grenada, Montserrat, St. Kitts-Nevis-Anguilla, Saint Lucia, Saint Vincent and the Grenadines */
-DEFINE_INT_CURR("XOF ") /* Benin, Ivory Coast, Niger, Senegal, Togo, Upper Volta */
+DEFINE_INT_CURR("TWD ") /* Taiwan, Province of China Dollar */
+DEFINE_INT_CURR("TZS ") /* United Republic of Tanzania Shilling */
+DEFINE_INT_CURR("UAK ") /* Ukraine Hryvna */
+DEFINE_INT_CURR("UGS ") /* Ugandan Shilling */
+DEFINE_INT_CURR("USD ") /* United States Dollar */
+DEFINE_INT_CURR("UYP ") /* Uruguay Peso */
+DEFINE_INT_CURR("UYU ") /* Uruguay New Peso */
+DEFINE_INT_CURR("UZS ") /* Uzbekistan Sum */
+DEFINE_INT_CURR("VEB ") /* Venezuelan Bolivar */
+DEFINE_INT_CURR("VND ") /* Viet Nam Dong */
+DEFINE_INT_CURR("VUV ") /* Vanuatu Vatu */
+DEFINE_INT_CURR("WST ") /* Samoa Tala */
+DEFINE_INT_CURR("XAF ") /* Central African Franc (United Republic of Cameroon, Central African Republic, Chad, Congo, Gabon) */
+DEFINE_INT_CURR("XCD ") /* East Caribbean Dollar (Antiqua, Dominica, Grenada, Montserrat, St. Kitts-Nevis-Anguilla, Saint Lucia, Saint Vincent and the Grenadines) */
+DEFINE_INT_CURR("XDS ") /* St. Christopher Dollar */
+DEFINE_INT_CURR("XOF ") /* West African Franc (Benin, Ivory Coast, Niger, Senegal, Togo, Upper Volta) */
DEFINE_INT_CURR("XPF ") /* French polynesia, New Caledonia, Wallis and Futuna Islands */
-DEFINE_INT_CURR("YDD ") /* Democratic Yemen */
-DEFINE_INT_CURR("YER ") /* Yemen */
-DEFINE_INT_CURR("YUD ") /* Yugoslavia */
-DEFINE_INT_CURR("ZAL ") /* South Africa */
-DEFINE_INT_CURR("ZAR ") /* Lesotho, Namibia */
-DEFINE_INT_CURR("ZMK ") /* Zambia */
-DEFINE_INT_CURR("ZRZ ") /* Zaire */
-DEFINE_INT_CURR("ZWD ") /* Zimbabwe */
+DEFINE_INT_CURR("YDD ") /* Yemini Dinar (Democratic Yemen) */
+DEFINE_INT_CURR("YER ") /* Yemeni Rial */
+DEFINE_INT_CURR("ZAR ") /* South Africa Rand (Lesotho, Namibia) */
+DEFINE_INT_CURR("ZMK ") /* Zambian Kwacha */
+DEFINE_INT_CURR("ZRZ ") /* Zaire Zaire */
+DEFINE_INT_CURR("ZWD ") /* Zimbabwe Dollar */
diff --git a/locale/loadlocale.c b/locale/loadlocale.c
index edbe891f84..15570c36d1 100644
--- a/locale/loadlocale.c
+++ b/locale/loadlocale.c
@@ -127,7 +127,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
#endif
filedata = (void *) __mmap ((caddr_t) 0, st.st_size, PROT_READ,
MAP_FILE|MAP_COPY|MAP_INHERIT, fd, 0);
- if (filedata == MAP_FAILED)
+ if ((void *) filedata == MAP_FAILED)
{
if (errno == ENOSYS)
{
diff --git a/manual/message.texi b/manual/message.texi
index 7640e21acf..76587d1381 100644
--- a/manual/message.texi
+++ b/manual/message.texi
@@ -1167,19 +1167,131 @@ translations from the file
@end smallexample
From the above descriptions it should be clear which component of this
-filename is determined fromby which source.
+filename is determined by which source.
+
+In the above example we assumed that the @code{LANGUAGE} environment
+variable to @code{de}. This might be an appropriate selection but what
+happens if the user wants to use @code{LC_ALL} because of the wider
+usability and here the required value is @code{de_DE.ISO-8859-1}? We
+already mentioned above that a situation like this is not infrequent.
+E.g., a person might prefer reading a dialect and if this is not
+available fall back on the standard language.
+
+The @code{gettext} functions know about situations like this and can
+handle them gracefully. The functions recognize the format of the value
+of the environment variable. It can split the value is different pieces
+and by leaving out the only or the other part it can construct new
+values. This happens of course in a predictable way. To understand
+this one must know the format of the environment variable value. There
+are to more or less standardized forms:
+
+@table @emph
+@item X/Open Format
+@code{language[_territory[.codeset]][@@modifier]}
+
+@item CEN Format (European Community Standard)
+@code{language[_territory][+audience][+special][,[sponsor][_revision]]}
+@end table
+
+The functions will automatically recognize which format is used. Less
+specific locale names will be stripped of in the order of the following
+list:
-@c Describe:
-@c * message inheritence
-@c * locale aliasing
-@c * character set dependence
+@enumerate
+@item
+@code{revision}
+@item
+@code{sponsor}
+@item
+@code{special}
+@item
+@code{codeset}
+@item
+@code{normalized codeset}
+@item
+@code{territory}
+@item
+@code{audience}/@code{modifier}
+@end enumerate
+
+From the last entry one can see that the meaning of the @code{modifer}
+field in the X/Open format and the @code{audience} format have the same
+meaning. Beside one can see that the @code{language} field for obvious
+reasons never will be dropped.
+
+The only new thing is the @code{normalized codeset} entry. This is
+another goodie which is introduced to help reducing the chaos which
+derives from the inability of the people to standardize the names of
+character sets. Instead of @w{ISO-8859-1} one can often see @w{8859-1},
+@w{88591}, @w{iso8859-1}, or @w{iso_8859-1}. The @code{normalized
+codeset} value is generated from the user-provided character set name by
+applying the following rules:
+
+@enumerate
+@item
+Remove all characters beside numbers and letters.
+@item
+Fold letters to lowercase.
+@item
+If the same only contains digits prepend the string @code{"iso"}.
+@end enumerate
+
+@noindent
+So all of the above name will be normalized to @code{iso88591}. This
+allows the program user much more freely choosing the locale name.
+
+Even this extended functionality still does not help to solve the
+problem that completely different names can be used to denote the same
+locale (e.g., @code{de} and @code{german}). To be of help in this
+situation the locale implementation and also the @code{gettext}
+functions know about aliases.
+
+The file @file{/usr/share/locale/locale.alias} (replace @file{/usr} with
+whatever prefix you used for configuring the C library) contains a
+mapping of alternative names to more regular names. The system manager
+is free to add new entries to fill her/his own needs. The selected
+locale from the environment is compared with the entries in the first
+column of this file ignoring the case. If they match the value of the
+second column is used instead for the further handling.
+
+In the description of the format of the environment variables we already
+mentioned the character set as a factor in the selection of the message
+catalog. In fact, only catalogs which contain text written using the
+character set of the system/program can be used (directly; there will
+come a solution for this some day). This means for the user that s/he
+will always have to take care for this. If in the collection of the
+message catalogs there are files for the same language but coded using
+different character sets the user has to be careful.
@node Helper programs for gettext
@subsection Programs to handle message catalogs for @code{gettext}
-@c Describe:
-@c * msgfmt
-@c * xgettext
-@c Mention:
-@c * other programs from GNU gettext
+The GNU C Library does not contain the source code for the programs to
+handle message catalogs for the @code{gettext} functions. As part of
+the GNU project the GNU gettext package contains everything the
+developer needs. The functionality provided by the tools in this
+package by far exceeds the abilities of the @code{gencat} program
+described above for the @code{catgets} functions.
+
+There is a program @code{msgfmt} which is the equivalent program to the
+@code{gencat} program. It generates from the human-readable and
+-editable form of the message catalog a binary file which can be used by
+the @code{gettext} functions. But there are several more programs
+available.
+
+The @code{xgettext} program can be used to automatically extract the
+translatable messages from a source file. I.e., the programmer need not
+take care for the translations and the list of messages which have to be
+translated. S/He will simply wrap the translatable string in calls to
+@code{gettext} et.al and the rest will be done by @code{xgettext}. This
+program has a lot of option which help to customize the output or do
+help to understand the input better.
+
+Other programs help to manage development cycle when new messages appear
+in the source files or when a new translation of the messages appear.
+here it should only be noted that using all the tools in GNu gettext it
+is possible to @emph{completely} automize the handling of message
+catalog. Beside marking the translatable string in the source code and
+generating the translations the developers do not have anything to do
+themself.
diff --git a/math/libm-test.c b/math/libm-test.c
index 7e4e144c4c..a173a09631 100644
--- a/math/libm-test.c
+++ b/math/libm-test.c
@@ -4705,7 +4705,7 @@ identities (void)
identities1_test (0, 0);
identities1_test (-1, CHOOSE (1e-18L, 0, 1e-7));
- identities2_test (0.2L, CHOOSE (0, 1e-16, 0));
+ identities2_test (0.2L, CHOOSE (1e-19L, 1e-16, 0));
identities2_test (0.9L, CHOOSE (0, 1e-15, 0));
identities2_test (0, 0);
identities2_test (-1, CHOOSE (1e-18L, 1e-15, 0));
diff --git a/po/libc.pot b/po/libc.pot
index 4ad9360e52..825f51178a 100644
--- a/po/libc.pot
+++ b/po/libc.pot
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libc 2.0.90\n"
-"POT-Creation-Date: 1997-03-27 03:03+0100\n"
+"POT-Creation-Date: 1997-08-21 03:59+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+DIST\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -14,95 +14,95 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
-#: nis/nis_print.c:210
+#: nis/nis_print.c:247
msgid "\t\tAccess Rights : "
msgstr ""
-#: nis/nis_print.c:208
+#: nis/nis_print.c:245
#, c-format
msgid "\t\tAttributes : %s\n"
msgstr ""
-#: nis/nis_print.c:229
+#: nis/nis_print.c:267
#, c-format
msgid "\tEntry data of type %s\n"
msgstr ""
-#: nis/nis_print.c:115
+#: nis/nis_print.c:152
#, c-format
msgid "\tName : %s\n"
msgstr ""
-#: nis/nis_print.c:116
+#: nis/nis_print.c:153
msgid "\tPublic Key : "
msgstr ""
-#: nis/nis_print.c:142
+#: nis/nis_print.c:179
#, c-format
msgid "\tUniversal addresses (%u)\n"
msgstr ""
-#: nis/nis_print.c:206
+#: nis/nis_print.c:243
#, c-format
msgid "\t[%d]\tName : %s\n"
msgstr ""
-#: nis/nis_print.c:232
+#: nis/nis_print.c:270
#, c-format
msgid "\t[%u] - [%u bytes] "
msgstr ""
-#: nis/nis_print.c:174
+#: nis/nis_print.c:211
#, c-format
msgid ""
"\n"
"Direct Type : %d\n"
msgstr ""
-#: nis/nis_print.c:188
+#: nis/nis_print.c:225
msgid ""
"\n"
"Group Members :\n"
msgstr ""
-#: nis/nis_print.c:252
+#: nis/nis_print.c:290
#, c-format
msgid ""
"\n"
"Time to Live : %lu (seconds)\n"
msgstr ""
-#: sunrpc/rpcinfo.c:680
+#: sunrpc/rpcinfo.c:678
msgid " rpcinfo -b prognum versnum\n"
msgstr ""
-#: sunrpc/rpcinfo.c:681
+#: sunrpc/rpcinfo.c:679
msgid " rpcinfo -d prognum versnum\n"
msgstr ""
-#: sunrpc/rpcinfo.c:679
+#: sunrpc/rpcinfo.c:677
msgid " rpcinfo -p [ host ]\n"
msgstr ""
-#: sunrpc/rpcinfo.c:678
+#: sunrpc/rpcinfo.c:675
msgid " rpcinfo [ -n portnum ] -t host prognum [ versnum ]\n"
msgstr ""
-#: nis/nis_print.c:286
+#: nis/nis_print.c:313
#, c-format
msgid " Data Length = %u\n"
msgstr ""
-#: sunrpc/rpcinfo.c:577
+#: sunrpc/rpcinfo.c:573
msgid " program vers proto port\n"
msgstr ""
-#: time/zic.c:419
+#: time/zic.c:421
#, c-format
msgid " (rule from \"%s\", line %d)"
msgstr ""
-#: argp/argp-help.c:1511
+#: argp/argp-help.c:1518
msgid " [OPTION...]"
msgstr ""
@@ -110,17 +110,17 @@ msgstr ""
msgid " done\n"
msgstr ""
-#: time/zic.c:416
+#: time/zic.c:418
#, c-format
msgid "\"%s\", line %d: %s"
msgstr ""
-#: time/zic.c:943
+#: time/zic.c:947
#, c-format
msgid "\"Zone %s\" line and -l option are mutually exclusive"
msgstr ""
-#: time/zic.c:951
+#: time/zic.c:955
#, c-format
msgid "\"Zone %s\" line and -p option are mutually exclusive"
msgstr ""
@@ -135,7 +135,7 @@ msgstr ""
msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
msgstr ""
-#: time/zic.c:754
+#: time/zic.c:758
#, c-format
msgid "%s in ruleless zone"
msgstr ""
@@ -155,52 +155,52 @@ msgstr ""
msgid "%s%sUnknown signal %d\n"
msgstr ""
-#: time/zic.c:2172
+#: time/zic.c:2185
#, c-format
msgid "%s: %d did not sign extend correctly\n"
msgstr ""
-#: locale/programs/charmap.c:176
+#: locale/programs/charmap.c:244
#, c-format
msgid "%s: <mb_cur_max> must be greater than <mb_cur_min>\n"
msgstr ""
-#: time/zic.c:1443
+#: time/zic.c:1456
#, c-format
msgid "%s: Can't create %s: %s\n"
msgstr ""
-#: time/zic.c:2150
+#: time/zic.c:2163
#, c-format
msgid "%s: Can't create directory %s: %s\n"
msgstr ""
-#: time/zic.c:608
+#: time/zic.c:610
#, c-format
msgid "%s: Can't link from %s to %s: %s\n"
msgstr ""
-#: time/zic.c:780
+#: time/zic.c:784
#, c-format
msgid "%s: Can't open %s: %s\n"
msgstr ""
-#: time/zic.c:1433
+#: time/zic.c:1446
#, c-format
msgid "%s: Can't remove %s: %s\n"
msgstr ""
-#: time/zic.c:849
+#: time/zic.c:853
#, c-format
msgid "%s: Error closing %s: %s\n"
msgstr ""
-#: time/zic.c:842
+#: time/zic.c:846
#, c-format
msgid "%s: Error reading %s\n"
msgstr ""
-#: time/zic.c:1507
+#: time/zic.c:1520
#, c-format
msgid "%s: Error writing %s\n"
msgstr ""
@@ -210,122 +210,127 @@ msgstr ""
msgid "%s: Error writing standard output "
msgstr ""
-#: time/zic.c:827
+#: time/zic.c:831
#, c-format
msgid "%s: Leap line in non leap seconds file %s\n"
msgstr ""
-#: time/zic.c:357
+#: time/zic.c:359
#, c-format
msgid "%s: Memory exhausted: %s\n"
msgstr ""
-#: time/zic.c:522
+#: time/zic.c:524
#, c-format
msgid "%s: More than one -L option specified\n"
msgstr ""
-#: time/zic.c:482
+#: time/zic.c:484
#, c-format
msgid "%s: More than one -d option specified\n"
msgstr ""
-#: time/zic.c:492
+#: time/zic.c:494
#, c-format
msgid "%s: More than one -l option specified\n"
msgstr ""
-#: time/zic.c:502
+#: time/zic.c:504
#, c-format
msgid "%s: More than one -p option specified\n"
msgstr ""
-#: time/zic.c:512
+#: time/zic.c:514
#, c-format
msgid "%s: More than one -y option specified\n"
msgstr ""
-#: argp/argp-parse.c:628
+#: argp/argp-parse.c:637
#, c-format
msgid "%s: Too many arguments\n"
msgstr ""
-#: time/zic.c:1872
+#: login/programs/database.c:129
+#, c-format
+msgid "%s: cannot get modification time"
+msgstr ""
+
+#: time/zic.c:1885
#, c-format
msgid "%s: command was '%s', result was %d\n"
msgstr ""
-#: locale/programs/charmap.c:593 locale/programs/locfile.c:900
+#: locale/programs/charmap.c:661 locale/programs/locfile.c:900
#, c-format
msgid "%s: error in state machine"
msgstr ""
-#: posix/getopt.c:785
+#: posix/getopt.c:783
#, c-format
msgid "%s: illegal option -- %c\n"
msgstr ""
-#: posix/getopt.c:788
+#: posix/getopt.c:786
#, c-format
msgid "%s: invalid option -- %c\n"
msgstr ""
-#: posix/getopt.c:709
+#: posix/getopt.c:707
#, c-format
msgid "%s: option `%c%s' doesn't allow an argument\n"
msgstr ""
-#: posix/getopt.c:680
+#: posix/getopt.c:678
#, c-format
msgid "%s: option `%s' is ambiguous\n"
msgstr ""
-#: posix/getopt.c:726 posix/getopt.c:899
+#: posix/getopt.c:724 posix/getopt.c:897
#, c-format
msgid "%s: option `%s' requires an argument\n"
msgstr ""
-#: posix/getopt.c:704
+#: posix/getopt.c:702
#, c-format
msgid "%s: option `--%s' doesn't allow an argument\n"
msgstr ""
-#: posix/getopt.c:883
+#: posix/getopt.c:881
#, c-format
msgid "%s: option `-W %s' doesn't allow an argument\n"
msgstr ""
-#: posix/getopt.c:865
+#: posix/getopt.c:863
#, c-format
msgid "%s: option `-W %s' is ambiguous\n"
msgstr ""
-#: posix/getopt.c:818 posix/getopt.c:948
+#: posix/getopt.c:816 posix/getopt.c:946
#, c-format
msgid "%s: option requires an argument -- %c\n"
msgstr ""
-#: time/zic.c:834 time/zic.c:1246 time/zic.c:1266
+#: time/zic.c:838 time/zic.c:1251 time/zic.c:1275
#, c-format
msgid "%s: panic: Invalid l_value %d\n"
msgstr ""
-#: locale/programs/charmap.c:600
+#: locale/programs/charmap.c:668
#, c-format
msgid "%s: premature end of file"
msgstr ""
-#: posix/getopt.c:759
+#: posix/getopt.c:757
#, c-format
msgid "%s: unrecognized option `%c%s'\n"
msgstr ""
-#: posix/getopt.c:755
+#: posix/getopt.c:753
#, c-format
msgid "%s: unrecognized option `--%s'\n"
msgstr ""
-#: time/zic.c:441
+#: time/zic.c:443
#, c-format
msgid ""
"%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d "
@@ -338,7 +343,15 @@ msgstr ""
msgid "%s: usage is %s [ -v ] [ -c cutoff ] zonename ...\n"
msgstr ""
-#: nis/nis_print.c:290
+#: argp/argp-parse.c:164
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr ""
+
+#: argp/argp-parse.c:776
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr ""
+
+#: nis/nis_print.c:110
msgid "(Unknown object)\n"
msgstr ""
@@ -347,7 +360,7 @@ msgstr ""
msgid "(unknown authentication error - %d)"
msgstr ""
-#: sunrpc/rpcinfo.c:616
+#: sunrpc/rpcinfo.c:612
msgid "(unknown)"
msgstr ""
@@ -411,7 +424,7 @@ msgstr ""
msgid "Aborted"
msgstr ""
-#: nis/nis_print.c:250
+#: nis/nis_print.c:288
msgid "Access Rights : "
msgstr ""
@@ -451,7 +464,7 @@ msgstr ""
msgid "Argument list too long"
msgstr ""
-#: nis/nis_error.c:65
+#: nis/nis_error.c:66
msgid "Attempt to remove a non-empty table"
msgstr ""
@@ -459,11 +472,6 @@ msgstr ""
msgid "Attempting to link in too many shared libraries"
msgstr ""
-#: nis/nis_print.c:221
-#, c-format
-msgid "Attributes : %d\n"
-msgstr ""
-
#: sunrpc/clnt_perr.c:273
msgid "Authentication OK"
msgstr ""
@@ -473,7 +481,7 @@ msgstr ""
msgid "Authentication error"
msgstr ""
-#: nis/nis_print.c:259
+#: nis/nis_print.c:86
msgid "BOGUS OBJECT\n"
msgstr ""
@@ -507,11 +515,11 @@ msgstr ""
msgid "Bad value for ai_flags"
msgstr ""
-#: locale/programs/localedef.c:109
+#: locale/programs/localedef.c:108
msgid "Be strictly POSIX conform"
msgstr ""
-#: nis/nis_print.c:237
+#: nis/nis_print.c:275
msgid "Binary data\n"
msgstr ""
@@ -522,7 +530,7 @@ msgstr ""
msgid "Block device required"
msgstr ""
-#: sunrpc/pmap_rmt.c:356
+#: sunrpc/pmap_rmt.c:357
msgid "Broadcast select problem"
msgstr ""
@@ -542,7 +550,7 @@ msgstr ""
msgid "Bus error"
msgstr ""
-#: nis/nis_print.c:44
+#: nis/nis_print.c:46
msgid "CDS"
msgstr ""
@@ -550,7 +558,7 @@ msgstr ""
msgid "CPU time limit exceeded"
msgstr ""
-#: nis/nis_error.c:32
+#: nis/nis_error.c:33
msgid "Cache expired"
msgstr ""
@@ -558,19 +566,19 @@ msgstr ""
msgid "Can not access a needed shared library"
msgstr ""
-#: nis/ypclnt.c:697
+#: nis/ypclnt.c:703
msgid "Can't bind to server which serves this domain"
msgstr ""
-#: nis/ypclnt.c:709
+#: nis/ypclnt.c:715
msgid "Can't communicate with portmapper"
msgstr ""
-#: nis/ypclnt.c:711
+#: nis/ypclnt.c:717
msgid "Can't communicate with ypbind"
msgstr ""
-#: nis/ypclnt.c:713
+#: nis/ypclnt.c:719
msgid "Can't communicate with ypserv"
msgstr ""
@@ -587,7 +595,7 @@ msgstr ""
msgid "Cannot assign requested address"
msgstr ""
-#: sunrpc/pmap_rmt.c:266
+#: sunrpc/pmap_rmt.c:267
msgid "Cannot create socket for broadcast rpc"
msgstr ""
@@ -595,7 +603,7 @@ msgstr ""
msgid "Cannot exec a shared library directly"
msgstr ""
-#: sunrpc/pmap_rmt.c:369
+#: sunrpc/pmap_rmt.c:370
msgid "Cannot receive reply to broadcast"
msgstr ""
@@ -608,11 +616,11 @@ msgstr ""
msgid "Cannot send after transport endpoint shutdown"
msgstr ""
-#: sunrpc/pmap_rmt.c:329
+#: sunrpc/pmap_rmt.c:330
msgid "Cannot send broadcast packet"
msgstr ""
-#: sunrpc/pmap_rmt.c:273
+#: sunrpc/pmap_rmt.c:274
msgid "Cannot set socket option SO_BROADCAST"
msgstr ""
@@ -620,7 +628,7 @@ msgstr ""
msgid "Channel number out of range"
msgstr ""
-#: nis/nis_print.c:201
+#: nis/nis_print.c:238
#, c-format
msgid "Character Separator : %c\n"
msgstr ""
@@ -634,7 +642,7 @@ msgstr ""
msgid "Client credential too weak"
msgstr ""
-#: nis/nis_print.c:203
+#: nis/nis_print.c:240
msgid "Columns :\n"
msgstr ""
@@ -642,7 +650,7 @@ msgstr ""
msgid "Communication error on send"
msgstr ""
-#: locale/programs/localedef.c:117
+#: locale/programs/localedef.c:116
msgid "Compile locale specification"
msgstr ""
@@ -687,8 +695,8 @@ msgstr ""
msgid "Convert key to lower case"
msgstr ""
-#: catgets/gencat.c:235 db/makedb.c:230 locale/programs/locale.c:267
-#: locale/programs/localedef.c:392
+#: catgets/gencat.c:235 db/makedb.c:231 locale/programs/locale.c:267
+#: locale/programs/localedef.c:395
#, c-format
msgid ""
"Copyright (C) %s Free Software Foundation, Inc.\n"
@@ -704,7 +712,7 @@ msgstr ""
msgid "Create C header file NAME containing symbol definitions"
msgstr ""
-#: locale/programs/localedef.c:108
+#: locale/programs/localedef.c:107
msgid "Create output even if warning messages were issued"
msgstr ""
@@ -712,36 +720,42 @@ msgstr ""
msgid "Create simple DB database from textual input."
msgstr ""
-#: nis/nis_print.c:253
+#: nis/nis_print.c:291
#, c-format
msgid "Creation Time : %s"
msgstr ""
-#: nis/nis_print.c:123
+#: nis/nss_nisplus/nisplus-publickey.c:91
+#: nis/nss_nisplus/nisplus-publickey.c:161
+#, c-format
+msgid "DES entry for netname %s not unique\n"
+msgstr ""
+
+#: nis/nis_print.c:160
msgid "DH.\n"
msgstr ""
-#: nis/nis_print.c:265
+#: nis/nis_print.c:92
msgid "DIRECTORY\n"
msgstr ""
-#: nis/nis_print.c:40
+#: nis/nis_print.c:42
msgid "DNANS"
msgstr ""
-#: nis/nis_print.c:36
+#: nis/nis_print.c:38
msgid "DNS"
msgstr ""
-#: nis/nis_error.c:51
+#: nis/nis_error.c:52
msgid "Database for table does not exist"
msgstr ""
-#: nis/ypclnt.c:723
+#: nis/ypclnt.c:729
msgid "Database is busy"
msgstr ""
-#: nis/nis_print.c:172
+#: nis/nis_print.c:209
msgid "Default Access rights: "
msgstr ""
@@ -772,7 +786,7 @@ msgstr ""
msgid "Device or resource busy"
msgstr ""
-#: nis/nis_print.c:247
+#: nis/nis_print.c:285
#, c-format
msgid "Directory : %s\n"
msgstr ""
@@ -796,7 +810,7 @@ msgstr ""
msgid "Do not use existing catalog, force new output file"
msgstr ""
-#: nis/ypclnt.c:769
+#: nis/ypclnt.c:775
msgid "Domain not bound"
msgstr ""
@@ -805,15 +819,15 @@ msgstr ""
msgid "EMT trap"
msgstr ""
-#: nis/nis_print.c:277
+#: nis/nis_print.c:101
msgid "ENTRY\n"
msgstr ""
-#: nis/nis_print.c:235
+#: nis/nis_print.c:273
msgid "Encrypted data\n"
msgstr ""
-#: nis/nis_error.c:52
+#: nis/nis_error.c:53
msgid "Entry/Table type mismatch"
msgstr ""
@@ -822,11 +836,11 @@ msgstr ""
msgid "Error %d"
msgstr ""
-#: nis/nis_error.c:56
+#: nis/nis_error.c:57
msgid "Error in RPC subsystem"
msgstr ""
-#: nis/nis_error.c:66
+#: nis/nis_error.c:67
msgid "Error in accessing NIS+ cold start file. Is NIS+ installed?"
msgstr ""
@@ -834,7 +848,7 @@ msgstr ""
msgid "Error in unknown error system: "
msgstr ""
-#: nis/nis_error.c:59
+#: nis/nis_error.c:60
msgid "Error while talking to callback proc"
msgstr ""
@@ -842,10 +856,6 @@ msgstr ""
msgid "Error: .netrc file is readable by others."
msgstr ""
-#: nis/nis_call.c:180
-msgid "Error: could not find a NIS_COLD_START file\n"
-msgstr ""
-
#: stdio-common/../sysdeps/gnu/errlist.c:698
msgid "Exchange full"
msgstr ""
@@ -898,7 +908,7 @@ msgstr ""
msgid "Filesize limit exceeded"
msgstr ""
-#: nis/nis_error.c:37
+#: nis/nis_error.c:38
msgid "First/Next chain broken"
msgstr ""
@@ -907,7 +917,7 @@ msgstr ""
msgid "Floating point exception"
msgstr ""
-#: nis/nis_error.c:67
+#: nis/nis_error.c:68
msgid "Full resync required for directory"
msgstr ""
@@ -918,7 +928,7 @@ msgstr ""
msgid "Function not implemented"
msgstr ""
-#: nis/nis_print.c:269
+#: nis/nis_print.c:95
msgid "GROUP\n"
msgstr ""
@@ -934,7 +944,7 @@ msgid ""
"is -, output is written to standard output.\n"
msgstr ""
-#: nis/nis_error.c:36
+#: nis/nis_error.c:37
msgid "Generic system error"
msgstr ""
@@ -942,20 +952,32 @@ msgstr ""
msgid "Get locale-specific information."
msgstr ""
+#: argp/argp-parse.c:89
+msgid "Give a short usage message"
+msgstr ""
+
+#: argp/argp-parse.c:88
+msgid "Give this help list"
+msgstr ""
+
#. TRANS This error code has no purpose.
#: stdio-common/../sysdeps/gnu/errlist.c:606
msgid "Gratuitous error"
msgstr ""
-#: nis/nis_print.c:249
+#: nis/nis_print.c:287
#, c-format
msgid "Group : %s\n"
msgstr ""
-#: nis/nis_print.c:185
+#: nis/nis_print.c:222
msgid "Group Flags :"
msgstr ""
+#: argp/argp-parse.c:92
+msgid "Hang for SECS seconds (default 3600)"
+msgstr ""
+
#: stdio-common/../sysdeps/unix/siglist.c:30
#: sysdeps/unix/sysv/linux/siglist.h:22
msgid "Hangup"
@@ -986,7 +1008,7 @@ msgstr ""
msgid "IOT trap"
msgstr ""
-#: nis/nis_print.c:34
+#: nis/nis_print.c:36
msgid "IVY"
msgstr ""
@@ -1002,7 +1024,7 @@ msgstr ""
msgid "Illegal instruction"
msgstr ""
-#: nis/nis_error.c:61
+#: nis/nis_error.c:62
msgid "Illegal object type for operation"
msgstr ""
@@ -1040,7 +1062,7 @@ msgstr ""
msgid "Information request"
msgstr ""
-#: locale/programs/localedef.c:99
+#: locale/programs/localedef.c:98
msgid "Input Files:"
msgstr ""
@@ -1049,11 +1071,11 @@ msgstr ""
msgid "Input/output error"
msgstr ""
-#: nis/ypclnt.c:703
+#: nis/ypclnt.c:709
msgid "Internal NIS error"
msgstr ""
-#: nis/ypclnt.c:767
+#: nis/ypclnt.c:773
msgid "Internal ypbind error"
msgstr ""
@@ -1077,7 +1099,7 @@ msgstr ""
msgid "Interrupted system call should be restarted"
msgstr ""
-#: nis/nis_error.c:44
+#: nis/nis_error.c:45
msgid "Invalid Object for operation"
msgstr ""
@@ -1087,11 +1109,11 @@ msgstr ""
msgid "Invalid argument"
msgstr ""
-#: posix/regex.c:960
+#: posix/regex.c:978
msgid "Invalid back reference"
msgstr ""
-#: posix/regex.c:958
+#: posix/regex.c:976
msgid "Invalid character class name"
msgstr ""
@@ -1103,11 +1125,11 @@ msgstr ""
msgid "Invalid client verifier"
msgstr ""
-#: posix/regex.c:957
+#: posix/regex.c:975
msgid "Invalid collation character"
msgstr ""
-#: posix/regex.c:964
+#: posix/regex.c:982
msgid "Invalid content of \\{\\}"
msgstr ""
@@ -1128,15 +1150,15 @@ msgstr ""
msgid "Invalid or incomplete multibyte or wide character"
msgstr ""
-#: posix/regex.c:967
+#: posix/regex.c:985
msgid "Invalid preceding regular expression"
msgstr ""
-#: posix/regex.c:965
+#: posix/regex.c:983
msgid "Invalid range end"
msgstr ""
-#: posix/regex.c:956
+#: posix/regex.c:974
msgid "Invalid regular expression"
msgstr ""
@@ -1166,7 +1188,7 @@ msgstr ""
msgid "Is a named type file"
msgstr ""
-#: nis/nis_print.c:129
+#: nis/nis_print.c:166
msgid "Kerberous.\n"
msgstr ""
@@ -1175,11 +1197,11 @@ msgstr ""
msgid "Killed"
msgstr ""
-#: nis/nis_print.c:281
+#: nis/nis_print.c:104
msgid "LINK\n"
msgstr ""
-#: nis/nis_local_names.c:125
+#: nis/nis_local_names.c:126
#, c-format
msgid "LOCAL entry for UID %d in directory %s not unique\n"
msgstr ""
@@ -1200,7 +1222,7 @@ msgstr ""
msgid "Level 3 reset"
msgstr ""
-#: nis/nis_error.c:53
+#: nis/nis_error.c:54
msgid "Link Points to illegal name"
msgstr ""
@@ -1212,11 +1234,20 @@ msgstr ""
msgid "Link number out of range"
msgstr ""
-#: nis/ypclnt.c:715
+#: nis/nis_print.c:256
+msgid "Linked Object Type : "
+msgstr ""
+
+#: nis/nis_print.c:258
+#, c-format
+msgid "Linked to : %s\n"
+msgstr ""
+
+#: nis/ypclnt.c:721
msgid "Local domain name not set"
msgstr ""
-#: nis/ypclnt.c:705
+#: nis/ypclnt.c:711
msgid "Local resource allocation failure"
msgstr ""
@@ -1224,21 +1255,21 @@ msgstr ""
msgid "Machine is not on the network"
msgstr ""
-#: nis/nis_error.c:45
+#: nis/nis_error.c:46
msgid "Malformed Name, or illegal name"
msgstr ""
-#: argp/argp-help.c:1132
+#: argp/argp-help.c:1135
msgid ""
"Mandatory or optional arguments to long options are also mandatory or "
"optional for any corresponding short options."
msgstr ""
-#: nis/nis_print.c:112
+#: nis/nis_print.c:149
msgid "Master Server :\n"
msgstr ""
-#: nis/nis_error.c:75
+#: nis/nis_error.c:76
msgid "Master server busy, full dump rescheduled."
msgstr ""
@@ -1246,7 +1277,7 @@ msgstr ""
msgid "Memory allocation failure"
msgstr ""
-#: posix/regex.c:966
+#: posix/regex.c:984
msgid "Memory exhausted"
msgstr ""
@@ -1256,20 +1287,20 @@ msgstr ""
msgid "Message too long"
msgstr ""
-#: nis/nis_error.c:57
+#: nis/nis_error.c:58
msgid "Missing or malformed attribute"
msgstr ""
-#: nis/nis_print.c:254
+#: nis/nis_print.c:292
#, c-format
msgid "Mod. Time : %s"
msgstr ""
-#: nis/nis_error.c:50
+#: nis/nis_error.c:51
msgid "Modification failed"
msgstr ""
-#: nis/nis_error.c:63
+#: nis/nis_error.c:64
msgid "Modify operation failed"
msgstr ""
@@ -1282,7 +1313,7 @@ msgid "Multihop attempted"
msgstr ""
#: catgets/gencat.c:106 catgets/gencat.c:110 db/makedb.c:58
-#: locale/programs/localedef.c:120
+#: locale/programs/localedef.c:119
msgid "NAME"
msgstr ""
@@ -1292,45 +1323,48 @@ msgid ""
"[-a|-m]"
msgstr ""
-#: nis/nis_print.c:30
+#: nis/nis_print.c:32
msgid "NIS"
msgstr ""
-#: nis/ypclnt.c:719
+#: nis/ypclnt.c:725
msgid "NIS client/server version mismatch - can't supply service"
msgstr ""
-#: nis/ypclnt.c:717
+#: nis/ypclnt.c:723
msgid "NIS map data base is bad"
msgstr ""
-#: nis/nis_error.c:68
+#: nis/nis_error.c:69
msgid "NIS+ operation failed"
msgstr ""
-#: nis/nis_error.c:33
+#: nis/nis_error.c:34
msgid "NIS+ servers unreachable"
msgstr ""
-#: nis/nis_error.c:69
+#: nis/nis_error.c:70
msgid "NIS+ service is unavailable or not installed"
msgstr ""
-#: nis/nis_print.c:262
-msgid "NO OBJECT\n"
+#: nis/nis_cache.c:111 nis/nis_cache.c:177 nis/nis_cache.c:185
+msgid "NIS+: cache file is corrupt!"
msgstr ""
-#: nis/nis_print.c:220
-#, c-format
-msgid "Name : %s\n"
+#: nis/nis_cache.c:254
+msgid "NIS+: nis_cachemgr failed to refresh object for us"
+msgstr ""
+
+#: nis/nis_print.c:89
+msgid "NO OBJECT\n"
msgstr ""
-#: nis/nis_print.c:106
+#: nis/nis_print.c:143
#, c-format
msgid "Name : '%s'\n"
msgstr ""
-#: nis/nis_error.c:40
+#: nis/nis_error.c:41
msgid "Name not served by this server"
msgstr ""
@@ -1342,11 +1376,11 @@ msgstr ""
msgid "Name or service not known"
msgstr ""
-#: nis/nis_error.c:49
+#: nis/nis_error.c:50
msgid "Name/entry isn't unique"
msgstr ""
-#: nis/nis_error.c:58
+#: nis/nis_error.c:59
msgid "Named object is not searchable"
msgstr ""
@@ -1409,7 +1443,7 @@ msgstr ""
msgid "No data available"
msgstr ""
-#: nis/nis_error.c:73
+#: nis/nis_error.c:74
msgid "No file space on server"
msgstr ""
@@ -1421,23 +1455,27 @@ msgstr ""
msgid "No locks available"
msgstr ""
-#: posix/regex.c:955
+#: posix/regex.c:973
msgid "No match"
msgstr ""
+#: stdio-common/../sysdeps/gnu/errlist.c:802
+msgid "No medium found"
+msgstr ""
+
#: stdio-common/../sysdeps/gnu/errlist.c:630
msgid "No message of desired type"
msgstr ""
-#: nis/ypclnt.c:707
+#: nis/ypclnt.c:713
msgid "No more records in map database"
msgstr ""
-#: posix/regex.c:5324
+#: posix/regex.c:5436
msgid "No previous regular expression"
msgstr ""
-#: sunrpc/rpcinfo.c:573
+#: sunrpc/rpcinfo.c:569
msgid "No remote programs registered.\n"
msgstr ""
@@ -1459,11 +1497,11 @@ msgstr ""
msgid "No such file or directory"
msgstr ""
-#: nis/ypclnt.c:701
+#: nis/ypclnt.c:707
msgid "No such key in map"
msgstr ""
-#: nis/ypclnt.c:699
+#: nis/ypclnt.c:705
msgid "No such map in server's domain"
msgstr ""
@@ -1472,11 +1510,7 @@ msgstr ""
msgid "No such process"
msgstr ""
-#: argp/argp-parse.c:163
-msgid "No version known!?"
-msgstr ""
-
-#: nis/nis_error.c:60
+#: nis/nis_error.c:61
msgid "Non NIS+ namespace encountered"
msgstr ""
@@ -1484,11 +1518,11 @@ msgstr ""
msgid "Non-recoverable failure in name resolution"
msgstr ""
-#: nis/nis_print.c:120
+#: nis/nis_print.c:157
msgid "None.\n"
msgstr ""
-#: nis/nis_error.c:48
+#: nis/nis_error.c:49
msgid "Not Found, no such name"
msgstr ""
@@ -1501,24 +1535,24 @@ msgstr ""
msgid "Not a directory"
msgstr ""
-#: nis/nis_error.c:30
+#: nis/nis_error.c:31
msgid "Not found"
msgstr ""
-#: nis/nis_error.c:43
+#: nis/nis_error.c:44
msgid "Not master server for this domain"
msgstr ""
-#: nis/nis_error.c:39
+#: nis/nis_error.c:40
msgid "Not owner"
msgstr ""
-#: nis/nis_print.c:200
+#: nis/nis_print.c:237
#, c-format
msgid "Number of Columns : %d\n"
msgstr ""
-#: nis/nis_print.c:301
+#: nis/nis_print.c:327
#, c-format
msgid "Number of objects : %u\n"
msgstr ""
@@ -1535,17 +1569,17 @@ msgstr ""
msgid "Numerical result out of range"
msgstr ""
-#: nis/nis_print.c:305
+#: nis/nis_print.c:331
#, c-format
msgid "Object #%d:\n"
msgstr ""
-#: nis/nis_print.c:246
+#: nis/nis_print.c:284
#, c-format
msgid "Object Name : %s\n"
msgstr ""
-#: nis/nis_print.c:255
+#: nis/nis_print.c:293
msgid "Object Type : "
msgstr ""
@@ -1557,11 +1591,11 @@ msgstr ""
msgid "Object is remote"
msgstr ""
-#: nis/nis_error.c:42
+#: nis/nis_error.c:43
msgid "Object with same name exists"
msgstr ""
-#: time/zic.c:1966
+#: time/zic.c:1979
msgid "Odd number of quotation marks"
msgstr ""
@@ -1618,16 +1652,16 @@ msgstr ""
msgid "Out of streams resources"
msgstr ""
-#: locale/programs/localedef.c:106
+#: locale/programs/localedef.c:105
msgid "Output control:"
msgstr ""
-#: nis/nis_print.c:248
+#: nis/nis_print.c:286
#, c-format
msgid "Owner : %s\n"
msgstr ""
-#: nis/nis_print.c:285
+#: nis/nis_print.c:107
msgid "PRIVATE\n"
msgstr ""
@@ -1635,16 +1669,16 @@ msgstr ""
msgid "Package not installed"
msgstr ""
-#: nis/nis_error.c:54
+#: nis/nis_error.c:55
msgid "Partial Success"
msgstr ""
-#: nis/nis_error.c:62
+#: nis/nis_error.c:63
msgid "Passed object is not the same object on server"
msgstr ""
#. TRANS Permission denied; the file permissions do not allow the attempted operation.
-#: nis/nis_error.c:38 nis/ypclnt.c:721
+#: nis/nis_error.c:39 nis/ypclnt.c:727
#: stdio-common/../sysdeps/gnu/errlist.c:96
msgid "Permission denied"
msgstr ""
@@ -1653,7 +1687,7 @@ msgstr ""
msgid "Power failure"
msgstr ""
-#: posix/regex.c:968
+#: posix/regex.c:986
msgid "Premature end of regular expression"
msgstr ""
@@ -1661,15 +1695,19 @@ msgstr ""
msgid "Print content of database file, one entry a line"
msgstr ""
-#: locale/programs/localedef.c:112
+#: locale/programs/localedef.c:111
msgid "Print more messages"
msgstr ""
-#: nis/nis_error.c:29
+#: argp/argp-parse.c:149
+msgid "Print program version"
+msgstr ""
+
+#: nis/nis_error.c:30
msgid "Probable success"
msgstr ""
-#: nis/nis_error.c:31
+#: nis/nis_error.c:32
msgid "Probably not found"
msgstr ""
@@ -1709,7 +1747,7 @@ msgstr ""
msgid "Protocol wrong type for socket"
msgstr ""
-#: nis/nis_error.c:64
+#: nis/nis_error.c:65
msgid "Query illegal for named table"
msgstr ""
@@ -1727,7 +1765,7 @@ msgstr ""
msgid "RPC bad procedure for program"
msgstr ""
-#: nis/ypclnt.c:695
+#: nis/ypclnt.c:701
msgid "RPC failure on NIS operation"
msgstr ""
@@ -1827,11 +1865,11 @@ msgstr ""
msgid "RPC: Unknown protocol"
msgstr ""
-#: nis/nis_print.c:126
+#: nis/nis_print.c:163
msgid "RSA.\n"
msgstr ""
-#: elf/dlsym.c:49 elf/dlvsym.c:52
+#: elf/dlsym.c:61 elf/dlvsym.c:63
msgid "RTLD_NEXT used in code not dynamically loaded"
msgstr ""
@@ -1840,7 +1878,7 @@ msgstr ""
msgid "Read-only file system"
msgstr ""
-#: posix/regex.c:969
+#: posix/regex.c:987
msgid "Regular expression too big"
msgstr ""
@@ -1856,21 +1894,21 @@ msgstr ""
msgid "Remove password or make file unreadable by others."
msgstr ""
-#: nis/nis_print.c:114
+#: nis/nis_print.c:151
msgid "Replicate :\n"
msgstr ""
-#: argp/argp-help.c:1565
+#: argp/argp-help.c:1572
#, c-format
msgid "Report bugs to %s.\n"
msgstr ""
-#: catgets/gencat.c:222 db/makedb.c:217 locale/programs/locale.c:254
-#: locale/programs/localedef.c:378
+#: catgets/gencat.c:222 db/makedb.c:218 locale/programs/locale.c:254
+#: locale/programs/localedef.c:381
msgid "Report bugs using the `glibcbug' script to <bugs@gnu.ai.mit.edu>.\n"
msgstr ""
-#: nis/ypclnt.c:693
+#: nis/ypclnt.c:699
msgid "Request arguments bad"
msgstr ""
@@ -1908,7 +1946,7 @@ msgstr ""
#. TRANS connect (whatever the operation). You can use @code{select} to find out
#. TRANS when the operation will be possible; @pxref{Waiting for I/O}.
#. TRANS
-#. TRANS @strong{Portability Note:} In older Unix many systems, this condition
+#. TRANS @strong{Portability Note:} In many older Unix systems, this condition
#. TRANS was indicated by @code{EWOULDBLOCK}, which was a distinct error code
#. TRANS different from @code{EAGAIN}. To make your program portable, you should
#. TRANS check for both codes and treat them the same.
@@ -1927,15 +1965,15 @@ msgstr ""
msgid "Resource temporarily unavailable"
msgstr ""
-#: nis/nis_error.c:47
+#: nis/nis_error.c:48
msgid "Results Sent to callback proc"
msgstr ""
-#: nis/nis_print.c:32
+#: nis/nis_print.c:34
msgid "SUNYP"
msgstr ""
-#: nis/nis_print.c:202
+#: nis/nis_print.c:239
#, c-format
msgid "Search Path : %s\n"
msgstr ""
@@ -1945,11 +1983,11 @@ msgstr ""
msgid "Segmentation fault"
msgstr ""
-#: nis/nis_error.c:35
+#: nis/nis_error.c:36
msgid "Server busy, try again"
msgstr ""
-#: nis/nis_error.c:41
+#: nis/nis_error.c:42
msgid "Server out of memory"
msgstr ""
@@ -1965,6 +2003,10 @@ msgstr ""
msgid "Servname not supported for ai_socktype"
msgstr ""
+#: argp/argp-parse.c:90
+msgid "Set the program name"
+msgstr ""
+
#: stdio-common/../sysdeps/unix/siglist.c:29
msgid "Signal 0"
msgstr ""
@@ -1984,11 +2026,15 @@ msgstr ""
msgid "Software caused connection abort"
msgstr ""
-#: locale/programs/localedef.c:102
+#: sunrpc/rpcinfo.c:657
+msgid "Sorry. You are not root\n"
+msgstr ""
+
+#: locale/programs/localedef.c:101
msgid "Source definitions are found in FILE"
msgstr ""
-#: locale/programs/localedef.c:104
+#: locale/programs/localedef.c:103
msgid "Specify code set for mapping ISO 10646 elements"
msgstr ""
@@ -2008,7 +2054,7 @@ msgstr ""
msgid "Stale NFS file handle"
msgstr ""
-#: nis/nis_print.c:300
+#: nis/nis_print.c:326
#, c-format
msgid "Status : %s\n"
msgstr ""
@@ -2041,16 +2087,16 @@ msgstr ""
msgid "Structure needs cleaning"
msgstr ""
-#: nis/nis_error.c:28 nis/ypclnt.c:691 nis/ypclnt.c:765 posix/regex.c:954
+#: nis/nis_error.c:29 nis/ypclnt.c:697 nis/ypclnt.c:771 posix/regex.c:972
#: stdio-common/../sysdeps/gnu/errlist.c:7
msgid "Success"
msgstr ""
-#: locale/programs/localedef.c:111
+#: locale/programs/localedef.c:110
msgid "Suppress warnings and information messages"
msgstr ""
-#: locale/programs/localedef.c:101
+#: locale/programs/localedef.c:100
msgid "Symbolic character names defined in FILE"
msgstr ""
@@ -2062,11 +2108,11 @@ msgstr ""
msgid "System information:"
msgstr ""
-#: nis/ypclnt.c:771
+#: nis/ypclnt.c:777
msgid "System resource allocation failure"
msgstr ""
-#: locale/programs/localedef.c:374
+#: locale/programs/localedef.c:377
#, c-format
msgid ""
"System's directory for character maps: %s\n"
@@ -2074,11 +2120,11 @@ msgid ""
"%s"
msgstr ""
-#: nis/nis_print.c:273
+#: nis/nis_print.c:98
msgid "TABLE\n"
msgstr ""
-#: nis/nis_print.c:199
+#: nis/nis_print.c:236
#, c-format
msgid "Table Type : %s\n"
msgstr ""
@@ -2101,7 +2147,7 @@ msgstr ""
msgid "Text file busy"
msgstr ""
-#: nis/nis_print.c:164
+#: nis/nis_print.c:201
#, c-format
msgid "Time to live : %s\n"
msgstr ""
@@ -2110,7 +2156,7 @@ msgstr ""
msgid "Timer expired"
msgstr ""
-#: nis/nis_error.c:55
+#: nis/nis_error.c:56
msgid "Too Many Attributes"
msgstr ""
@@ -2171,7 +2217,7 @@ msgstr ""
msgid "Trace/breakpoint trap"
msgstr ""
-#: posix/regex.c:959
+#: posix/regex.c:977
msgid "Trailing backslash"
msgstr ""
@@ -2196,7 +2242,7 @@ msgstr ""
msgid "Transport endpoint is not connected"
msgstr ""
-#: argp/argp-help.c:1538
+#: argp/argp-help.c:1545
#, c-format
msgid "Try `%s --help' or `%s --usage' for more information.\n"
msgstr ""
@@ -2206,33 +2252,28 @@ msgstr ""
msgid "Trying %s...\n"
msgstr ""
-#: nis/nis_print.c:219
-#, c-format
-msgid "Type : %d\n"
-msgstr ""
-
-#: nis/nis_print.c:107
+#: nis/nis_print.c:144
#, c-format
msgid "Type : %s\n"
msgstr ""
-#: nis/nis_print.c:46
+#: nis/nis_print.c:48
msgid "UNKNOWN"
msgstr ""
-#: nis/nis_error.c:72
+#: nis/nis_error.c:73
msgid "Unable to authenticate NIS+ client"
msgstr ""
-#: nis/nis_error.c:71
+#: nis/nis_error.c:72
msgid "Unable to authenticate NIS+ server"
msgstr ""
-#: nis/nis_error.c:46
+#: nis/nis_error.c:47
msgid "Unable to create callback"
msgstr ""
-#: nis/nis_error.c:74
+#: nis/nis_error.c:75
msgid "Unable to create process on server"
msgstr ""
@@ -2241,7 +2282,7 @@ msgstr ""
msgid "Unknown .netrc keyword %s"
msgstr ""
-#: nis/ypclnt.c:725
+#: nis/ypclnt.c:731
msgid "Unknown NIS error code"
msgstr ""
@@ -2258,7 +2299,7 @@ msgstr ""
msgid "Unknown host"
msgstr ""
-#: nis/nis_error.c:34
+#: nis/nis_error.c:35
msgid "Unknown object"
msgstr ""
@@ -2279,27 +2320,27 @@ msgstr ""
msgid "Unknown system error"
msgstr ""
-#: nis/ypclnt.c:773
+#: nis/ypclnt.c:779
msgid "Unknown ypbind error"
msgstr ""
-#: nis/nis_print.c:132
+#: nis/nis_print.c:169
msgid "Unknown.\n"
msgstr ""
-#: posix/regex.c:962
+#: posix/regex.c:980
msgid "Unmatched ( or \\("
msgstr ""
-#: posix/regex.c:970
+#: posix/regex.c:988
msgid "Unmatched ) or \\)"
msgstr ""
-#: posix/regex.c:961
+#: posix/regex.c:979
msgid "Unmatched [ or [^"
msgstr ""
-#: posix/regex.c:963
+#: posix/regex.c:981
msgid "Unmatched \\{"
msgstr ""
@@ -2318,7 +2359,7 @@ msgstr ""
msgid "Usage: %s variable_name [pathname]\n"
msgstr ""
-#: sunrpc/rpcinfo.c:677
+#: sunrpc/rpcinfo.c:673
msgid "Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]\n"
msgstr ""
@@ -2341,7 +2382,7 @@ msgstr ""
msgid "Virtual timer expired"
msgstr ""
-#: time/zic.c:1871
+#: time/zic.c:1884
msgid "Wild result from command execution"
msgstr ""
@@ -2370,38 +2411,42 @@ msgstr ""
msgid "Write output to file NAME"
msgstr ""
-#: catgets/gencat.c:240 db/makedb.c:235 locale/programs/locale.c:272
-#: locale/programs/localedef.c:397
+#: catgets/gencat.c:240 db/makedb.c:236 locale/programs/locale.c:272
+#: locale/programs/localedef.c:400
#, c-format
msgid "Written by %s.\n"
msgstr ""
-#: nis/nis_print.c:38
+#: stdio-common/../sysdeps/gnu/errlist.c:806
+msgid "Wrong medium type"
+msgstr ""
+
+#: nis/nis_print.c:40
msgid "X500"
msgstr ""
-#: nis/nis_print.c:42
+#: nis/nis_print.c:44
msgid "XCHS"
msgstr ""
-#: nis/ypclnt.c:142
+#: nis/ypclnt.c:147
msgid "YPBINDPROC_DOMAIN: Internal error\n"
msgstr ""
-#: nis/ypclnt.c:146
+#: nis/ypclnt.c:151
#, c-format
msgid "YPBINDPROC_DOMAIN: No server for domain %s\n"
msgstr ""
-#: nis/ypclnt.c:150
+#: nis/ypclnt.c:155
msgid "YPBINDPROC_DOMAIN: Resource allocation failure\n"
msgstr ""
-#: nis/ypclnt.c:154
+#: nis/ypclnt.c:159
msgid "YPBINDPROC_DOMAIN: Unknown error\n"
msgstr ""
-#: nis/nis_error.c:70
+#: nis/nis_error.c:71
msgid "Yes, 42 is the meaning of life"
msgstr ""
@@ -2410,17 +2455,11 @@ msgstr ""
msgid "You really blew it this time"
msgstr ""
-#: time/zic.c:1048
+#: time/zic.c:1052
msgid "Zone continuation line end time is not after end time of previous line"
msgstr ""
-#: nis/nis_server.c:36 nis/nis_server.c:48 nis/nis_server.c:68
-#: nis/nis_server.c:80
-#, c-format
-msgid "__do_niscall: Error #%d\n"
-msgstr ""
-
-#: locale/programs/charmap.c:397 locale/programs/locfile.c:363
+#: locale/programs/charmap.c:465 locale/programs/locfile.c:363
#, c-format
msgid "`%1$s' definition does not end with `END %1$s'"
msgstr ""
@@ -2451,7 +2490,7 @@ msgstr ""
msgid "ai_socktype not supported"
msgstr ""
-#: locale/programs/charmap.c:267
+#: locale/programs/charmap.c:335
#, c-format
msgid "argument to <%s> must be a single character"
msgstr ""
@@ -2473,15 +2512,15 @@ msgstr ""
msgid "bad .rhosts owner"
msgstr ""
-#: locale/programs/charmap.c:212 locale/programs/locfile.c:231
+#: locale/programs/charmap.c:280 locale/programs/locfile.c:231
msgid "bad argument"
msgstr ""
-#: time/zic.c:1170
+#: time/zic.c:1174
msgid "blank FROM field on Link line"
msgstr ""
-#: time/zic.c:1174
+#: time/zic.c:1178
msgid "blank TO field on Link line"
msgstr ""
@@ -2501,19 +2540,23 @@ msgstr ""
msgid "broadcast: ioctl (get interface flags)"
msgstr ""
-#: sunrpc/svc_udp.c:439
+#: login/programs/request.c:167
+msgid "buffer overflow"
+msgstr ""
+
+#: sunrpc/svc_udp.c:442
msgid "cache_set: could not allocate new rpc_buffer"
msgstr ""
-#: sunrpc/svc_udp.c:433
+#: sunrpc/svc_udp.c:436
msgid "cache_set: victim alloc failed"
msgstr ""
-#: sunrpc/svc_udp.c:422
+#: sunrpc/svc_udp.c:425
msgid "cache_set: victim not found"
msgstr ""
-#: time/zic.c:1698
+#: time/zic.c:1711
msgid "can't determine time zone abbreviation to use just after until time"
msgstr ""
@@ -2522,11 +2565,15 @@ msgstr ""
msgid "can't reassign procedure number %d\n"
msgstr ""
-#: locale/programs/localedef.c:271
+#: locale/programs/localedef.c:274
#, c-format
msgid "cannot `stat' locale file `%s'"
msgstr ""
+#: elf/dl-load.c:144
+msgid "cannot allocate name record"
+msgstr ""
+
#: locale/programs/ld-collate.c:1317
#, c-format
msgid "cannot insert collation element `%.*s'"
@@ -2541,12 +2588,12 @@ msgstr ""
msgid "cannot insert new collating symbol definition: %s"
msgstr ""
-#: db/makedb.c:142
+#: db/makedb.c:143
#, c-format
msgid "cannot open database file `%s': %s"
msgstr ""
-#: catgets/gencat.c:271 db/makedb.c:161
+#: catgets/gencat.c:271 db/makedb.c:162
#, c-format
msgid "cannot open input file `%s'"
msgstr ""
@@ -2556,12 +2603,12 @@ msgstr ""
msgid "cannot open locale definition file `%s'"
msgstr ""
-#: catgets/gencat.c:776 catgets/gencat.c:817 db/makedb.c:170
+#: catgets/gencat.c:776 catgets/gencat.c:817 db/makedb.c:171
#, c-format
msgid "cannot open output file `%s'"
msgstr ""
-#: locale/programs/locfile.c:1008
+#: locale/programs/locfile.c:1020
#, c-format
msgid "cannot open output file `%s' for category `%s'"
msgstr ""
@@ -2575,22 +2622,30 @@ msgstr ""
msgid "cannot read character map directory `%s'"
msgstr ""
+#: login/programs/request.c:91
+msgid "cannot read from client"
+msgstr ""
+
#: locale/programs/locale.c:306
#, c-format
msgid "cannot read locale directory `%s'"
msgstr ""
-#: locale/programs/localedef.c:293
+#: locale/programs/localedef.c:296
#, c-format
msgid "cannot read locale file `%s'"
msgstr ""
-#: locale/programs/localedef.c:318
+#: locale/programs/localedef.c:321
#, c-format
msgid "cannot write output files to `%s'"
msgstr ""
-#: locale/programs/localedef.c:431
+#: login/programs/request.c:120
+msgid "cannot write to client"
+msgstr ""
+
+#: locale/programs/localedef.c:434
msgid "category data requested more than once: should not happen"
msgstr ""
@@ -2628,7 +2683,7 @@ msgstr ""
msgid "character map `%s' already defined"
msgstr ""
-#: locale/programs/charmap.c:76
+#: locale/programs/charmap.c:77
#, c-format
msgid "character map file `%s' not found"
msgstr ""
@@ -2665,6 +2720,10 @@ msgstr ""
msgid "connect to address %s: "
msgstr ""
+#: elf/dl-load.c:128
+msgid "could not allocate name string"
+msgstr ""
+
#: sunrpc/svc_simple.c:78
msgid "couldn't create an rpc server\n"
msgstr ""
@@ -2674,7 +2733,7 @@ msgstr ""
msgid "couldn't register prog %d vers %d\n"
msgstr ""
-#: locale/programs/charmap.c:86
+#: locale/programs/charmap.c:154
#, c-format
msgid "default character map file `%s' not found"
msgstr ""
@@ -2707,7 +2766,7 @@ msgstr ""
msgid "duplicate definition for character `%.*s'"
msgstr ""
-#: db/makedb.c:314
+#: db/makedb.c:315
msgid "duplicate key"
msgstr ""
@@ -2715,7 +2774,7 @@ msgstr ""
msgid "duplicate set definition"
msgstr ""
-#: time/zic.c:963
+#: time/zic.c:967
#, c-format
msgid "duplicate zone name %s (file \"%s\", line %d)"
msgstr ""
@@ -2736,19 +2795,19 @@ msgstr ""
msgid "empty weight name: line ignored"
msgstr ""
-#: sunrpc/svc_udp.c:365
+#: sunrpc/svc_udp.c:368
msgid "enablecache: cache already enabled"
msgstr ""
-#: sunrpc/svc_udp.c:371
+#: sunrpc/svc_udp.c:374
msgid "enablecache: could not allocate cache"
msgstr ""
-#: sunrpc/svc_udp.c:379
+#: sunrpc/svc_udp.c:382
msgid "enablecache: could not allocate cache data"
msgstr ""
-#: sunrpc/svc_udp.c:386
+#: sunrpc/svc_udp.c:389
msgid "enablecache: could not allocate cache fifo"
msgstr ""
@@ -2768,16 +2827,16 @@ msgstr ""
msgid "expect string argument for `copy'"
msgstr ""
-#: time/zic.c:854
+#: time/zic.c:858
msgid "expected continuation line not found"
msgstr ""
-#: locale/programs/locfile.c:1032
+#: locale/programs/locfile.c:1044
#, c-format
msgid "failure while writing data for category `%s'"
msgstr ""
-#: nis/ypclnt.c:187
+#: nis/nis_cache.c:129 nis/nis_call.c:150 nis/ypclnt.c:195
msgid "fcntl: F_SETFD"
msgstr ""
@@ -2825,11 +2884,11 @@ msgstr ""
msgid "get_myaddress: ioctl (get interface configuration)"
msgstr ""
-#: time/zic.c:1147
+#: time/zic.c:1151
msgid "illegal CORRECTION field on Leap line"
msgstr ""
-#: time/zic.c:1151
+#: time/zic.c:1155
msgid "illegal Rolling/Stationary field on Leap line"
msgstr ""
@@ -2845,11 +2904,11 @@ msgstr ""
msgid "illegal collation element"
msgstr ""
-#: locale/programs/charmap.c:196
+#: locale/programs/charmap.c:264
msgid "illegal definition"
msgstr ""
-#: locale/programs/charmap.c:349
+#: locale/programs/charmap.c:417
msgid "illegal encoding given"
msgstr ""
@@ -2890,23 +2949,23 @@ msgstr ""
msgid "implementation limit: no more than %d character maps allowed"
msgstr ""
-#: db/makedb.c:144
+#: db/makedb.c:145
msgid "incorrectly formatted file"
msgstr ""
-#: time/zic.c:811
+#: time/zic.c:815
msgid "input line of unknown type"
msgstr ""
-#: time/zic.c:1760
+#: time/zic.c:1773
msgid "internal error - addtype called with bad isdst"
msgstr ""
-#: time/zic.c:1768
+#: time/zic.c:1781
msgid "internal error - addtype called with bad ttisgmt"
msgstr ""
-#: time/zic.c:1764
+#: time/zic.c:1777
msgid "internal error - addtype called with bad ttisstd"
msgstr ""
@@ -2915,43 +2974,43 @@ msgstr ""
msgid "internal error in %s, line %u"
msgstr ""
-#: time/zic.c:1019
+#: time/zic.c:1023
msgid "invalid GMT offset"
msgstr ""
-#: time/zic.c:1022
+#: time/zic.c:1026
msgid "invalid abbreviation format"
msgstr ""
-#: time/zic.c:1112 time/zic.c:1313 time/zic.c:1327
+#: time/zic.c:1116 time/zic.c:1326 time/zic.c:1340
msgid "invalid day of month"
msgstr ""
-#: time/zic.c:1270
+#: time/zic.c:1279
msgid "invalid ending year"
msgstr ""
-#: time/zic.c:1084
+#: time/zic.c:1088
msgid "invalid leaping year"
msgstr ""
-#: time/zic.c:1099 time/zic.c:1202
+#: time/zic.c:1103 time/zic.c:1206
msgid "invalid month name"
msgstr ""
-#: time/zic.c:918
+#: time/zic.c:922
msgid "invalid saved time"
msgstr ""
-#: time/zic.c:1250
+#: time/zic.c:1255
msgid "invalid starting year"
msgstr ""
-#: time/zic.c:1128 time/zic.c:1230
+#: time/zic.c:1132 time/zic.c:1235
msgid "invalid time of day"
msgstr ""
-#: time/zic.c:1318
+#: time/zic.c:1331
msgid "invalid weekday name"
msgstr ""
@@ -2963,11 +3022,11 @@ msgstr ""
msgid "line before ellipsis does not contain definition for character constant"
msgstr ""
-#: time/zic.c:791
+#: time/zic.c:795
msgid "line too long"
msgstr ""
-#: locale/programs/localedef.c:265
+#: locale/programs/localedef.c:268
#, c-format
msgid "locale file `%s', used in `copy' statement, not found"
msgstr ""
@@ -2986,12 +3045,14 @@ msgstr ""
#: locale/programs/ld-collate.c:167 locale/programs/ld-collate.c:173
#: locale/programs/ld-collate.c:177 locale/programs/ld-collate.c:1442
-#: locale/programs/ld-collate.c:1471 locale/programs/locfile.c:962
-#: locale/programs/xmalloc.c:68 posix/getconf.c:250
+#: locale/programs/ld-collate.c:1471 locale/programs/locfile.c:974
+#: locale/programs/xmalloc.c:70 login/programs/database.c:62
+#: login/programs/database.c:79 login/programs/database.c:95
+#: posix/getconf.c:250
msgid "memory exhausted"
msgstr ""
-#: malloc/obstack.c:462
+#: malloc/obstack.c:466
msgid "memory exhausted\n"
msgstr ""
@@ -3009,14 +3070,46 @@ msgstr ""
msgid "missing era name in string %d in `era' field in category `%s'"
msgstr ""
-#: gmon/gmon.c:128
+#: gmon/gmon.c:132
msgid "monstartup: out of memory\n"
msgstr ""
-#: time/zic.c:913
+#: time/zic.c:917
msgid "nameless rule"
msgstr ""
+#: nis/nss_nisplus/nisplus-publickey.c:266
+#: nis/nss_nisplus/nisplus-publickey.c:271
+#: nis/nss_nisplus/nisplus-publickey.c:332
+#: nis/nss_nisplus/nisplus-publickey.c:340
+#, c-format
+msgid "netname2user: (nis+ lookup): %s\n"
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:285
+#, c-format
+msgid "netname2user: DES entry for %s in directory %s not unique"
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:354
+#, c-format
+msgid "netname2user: LOCAL entry for %s in directory %s not unique"
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:198
+#, c-format
+msgid "netname2user: missing group id list in '%s'."
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:304
+#, c-format
+msgid "netname2user: principal name '%s' too long"
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:362
+msgid "netname2user: should not have uid 0"
+msgstr ""
+
#: sunrpc/svc_simple.c:153
#, c-format
msgid "never registered prog %d\n"
@@ -3027,7 +3120,7 @@ msgstr ""
msgid "no correct regular expression for field `%s' in category `%s': %s"
msgstr ""
-#: time/zic.c:2086
+#: time/zic.c:2099
msgid "no day in month matches rule"
msgstr ""
@@ -3039,17 +3132,17 @@ msgstr ""
msgid "no other keyword shall be specified when `copy' is used"
msgstr ""
-#: locale/programs/localedef.c:324
+#: locale/programs/localedef.c:327
msgid "no output file produced because warning were issued"
msgstr ""
-#: locale/programs/charmap.c:315 locale/programs/charmap.c:466
-#: locale/programs/charmap.c:545
+#: locale/programs/charmap.c:383 locale/programs/charmap.c:534
+#: locale/programs/charmap.c:613
msgid "no symbolic name given"
msgstr ""
-#: locale/programs/charmap.c:380 locale/programs/charmap.c:512
-#: locale/programs/charmap.c:578
+#: locale/programs/charmap.c:448 locale/programs/charmap.c:580
+#: locale/programs/charmap.c:646
msgid "no symbolic name given for end of range"
msgstr ""
@@ -3058,7 +3151,7 @@ msgstr ""
msgid "no weight defined for symbol `%s'"
msgstr ""
-#: locale/programs/charmap.c:430
+#: locale/programs/charmap.c:498
msgid "only WIDTH definitions are allowed to follow the CHARMAP definition"
msgstr ""
@@ -3070,23 +3163,24 @@ msgstr ""
msgid "preprocessor error"
msgstr ""
-#: db/makedb.c:330
+#: db/makedb.c:331
#, c-format
msgid "problems while reading `%s'"
msgstr ""
-#: sunrpc/rpcinfo.c:237 sunrpc/rpcinfo.c:384
+#: sunrpc/rpcinfo.c:237 sunrpc/rpcinfo.c:383
#, c-format
msgid "program %lu is not available\n"
msgstr ""
-#: sunrpc/rpcinfo.c:265 sunrpc/rpcinfo.c:311 sunrpc/rpcinfo.c:409
-#: sunrpc/rpcinfo.c:455 sunrpc/rpcinfo.c:478 sunrpc/rpcinfo.c:512
+#: sunrpc/rpcinfo.c:264 sunrpc/rpcinfo.c:310 sunrpc/rpcinfo.c:333
+#: sunrpc/rpcinfo.c:407 sunrpc/rpcinfo.c:453 sunrpc/rpcinfo.c:476
+#: sunrpc/rpcinfo.c:510
#, c-format
msgid "program %lu version %lu is not available\n"
msgstr ""
-#: sunrpc/rpcinfo.c:518
+#: sunrpc/rpcinfo.c:515
#, c-format
msgid "program %lu version %lu ready and waiting\n"
msgstr ""
@@ -3109,39 +3203,39 @@ msgstr ""
msgid "registerrpc: out of memory\n"
msgstr ""
-#: time/zic.c:1821
+#: time/zic.c:1834
msgid "repeated leap second moment"
msgstr ""
-#: sunrpc/rpcinfo.c:733
+#: sunrpc/rpcinfo.c:731
#, c-format
msgid "rpcinfo: %s is unknown host\n"
msgstr ""
-#: sunrpc/rpcinfo.c:696
+#: sunrpc/rpcinfo.c:694
#, c-format
msgid "rpcinfo: %s is unknown service\n"
msgstr ""
-#: sunrpc/rpcinfo.c:668
+#: sunrpc/rpcinfo.c:664
#, c-format
msgid "rpcinfo: Could not delete registration for prog %s version %s\n"
msgstr ""
-#: sunrpc/rpcinfo.c:640
+#: sunrpc/rpcinfo.c:636
#, c-format
msgid "rpcinfo: broadcast failed: %s\n"
msgstr ""
-#: sunrpc/rpcinfo.c:560
+#: sunrpc/rpcinfo.c:556
msgid "rpcinfo: can't contact portmapper"
msgstr ""
-#: sunrpc/rpcinfo.c:567
+#: sunrpc/rpcinfo.c:563
msgid "rpcinfo: can't contact portmapper: "
msgstr ""
-#: time/zic.c:704 time/zic.c:706
+#: time/zic.c:708 time/zic.c:710
msgid "same rule name in multiple files"
msgstr ""
@@ -3162,7 +3256,7 @@ msgid ""
"specification of sorting weight for collation symbol does not make sense"
msgstr ""
-#: time/zic.c:775
+#: time/zic.c:779
msgid "standard input"
msgstr ""
@@ -3175,16 +3269,24 @@ msgstr ""
msgid "starting date is illegal in string %d in `era' field in category `%s'"
msgstr ""
-#: time/zic.c:1274
+#: time/zic.c:1287
msgid "starting year greater than ending year"
msgstr ""
+#: time/zic.c:1261 time/zic.c:1285
+msgid "starting year too high to be represented"
+msgstr ""
+
+#: time/zic.c:1259 time/zic.c:1283
+msgid "starting year too low to be represented"
+msgstr ""
+
#: locale/programs/ld-time.c:335
#, c-format
msgid "stopping date is illegal in string %d in `era' field in category `%s'"
msgstr ""
-#: sunrpc/svc_run.c:66
+#: sunrpc/svc_run.c:81
msgid "svc_run: - select failed"
msgstr ""
@@ -3251,10 +3353,10 @@ msgid ""
"in charset"
msgstr ""
-#: locale/programs/charmap.c:314 locale/programs/charmap.c:348
-#: locale/programs/charmap.c:378 locale/programs/charmap.c:465
-#: locale/programs/charmap.c:511 locale/programs/charmap.c:544
-#: locale/programs/charmap.c:576
+#: locale/programs/charmap.c:382 locale/programs/charmap.c:416
+#: locale/programs/charmap.c:446 locale/programs/charmap.c:533
+#: locale/programs/charmap.c:579 locale/programs/charmap.c:612
+#: locale/programs/charmap.c:644
#, c-format
msgid "syntax error in %s definition: %s"
msgstr ""
@@ -3307,7 +3409,7 @@ msgstr ""
msgid "syntax error in order specification"
msgstr ""
-#: locale/programs/charmap.c:195 locale/programs/charmap.c:211
+#: locale/programs/charmap.c:263 locale/programs/charmap.c:279
#, c-format
msgid "syntax error in prolog: %s"
msgstr ""
@@ -3324,11 +3426,11 @@ msgstr ""
msgid "this is the first definition"
msgstr ""
-#: time/zic.c:1117
+#: time/zic.c:1121
msgid "time before zero"
msgstr ""
-#: time/zic.c:1125 time/zic.c:1986 time/zic.c:2005
+#: time/zic.c:1129 time/zic.c:1999 time/zic.c:2018
msgid "time overflow"
msgstr ""
@@ -3344,15 +3446,15 @@ msgstr ""
msgid "too many character classes defined"
msgstr ""
-#: time/zic.c:1815
+#: time/zic.c:1828
msgid "too many leap seconds"
msgstr ""
-#: time/zic.c:1787
+#: time/zic.c:1800
msgid "too many local time types"
msgstr ""
-#: time/zic.c:1741
+#: time/zic.c:1754
msgid "too many transitions?!"
msgstr ""
@@ -3360,7 +3462,7 @@ msgstr ""
msgid "too many weights"
msgstr ""
-#: time/zic.c:2109
+#: time/zic.c:2122
msgid "too many, or too long, time zone abbreviations"
msgstr ""
@@ -3377,7 +3479,7 @@ msgstr ""
msgid "two lines in a row containing `...' are not allowed"
msgstr ""
-#: time/zic.c:1281
+#: time/zic.c:1294
msgid "typed single year"
msgstr ""
@@ -3385,7 +3487,7 @@ msgstr ""
msgid "undefined"
msgstr ""
-#: locale/programs/charmap.c:617 locale/programs/charmap.c:628
+#: locale/programs/charmap.c:685 locale/programs/charmap.c:696
#, c-format
msgid "unknown character `%s'"
msgstr ""
@@ -3417,7 +3519,7 @@ msgstr ""
msgid "unknown symbol `%.*s': line ignored"
msgstr ""
-#: time/zic.c:747
+#: time/zic.c:751
msgid "unruly zone"
msgstr ""
@@ -3445,16 +3547,16 @@ msgstr ""
msgid "upper limit in range is not smaller then lower limit"
msgstr ""
-#: time/zic.c:2052
+#: time/zic.c:2065
msgid "use of 2/29 in non leap-year"
msgstr ""
-#: locale/programs/charmap.c:438 locale/programs/charmap.c:492
+#: locale/programs/charmap.c:506 locale/programs/charmap.c:560
#, c-format
msgid "value for %s must be an integer"
msgstr ""
-#: locale/programs/charmap.c:233
+#: locale/programs/charmap.c:301
#, c-format
msgid "value for <%s> must lie between 1 and 4"
msgstr ""
@@ -3464,7 +3566,7 @@ msgstr ""
msgid "value for field `%s' in category `%s' must not be the empty string"
msgstr ""
-#: locale/programs/charmap.c:245
+#: locale/programs/charmap.c:313
msgid "value of <mb_cur_max> must be greater than the value of <mb_cur_min>"
msgstr ""
@@ -3484,7 +3586,7 @@ msgstr ""
msgid "values for field `%s' in category `%s' must be smaller than 127"
msgstr ""
-#: login/utmp_file.c:84
+#: login/utmp_file.c:85
msgid "while opening UTMP file"
msgstr ""
@@ -3496,11 +3598,11 @@ msgstr ""
msgid "while preparing output"
msgstr ""
-#: db/makedb.c:357
+#: db/makedb.c:358
msgid "while reading database"
msgstr ""
-#: db/makedb.c:319
+#: db/makedb.c:320
msgid "while writing data base file"
msgstr ""
@@ -3508,23 +3610,23 @@ msgstr ""
msgid "wrong number of arguments"
msgstr ""
-#: time/zic.c:1075
+#: time/zic.c:1079
msgid "wrong number of fields on Leap line"
msgstr ""
-#: time/zic.c:1166
+#: time/zic.c:1170
msgid "wrong number of fields on Link line"
msgstr ""
-#: time/zic.c:909
+#: time/zic.c:913
msgid "wrong number of fields on Rule line"
msgstr ""
-#: time/zic.c:979
+#: time/zic.c:983
msgid "wrong number of fields on Zone continuation line"
msgstr ""
-#: time/zic.c:937
+#: time/zic.c:941
msgid "wrong number of fields on Zone line"
msgstr ""
@@ -3536,10 +3638,10 @@ msgstr ""
msgid "xdrrec_create: out of memory\n"
msgstr ""
-#: nis/ypclnt.c:813
+#: nis/ypclnt.c:819
msgid "yp_update: cannot convert host to netname\n"
msgstr ""
-#: nis/ypclnt.c:825
+#: nis/ypclnt.c:831
msgid "yp_update: cannot get server address\n"
msgstr ""
diff --git a/posix/getopt_init.c b/posix/getopt_init.c
index 80b6f96254..02165ee733 100644
--- a/posix/getopt_init.c
+++ b/posix/getopt_init.c
@@ -27,7 +27,7 @@
#include <unistd.h>
#include <sys/types.h>
-#include "../stdio-common/_itoa.h"
+#include <stdio-common/_itoa.h>
/* Variable to synchronize work. */
char *__getopt_nonoption_flags;
@@ -40,13 +40,13 @@ extern pid_t __libc_pid;
application it does not exist anymore since it was saved for the use
in getopt. */
void
-__getopt_clean_environment (void)
+__getopt_clean_environment (char **env)
{
/* Bash 2.0 puts a special variable in the environment for each
command it runs, specifying which ARGV elements are the results
of file name wildcard expansion and therefore should not be
considered as options. */
- static const char envvar_tail[] = "_GNU_nonoption_argv_flags_";
+ static const char envvar_tail[] = "_GNU_nonoption_argv_flags_=";
char var[100];
char *cp, **ep;
size_t len;
@@ -56,19 +56,19 @@ __getopt_clean_environment (void)
if (__libc_pid == 0)
__libc_pid = getpid ();
- /* Construct "_<PID>_GNU_nonoption_argv_flags_" string. */
+ /* Construct "_<PID>_GNU_nonoption_argv_flags_=" string. */
cp = memcpy (&var[sizeof (var) - sizeof (envvar_tail)], envvar_tail,
sizeof (envvar_tail));
cp = _itoa_word (__libc_pid, cp, 10, 0);
*--cp = '_';
len = (var + sizeof (var) - 1) - cp;
- for (ep = __environ; *ep != NULL; ++ep)
- if (!strncmp (*ep, cp, len) && (*ep)[len] == '=')
+ for (ep = env; *ep != NULL; ++ep)
+ if (!strncmp (*ep, cp, len))
{
/* Found it. Store this pointer and move later ones back. */
char **dp = ep;
- __getopt_nonoption_flags = &(*ep)[len + 1];
+ __getopt_nonoption_flags = &(*ep)[len];
do
dp[0] = dp[1];
while (*dp++);
diff --git a/posix/glob.c b/posix/glob.c
index 6a82fe0254..b6e087e5eb 100644
--- a/posix/glob.c
+++ b/posix/glob.c
@@ -252,6 +252,11 @@ extern char *alloca ();
#undef GLOB_PERIOD
#include <glob.h>
+static
+#if __GNUC__ - 0 >= 2
+inline
+#endif
+const char *next_brace_sub __P ((const char *begin));
static int glob_in_dir __P ((const char *pattern, const char *directory,
int flags,
int (*errfunc) __P ((const char *, int)),
diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c
index fd79bc4b81..b942e40f7a 100644
--- a/sysdeps/generic/dl-sysdep.c
+++ b/sysdeps/generic/dl-sysdep.c
@@ -34,10 +34,12 @@ extern char **_dl_argv;
extern char **_environ;
extern size_t _dl_pagesize;
extern const char *_dl_platform;
+extern unsigned long _dl_hwcap;
extern size_t _dl_platformlen;
extern void _end;
extern void ENTRY_POINT (void);
+ElfW(Addr) _dl_base_addr;
int __libc_enable_secure;
int __libc_multiple_libcs; /* Defining this here avoids the inclusion
of init-first. */
@@ -87,6 +89,9 @@ _dl_sysdep_start (void **start_argptr,
case AT_ENTRY:
user_entry = av->a_un.a_val;
break;
+ case AT_BASE:
+ _dl_base_addr = av->a_un.a_val;
+ break;
case AT_UID:
uid = av->a_un.a_val;
break;
@@ -103,7 +108,7 @@ _dl_sysdep_start (void **start_argptr,
_dl_platform = av->a_un.a_ptr;
break;
case AT_HWCAP:
- /* Well, what shall we use? A string or an integer with bits? */
+ _dl_hwcap = av->a_un.a_val;
break;
}
@@ -187,6 +192,12 @@ _dl_show_auxv (void)
16, 0),
"\n", NULL);
break;
+ case AT_BASE:
+ _dl_sysdep_message ("AT_BASE: 0x",
+ _itoa_word (av->a_un.a_val, buf + sizeof buf - 1,
+ 16, 0),
+ "\n", NULL);
+ break;
case AT_UID:
_dl_sysdep_message ("AT_UID: ",
_itoa_word (av->a_un.a_val, buf + sizeof buf - 1,
@@ -215,10 +226,9 @@ _dl_show_auxv (void)
_dl_sysdep_message ("AT_PLATFORM: ", av->a_un.a_ptr, NULL);
break;
case AT_HWCAP:
- /* Well, what shall we use? A string or an integer with bits? */
_dl_sysdep_message ("AT_HWCAP: ",
_itoa_word (av->a_un.a_val, buf + sizeof buf - 1,
- 10, 0),
+ 16, 0),
"\n", NULL);
break;
}
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
index e517cff0ff..213060ba84 100644
--- a/sysdeps/i386/dl-machine.h
+++ b/sysdeps/i386/dl-machine.h
@@ -57,20 +57,12 @@ static inline Elf32_Addr __attribute__ ((unused))
elf_machine_load_address (void)
{
Elf32_Addr addr;
- asm (" call .Lhere\n"
- ".Lhere: popl %0\n"
- " subl $.Lhere, %0"
+ asm (" call 1f\n"
+ "1: popl %0\n"
+ " subl 1b@GOT(%%ebx), %0"
: "=r" (addr));
return addr;
}
-/* The `subl' insn above will contain an R_386_32 relocation entry
- intended to insert the run-time address of the label `.Lhere'.
- This will be the first relocation in the text of the dynamic linker;
- we skip it to avoid trying to modify read-only text in this early stage. */
-#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info) \
- ++(const Elf32_Rel *) (dynamic_info)[DT_REL]->d_un.d_ptr; \
- (dynamic_info)[DT_RELSZ]->d_un.d_val -= sizeof (Elf32_Rel);
-
#ifndef PROF
/* We add a declaration of this function here so that in dl-runtime.c
@@ -132,6 +124,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
.globl _dl_runtime_resolve
.type _dl_runtime_resolve, @function
+ .align 16
_dl_runtime_resolve:
pushl %eax # Preserve registers otherwise clobbered.
pushl %ecx
@@ -147,6 +140,7 @@ _dl_runtime_resolve:
.globl _dl_runtime_profile
.type _dl_runtime_profile, @function
+ .align 16
_dl_runtime_profile:
pushl %eax # Preserve registers otherwise clobbered.
pushl %ecx
@@ -167,6 +161,7 @@ _dl_runtime_profile:
.globl _dl_runtime_profile
.type _dl_runtime_resolve, @function
.type _dl_runtime_profile, @function
+ .align 16
_dl_runtime_resolve:
_dl_runtime_profile:
pushl %eax # Preserve registers otherwise clobbered.
diff --git a/sysdeps/i386/fpu/bits/mathinline.h b/sysdeps/i386/fpu/bits/mathinline.h
index c6b9331f9a..17f62a080f 100644
--- a/sysdeps/i386/fpu/bits/mathinline.h
+++ b/sysdeps/i386/fpu/bits/mathinline.h
@@ -73,6 +73,10 @@
#ifdef __GNUC__
#if !defined __NO_MATH_INLINES && defined __OPTIMIZE__
+/* The gcc, version 2.7 or below, has problems with all this inlining
+ code. So disable it for this version of the compiler. */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 7)
+
#ifdef __cplusplus
# define __MATH_INLINE __inline
#else
@@ -154,6 +158,80 @@
}
+/* Miscellaneous functions */
+
+__inline_mathcode (__sgn, __x, \
+ return __x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0))
+
+__inline_mathcode (__pow2, __x, \
+ register long double __value; \
+ register long double __exponent; \
+ long int __p = (long int) __x; \
+ if (__x == (long double) __p) \
+ { \
+ __asm __volatile__ \
+ ("fscale" \
+ : "=t" (__value) : "0" (1.0), "u" (__x)); \
+ return __value; \
+ } \
+ __asm __volatile__ \
+ ("fldl %%st(0)\n\t" \
+ "frndint # int(x)\n\t" \
+ "fxch\n\t" \
+ "fsub %%st(1) # fract(x)\n\t" \
+ "f2xm1 # 2^(fract(x)) - 1\n\t" \
+ : "=t" (__value), "=u" (__exponent) : "0" (__x)); \
+ __value += 1.0; \
+ __asm __volatile__ \
+ ("fscale" \
+ : "=t" (__value) : "0" (__value), "u" (__exponent)); \
+ return __value)
+
+#define __sincos_code \
+ register long double __cosr; \
+ register long double __sinr; \
+ __asm __volatile__ \
+ ("fsincos\n\t" \
+ "fnstsw %%ax\n\t" \
+ "testl $0x400, %%eax\n\t" \
+ "jz 1f\n\t" \
+ "fldpi\n\t" \
+ "fadd %%st(0)\n\t" \
+ "fxch %%st(1)\n\t" \
+ "2: fprem1\n\t" \
+ "fnstsw %%ax\n\t" \
+ "testl $0x400, %%eax\n\t" \
+ "jnz 2b\n\t" \
+ "fstp %%st(1)\n\t" \
+ "fsincos\n\t" \
+ "1:" \
+ : "=t" (__cosr), "=u" (__sinr) : "0" (__x)); \
+ *__sinx = __sinr; \
+ *__cosx = __cosr
+
+__MATH_INLINE void __sincos (double __x, double *__sinx, double *__cosx);
+__MATH_INLINE void
+__sincos (double __x, double *__sinx, double *__cosx)
+{
+ __sincos_code;
+}
+
+__MATH_INLINE void __sincosf (float __x, float *__sinx, float *__cosx);
+__MATH_INLINE void
+__sincosf (float __x, float *__sinx, float *__cosx)
+{
+ __sincos_code;
+}
+
+__MATH_INLINE void __sincosl (long double __x, long double *__sinx,
+ long double *__cosx);
+__MATH_INLINE void
+__sincosl (long double __x, long double *__sinx, long double *__cosx)
+{
+ __sincos_code;
+}
+
+
/* Optimized inline implementation, sometimes with reduced precision
and/or argument range. */
@@ -278,10 +356,10 @@ __inline_mathop (sqrt, "fsqrt")
__inline_mathop_ (long double, __sqrtl, "fsqrt")
#if defined __GNUC__ && (__GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 8)
-__inline_mathcode_ (fabs, __x, return __builtin_fabs (__x))
-__inline_mathcode_ (fabsf, __x, return __builtin_fabsf (__x))
-__inline_mathcode_ (fabsl, __x, return __builtin_fabsl (__x))
-__inline_mathcode_ (__fabsl, __x, return __builtin_fabsl (__x))
+__inline_mathcode_ (double, fabs, __x, return __builtin_fabs (__x))
+__inline_mathcode_ (float, fabsf, __x, return __builtin_fabsf (__x))
+__inline_mathcode_ (long double, fabsl, __x, return __builtin_fabsl (__x))
+__inline_mathcode_ (long double, __fabsl, __x, return __builtin_fabsl (__x))
#else
__inline_mathop (fabs, "fabs")
__inline_mathop_ (long double, __fabsl, "fabs")
@@ -356,7 +434,7 @@ ldexp (double __x, int __y)
/* Optimized versions for some non-standardized functions. */
#if defined __USE_ISOC9X || defined __USE_MISC
-__inline_mathop_decl (log2, "fyl2x", "u" (1.0), "0" (__x) : "st(1)")
+__inline_mathop(log2, "fld1; fxch; fyl2x")
__inline_mathcode (expm1, __x, __expm1_code)
@@ -443,15 +521,12 @@ __finite (double __x)
("orl $0x800fffff, %0\n\t"
"incl %0\n\t"
"shrl $31, %0"
- : "=q" (__result) : "0" (((int *) &__x)[1]));
+ : "=q" (__result) : "0" (((int *) &__x)[1]) : "cc");
return __result;
}
/* Miscellaneous functions */
-__inline_mathcode (__sgn, __x, \
- return __x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0))
-
__inline_mathcode (__coshm1, __x, \
register long double __exm1 = __expm1l (__fabsl (__x)); \
return 0.5 * (__exm1 / (__exm1 + 1.0)) * __exm1)
@@ -459,69 +534,6 @@ __inline_mathcode (__coshm1, __x, \
__inline_mathcode (__acosh1p, __x, \
return log1pl (__x + __sqrtl (__x) * __sqrtl (__x + 2.0)))
-__inline_mathcode (__pow2, __x, \
- register long double __value; \
- register long double __exponent; \
- long int __p = (long int) __x; \
- if (__x == (long double) __p) \
- return ldexpl (1.0, __p); \
- __asm __volatile__ \
- ("fldl %%st(0)\n\t" \
- "frndint # int(x)\n\t" \
- "fxch\n\t" \
- "fsub %%st(1) # fract(x)\n\t" \
- "f2xm1 # 2^(fract(x)) - 1\n\t" \
- : "=t" (__value), "=u" (__exponent) : "0" (__x)); \
- __value += 1.0; \
- __asm __volatile__ \
- ("fscale" \
- : "=t" (__value) : "0" (__value), "u" (__exponent)); \
- return __value)
-
-#define __sincos_code \
- register long double __cosr; \
- register long double __sinr; \
- __asm __volatile__ \
- ("fsincos\n\t" \
- "fnstsw %%ax\n\t" \
- "testl $0x400, %%eax\n\t" \
- "jz 1f\n\t" \
- "fldpi\n\t" \
- "fadd %%st(0)\n\t" \
- "fxch %%st(1)\n\t" \
- "2: fprem1\n\t" \
- "fnstsw %%ax\n\t" \
- "testl $0x400, %%eax\n\t" \
- "jnz 2b\n\t" \
- "fstp %%st(1)\n\t" \
- "fsincos\n\t" \
- "1:" \
- : "=t" (__cosr), "=u" (__sinr) : "0" (__x)); \
- *__sinx = __sinr; \
- *__cosx = __cosr
-
-__MATH_INLINE void __sincos (double __x, double *__sinx, double *__cosx);
-__MATH_INLINE void
-__sincos (double __x, double *__sinx, double *__cosx)
-{
- __sincos_code;
-}
-
-__MATH_INLINE void __sincosf (float __x, float *__sinx, float *__cosx);
-__MATH_INLINE void
-__sincosf (float __x, float *__sinx, float *__cosx)
-{
- __sincos_code;
-}
-
-__MATH_INLINE void __sincosl (long double __x, long double *__sinx,
- long double *__cosx);
-__MATH_INLINE void
-__sincosl (long double __x, long double *__sinx, long double *__cosx)
-{
- __sincos_code;
-}
-
#endif /* __USE_MISC */
/* Undefine some of the large macros which are not used anymore. */
@@ -530,6 +542,7 @@ __sincosl (long double __x, long double *__sinx, long double *__cosx)
#undef __atan2_code
#undef __sincos_code
+#endif /* Not gcc <= 2.7. */
#endif /* __NO_MATH_INLINES */
#endif /* __GNUC__ */
diff --git a/sysdeps/i386/fpu/fraiseexcpt.c b/sysdeps/i386/fpu/fraiseexcpt.c
index 0af8c71ddc..d468449873 100644
--- a/sysdeps/i386/fpu/fraiseexcpt.c
+++ b/sysdeps/i386/fpu/fraiseexcpt.c
@@ -34,7 +34,7 @@ feraiseexcept (int excepts)
{
/* One example of a invalid operation is 0.0 / 0.0. */
double d;
- __asm__ ("fldz; fdiv %%st, %%st(0); fwait" : "=t" (d));
+ __asm__ __volatile__ ("fldz; fdiv %%st, %%st(0); fwait" : "=t" (d));
(void) &d;
}
@@ -42,7 +42,8 @@ feraiseexcept (int excepts)
if ((FE_DIVBYZERO & excepts) != 0)
{
double d;
- __asm__ ("fldz; fld1; fdivp %%st, %%st(1); fwait" : "=t" (d));
+ __asm__ __volatile__ ("fldz; fld1; fdivp %%st, %%st(1); fwait"
+ : "=t" (d));
(void) &d;
}
@@ -55,16 +56,16 @@ feraiseexcept (int excepts)
/* Bah, we have to clear selected exceptions. Since there is no
`fldsw' instruction we have to do it the hard way. */
- __asm__ ("fnstenv %0" : "=m" (*&temp));
+ __asm__ __volatile__ ("fnstenv %0" : "=m" (*&temp));
/* Set the relevant bits. */
temp.status_word |= FE_OVERFLOW;
/* Put the new data in effect. */
- __asm__ ("fldenv %0" : : "m" (*&temp));
+ __asm__ __volatile__ ("fldenv %0" : : "m" (*&temp));
/* And raise the exception. */
- __asm__ ("fwait");
+ __asm__ __volatile__ ("fwait");
}
/* Next: underflow. */
@@ -76,16 +77,16 @@ feraiseexcept (int excepts)
/* Bah, we have to clear selected exceptions. Since there is no
`fldsw' instruction we have to do it the hard way. */
- __asm__ ("fnstenv %0" : "=m" (*&temp));
+ __asm__ __volatile__ ("fnstenv %0" : "=m" (*&temp));
/* Set the relevant bits. */
temp.status_word |= FE_UNDERFLOW;
/* Put the new data in effect. */
- __asm__ ("fldenv %0" : : "m" (*&temp));
+ __asm__ __volatile__ ("fldenv %0" : : "m" (*&temp));
/* And raise the exception. */
- __asm__ ("fwait");
+ __asm__ __volatile__ ("fwait");
}
/* Last: inexact. */
@@ -97,15 +98,15 @@ feraiseexcept (int excepts)
/* Bah, we have to clear selected exceptions. Since there is no
`fldsw' instruction we have to do it the hard way. */
- __asm__ ("fnstenv %0" : "=m" (*&temp));
+ __asm__ __volatile__ ("fnstenv %0" : "=m" (*&temp));
/* Set the relevant bits. */
temp.status_word |= FE_INEXACT;
/* Put the new data in effect. */
- __asm__ ("fldenv %0" : : "m" (*&temp));
+ __asm__ __volatile__ ("fldenv %0" : : "m" (*&temp));
/* And raise the exception. */
- __asm__ ("fwait");
+ __asm__ __volatile__ ("fwait");
}
}
diff --git a/sysdeps/powerpc/dl-machine.h b/sysdeps/powerpc/dl-machine.h
index 74436d15c1..917e4f7970 100644
--- a/sysdeps/powerpc/dl-machine.h
+++ b/sysdeps/powerpc/dl-machine.h
@@ -346,7 +346,7 @@ static ElfW(Addr) _dl_preferred_address = 1
/* We require the address of the PLT entry returned from fixup, not
the first word of the PLT entry. */
-#define ELF_FIXUP_RETURNS_ADDRESS 1
+#define ELF_FIXUP_RETURN_VALUE(map, result) (&(result))
/* Nonzero iff TYPE should not be allowed to resolve to one of
the main executable's symbols, as for a COPY reloc. */
diff --git a/sysdeps/sparc/configure b/sysdeps/sparc/configure
deleted file mode 100755
index a8f815a577..0000000000
--- a/sysdeps/sparc/configure
+++ /dev/null
@@ -1,4 +0,0 @@
- # Local configure fragment for sysdeps/sparc.
-
-# The assembler on SPARC needs the -fPIC flag even when it's assembler code.
-ASFLAGS_SO=-fPIC
diff --git a/sysdeps/sparc/configure.in b/sysdeps/sparc/configure.in
deleted file mode 100644
index e71a7e30fa..0000000000
--- a/sysdeps/sparc/configure.in
+++ /dev/null
@@ -1,6 +0,0 @@
-sinclude(./aclocal.m4)dnl Autoconf lossage
-GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
-# Local configure fragment for sysdeps/sparc.
-
-# The assembler on SPARC needs the -fPIC flag even when it's assembler code.
-ASFLAGS_SO=-fPIC
diff --git a/sysdeps/sparc/fpu/bits/mathdef.h b/sysdeps/sparc/fpu/bits/mathdef.h
index 0bc9c94ecc..505d724fd0 100644
--- a/sysdeps/sparc/fpu/bits/mathdef.h
+++ b/sysdeps/sparc/fpu/bits/mathdef.h
@@ -62,3 +62,7 @@ typedef double double_t;
#define INFINITY HUGE_VAL
#endif
+
+/* The values returned by `ilogb' for 0 and NaN respectively. */
+#define FP_ILOGB0 0x80000001
+#define FP_ILOGBNAN 0x7fffffff
diff --git a/sysdeps/sparc/fpu/fraiseexcpt.c b/sysdeps/sparc/fpu/fraiseexcpt.c
index 308c9b2e7f..28db8b360a 100644
--- a/sysdeps/sparc/fpu/fraiseexcpt.c
+++ b/sysdeps/sparc/fpu/fraiseexcpt.c
@@ -20,14 +20,16 @@
#include <fenv.h>
#include <math.h>
-static void
-ignore_me(double foo)
-{
-}
-
void
feraiseexcept (int excepts)
{
+ static volatile double sink;
+ static const struct {
+ double zero, one, max, min, sixteen, pi;
+ } c = {
+ 0.0, 1.0, DBL_MAX, DBL_MIN, 16.0, M_PI
+ };
+
/* Raise exceptions represented by EXPECTS. But we must raise only
one signal at a time. It is important the if the overflow/underflow
exception and the inexact exception are given at the same time,
@@ -37,30 +39,30 @@ feraiseexcept (int excepts)
if ((FE_INVALID & excepts) != 0)
{
/* One example of a invalid operation is 0/0. */
- ignore_me (0.0 / 0.0);
+ sink = c.zero / c.zero;
}
/* Next: division by zero. */
if ((FE_DIVBYZERO & excepts) != 0)
{
- ignore_me (1.0 / 0.0);
+ sink = c.one / c.zero;
}
/* Next: overflow. */
if ((FE_OVERFLOW & excepts) != 0)
{
- ignore_me (LDBL_MAX * LDBL_MAX);
+ sink = c.max * c.max;
}
/* Next: underflow. */
if ((FE_UNDERFLOW & excepts) != 0)
{
- ignore_me (LDBL_MIN / 16.0);
+ sink = c.min / c.sixteen;
}
/* Last: inexact. */
if ((FE_INEXACT & excepts) != 0)
{
- ignore_me (1.0 / M_PI);
+ sink = c.one / c.pi;
}
}
diff --git a/sysdeps/sparc/sparc32/Makefile b/sysdeps/sparc/sparc32/Makefile
index deec2f8145..c7c867ef22 100644
--- a/sysdeps/sparc/sparc32/Makefile
+++ b/sysdeps/sparc/sparc32/Makefile
@@ -37,7 +37,7 @@ divrem := sdiv udiv rem urem
+divrem-S-rem := true
+divrem-S-udiv := false
+divrem-S-urem := false
-$(divrem:%=$(sysdep_dir)/sparc/%.S): $(sysdep_dir)/sparc/divrem.m4
+$(divrem:%=$(sysdep_dir)/sparc/sparc32/%.S): $(sysdep_dir)/sparc/sparc32/divrem.m4
(echo "define(NAME,\`.$(+divrem-NAME)')\
define(OP,\`$(+divrem-OP-$(+divrem-NAME))')\
define(S,\`$(+divrem-S-$(+divrem-NAME))')\
@@ -48,4 +48,4 @@ $(divrem:%=$(sysdep_dir)/sparc/%.S): $(sysdep_dir)/sparc/divrem.m4
mv -f $@-tmp $@
test ! -d CVS || cvs commit -m'Regenerated from $<' $@
-sysdep-realclean := $(sysdep-realclean) $(divrem:%=sysdeps/sparc/%.S)
+sysdep-realclean := $(sysdep-realclean) $(divrem:%=sysdeps/sparc/sparc32/%.S)
diff --git a/sysdeps/sparc/sparc32/__longjmp.S b/sysdeps/sparc/sparc32/__longjmp.S
index 36e1c170dd..651ede4c15 100644
--- a/sysdeps/sparc/sparc32/__longjmp.S
+++ b/sysdeps/sparc/sparc32/__longjmp.S
@@ -22,38 +22,43 @@
#include <bits/setjmp.h>
#define ENV(reg) [%g1 + (reg * 4)]
-ENTRY (__longjmp)
+ENTRY(__longjmp)
/* Store our arguments in global registers so we can still
use them while unwinding frames and their register windows. */
mov %o0, %g1 /* ENV in %g1 */
- orcc %o1, %g0, %g6 /* VAL in %g6 */
+ orcc %o1, %g0, %g2 /* VAL in %g2 */
be,a 0f /* Branch if zero; else skip delay slot. */
- mov 1, %g6 /* Delay slot only hit if zero: VAL = 1. */
+ mov 1, %g2 /* Delay slot only hit if zero: VAL = 1. */
0:
-
- /* Cache target FP in register %g7. */
- ld ENV (JB_FP), %g7
+ /* Cache target FP in register %g3. */
+ ld ENV(JB_FP), %g3
/* Now we will loop, unwinding the register windows up the stack
- until the restored %fp value matches the target value in %g7. */
+ until the restored %fp value matches the target value in %g3. */
-loop: cmp %fp, %g7 /* Have we reached the target frame? */
- bl,a loop /* Loop while current fp is below target. */
+LOC(loop):
+ cmp %fp, %g3 /* Have we reached the target frame? */
+ bl,a LOC(loop) /* Loop while current fp is below target. */
restore /* Unwind register window in delay slot. */
- be,a found /* Better have hit it exactly. */
- ld ENV (JB_SP), %o0 /* Delay slot: extract target SP. */
+ be,a LOC(found) /* Better have hit it exactly. */
+ ld ENV(JB_SP), %o0 /* Delay slot: extract target SP. */
-bogus: /* Get here only if the jmp_buf or stack is clobbered. */
- call C_SYMBOL_NAME (abort)
- nop
+LOC(bogus):
+ /* Get here only if the jmp_buf or stack is clobbered. */
+ call C_SYMBOL_NAME(abort)
+ nop
unimp 0
-found: /* We have unwound register windows so %fp matches the target. */
+LOC(found):
+ /* We have unwound register windows so %fp matches the target. */
cmp %o0, %sp /* Check jmp_buf SP vs register window. */
- bge,a sp_ok /* Saved must not be deeper than register. */
+ bge,a LOC(sp_ok) /* Saved must not be deeper than register. */
mov %o0, %sp /* OK, install new SP. */
- b,a bogus /* Bogus, we lose. */
+ b,a LOC(bogus) /* Bogus, we lose. */
-sp_ok: ld ENV (JB_PC), %o0 /* Extract target return PC. */
+LOC(sp_ok):
+ ld ENV(JB_PC), %o0 /* Extract target return PC. */
jmp %o0 + 8 /* Return there. */
- mov %g6, %o0 /* Delay slot: set return value. */
+ mov %g2, %o0 /* Delay slot: set return value. */
+
+END(__longjmp)
diff --git a/sysdeps/sparc/sparc32/add_n.S b/sysdeps/sparc/sparc32/add_n.S
index 9852c256aa..5a6fccbbee 100644
--- a/sysdeps/sparc/sparc32/add_n.S
+++ b/sysdeps/sparc/sparc32/add_n.S
@@ -1,20 +1,20 @@
! SPARC __mpn_add_n -- Add two limb vectors of the same length > 0 and store
! sum in a third limb vector.
-
-! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-
+!
+! Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+!
! This file is part of the GNU MP Library.
-
+!
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
@@ -22,205 +22,217 @@
! INPUT PARAMETERS
-#define res_ptr %o0
-#define s1_ptr %o1
-#define s2_ptr %o2
-#define size %o3
+#define RES_PTR %o0
+#define S1_PTR %o1
+#define S2_PTR %o2
+#define SIZE %o3
-#include "sysdep.h"
+#include <sysdep.h>
- .text
- .align 4
- .global C_SYMBOL_NAME(__mpn_add_n)
-C_SYMBOL_NAME(__mpn_add_n):
- xor s2_ptr,res_ptr,%g1
+ENTRY(__mpn_add_n)
+ xor S2_PTR,RES_PTR,%g1
andcc %g1,4,%g0
- bne L1 ! branch if alignment differs
- nop
+ bne LOC(1) ! branch if alignment differs
+ nop
! ** V1a **
-L0: andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0
- be L_v1 ! if no, branch
- nop
-/* Add least significant limb separately to align res_ptr and s2_ptr */
- ld [s1_ptr],%g4
- add s1_ptr,4,s1_ptr
- ld [s2_ptr],%g2
- add s2_ptr,4,s2_ptr
- add size,-1,size
+LOC(0): andcc RES_PTR,4,%g0 ! RES_PTR unaligned? Side effect: cy=0
+ be LOC(v1) ! if no, branch
+ nop
+/* Add least significant limb separately to align RES_PTR and S2_PTR */
+ ld [S1_PTR],%g4
+ add S1_PTR,4,S1_PTR
+ ld [S2_PTR],%g2
+ add S2_PTR,4,S2_PTR
+ add SIZE,-1,SIZE
addcc %g4,%g2,%o4
- st %o4,[res_ptr]
- add res_ptr,4,res_ptr
-L_v1: addx %g0,%g0,%o4 ! save cy in register
- cmp size,2 ! if size < 2 ...
- bl Lend2 ! ... branch to tail code
+ st %o4,[RES_PTR]
+ add RES_PTR,4,RES_PTR
+LOC(v1):
+ addx %g0,%g0,%o4 ! save cy in register
+ cmp SIZE,2 ! if SIZE < 2 ...
+ bl LOC(end2) ! ... branch to tail code
subcc %g0,%o4,%g0 ! restore cy
- ld [s1_ptr+0],%g4
- addcc size,-10,size
- ld [s1_ptr+4],%g1
- ldd [s2_ptr+0],%g2
- blt Lfin1
+ ld [S1_PTR+0],%g4
+ addcc SIZE,-10,SIZE
+ ld [S1_PTR+4],%g1
+ ldd [S2_PTR+0],%g2
+ blt LOC(fin1)
subcc %g0,%o4,%g0 ! restore cy
/* Add blocks of 8 limbs until less than 8 limbs remain */
-Loop1: addxcc %g4,%g2,%o4
- ld [s1_ptr+8],%g4
+LOC(loop1):
+ addxcc %g4,%g2,%o4
+ ld [S1_PTR+8],%g4
addxcc %g1,%g3,%o5
- ld [s1_ptr+12],%g1
- ldd [s2_ptr+8],%g2
- std %o4,[res_ptr+0]
+ ld [S1_PTR+12],%g1
+ ldd [S2_PTR+8],%g2
+ std %o4,[RES_PTR+0]
addxcc %g4,%g2,%o4
- ld [s1_ptr+16],%g4
+ ld [S1_PTR+16],%g4
addxcc %g1,%g3,%o5
- ld [s1_ptr+20],%g1
- ldd [s2_ptr+16],%g2
- std %o4,[res_ptr+8]
+ ld [S1_PTR+20],%g1
+ ldd [S2_PTR+16],%g2
+ std %o4,[RES_PTR+8]
addxcc %g4,%g2,%o4
- ld [s1_ptr+24],%g4
+ ld [S1_PTR+24],%g4
addxcc %g1,%g3,%o5
- ld [s1_ptr+28],%g1
- ldd [s2_ptr+24],%g2
- std %o4,[res_ptr+16]
+ ld [S1_PTR+28],%g1
+ ldd [S2_PTR+24],%g2
+ std %o4,[RES_PTR+16]
addxcc %g4,%g2,%o4
- ld [s1_ptr+32],%g4
+ ld [S1_PTR+32],%g4
addxcc %g1,%g3,%o5
- ld [s1_ptr+36],%g1
- ldd [s2_ptr+32],%g2
- std %o4,[res_ptr+24]
+ ld [S1_PTR+36],%g1
+ ldd [S2_PTR+32],%g2
+ std %o4,[RES_PTR+24]
addx %g0,%g0,%o4 ! save cy in register
- addcc size,-8,size
- add s1_ptr,32,s1_ptr
- add s2_ptr,32,s2_ptr
- add res_ptr,32,res_ptr
- bge Loop1
+ addcc SIZE,-8,SIZE
+ add S1_PTR,32,S1_PTR
+ add S2_PTR,32,S2_PTR
+ add RES_PTR,32,RES_PTR
+ bge LOC(loop1)
subcc %g0,%o4,%g0 ! restore cy
-Lfin1: addcc size,8-2,size
- blt Lend1
+LOC(fin1):
+ addcc SIZE,8-2,SIZE
+ blt LOC(end1)
subcc %g0,%o4,%g0 ! restore cy
/* Add blocks of 2 limbs until less than 2 limbs remain */
-Loope1: addxcc %g4,%g2,%o4
- ld [s1_ptr+8],%g4
+LOC(loope1):
+ addxcc %g4,%g2,%o4
+ ld [S1_PTR+8],%g4
addxcc %g1,%g3,%o5
- ld [s1_ptr+12],%g1
- ldd [s2_ptr+8],%g2
- std %o4,[res_ptr+0]
+ ld [S1_PTR+12],%g1
+ ldd [S2_PTR+8],%g2
+ std %o4,[RES_PTR+0]
addx %g0,%g0,%o4 ! save cy in register
- addcc size,-2,size
- add s1_ptr,8,s1_ptr
- add s2_ptr,8,s2_ptr
- add res_ptr,8,res_ptr
- bge Loope1
+ addcc SIZE,-2,SIZE
+ add S1_PTR,8,S1_PTR
+ add S2_PTR,8,S2_PTR
+ add RES_PTR,8,RES_PTR
+ bge LOC(loope1)
subcc %g0,%o4,%g0 ! restore cy
-Lend1: addxcc %g4,%g2,%o4
+LOC(end1):
+ addxcc %g4,%g2,%o4
addxcc %g1,%g3,%o5
- std %o4,[res_ptr+0]
+ std %o4,[RES_PTR+0]
addx %g0,%g0,%o4 ! save cy in register
- andcc size,1,%g0
- be Lret1
+ andcc SIZE,1,%g0
+ be LOC(ret1)
subcc %g0,%o4,%g0 ! restore cy
/* Add last limb */
- ld [s1_ptr+8],%g4
- ld [s2_ptr+8],%g2
+ ld [S1_PTR+8],%g4
+ ld [S2_PTR+8],%g2
addxcc %g4,%g2,%o4
- st %o4,[res_ptr+8]
+ st %o4,[RES_PTR+8]
-Lret1: retl
+LOC(ret1):
+ retl
addx %g0,%g0,%o0 ! return carry-out from most sign. limb
-L1: xor s1_ptr,res_ptr,%g1
+LOC(1): xor S1_PTR,RES_PTR,%g1
andcc %g1,4,%g0
- bne L2
+ bne LOC(2)
nop
! ** V1b **
- mov s2_ptr,%g1
- mov s1_ptr,s2_ptr
- b L0
- mov %g1,s1_ptr
+ mov S2_PTR,%g1
+ mov S1_PTR,S2_PTR
+ b LOC(0)
+ mov %g1,S1_PTR
! ** V2 **
-/* If we come here, the alignment of s1_ptr and res_ptr as well as the
- alignment of s2_ptr and res_ptr differ. Since there are only two ways
+/* If we come here, the alignment of S1_PTR and RES_PTR as well as the
+ alignment of S2_PTR and RES_PTR differ. Since there are only two ways
things can be aligned (that we care about) we now know that the alignment
- of s1_ptr and s2_ptr are the same. */
+ of S1_PTR and S2_PTR are the same. */
-L2: cmp size,1
- be Ljone
+LOC(2): cmp SIZE,1
+ be LOC(jone)
nop
- andcc s1_ptr,4,%g0 ! s1_ptr unaligned? Side effect: cy=0
- be L_v2 ! if no, branch
+ andcc S1_PTR,4,%g0 ! S1_PTR unaligned? Side effect: cy=0
+ be LOC(v2) ! if no, branch
nop
-/* Add least significant limb separately to align s1_ptr and s2_ptr */
- ld [s1_ptr],%g4
- add s1_ptr,4,s1_ptr
- ld [s2_ptr],%g2
- add s2_ptr,4,s2_ptr
- add size,-1,size
+/* Add least significant limb separately to align S1_PTR and S2_PTR */
+ ld [S1_PTR],%g4
+ add S1_PTR,4,S1_PTR
+ ld [S2_PTR],%g2
+ add S2_PTR,4,S2_PTR
+ add SIZE,-1,SIZE
addcc %g4,%g2,%o4
- st %o4,[res_ptr]
- add res_ptr,4,res_ptr
+ st %o4,[RES_PTR]
+ add RES_PTR,4,RES_PTR
-L_v2: addx %g0,%g0,%o4 ! save cy in register
- addcc size,-8,size
- blt Lfin2
+LOC(v2):
+ addx %g0,%g0,%o4 ! save cy in register
+ addcc SIZE,-8,SIZE
+ blt LOC(fin2)
subcc %g0,%o4,%g0 ! restore cy
/* Add blocks of 8 limbs until less than 8 limbs remain */
-Loop2: ldd [s1_ptr+0],%g2
- ldd [s2_ptr+0],%o4
+LOC(loop2):
+ ldd [S1_PTR+0],%g2
+ ldd [S2_PTR+0],%o4
addxcc %g2,%o4,%g2
- st %g2,[res_ptr+0]
+ st %g2,[RES_PTR+0]
addxcc %g3,%o5,%g3
- st %g3,[res_ptr+4]
- ldd [s1_ptr+8],%g2
- ldd [s2_ptr+8],%o4
+ st %g3,[RES_PTR+4]
+ ldd [S1_PTR+8],%g2
+ ldd [S2_PTR+8],%o4
addxcc %g2,%o4,%g2
- st %g2,[res_ptr+8]
+ st %g2,[RES_PTR+8]
addxcc %g3,%o5,%g3
- st %g3,[res_ptr+12]
- ldd [s1_ptr+16],%g2
- ldd [s2_ptr+16],%o4
+ st %g3,[RES_PTR+12]
+ ldd [S1_PTR+16],%g2
+ ldd [S2_PTR+16],%o4
addxcc %g2,%o4,%g2
- st %g2,[res_ptr+16]
+ st %g2,[RES_PTR+16]
addxcc %g3,%o5,%g3
- st %g3,[res_ptr+20]
- ldd [s1_ptr+24],%g2
- ldd [s2_ptr+24],%o4
+ st %g3,[RES_PTR+20]
+ ldd [S1_PTR+24],%g2
+ ldd [S2_PTR+24],%o4
addxcc %g2,%o4,%g2
- st %g2,[res_ptr+24]
+ st %g2,[RES_PTR+24]
addxcc %g3,%o5,%g3
- st %g3,[res_ptr+28]
+ st %g3,[RES_PTR+28]
addx %g0,%g0,%o4 ! save cy in register
- addcc size,-8,size
- add s1_ptr,32,s1_ptr
- add s2_ptr,32,s2_ptr
- add res_ptr,32,res_ptr
- bge Loop2
+ addcc SIZE,-8,SIZE
+ add S1_PTR,32,S1_PTR
+ add S2_PTR,32,S2_PTR
+ add RES_PTR,32,RES_PTR
+ bge LOC(loop2)
subcc %g0,%o4,%g0 ! restore cy
-Lfin2: addcc size,8-2,size
- blt Lend2
+LOC(fin2):
+ addcc SIZE,8-2,SIZE
+ blt LOC(end2)
subcc %g0,%o4,%g0 ! restore cy
-Loope2: ldd [s1_ptr+0],%g2
- ldd [s2_ptr+0],%o4
+LOC(loope2):
+ ldd [S1_PTR+0],%g2
+ ldd [S2_PTR+0],%o4
addxcc %g2,%o4,%g2
- st %g2,[res_ptr+0]
+ st %g2,[RES_PTR+0]
addxcc %g3,%o5,%g3
- st %g3,[res_ptr+4]
+ st %g3,[RES_PTR+4]
addx %g0,%g0,%o4 ! save cy in register
- addcc size,-2,size
- add s1_ptr,8,s1_ptr
- add s2_ptr,8,s2_ptr
- add res_ptr,8,res_ptr
- bge Loope2
+ addcc SIZE,-2,SIZE
+ add S1_PTR,8,S1_PTR
+ add S2_PTR,8,S2_PTR
+ add RES_PTR,8,RES_PTR
+ bge LOC(loope2)
subcc %g0,%o4,%g0 ! restore cy
-Lend2: andcc size,1,%g0
- be Lret2
+LOC(end2):
+ andcc SIZE,1,%g0
+ be LOC(ret2)
subcc %g0,%o4,%g0 ! restore cy
/* Add last limb */
-Ljone: ld [s1_ptr],%g4
- ld [s2_ptr],%g2
+LOC(jone):
+ ld [S1_PTR],%g4
+ ld [S2_PTR],%g2
addxcc %g4,%g2,%o4
- st %o4,[res_ptr]
+ st %o4,[RES_PTR]
-Lret2: retl
+LOC(ret2):
+ retl
addx %g0,%g0,%o0 ! return carry-out from most sign. limb
+
+END(__mpn_add_n)
diff --git a/sysdeps/sparc/sparc32/addmul_1.S b/sysdeps/sparc/sparc32/addmul_1.S
index 375d25db6b..5e0c381f4f 100644
--- a/sysdeps/sparc/sparc32/addmul_1.S
+++ b/sysdeps/sparc/sparc32/addmul_1.S
@@ -1,20 +1,20 @@
! SPARC __mpn_addmul_1 -- Multiply a limb vector with a limb and add
! the result to a second limb vector.
-
-! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
-
+!
+! Copyright (C) 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
+!
! This file is part of the GNU MP Library.
-
+!
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
@@ -22,17 +22,14 @@
! INPUT PARAMETERS
-! res_ptr o0
-! s1_ptr o1
-! size o2
-! s2_limb o3
+! RES_PTR o0
+! S1_PTR o1
+! SIZE o2
+! S2_LIMB o3
-#include "sysdep.h"
+#include <sysdep.h>
-.text
- .align 4
- .global C_SYMBOL_NAME(__mpn_addmul_1)
-C_SYMBOL_NAME(__mpn_addmul_1):
+ENTRY(__mpn_addmul_1)
! Make S1_PTR and RES_PTR point at the end of their blocks
! and put (- 4 x SIZE) in index/loop counter.
sll %o2,2,%o2
@@ -41,19 +38,19 @@ C_SYMBOL_NAME(__mpn_addmul_1):
sub %g0,%o2,%o2
cmp %o3,0xfff
- bgu Large
+ bgu LOC(large)
nop
ld [%o1+%o2],%o5
mov 0,%o0
- b L0
+ b LOC(0)
add %o4,-4,%o4
-Loop0:
+LOC(loop0):
addcc %o5,%g1,%g1
ld [%o1+%o2],%o5
addx %o0,%g0,%o0
st %g1,[%o4+%o2]
-L0: wr %g0,%o3,%y
+LOC(0): wr %g0,%o3,%y
sra %o5,31,%g2
and %o3,%g2,%g2
andcc %g1,0,%g1
@@ -79,7 +76,7 @@ L0: wr %g0,%o3,%y
addcc %g1,%o0,%g1
addx %g2,%g4,%o0 ! add sign-compensation and cy to hi limb
addcc %o2,4,%o2 ! loop counter
- bne Loop0
+ bne LOC(loop0)
ld [%o4+%o2],%o5
addcc %o5,%g1,%g1
@@ -88,17 +85,18 @@ L0: wr %g0,%o3,%y
st %g1,[%o4+%o2]
-Large: ld [%o1+%o2],%o5
+LOC(large):
+ ld [%o1+%o2],%o5
mov 0,%o0
sra %o3,31,%g4 ! g4 = mask of ones iff S2_LIMB < 0
- b L1
+ b LOC(1)
add %o4,-4,%o4
-Loop:
+LOC(loop):
addcc %o5,%g3,%g3
ld [%o1+%o2],%o5
addx %o0,%g0,%o0
st %g3,[%o4+%o2]
-L1: wr %g0,%o5,%y
+LOC(1): wr %g0,%o5,%y
and %o5,%g4,%g2
andcc %g0,%g0,%g1
mulscc %g1,%o3,%g1
@@ -138,10 +136,12 @@ L1: wr %g0,%o5,%y
addcc %g3,%o0,%g3
addx %g2,%g1,%o0
addcc %o2,4,%o2
- bne Loop
+ bne LOC(loop)
ld [%o4+%o2],%o5
addcc %o5,%g3,%g3
addx %o0,%g0,%o0
retl
st %g3,[%o4+%o2]
+
+END(__mpn_addmul_1)
diff --git a/sysdeps/sparc/sparc32/alloca.S b/sysdeps/sparc/sparc32/alloca.S
index dcbd171163..1eb755afab 100644
--- a/sysdeps/sparc/sparc32/alloca.S
+++ b/sysdeps/sparc/sparc32/alloca.S
@@ -16,7 +16,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#include "sysdep.h"
+#include <sysdep.h>
/* Code produced by Sun's C compiler calls this function with two extra
arguments which it makes relocatable symbols but seem always to be
@@ -30,3 +30,4 @@ ENTRY (__builtin_alloca)
sub %sp, %o0, %sp /* Push some stack space. */
retl /* Return; the returned buffer leaves 96 */
add %sp, 96, %o0 /* bytes of register save area at the top. */
+END (__builtin_alloca)
diff --git a/sysdeps/sparc/sparc32/bsd-_setjmp.S b/sysdeps/sparc/sparc32/bsd-_setjmp.S
index bf49765f4d..4e6a2da560 100644
--- a/sysdeps/sparc/sparc32/bsd-_setjmp.S
+++ b/sysdeps/sparc/sparc32/bsd-_setjmp.S
@@ -1,40 +1 @@
-/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Sparc version.
- Copyright (C) 1994, 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
- 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 <sysdep.h>
-
-ENTRY (_setjmp)
-
-#ifdef PIC
- save %sp, -64, %sp
-1: call 2f
- sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1
-2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1
- add %g1, %o7, %g1
- sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g2
- restore
- or %g2, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g2
- ld [%g1+%g2], %g1
-#else
- sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1
- or %g1, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1
-#endif
-
- jmp %g1
- mov %g0, %o1 /* Pass second argument of zero. */
+/* _setjmp is in setjmp.S */
diff --git a/sysdeps/sparc/sparc32/bsd-setjmp.S b/sysdeps/sparc/sparc32/bsd-setjmp.S
index 16dc260765..1da848d2f1 100644
--- a/sysdeps/sparc/sparc32/bsd-setjmp.S
+++ b/sysdeps/sparc/sparc32/bsd-setjmp.S
@@ -1,40 +1 @@
-/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Sparc version.
- Copyright (C) 1994, 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
- 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 <sysdep.h>
-
-ENTRY (setjmp)
-
-#ifdef PIC
- save %sp, -64, %sp
-1: call 2f
- sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1
-2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1
- add %g1, %o7, %g1
- sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g2
- restore
- or %g2, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g2
- ld [%g1+%g2], %g1
-#else
- sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1
- or %g1, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1
-#endif
-
- jmp %g1
- mov 1, %o1 /* Pass second argument of one. */
+/* setjmp is in setjmp.S */
diff --git a/sysdeps/sparc/sparc32/divrem.m4 b/sysdeps/sparc/sparc32/divrem.m4
index 665abf11ae..30d532ad77 100644
--- a/sysdeps/sparc/sparc32/divrem.m4
+++ b/sysdeps/sparc/sparc32/divrem.m4
@@ -47,8 +47,8 @@ define(V, `%o5')dnl
dnl
dnl m4 reminder: ifelse(a,b,c,d) => if a is b, then c, else d
define(T, `%g1')dnl
-define(SC, `%g7')dnl
-ifelse(S, `true', `define(SIGN, `%g6')')dnl
+define(SC, `%g2')dnl
+ifelse(S, `true', `define(SIGN, `%g3')')dnl
dnl
dnl This is the recursive definition for developing quotient digits.
@@ -65,7 +65,7 @@ dnl modified to reflect the output R.
dnl
define(DEVELOP_QUOTIENT_BITS,
` ! depth $1, accumulated bits $2
- bl L.$1.eval(2**N+$2)
+ bl LOC($1.eval(2**N+$2))
srl V,1,V
! remainder is positive
subcc R,V,R
@@ -73,7 +73,7 @@ define(DEVELOP_QUOTIENT_BITS,
` b 9f
add Q, ($2*2+1), Q
', ` DEVELOP_QUOTIENT_BITS(incr($1), `eval(2*$2+1)')')
-L.$1.eval(2**N+$2):
+LOC($1.eval(2**N+$2)):
! remainder is negative
addcc R,V,R
ifelse($1, N,
@@ -82,18 +82,10 @@ L.$1.eval(2**N+$2):
', ` DEVELOP_QUOTIENT_BITS(incr($1), `eval(2*$2-1)')')
ifelse($1, 1, `9:')')dnl
-#include "sysdep.h"
-#ifdef __linux__
-#include <asm/traps.h>
-#else
-#ifdef __svr4__
+#include <sysdep.h>
#include <sys/trap.h>
-#else
-#include <machine/trap.h>
-#endif
-#endif
-FUNC(NAME)
+ENTRY(NAME)
ifelse(S, `true',
` ! compute sign of result; if neither is negative, no problem
orcc divisor, dividend, %g0 ! either negative?
@@ -124,11 +116,11 @@ ifelse(OP, `div',
1:
cmp R, V ! if divisor exceeds dividend, done
- blu Lgot_result ! (and algorithm fails otherwise)
+ blu LOC(got_result) ! (and algorithm fails otherwise)
clr Q
sethi %hi(1 << (WORDSIZE - TOPBITS - 1)), T
cmp R, T
- blu Lnot_really_big
+ blu LOC(not_really_big)
clr ITER
! `Here the dividend is >= 2**(31-N) or so. We must be careful here,
@@ -146,7 +138,7 @@ ifelse(OP, `div',
! Now compute SC.
2: addcc V, V, V
- bcc Lnot_too_big
+ bcc LOC(not_too_big)
add SC, 1, SC
! We get here if the divisor overflowed while shifting.
@@ -155,14 +147,14 @@ ifelse(OP, `div',
sll T, TOPBITS, T ! high order bit
srl V, 1, V ! rest of V
add V, T, V
- b Ldo_single_div
+ b LOC(do_single_div)
sub SC, 1, SC
- Lnot_too_big:
+ LOC(not_too_big):
3: cmp V, R
blu 2b
nop
- be Ldo_single_div
+ be LOC(do_single_div)
nop
/* NB: these are commented out in the V8-Sparc manual as well */
/* (I do not understand this) */
@@ -177,15 +169,15 @@ ifelse(OP, `div',
! order bit set in the first step, just falling into the regular
! division loop will mess up the first time around.
! So we unroll slightly...
- Ldo_single_div:
+ LOC(do_single_div):
subcc SC, 1, SC
- bl Lend_regular_divide
+ bl LOC(end_regular_divide)
nop
sub R, V, R
mov 1, Q
- b Lend_single_divloop
+ b LOC(end_single_divloop)
nop
- Lsingle_divloop:
+ LOC(single_divloop):
sll Q, 1, Q
bl 1f
srl V, 1, V
@@ -197,37 +189,37 @@ ifelse(OP, `div',
add R, V, R
sub Q, 1, Q
2:
- Lend_single_divloop:
+ LOC(end_single_divloop):
subcc SC, 1, SC
- bge Lsingle_divloop
+ bge LOC(single_divloop)
tst R
- b,a Lend_regular_divide
+ b,a LOC(end_regular_divide)
-Lnot_really_big:
+LOC(not_really_big):
1:
sll V, N, V
cmp V, R
bleu 1b
addcc ITER, 1, ITER
- be Lgot_result
+ be LOC(got_result)
sub ITER, 1, ITER
tst R ! set up for initial iteration
-Ldivloop:
+LOC(divloop):
sll Q, N, Q
DEVELOP_QUOTIENT_BITS(1, 0)
-Lend_regular_divide:
+LOC(end_regular_divide):
subcc ITER, 1, ITER
- bge Ldivloop
+ bge LOC(divloop)
tst R
- bl,a Lgot_result
+ bl,a LOC(got_result)
! non-restoring fixup here (one instruction only!)
ifelse(OP, `div',
` sub Q, 1, Q
', ` add R, divisor, R
')
-Lgot_result:
+LOC(got_result):
ifelse(S, `true',
` ! check to see if answer should be < 0
tst SIGN
@@ -236,3 +228,5 @@ ifelse(S, `true',
1:')
retl
ifelse(OP, `div', `mov Q, %o0', `mov R, %o0')
+
+END(NAME)
diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h
index f7bcba0c2f..7c547f24ba 100644
--- a/sysdeps/sparc/sparc32/dl-machine.h
+++ b/sysdeps/sparc/sparc32/dl-machine.h
@@ -30,7 +30,7 @@
#define OPCODE_CALL 0x40000000 /* call ?; add PC-rel word address */
#define OPCODE_SETHI_G1 0x03000000 /* sethi ?, %g1; add value>>10 */
#define OPCODE_JMP_G1 0x81c06000 /* jmp %g1+?; add lo 10 bits of value */
-#define OPCODE_SAVE_SP64 0x9de3bfc0 /* save %sp, -64, %sp */
+#define OPCODE_SAVE_SP 0x9de3bfa8 /* save %sp, -(16+6)*4, %sp */
/* Return nonzero iff E_MACHINE is compatible with the running host. */
@@ -55,7 +55,7 @@ elf_machine_dynamic (void)
static inline Elf32_Addr
elf_machine_load_address (void)
{
- register Elf32_Addr pc __asm("%o7"), got;
+ register Elf32_Addr pc __asm("%o7"), pic __asm("%l7"), got;
/* Utilize the fact that a local .got entry will be partially
initialized at startup awaiting its RELATIVE fixup. */
@@ -64,50 +64,187 @@ elf_machine_load_address (void)
".Load_address:\n\t"
"call 1f\n\t"
"or %1,%%lo(.Load_address),%1\n"
- "1:\tld [%%l7+%1],%1"
- : "=r"(pc), "=r"(got));
+ "1:\tld [%2+%1],%1"
+ : "=r"(pc), "=r"(got) : "r"(pic));
return pc - got;
}
- Elf32_Addr addr;
-
- asm (
- "add %%fp,0x44,%%o2\n\t" /* o2 = point to argc */
- "ld [%%o2 - 4],%%o0\n\t" /* o0 = load argc */
- "sll %%o0, 2, %%o0\n\t" /* o0 = argc * sizeof (int) */
- "add %%o2,%%o0,%%o2\n\t" /* o2 = skip over argv */
- "add %%o2,4,%%o2\n\t" /* skip over null after argv */
-
- /* Now %o2 is pointing to env, skip over that as well. */
- "1:\n\t"
- "ld [%%o2],%%o0\n\t"
- "cmp %%o0,0\n\t"
- "bnz 1b\n\t"
- "add %%o2,4,%%o2\n\t"
-
- /* Note that above, we want to advance the NULL after envp so
- we always add 4. */
-
- /* Now, search for the AT_BASE property. */
- "2:\n\t"
- "ld [%%o2],%%o0\n\t"
- "cmp %%o0,0\n\t"
- "be,a 3f\n\t"
- "or %%g0,%%g0,%0\n\t"
- "cmp %%o0,7\n\t" /* AT_BASE = 7 */
- "be,a 3f\n\t"
- "ld [%%o2+4],%0\n\t"
- "b 2b\n\t"
- "add %%o2,8,%%o2\n\t"
- /* At this point %0 has the load address for the interpreter */
- "3:\n\t"
- : "=r" (addr)
- : /* no inputs */
- : "o0", "o2");
- return addr;
+/* Set up the loaded object described by L so its unrelocated PLT
+ entries will jump to the on-demand fixup code in dl-runtime.c. */
+
+static inline int
+elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+{
+ Elf32_Addr *plt;
+ extern void _dl_runtime_resolve (Elf32_Word);
+
+ if (l->l_info[DT_JMPREL] && lazy)
+ {
+ /* The entries for functions in the PLT have not yet been filled in.
+ Their initial contents will arrange when called to set the high 22
+ bits of %g1 with an offset into the .rela.plt section and jump to
+ the beginning of the PLT. */
+ plt = (Elf32_Addr *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr);
+
+ /* The beginning of the PLT does:
+
+ save %sp, -64, %sp
+ pltpc: call _dl_runtime_resolve
+ nop
+ .word MAP
+
+ This saves the register window containing the arguments, and the
+ PC value (pltpc) implicitly saved in %o7 by the call points near the
+ location where we store the link_map pointer for this object. */
+
+ plt[0] = OPCODE_SAVE_SP;
+ /* Construct PC-relative word address. */
+ plt[1] = OPCODE_CALL | (((Elf32_Addr) &_dl_runtime_resolve -
+ (Elf32_Addr) &plt[1]) >> 2);
+ plt[2] = OPCODE_NOP; /* Fill call delay slot. */
+ plt[3] = (Elf32_Addr) l;
+ }
+
+ return lazy;
}
+/* This code is used in dl-runtime.c to call the `fixup' function
+ and then redirect to the address it returns. */
+#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+ .globl _dl_runtime_resolve
+ .type _dl_runtime_resolve, @function
+_dl_runtime_resolve:
+ /* Set up the arguments to fixup --
+ %o0 = link_map out of plt0
+ %o1 = offset of reloc entry */
+ ld [%o7 + 8], %o0
+ srl %g1, 10, %o1
+ call fixup
+ sub %o1, 4*12, %o1
+ jmp %o0
+ restore
+ .size _dl_runtime_resolve, . - _dl_runtime_resolve");
+
+/* The address of the JMP_SLOT reloc is the .plt entry, thus we don't
+ dereference the reloc's addr to get the final destination. Ideally
+ there would be a generic way to return the value of the symbol from
+ elf_machine_relplt, but as it is, the address of the .plt entry is
+ good enough. */
+#define ELF_FIXUP_RETURN_VALUE(map, result) ((Elf32_Addr) &(result))
+
+/* Nonzero iff TYPE should not be allowed to resolve to one of
+ the main executable's symbols, as for a COPY reloc. */
+#define elf_machine_lookup_noexec_p(type) ((type) == R_SPARC_COPY)
+
+/* Nonzero iff TYPE describes relocation of a PLT entry, so
+ PLT entries should not be allowed to define the value. */
+#define elf_machine_lookup_noplt_p(type) ((type) == R_SPARC_JMP_SLOT)
+
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
+#define ELF_MACHINE_RELOC_NOPLT R_SPARC_JMP_SLOT
+
+/* The SPARC never uses Elf32_Rel relocations. */
+#define ELF_MACHINE_NO_REL 1
+
+/* The SPARC overlaps DT_RELA and DT_PLTREL. */
+#define ELF_MACHINE_PLTREL_OVERLAP 1
+
+/* The PLT uses Elf32_Rela relocs. */
+#define elf_machine_relplt elf_machine_rela
+
+/* Initial entry point code for the dynamic linker.
+ The C function `_dl_start' is the real entry point;
+ its return value is the user program's entry point. */
+
+#define RTLD_START __asm__ ("\
+.text
+ .globl _start
+ .type _start,@function
+_start:
+ /* Allocate space for functions to drop their arguments. */
+ sub %sp, 6*4, %sp
+ /* Pass pointer to argument block to _dl_start. */
+ call _dl_start
+ add %sp, 22*4, %o0
+ /* FALTHRU */
+ .globl _dl_start_user
+ .type _dl_start_user,@function
+_dl_start_user:
+ /* Load the PIC register. */
+1: call 2f
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+ add %l7, %o7, %l7
+ /* Save the user entry point address in %l0 */
+ mov %o0, %l0
+ /* See if we were run as a command with the executable file name as an
+ extra leading argument. If so, adjust the contents of the stack. */
+ sethi %hi(_dl_skip_args), %g2
+ or %g2, %lo(_dl_skip_args), %g2
+ ld [%l7+%g2], %i0
+ ld [%i0], %i0
+ tst %i0
+ beq 3f
+ nop
+ /* Find out how far to shift. */
+ ld [%sp+22*4], %i1 /* load argc */
+ sub %i1, %i0, %i1
+ sll %i0, 2, %i2
+ st %i1, [%sp+22*4]
+ add %sp, 23*4, %i1
+ add %i1, %i2, %i2
+ /* Copy down argv */
+21: ld [%i2], %i3
+ add %i2, 4, %i2
+ tst %i3
+ st %i3, [%i1]
+ bne 21b
+ add %i1, 4, %i1
+ /* Copy down env */
+22: ld [%i2], %i3
+ add %i2, 4, %i2
+ tst %i3
+ st %i3, [%i1]
+ bne 22b
+ add %i1, 4, %i1
+ /* Copy down auxiliary table. */
+23: ld [%i2], %i3
+ ld [%i2+4], %i4
+ add %i2, 8, %i2
+ tst %i3
+ st %i3, [%i1]
+ st %i4, [%i1+4]
+ bne 23b
+ add %i1, 8, %i1
+ /* Load _dl_default_scope[2] to pass to _dl_init_next. */
+3: sethi %hi(_dl_default_scope), %g1
+ or %g1, %lo(_dl_default_scope), %g1
+ ld [%l7+%g1], %l1
+ ld [%l1+2*4], %l1
+ /* Call _dl_init_next to return the address of an initializer to run. */
+4: call _dl_init_next
+ mov %l1, %o0
+ tst %o0
+ beq 5f
+ nop
+ jmpl %o0, %o7
+ nop
+ ba,a 4b
+ /* Clear the startup flag. */
+5: sethi %hi(_dl_starting_up), %g1
+ or %g1, %lo(_dl_starting_up), %g1
+ ld [%l7+%g1], %g1
+ st %g0, [%g1]
+ /* Pass our finalizer function to the user in %g1. */
+ sethi %hi(_dl_fini), %g1
+ or %g1, %lo(_dl_fini), %g1
+ ld [%l7+%g1], %g1
+ /* Jump to the user's entry point and deallocate the extra stack we got. */
+ jmp %l0
+ add %sp, 6*4, %sp
+ .size _dl_start_user,.-_dl_start_user");
+
#ifdef RESOLVE
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
MAP is the object containing the reloc. */
@@ -117,7 +254,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
const Elf32_Sym *sym, const struct r_found_version *version,
Elf32_Addr *const reloc_addr)
{
- Elf32_Addr loadbase;
+ extern unsigned long _dl_hwcap;
if (ELF32_R_TYPE (reloc->r_info) == R_SPARC_RELATIVE)
{
@@ -144,6 +281,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
switch (ELF32_R_TYPE (reloc->r_info))
{
case R_SPARC_COPY:
+#ifndef RTLD_BOOTSTRAP
if (sym->st_size > refsym->st_size
|| (_dl_verbose && sym->st_size < refsym->st_size))
{
@@ -159,14 +297,21 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
}
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
refsym->st_size));
+#endif
break;
case R_SPARC_GLOB_DAT:
case R_SPARC_32:
*reloc_addr = value;
break;
case R_SPARC_JMP_SLOT:
- reloc_addr[1] = OPCODE_SETHI_G1 | (value >> 10);
+ /* For thread safety, write the instructions from the bottom and
+ flush before we overwrite the critical "b,a". */
reloc_addr[2] = OPCODE_JMP_G1 | (value & 0x3ff);
+ if (1 || (_dl_hwcap & 1)) /* HWCAP_SPARC_FLUSH */
+ __asm __volatile ("flush %0+8" : : "r"(reloc_addr));
+ reloc_addr[1] = OPCODE_SETHI_G1 | (value >> 10);
+ if (1 || (_dl_hwcap & 1)) /* HWCAP_SPARC_FLUSH */
+ __asm __volatile ("flush %0+4" : : "r"(reloc_addr));
break;
case R_SPARC_8:
*(char *) reloc_addr = value;
@@ -218,146 +363,3 @@ elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
}
#endif /* RESOLVE */
-
-/* Nonzero iff TYPE should not be allowed to resolve to one of
- the main executable's symbols, as for a COPY reloc. */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_SPARC_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
- PLT entries should not be allowed to define the value. */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_SPARC_JMP_SLOT)
-
-/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
-#define ELF_MACHINE_RELOC_NOPLT R_SPARC_JMP_SLOT
-
-/* The SPARC never uses Elf32_Rel relocations. */
-#define ELF_MACHINE_NO_REL 1
-
-/* The SPARC overlaps DT_RELA and DT_PLTREL. */
-#define ELF_MACHINE_PLTREL_OVERLAP 1
-
-/* Set up the loaded object described by L so its unrelocated PLT
- entries will jump to the on-demand fixup code in dl-runtime.c. */
-
-static inline int
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
-{
- Elf32_Addr *plt;
- extern void _dl_runtime_resolve (Elf32_Word);
-
- if (l->l_info[DT_JMPREL] && lazy)
- {
- /* The entries for functions in the PLT have not yet been filled in.
- Their initial contents will arrange when called to set the high 22
- bits of %g1 with an offset into the .rela.plt section and jump to
- the beginning of the PLT. */
- plt = (Elf32_Addr *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr);
-
- /* The beginning of the PLT does:
-
- save %sp, -64, %sp
- pltpc: call _dl_runtime_resolve
- nop
- .word MAP
-
- This saves the register window containing the arguments, and the
- PC value (pltpc) implicitly saved in %o7 by the call points near the
- location where we store the link_map pointer for this object. */
-
- plt[0] = OPCODE_SAVE_SP64; /* save %sp, -64, %sp */
- /* Construct PC-relative word address. */
- plt[1] = OPCODE_CALL | (((Elf32_Addr) &_dl_runtime_resolve -
- (Elf32_Addr) &plt[1]) >> 2);
- plt[2] = OPCODE_NOP; /* Fill call delay slot. */
- plt[3] = (Elf32_Addr *) l;
- }
-
- return lazy;
-}
-
-/* This code is used in dl-runtime.c to call the `fixup' function
- and then redirect to the address it returns. */
-#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
-# Trampoline for _dl_runtime_resolver
- .globl _dl_runtime_resolve
- .type _dl_runtime_resolve, @function
-_dl_runtime_resolve:
- t 1
- #call %g0
- # Pass two args to fixup: the PLT address computed from the PC saved
- # in the PLT's call insn, and the reloc offset passed in %g1.
- #ld [%o7 + 8], %o1 | Second arg, loaded from PLTPC[2].
- #call fixup
- #shrl %g1, 22, %o0 | First arg, set in delay slot of call.
- # Jump to the real function.
- #jmpl %o0, %g0
- # In the delay slot of that jump, restore the register window
- # saved by the first insn of the PLT.
- #restore
- .size _dl_runtime_resolve, . - _dl_runtime_resolve
-");
-
-/* The PLT uses Elf32_Rela relocs. */
-#define elf_machine_relplt elf_machine_rela
-
-
-/* Mask identifying addresses reserved for the user program,
- where the dynamic linker should not map anything. */
-#define ELF_MACHINE_USER_ADDRESS_MASK ???
-
-/* Initial entry point code for the dynamic linker.
- The C function `_dl_start' is the real entry point;
- its return value is the user program's entry point. */
-
-#define RTLD_START __asm__ ( \
-".text\n\
- .globl _start\n\
- .type _start,@function\n\
-_start:\n\
- /* Pass pointer to argument block to _dl_start. */\n\
- add %sp,64,%o0\n\
- call _dl_start\n\
- nop\n\
- \n\
- mov %o0,%l0\n\
- \n\
-2:\n\
- call 1f\n\
- nop\n\
-1:\n\
- sethi %hi(_GLOBAL_OFFSET_TABLE_-(2b-.)),%l2\n\
- sethi %hi(_dl_default_scope),%l3\n\
- or %l2,%lo(_GLOBAL_OFFSET_TABLE_-(2b-.)),%l2\n\
- or %l3,%lo(_dl_default_scope),%l3\n\
- add %o7,%l2,%l1\n\
- # %l1 has the GOT. %l3 has _dl_default_scope GOT offset\n\
- ld [%l1+%l3],%l4\n\
- # %l4 has pointer to _dl_default_scope. Now, load _dl_default_scope [2]\n\
- ld [%l4+8],%l4\n\
- # %l4 has _dl_default_scope [2]\n\
- # call _dl_init_next until it returns 0, pass _dl_default_scope [2]\n\
-3:\n\
- call _dl_init_next\n\
- mov %l4,%o0\n\
- cmp %o0,%g0\n\
- bz,a 4f\n\
- nop\n\
- call %o0\n\
- /* Pass pointer to argument block to this init function */\n\
- add %sp,64,%o0\n\
- b,a 3b\n\
-4:\n\
- # Clear the _dl_starting_up variable and pass _dl_fini in %g1 as per ELF ABI.\n\
- sethi %hi(_dl_starting_up),%l4\n\
- sethi %hi(_dl_fini),%l3\n\
- or %l4,%lo(_dl_starting_up),%l4\n\
- or %l3,%lo(_dl_fini),%l3\n\
- # clear _dl_starting_up\n\
- ld [%l1+%l4],%l5\n\
- st %g0,[%l5]\n\
- # load out fini function for atexit in %g1\n\
- ld [%l3+%l1],%g1\n\
- # jump to the user program entry point.\n\
- jmpl %l0,%g0\n\
- nop\n\
-");
diff --git a/sysdeps/sparc/sparc32/dotmul.S b/sysdeps/sparc/sparc32/dotmul.S
index 7ce695cb7a..821aa8bdb4 100644
--- a/sysdeps/sparc/sparc32/dotmul.S
+++ b/sysdeps/sparc/sparc32/dotmul.S
@@ -10,11 +10,13 @@
* This code optimizes short (less than 13-bit) multiplies.
*/
-#include "sysdep.h"
+#include <sysdep.h>
+
+
ENTRY(.mul)
mov %o0, %y ! multiplier -> Y
andncc %o0, 0xfff, %g0 ! test bits 12..31
- be Lmul_shortway ! if zero, can do it the short way
+ be LOC(mul_shortway) ! if zero, can do it the short way
andcc %g0, %g0, %o4 ! zero the partial product and clear N and V
/*
@@ -81,7 +83,7 @@ ENTRY(.mul)
! and put upper half in place
#endif
-Lmul_shortway:
+LOC(mul_shortway):
/*
* Short multiply. 12 steps, followed by a final shift step.
* The resulting bits are off by 12 and (32-12) = 20 bit positions,
@@ -121,3 +123,5 @@ Lmul_shortway:
or %o5, %o0, %o0 ! construct low part of result
retl
sra %o4, 20, %o1 ! ... and extract high part of result
+
+END(.mul)
diff --git a/sysdeps/sparc/sparc32/elf/start.S b/sysdeps/sparc/sparc32/elf/start.S
new file mode 100644
index 0000000000..8e01b30fc7
--- /dev/null
+++ b/sysdeps/sparc/sparc32/elf/start.S
@@ -0,0 +1,86 @@
+/* Startup code for elf32-sparc
+ Copyright (C) 1997 Free Software Foundation, Inc.
+ Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 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 <sysdep.h>
+
+
+ .section ".text"
+ .align 4
+ .global _start
+ .type _start,#function
+_start:
+
+ /* Terminate the stack frame, and reserve space for functions to
+ drop their arguments. */
+ mov %g0, %fp
+ sub %sp, 6*4, %sp
+
+ /* Save %g1. When starting a binary via the dynamic linker, %g1
+ contains the address of the shared library termination function,
+ which we will register below with atexit() to be called by exit().
+ If we are statically linked, this will be NULL. */
+
+ /* Do essential libc initialization (sp points to argc, argv, and envp) */
+ call __libc_init_first
+ mov %g1, %l0
+
+ /* Now that we have the proper stack frame, register library termination
+ function, if there is any: */
+
+ cmp %l0, 0
+ beq 1f
+ nop
+ call atexit
+ mov %l0, %o0
+1:
+
+ /* Extract the arguments and environment as encoded on the stack. The
+ argument info starts after one register window (16 words) past the SP. */
+ ld [%sp+22*4], %o0
+ add %sp, 23*4, %o1
+ sll %o0, 4, %o2
+ add %o2, %o1, %o2
+ sethi %hi(__environ), %g2
+ add %o2, 4, %o2
+ st %o2, [%g2+%lo(__environ)]
+
+ mov %o0, %l0 /* tuck them away */
+ mov %o1, %l1
+
+ /* Call _init, the entry point to our own .init section. */
+ call _init
+ mov %o2, %l2
+
+ /* Register our .fini section with atexit. */
+ sethi %hi(_fini), %o0
+ call atexit
+ add %o0, %lo(_fini), %o0
+
+ /* Call the user's main and exit with its return value. */
+ mov %l0, %o0
+ mov %l1, %o1
+ call main
+ mov %l2, %o2
+ call exit
+ nop
+
+ /* Die very horribly if exit returns. */
+ unimp
+
+ .size _start,.-_start
diff --git a/sysdeps/sparc/sparc32/elf/start.c b/sysdeps/sparc/sparc32/elf/start.c
deleted file mode 100644
index f1e80195ca..0000000000
--- a/sysdeps/sparc/sparc32/elf/start.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Copyright (C) 1991, 1992, 1993, 1994, 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
- 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 <errno.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-extern char **__environ;
-
-extern void __libc_init_first __P ((int argc, char **argv, char **envp));
-extern int main __P ((int argc, char **argv, char **envp));
-
-register long int sp asm("%sp"), fp asm("%fp");
-
-void
-_start (void)
-{
- /* It is important that these be declared `register'.
- Otherwise, when compiled without optimization, they are put on the
- stack, which loses completely after we zero the FP. */
- register int argc;
- register char **argv, **envp;
- register long int g1 asm ("%g1");
- unsigned long int copy_g1 = g1;
-
- /* Unwind the frame built when we entered the function. */
- asm("restore");
- if (copy_g1)
- atexit (copy_g1);
-
- /* And clear the frame pointer. */
- fp = 0;
-
- /* The argument info starts after one register
- window (64 bytes) past the SP. */
- argc = ((int *) sp)[16];
- argv = (char **) &((int *) sp)[17];
- envp = &argv[argc + 1];
- __environ = envp;
-
- /* Allocate 24 bytes of stack space for the register save area. */
- sp -= 24;
- __libc_init_first (argc, argv, envp);
-#ifdef ELF_INIT_FINI
- {
- extern void _fini (void);
- _init ();
- atexit (_fini);
- }
-#endif
- exit (main (argc, argv, envp));
-}
diff --git a/sysdeps/sparc/sparc32/fpu/bits/fenv.h b/sysdeps/sparc/sparc32/fpu/bits/fenv.h
index 0560dd99b8..6a76795d6a 100644
--- a/sysdeps/sparc/sparc32/fpu/bits/fenv.h
+++ b/sysdeps/sparc/sparc32/fpu/bits/fenv.h
@@ -72,5 +72,5 @@ typedef unsigned int fenv_t;
#endif
/* For internal use only: access the fp state register. */
-#define __fenv_stfsr(X) __asm__("stfsr %0" : "=m"(X))
-#define __fenv_ldfsr(X) __asm__ __volatile__("ldfsr %0" : : "m"(X))
+#define __fenv_stfsr(X) __asm__("st %%fsr,%0" : "=m"(X))
+#define __fenv_ldfsr(X) __asm__ __volatile__("ld %0,%%fsr" : : "m"(X))
diff --git a/sysdeps/sparc/sparc32/fpu/fpu_control.h b/sysdeps/sparc/sparc32/fpu/fpu_control.h
index 5ef3824702..c069318970 100644
--- a/sysdeps/sparc/sparc32/fpu/fpu_control.h
+++ b/sysdeps/sparc/sparc32/fpu/fpu_control.h
@@ -41,13 +41,11 @@
/* Now two recommended cw */
-/* Linux default:
+/* Linux and IEEE default:
- extended precision
- rounding to nearest
- - exceptions on overflow, zero divide and NaN */
-#define _FPU_DEFAULT 0x1e
-
-/* IEEE: same as above, but exceptions */
+ - no exceptions. */
+#define _FPU_DEFAULT 0x0
#define _FPU_IEEE 0x0
/* Type of the control word. */
diff --git a/sysdeps/sparc/sparc32/lshift.S b/sysdeps/sparc/sparc32/lshift.S
index 4f0595f2fb..35aa9378b3 100644
--- a/sysdeps/sparc/sparc32/lshift.S
+++ b/sysdeps/sparc/sparc32/lshift.S
@@ -1,19 +1,19 @@
-! sparc __mpn_lshift --
-
-! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-
+! Sparc __mpn_lshift --
+!
+! Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+!
! This file is part of the GNU MP Library.
-
+!
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
@@ -21,17 +21,14 @@
! INPUT PARAMETERS
-! res_ptr %o0
-! src_ptr %o1
-! size %o2
-! cnt %o3
+! RES_PTR %o0
+! SRC_PTR %o1
+! SIZE %o2
+! CNT %o3
-#include "sysdep.h"
+#include <sysdep.h>
- .text
- .align 4
- .global C_SYMBOL_NAME(__mpn_lshift)
-C_SYMBOL_NAME(__mpn_lshift):
+ENTRY(__mpn_lshift)
sll %o2,2,%g1
add %o1,%g1,%o1 ! make %o1 point at end of src
ld [%o1-4],%g2 ! load first limb
@@ -40,12 +37,13 @@ C_SYMBOL_NAME(__mpn_lshift):
add %o2,-1,%o2
andcc %o2,4-1,%g4 ! number of limbs in first loop
srl %g2,%o5,%g1 ! compute function result
- be L0 ! if multiple of 4 limbs, skip first loop
+ be LOC(0) ! if multiple of 4 limbs, skip first loop
st %g1,[%sp+80]
sub %o2,%g4,%o2 ! adjust count for main loop
-Loop0: ld [%o1-8],%g3
+LOC(loop0):
+ ld [%o1-8],%g3
add %o0,-4,%o0
add %o1,-4,%o1
addcc %g4,-1,%g4
@@ -53,14 +51,15 @@ Loop0: ld [%o1-8],%g3
srl %g3,%o5,%g1
mov %g3,%g2
or %o4,%g1,%o4
- bne Loop0
+ bne LOC(loop0)
st %o4,[%o0+0]
-L0: tst %o2
- be Lend
+LOC(0): tst %o2
+ be LOC(end)
nop
-Loop: ld [%o1-8],%g3
+LOC(loop):
+ ld [%o1-8],%g3
add %o0,-16,%o0
addcc %o2,-4,%o2
sll %g2,%o3,%o4
@@ -86,10 +85,13 @@ Loop: ld [%o1-8],%g3
add %o1,-16,%o1
or %g4,%g1,%g4
- bne Loop
+ bne LOC(loop)
st %g4,[%o0+0]
-Lend: sll %g2,%o3,%g2
+LOC(end):
+ sll %g2,%o3,%g2
st %g2,[%o0-4]
retl
ld [%sp+80],%o0
+
+END(__mpn_lshift)
diff --git a/sysdeps/sparc/sparc32/mul_1.S b/sysdeps/sparc/sparc32/mul_1.S
index 142fd8ba2a..d39ec61028 100644
--- a/sysdeps/sparc/sparc32/mul_1.S
+++ b/sysdeps/sparc/sparc32/mul_1.S
@@ -1,20 +1,20 @@
! SPARC __mpn_mul_1 -- Multiply a limb vector with a limb and store
! the result in a second limb vector.
-
-! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
-
+!
+! Copyright (C) 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
+!
! This file is part of the GNU MP Library.
-
+!
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
@@ -22,10 +22,10 @@
! INPUT PARAMETERS
-! res_ptr o0
-! s1_ptr o1
-! size o2
-! s2_limb o3
+! RES_PTR o0
+! S1_PTR o1
+! SIZE o2
+! S2_LIMB o3
! ADD CODE FOR SMALL MULTIPLIERS!
!1: ld
@@ -89,12 +89,9 @@
! sll a,29,y2
! st x,
-#include "sysdep.h"
+#include <sysdep.h>
-.text
- .align 4
- .global C_SYMBOL_NAME(__mpn_mul_1)
-C_SYMBOL_NAME(__mpn_mul_1):
+ENTRY(__mpn_mul_1)
! Make S1_PTR and RES_PTR point at the end of their blocks
! and put (- 4 x SIZE) in index/loop counter.
sll %o2,2,%o2
@@ -103,16 +100,16 @@ C_SYMBOL_NAME(__mpn_mul_1):
sub %g0,%o2,%o2
cmp %o3,0xfff
- bgu Large
+ bgu LOC(large)
nop
ld [%o1+%o2],%o5
mov 0,%o0
- b L0
+ b LOC(0)
add %o4,-4,%o4
-Loop0:
+LOC(loop0):
st %g1,[%o4+%o2]
-L0: wr %g0,%o3,%y
+LOC(0): wr %g0,%o3,%y
sra %o5,31,%g2
and %o3,%g2,%g2
andcc %g1,0,%g1
@@ -138,21 +135,22 @@ L0: wr %g0,%o3,%y
addcc %g1,%o0,%g1
addx %g2,%g4,%o0 ! add sign-compensation and cy to hi limb
addcc %o2,4,%o2 ! loop counter
- bne,a Loop0
+ bne,a LOC(loop0)
ld [%o1+%o2],%o5
retl
st %g1,[%o4+%o2]
-Large: ld [%o1+%o2],%o5
+LOC(large):
+ ld [%o1+%o2],%o5
mov 0,%o0
sra %o3,31,%g4 ! g4 = mask of ones iff S2_LIMB < 0
- b L1
+ b LOC(1)
add %o4,-4,%o4
-Loop:
+LOC(loop):
st %g3,[%o4+%o2]
-L1: wr %g0,%o5,%y
+LOC(1): wr %g0,%o5,%y
and %o5,%g4,%g2 ! g2 = S1_LIMB iff S2_LIMB < 0, else 0
andcc %g0,%g0,%g1
mulscc %g1,%o3,%g1
@@ -192,8 +190,10 @@ L1: wr %g0,%o5,%y
addcc %g3,%o0,%g3
addx %g2,%g1,%o0 ! add sign-compensation and cy to hi limb
addcc %o2,4,%o2 ! loop counter
- bne,a Loop
+ bne,a LOC(loop)
ld [%o1+%o2],%o5
retl
st %g3,[%o4+%o2]
+
+END(__mpn_mul_1)
diff --git a/sysdeps/sparc/sparc32/rem.S b/sysdeps/sparc/sparc32/rem.S
index d50f1af630..effacee0d0 100644
--- a/sysdeps/sparc/sparc32/rem.S
+++ b/sysdeps/sparc/sparc32/rem.S
@@ -37,22 +37,14 @@
-#include "sysdep.h"
-#ifdef __linux__
-#include <asm/traps.h>
-#else
-#ifdef __svr4__
+#include <sysdep.h>
#include <sys/trap.h>
-#else
-#include <machine/trap.h>
-#endif
-#endif
ENTRY(.rem)
! compute sign of result; if neither is negative, no problem
orcc %o1, %o0, %g0 ! either negative?
bge 2f ! no, go do the divide
- mov %o0, %g6 ! sign of remainder matches %o0
+ mov %o0, %g3 ! sign of remainder matches %o0
tst %o1
bge 1f
tst %o0
@@ -76,11 +68,11 @@ ENTRY(.rem)
1:
cmp %o3, %o5 ! if %o1 exceeds %o0, done
- blu Lgot_result ! (and algorithm fails otherwise)
+ blu LOC(got_result) ! (and algorithm fails otherwise)
clr %o2
sethi %hi(1 << (32 - 4 - 1)), %g1
cmp %o3, %g1
- blu Lnot_really_big
+ blu LOC(not_really_big)
clr %o4
! Here the dividend is >= 2**(31-N) or so. We must be careful here,
@@ -91,15 +83,15 @@ ENTRY(.rem)
1:
cmp %o5, %g1
bgeu 3f
- mov 1, %g7
+ mov 1, %g2
sll %o5, 4, %o5
b 1b
add %o4, 1, %o4
- ! Now compute %g7.
+ ! Now compute %g2.
2: addcc %o5, %o5, %o5
- bcc Lnot_too_big
- add %g7, 1, %g7
+ bcc LOC(not_too_big)
+ add %g2, 1, %g2
! We get here if the %o1 overflowed while shifting.
! This means that %o3 has the high-order bit set.
@@ -107,20 +99,20 @@ ENTRY(.rem)
sll %g1, 4, %g1 ! high order bit
srl %o5, 1, %o5 ! rest of %o5
add %o5, %g1, %o5
- b Ldo_single_div
- sub %g7, 1, %g7
+ b LOC(do_single_div)
+ sub %g2, 1, %g2
- Lnot_too_big:
+ LOC(not_too_big):
3: cmp %o5, %o3
blu 2b
nop
- be Ldo_single_div
+ be LOC(do_single_div)
nop
/* NB: these are commented out in the V8-Sparc manual as well */
/* (I do not understand this) */
! %o5 > %o3: went too far: back up 1 step
! srl %o5, 1, %o5
- ! dec %g7
+ ! dec %g2
! do single-bit divide steps
!
! We have to be careful here. We know that %o3 >= %o5, so we can do the
@@ -129,15 +121,15 @@ ENTRY(.rem)
! order bit set in the first step, just falling into the regular
! division loop will mess up the first time around.
! So we unroll slightly...
- Ldo_single_div:
- subcc %g7, 1, %g7
- bl Lend_regular_divide
+ LOC(do_single_div):
+ subcc %g2, 1, %g2
+ bl LOC(end_regular_divide)
nop
sub %o3, %o5, %o3
mov 1, %o2
- b Lend_single_divloop
+ b LOC(end_single_divloop)
nop
- Lsingle_divloop:
+ LOC(single_divloop):
sll %o2, 1, %o2
bl 1f
srl %o5, 1, %o5
@@ -149,221 +141,223 @@ ENTRY(.rem)
add %o3, %o5, %o3
sub %o2, 1, %o2
2:
- Lend_single_divloop:
- subcc %g7, 1, %g7
- bge Lsingle_divloop
+ LOC(end_single_divloop):
+ subcc %g2, 1, %g2
+ bge LOC(single_divloop)
tst %o3
- b,a Lend_regular_divide
+ b,a LOC(end_regular_divide)
-Lnot_really_big:
+LOC(not_really_big):
1:
sll %o5, 4, %o5
cmp %o5, %o3
bleu 1b
addcc %o4, 1, %o4
- be Lgot_result
+ be LOC(got_result)
sub %o4, 1, %o4
tst %o3 ! set up for initial iteration
-Ldivloop:
+LOC(divloop):
sll %o2, 4, %o2
! depth 1, accumulated bits 0
- bl L.1.16
+ bl LOC(1.16)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 2, accumulated bits 1
- bl L.2.17
+ bl LOC(2.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 3, accumulated bits 3
- bl L.3.19
+ bl LOC(3.19)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits 7
- bl L.4.23
+ bl LOC(4.23)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (7*2+1), %o2
-
-L.4.23:
+
+LOC(4.23):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (7*2-1), %o2
-
-
-L.3.19:
+
+
+LOC(3.19):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits 5
- bl L.4.21
+ bl LOC(4.21)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (5*2+1), %o2
-
-L.4.21:
+
+LOC(4.21):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (5*2-1), %o2
-
-
-
-L.2.17:
+
+
+
+LOC(2.17):
! remainder is negative
addcc %o3,%o5,%o3
! depth 3, accumulated bits 1
- bl L.3.17
+ bl LOC(3.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits 3
- bl L.4.19
+ bl LOC(4.19)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (3*2+1), %o2
-
-L.4.19:
+
+LOC(4.19):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (3*2-1), %o2
-
-
-L.3.17:
+
+
+LOC(3.17):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits 1
- bl L.4.17
+ bl LOC(4.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (1*2+1), %o2
-
-L.4.17:
+
+LOC(4.17):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (1*2-1), %o2
-
-
-
-
-L.1.16:
+
+
+
+
+LOC(1.16):
! remainder is negative
addcc %o3,%o5,%o3
! depth 2, accumulated bits -1
- bl L.2.15
+ bl LOC(2.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 3, accumulated bits -1
- bl L.3.15
+ bl LOC(3.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits -1
- bl L.4.15
+ bl LOC(4.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-1*2+1), %o2
-
-L.4.15:
+
+LOC(4.15):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-1*2-1), %o2
-
-
-L.3.15:
+
+
+LOC(3.15):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits -3
- bl L.4.13
+ bl LOC(4.13)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-3*2+1), %o2
-
-L.4.13:
+
+LOC(4.13):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-3*2-1), %o2
-
-
-
-L.2.15:
+
+
+
+LOC(2.15):
! remainder is negative
addcc %o3,%o5,%o3
! depth 3, accumulated bits -3
- bl L.3.13
+ bl LOC(3.13)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits -5
- bl L.4.11
+ bl LOC(4.11)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-5*2+1), %o2
-
-L.4.11:
+
+LOC(4.11):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-5*2-1), %o2
-
-
-L.3.13:
+
+
+LOC(3.13):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits -7
- bl L.4.9
+ bl LOC(4.9)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-7*2+1), %o2
-
-L.4.9:
+
+LOC(4.9):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-7*2-1), %o2
-
-
-
-
+
+
+
+
9:
-Lend_regular_divide:
+LOC(end_regular_divide):
subcc %o4, 1, %o4
- bge Ldivloop
+ bge LOC(divloop)
tst %o3
- bl,a Lgot_result
+ bl,a LOC(got_result)
! non-restoring fixup here (one instruction only!)
add %o3, %o1, %o3
-Lgot_result:
+LOC(got_result):
! check to see if answer should be < 0
- tst %g6
+ tst %g3
bl,a 1f
sub %g0, %o3, %o3
1:
retl
mov %o3, %o0
+
+END(.rem)
diff --git a/sysdeps/sparc/sparc32/rshift.S b/sysdeps/sparc/sparc32/rshift.S
index fea4f3b926..db1d2526cd 100644
--- a/sysdeps/sparc/sparc32/rshift.S
+++ b/sysdeps/sparc/sparc32/rshift.S
@@ -1,19 +1,19 @@
! sparc __mpn_rshift --
-
-! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-
+!
+! Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+!
! This file is part of the GNU MP Library.
-
+!
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
@@ -21,28 +21,26 @@
! INPUT PARAMETERS
-! res_ptr %o0
-! src_ptr %o1
-! size %o2
-! cnt %o3
+! RES_PTR %o0
+! SRC_PTR %o1
+! SIZE %o2
+! CNT %o3
-#include "sysdep.h"
+#include <sysdep.h>
- .text
- .align 4
- .global C_SYMBOL_NAME(__mpn_rshift)
-C_SYMBOL_NAME(__mpn_rshift):
+ENTRY(__mpn_rshift)
ld [%o1],%g2 ! load first limb
sub %g0,%o3,%o5 ! negate shift count
add %o2,-1,%o2
andcc %o2,4-1,%g4 ! number of limbs in first loop
sll %g2,%o5,%g1 ! compute function result
- be L0 ! if multiple of 4 limbs, skip first loop
+ be LOC(0) ! if multiple of 4 limbs, skip first loop
st %g1,[%sp+80]
sub %o2,%g4,%o2 ! adjust count for main loop
-Loop0: ld [%o1+4],%g3
+LOC(loop0):
+ ld [%o1+4],%g3
add %o0,4,%o0
add %o1,4,%o1
addcc %g4,-1,%g4
@@ -50,14 +48,15 @@ Loop0: ld [%o1+4],%g3
sll %g3,%o5,%g1
mov %g3,%g2
or %o4,%g1,%o4
- bne Loop0
+ bne LOC(loop0)
st %o4,[%o0-4]
-L0: tst %o2
- be Lend
+LOC(0): tst %o2
+ be LOC(end)
nop
-Loop: ld [%o1+4],%g3
+LOC(loop):
+ ld [%o1+4],%g3
add %o0,16,%o0
addcc %o2,-4,%o2
srl %g2,%o3,%o4
@@ -83,10 +82,13 @@ Loop: ld [%o1+4],%g3
add %o1,16,%o1
or %g4,%g1,%g4
- bne Loop
+ bne LOC(loop)
st %g4,[%o0-4]
-Lend: srl %g2,%o3,%g2
+LOC(end):
+ srl %g2,%o3,%g2
st %g2,[%o0-0]
retl
ld [%sp+80],%o0
+
+END(__mpn_rshift)
diff --git a/sysdeps/sparc/sparc32/sdiv.S b/sysdeps/sparc/sparc32/sdiv.S
index 02ed2e973c..4b325476d7 100644
--- a/sysdeps/sparc/sparc32/sdiv.S
+++ b/sysdeps/sparc/sparc32/sdiv.S
@@ -37,22 +37,14 @@
-#include "sysdep.h"
-#ifdef __linux__
-#include <asm/traps.h>
-#else
-#ifdef __svr4__
+#include <sysdep.h>
#include <sys/trap.h>
-#else
-#include <machine/trap.h>
-#endif
-#endif
ENTRY(.div)
! compute sign of result; if neither is negative, no problem
orcc %o1, %o0, %g0 ! either negative?
bge 2f ! no, go do the divide
- xor %o1, %o0, %g6 ! compute sign in any case
+ xor %o1, %o0, %g3 ! compute sign in any case
tst %o1
bge 1f
tst %o0
@@ -76,11 +68,11 @@ ENTRY(.div)
1:
cmp %o3, %o5 ! if %o1 exceeds %o0, done
- blu Lgot_result ! (and algorithm fails otherwise)
+ blu LOC(got_result) ! (and algorithm fails otherwise)
clr %o2
sethi %hi(1 << (32 - 4 - 1)), %g1
cmp %o3, %g1
- blu Lnot_really_big
+ blu LOC(not_really_big)
clr %o4
! Here the dividend is >= 2**(31-N) or so. We must be careful here,
@@ -91,15 +83,15 @@ ENTRY(.div)
1:
cmp %o5, %g1
bgeu 3f
- mov 1, %g7
+ mov 1, %g2
sll %o5, 4, %o5
b 1b
add %o4, 1, %o4
- ! Now compute %g7.
+ ! Now compute %g2.
2: addcc %o5, %o5, %o5
- bcc Lnot_too_big
- add %g7, 1, %g7
+ bcc LOC(not_too_big)
+ add %g2, 1, %g2
! We get here if the %o1 overflowed while shifting.
! This means that %o3 has the high-order bit set.
@@ -107,20 +99,20 @@ ENTRY(.div)
sll %g1, 4, %g1 ! high order bit
srl %o5, 1, %o5 ! rest of %o5
add %o5, %g1, %o5
- b Ldo_single_div
- sub %g7, 1, %g7
+ b LOC(do_single_div)
+ sub %g2, 1, %g2
- Lnot_too_big:
+ LOC(not_too_big):
3: cmp %o5, %o3
blu 2b
nop
- be Ldo_single_div
+ be LOC(do_single_div)
nop
/* NB: these are commented out in the V8-Sparc manual as well */
/* (I do not understand this) */
! %o5 > %o3: went too far: back up 1 step
! srl %o5, 1, %o5
- ! dec %g7
+ ! dec %g2
! do single-bit divide steps
!
! We have to be careful here. We know that %o3 >= %o5, so we can do the
@@ -129,15 +121,15 @@ ENTRY(.div)
! order bit set in the first step, just falling into the regular
! division loop will mess up the first time around.
! So we unroll slightly...
- Ldo_single_div:
- subcc %g7, 1, %g7
- bl Lend_regular_divide
+ LOC(do_single_div):
+ subcc %g2, 1, %g2
+ bl LOC(end_regular_divide)
nop
sub %o3, %o5, %o3
mov 1, %o2
- b Lend_single_divloop
+ b LOC(end_single_divloop)
nop
- Lsingle_divloop:
+ LOC(single_divloop):
sll %o2, 1, %o2
bl 1f
srl %o5, 1, %o5
@@ -149,221 +141,223 @@ ENTRY(.div)
add %o3, %o5, %o3
sub %o2, 1, %o2
2:
- Lend_single_divloop:
- subcc %g7, 1, %g7
- bge Lsingle_divloop
+ LOC(end_single_divloop):
+ subcc %g2, 1, %g2
+ bge LOC(single_divloop)
tst %o3
- b,a Lend_regular_divide
+ b,a LOC(end_regular_divide)
-Lnot_really_big:
+LOC(not_really_big):
1:
sll %o5, 4, %o5
cmp %o5, %o3
bleu 1b
addcc %o4, 1, %o4
- be Lgot_result
+ be LOC(got_result)
sub %o4, 1, %o4
tst %o3 ! set up for initial iteration
-Ldivloop:
+LOC(divloop):
sll %o2, 4, %o2
! depth 1, accumulated bits 0
- bl L.1.16
+ bl LOC(1.16)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 2, accumulated bits 1
- bl L.2.17
+ bl LOC(2.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 3, accumulated bits 3
- bl L.3.19
+ bl LOC(3.19)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits 7
- bl L.4.23
+ bl LOC(4.23)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (7*2+1), %o2
-
-L.4.23:
+
+LOC(4.23):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (7*2-1), %o2
-
-
-L.3.19:
+
+
+LOC(3.19):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits 5
- bl L.4.21
+ bl LOC(4.21)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (5*2+1), %o2
-
-L.4.21:
+
+LOC(4.21):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (5*2-1), %o2
-
-
-
-L.2.17:
+
+
+
+LOC(2.17):
! remainder is negative
addcc %o3,%o5,%o3
! depth 3, accumulated bits 1
- bl L.3.17
+ bl LOC(3.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits 3
- bl L.4.19
+ bl LOC(4.19)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (3*2+1), %o2
-
-L.4.19:
+
+LOC(4.19):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (3*2-1), %o2
-
-
-L.3.17:
+
+
+LOC(3.17):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits 1
- bl L.4.17
+ bl LOC(4.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (1*2+1), %o2
-
-L.4.17:
+
+LOC(4.17):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (1*2-1), %o2
-
-
-
-
-L.1.16:
+
+
+
+
+LOC(1.16):
! remainder is negative
addcc %o3,%o5,%o3
! depth 2, accumulated bits -1
- bl L.2.15
+ bl LOC(2.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 3, accumulated bits -1
- bl L.3.15
+ bl LOC(3.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits -1
- bl L.4.15
+ bl LOC(4.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-1*2+1), %o2
-
-L.4.15:
+
+LOC(4.15):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-1*2-1), %o2
-
-
-L.3.15:
+
+
+LOC(3.15):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits -3
- bl L.4.13
+ bl LOC(4.13)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-3*2+1), %o2
-
-L.4.13:
+
+LOC(4.13):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-3*2-1), %o2
-
-
-
-L.2.15:
+
+
+
+LOC(2.15):
! remainder is negative
addcc %o3,%o5,%o3
! depth 3, accumulated bits -3
- bl L.3.13
+ bl LOC(3.13)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits -5
- bl L.4.11
+ bl LOC(4.11)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-5*2+1), %o2
-
-L.4.11:
+
+LOC(4.11):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-5*2-1), %o2
-
-
-L.3.13:
+
+
+LOC(3.13):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits -7
- bl L.4.9
+ bl LOC(4.9)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-7*2+1), %o2
-
-L.4.9:
+
+LOC(4.9):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-7*2-1), %o2
-
-
-
-
+
+
+
+
9:
-Lend_regular_divide:
+LOC(end_regular_divide):
subcc %o4, 1, %o4
- bge Ldivloop
+ bge LOC(divloop)
tst %o3
- bl,a Lgot_result
+ bl,a LOC(got_result)
! non-restoring fixup here (one instruction only!)
sub %o2, 1, %o2
-Lgot_result:
+LOC(got_result):
! check to see if answer should be < 0
- tst %g6
+ tst %g3
bl,a 1f
sub %g0, %o2, %o2
1:
retl
mov %o2, %o0
+
+END(.div)
diff --git a/sysdeps/sparc/sparc32/setjmp.S b/sysdeps/sparc/sparc32/setjmp.S
index 772ec723a3..58d94119ef 100644
--- a/sysdeps/sparc/sparc32/setjmp.S
+++ b/sysdeps/sparc/sparc32/setjmp.S
@@ -22,33 +22,29 @@
#define _ASM 1
#include <bits/setjmp.h>
+ENTRY(_setjmp)
+ b 1f
+ set 0, %o1
+END(_setjmp)
+
+ENTRY(setjmp)
+ set 1, %o1
+END(setjmp)
+
ENTRY (__sigsetjmp)
- /* Save our SP and FP; in the delay slot of the jump, save our
- return PC. Save the signal mask if requested with a tail-call
- for simplicity; it always returns zero. */
- ta ST_FLUSH_WINDOWS
-#ifdef PIC
- mov %o7,%g1
-2:
- call 1f
- nop
1:
- sethi %hi(_GLOBAL_OFFSET_TABLE_-(2b-.)),%g2
- or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(2b-.)),%g2
- add %g2,%o7,%g2
- sethi %hi(C_SYMBOL_NAME (__sigjmp_save)), %g3
- or %g3,%lo(C_SYMBOL_NAME (__sigjmp_save)), %g3
- st %sp, [%o0 + (JB_SP * 4)]
- st %fp, [%o0 + (JB_FP * 4)]
- mov %g1,%o7
- ld [%g2+%g3],%g1
- jmp %g1
- st %o7, [%o0+(JB_PC*4)]
-#else
- sethi %hi(C_SYMBOL_NAME (__sigjmp_save)), %g1
- st %sp, [%o0 + (JB_SP*4)]
- or %lo(C_SYMBOL_NAME (__sigjmp_save)), %g1, %g1
- st %fp, [%o0 + (JB_FP*4)]
- jmp %g1
- st %o7, [%o0 + (JB_PC*4)]
-#endif /* PIC */
+ /* Save our PC, SP and FP. Save the signal mask if requested with
+ a tail-call for simplicity; it always returns zero. */
+ ta ST_FLUSH_WINDOWS
+
+ st %o7, [%o0 + (JB_PC * 4)]
+ st %sp, [%o0 + (JB_SP * 4)]
+ st %fp, [%o0 + (JB_FP * 4)]
+
+ mov %o7, %g1
+ call __sigjmp_save
+ mov %g1, %o7
+END(__sigsetjmp)
+
+weak_extern(_setjmp)
+weak_extern(setjmp)
diff --git a/sysdeps/sparc/sparc32/sparcv8/addmul_1.S b/sysdeps/sparc/sparc32/sparcv8/addmul_1.S
index fb9ea7cf0e..7b871b8e8b 100644
--- a/sysdeps/sparc/sparc32/sparcv8/addmul_1.S
+++ b/sysdeps/sparc/sparc32/sparcv8/addmul_1.S
@@ -27,54 +27,52 @@
! size o2
! s2_limb o3
-#include "sysdep.h"
+#include <sysdep.h>
-.text
- .align 4
- .global C_SYMBOL_NAME(__mpn_addmul_1)
-C_SYMBOL_NAME(__mpn_addmul_1):
- orcc %g0,%g0,%g2
+ENTRY(__mpn_addmul_1)
ld [%o1+0],%o4 ! 1
-
sll %o2,4,%g1
- and %g1,(4-1)<<4,%g1
-#if PIC
+ orcc %g0,%g0,%g2
mov %o7,%g4 ! Save return address register
- call 1f
- add %o7,LL-1f,%g3
-1: mov %g4,%o7 ! Restore return address register
-#else
- sethi %hi(LL),%g3
- or %g3,%lo(LL),%g3
-#endif
- jmp %g3+%g1
- nop
-LL:
-LL00: add %o0,-4,%o0
- b Loop00 /* 4, 8, 12, ... */
- add %o1,-4,%o1
- nop
-LL01: b Loop01 /* 1, 5, 9, ... */
+ and %g1,(4-1)<<4,%g1
+1: call 2f
+ add %o7,3f-1b,%g3
+2: jmp %g3+%g1
+ mov %g4,%o7 ! Restore return address register
+
+ .align 4
+3:
+LOC(00):
+ add %o0,-4,%o0
+ b LOC(loop00) /* 4, 8, 12, ... */
+ add %o1,-4,%o1
nop
+LOC(01):
+ b LOC(loop01) /* 1, 5, 9, ... */
+ nop
nop
nop
-LL10: add %o0,-12,%o0 /* 2, 6, 10, ... */
- b Loop10
- add %o1,4,%o1
+LOC(10):
+ add %o0,-12,%o0 /* 2, 6, 10, ... */
+ b LOC(loop10)
+ add %o1,4,%o1
nop
-LL11: add %o0,-8,%o0 /* 3, 7, 11, ... */
- b Loop11
- add %o1,-8,%o1
+LOC(11):
+ add %o0,-8,%o0 /* 3, 7, 11, ... */
+ b LOC(loop11)
+ add %o1,-8,%o1
nop
-1: addcc %g3,%g2,%g3 ! 1
+LOC(loop):
+ addcc %g3,%g2,%g3 ! 1
ld [%o1+4],%o4 ! 2
rd %y,%g2 ! 1
addx %g0,%g2,%g2
ld [%o0+0],%g1 ! 2
addcc %g1,%g3,%g3
st %g3,[%o0+0] ! 1
-Loop00: umul %o4,%o3,%g3 ! 2
+LOC(loop00):
+ umul %o4,%o3,%g3 ! 2
ld [%o0+4],%g1 ! 2
addxcc %g3,%g2,%g3 ! 2
ld [%o1+8],%o4 ! 3
@@ -83,7 +81,8 @@ Loop00: umul %o4,%o3,%g3 ! 2
nop
addcc %g1,%g3,%g3
st %g3,[%o0+4] ! 2
-Loop11: umul %o4,%o3,%g3 ! 3
+LOC(loop11):
+ umul %o4,%o3,%g3 ! 3
addxcc %g3,%g2,%g3 ! 3
ld [%o1+12],%o4 ! 4
rd %y,%g2 ! 3
@@ -92,7 +91,8 @@ Loop11: umul %o4,%o3,%g3 ! 3
ld [%o0+8],%g1 ! 2
addcc %g1,%g3,%g3
st %g3,[%o0+8] ! 3
-Loop10: umul %o4,%o3,%g3 ! 4
+LOC(loop10):
+ umul %o4,%o3,%g3 ! 4
addxcc %g3,%g2,%g3 ! 4
ld [%o1+0],%o4 ! 1
rd %y,%g2 ! 4
@@ -102,9 +102,10 @@ Loop10: umul %o4,%o3,%g3 ! 4
st %g3,[%o0+12] ! 4
add %o0,16,%o0
addx %g0,%g2,%g2
-Loop01: addcc %o2,-4,%o2
- bg 1b
- umul %o4,%o3,%g3 ! 1
+LOC(loop01):
+ addcc %o2,-4,%o2
+ bg LOC(loop)
+ umul %o4,%o3,%g3 ! 1
addcc %g3,%g2,%g3 ! 4
rd %y,%g2 ! 4
@@ -112,13 +113,7 @@ Loop01: addcc %o2,-4,%o2
ld [%o0+0],%g1 ! 2
addcc %g1,%g3,%g3
st %g3,[%o0+0] ! 4
- addx %g0,%g2,%o0
-
retl
- nop
-
-
-! umul, ld, addxcc, rd, st
-
-! umul, ld, addxcc, rd, ld, addcc, st, addx
+ addx %g0,%g2,%o0
+END(__mpn_addmul_1)
diff --git a/sysdeps/sparc/sparc32/sparcv8/dotmul.S b/sysdeps/sparc/sparc32/sparcv8/dotmul.S
new file mode 100644
index 0000000000..9b20cc3684
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv8/dotmul.S
@@ -0,0 +1,13 @@
+/*
+ * Sparc v8 has multiply.
+ */
+
+#include <sysdep.h>
+
+ENTRY(.mul)
+
+ smul %o0, %o1, %o0
+ retl
+ rd %y, %o1
+
+END(.mul)
diff --git a/sysdeps/sparc/sparc32/sparcv8/mul_1.S b/sysdeps/sparc/sparc32/sparcv8/mul_1.S
index b641feb453..801e224c15 100644
--- a/sysdeps/sparc/sparc32/sparcv8/mul_1.S
+++ b/sysdeps/sparc/sparc32/sparcv8/mul_1.S
@@ -27,73 +27,77 @@
! size o2
! s2_limb o3
-#include "sysdep.h"
+#include <sysdep.h>
-.text
- .align 8
- .global C_SYMBOL_NAME(__mpn_mul_1)
-C_SYMBOL_NAME(__mpn_mul_1):
+ENTRY(__mpn_mul_1)
sll %o2,4,%g1
- and %g1,(4-1)<<4,%g1
-#if PIC
mov %o7,%g4 ! Save return address register
- call 1f
- add %o7,LL-1f,%g3
-1: mov %g4,%o7 ! Restore return address register
-#else
- sethi %hi(LL),%g3
- or %g3,%lo(LL),%g3
-#endif
+ and %g1,(4-1)<<4,%g1
+1: call 2f
+ add %o7,3f-1b,%g3
+2: mov %g4,%o7 ! Restore return address register
jmp %g3+%g1
- ld [%o1+0],%o4 ! 1
-LL:
-LL00: add %o0,-4,%o0
+ ld [%o1+0],%o4 ! 1
+
+ .align 4
+3:
+LOC(00):
+ add %o0,-4,%o0
add %o1,-4,%o1
- b Loop00 /* 4, 8, 12, ... */
- orcc %g0,%g0,%g2
-LL01: b Loop01 /* 1, 5, 9, ... */
- orcc %g0,%g0,%g2
+ b LOC(loop00) /* 4, 8, 12, ... */
+ orcc %g0,%g0,%g2
+LOC(01):
+ b LOC(loop01) /* 1, 5, 9, ... */
+ orcc %g0,%g0,%g2
nop
nop
-LL10: add %o0,-12,%o0 /* 2, 6, 10, ... */
+LOC(10):
+ add %o0,-12,%o0 /* 2, 6, 10, ... */
add %o1,4,%o1
- b Loop10
- orcc %g0,%g0,%g2
+ b LOC(loop10)
+ orcc %g0,%g0,%g2
nop
-LL11: add %o0,-8,%o0 /* 3, 7, 11, ... */
+LOC(11):
+ add %o0,-8,%o0 /* 3, 7, 11, ... */
add %o1,-8,%o1
- b Loop11
- orcc %g0,%g0,%g2
+ b LOC(loop11)
+ orcc %g0,%g0,%g2
-Loop: addcc %g3,%g2,%g3 ! 1
+LOC(loop):
+ addcc %g3,%g2,%g3 ! 1
ld [%o1+4],%o4 ! 2
st %g3,[%o0+0] ! 1
rd %y,%g2 ! 1
-Loop00: umul %o4,%o3,%g3 ! 2
+LOC(loop00):
+ umul %o4,%o3,%g3 ! 2
addxcc %g3,%g2,%g3 ! 2
ld [%o1+8],%o4 ! 3
st %g3,[%o0+4] ! 2
rd %y,%g2 ! 2
-Loop11: umul %o4,%o3,%g3 ! 3
+LOC(loop11):
+ umul %o4,%o3,%g3 ! 3
addxcc %g3,%g2,%g3 ! 3
ld [%o1+12],%o4 ! 4
add %o1,16,%o1
st %g3,[%o0+8] ! 3
rd %y,%g2 ! 3
-Loop10: umul %o4,%o3,%g3 ! 4
+LOC(loop10):
+ umul %o4,%o3,%g3 ! 4
addxcc %g3,%g2,%g3 ! 4
ld [%o1+0],%o4 ! 1
st %g3,[%o0+12] ! 4
add %o0,16,%o0
rd %y,%g2 ! 4
addx %g0,%g2,%g2
-Loop01: addcc %o2,-4,%o2
- bg Loop
- umul %o4,%o3,%g3 ! 1
+LOC(loop01):
+ addcc %o2,-4,%o2
+ bg LOC(loop)
+ umul %o4,%o3,%g3 ! 1
addcc %g3,%g2,%g3 ! 4
st %g3,[%o0+0] ! 4
rd %y,%g2 ! 4
-
retl
- addx %g0,%g2,%o0
+ addx %g0,%g2,%o0
+
+END(__mpn_mul_1)
diff --git a/sysdeps/sparc/sparc32/sparcv8/rem.S b/sysdeps/sparc/sparc32/sparcv8/rem.S
new file mode 100644
index 0000000000..061e80093c
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv8/rem.S
@@ -0,0 +1,18 @@
+/*
+ * Sparc v8 has divide.
+ */
+
+#include <sysdep.h>
+
+ENTRY(.rem)
+
+ sra %o0, 31, %o2
+ wr %o2, 0, %y
+ sdivcc %o0, %o1, %o2
+ bvs,a 1f
+ xnor %o2, %g0, %o2
+1: smul %o2, %o1, %o2
+ retl
+ sub %o0, %o2, %o0
+
+END(.rem)
diff --git a/sysdeps/sparc/sparc32/sparcv8/sdiv.S b/sysdeps/sparc/sparc32/sparcv8/sdiv.S
new file mode 100644
index 0000000000..81c3ac1c97
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv8/sdiv.S
@@ -0,0 +1,14 @@
+/*
+ * Sparc v8 has divide.
+ */
+
+#include <sysdep.h>
+
+ENTRY(.div)
+
+ sra %o0, 31, %o2
+ wr %o2, 0, %y
+ ret
+ sdiv %o0, %o1, %o0
+
+END(.div)
diff --git a/sysdeps/sparc/sparc32/sparcv8/submul_1.S b/sysdeps/sparc/sparc32/sparcv8/submul_1.S
index e40119d011..c71f228511 100644
--- a/sysdeps/sparc/sparc32/sparcv8/submul_1.S
+++ b/sysdeps/sparc/sparc32/sparcv8/submul_1.S
@@ -27,12 +27,9 @@
! size o2
! s2_limb o3
-#include "sysdep.h"
+#include <sysdep.h>
-.text
- .align 4
- .global C_SYMBOL_NAME(__mpn_submul_1)
-C_SYMBOL_NAME(__mpn_submul_1):
+ENTRY(__mpn_submul_1)
sub %g0,%o2,%o2 ! negate ...
sll %o2,2,%o2 ! ... and scale size
sub %o1,%o2,%o1 ! o1 is offset s1_ptr
@@ -40,7 +37,8 @@ C_SYMBOL_NAME(__mpn_submul_1):
mov 0,%o0 ! clear cy_limb
-Loop: ld [%o1+%o2],%o4
+LOC(loop):
+ ld [%o1+%o2],%o4
ld [%g1+%o2],%g2
umul %o4,%o3,%o5
rd %y,%g3
@@ -51,8 +49,10 @@ Loop: ld [%o1+%o2],%o4
st %g2,[%g1+%o2]
addcc %o2,4,%o2
- bne Loop
+ bne LOC(loop)
nop
retl
nop
+
+END(__mpn_submul_1)
diff --git a/sysdeps/sparc/sparc32/sparcv8/udiv.S b/sysdeps/sparc/sparc32/sparcv8/udiv.S
new file mode 100644
index 0000000000..4e3cddc63f
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv8/udiv.S
@@ -0,0 +1,13 @@
+/*
+ * Sparc v8 has divide.
+ */
+
+#include <sysdep.h>
+
+ENTRY(.udiv)
+
+ wr %g0, 0, %y
+ retl
+ udiv %o0, %o1, %o0
+
+END(.udiv)
diff --git a/sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S b/sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S
index 49c2398806..5b0d42923a 100644
--- a/sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S
+++ b/sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S
@@ -27,66 +27,75 @@
#include "sysdep.h"
- .text
- .align 4
- .global C_SYMBOL_NAME(__udiv_qrnnd)
-C_SYMBOL_NAME(__udiv_qrnnd):
+ENTRY(__udiv_qrnnd)
tst %o3
- bneg Largedivisor
+ bneg LOC(largedivisor)
mov 8,%g1
- b Lp1
+ b LOC(p1)
addxcc %o2,%o2,%o2
-Lplop: bcc Ln1
+LOC(plop):
+ bcc LOC(n1)
addxcc %o2,%o2,%o2
-Lp1: addx %o1,%o1,%o1
+LOC(p1):
+ addx %o1,%o1,%o1
subcc %o1,%o3,%o4
- bcc Ln2
+ bcc LOC(n2)
addxcc %o2,%o2,%o2
-Lp2: addx %o1,%o1,%o1
+LOC(p2):
+ addx %o1,%o1,%o1
subcc %o1,%o3,%o4
- bcc Ln3
+ bcc LOC(n3)
addxcc %o2,%o2,%o2
-Lp3: addx %o1,%o1,%o1
+LOC(p3):
+ addx %o1,%o1,%o1
subcc %o1,%o3,%o4
- bcc Ln4
+ bcc LOC(n4)
addxcc %o2,%o2,%o2
-Lp4: addx %o1,%o1,%o1
+LOC(p4):
+ addx %o1,%o1,%o1
addcc %g1,-1,%g1
- bne Lplop
+ bne LOC(plop)
subcc %o1,%o3,%o4
- bcc Ln5
+ bcc LOC(n5)
addxcc %o2,%o2,%o2
-Lp5: st %o1,[%o0]
+LOC(p5):
+ st %o1,[%o0]
retl
xnor %g0,%o2,%o0
-Lnlop: bcc Lp1
+LOC(nlop):
+ bcc LOC(p1)
addxcc %o2,%o2,%o2
-Ln1: addx %o4,%o4,%o4
+LOC(n1):
+ addx %o4,%o4,%o4
subcc %o4,%o3,%o1
- bcc Lp2
+ bcc LOC(p2)
addxcc %o2,%o2,%o2
-Ln2: addx %o4,%o4,%o4
+LOC(n2):
+ addx %o4,%o4,%o4
subcc %o4,%o3,%o1
- bcc Lp3
+ bcc LOC(p3)
addxcc %o2,%o2,%o2
-Ln3: addx %o4,%o4,%o4
+LOC(n3):
+ addx %o4,%o4,%o4
subcc %o4,%o3,%o1
- bcc Lp4
+ bcc LOC(p4)
addxcc %o2,%o2,%o2
-Ln4: addx %o4,%o4,%o4
+LOC(n4):
+ addx %o4,%o4,%o4
addcc %g1,-1,%g1
- bne Lnlop
+ bne LOC(nlop)
subcc %o4,%o3,%o1
- bcc Lp5
+ bcc LOC(p5)
addxcc %o2,%o2,%o2
-Ln5: st %o4,[%o0]
+LOC(n5):
+ st %o4,[%o0]
retl
xnor %g0,%o2,%o0
-Largedivisor:
+LOC(largedivisor):
and %o2,1,%o5 ! %o5 = n0 & 1
srl %o2,1,%o2
@@ -98,89 +107,109 @@ Largedivisor:
srl %o3,1,%g3 ! %g3 = floor(d / 2)
add %g3,%g2,%g3 ! %g3 = ceil(d / 2)
- b LLp1
+ b LOC(Lp1)
addxcc %o2,%o2,%o2
-LLplop: bcc LLn1
+LOC(Lplop):
+ bcc LOC(Ln1)
addxcc %o2,%o2,%o2
-LLp1: addx %o1,%o1,%o1
+LOC(Lp1):
+ addx %o1,%o1,%o1
subcc %o1,%g3,%o4
- bcc LLn2
+ bcc LOC(Ln2)
addxcc %o2,%o2,%o2
-LLp2: addx %o1,%o1,%o1
+LOC(Lp2):
+ addx %o1,%o1,%o1
subcc %o1,%g3,%o4
- bcc LLn3
+ bcc LOC(Ln3)
addxcc %o2,%o2,%o2
-LLp3: addx %o1,%o1,%o1
+LOC(Lp3):
+ addx %o1,%o1,%o1
subcc %o1,%g3,%o4
- bcc LLn4
+ bcc LOC(Ln4)
addxcc %o2,%o2,%o2
-LLp4: addx %o1,%o1,%o1
+LOC(Lp4):
+ addx %o1,%o1,%o1
addcc %g1,-1,%g1
- bne LLplop
+ bne LOC(Lplop)
subcc %o1,%g3,%o4
- bcc LLn5
+ bcc LOC(Ln5)
addxcc %o2,%o2,%o2
-LLp5: add %o1,%o1,%o1 ! << 1
+LOC(Lp5):
+ add %o1,%o1,%o1 ! << 1
tst %g2
- bne Oddp
+ bne LOC(Oddp)
add %o5,%o1,%o1
st %o1,[%o0]
retl
xnor %g0,%o2,%o0
-LLnlop: bcc LLp1
+LOC(Lnlop):
+ bcc LOC(Lp1)
addxcc %o2,%o2,%o2
-LLn1: addx %o4,%o4,%o4
+LOC(Ln1):
+ addx %o4,%o4,%o4
subcc %o4,%g3,%o1
- bcc LLp2
+ bcc LOC(Lp2)
addxcc %o2,%o2,%o2
-LLn2: addx %o4,%o4,%o4
+LOC(Ln2):
+ addx %o4,%o4,%o4
subcc %o4,%g3,%o1
- bcc LLp3
+ bcc LOC(Lp3)
addxcc %o2,%o2,%o2
-LLn3: addx %o4,%o4,%o4
+LOC(Ln3):
+ addx %o4,%o4,%o4
subcc %o4,%g3,%o1
- bcc LLp4
+ bcc LOC(Lp4)
addxcc %o2,%o2,%o2
-LLn4: addx %o4,%o4,%o4
+LOC(Ln4):
+ addx %o4,%o4,%o4
addcc %g1,-1,%g1
- bne LLnlop
+ bne LOC(Lnlop)
subcc %o4,%g3,%o1
- bcc LLp5
+ bcc LOC(Lp5)
addxcc %o2,%o2,%o2
-LLn5: add %o4,%o4,%o4 ! << 1
+LOC(Ln5):
+ add %o4,%o4,%o4 ! << 1
tst %g2
- bne Oddn
+ bne LOC(Oddn)
add %o5,%o4,%o4
st %o4,[%o0]
retl
xnor %g0,%o2,%o0
-Oddp: xnor %g0,%o2,%o2
+LOC(Oddp):
+ xnor %g0,%o2,%o2
! q' in %o2. r' in %o1
addcc %o1,%o2,%o1
- bcc LLp6
+ bcc LOC(Lp6)
addx %o2,0,%o2
sub %o1,%o3,%o1
-LLp6: subcc %o1,%o3,%g0
- bcs LLp7
+LOC(Lp6):
+ subcc %o1,%o3,%g0
+ bcs LOC(Lp7)
subx %o2,-1,%o2
sub %o1,%o3,%o1
-LLp7: st %o1,[%o0]
+LOC(Lp7):
+ st %o1,[%o0]
retl
mov %o2,%o0
-Oddn: xnor %g0,%o2,%o2
+LOC(Oddn):
+ xnor %g0,%o2,%o2
! q' in %o2. r' in %o4
addcc %o4,%o2,%o4
- bcc LLn6
+ bcc LOC(Ln6)
addx %o2,0,%o2
sub %o4,%o3,%o4
-LLn6: subcc %o4,%o3,%g0
- bcs LLn7
+LOC(Ln6):
+ subcc %o4,%o3,%g0
+ bcs LOC(Ln7)
subx %o2,-1,%o2
sub %o4,%o3,%o4
-LLn7: st %o4,[%o0]
+LOC(Ln7):
+ st %o4,[%o0]
retl
mov %o2,%o0
+
+END(__udiv_qrnnd)
diff --git a/sysdeps/sparc/sparc32/sparcv8/umul.S b/sysdeps/sparc/sparc32/sparcv8/umul.S
new file mode 100644
index 0000000000..cec454a7dd
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv8/umul.S
@@ -0,0 +1,13 @@
+/*
+ * Sparc v8 has multiply.
+ */
+
+#include <sysdep.h>
+
+ENTRY(.umul)
+
+ umul %o0, %o1, %o0
+ retl
+ rd %y, %o1
+
+END(.umul)
diff --git a/sysdeps/sparc/sparc32/sparcv8/urem.S b/sysdeps/sparc/sparc32/sparcv8/urem.S
new file mode 100644
index 0000000000..81e123f3da
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv8/urem.S
@@ -0,0 +1,15 @@
+/*
+ * Sparc v8 has divide.
+ */
+
+#include <sysdep.h>
+
+ENTRY(.urem)
+
+ wr %g0, 0, %y
+ udiv %o0, %o1, %o2
+ umul %o2, %o1, %o2
+ retl
+ sub %o0, %o2, %o0
+
+END(.urem)
diff --git a/sysdeps/sparc/sparc32/sub_n.S b/sysdeps/sparc/sparc32/sub_n.S
index b7a11958e2..74400600bd 100644
--- a/sysdeps/sparc/sparc32/sub_n.S
+++ b/sysdeps/sparc/sparc32/sub_n.S
@@ -1,20 +1,20 @@
! SPARC __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
! store difference in a third limb vector.
-
+!
! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-
+!
! This file is part of the GNU MP Library.
-
+!
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
@@ -22,290 +22,308 @@
! INPUT PARAMETERS
-#define res_ptr %o0
-#define s1_ptr %o1
-#define s2_ptr %o2
-#define size %o3
+#define RES_PTR %o0
+#define S1_PTR %o1
+#define S2_PTR %o2
+#define SIZE %o3
-#include "sysdep.h"
+#include <sysdep.h>
- .text
- .align 4
- .global C_SYMBOL_NAME(__mpn_sub_n)
-C_SYMBOL_NAME(__mpn_sub_n):
- xor s2_ptr,res_ptr,%g1
+ENTRY(__mpn_sub_n)
+ xor S2_PTR,RES_PTR,%g1
andcc %g1,4,%g0
- bne L1 ! branch if alignment differs
+ bne LOC(1) ! branch if alignment differs
nop
! ** V1a **
- andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0
- be L_v1 ! if no, branch
+ andcc RES_PTR,4,%g0 ! RES_PTR unaligned? Side effect: cy=0
+ be LOC(v1) ! if no, branch
nop
-/* Add least significant limb separately to align res_ptr and s2_ptr */
- ld [s1_ptr],%g4
- add s1_ptr,4,s1_ptr
- ld [s2_ptr],%g2
- add s2_ptr,4,s2_ptr
- add size,-1,size
+/* Add least significant limb separately to align RES_PTR and S2_PTR */
+ ld [S1_PTR],%g4
+ add S1_PTR,4,S1_PTR
+ ld [S2_PTR],%g2
+ add S2_PTR,4,S2_PTR
+ add SIZE,-1,SIZE
subcc %g4,%g2,%o4
- st %o4,[res_ptr]
- add res_ptr,4,res_ptr
-L_v1: addx %g0,%g0,%o4 ! save cy in register
- cmp size,2 ! if size < 2 ...
- bl Lend2 ! ... branch to tail code
+ st %o4,[RES_PTR]
+ add RES_PTR,4,RES_PTR
+LOC(v1):
+ addx %g0,%g0,%o4 ! save cy in register
+ cmp SIZE,2 ! if SIZE < 2 ...
+ bl LOC(end2) ! ... branch to tail code
subcc %g0,%o4,%g0 ! restore cy
- ld [s1_ptr+0],%g4
- addcc size,-10,size
- ld [s1_ptr+4],%g1
- ldd [s2_ptr+0],%g2
- blt Lfin1
+ ld [S1_PTR+0],%g4
+ addcc SIZE,-10,SIZE
+ ld [S1_PTR+4],%g1
+ ldd [S2_PTR+0],%g2
+ blt LOC(fin1)
subcc %g0,%o4,%g0 ! restore cy
/* Add blocks of 8 limbs until less than 8 limbs remain */
-Loop1: subxcc %g4,%g2,%o4
- ld [s1_ptr+8],%g4
+LOC(loop1):
+ subxcc %g4,%g2,%o4
+ ld [S1_PTR+8],%g4
subxcc %g1,%g3,%o5
- ld [s1_ptr+12],%g1
- ldd [s2_ptr+8],%g2
- std %o4,[res_ptr+0]
+ ld [S1_PTR+12],%g1
+ ldd [S2_PTR+8],%g2
+ std %o4,[RES_PTR+0]
subxcc %g4,%g2,%o4
- ld [s1_ptr+16],%g4
+ ld [S1_PTR+16],%g4
subxcc %g1,%g3,%o5
- ld [s1_ptr+20],%g1
- ldd [s2_ptr+16],%g2
- std %o4,[res_ptr+8]
+ ld [S1_PTR+20],%g1
+ ldd [S2_PTR+16],%g2
+ std %o4,[RES_PTR+8]
subxcc %g4,%g2,%o4
- ld [s1_ptr+24],%g4
+ ld [S1_PTR+24],%g4
subxcc %g1,%g3,%o5
- ld [s1_ptr+28],%g1
- ldd [s2_ptr+24],%g2
- std %o4,[res_ptr+16]
+ ld [S1_PTR+28],%g1
+ ldd [S2_PTR+24],%g2
+ std %o4,[RES_PTR+16]
subxcc %g4,%g2,%o4
- ld [s1_ptr+32],%g4
+ ld [S1_PTR+32],%g4
subxcc %g1,%g3,%o5
- ld [s1_ptr+36],%g1
- ldd [s2_ptr+32],%g2
- std %o4,[res_ptr+24]
+ ld [S1_PTR+36],%g1
+ ldd [S2_PTR+32],%g2
+ std %o4,[RES_PTR+24]
addx %g0,%g0,%o4 ! save cy in register
- addcc size,-8,size
- add s1_ptr,32,s1_ptr
- add s2_ptr,32,s2_ptr
- add res_ptr,32,res_ptr
- bge Loop1
+ addcc SIZE,-8,SIZE
+ add S1_PTR,32,S1_PTR
+ add S2_PTR,32,S2_PTR
+ add RES_PTR,32,RES_PTR
+ bge LOC(loop1)
subcc %g0,%o4,%g0 ! restore cy
-Lfin1: addcc size,8-2,size
- blt Lend1
+LOC(fin1):
+ addcc SIZE,8-2,SIZE
+ blt LOC(end1)
subcc %g0,%o4,%g0 ! restore cy
/* Add blocks of 2 limbs until less than 2 limbs remain */
-Loope1: subxcc %g4,%g2,%o4
- ld [s1_ptr+8],%g4
+LOC(loope1):
+ subxcc %g4,%g2,%o4
+ ld [S1_PTR+8],%g4
subxcc %g1,%g3,%o5
- ld [s1_ptr+12],%g1
- ldd [s2_ptr+8],%g2
- std %o4,[res_ptr+0]
+ ld [S1_PTR+12],%g1
+ ldd [S2_PTR+8],%g2
+ std %o4,[RES_PTR+0]
addx %g0,%g0,%o4 ! save cy in register
- addcc size,-2,size
- add s1_ptr,8,s1_ptr
- add s2_ptr,8,s2_ptr
- add res_ptr,8,res_ptr
- bge Loope1
+ addcc SIZE,-2,SIZE
+ add S1_PTR,8,S1_PTR
+ add S2_PTR,8,S2_PTR
+ add RES_PTR,8,RES_PTR
+ bge LOC(loope1)
subcc %g0,%o4,%g0 ! restore cy
-Lend1: subxcc %g4,%g2,%o4
+LOC(end1):
+ subxcc %g4,%g2,%o4
subxcc %g1,%g3,%o5
- std %o4,[res_ptr+0]
+ std %o4,[RES_PTR+0]
addx %g0,%g0,%o4 ! save cy in register
- andcc size,1,%g0
- be Lret1
+ andcc SIZE,1,%g0
+ be LOC(ret1)
subcc %g0,%o4,%g0 ! restore cy
/* Add last limb */
- ld [s1_ptr+8],%g4
- ld [s2_ptr+8],%g2
+ ld [S1_PTR+8],%g4
+ ld [S2_PTR+8],%g2
subxcc %g4,%g2,%o4
- st %o4,[res_ptr+8]
+ st %o4,[RES_PTR+8]
-Lret1: retl
+LOC(ret1):
+ retl
addx %g0,%g0,%o0 ! return carry-out from most sign. limb
-L1: xor s1_ptr,res_ptr,%g1
+LOC(1): xor S1_PTR,RES_PTR,%g1
andcc %g1,4,%g0
- bne L2
+ bne LOC(2)
nop
! ** V1b **
- andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0
- be L_v1b ! if no, branch
+ andcc RES_PTR,4,%g0 ! RES_PTR unaligned? Side effect: cy=0
+ be LOC(v1b) ! if no, branch
nop
-/* Add least significant limb separately to align res_ptr and s1_ptr */
- ld [s2_ptr],%g4
- add s2_ptr,4,s2_ptr
- ld [s1_ptr],%g2
- add s1_ptr,4,s1_ptr
- add size,-1,size
+/* Add least significant limb separately to align RES_PTR and S1_PTR */
+ ld [S2_PTR],%g4
+ add S2_PTR,4,S2_PTR
+ ld [S1_PTR],%g2
+ add S1_PTR,4,S1_PTR
+ add SIZE,-1,SIZE
subcc %g2,%g4,%o4
- st %o4,[res_ptr]
- add res_ptr,4,res_ptr
-L_v1b: addx %g0,%g0,%o4 ! save cy in register
- cmp size,2 ! if size < 2 ...
- bl Lend2 ! ... branch to tail code
+ st %o4,[RES_PTR]
+ add RES_PTR,4,RES_PTR
+LOC(v1b):
+ addx %g0,%g0,%o4 ! save cy in register
+ cmp SIZE,2 ! if SIZE < 2 ...
+ bl LOC(end2) ! ... branch to tail code
subcc %g0,%o4,%g0 ! restore cy
- ld [s2_ptr+0],%g4
- addcc size,-10,size
- ld [s2_ptr+4],%g1
- ldd [s1_ptr+0],%g2
- blt Lfin1b
+ ld [S2_PTR+0],%g4
+ addcc SIZE,-10,SIZE
+ ld [S2_PTR+4],%g1
+ ldd [S1_PTR+0],%g2
+ blt LOC(fin1b)
subcc %g0,%o4,%g0 ! restore cy
/* Add blocks of 8 limbs until less than 8 limbs remain */
-Loop1b: subxcc %g2,%g4,%o4
- ld [s2_ptr+8],%g4
+LOC(loop1b):
+ subxcc %g2,%g4,%o4
+ ld [S2_PTR+8],%g4
subxcc %g3,%g1,%o5
- ld [s2_ptr+12],%g1
- ldd [s1_ptr+8],%g2
- std %o4,[res_ptr+0]
+ ld [S2_PTR+12],%g1
+ ldd [S1_PTR+8],%g2
+ std %o4,[RES_PTR+0]
subxcc %g2,%g4,%o4
- ld [s2_ptr+16],%g4
+ ld [S2_PTR+16],%g4
subxcc %g3,%g1,%o5
- ld [s2_ptr+20],%g1
- ldd [s1_ptr+16],%g2
- std %o4,[res_ptr+8]
+ ld [S2_PTR+20],%g1
+ ldd [S1_PTR+16],%g2
+ std %o4,[RES_PTR+8]
subxcc %g2,%g4,%o4
- ld [s2_ptr+24],%g4
+ ld [S2_PTR+24],%g4
subxcc %g3,%g1,%o5
- ld [s2_ptr+28],%g1
- ldd [s1_ptr+24],%g2
- std %o4,[res_ptr+16]
+ ld [S2_PTR+28],%g1
+ ldd [S1_PTR+24],%g2
+ std %o4,[RES_PTR+16]
subxcc %g2,%g4,%o4
- ld [s2_ptr+32],%g4
+ ld [S2_PTR+32],%g4
subxcc %g3,%g1,%o5
- ld [s2_ptr+36],%g1
- ldd [s1_ptr+32],%g2
- std %o4,[res_ptr+24]
+ ld [S2_PTR+36],%g1
+ ldd [S1_PTR+32],%g2
+ std %o4,[RES_PTR+24]
addx %g0,%g0,%o4 ! save cy in register
- addcc size,-8,size
- add s1_ptr,32,s1_ptr
- add s2_ptr,32,s2_ptr
- add res_ptr,32,res_ptr
- bge Loop1b
+ addcc SIZE,-8,SIZE
+ add S1_PTR,32,S1_PTR
+ add S2_PTR,32,S2_PTR
+ add RES_PTR,32,RES_PTR
+ bge LOC(loop1b)
subcc %g0,%o4,%g0 ! restore cy
-Lfin1b: addcc size,8-2,size
- blt Lend1b
+LOC(fin1b):
+ addcc SIZE,8-2,SIZE
+ blt LOC(end1b)
subcc %g0,%o4,%g0 ! restore cy
/* Add blocks of 2 limbs until less than 2 limbs remain */
-Loope1b:subxcc %g2,%g4,%o4
- ld [s2_ptr+8],%g4
+LOC(loope1b):
+ subxcc %g2,%g4,%o4
+ ld [S2_PTR+8],%g4
subxcc %g3,%g1,%o5
- ld [s2_ptr+12],%g1
- ldd [s1_ptr+8],%g2
- std %o4,[res_ptr+0]
+ ld [S2_PTR+12],%g1
+ ldd [S1_PTR+8],%g2
+ std %o4,[RES_PTR+0]
addx %g0,%g0,%o4 ! save cy in register
- addcc size,-2,size
- add s1_ptr,8,s1_ptr
- add s2_ptr,8,s2_ptr
- add res_ptr,8,res_ptr
- bge Loope1b
+ addcc SIZE,-2,SIZE
+ add S1_PTR,8,S1_PTR
+ add S2_PTR,8,S2_PTR
+ add RES_PTR,8,RES_PTR
+ bge LOC(loope1b)
subcc %g0,%o4,%g0 ! restore cy
-Lend1b: subxcc %g2,%g4,%o4
+LOC(end1b):
+ subxcc %g2,%g4,%o4
subxcc %g3,%g1,%o5
- std %o4,[res_ptr+0]
+ std %o4,[RES_PTR+0]
addx %g0,%g0,%o4 ! save cy in register
- andcc size,1,%g0
- be Lret1b
+ andcc SIZE,1,%g0
+ be LOC(ret1b)
subcc %g0,%o4,%g0 ! restore cy
/* Add last limb */
- ld [s2_ptr+8],%g4
- ld [s1_ptr+8],%g2
+ ld [S2_PTR+8],%g4
+ ld [S1_PTR+8],%g2
subxcc %g2,%g4,%o4
- st %o4,[res_ptr+8]
+ st %o4,[RES_PTR+8]
-Lret1b: retl
+LOC(ret1b):
+ retl
addx %g0,%g0,%o0 ! return carry-out from most sign. limb
! ** V2 **
-/* If we come here, the alignment of s1_ptr and res_ptr as well as the
- alignment of s2_ptr and res_ptr differ. Since there are only two ways
+/* If we come here, the alignment of S1_PTR and RES_PTR as well as the
+ alignment of S2_PTR and RES_PTR differ. Since there are only two ways
things can be aligned (that we care about) we now know that the alignment
- of s1_ptr and s2_ptr are the same. */
+ of S1_PTR and S2_PTR are the same. */
-L2: cmp size,1
- be Ljone
+LOC(2): cmp SIZE,1
+ be LOC(jone)
nop
- andcc s1_ptr,4,%g0 ! s1_ptr unaligned? Side effect: cy=0
- be L_v2 ! if no, branch
+ andcc S1_PTR,4,%g0 ! S1_PTR unaligned? Side effect: cy=0
+ be LOC(v2) ! if no, branch
nop
-/* Add least significant limb separately to align s1_ptr and s2_ptr */
- ld [s1_ptr],%g4
- add s1_ptr,4,s1_ptr
- ld [s2_ptr],%g2
- add s2_ptr,4,s2_ptr
- add size,-1,size
+/* Add least significant limb separately to align S1_PTR and S2_PTR */
+ ld [S1_PTR],%g4
+ add S1_PTR,4,S1_PTR
+ ld [S2_PTR],%g2
+ add S2_PTR,4,S2_PTR
+ add SIZE,-1,SIZE
subcc %g4,%g2,%o4
- st %o4,[res_ptr]
- add res_ptr,4,res_ptr
+ st %o4,[RES_PTR]
+ add RES_PTR,4,RES_PTR
-L_v2: addx %g0,%g0,%o4 ! save cy in register
- addcc size,-8,size
- blt Lfin2
+LOC(v2):
+ addx %g0,%g0,%o4 ! save cy in register
+ addcc SIZE,-8,SIZE
+ blt LOC(fin2)
subcc %g0,%o4,%g0 ! restore cy
/* Add blocks of 8 limbs until less than 8 limbs remain */
-Loop2: ldd [s1_ptr+0],%g2
- ldd [s2_ptr+0],%o4
+LOC(loop2):
+ ldd [S1_PTR+0],%g2
+ ldd [S2_PTR+0],%o4
subxcc %g2,%o4,%g2
- st %g2,[res_ptr+0]
+ st %g2,[RES_PTR+0]
subxcc %g3,%o5,%g3
- st %g3,[res_ptr+4]
- ldd [s1_ptr+8],%g2
- ldd [s2_ptr+8],%o4
+ st %g3,[RES_PTR+4]
+ ldd [S1_PTR+8],%g2
+ ldd [S2_PTR+8],%o4
subxcc %g2,%o4,%g2
- st %g2,[res_ptr+8]
+ st %g2,[RES_PTR+8]
subxcc %g3,%o5,%g3
- st %g3,[res_ptr+12]
- ldd [s1_ptr+16],%g2
- ldd [s2_ptr+16],%o4
+ st %g3,[RES_PTR+12]
+ ldd [S1_PTR+16],%g2
+ ldd [S2_PTR+16],%o4
subxcc %g2,%o4,%g2
- st %g2,[res_ptr+16]
+ st %g2,[RES_PTR+16]
subxcc %g3,%o5,%g3
- st %g3,[res_ptr+20]
- ldd [s1_ptr+24],%g2
- ldd [s2_ptr+24],%o4
+ st %g3,[RES_PTR+20]
+ ldd [S1_PTR+24],%g2
+ ldd [S2_PTR+24],%o4
subxcc %g2,%o4,%g2
- st %g2,[res_ptr+24]
+ st %g2,[RES_PTR+24]
subxcc %g3,%o5,%g3
- st %g3,[res_ptr+28]
+ st %g3,[RES_PTR+28]
addx %g0,%g0,%o4 ! save cy in register
- addcc size,-8,size
- add s1_ptr,32,s1_ptr
- add s2_ptr,32,s2_ptr
- add res_ptr,32,res_ptr
- bge Loop2
+ addcc SIZE,-8,SIZE
+ add S1_PTR,32,S1_PTR
+ add S2_PTR,32,S2_PTR
+ add RES_PTR,32,RES_PTR
+ bge LOC(loop2)
subcc %g0,%o4,%g0 ! restore cy
-Lfin2: addcc size,8-2,size
- blt Lend2
+LOC(fin2):
+ addcc SIZE,8-2,SIZE
+ blt LOC(end2)
subcc %g0,%o4,%g0 ! restore cy
-Loope2: ldd [s1_ptr+0],%g2
- ldd [s2_ptr+0],%o4
+LOC(loope2):
+ ldd [S1_PTR+0],%g2
+ ldd [S2_PTR+0],%o4
subxcc %g2,%o4,%g2
- st %g2,[res_ptr+0]
+ st %g2,[RES_PTR+0]
subxcc %g3,%o5,%g3
- st %g3,[res_ptr+4]
+ st %g3,[RES_PTR+4]
addx %g0,%g0,%o4 ! save cy in register
- addcc size,-2,size
- add s1_ptr,8,s1_ptr
- add s2_ptr,8,s2_ptr
- add res_ptr,8,res_ptr
- bge Loope2
+ addcc SIZE,-2,SIZE
+ add S1_PTR,8,S1_PTR
+ add S2_PTR,8,S2_PTR
+ add RES_PTR,8,RES_PTR
+ bge LOC(loope2)
subcc %g0,%o4,%g0 ! restore cy
-Lend2: andcc size,1,%g0
- be Lret2
+LOC(end2):
+ andcc SIZE,1,%g0
+ be LOC(ret2)
subcc %g0,%o4,%g0 ! restore cy
/* Add last limb */
-Ljone: ld [s1_ptr],%g4
- ld [s2_ptr],%g2
+LOC(jone):
+ ld [S1_PTR],%g4
+ ld [S2_PTR],%g2
subxcc %g4,%g2,%o4
- st %o4,[res_ptr]
+ st %o4,[RES_PTR]
-Lret2: retl
+LOC(ret2):
+ retl
addx %g0,%g0,%o0 ! return carry-out from most sign. limb
+
+END(__mpn_sub_n)
diff --git a/sysdeps/sparc/sparc32/submul_1.S b/sysdeps/sparc/sparc32/submul_1.S
index a8ebd501a7..805699b7b2 100644
--- a/sysdeps/sparc/sparc32/submul_1.S
+++ b/sysdeps/sparc/sparc32/submul_1.S
@@ -1,20 +1,20 @@
! SPARC __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
! the result from a second limb vector.
-
-! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
-
+!
+! Copyright (C) 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
+!
! This file is part of the GNU MP Library.
-
+!
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
@@ -22,17 +22,14 @@
! INPUT PARAMETERS
-! res_ptr o0
-! s1_ptr o1
-! size o2
-! s2_limb o3
+! RES_PTR o0
+! S1_PTR o1
+! SIZE o2
+! S2_LIMB o3
-#include "sysdep.h"
+#include <sysdep.h>
-.text
- .align 4
- .global C_SYMBOL_NAME(__mpn_submul_1)
-C_SYMBOL_NAME(__mpn_submul_1):
+ENTRY(__mpn_submul_1)
! Make S1_PTR and RES_PTR point at the end of their blocks
! and put (- 4 x SIZE) in index/loop counter.
sll %o2,2,%o2
@@ -41,19 +38,19 @@ C_SYMBOL_NAME(__mpn_submul_1):
sub %g0,%o2,%o2
cmp %o3,0xfff
- bgu Large
+ bgu LOC(large)
nop
ld [%o1+%o2],%o5
mov 0,%o0
- b L0
+ b LOC(0)
add %o4,-4,%o4
-Loop0:
+LOC(loop0):
subcc %o5,%g1,%g1
ld [%o1+%o2],%o5
addx %o0,%g0,%o0
st %g1,[%o4+%o2]
-L0: wr %g0,%o3,%y
+LOC(0): wr %g0,%o3,%y
sra %o5,31,%g2
and %o3,%g2,%g2
andcc %g1,0,%g1
@@ -79,7 +76,7 @@ L0: wr %g0,%o3,%y
addcc %g1,%o0,%g1
addx %g2,%g4,%o0 ! add sign-compensation and cy to hi limb
addcc %o2,4,%o2 ! loop counter
- bne Loop0
+ bne LOC(loop0)
ld [%o4+%o2],%o5
subcc %o5,%g1,%g1
@@ -88,17 +85,18 @@ L0: wr %g0,%o3,%y
st %g1,[%o4+%o2]
-Large: ld [%o1+%o2],%o5
+LOC(large):
+ ld [%o1+%o2],%o5
mov 0,%o0
sra %o3,31,%g4 ! g4 = mask of ones iff S2_LIMB < 0
- b L1
+ b LOC(1)
add %o4,-4,%o4
-Loop:
+LOC(loop):
subcc %o5,%g3,%g3
ld [%o1+%o2],%o5
addx %o0,%g0,%o0
st %g3,[%o4+%o2]
-L1: wr %g0,%o5,%y
+LOC(1): wr %g0,%o5,%y
and %o5,%g4,%g2
andcc %g0,%g0,%g1
mulscc %g1,%o3,%g1
@@ -138,10 +136,12 @@ L1: wr %g0,%o5,%y
addcc %g3,%o0,%g3
addx %g2,%g1,%o0
addcc %o2,4,%o2
- bne Loop
+ bne LOC(loop)
ld [%o4+%o2],%o5
subcc %o5,%g3,%g3
addx %o0,%g0,%o0
retl
st %g3,[%o4+%o2]
+
+END(__mpn_submul_1)
diff --git a/sysdeps/sparc/sparc32/udiv.S b/sysdeps/sparc/sparc32/udiv.S
index 4a7d1526b0..0dd48f32b5 100644
--- a/sysdeps/sparc/sparc32/udiv.S
+++ b/sysdeps/sparc/sparc32/udiv.S
@@ -37,16 +37,8 @@
-#include "sysdep.h"
-#ifdef __linux__
-#include <asm/traps.h>
-#else
-#ifdef __svr4__
+#include <sysdep.h>
#include <sys/trap.h>
-#else
-#include <machine/trap.h>
-#endif
-#endif
ENTRY(.udiv)
@@ -63,11 +55,11 @@ ENTRY(.udiv)
1:
cmp %o3, %o5 ! if %o1 exceeds %o0, done
- blu Lgot_result ! (and algorithm fails otherwise)
+ blu LOC(got_result) ! (and algorithm fails otherwise)
clr %o2
sethi %hi(1 << (32 - 4 - 1)), %g1
cmp %o3, %g1
- blu Lnot_really_big
+ blu LOC(not_really_big)
clr %o4
! Here the dividend is >= 2**(31-N) or so. We must be careful here,
@@ -78,15 +70,15 @@ ENTRY(.udiv)
1:
cmp %o5, %g1
bgeu 3f
- mov 1, %g7
+ mov 1, %g2
sll %o5, 4, %o5
b 1b
add %o4, 1, %o4
- ! Now compute %g7.
+ ! Now compute %g2.
2: addcc %o5, %o5, %o5
- bcc Lnot_too_big
- add %g7, 1, %g7
+ bcc LOC(not_too_big)
+ add %g2, 1, %g2
! We get here if the %o1 overflowed while shifting.
! This means that %o3 has the high-order bit set.
@@ -94,20 +86,20 @@ ENTRY(.udiv)
sll %g1, 4, %g1 ! high order bit
srl %o5, 1, %o5 ! rest of %o5
add %o5, %g1, %o5
- b Ldo_single_div
- sub %g7, 1, %g7
+ b LOC(do_single_div)
+ sub %g2, 1, %g2
- Lnot_too_big:
+ LOC(not_too_big):
3: cmp %o5, %o3
blu 2b
nop
- be Ldo_single_div
+ be LOC(do_single_div)
nop
/* NB: these are commented out in the V8-Sparc manual as well */
/* (I do not understand this) */
! %o5 > %o3: went too far: back up 1 step
! srl %o5, 1, %o5
- ! dec %g7
+ ! dec %g2
! do single-bit divide steps
!
! We have to be careful here. We know that %o3 >= %o5, so we can do the
@@ -116,15 +108,15 @@ ENTRY(.udiv)
! order bit set in the first step, just falling into the regular
! division loop will mess up the first time around.
! So we unroll slightly...
- Ldo_single_div:
- subcc %g7, 1, %g7
- bl Lend_regular_divide
+ LOC(do_single_div):
+ subcc %g2, 1, %g2
+ bl LOC(end_regular_divide)
nop
sub %o3, %o5, %o3
mov 1, %o2
- b Lend_single_divloop
+ b LOC(end_single_divloop)
nop
- Lsingle_divloop:
+ LOC(single_divloop):
sll %o2, 1, %o2
bl 1f
srl %o5, 1, %o5
@@ -136,217 +128,219 @@ ENTRY(.udiv)
add %o3, %o5, %o3
sub %o2, 1, %o2
2:
- Lend_single_divloop:
- subcc %g7, 1, %g7
- bge Lsingle_divloop
+ LOC(end_single_divloop):
+ subcc %g2, 1, %g2
+ bge LOC(single_divloop)
tst %o3
- b,a Lend_regular_divide
+ b,a LOC(end_regular_divide)
-Lnot_really_big:
+LOC(not_really_big):
1:
sll %o5, 4, %o5
cmp %o5, %o3
bleu 1b
addcc %o4, 1, %o4
- be Lgot_result
+ be LOC(got_result)
sub %o4, 1, %o4
tst %o3 ! set up for initial iteration
-Ldivloop:
+LOC(divloop):
sll %o2, 4, %o2
! depth 1, accumulated bits 0
- bl L.1.16
+ bl LOC(1.16)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 2, accumulated bits 1
- bl L.2.17
+ bl LOC(2.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 3, accumulated bits 3
- bl L.3.19
+ bl LOC(3.19)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits 7
- bl L.4.23
+ bl LOC(4.23)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (7*2+1), %o2
-
-L.4.23:
+
+LOC(4.23):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (7*2-1), %o2
-
-
-L.3.19:
+
+
+LOC(3.19):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits 5
- bl L.4.21
+ bl LOC(4.21)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (5*2+1), %o2
-
-L.4.21:
+
+LOC(4.21):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (5*2-1), %o2
-
-
-
-L.2.17:
+
+
+
+LOC(2.17):
! remainder is negative
addcc %o3,%o5,%o3
! depth 3, accumulated bits 1
- bl L.3.17
+ bl LOC(3.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits 3
- bl L.4.19
+ bl LOC(4.19)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (3*2+1), %o2
-
-L.4.19:
+
+LOC(4.19):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (3*2-1), %o2
-
-
-L.3.17:
+
+
+LOC(3.17):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits 1
- bl L.4.17
+ bl LOC(4.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (1*2+1), %o2
-
-L.4.17:
+
+LOC(4.17):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (1*2-1), %o2
-
-
-
-
-L.1.16:
+
+
+
+
+LOC(1.16):
! remainder is negative
addcc %o3,%o5,%o3
! depth 2, accumulated bits -1
- bl L.2.15
+ bl LOC(2.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 3, accumulated bits -1
- bl L.3.15
+ bl LOC(3.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits -1
- bl L.4.15
+ bl LOC(4.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-1*2+1), %o2
-
-L.4.15:
+
+LOC(4.15):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-1*2-1), %o2
-
-
-L.3.15:
+
+
+LOC(3.15):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits -3
- bl L.4.13
+ bl LOC(4.13)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-3*2+1), %o2
-
-L.4.13:
+
+LOC(4.13):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-3*2-1), %o2
-
-
-
-L.2.15:
+
+
+
+LOC(2.15):
! remainder is negative
addcc %o3,%o5,%o3
! depth 3, accumulated bits -3
- bl L.3.13
+ bl LOC(3.13)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits -5
- bl L.4.11
+ bl LOC(4.11)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-5*2+1), %o2
-
-L.4.11:
+
+LOC(4.11):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-5*2-1), %o2
-
-
-L.3.13:
+
+
+LOC(3.13):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits -7
- bl L.4.9
+ bl LOC(4.9)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-7*2+1), %o2
-
-L.4.9:
+
+LOC(4.9):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-7*2-1), %o2
-
-
-
-
+
+
+
+
9:
-Lend_regular_divide:
+LOC(end_regular_divide):
subcc %o4, 1, %o4
- bge Ldivloop
+ bge LOC(divloop)
tst %o3
- bl,a Lgot_result
+ bl,a LOC(got_result)
! non-restoring fixup here (one instruction only!)
sub %o2, 1, %o2
-Lgot_result:
+LOC(got_result):
retl
mov %o2, %o0
+
+END(.udiv)
diff --git a/sysdeps/sparc/sparc32/udiv_qrnnd.S b/sysdeps/sparc/sparc32/udiv_qrnnd.S
index 5b67f874c3..2fbb8a5f54 100644
--- a/sysdeps/sparc/sparc32/udiv_qrnnd.S
+++ b/sysdeps/sparc/sparc32/udiv_qrnnd.S
@@ -1,50 +1,52 @@
! SPARC __udiv_qrnnd division support, used from longlong.h.
-
+!
! Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc.
-
+!
! This file is part of the GNU MP Library.
-
+!
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
+!
! Added PIC support - May/96, Miguel de Icaza
-
+!
! INPUT PARAMETERS
! rem_ptr i0
! n1 i1
! n0 i2
! d i3
-#include "sysdep.h"
+#include <sysdep.h>
#undef ret /* Kludge for glibc */
+#ifdef PIC
.text
+#else
+ .section .rodata,#alloc
+#endif
.align 8
.type two_to_32,@object
+ .size two_to_32,8
two_to_32:
.double 0r4294967296
- .size two_to_32,8
.type two_to_31,@object
+ .size two_to_31,8
two_to_31:
.double 0r2147483648
- .size two_to_31,8
- .align 4
- .global __udiv_qrnnd
- .type __udiv_qrnnd,@function
+ .text
ENTRY(__udiv_qrnnd)
!#PROLOGUE# 0
save %sp,-104,%sp
@@ -52,57 +54,58 @@ ENTRY(__udiv_qrnnd)
st %i1,[%fp-8]
ld [%fp-8],%f10
#ifdef PIC
-.Lbase: call 1f
+LOC(base):
+ call 1f
fitod %f10,%f4
-1: ldd [%o7-(.Lbase-two_to_32)],%f8
+1: ldd [%o7-(LOC(base)-two_to_32)],%f8
#else
sethi %hi(two_to_32),%o7
fitod %f10,%f4
ldd [%o7+%lo(two_to_32)],%f8
#endif
cmp %i1,0
- bge L248
+ bge LOC(248)
mov %i0,%i5
faddd %f4,%f8,%f4
-.L248:
+LOC(248):
st %i2,[%fp-8]
ld [%fp-8],%f10
fmuld %f4,%f8,%f6
cmp %i2,0
- bge L249
+ bge LOC(249)
fitod %f10,%f2
faddd %f2,%f8,%f2
-.L249:
+LOC(249):
st %i3,[%fp-8]
faddd %f6,%f2,%f2
ld [%fp-8],%f10
cmp %i3,0
- bge L250
+ bge LOC(250)
fitod %f10,%f4
faddd %f4,%f8,%f4
-.L250:
+LOC(250):
fdivd %f2,%f4,%f2
#ifdef PIC
- ldd [%o7-(.Lbase-two_to_31)],%f4
+ ldd [%o7-(LOC(base)-two_to_31)],%f4
#else
sethi %hi(two_to_31),%o7
ldd [%o7+%lo(two_to_31)],%f4
#endif
fcmped %f2,%f4
nop
- fbge,a L251
+ fbge,a LOC(251)
fsubd %f2,%f4,%f2
fdtoi %f2,%f2
st %f2,[%fp-8]
- b L252
+ b LOC(252)
ld [%fp-8],%i4
-.L251:
+LOC(251):
fdtoi %f2,%f2
st %f2,[%fp-8]
ld [%fp-8],%i4
sethi %hi(-2147483648),%g2
xor %i4,%g2,%i4
-.L252:
+LOC(252):
wr %g0,%i4,%y
sra %i3,31,%g2
and %i4,%g2,%g2
@@ -144,7 +147,7 @@ ENTRY(__udiv_qrnnd)
rd %y,%g3
subcc %i2,%g3,%o7
subxcc %i1,%i0,%g0
- be L253
+ be LOC(253)
cmp %o7,%i3
add %i4,-1,%i0
@@ -152,14 +155,14 @@ ENTRY(__udiv_qrnnd)
st %o7,[%i5]
ret
restore
-.L253:
- blu L246
+LOC(253):
+ blu LOC(246)
mov %i4,%i0
add %i4,1,%i0
sub %o7,%i3,%o7
-.L246:
+LOC(246):
st %o7,[%i5]
ret
restore
- .size __udiv_qrnnd, .-__udiv_qrnnd
+END(__udiv_qrnnd)
diff --git a/sysdeps/sparc/sparc32/umul.S b/sysdeps/sparc/sparc32/umul.S
index 7a26c295cb..096554a2bc 100644
--- a/sysdeps/sparc/sparc32/umul.S
+++ b/sysdeps/sparc/sparc32/umul.S
@@ -14,13 +14,14 @@
* bnz overflow (or tnz)
*/
-#include "DEFS.h"
-FUNC(.umul)
+#include <sysdep.h>
+
+ENTRY(.umul)
or %o0, %o1, %o4
- mov %o0, %y ! multiplier -> Y
- andncc %o4, 0xfff, %g0 ! test bits 12..31 of *both* args
- be Lmul_shortway ! if zero, can do it the short way
- andcc %g0, %g0, %o4 ! zero the partial product and clear N and V
+ mov %o0, %y ! multiplier -> Y
+ andncc %o4, 0xfff, %g0 ! test bits 12..31 of *both* args
+ be LOC(mul_shortway) ! if zero, can do it the short way
+ andcc %g0, %g0, %o4 ! zero the partial product; clear N & V
/*
* Long multiply. 32 steps, followed by a final shift step.
@@ -59,7 +60,6 @@ FUNC(.umul)
mulscc %o4, %o1, %o4 ! 32
mulscc %o4, %g0, %o4 ! final shift
-
/*
* Normally, with the shift-and-add approach, if both numbers are
* positive you get the correct result. With 32-bit two's-complement
@@ -97,20 +97,20 @@ FUNC(.umul)
#if 0
tst %o1
bl,a 1f ! if %o1 < 0 (high order bit = 1),
- add %o4, %o0, %o4 ! %o4 += %o0 (add y to upper half)
+ add %o4, %o0, %o4 ! %o4 += %o0 (add y to upper half)
1: rd %y, %o0 ! get lower half of product
retl
- addcc %o4, %g0, %o1 ! put upper half in place and set Z for %o1==0
+ addcc %o4, %g0, %o1 ! put upper half in place and set Z for %o1==0
#else
/* Faster code from tege@sics.se. */
sra %o1, 31, %o2 ! make mask from sign bit
and %o0, %o2, %o2 ! %o2 = 0 or %o0, depending on sign of %o1
rd %y, %o0 ! get lower half of product
retl
- addcc %o4, %o2, %o1 ! add compensation and put upper half in place
+ addcc %o4, %o2, %o1 ! add compensation and put upper half in place
#endif
-Lmul_shortway:
+LOC(mul_shortway):
/*
* Short multiply. 12 steps, followed by a final shift step.
* The resulting bits are off by 12 and (32-12) = 20 bit positions,
@@ -150,4 +150,6 @@ Lmul_shortway:
srl %o5, 20, %o5 ! shift low bits right 20
or %o5, %o0, %o0
retl
- addcc %g0, %g0, %o1 ! %o1 = zero, and set Z
+ addcc %g0, %g0, %o1 ! %o1 = zero, and set Z
+
+END(.umul)
diff --git a/sysdeps/sparc/sparc32/urem.S b/sysdeps/sparc/sparc32/urem.S
index e72c33dd63..5644e7a892 100644
--- a/sysdeps/sparc/sparc32/urem.S
+++ b/sysdeps/sparc/sparc32/urem.S
@@ -37,16 +37,8 @@
-#include "sysdep.h"
-#ifdef __linux__
-#include <asm/traps.h>
-#else
-#ifdef __svr4__
+#include <sysdep.h>
#include <sys/trap.h>
-#else
-#include <machine/trap.h>
-#endif
-#endif
ENTRY(.urem)
@@ -63,11 +55,11 @@ ENTRY(.urem)
1:
cmp %o3, %o5 ! if %o1 exceeds %o0, done
- blu Lgot_result ! (and algorithm fails otherwise)
+ blu LOC(got_result) ! (and algorithm fails otherwise)
clr %o2
sethi %hi(1 << (32 - 4 - 1)), %g1
cmp %o3, %g1
- blu Lnot_really_big
+ blu LOC(not_really_big)
clr %o4
! Here the dividend is >= 2**(31-N) or so. We must be careful here,
@@ -78,15 +70,15 @@ ENTRY(.urem)
1:
cmp %o5, %g1
bgeu 3f
- mov 1, %g7
+ mov 1, %g2
sll %o5, 4, %o5
b 1b
add %o4, 1, %o4
- ! Now compute %g7.
+ ! Now compute %g2.
2: addcc %o5, %o5, %o5
- bcc Lnot_too_big
- add %g7, 1, %g7
+ bcc LOC(not_too_big)
+ add %g2, 1, %g2
! We get here if the %o1 overflowed while shifting.
! This means that %o3 has the high-order bit set.
@@ -94,20 +86,20 @@ ENTRY(.urem)
sll %g1, 4, %g1 ! high order bit
srl %o5, 1, %o5 ! rest of %o5
add %o5, %g1, %o5
- b Ldo_single_div
- sub %g7, 1, %g7
+ b LOC(do_single_div)
+ sub %g2, 1, %g2
- Lnot_too_big:
+ LOC(not_too_big):
3: cmp %o5, %o3
blu 2b
nop
- be Ldo_single_div
+ be LOC(do_single_div)
nop
/* NB: these are commented out in the V8-Sparc manual as well */
/* (I do not understand this) */
! %o5 > %o3: went too far: back up 1 step
! srl %o5, 1, %o5
- ! dec %g7
+ ! dec %g2
! do single-bit divide steps
!
! We have to be careful here. We know that %o3 >= %o5, so we can do the
@@ -116,15 +108,15 @@ ENTRY(.urem)
! order bit set in the first step, just falling into the regular
! division loop will mess up the first time around.
! So we unroll slightly...
- Ldo_single_div:
- subcc %g7, 1, %g7
- bl Lend_regular_divide
+ LOC(do_single_div):
+ subcc %g2, 1, %g2
+ bl LOC(end_regular_divide)
nop
sub %o3, %o5, %o3
mov 1, %o2
- b Lend_single_divloop
+ b LOC(end_single_divloop)
nop
- Lsingle_divloop:
+ LOC(single_divloop):
sll %o2, 1, %o2
bl 1f
srl %o5, 1, %o5
@@ -136,217 +128,219 @@ ENTRY(.urem)
add %o3, %o5, %o3
sub %o2, 1, %o2
2:
- Lend_single_divloop:
- subcc %g7, 1, %g7
- bge Lsingle_divloop
+ LOC(end_single_divloop):
+ subcc %g2, 1, %g2
+ bge LOC(single_divloop)
tst %o3
- b,a Lend_regular_divide
+ b,a LOC(end_regular_divide)
-Lnot_really_big:
+LOC(not_really_big):
1:
sll %o5, 4, %o5
cmp %o5, %o3
bleu 1b
addcc %o4, 1, %o4
- be Lgot_result
+ be LOC(got_result)
sub %o4, 1, %o4
tst %o3 ! set up for initial iteration
-Ldivloop:
+LOC(divloop):
sll %o2, 4, %o2
! depth 1, accumulated bits 0
- bl L.1.16
+ bl LOC(1.16)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 2, accumulated bits 1
- bl L.2.17
+ bl LOC(2.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 3, accumulated bits 3
- bl L.3.19
+ bl LOC(3.19)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits 7
- bl L.4.23
+ bl LOC(4.23)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (7*2+1), %o2
-
-L.4.23:
+
+LOC(4.23):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (7*2-1), %o2
-
-
-L.3.19:
+
+
+LOC(3.19):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits 5
- bl L.4.21
+ bl LOC(4.21)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (5*2+1), %o2
-
-L.4.21:
+
+LOC(4.21):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (5*2-1), %o2
-
-
-
-L.2.17:
+
+
+
+LOC(2.17):
! remainder is negative
addcc %o3,%o5,%o3
! depth 3, accumulated bits 1
- bl L.3.17
+ bl LOC(3.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits 3
- bl L.4.19
+ bl LOC(4.19)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (3*2+1), %o2
-
-L.4.19:
+
+LOC(4.19):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (3*2-1), %o2
-
-
-L.3.17:
+
+
+LOC(3.17):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits 1
- bl L.4.17
+ bl LOC(4.17)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (1*2+1), %o2
-
-L.4.17:
+
+LOC(4.17):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (1*2-1), %o2
-
-
-
-
-L.1.16:
+
+
+
+
+LOC(1.16):
! remainder is negative
addcc %o3,%o5,%o3
! depth 2, accumulated bits -1
- bl L.2.15
+ bl LOC(2.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 3, accumulated bits -1
- bl L.3.15
+ bl LOC(3.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits -1
- bl L.4.15
+ bl LOC(4.15)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-1*2+1), %o2
-
-L.4.15:
+
+LOC(4.15):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-1*2-1), %o2
-
-
-L.3.15:
+
+
+LOC(3.15):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits -3
- bl L.4.13
+ bl LOC(4.13)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-3*2+1), %o2
-
-L.4.13:
+
+LOC(4.13):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-3*2-1), %o2
-
-
-
-L.2.15:
+
+
+
+LOC(2.15):
! remainder is negative
addcc %o3,%o5,%o3
! depth 3, accumulated bits -3
- bl L.3.13
+ bl LOC(3.13)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
! depth 4, accumulated bits -5
- bl L.4.11
+ bl LOC(4.11)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-5*2+1), %o2
-
-L.4.11:
+
+LOC(4.11):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-5*2-1), %o2
-
-
-L.3.13:
+
+
+LOC(3.13):
! remainder is negative
addcc %o3,%o5,%o3
! depth 4, accumulated bits -7
- bl L.4.9
+ bl LOC(4.9)
srl %o5,1,%o5
! remainder is positive
subcc %o3,%o5,%o3
b 9f
add %o2, (-7*2+1), %o2
-
-L.4.9:
+
+LOC(4.9):
! remainder is negative
addcc %o3,%o5,%o3
b 9f
add %o2, (-7*2-1), %o2
-
-
-
-
+
+
+
+
9:
-Lend_regular_divide:
+LOC(end_regular_divide):
subcc %o4, 1, %o4
- bge Ldivloop
+ bge LOC(divloop)
tst %o3
- bl,a Lgot_result
+ bl,a LOC(got_result)
! non-restoring fixup here (one instruction only!)
add %o3, %o1, %o3
-Lgot_result:
+LOC(got_result):
retl
mov %o3, %o0
+
+END(.urem)
diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h
index eb46ba92be..e302f4a1fe 100644
--- a/sysdeps/sparc/sparc64/dl-machine.h
+++ b/sysdeps/sparc/sparc64/dl-machine.h
@@ -220,6 +220,13 @@ elf_machine_lazy_rel (struct link_map *map, const Elf64_Rela *reloc)
/* The SPARC overlaps DT_RELA and DT_PLTREL. */
#define ELF_MACHINE_PLTREL_OVERLAP 1
+/* The return value from dl-runtime's fixup, if it should be special. */
+#define ELF_FIXUP_RETURN_VALUE(map, result) \
+ ((map)->l_info[DT_SPARC(PLTFMT)] \
+ && (map)->l_info[DT_SPARC(PLTFMT)]->d_un.d_val == 2 \
+ ? (result) + (map)->l_info[DT_PLTGOT]->d_un.d_ptr + (map)->l_addr \
+ : (result))
+
/* Set up the loaded object described by L so its unrelocated PLT
entries will jump to the on-demand fixup code in dl-runtime.c. */
@@ -232,10 +239,10 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
if (l->l_info[DT_JMPREL] && lazy)
{
got = (Elf64_Addr *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr);
- got[1] = (Elf64_Addr) l; /* Identify this shared object. */
/* This function will get called to fix up the GOT entry indicated by
the offset on the stack, and then jump to the resolved address. */
- got[2] = (Elf64_Addr) &_dl_runtime_resolve;
+ got[1] = (Elf64_Addr) &_dl_runtime_resolve;
+ got[2] = (Elf64_Addr) l; /* Identify this shared object. */
}
return lazy;
@@ -248,9 +255,9 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
.type _dl_runtime_resolve, @function
_dl_runtime_resolve:
save %sp, -160, %sp
- mov %g5, %o0
+ mov %g1, %o0
call fixup
- mov %g6, %o1
+ mov %g2, %o1
jmp %o0
restore
.size _dl_runtime_resolve, .-_dl_runtime_resolve
diff --git a/sysdeps/sparc/sparc64/fpu/fpu_control.h b/sysdeps/sparc/sparc64/fpu/fpu_control.h
index fd8abb19f1..bedc034eaa 100644
--- a/sysdeps/sparc/sparc64/fpu/fpu_control.h
+++ b/sysdeps/sparc/sparc64/fpu/fpu_control.h
@@ -41,13 +41,11 @@
/* Now two recommended cw */
-/* Linux default:
+/* Linux and IEEE default:
- extended precision
- rounding to nearest
- no exceptions */
#define _FPU_DEFAULT 0x0
-
-/* IEEE: same as above */
#define _FPU_IEEE 0x0
/* Type of the control word. */
diff --git a/sysdeps/standalone/i386/i386.h b/sysdeps/standalone/i386/i386.h
index 20d7f01fe3..d76f4815cc 100644
--- a/sysdeps/standalone/i386/i386.h
+++ b/sysdeps/standalone/i386/i386.h
@@ -311,11 +311,11 @@ static inline void set_segment(
/* Now, reload all segment registers so the limit takes effect. */
- asm volatile( "movw %%ds,%0 ; movw %0,%%ds
- movw %%es,%0 ; movw %0,%%es
- movw %%fs,%0 ; movw %0,%%fs
- movw %%gs,%0 ; movw %0,%%gs
- movw %%ss,%0 ; movw %0,%%ss"
+ asm volatile( "movw %%ds,%0 ; movw %0,%%ds\n"
+ "movw %%es,%0 ; movw %0,%%es\n"
+ "movw %%fs,%0 ; movw %0,%%fs\n"
+ "movw %%gs,%0 ; movw %0,%%gs\n"
+ "movw %%ss,%0 ; movw %0,%%ss"
: "=r" (tmp_segment)
: "0" (tmp_segment)
);
diff --git a/sysdeps/standalone/i960/i960ca.h b/sysdeps/standalone/i960/i960ca.h
index ba8db2b985..253d5d932f 100644
--- a/sysdeps/standalone/i960/i960ca.h
+++ b/sysdeps/standalone/i960/i960ca.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil),
On-Line Applications Research Corporation.
@@ -157,10 +157,10 @@ struct i80960ca_ctltbl {
#define clear_intr( xint ) \
{ register unsigned32 _xint=(xint); \
- asm volatile( "loop_til_cleared:
- clrbit %0,sf0,sf0 ; \
- bbs %0,sf0,loop_til_cleared" \
- : "=d" (_xint) : "0" (_xint) ); \
+ asm volatile( "loop_til_cleared:" \
+ " clrbit %0,sf0,sf0 ;" \
+ " bbs %0,sf0,loop_til_cleared" \
+ : "=d" (_xint) : "0" (_xint) ); \
}
#define reload_ctl_group( group ) \
diff --git a/sysdeps/unix/sysv/linux/init-first.c b/sysdeps/unix/sysv/linux/init-first.c
index cbb5fa8a23..cebb9c150a 100644
--- a/sysdeps/unix/sysv/linux/init-first.c
+++ b/sysdeps/unix/sysv/linux/init-first.c
@@ -50,7 +50,7 @@ static void
init (int argc, char **argv, char **envp)
{
extern int __personality (int);
- extern void __getopt_clean_environment (void);
+ extern void __getopt_clean_environment (char **);
/* We must not call `personality' twice. */
if (!__libc_multiple_libcs)
@@ -74,7 +74,7 @@ init (int argc, char **argv, char **envp)
__libc_init (argc, argv, envp);
/* This is a hack to make the special getopt in GNU libc working. */
- __getopt_clean_environment ();
+ __getopt_clean_environment (envp);
#ifdef PIC
__libc_global_ctors ();
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S b/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S
index a639511f3e..8e88a3ff04 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S
@@ -74,24 +74,19 @@ ENTRY(____sparc_signal_trampoline)
1:
#ifdef PIC
/* Save return address */
- mov %o7,%o4
-___sxx:
- call ___syy
- nop
-___syy:
- sethi %hi(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
- or %o5,%lo(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
- add %o7,%o5,%o5
+ mov %o7,%o5
+11: call 12f
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-(11b-.)),%o4
+12: or %o5,%lo(_GLOBAL_OFFSET_TABLE_-(11b-.)),%o4
+ add %o7,%o4,%o4
/* restore return address */
- mov %o4,%o7
- mov %o5,%o4
+ mov %o5,%o7
/* o4 has the GOT pointer */
#endif
sethi %hi(C_SYMBOL_NAME(____sig_table)),%o5
or %o5,%lo(C_SYMBOL_NAME(____sig_table)),%o5
#ifdef PIC
- add %o5,%o4,%o4
- ld [%o4],%o5
+ ld [%o4+%o5], %o5
#endif
sll %o0,2,%o4
add %o5,%o4,%o4
@@ -141,3 +136,5 @@ ___syy:
/* if we return, sysreturn failed */
mov SYS_ify(exit),%g1
t 0x10
+
+END(____sparc_signal_trampoline)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/getpagesize.c b/sysdeps/unix/sysv/linux/sparc/sparc32/getpagesize.c
new file mode 100644
index 0000000000..e04e926644
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/getpagesize.c
@@ -0,0 +1,39 @@
+/* Copyright (C) 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
+ 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 <unistd.h>
+#include <sys/param.h>
+
+/* Return the system page size. This value will either be 4k or 8k depending
+ on whether or not we are running on Sparc v9 machine. */
+
+/* If we are not a static program, this value is collected from the system
+ via the AT_PAGESZ auxiliary argument. If we are a static program, we
+ have to guess. We should _really_ get Linux a proper sysconf()... */
+
+extern size_t _dl_pagesize;
+
+int
+__getpagesize ()
+{
+ if (_dl_pagesize == 0)
+ _dl_pagesize = EXEC_PAGESIZE;
+ return _dl_pagesize;
+}
+
+weak_alias (__getpagesize, getpagesize)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h b/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h
index 39822fc595..9bbe6bcdab 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h
@@ -21,32 +21,76 @@
This is done in one of two ways: either in the stack context
of program start, or having dlopen pass them in. */
-#define SYSDEP_CALL_INIT(NAME, INIT) \
-void NAME (void *arg) \
-{ \
- int argc; \
- char **argv, **envp; \
- /* The next variable is only here to work around a bug in gcc <= 2.7.2.2. \
- If the address would be taken inside the expression the optimizer \
- would try to be too smart and throws it away. Grrr. */ \
- int *dummy_addr = &_dl_starting_up; \
- \
- __libc_multiple_libcs = dummy_addr && !_dl_starting_up; \
- \
- if (!__libc_multiple_libcs) \
- { \
- argc = *(int *) arg; \
- argv = (char **) (arg + 4); \
- envp = &argv[argc+1]; \
- } \
- else \
- { \
- argc = (int) arg; \
- argv = ((char ***) &arg)[1]; \
- envp = ((char ***) &arg)[2]; \
- } \
- \
- INIT (argc, argv, envp); \
-}
+#include <sysdep.h>
+#define __S1(x) #x
+#define __S(x) __S1(x)
+#ifdef PIC
+
+#define SYSDEP_CALL_INIT(NAME, INIT) asm("\
+ .weak _dl_starting_up
+ .global " #NAME "
+ .type " #NAME ",@function
+" #NAME ":
+ save %sp, -64, %sp
+1: call 11f
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+11: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+ add %l7, %o7, %l7
+ /* Are we a dynamic libc being loaded into a static program? */
+ sethi %hi(_dl_starting_up), %l2
+ or %l2, %lo(_dl_starting_up), %l2
+ ld [%l7+%l2], %l2
+ cmp %l2, 0
+ beq 3f
+ sethi %hi(__libc_multiple_libcs), %l3
+ ld [%l2], %l2
+ subcc %g0, %l2, %g0
+ subx %g0, -1, %l2
+3: or %l3, %lo(__libc_multiple_libcs), %l3
+ ld [%l7+%l3], %l3
+ cmp %l2, 0
+ st %l2, [%l3]
+ /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */
+ bnz " #INIT "
+ restore
+ ld [%sp+22*4], %o0
+ add %sp, 23*4, %o1
+ sll %o0, 2, %o2
+ add %o2, %o1, %o2
+ ba " #INIT "
+ add %o2, 4, %o2
+ .size "#NAME ", .-" #NAME);
+
+#else
+
+#define SYSDEP_CALL_INIT(NAME, INIT) asm("\
+ .weak _dl_starting_up
+ .global " #NAME "
+ .type " #NAME ",@function
+" #NAME ":
+ /* Are we a dynamic libc being loaded into a static program? */
+ sethi %hi(_dl_starting_up), %g2
+ or %g2, %lo(_dl_starting_up), %g2
+ cmp %g2, 0
+ beq 3f
+ sethi %hi(__libc_multiple_libcs), %g3
+ ld [%g4+%g2], %g2
+ subcc %g0, %g2, %g0
+ subx %g0, -1, %g2
+3: or %g3, %lo(__libc_multiple_libcs), %g3
+ cmp %g2, 0
+ st %g2, [%g3+%g4]
+ /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */
+ bnz " #INIT "
+ nop
+ ld [%sp+22*4], %o0
+ add %sp, 23*4, %o1
+ sll %o0, 2, %o2
+ add %o2, %o1, %o2
+ ba " #INIT "
+ add %o2, 4, %o2
+ .size "#NAME ", .-" #NAME);
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
index 0e5a8cd218..730332f367 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
@@ -36,44 +36,51 @@
/* Linux/SPARC uses a different trap number */
#undef PSEUDO
#undef ENTRY
+#undef END
+#undef LOC
#define ENTRY(name) \
.global C_SYMBOL_NAME(name); \
- .align 2;\
+ .align 4;\
C_LABEL(name);\
.type name,@function;
+#define END(name) \
+ .size name, . - name
+
+#define LOC(name) . ## L ## name
+
#ifdef PIC
-#define SYSCALL_ERROR_HANDLER \
- .global C_SYMBOL_NAME(__errno_location);\
- .type C_SYMBOL_NAME(__errno_location),@function;\
- save %sp,-96,%sp;\
- call __errno_location;\
- nop;\
- st %i0,[%o0];\
- restore;\
- retl;\
+#define SYSCALL_ERROR_HANDLER \
+ .global C_SYMBOL_NAME(__errno_location); \
+ .type C_SYMBOL_NAME(__errno_location),@function; \
+ save %sp,-96,%sp; \
+ call __errno_location; \
+ nop; \
+ st %i0,[%o0]; \
+ restore; \
+ retl; \
mov -1,%o0;
#else
-#define SYSCALL_ERROR_HANDLER \
- save %sp,-96,%sp; \
- call __errno_location; \
- nop; \
- st %i0,[%o0]; \
- restore; \
- retl; \
+#define SYSCALL_ERROR_HANDLER \
+ save %sp,-96,%sp; \
+ call __errno_location; \
+ nop; \
+ st %i0,[%o0]; \
+ restore; \
+ retl; \
mov -1,%o0;
#endif /* PIC */
-#define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY(name); \
- LOADSYSCALL(syscall_name); \
- ta 0x10; \
- bcc,a 1f; \
- nop; \
- SYSCALL_ERROR_HANDLER; \
-1:;
+#define PSEUDO(name, syscall_name, args) \
+ .text; \
+ ENTRY(name); \
+ LOADSYSCALL(syscall_name); \
+ ta 0x10; \
+ bcc,a 9000f; \
+ nop; \
+ SYSCALL_ERROR_HANDLER; \
+9000:;
#endif /* ASSEMBLER */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h
index 222967881f..9a4666a508 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h
@@ -42,7 +42,7 @@ typedef signed long int __int64_t;
typedef unsigned long int __uint64_t;
typedef __quad_t *__qaddr_t;
-typedef __u_int __dev_t; /* Type of device numbers. */
+typedef __u_long __dev_t; /* Type of device numbers. */
typedef __u_int __uid_t; /* Type of user identifications. */
typedef __u_int __gid_t; /* Type of group identifications. */
typedef __u_int __ino_t; /* Type of file serial numbers. */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h b/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h
index 3e27c6dcf7..955714dc4f 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h
@@ -55,7 +55,7 @@
restore
ldx [%sp+" __S(STACK_BIAS) "+22*8], %o0
add %sp, " __S(STACK_BIAS) "+23*8, %o1
- sll %o0, 3, %o2
+ sllx %o0, 3, %o2
add %o2, %o1, %o2
ba " #INIT "
add %o2, 8, %o2
@@ -83,10 +83,10 @@
nop
ldx [%sp+" __S(STACK_BIAS) "+22*8], %o0
add %sp, " __S(STACK_BIAS) "+23*8, %o1
- sll %o0, 3, %o2
+ sllx %o0, 3, %o2
add %o2, %o1, %o2
- add %o2, 8, %o2
- ba,a " #INIT "
+ ba " #INIT "
+ add %o2, 8, %o2
.size "#NAME ", .-" #NAME);
#endif