summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/longjmp.c45
-rw-r--r--sysdeps/generic/rpc/auth.h5
-rw-r--r--sysdeps/generic/sigjmp.c35
-rw-r--r--sysdeps/i386/fpu/fraiseexcpt.c21
-rw-r--r--sysdeps/mach/hurd/select.c2
-rw-r--r--sysdeps/powerpc/bits/endian.h3
-rw-r--r--sysdeps/sparc/bsd-_setjmp.S31
-rw-r--r--sysdeps/sparc/bsd-setjmp.S32
-rw-r--r--sysdeps/sparc/rem.S68
-rw-r--r--sysdeps/sparc/sdiv.S68
-rw-r--r--sysdeps/sparc/setjmp.S1
-rw-r--r--sysdeps/sparc/sparc64/add_n.s58
-rw-r--r--sysdeps/sparc/sparc64/lshift.s96
-rw-r--r--sysdeps/sparc/sparc64/rshift.s93
-rw-r--r--sysdeps/sparc/sparc64/sub_n.s58
-rw-r--r--sysdeps/sparc/sys/trap.h7
-rw-r--r--sysdeps/sparc/udiv.S68
-rw-r--r--sysdeps/sparc/urem.S68
-rw-r--r--sysdeps/sparc64/Implies3
-rw-r--r--sysdeps/sparc64/Makefile11
-rw-r--r--sysdeps/sparc64/add_n.S58
-rw-r--r--sysdeps/sparc64/addmul_1.S (renamed from sysdeps/sparc/sparc64/addmul_1.s)69
-rw-r--r--sysdeps/sparc64/bits/endian.h8
-rw-r--r--sysdeps/sparc64/bsd-_setjmp.S43
-rw-r--r--sysdeps/sparc64/bsd-setjmp.S41
-rwxr-xr-xsysdeps/sparc64/configure3
-rw-r--r--sysdeps/sparc64/configure.in7
-rw-r--r--sysdeps/sparc64/dl-machine.h304
-rw-r--r--sysdeps/sparc64/elf/Makefile10
-rw-r--r--sysdeps/sparc64/elf/crtbegin.S49
-rw-r--r--sysdeps/sparc64/elf/crtbeginS.S1
-rw-r--r--sysdeps/sparc64/elf/crtend.S50
-rw-r--r--sysdeps/sparc64/elf/crtendS.S1
-rw-r--r--sysdeps/sparc64/elf/start.S93
-rw-r--r--sysdeps/sparc64/fpu_control.h69
-rw-r--r--sysdeps/sparc64/gmp-mparam.h (renamed from sysdeps/sparc/sparc64/gmp-mparam.h)0
-rw-r--r--sysdeps/sparc64/lshift.S96
-rw-r--r--sysdeps/sparc64/mul_1.S (renamed from sysdeps/sparc/sparc64/mul_1.s)64
-rw-r--r--sysdeps/sparc64/rshift.S93
-rw-r--r--sysdeps/sparc64/sub_n.S55
-rw-r--r--sysdeps/sparc64/submul_1.S (renamed from sysdeps/sparc/sparc64/submul_1.s)64
-rw-r--r--sysdeps/unix/sysv/linux/sparc/errno.c1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h12
-rw-r--r--sysdeps/unix/sysv/linux/sparc/kernel_stat.h9
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sys/trap.h7
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/Makefile4
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/__longjmp.S1
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h26
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/bits/types.h95
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/brk.S97
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/clone.S89
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/fork.S33
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/getcontext.S30
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/init-first.h92
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/kernel_stat.h22
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/longjmp.S44
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/pipe.S37
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/profil-counter.h26
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/setcontext.S33
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/setjmp.S48
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/sigjmp.S1
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/syscalls.list26
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/sysdep.S31
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/sysdep.h116
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/ucontext.h67
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list2
66 files changed, 2289 insertions, 611 deletions
diff --git a/sysdeps/generic/longjmp.c b/sysdeps/generic/longjmp.c
new file mode 100644
index 0000000000..f46f1601c3
--- /dev/null
+++ b/sysdeps/generic/longjmp.c
@@ -0,0 +1,45 @@
+/* Copyright (C) 1991, 1992, 1994, 1995, 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 <stddef.h>
+#include <setjmp.h>
+#include <signal.h>
+
+
+extern void _longjmp_unwind (jmp_buf env, int val);
+
+/* Set the signal mask to the one specified in ENV, and jump
+   to the position specified in ENV, causing the setjmp
+   call there to return VAL, or 1 if VAL is 0.  */
+void
+longjmp (sigjmp_buf env, int val)
+{
+  /* Perform any cleanups needed by the frames being unwound.  */
+  _longjmp_unwind (env, val);
+
+  if (env[0].__mask_was_saved)
+    /* Restore the saved signal mask.  */
+    (void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
+			  (sigset_t *) NULL);
+
+  /* Call the machine-dependent function to restore machine state.  */
+  __longjmp (env[0].__jmpbuf, val ?: 1);
+}
+
+weak_alias (longjmp, _longjmp)
+weak_alias (longjmp, siglongjmp)
diff --git a/sysdeps/generic/rpc/auth.h b/sysdeps/generic/rpc/auth.h
index 532c4d295f..b4022853d5 100644
--- a/sysdeps/generic/rpc/auth.h
+++ b/sysdeps/generic/rpc/auth.h
@@ -177,6 +177,11 @@ extern AUTH *authdes_create __P ((char *__servername, u_int __window,
 #define AUTH_DES	3		/* des style (encrypted timestamps) */
 #define AUTH_KERB       4               /* kerberos style */
 
+/*
+ * XDR an opaque authentication struct.
+ */
+extern bool_t xdr_opaque_auth __P ((XDR *__xdrs, struct opaque_auth *__ap));
+
 __END_DECLS
 
 #endif /* rpc/auth.h */
diff --git a/sysdeps/generic/sigjmp.c b/sysdeps/generic/sigjmp.c
new file mode 100644
index 0000000000..05b10cc0ce
--- /dev/null
+++ b/sysdeps/generic/sigjmp.c
@@ -0,0 +1,35 @@
+/* Copyright (C) 1992, 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 <stddef.h>
+#include <setjmp.h>
+#include <signal.h>
+
+/* This function is called by the `sigsetjmp' macro
+   before doing a `__setjmp' on ENV[0].__jmpbuf.
+   Always return zero.  */
+
+int
+__sigjmp_save (sigjmp_buf env, int savemask)
+{
+  env[0].__mask_was_saved = (savemask &&
+			     __sigprocmask (SIG_BLOCK, (sigset_t *) NULL,
+					    &env[0].__saved_mask) == 0);
+
+  return 0;
+}
diff --git a/sysdeps/i386/fpu/fraiseexcpt.c b/sysdeps/i386/fpu/fraiseexcpt.c
index c6cd6d6672..174f5ad2b2 100644
--- a/sysdeps/i386/fpu/fraiseexcpt.c
+++ b/sysdeps/i386/fpu/fraiseexcpt.c
@@ -25,7 +25,7 @@ void
 feraiseexcept (int excepts)
 {
   /* Raise exceptions represented by EXPECTS.  But we must raise only
-     one signal at a time.  It is important the if the overflow/underflow
+     one signal at a time.  It is important that if the overflow/underflow
      exception and the inexact exception are given at the same time,
      the overflow/underflow exception follows the inexact exception.  */
 
@@ -91,8 +91,21 @@ feraiseexcept (int excepts)
   /* Last: inexact.  */
   if ((FE_INEXACT & excepts) != 0)
     {
-      long double d;
-      __asm__ ("fmul %%st, %%st(0); fwait" : "=t" (d) : "0" (LDBL_MAX));
-      (void) &d;
+      /* There is no way to raise only the overflow flag.  Do it the
+	 hard way.  */
+      fenv_t temp;
+
+      /* 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));
+
+      /* Set the relevant bits.  */
+      temp.status_word |= FE_INEXACT;
+
+      /* Put the new data in effect.  */
+      __asm__ ("fldenv %0" : : "m" (*&temp));
+
+      /* And raise the exception.  */
+	__asm__ ("fwait");
     }
 }
diff --git a/sysdeps/mach/hurd/select.c b/sysdeps/mach/hurd/select.c
index 1ea6b2cb14..be27b667b9 100644
--- a/sysdeps/mach/hurd/select.c
+++ b/sysdeps/mach/hurd/select.c
@@ -223,7 +223,7 @@ __select (nfds, readfds, writefds, exceptfds, timeout)
 	  /* We got a message.  Decode it.  */
 #define IO_SELECT_REPLY_MSGID (21012 + 100) /* XXX */
 	  const mach_msg_type_t inttype =
-	    { MACH_MSG_TYPE_INTEGER_T, sizeof (MACH_MSG_SIZE_INTEGER_T),
+	    { MACH_MSG_TYPE_INTEGER_T, sizeof (MACH_MSG_TYPE_INTEGER_T),
 	      1, 1, 0, 0 };
 	  if (msg.head.msgh_id == IO_SELECT_REPLY_MSGID &&
 	      msg.head.msgh_size >= sizeof msg.error &&
diff --git a/sysdeps/powerpc/bits/endian.h b/sysdeps/powerpc/bits/endian.h
new file mode 100644
index 0000000000..e0e90cfd7a
--- /dev/null
+++ b/sysdeps/powerpc/bits/endian.h
@@ -0,0 +1,3 @@
+/* PowerPC is big-endian.  */
+
+#define __BYTE_ORDER __BIG_ENDIAN
diff --git a/sysdeps/sparc/bsd-_setjmp.S b/sysdeps/sparc/bsd-_setjmp.S
index 522fe0e3a1..bf49765f4d 100644
--- a/sysdeps/sparc/bsd-_setjmp.S
+++ b/sysdeps/sparc/bsd-_setjmp.S
@@ -20,24 +20,21 @@
 #include <sysdep.h>
 
 ENTRY (_setjmp)
+
 #ifdef PIC
-1:
-	jmpl  2f,%o1
-	nop
-2:
-	sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
-	or    %l7,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
-	add   %l7,%o1,%l7
-	sethi %hi(C_SYMBOL_NAME (__sigsetjmp)),%g1
-	or    %g1,%lo(C_SYMBOL_NAME (__sigsetjmp)),%g1
-	ld    [%l7+%g1],%g1
-	ld    [%g1],%g1
-	jmpl  %g1,%g0
-	mov   %g0,%o1           /* Pass second argument of zero */
+	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
 
-	sethi %hi(C_SYMBOL_NAME (__sigsetjmp)), %g1
-	or %lo(C_SYMBOL_NAME (__sigsetjmp)), %g1, %g1
 	jmp %g1
-	mov %g0, %o1		/* Pass second argument of zero.  */
-#endif
+	 mov %g0, %o1		/* Pass second argument of zero.  */
diff --git a/sysdeps/sparc/bsd-setjmp.S b/sysdeps/sparc/bsd-setjmp.S
index 09aee661da..16dc260765 100644
--- a/sysdeps/sparc/bsd-setjmp.S
+++ b/sysdeps/sparc/bsd-setjmp.S
@@ -20,23 +20,21 @@
 #include <sysdep.h>
 
 ENTRY (setjmp)
+
 #ifdef PIC
-1:
-	jmpl  2f,%o1
-	nop
-2:
-	sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
-	or    %l7,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
-	add   %l7,%o1,%l7
-	sethi %hi(C_SYMBOL_NAME (__sigsetjmp)),%g1
-	or    %g1,%lo(C_SYMBOL_NAME (__sigsetjmp)),%g1
-	ld    [%l7+%g1],%g1
-	ld    [%g1],%g1
-	jmpl  %g1,%g0
-	mov   1,%o1
+	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 %lo(C_SYMBOL_NAME (__sigsetjmp)), %g1, %g1
-	jmp %g1
-	mov 1, %o1		/* Pass second argument of one.  */
+	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.  */
diff --git a/sysdeps/sparc/rem.S b/sysdeps/sparc/rem.S
index 565fc0f678..05916f0b06 100644
--- a/sysdeps/sparc/rem.S
+++ b/sysdeps/sparc/rem.S
@@ -38,15 +38,7 @@
 
 
 #include "DEFS.h"
-#ifdef __linux__
-#include <asm/traps.h>
-#else
-#ifdef __svr4__
 #include <sys/trap.h>
-#else
-#include <machine/trap.h>
-#endif
-#endif
 
 FUNC(.rem)
 	! compute sign of result; if neither is negative, no problem
@@ -189,14 +181,14 @@ Ldivloop:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (7*2+1), %o2
-	
+
 L.4.23:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (7*2-1), %o2
-	
-	
+
+
 L.3.19:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -207,15 +199,15 @@ L.3.19:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (5*2+1), %o2
-	
+
 L.4.21:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (5*2-1), %o2
-	
-	
-	
+
+
+
 L.2.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -231,14 +223,14 @@ L.2.17:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (3*2+1), %o2
-	
+
 L.4.19:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (3*2-1), %o2
-	
-	
+
+
 L.3.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -249,16 +241,16 @@ L.3.17:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (1*2+1), %o2
-	
+
 L.4.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (1*2-1), %o2
-	
-	
-	
-	
+
+
+
+
 L.1.16:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -279,14 +271,14 @@ L.1.16:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-1*2+1), %o2
-	
+
 L.4.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-1*2-1), %o2
-	
-	
+
+
 L.3.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -297,15 +289,15 @@ L.3.15:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-3*2+1), %o2
-	
+
 L.4.13:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-3*2-1), %o2
-	
-	
-	
+
+
+
 L.2.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -321,14 +313,14 @@ L.2.15:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-5*2+1), %o2
-	
+
 L.4.11:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-5*2-1), %o2
-	
-	
+
+
 L.3.13:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -339,16 +331,16 @@ L.3.13:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-7*2+1), %o2
-	
+
 L.4.9:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-7*2-1), %o2
-	
-	
-	
-	
+
+
+
+
 	9:
 Lend_regular_divide:
 	subcc	%o4, 1, %o4
diff --git a/sysdeps/sparc/sdiv.S b/sysdeps/sparc/sdiv.S
index 7397e5edb8..910cea528a 100644
--- a/sysdeps/sparc/sdiv.S
+++ b/sysdeps/sparc/sdiv.S
@@ -38,15 +38,7 @@
 
 
 #include "DEFS.h"
-#ifdef __linux__
-#include <asm/traps.h>
-#else
-#ifdef __svr4__
 #include <sys/trap.h>
-#else
-#include <machine/trap.h>
-#endif
-#endif
 
 FUNC(.div)
 	! compute sign of result; if neither is negative, no problem
@@ -189,14 +181,14 @@ Ldivloop:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (7*2+1), %o2
-	
+
 L.4.23:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (7*2-1), %o2
-	
-	
+
+
 L.3.19:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -207,15 +199,15 @@ L.3.19:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (5*2+1), %o2
-	
+
 L.4.21:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (5*2-1), %o2
-	
-	
-	
+
+
+
 L.2.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -231,14 +223,14 @@ L.2.17:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (3*2+1), %o2
-	
+
 L.4.19:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (3*2-1), %o2
-	
-	
+
+
 L.3.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -249,16 +241,16 @@ L.3.17:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (1*2+1), %o2
-	
+
 L.4.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (1*2-1), %o2
-	
-	
-	
-	
+
+
+
+
 L.1.16:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -279,14 +271,14 @@ L.1.16:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-1*2+1), %o2
-	
+
 L.4.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-1*2-1), %o2
-	
-	
+
+
 L.3.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -297,15 +289,15 @@ L.3.15:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-3*2+1), %o2
-	
+
 L.4.13:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-3*2-1), %o2
-	
-	
-	
+
+
+
 L.2.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -321,14 +313,14 @@ L.2.15:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-5*2+1), %o2
-	
+
 L.4.11:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-5*2-1), %o2
-	
-	
+
+
 L.3.13:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -339,16 +331,16 @@ L.3.13:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-7*2+1), %o2
-	
+
 L.4.9:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-7*2-1), %o2
-	
-	
-	
-	
+
+
+
+
 	9:
 Lend_regular_divide:
 	subcc	%o4, 1, %o4
diff --git a/sysdeps/sparc/setjmp.S b/sysdeps/sparc/setjmp.S
index b80a83046e..772ec723a3 100644
--- a/sysdeps/sparc/setjmp.S
+++ b/sysdeps/sparc/setjmp.S
@@ -17,6 +17,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <sysdep.h>
+#include <sys/trap.h>
 
 #define _ASM 1
 #include <bits/setjmp.h>
diff --git a/sysdeps/sparc/sparc64/add_n.s b/sysdeps/sparc/sparc64/add_n.s
deleted file mode 100644
index 01d1f49564..0000000000
--- a/sysdeps/sparc/sparc64/add_n.s
+++ /dev/null
@@ -1,58 +0,0 @@
-! SPARC v9 __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.
-
-! 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,
-! MA 02111-1307, USA.
-
-
-! INPUT PARAMETERS
-! res_ptr	%o0
-! s1_ptr	%o1
-! s2_ptr	%o2
-! size		%o3
-
-.section	".text"
-	.align 4
-	.global __mpn_add_n
-	.type	 __mpn_add_n,#function
-	.proc	04
-__mpn_add_n:
-	sub %g0,%o3,%g3
-	sllx %o3,3,%g1
-	add %o1,%g1,%o1			! make s1_ptr point at end
-	add %o2,%g1,%o2			! make s2_ptr point at end
-	add %o0,%g1,%o0			! make res_ptr point at end
-	mov 0,%o4			! clear carry variable
-	sllx %g3,3,%o5			! compute initial address index
-
-.Loop:	ldx [%o2+%o5],%g1		! load s2 limb
-	add %g3,1,%g3			! increment loop count
-	ldx [%o1+%o5],%g2		! load s1 limb
-	addcc %g1,%o4,%g1		! add s2 limb and carry variable
-	movcc %xcc,0,%o4		! if carry-out, o4 was 1; clear it
-	addcc %g1,%g2,%g1		! add s1 limb to sum
-	stx %g1,[%o0+%o5]		! store result
-	add %o5,8,%o5			! increment address index
-	brnz,pt %g3,.Loop
-	movcs %xcc,1,%o4		! if s1 add gave carry, record it
-
-	retl
-	mov %o4,%o0
-.LLfe1:
-	.size	 __mpn_add_n,.LLfe1-__mpn_add_n
diff --git a/sysdeps/sparc/sparc64/lshift.s b/sysdeps/sparc/sparc64/lshift.s
deleted file mode 100644
index ad1f667fa3..0000000000
--- a/sysdeps/sparc/sparc64/lshift.s
+++ /dev/null
@@ -1,96 +0,0 @@
-! SPARC v9 __mpn_lshift --
-
-! Copyright (C) 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,
-! MA 02111-1307, USA.
-
-
-! INPUT PARAMETERS
-! res_ptr	%o0
-! src_ptr	%o1
-! size		%o2
-! cnt		%o3
-
-.section	".text"
-	.align 4
-	.global __mpn_lshift
-	.type	 __mpn_lshift,#function
-	.proc	04
-__mpn_lshift:
-	sllx	%o2,3,%g1
-	add	%o1,%g1,%o1	! make %o1 point at end of src
-	ldx	[%o1-8],%g2	! load first limb
-	sub	%g0,%o3,%o5	! negate shift count
-	add	%o0,%g1,%o0	! make %o0 point at end of res
-	add	%o2,-1,%o2
-	and	%o2,4-1,%g4	! number of limbs in first loop
-	srlx	%g2,%o5,%g1	! compute function result
-	brz,pn	%g4,.L0		! if multiple of 4 limbs, skip first loop
-	stx	%g1,[%sp+80]
-
-	sub	%o2,%g4,%o2	! adjust count for main loop
-
-.Loop0:	ldx	[%o1-16],%g3
-	add	%o0,-8,%o0
-	add	%o1,-8,%o1
-	add	%g4,-1,%g4
-	sllx	%g2,%o3,%o4
-	srlx	%g3,%o5,%g1
-	mov	%g3,%g2
-	or	%o4,%g1,%o4
-	brnz,pt	%g4,.Loop0
-	 stx	%o4,[%o0+0]
-
-.L0:	brz,pn	%o2,.Lend
-	 nop
-
-.Loop:	ldx	[%o1-16],%g3
-	add	%o0,-32,%o0
-	add	%o2,-4,%o2
-	sllx	%g2,%o3,%o4
-	srlx	%g3,%o5,%g1
-
-	ldx	[%o1-24],%g2
-	sllx	%g3,%o3,%g4
-	or	%o4,%g1,%o4
-	stx	%o4,[%o0+24]
-	srlx	%g2,%o5,%g1
-
-	ldx	[%o1-32],%g3
-	sllx	%g2,%o3,%o4
-	or	%g4,%g1,%g4
-	stx	%g4,[%o0+16]
-	srlx	%g3,%o5,%g1
-
-	ldx	[%o1-40],%g2
-	sllx	%g3,%o3,%g4
-	or	%o4,%g1,%o4
-	stx	%o4,[%o0+8]
-	srlx	%g2,%o5,%g1
-
-	add	%o1,-32,%o1
-	or	%g4,%g1,%g4
-	brnz,pt	%o2,.Loop
-	 stx	%g4,[%o0+0]
-
-.Lend:	sllx	%g2,%o3,%g2
-	stx	%g2,[%o0-8]
-	retl
-	ldx	[%sp+80],%o0
-.LLfe1:
-	.size	 __mpn_lshift,.LLfe1-__mpn_lshift
diff --git a/sysdeps/sparc/sparc64/rshift.s b/sysdeps/sparc/sparc64/rshift.s
deleted file mode 100644
index ff6a380160..0000000000
--- a/sysdeps/sparc/sparc64/rshift.s
+++ /dev/null
@@ -1,93 +0,0 @@
-! SPARC v9 __mpn_rshift --
-
-! Copyright (C) 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,
-! MA 02111-1307, USA.
-
-
-! INPUT PARAMETERS
-! res_ptr	%o0
-! src_ptr	%o1
-! size		%o2
-! cnt		%o3
-
-.section	".text"
-	.align	4
-	.global	__mpn_rshift
-	.type	__mpn_rshift,#function
-	.proc	04
-__mpn_rshift:
-	ldx	[%o1],%g2	! load first limb
-	sub	%g0,%o3,%o5	! negate shift count
-	add	%o2,-1,%o2
-	and	%o2,4-1,%g4	! number of limbs in first loop
-	sllx	%g2,%o5,%g1	! compute function result
-	brz,pn	%g4,.L0		! if multiple of 4 limbs, skip first loop
-	stx	%g1,[%sp+80]
-
-	sub	%o2,%g4,%o2	! adjust count for main loop
-
-.Loop0:	ldx	[%o1+8],%g3
-	add	%o0,8,%o0
-	add	%o1,8,%o1
-	add	%g4,-1,%g4
-	srlx	%g2,%o3,%o4
-	sllx	%g3,%o5,%g1
-	mov	%g3,%g2
-	or	%o4,%g1,%o4
-	brnz,pt	%g4,.Loop0
-	 stx	%o4,[%o0-8]
-
-.L0:	brz,pn	%o2,.Lend
-	 nop
-
-.Loop:	ldx	[%o1+8],%g3
-	add	%o0,32,%o0
-	add	%o2,-4,%o2
-	srlx	%g2,%o3,%o4
-	sllx	%g3,%o5,%g1
-
-	ldx	[%o1+16],%g2
-	srlx	%g3,%o3,%g4
-	or	%o4,%g1,%o4
-	stx	%o4,[%o0-32]
-	sllx	%g2,%o5,%g1
-
-	ldx	[%o1+24],%g3
-	srlx	%g2,%o3,%o4
-	or	%g4,%g1,%g4
-	stx	%g4,[%o0-24]
-	sllx	%g3,%o5,%g1
-
-	ldx	[%o1+32],%g2
-	srlx	%g3,%o3,%g4
-	or	%o4,%g1,%o4
-	stx	%o4,[%o0-16]
-	sllx	%g2,%o5,%g1
-
-	add	%o1,32,%o1
-	or	%g4,%g1,%g4
-	brnz	%o2,.Loop
-	 stx	%g4,[%o0-8]
-
-.Lend:	srlx	%g2,%o3,%g2
-	stx	%g2,[%o0-0]
-	retl
-	ldx	[%sp+80],%o0
-.LLfe1:
-	.size	__mpn_rshift,.LLfe1-__mpn_rshift
diff --git a/sysdeps/sparc/sparc64/sub_n.s b/sysdeps/sparc/sparc64/sub_n.s
deleted file mode 100644
index d4842b8cdd..0000000000
--- a/sysdeps/sparc/sparc64/sub_n.s
+++ /dev/null
@@ -1,58 +0,0 @@
-! SPARC v9 __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,
-! MA 02111-1307, USA.
-
-
-! INPUT PARAMETERS
-! res_ptr	%o0
-! s1_ptr	%o1
-! s2_ptr	%o2
-! size		%o3
-
-.section	".text"
-	.align 4
-	.global __mpn_sub_n
-	.type	 __mpn_sub_n,#function
-	.proc	04
-__mpn_sub_n:
-	sub %g0,%o3,%g3
-	sllx %o3,3,%g1
-	add %o1,%g1,%o1			! make s1_ptr point at end
-	add %o2,%g1,%o2			! make s2_ptr point at end
-	add %o0,%g1,%o0			! make res_ptr point at end
-	mov 0,%o4			! clear carry variable
-	sllx %g3,3,%o5			! compute initial address index
-
-.Loop:	ldx [%o2+%o5],%g1		! load s2 limb
-	add %g3,1,%g3			! increment loop count
-	ldx [%o1+%o5],%g2		! load s1 limb
-	addcc %g1,%o4,%g1		! add s2 limb and carry variable
-	movcc %xcc,0,%o4		! if carry-out, o4 was 1; clear it
-	subcc %g1,%g2,%g1		! subtract s1 limb from sum
-	stx %g1,[%o0+%o5]		! store result
-	add %o5,8,%o5			! increment address index
-	brnz,pt %g3,.Loop
-	movcs %xcc,1,%o4		! if s1 subtract gave carry, record it
-
-	retl
-	mov %o4,%o0
-.LLfe1:
-	.size	 __mpn_sub_n,.LLfe1-__mpn_sub_n
diff --git a/sysdeps/sparc/sys/trap.h b/sysdeps/sparc/sys/trap.h
new file mode 100644
index 0000000000..50be40668f
--- /dev/null
+++ b/sysdeps/sparc/sys/trap.h
@@ -0,0 +1,7 @@
+/* Include trap definitions.  */
+#ifndef _SYS_TRAP_H
+#define _SYS_TRAP_H	1
+
+#include <machine/trap.h>
+
+#endif /* sys/trap.h */
diff --git a/sysdeps/sparc/udiv.S b/sysdeps/sparc/udiv.S
index 252afd0193..49df8ab2a7 100644
--- a/sysdeps/sparc/udiv.S
+++ b/sysdeps/sparc/udiv.S
@@ -38,15 +38,7 @@
 
 
 #include "DEFS.h"
-#ifdef __linux__
-#include <asm/traps.h>
-#else
-#ifdef __svr4__
 #include <sys/trap.h>
-#else
-#include <machine/trap.h>
-#endif
-#endif
 
 FUNC(.udiv)
 
@@ -176,14 +168,14 @@ Ldivloop:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (7*2+1), %o2
-	
+
 L.4.23:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (7*2-1), %o2
-	
-	
+
+
 L.3.19:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -194,15 +186,15 @@ L.3.19:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (5*2+1), %o2
-	
+
 L.4.21:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (5*2-1), %o2
-	
-	
-	
+
+
+
 L.2.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -218,14 +210,14 @@ L.2.17:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (3*2+1), %o2
-	
+
 L.4.19:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (3*2-1), %o2
-	
-	
+
+
 L.3.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -236,16 +228,16 @@ L.3.17:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (1*2+1), %o2
-	
+
 L.4.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (1*2-1), %o2
-	
-	
-	
-	
+
+
+
+
 L.1.16:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -266,14 +258,14 @@ L.1.16:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-1*2+1), %o2
-	
+
 L.4.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-1*2-1), %o2
-	
-	
+
+
 L.3.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -284,15 +276,15 @@ L.3.15:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-3*2+1), %o2
-	
+
 L.4.13:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-3*2-1), %o2
-	
-	
-	
+
+
+
 L.2.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -308,14 +300,14 @@ L.2.15:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-5*2+1), %o2
-	
+
 L.4.11:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-5*2-1), %o2
-	
-	
+
+
 L.3.13:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -326,16 +318,16 @@ L.3.13:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-7*2+1), %o2
-	
+
 L.4.9:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-7*2-1), %o2
-	
-	
-	
-	
+
+
+
+
 	9:
 Lend_regular_divide:
 	subcc	%o4, 1, %o4
diff --git a/sysdeps/sparc/urem.S b/sysdeps/sparc/urem.S
index 99a5acf40a..7f6a0812bf 100644
--- a/sysdeps/sparc/urem.S
+++ b/sysdeps/sparc/urem.S
@@ -38,15 +38,7 @@
 
 
 #include "DEFS.h"
-#ifdef __linux__
-#include <asm/traps.h>
-#else
-#ifdef __svr4__
 #include <sys/trap.h>
-#else
-#include <machine/trap.h>
-#endif
-#endif
 
 FUNC(.urem)
 
@@ -176,14 +168,14 @@ Ldivloop:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (7*2+1), %o2
-	
+
 L.4.23:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (7*2-1), %o2
-	
-	
+
+
 L.3.19:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -194,15 +186,15 @@ L.3.19:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (5*2+1), %o2
-	
+
 L.4.21:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (5*2-1), %o2
-	
-	
-	
+
+
+
 L.2.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -218,14 +210,14 @@ L.2.17:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (3*2+1), %o2
-	
+
 L.4.19:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (3*2-1), %o2
-	
-	
+
+
 L.3.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -236,16 +228,16 @@ L.3.17:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (1*2+1), %o2
-	
+
 L.4.17:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (1*2-1), %o2
-	
-	
-	
-	
+
+
+
+
 L.1.16:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -266,14 +258,14 @@ L.1.16:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-1*2+1), %o2
-	
+
 L.4.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-1*2-1), %o2
-	
-	
+
+
 L.3.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -284,15 +276,15 @@ L.3.15:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-3*2+1), %o2
-	
+
 L.4.13:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-3*2-1), %o2
-	
-	
-	
+
+
+
 L.2.15:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -308,14 +300,14 @@ L.2.15:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-5*2+1), %o2
-	
+
 L.4.11:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-5*2-1), %o2
-	
-	
+
+
 L.3.13:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
@@ -326,16 +318,16 @@ L.3.13:
 	subcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-7*2+1), %o2
-	
+
 L.4.9:
 	! remainder is negative
 	addcc	%o3,%o5,%o3
 		b	9f
 		add	%o2, (-7*2-1), %o2
-	
-	
-	
-	
+
+
+
+
 	9:
 Lend_regular_divide:
 	subcc	%o4, 1, %o4
diff --git a/sysdeps/sparc64/Implies b/sysdeps/sparc64/Implies
new file mode 100644
index 0000000000..1d793f9fb1
--- /dev/null
+++ b/sysdeps/sparc64/Implies
@@ -0,0 +1,3 @@
+wordsize-64
+# SPARC uses IEEE 754 floating point.
+ieee754
diff --git a/sysdeps/sparc64/Makefile b/sysdeps/sparc64/Makefile
new file mode 100644
index 0000000000..48a86c6acb
--- /dev/null
+++ b/sysdeps/sparc64/Makefile
@@ -0,0 +1,11 @@
+# The Sparc`long double' is a distinct type we support.
+#long-double-fcts = yes
+
+# But the support for ieee quads is so bad we just skip the whole thing.
+# XXX This is only a temporary hack.
+omit-long-double-fcts = yes
+
+# But we do need these few functions to even link stdio proggies
+ifeq ($(subdir),math)
+sysdep_routines += s_isinfl s_isnanl
+endif
diff --git a/sysdeps/sparc64/add_n.S b/sysdeps/sparc64/add_n.S
new file mode 100644
index 0000000000..68bb008a7d
--- /dev/null
+++ b/sysdeps/sparc64/add_n.S
@@ -0,0 +1,58 @@
+/* SPARC v9 __mpn_add_n -- Add two limb vectors of the same length > 0 and
+   store sum in a third limb vector.
+  
+   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,
+   MA 02111-1307, USA.  */
+
+
+#include <sysdep.h>
+
+
+/* INPUT PARAMETERS
+   res_ptr	%o0
+   s1_ptr	%o1
+   s2_ptr	%o2
+   size		%o3  */
+
+
+ENTRY(__mpn_add_n)
+
+	sub	%g0,%o3,%g3
+	sllx	%o3,3,%g1
+	add	%o1,%g1,%o1		! make s1_ptr point at end
+	add	%o2,%g1,%o2		! make s2_ptr point at end
+	add	%o0,%g1,%o0		! make res_ptr point at end
+	mov	0,%o4			! clear carry variable
+	sllx	%g3,3,%o5		! compute initial address index
+
+1:	ldx	[%o2+%o5],%g1		! load s2 limb
+	add	%g3,1,%g3		! increment loop count
+	ldx	[%o1+%o5],%g2		! load s1 limb
+	addcc	%g1,%o4,%g1		! add s2 limb and carry variable
+	movcc	%xcc,0,%o4		! if carry-out, o4 was 1; clear it
+	addcc	%g1,%g2,%g1		! add s1 limb to sum
+	stx	%g1,[%o0+%o5]		! store result
+	add	%o5,8,%o5		! increment address index
+	brnz,pt	%g3,1b
+	 movcs	%xcc,1,%o4		! if s1 add gave carry, record it
+
+	retl
+	 mov %o4,%o0
+
+END(__mpn_add_n)
diff --git a/sysdeps/sparc/sparc64/addmul_1.s b/sysdeps/sparc64/addmul_1.S
index 8d86390808..260481230f 100644
--- a/sysdeps/sparc/sparc64/addmul_1.s
+++ b/sysdeps/sparc64/addmul_1.S
@@ -1,41 +1,40 @@
-! SPARC v9 __mpn_addmul_1 -- Multiply a limb vector with a single limb and
-! add the product to a second limb vector.
+/* SPARC v9 __mpn_addmul_1 -- Multiply a limb vector with a single limb and
+   add the product to a second limb vector.
 
-! Copyright (C) 1996 Free Software Foundation, Inc.
+   Copyright (C) 1996 Free Software Foundation, Inc.
 
-! This file is part of the GNU MP Library.
+   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 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.
+   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,
-! MA 02111-1307, USA.
+   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,
+   MA 02111-1307, USA.  */
 
+#include <sysdep.h>
 
-! INPUT PARAMETERS
-! res_ptr	o0
-! s1_ptr	o1
-! size		o2
-! s2_limb	o3
 
-.section	".text"
-	.align 4
-	.global __mpn_addmul_1
-	.type	 __mpn_addmul_1,#function
-	.proc	016
-__mpn_addmul_1:
+/* INPUT PARAMETERS
+   res_ptr	o0
+   s1_ptr	o1
+   size		o2
+   s2_limb	o3  */
+
+
+ENTRY(__mpn_addmul_1)
 	!#PROLOGUE#	0
-	save	%sp,-160,%sp
+	save	%sp,-128,%sp
 	!#PROLOGUE#	1
+
 	sub	%g0,%i2,%o7
 	sllx	%o7,3,%g5
 	sub	%i1,%g5,%o3
@@ -51,7 +50,7 @@ __mpn_addmul_1:
              !  mid-1 !
              !  mid-2 !
 		 !   lo   !
-.Loop:
+1:
 	sllx	%o7,3,%g1
 	ldx	[%o3+%g1],%g5
 	srl	%g5,0,%i0		! zero hi bits
@@ -79,11 +78,11 @@ __mpn_addmul_1:
 	addcc	%l1,%i0,%i0
 	movcs	%xcc,1,%g5
 	stx	%i0,[%o4+%g1]
-	brnz	%o7,.Loop
-	add	%i1,%g5,%o0		! compute new cy_limb
+	brnz	%o7,1b
+	 add	%i1,%g5,%o0		! compute new cy_limb
 
 	mov	%o0,%i0
-	ret
-	restore
-.LLfe1:
-	.size  __mpn_addmul_1,.LLfe1-__mpn_addmul_1
+	jmpl	%i7+8, %g0
+	 restore
+
+END(__mpn_addmul_1)
diff --git a/sysdeps/sparc64/bits/endian.h b/sysdeps/sparc64/bits/endian.h
new file mode 100644
index 0000000000..a2ab07249a
--- /dev/null
+++ b/sysdeps/sparc64/bits/endian.h
@@ -0,0 +1,8 @@
+/* Sparc is big-endian, but v9 supports endian conversion on loads/stores
+   and GCC supports such a mode.  Be prepared.  */
+
+#ifdef __LITTLE_ENDIAN__
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#else
+#define __BYTE_ORDER __BIG_ENDIAN
+#endif
diff --git a/sysdeps/sparc64/bsd-_setjmp.S b/sysdeps/sparc64/bsd-_setjmp.S
new file mode 100644
index 0000000000..1388c4c238
--- /dev/null
+++ b/sysdeps/sparc64/bsd-_setjmp.S
@@ -0,0 +1,43 @@
+/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'.  Sparc64 version.
+   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 <sysdep.h>
+
+ENTRY(_setjmp)
+
+#ifdef PIC
+1:	rd	%pc,%g1
+	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2
+	or	%g2,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2
+	add	%g1,%g2,%g1
+	sethi	%hi(C_SYMBOL_NAME(__sigsetjmp)),%g2
+	or	%g2,%lo(C_SYMBOL_NAME(__sigsetjmp)),%g2
+	ld	[%g1+%g2], %g1
+#else
+	sethi	%hi(C_SYMBOL_NAME(__sigsetjmp)), %g1
+	or	%lo(C_SYMBOL_NAME(__sigsetjmp)), %g1, %g1
+	add	%g1, %g4, %g1
+#endif
+
+	jmp %g1
+	 mov %g0, %o1		/* Pass second argument of zero.  */
+
+END(_setjmp)
+
+strong_alias(_setjmp, __setjmp)
diff --git a/sysdeps/sparc64/bsd-setjmp.S b/sysdeps/sparc64/bsd-setjmp.S
new file mode 100644
index 0000000000..c42123fc42
--- /dev/null
+++ b/sysdeps/sparc64/bsd-setjmp.S
@@ -0,0 +1,41 @@
+/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'.  Sparc64 version.
+   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 <sysdep.h>
+
+ENTRY(setjmp)
+
+#ifdef PIC
+1:	rd	%pc,%g1
+	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2
+	or	%g2,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2
+	add	%g1,%g2,%g1
+	sethi	%hi(C_SYMBOL_NAME(__sigsetjmp)),%g2
+	or	%g2,%lo(C_SYMBOL_NAME(__sigsetjmp)),%g2
+	ld	[%g1+%g2], %g1
+#else
+	sethi	%hi(C_SYMBOL_NAME(__sigsetjmp)), %g1
+	or	%lo(C_SYMBOL_NAME(__sigsetjmp)), %g1, %g1
+	add	%g1, %g4, %g1
+#endif
+
+	jmp %g1
+	 mov 1, %o1		/* Pass second argument of one.  */
+
+END(setjmp)
diff --git a/sysdeps/sparc64/configure b/sysdeps/sparc64/configure
new file mode 100755
index 0000000000..099f5b0470
--- /dev/null
+++ b/sysdeps/sparc64/configure
@@ -0,0 +1,3 @@
+ # Local configure fragment for sysdeps/sparc64
+
+nopic_initfini=yes
diff --git a/sysdeps/sparc64/configure.in b/sysdeps/sparc64/configure.in
new file mode 100644
index 0000000000..662f8a22ba
--- /dev/null
+++ b/sysdeps/sparc64/configure.in
@@ -0,0 +1,7 @@
+sinclude(./aclocal.m4)dnl Autoconf lossage
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/sparc64
+
+dnl We need to have separate crt? files for static linking which does
+dnl not use PIC.
+nopic_initfini=yes
\ No newline at end of file
diff --git a/sysdeps/sparc64/dl-machine.h b/sysdeps/sparc64/dl-machine.h
new file mode 100644
index 0000000000..21c3d6b9bd
--- /dev/null
+++ b/sysdeps/sparc64/dl-machine.h
@@ -0,0 +1,304 @@
+/* Machine-dependent ELF dynamic relocation inline functions.  Sparc64 version.
+   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.  */
+
+#define ELF_MACHINE_NAME "sparc64"
+
+#include <assert.h>
+#include <string.h>
+#include <link.h>
+#include <sys/param.h>
+#include <sysdep.h>
+
+
+/* Return nonzero iff E_MACHINE is compatible with the running host.  */
+static inline int
+elf_machine_matches_host (Elf64_Half e_machine)
+{
+  return e_machine == EM_SPARC64;
+}
+
+
+/* Return the link-time address of _DYNAMIC.  Conveniently, this is the
+   first element of the GOT.  This must be inlined in a function which
+   uses global data.  */
+static inline Elf64_Addr
+elf_machine_dynamic (void)
+{
+  register Elf64_Addr *got asm ("%l7");
+  return *got;
+}
+
+
+/* Return the run-time load address of the shared object.  */
+static inline Elf64_Addr
+elf_machine_load_address (void)
+{
+  Elf64_Addr here;
+
+  __asm("rd %pc,%0\n\t"
+	"ba 1f\n\t"
+	" add %0,12,%0\n\t"
+	".weak __load_address_undefined\n\t"
+	"call __load_address_undefined\n"
+	"1:"
+	: "=r"(here));
+
+  return here + (*(int *)here << 2);
+}
+
+#ifdef RESOLVE
+/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+   MAP is the object containing the reloc.  */
+
+static inline void
+elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
+		  const Elf64_Sym *sym, const struct r_found_version *version)
+{
+  Elf64_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset);
+  Elf64_Addr loadbase;
+
+#ifndef RTLD_BOOTSTRAP
+  /* This is defined in rtld.c, but nowhere in the static libc.a; make the
+     reference weak so static programs can still link.  This declaration
+     cannot be done when compiling rtld.c (i.e.  #ifdef RTLD_BOOTSTRAP)
+     because rtld.c contains the common defn for _dl_rtld_map, which is
+     incompatible with a weak decl in the same file.  */
+  weak_extern (_dl_rtld_map);
+#endif
+
+  if (ELF64_R_TYPE (reloc->r_info) == R_SPARC_RELATIVE)
+    {
+#ifndef RTLD_BOOTSTRAP
+      if (map != &_dl_rtld_map) /* Already done in rtld itself. */
+#endif
+	*reloc_addr += map->l_addr + reloc->r_addend;
+    }
+  else
+    {
+      const Elf64_Sym *const refsym = sym;
+      Elf64_Addr value;
+      if (sym->st_shndx != SHN_UNDEF &&
+	  ELF64_ST_BIND (sym->st_info) == STB_LOCAL)
+	value = map->l_addr;
+      else
+	{
+	  value = RESOLVE (&sym, version, ELF64_R_TYPE (reloc->r_info));
+	  if (sym)
+	    value += sym->st_value;
+	}
+      value += reloc->r_addend;	/* Assume copy relocs have zero addend.  */
+
+      switch (ELF64_R_TYPE (reloc->r_info))
+	{
+	case R_SPARC_COPY:
+	  if (sym->st_size > refsym->st_size
+	      || (_dl_verbose && sym->st_size < refsym->st_size))
+	    {
+	      const char *strtab;
+
+	      strtab = ((void *) map->l_addr
+			+ map->l_info[DT_STRTAB]->d_un.d_ptr);
+	      _dl_sysdep_error ("Symbol `", strtab + refsym->st_name,
+				"' has different size in shared object, "
+				"consider re-linking\n", NULL);
+	    }
+	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
+						   refsym->st_size));
+	  break;
+	case R_SPARC_GLOB_DAT:
+	/* case R_SPARC_64: */
+	case R_SPARC_JMP_SLOT:
+	  *reloc_addr = value;
+	  break;
+	case R_SPARC_8:
+	  *(char *) reloc_addr = value;
+	  break;
+	case R_SPARC_16:
+	  *(short *) reloc_addr = value;
+	  break;
+	case R_SPARC_DISP8:
+	  *(char *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
+	  break;
+	case R_SPARC_DISP16:
+	  *(short *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
+	  break;
+	case R_SPARC_DISP32:
+	  *(unsigned int *)reloc_addr = (value - (Elf64_Addr) reloc_addr);
+	  break;
+	case R_SPARC_LO10:
+	  *(unsigned *)reloc_addr = (*(unsigned *)reloc_addr & ~0x3ff)
+				     | (value & 0x3ff);
+	  break;
+	case R_SPARC_WDISP30:
+	  *(unsigned *)reloc_addr = ((*(unsigned *)reloc_addr & 0xc0000000)
+			 | ((value - (Elf64_Addr) reloc_addr) >> 2));
+	  break;
+	case R_SPARC_HI22:
+	  *(unsigned *)reloc_addr = (*(unsigned *)reloc_addr & 0xffc00000)
+				     | (value >> 10);
+	  break;
+	case R_SPARC_NONE:		/* Alright, Wilbur.  */
+	  break;
+	default:
+	  assert (! "unexpected dynamic reloc type");
+	  break;
+	}
+    }
+}
+
+static inline void
+elf_machine_lazy_rel (struct link_map *map, const Elf64_Rela *reloc)
+{
+  switch (ELF64_R_TYPE (reloc->r_info))
+    {
+    case R_SPARC_NONE:
+      break;
+    case R_SPARC_JMP_SLOT:
+      break;
+    default:
+      assert (! "unexpected PLT reloc type");
+      break;
+    }
+}
+
+#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 Elf64_Rel relocations.  */
+#define ELF_MACHINE_NO_REL 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)
+{
+  Elf64_Addr *got;
+  extern void _dl_runtime_resolve (Elf64_Word);
+
+  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;
+    }
+
+  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:
+	save %sp, -160, %sp
+	mov %g1, %o1
+	call fixup
+	 mov %g2, %o0
+	jmp %o0
+	 restore
+	.size _dl_runtime_resolve, .-_dl_runtime_resolve
+");
+
+/* The PLT uses Elf64_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 __S1(x)	#x
+#define __S(x)	__S1(x)
+
+#define RTLD_START __asm__ ( "\
+	.global _start
+	.type _start, @function
+_start:
+   /* Make room for functions to drop their arguments on the stack.  */
+	sub	%sp, 6*8, %sp
+   /* Pass pointer to argument block to _dl_start.  */
+	call	_dl_start
+	 add	 %sp," __S(STACK_BIAS) "+22*8,%o0
+	/* FALLTHRU */
+
+	.global _dl_start_user
+	.type _dl_start_user, @function
+_dl_start_user:
+   /* Load the GOT register.  */
+1:	rd	%pc,%g1
+	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
+	or	%l2,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
+	add	%l7,%g1,%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 stack pointer.  */
+	sethi	%hi(_dl_skip_args), %g2
+	or	%g2, %lo(_dl_skip_args), %g2
+	ld	[%l7+%g2], %i0
+	brz,pt	%i0, 2f
+	 ldx	[%sp+" __S(STACK_BIAS) "+22*8], %i1
+	sub	%i1, %i0, %i1
+	sllx	%i0, 3, %i2
+	add	%sp, %i2, %sp
+	stx	%i1, [%sp+" __S(STACK_BIAS) "+22*8]
+   /* Load _dl_default_scope[2] to pass to _dl_init_next.  */
+2:	sethi	%hi(_dl_default_scope), %g2
+	or	%g2, %lo(_dl_defalt_scope), %g2
+	add	%g2, 2*8, %g2
+	ldx	[%l7+%g2], %l1
+   /* Call _dl_init_next to return the address of an initializer to run.  */
+3:	call	_dl_init_next
+	 mov	%l1, %o0
+	brz,pn	%o0, 4f
+	 nop
+	jmpl	%o0, %o7
+	 nop
+	ba,a	3b
+   /* Clear the startup flag.  */
+4:	sethi	%hi(_dl_starting_up), %g2
+	or	%g2, %lo(_dl_starting_up), %g2
+	st	%g0, [%l7+%g2]
+   /* Pass our finalizer function to the user in %g1
+	sethi	%hi(_dl_fini), %g1
+	or	%g1, %lo(_dl_fini), %g1
+	ldx	[%l7+%g1], %g1
+   /* Jump to the user's entry point & undo the allocation of the xtra regs.  */
+	jmp	%l0
+	 add	%sp, 6*8, %sp
+	.size _dl_start_user, .-_dl_start_user");
diff --git a/sysdeps/sparc64/elf/Makefile b/sysdeps/sparc64/elf/Makefile
new file mode 100644
index 0000000000..1b38355b38
--- /dev/null
+++ b/sysdeps/sparc64/elf/Makefile
@@ -0,0 +1,10 @@
+# The assembler on SPARC needs the -fPIC flag even when it's assembler code.
+ASFLAGS-.so = -fPIC
+
+ifeq ($(subdir), csu)
+extra-objs += crtbegin.o crtend.o crtbeginS.o crtendS.o
+install-lib += crtbegin.o crtend.o crtbeginS.o crtendS.o
+
+CPPFLAGS-crtbeginS.S = -fPIC -DPIC
+CPPFLAGS-crtendS.S = -fPIC -DPIC
+endif
diff --git a/sysdeps/sparc64/elf/crtbegin.S b/sysdeps/sparc64/elf/crtbegin.S
new file mode 100644
index 0000000000..fbd731cad0
--- /dev/null
+++ b/sysdeps/sparc64/elf/crtbegin.S
@@ -0,0 +1,49 @@
+.section ".ctors",#alloc,#write
+
+	.align 8
+__CTOR_LIST__:
+	.xword	-1
+
+.section ".dtors",#alloc,#write
+
+	.align 8
+__DTOR_LIST__:
+	.xword	-1
+
+.section ".fini",#alloc,#execinstr
+
+	call	__do_global_dtors_aux
+	 nop
+
+.text
+
+	.align 4
+	.type __do_global_dtors_aux,#function
+__do_global_dtors_aux:
+	save	%sp,-160,%sp
+
+#ifdef PIC
+1:	rd	%pc, %g1
+	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+	or	%l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+	add	%l7, %g1, %l7
+	sethi	%hi(__DTOR_LIST__), %l0
+	or	%l0, %lo(__DTOR_LIST__), %l0
+	ldx	[%l7+%l0], %l0
+#else
+	sethi	%hi(__DTOR_LIST__), %l0
+	or	%l0, %lo(__DTOR_LIST__), %l0
+	add	%l0, %g4, %l0
+#endif
+
+	ba	3f
+	 ldx	[%l0+8], %l1
+2:	jmpl	%l1, %o7
+	 ldx	[%l0+8], %l1
+3:	brnz,pt	%l1, 2b
+	 add	%l0, 8, %l0
+
+	ret
+	 restore
+
+	.size __do_global_dtors_aux,.-__do_global_dtors_aux
diff --git a/sysdeps/sparc64/elf/crtbeginS.S b/sysdeps/sparc64/elf/crtbeginS.S
new file mode 100644
index 0000000000..7db4bc590e
--- /dev/null
+++ b/sysdeps/sparc64/elf/crtbeginS.S
@@ -0,0 +1 @@
+#include "crtbegin.S"
diff --git a/sysdeps/sparc64/elf/crtend.S b/sysdeps/sparc64/elf/crtend.S
new file mode 100644
index 0000000000..ea69083d69
--- /dev/null
+++ b/sysdeps/sparc64/elf/crtend.S
@@ -0,0 +1,50 @@
+.section ".ctors",#alloc,#write
+
+	.align 8
+__CTOR_END__:
+	.xword	0
+
+.section ".dtors",#alloc,#write
+
+	.align 8
+__DTOR_END__:
+	.xword	0
+
+.section ".init",#alloc,#execinstr
+
+	call	__do_global_ctors_aux
+	 nop
+
+.text
+
+	.align 4
+	.type __do_global_ctors_aux,#function
+__do_global_ctors_aux:
+	save	%sp,-160,%sp
+
+#ifdef PIC
+1:	rd	%pc, %g1
+	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+	or	%l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+	add	%l7, %g1, %l7
+	sethi	%hi(__CTOR_END__), %l0
+	or	%l0, %lo(__CTOR_END__), %l0
+	ldx	[%l7+%l0], %l0
+#else
+	sethi	%hi(__CTOR_END__), %l0
+	or	%l0, %lo(__CTOR_END__), %l0
+	add	%l0, %g4, %l0
+#endif
+
+	ba	3f
+	 ldx	[%l0+8], %l1
+2:	jmpl	%l1, %o7
+	 ldx	[%l0+8], %l1
+3:	addcc	%l1, 1, %g0
+	bnz,pt	%xcc, 2b
+	 add	%l0, 8, %l0
+
+	ret
+	 restore
+
+	.size __do_global_ctors_aux,.-__do_global_ctors_aux
diff --git a/sysdeps/sparc64/elf/crtendS.S b/sysdeps/sparc64/elf/crtendS.S
new file mode 100644
index 0000000000..56532f567d
--- /dev/null
+++ b/sysdeps/sparc64/elf/crtendS.S
@@ -0,0 +1 @@
+#include "crtend.S"
diff --git a/sysdeps/sparc64/elf/start.S b/sysdeps/sparc64/elf/start.S
new file mode 100644
index 0000000000..334f85b129
--- /dev/null
+++ b/sysdeps/sparc64/elf/start.S
@@ -0,0 +1,93 @@
+/* Startup code for elf64-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., 675 Mass Ave,
+   Cambridge, MA 02139, USA.  */
+
+#include <sysdep.h>
+
+
+	.section ".text"
+	.align 4
+	.global _start
+	.type _start,#function
+_start:
+
+  /* First order of business is to load %g4 with our base address.  */
+	sethi	%uhi(_start), %g4
+	or	%g4, %ulo(_start), %g4
+	sllx	%g4, 32, %g4
+
+  /* Terminate the stack frame, and reserve space for functions to
+     drop their arguments.  */
+	mov	%g0, %fp
+	sub	%sp, 6*8, %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:  */
+
+	brz,pn	%l0, 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,
+     plus the bias we added, plus the magic v9 STACK_BIAS.  */
+	ldx	[%sp+STACK_BIAS+22*8], %o0
+	add	%sp, STACK_BIAS+23*8, %o1
+	sllx	%o0, 3, %o2
+	add	%o2, %o1, %o2
+	sethi	%hi(__environ), %g2
+	add	%o2, 8, %o2
+	add	%g2, %g4, %g2
+	stx	%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
+	add	%o0, %g4, %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.  */
+	illtrap	0
+
+	.size _start,.-_start
diff --git a/sysdeps/sparc64/fpu_control.h b/sysdeps/sparc64/fpu_control.h
new file mode 100644
index 0000000000..fd8abb19f1
--- /dev/null
+++ b/sysdeps/sparc64/fpu_control.h
@@ -0,0 +1,69 @@
+/* FPU control word bits.  SPARC v9 version.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Miguel de Icaza
+
+   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.  */
+
+#ifndef _FPU_CONTROL_H
+#define _FPU_CONTROL_H	1
+
+
+#include <features.h>
+
+/* precision control */
+#define _FPU_EXTENDED 0x00000000     /* RECOMMENDED */
+#define _FPU_DOUBLE   0x20000000
+#define _FPU_80BIT    0x30000000
+#define _FPU_SINGLE   0x10000000     /* DO NOT USE */
+
+/* rounding control / Sparc */
+#define _FPU_RC_DOWN    0xc0000000
+#define _FPU_RC_UP      0x80000000
+#define _FPU_RC_ZERO    0x40000000
+#define _FPU_RC_NEAREST 0x0        /* RECOMMENDED */
+
+#define _FPU_RESERVED   0x30300000  /* Reserved bits in cw */
+
+
+/* Now two recommended cw */
+
+/* Linux 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.  */
+typedef unsigned long fpu_control_t;
+
+#define _FPU_GETCW(cw) __asm__ ("stx %%fsr,%0" : "=m" (*&cw))
+#define _FPU_SETCW(cw) __asm__ ("ldx %0,%%fsr" : : "m" (*&cw))
+
+/* Default control word set at startup.  */
+extern fpu_control_t __fpu_control;
+
+__BEGIN_DECLS
+
+/* Called at startup.  It can be used to manipulate fpu control register.  */
+extern void __setfpucw __P ((fpu_control_t));
+
+__END_DECLS
+
+#endif	/* fpu_control.h */
diff --git a/sysdeps/sparc/sparc64/gmp-mparam.h b/sysdeps/sparc64/gmp-mparam.h
index a3c66974de..a3c66974de 100644
--- a/sysdeps/sparc/sparc64/gmp-mparam.h
+++ b/sysdeps/sparc64/gmp-mparam.h
diff --git a/sysdeps/sparc64/lshift.S b/sysdeps/sparc64/lshift.S
new file mode 100644
index 0000000000..1678991529
--- /dev/null
+++ b/sysdeps/sparc64/lshift.S
@@ -0,0 +1,96 @@
+/* SPARC v9 __mpn_lshift --
+
+   Copyright (C) 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,
+   MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+/* INPUT PARAMETERS
+   res_ptr	%i0
+   src_ptr	%i1
+   size		%i2
+   cnt		%i3  */
+
+ENTRY(__mpn_lshift)
+	save	%sp, -128, %sp
+
+	sllx	%i2,3,%g1
+	add	%i1,%g1,%i1	! make %i1 point at end of src
+	ldx	[%i1-8],%g2	! load first limb
+	sub	%g0,%i3,%i5	! negate shift count
+	add	%i0,%g1,%i0	! make %i0 point at end of res
+	add	%i2,-1,%i2
+	and	%i2,4-1,%l4	! number of limbs in first loop
+	srlx	%g2,%i5,%g1	! compute function result
+	brz,pn	%l4,.L0		! if multiple of 4 limbs, skip first loop
+	mov	%g1,%l1
+
+	sub	%i2,%l4,%i2	! adjust count for main loop
+
+.Loop0:	ldx	[%i1-16],%g3
+	add	%i0,-8,%i0
+	add	%i1,-8,%i1
+	add	%l4,-1,%l4
+	sllx	%g2,%i3,%i4
+	srlx	%g3,%i5,%g1
+	mov	%g3,%g2
+	or	%i4,%g1,%i4
+	brnz,pt	%l4,.Loop0
+	 stx	%i4,[%i0+0]
+
+.L0:	brz,pn	%i2,.Lend
+	 nop
+
+.Loop:	ldx	[%i1-16],%g3
+	add	%i0,-32,%i0
+	add	%i2,-4,%i2
+	sllx	%g2,%i3,%i4
+	srlx	%g3,%i5,%g1
+
+	ldx	[%i1-24],%g2
+	sllx	%g3,%i3,%l4
+	or	%i4,%g1,%i4
+	stx	%i4,[%i0+24]
+	srlx	%g2,%i5,%g1
+
+	ldx	[%i1-32],%g3
+	sllx	%g2,%i3,%i4
+	or	%l4,%g1,%l4
+	stx	%l4,[%i0+16]
+	srlx	%g3,%i5,%g1
+
+	ldx	[%i1-40],%g2
+	sllx	%g3,%i3,%l4
+	or	%i4,%g1,%i4
+	stx	%i4,[%i0+8]
+	srlx	%g2,%i5,%g1
+
+	add	%i1,-32,%i1
+	or	%l4,%g1,%l4
+	brnz,pt	%i2,.Loop
+	 stx	%l4,[%i0+0]
+
+.Lend:	sllx	%g2,%i3,%g2
+	stx	%g2,[%i0-8]
+
+	mov	%l1,%i0
+	jmpl	%i7+8, %g0
+	 restore
+
+END(__mpn_lshift)
diff --git a/sysdeps/sparc/sparc64/mul_1.s b/sysdeps/sparc64/mul_1.S
index 91d6eb01b8..87e441d7eb 100644
--- a/sysdeps/sparc/sparc64/mul_1.s
+++ b/sysdeps/sparc64/mul_1.S
@@ -1,41 +1,39 @@
-! SPARC v9 __mpn_mul_1 -- Multiply a limb vector with a single limb and
-! store the product in a second limb vector.
+/* SPARC v9 __mpn_mul_1 -- Multiply a limb vector with a single limb and
+   store the product in a second limb vector.
 
-! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 
-! This file is part of the GNU MP Library.
+   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 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.
+   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,
-! MA 02111-1307, USA.
+   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,
+   MA 02111-1307, USA.  */
 
+#include <sysdep.h>
 
-! INPUT PARAMETERS
-! res_ptr	o0
-! s1_ptr	o1
-! size		o2
-! s2_limb	o3
 
-.section	".text"
-	.align 4
-	.global __mpn_mul_1
-	.type	 __mpn_mul_1,#function
-	.proc	016
-__mpn_mul_1:
+/* INPUT PARAMETERS
+   res_ptr	o0
+   s1_ptr	o1
+   size		o2
+   s2_limb	o3  */
+
+ENTRY(__mpn_mul_1)
 	!#PROLOGUE#	0
-	save	%sp,-160,%sp
+	save	%sp,-128,%sp
 	!#PROLOGUE#	1
+
 	sub	%g0,%i2,%o7
 	sllx	%o7,3,%g5
 	sub	%i1,%g5,%o3
@@ -77,10 +75,10 @@ __mpn_mul_1:
 	add	%o7,1,%o7
 	stx	%i0,[%o4+%g1]
 	brnz	%o7,.Loop
-	add	%i1,%g5,%o0		! compute new cy_limb
+	 add	%i1,%g5,%o0		! compute new cy_limb
 
 	mov	%o0,%i0
-	ret
-	restore
-.LLfe1:
-	.size  __mpn_mul_1,.LLfe1-__mpn_mul_1
+	jmpl	%i7+8,%g0
+	 restore
+
+END(__mpn_mul_1)
diff --git a/sysdeps/sparc64/rshift.S b/sysdeps/sparc64/rshift.S
new file mode 100644
index 0000000000..e1b3aca112
--- /dev/null
+++ b/sysdeps/sparc64/rshift.S
@@ -0,0 +1,93 @@
+/* SPARC v9 __mpn_rshift --
+
+   Copyright (C) 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,
+   MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+/* INPUT PARAMETERS
+   res_ptr	%i0
+   src_ptr	%i1
+   size		%i2
+   cnt		%i3  */
+
+ENTRY(__mpn_rshift)
+	save	%sp, -128, %sp
+
+	ldx	[%i1],%g2	! load first limb
+	sub	%g0,%i3,%i5	! negate shift count
+	add	%i2,-1,%i2
+	and	%i2,4-1,%l4	! number of limbs in first loop
+	sllx	%g2,%i5,%g1	! compute function result
+	brz,pn	%l4,.L0		! if multiple of 4 limbs, skip first loop
+	mov	%g1,%l1
+
+	sub	%i2,%l4,%i2	! adjust count for main loop
+
+.Loop0:	ldx	[%i1+8],%g3
+	add	%i0,8,%i0
+	add	%i1,8,%i1
+	add	%l4,-1,%l4
+	srlx	%g2,%i3,%i4
+	sllx	%g3,%i5,%g1
+	mov	%g3,%g2
+	or	%i4,%g1,%i4
+	brnz,pt	%l4,.Loop0
+	 stx	%i4,[%i0-8]
+
+.L0:	brz,pn	%i2,.Lend
+	 nop
+
+.Loop:	ldx	[%i1+8],%g3
+	add	%i0,32,%i0
+	add	%i2,-4,%i2
+	srlx	%g2,%i3,%i4
+	sllx	%g3,%i5,%g1
+
+	ldx	[%i1+16],%g2
+	srlx	%g3,%i3,%l4
+	or	%i4,%g1,%i4
+	stx	%i4,[%i0-32]
+	sllx	%g2,%i5,%g1
+
+	ldx	[%i1+24],%g3
+	srlx	%g2,%i3,%i4
+	or	%l4,%g1,%l4
+	stx	%l4,[%i0-24]
+	sllx	%g3,%i5,%g1
+
+	ldx	[%i1+32],%g2
+	srlx	%g3,%i3,%l4
+	or	%i4,%g1,%i4
+	stx	%i4,[%i0-16]
+	sllx	%g2,%i5,%g1
+
+	add	%i1,32,%i1
+	or	%l4,%g1,%l4
+	brnz	%i2,.Loop
+	 stx	%l4,[%i0-8]
+
+.Lend:	srlx	%g2,%i3,%g2
+	stx	%g2,[%i0-0]
+
+	mov	%l1,%i0
+	jmpl	%i7+8,%g0
+	 restore
+
+END(__mpn_rshift)
diff --git a/sysdeps/sparc64/sub_n.S b/sysdeps/sparc64/sub_n.S
new file mode 100644
index 0000000000..93f8a8235d
--- /dev/null
+++ b/sysdeps/sparc64/sub_n.S
@@ -0,0 +1,55 @@
+/* SPARC v9 __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,
+   MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+/* INPUT PARAMETERS
+   res_ptr	%o0
+   s1_ptr	%o1
+   s2_ptr	%o2
+   size		%o3  */
+
+ENTRY(__mpn_sub_n)
+
+	sub %g0,%o3,%g3
+	sllx %o3,3,%g1
+	add %o1,%g1,%o1			! make s1_ptr point at end
+	add %o2,%g1,%o2			! make s2_ptr point at end
+	add %o0,%g1,%o0			! make res_ptr point at end
+	mov 0,%o4			! clear carry variable
+	sllx %g3,3,%o5			! compute initial address index
+
+1:	ldx [%o2+%o5],%g1		! load s2 limb
+	add %g3,1,%g3			! increment loop count
+	ldx [%o1+%o5],%g2		! load s1 limb
+	addcc %g1,%o4,%g1		! add s2 limb and carry variable
+	movcc %xcc,0,%o4		! if carry-out, o4 was 1; clear it
+	subcc %g1,%g2,%g1		! subtract s1 limb from sum
+	stx %g1,[%o0+%o5]		! store result
+	add %o5,8,%o5			! increment address index
+	brnz,pt %g3,1b
+	 movcs %xcc,1,%o4		! if s1 subtract gave carry, record it
+
+	retl
+	 mov %o4,%o0
+
+END(__mpn_sub_n)
diff --git a/sysdeps/sparc/sparc64/submul_1.s b/sysdeps/sparc64/submul_1.S
index e796243470..3cc0e3bb08 100644
--- a/sysdeps/sparc/sparc64/submul_1.s
+++ b/sysdeps/sparc64/submul_1.S
@@ -1,41 +1,39 @@
-! SPARC v9 __mpn_submul_1 -- Multiply a limb vector with a single limb and
-! subtract the product from a second limb vector.
+/* SPARC v9 __mpn_submul_1 -- Multiply a limb vector with a single limb and
+   subtract the product from a second limb vector.
 
-! Copyright (C) 1996 Free Software Foundation, Inc.
+   Copyright (C) 1996 Free Software Foundation, Inc.
 
-! This file is part of the GNU MP Library.
+   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 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.
+   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,
-! MA 02111-1307, USA.
+   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,
+   MA 02111-1307, USA.  */
 
+#include <sysdep.h>
 
-! INPUT PARAMETERS
-! res_ptr	o0
-! s1_ptr	o1
-! size		o2
-! s2_limb	o3
 
-.section	".text"
-	.align 4
-	.global __mpn_submul_1
-	.type	 __mpn_submul_1,#function
-	.proc	016
-__mpn_submul_1:
+/* INPUT PARAMETERS
+   res_ptr	o0
+   s1_ptr	o1
+   size		o2
+   s2_limb	o3  */
+
+ENTRY(__mpn_submul_1)
 	!#PROLOGUE#	0
-	save	%sp,-160,%sp
+	save	%sp,-128,%sp
 	!#PROLOGUE#	1
+
 	sub	%g0,%i2,%o7
 	sllx	%o7,3,%g5
 	sub	%i1,%g5,%o3
@@ -80,10 +78,10 @@ __mpn_submul_1:
 	movcs	%xcc,1,%g5
 	stx	%i0,[%o4+%g1]
 	brnz	%o7,.Loop
-	add	%i1,%g5,%o0		! compute new cy_limb
+	 add	%i1,%g5,%o0		! compute new cy_limb
 
 	mov	%o0,%i0
-	ret
-	restore
-.LLfe1:
-	.size  __mpn_submul_1,.LLfe1-__mpn_submul_1
+	jmpl	%i7+8,%g0
+	 restore
+
+END(__mpn_submul_1)
diff --git a/sysdeps/unix/sysv/linux/sparc/errno.c b/sysdeps/unix/sysv/linux/sparc/errno.c
deleted file mode 100644
index 663ab33e93..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/errno.c
+++ /dev/null
@@ -1 +0,0 @@
-itn errno;
diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h b/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h
deleted file mode 100644
index f870d15082..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Linux/SPARC version.  This is the sigaction struction from the Linux
-   2.1.20 kernel.  */
-
-struct sigaction
-  {
-    __sighandler_t sa_handler;
-    sigset_t sa_mask;
-    unsigned long int sa_flags;
-    void (*sa_restorer) (void);     /* not used by Linux/SPARC yet */
-  };
-
-#define HAVE_SA_RESTORER
diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc/kernel_stat.h
index 993a8664dc..91f02f4e20 100644
--- a/sysdeps/unix/sysv/linux/sparc/kernel_stat.h
+++ b/sysdeps/unix/sysv/linux/sparc/kernel_stat.h
@@ -17,5 +17,12 @@ struct kernel_stat
     unsigned long int __unused3;
     long int st_blksize;
     long int st_blocks;
-    unsigned long int __unused4[2];
+    unsigned long int __unused4;
+    unsigned long int __unused5;
   };
+
+#define _HAVE___UNUSED1
+#define _HAVE___UNUSED2
+#define _HAVE___UNUSED3
+#define _HAVE___UNUSED4
+#define _HAVE___UNUSED5
diff --git a/sysdeps/unix/sysv/linux/sparc/sys/trap.h b/sysdeps/unix/sysv/linux/sparc/sys/trap.h
new file mode 100644
index 0000000000..99b9c60e06
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sys/trap.h
@@ -0,0 +1,7 @@
+/* Include Linux/SPARC specific trap definitions.  */
+#ifndef _SYS_TRAP_H
+#define _SYS_TRAP_H	1
+
+#include <asm/traps.h>
+
+#endif /* sys/trap.h */
diff --git a/sysdeps/unix/sysv/linux/sparc64/Makefile b/sysdeps/unix/sysv/linux/sparc64/Makefile
new file mode 100644
index 0000000000..c4d83226a2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/Makefile
@@ -0,0 +1,4 @@
+ifeq ($(subdir),misc)
+sysdep_headers += ucontext.h
+sysdep_routines += getcontext setcontext
+endif
diff --git a/sysdeps/unix/sysv/linux/sparc64/__longjmp.S b/sysdeps/unix/sysv/linux/sparc64/__longjmp.S
new file mode 100644
index 0000000000..3107179fdc
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/__longjmp.S
@@ -0,0 +1 @@
+/* There is no need for __longjmp what with setcontext.  */
diff --git a/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h b/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h
new file mode 100644
index 0000000000..ab850e5301
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h
@@ -0,0 +1,26 @@
+/* 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.  */
+
+#ifndef _JMP_BUF_H 
+#define _JMP_BUF_H 1
+
+#include <ucontext.h>
+
+typedef ucontext_t __jmp_buf[1];
+
+#endif /* jmp_buf.h */
diff --git a/sysdeps/unix/sysv/linux/sparc64/bits/types.h b/sysdeps/unix/sysv/linux/sparc64/bits/types.h
new file mode 100644
index 0000000000..222967881f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/bits/types.h
@@ -0,0 +1,95 @@
+/* Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   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.  */
+
+/*
+ * Never include this file directly; use <sys/types.h> instead.
+ */
+
+#ifndef	_BITS_TYPES_H
+#define	_BITS_TYPES_H	1
+
+#include <features.h>
+
+/* Convenience types.  */
+typedef unsigned char __u_char;
+typedef unsigned short __u_short;
+typedef unsigned int __u_int;
+typedef unsigned long __u_long;
+typedef unsigned long int __u_quad_t;
+typedef long int __quad_t;
+typedef signed char __int8_t;
+typedef unsigned char __uint8_t;
+typedef signed short int __int16_t;
+typedef unsigned short int __uint16_t;
+typedef signed int __int32_t;
+typedef unsigned int __uint32_t;
+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_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.  */
+typedef __u_int __mode_t;		/* Type of file attribute bitmasks.  */
+typedef __u_int __nlink_t; 		/* Type of file link counts.  */
+typedef long int __off_t;		/* Type of file sizes and offsets.  */
+typedef __quad_t __loff_t;		/* Type of file sizes and offsets.  */
+typedef int __pid_t;			/* Type of process identifications.  */
+typedef long int __ssize_t;		/* Type of a byte count, or error.  */
+
+typedef struct
+  {
+    int __val[2];
+  } __fsid_t;				/* Type of file system IDs.  */
+
+/* Everythin' else.  */
+typedef int __daddr_t;			/* The type of a disk address.  */
+typedef char *__caddr_t;
+typedef long int __time_t;
+typedef long int __swblk_t;		/* Type of a swap block maybe?  */
+
+typedef long int __clock_t;
+
+/* One element in the file descriptor mask array.  */
+typedef unsigned long int __fd_mask;
+
+/* Due to incaution, we may have gotten these from a kernel header file.  */
+#undef __FD_SETSIZE
+#undef __NFDBITS
+#undef __FDMASK
+
+/* Number of descriptors that can fit in an `fd_set'.  */
+#define __FD_SETSIZE	1024
+
+/* It's easier to assume 8-bit bytes than to get CHAR_BIT.  */
+#define __NFDBITS	(8 * sizeof (__fd_mask))
+#define	__FDELT(d)	((d) / __NFDBITS)
+#define	__FDMASK(d)	(1 << ((d) % __NFDBITS))
+
+/* fd_set for select and pselect.  */
+typedef struct
+  {
+    /* XPG4.2 requires this member name.  */
+    __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
+  } __fd_set;
+
+
+typedef int __key_t;
+
+#endif /* bits/types.h */
diff --git a/sysdeps/unix/sysv/linux/sparc64/brk.S b/sysdeps/unix/sysv/linux/sparc64/brk.S
new file mode 100644
index 0000000000..87412e095a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/brk.S
@@ -0,0 +1,97 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   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.  */
+
+/* __brk is a special syscall under Linux since it never returns an
+   error.  Instead, the error condition is indicated by returning the old
+   break value (instead of the new, requested one).  */
+
+#include <sysdep.h>
+#define _ERRNO_H
+#include <bits/errno.h>
+
+#ifdef PIC
+.section .bss
+	.align 8
+	.globl __curbrk
+__curbrk: .skip 8
+	.type __curbrk,@object
+	.size __curbrk,8
+#else
+.common __curbrk, 8, 8
+#endif
+
+	.text
+ENTRY(__brk)
+	save	%sp, -160, %sp
+#ifdef PIC
+1:	rd	%pc, %g1
+	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+	or	%l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+	add	%l7, %g1, %l7
+#endif
+
+	LOADSYSCALL(brk)
+	mov	%i0, %o0
+
+	ta	0x11
+
+	/* All the ways we can fail... */
+	bcs,pn	%xcc, .Lerr1
+	 nop
+	brz	%i0, .Lok
+	 subcc	%i0, %o0, %g0
+	bne,pn	%xcc, .Lerr0
+
+	/* Update __curbrk and return cleanly.  */
+.Lok:	sethi	%hi(__curbrk), %g1
+	or	%g1, %lo(__curbrk), %g1
+#ifdef PIC
+	ldx	[%l7+%g1], %g1
+	stx	%o0, [%g1]
+#else
+	stx	%o0, [%g4+%g1]
+#endif
+	mov	%g0, %i0
+
+	/* Don't use "ret" cause the preprocessor will eat it.  */
+	jmpl	%i7+8, %g0
+	 restore
+	
+	/* What a horrible way to die.  */
+.Lerr0:	set	ENOMEM, %o0
+.Lerr1:	sethi	%hi(errno), %g1
+	or	%g1, %lo(errno), %g1
+#ifdef PIC
+	ldx	[%l7+%g1], %g1
+	st	%o0, [%g1]
+#else
+	st	%o0, [%g4+%g1]
+#endif
+#ifdef _LIBC_REENTRANT
+	call	__errno_location
+	 mov	%o0,%l1
+	st	%l1, [%o0]
+#endif
+	sub	%g0, 1, %i0
+	jmpl	%i7+8, %g0
+	 restore
+
+	.size __brk, .-__brk
+
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/sparc64/clone.S b/sysdeps/unix/sysv/linux/sparc64/clone.S
new file mode 100644
index 0000000000..fe38bf4ab7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/clone.S
@@ -0,0 +1,89 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   Contributed by Richard Henderson (rth@tamu.edu).
+
+   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.  */
+
+/* clone() is even more special than fork() as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <asm/errno.h>
+#include <asm/unistd.h>
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
+
+	.text
+	.align	4
+	.globl	__libc_clone
+	.type	__libc_clone,@function
+	.weak	clone
+	__clone = __libc_clone
+	clone   = __libc_clone
+
+__libc_clone:
+	save	%sp,-160,%sp
+
+	/* sanity check arguments */
+	brz,pn	%i0, 99f
+	 mov	%i0, %l0		/* save fn */
+	brz,pn	%i1, 99f
+	 mov	%i3, %l3		/* save arg */
+
+	/* Do the system call */
+	mov	%i1, %o1
+	mov	%i2, %o0
+	set	__NR_clone, %g1
+	ta	0x11
+	bcs,pn	%xcc, 99f
+	 nop
+	brnz	%o0, __thread_start
+	 mov	%o0, %i0
+	ret
+	 restore
+99:
+#ifdef PIC
+	rd	%pc, %g1
+	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7
+	or	%l7, %lo(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7
+	add	%l7, %g1, %l7
+	set	EINVAL, %i0
+	sethi	%hi(errno), %g2
+	or	%g2, %lo(errno), %g2
+	st	%i0, [%l7+%g2]
+#else
+	sethi	%hi(errno), %g2
+	add	%g2, %g4, %g2
+	set	EINVAL, %i0
+	st	%i0, [%g2+%lo(errno)]
+#endif
+#ifdef _LIBC_REENTRANT
+	call	__errno_location
+	 nop
+	st	%i0, [%o0]
+#endif
+	mov	-1,%i0
+	ret
+	 restore
+	.size __libc_clone,.-__libc_clone
+
+	.type __thread_start,@function
+__thread_start:
+	mov	%g0, %fp	/* terminate backtrace */
+	sub	%sp, 6*8, %sp	/* provide arg storage */
+	call	%l0
+	 mov	%l3,%o0
+	call	_exit,0
+	 nop
+	.size __thread_start,.-__thread_start
diff --git a/sysdeps/unix/sysv/linux/sparc64/fork.S b/sysdeps/unix/sysv/linux/sparc64/fork.S
new file mode 100644
index 0000000000..d57736b733
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/fork.S
@@ -0,0 +1,33 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Miguel de Icaza <miguel@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., 675 Mass Ave,
+   Cambridge, MA 02139, USA.  */
+
+#include <sysdep.h>
+
+PSEUDO (__libc_fork, fork, 0)
+	tst	%o1
+	be	%xcc, 1f
+	 nop
+	/* child: return 0 */
+	clr	%o0
+1:	ret
+
+PSEUDO_END (__libc_fork)
+
+weak_alias (__libc_fork, __fork)
+weak_alias (__libc_fork, fork)
diff --git a/sysdeps/unix/sysv/linux/sparc64/getcontext.S b/sysdeps/unix/sysv/linux/sparc64/getcontext.S
new file mode 100644
index 0000000000..05b06269e4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/getcontext.S
@@ -0,0 +1,30 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   Contributed by Richard Henderson (rth@tamu.edu).
+
+   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>
+
+/* void getcontext(ucontext_t *); */
+
+ENTRY(__getcontext)
+
+	ta	0x6e
+	ret
+
+END(__getcontext)
+
+weak_alias(__getcontext, getcontext)
diff --git a/sysdeps/unix/sysv/linux/sparc64/init-first.h b/sysdeps/unix/sysv/linux/sparc64/init-first.h
new file mode 100644
index 0000000000..f7fad7f87f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/init-first.h
@@ -0,0 +1,92 @@
+/* Prepare arguments for library initialization function.
+   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.  */
+
+/* The job of this fragment it to find argc and friends for INIT.
+   This is done in one of two ways: either in the stack context
+   of program start, or having dlopen pass them in.  */
+
+#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:	rd	%pc, %g1
+	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+	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), %g2
+	or	%g2, %lo(_dl_starting_up), %g2
+	ld	[%l7+%g2], %g2
+	brz,pn	%g2, 3f
+	 sethi	%hi(__libc_multiple_libcs), %g3
+	ld	[%g2], %g2
+	subcc	%g0, %g2, %g0
+	subc	%g0, -1, %g2
+3:	or	%g3, %lo(__libc_multiple_libcs), %g3
+	ld	[%l7+%g3], %g3
+	st	%g2, [%g3]
+	/* If so, argc et al are in %o0-%o2 already.  Otherwise, load them.  */
+	brnz,pn	%g2, " #INIT "
+	 restore
+	ld	[%sp+" __S(STACK_BIAS) "+22*8], %o0
+	add	%sp, " __S(STACK_BIAS) "+23*8, %o1
+	sll	%o0, 3, %o2
+	add	%o2, %o1, %o2
+	add	%o2, 8, %o2
+	ba,a	" #INIT "
+	.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
+	brz,pt	%g2, 3f
+	 sethi	%hi(__libc_multiple_libcs), %g3
+	ld	[%g4+%g2], %g2
+	subcc	%g0, %g2, %g0
+	subc	%g0, -1, %g2
+3:	add	%g3, %g4, %g3
+	st	%g2, [%g3+%lo(__libc_multiple_libcs)]
+	/* If so, argc et al are in %o0-%o2 already.  Otherwise, load them.  */
+	brnz,pn	%g2, " #INIT "
+	 nop
+	ld	[%sp+" __S(STACK_BIAS) "+22*8], %o0
+	add	%sp, " __S(STACK_BIAS) "+23*8, %o1
+	sll	%o0, 3, %o2
+	add	%o2, %o1, %o2
+	add	%o2, 8, %o2
+	ba,a	" #INIT "
+	.size "#NAME ", .-" #NAME);
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h
new file mode 100644
index 0000000000..fcb752e3ec
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h
@@ -0,0 +1,22 @@
+/* Definition of `struct stat' used in the kernel */
+struct kernel_stat
+  {
+    unsigned int st_dev;
+    unsigned int st_ino;
+    unsigned int st_mode;
+    short int st_nlink;
+    unsigned int st_uid;
+    unsigned int st_gid;
+    unsigned int st_rdev;
+    long int st_size;
+    long int st_atime;
+    long int st_mtime;
+    long int st_ctime;
+    long int st_blksize;
+    long int st_blocks;
+    unsigned long int __unused1;
+    unsigned long int __unused2;
+  };
+
+#define _HAVE___UNUSED1 
+#define _HAVE___UNUSED2 
diff --git a/sysdeps/unix/sysv/linux/sparc64/longjmp.S b/sysdeps/unix/sysv/linux/sparc64/longjmp.S
new file mode 100644
index 0000000000..c81b10495e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/longjmp.S
@@ -0,0 +1,44 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   Contributed by Richard Henderson (rth@tamu.edu).
+
+   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.  */
+
+/* longjmp is implemented in terms of the setcontext trap on Linux/Sparc64.  */
+
+#include <sysdep.h>
+
+/* Offsets into the jmp_buf structure.  */
+
+#define O_mask_was_saved	512
+#define O_gregs			32
+#define O_g1			(O_gregs + 4*8)
+
+
+/* void longjmp (sigjmp_buf env, int val) */
+
+ENTRY(longjmp)
+
+	/* Modify the context with the value we want to return.  */
+	movre	%o1, 1, %o1
+	stx	%o1, [%o0 + O_g1]
+
+	/* Let setcontext know if we want to modify the current sigmask. */
+	ld	[%o0 + O_mask_was_saved], %o1
+
+	/* And bamf back to where we belong!  */
+	ta	0x6f
+
+END(longjmp)
diff --git a/sysdeps/unix/sysv/linux/sparc64/pipe.S b/sysdeps/unix/sysv/linux/sparc64/pipe.S
new file mode 100644
index 0000000000..82ff4eae3c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/pipe.S
@@ -0,0 +1,37 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Miguel de Icaza <miguel@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>
+
+ENTRY (__libc_pipe)
+        mov	%o0, %o2            /* Save PIPEDES. */
+	LOADSYSCALL(pipe)
+	ta	0x11
+	bcc,pn	%xcc, 2f
+	 nop
+	SYSCALL_ERROR_HANDLER
+
+2:	st	%o0, [%o2]           /* PIPEDES[0] = %o0; */
+        st	%o1, [%o2 + 4]       /* PIPEDES[1] = %o1; */
+	retl
+	 clr	%o0
+PSEUDO_END (__libc_pipe)
+
+weak_alias (__libc_pipe, __pipe)
+weak_alias (__libc_pipe, pipe)
diff --git a/sysdeps/unix/sysv/linux/sparc64/profil-counter.h b/sysdeps/unix/sysv/linux/sparc64/profil-counter.h
new file mode 100644
index 0000000000..6a3f0a291a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/profil-counter.h
@@ -0,0 +1,26 @@
+/* Low-level statistical profiling support function.  Linux/Sparc64 version.
+   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 <signal.h>
+
+void
+profil_counter (int signo, __siginfo_t *si)
+{
+  profil_count ((void *) si->si_regs.tpc);
+}
diff --git a/sysdeps/unix/sysv/linux/sparc64/setcontext.S b/sysdeps/unix/sysv/linux/sparc64/setcontext.S
new file mode 100644
index 0000000000..2968b65633
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/setcontext.S
@@ -0,0 +1,33 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   Contributed by Richard Henderson (rth@tamu.edu).
+
+   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>
+
+
+/* void setcontext(ucontext_t *ctx); */
+.weak setcontext
+ENTRY(setcontext)
+
+	mov	1, %o1
+
+/* void __setcontext(ucontext_t *ctx, int restoremask); */
+ENTRY(__setcontext)
+
+	ta	0x6f
+
+END(__setcontext)
diff --git a/sysdeps/unix/sysv/linux/sparc64/setjmp.S b/sysdeps/unix/sysv/linux/sparc64/setjmp.S
new file mode 100644
index 0000000000..8b88b49ac4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/setjmp.S
@@ -0,0 +1,48 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   Contributed by Richard Henderson (rth@tamu.edu).
+
+   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.  */
+
+/* __sigsetjmp is implemented in terms of the getcontext trap on
+   Linux/Sparc64.  */
+
+#include <sysdep.h>
+
+/* Offsets into the jmp_buf structure.  */
+
+#define O_mask_was_saved	512
+#define O_gregs			32
+#define O_g1			(O_gregs + 4*8)
+
+
+/* int __sigsetjmp(jmp_buf, savemask)  */
+
+ENTRY(__sigsetjmp)
+
+	/* Record whether the user is intending to save the sigmask.  */
+	st	%o1, [%o0 + O_mask_was_saved]
+
+	/* Load up our return value, as longjmp is going to override
+	   the jmp_buf on its way back.  */
+	mov	%g0, %g1
+
+	/* And call getcontext!  */
+	ta	0x6e
+
+	retl
+	 mov	%g1, %o0
+
+END(__sigsetjmp)
diff --git a/sysdeps/unix/sysv/linux/sparc64/sigjmp.S b/sysdeps/unix/sysv/linux/sparc64/sigjmp.S
new file mode 100644
index 0000000000..940ccbcf68
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/sigjmp.S
@@ -0,0 +1 @@
+/* There is no need for __sigjmp_save what with getcontext.  */
diff --git a/sysdeps/unix/sysv/linux/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc64/syscalls.list
new file mode 100644
index 0000000000..66ba470994
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/syscalls.list
@@ -0,0 +1,26 @@
+# File name	Caller	Syscall name	# args	Strong name	Weak names
+
+# Whee! 64-bit systems naturally implement llseek.
+llseek		EXTRA	lseek		3	llseek
+
+# Override select.S in parent directory:
+select		-	select		5	__select	select
+accept		-	accept		3	__accept	accept
+bind		-	bind		3	__bind		bind
+connect		-	connect		3	__connect	connect
+getpeername	-	getpeername	3	__getpeername	getpeername
+getsockname	-	getsockname	3	__getsockname	getsockname
+getsockopt	-	getsockopt	5	__getsockopt	getsockopt
+listen		-	listen		2	__listen	listen
+recv		-	recv		4	__recv		recv
+recvfrom	-	recvfrom	6	__recvfrom	recvfrom
+recvmsg		-	recvmsg		3	__recvmsg	recvmsg
+send		-	send		4	__send		send
+sendmsg		-	sendmsg		3	__sendmsg	sendmsg
+sendto		-	sendto		6	__sendto	sendto
+setsockopt	-	setsockopt	5	__setsockopt	setsockopt
+shutdown	-	shutdown	2	__shutdown	shutdown
+socketpair	-	socketpair	4	__socketpair	socketpair
+
+# Another broken Linux/i386 idea layed to rest
+ptrace		-	ptrace		4	__ptrace	ptrace
diff --git a/sysdeps/unix/sysv/linux/sparc64/sysdep.S b/sysdeps/unix/sysv/linux/sparc64/sysdep.S
new file mode 100644
index 0000000000..736578083c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/sysdep.S
@@ -0,0 +1,31 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   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.  */
+
+
+/* Define errno */
+
+	.section .bss
+	.globl errno
+	.align 2
+errno:	.space 4
+	.type errno, @object
+	.size errno, 4
+
+	.globl __errno
+__errno = errno
diff --git a/sysdeps/unix/sysv/linux/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc64/sysdep.h
new file mode 100644
index 0000000000..f01c1f43cd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/sysdep.h
@@ -0,0 +1,116 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   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.  */
+
+#ifndef _LINUX_SPARC64_SYSDEP_H
+#define _LINUX_SPARC64_SYSDEP_H 1
+
+#include <sysdeps/unix/sysdep.h>
+
+#undef SYS_ify
+#define SYS_ify(syscall_name) __NR_##syscall_name
+
+#ifdef ASSEMBLER
+
+#ifdef DONT_LOAD_G1
+# define LOADSYSCALL(x)
+#else
+# define LOADSYSCALL(x) mov __NR_##x, %g1
+#endif
+
+/* Linux/SPARC uses a different trap number */
+#undef PSEUDO
+#undef ENTRY
+
+#define ENTRY(name)							\
+	.global C_SYMBOL_NAME(name);					\
+	.align 2;							\
+	C_LABEL(name);							\
+	.type name,@function;
+
+#ifdef PIC
+#define SYSCALL_ERROR_HANDLER1(R)					\
+	.global C_SYMBOL_NAME(errno);					\
+	.type C_SYMBOL_NAME(errno),@object;				\
+0:	rd %pc,%g1;							\
+	sethi %hi(_GLOBAL_OFFSET_TABLE_-(0b-.)),%g2;			\
+	add %g2,%lo(_GLOBAL_OFFSET_TABLE_-(0b-.)),%g2;			\
+	add %g2,%g1,%g1;						\
+	sethi %hi(errno),%g2;						\
+	add %g2,%lo(errno),%g2;						\
+	ldx [%g1+%g2],%g2;						\
+	st R,[%g2]
+#else
+#define SYSCALL_ERROR_HANDLER1(R)					\
+	.global C_SYMBOL_NAME(errno);					\
+	.type C_SYMBOL_NAME(errno),@object;				\
+	sethi %hi(errno),%g1;						\
+	add %g1,%g4,%g1;						\
+	st R,[%g1+%lo(errno)]
+#endif
+
+#ifdef _LIBC_REENTRANT
+#define SYSCALL_ERROR_HANDLER						\
+	.global C_SYMBOL_NAME(__errno_location);			\
+        .type C_SYMBOL_NAME(__errno_location),@function;		\
+	save %sp,-128,%sp;						\
+	SYSCALL_ERROR_HANDLER1(%i0);					\
+	call __errno_location;						\
+	 nop;								\
+	st %i0,[%o0];							\
+	sub %g0,1,%i0;							\
+	jmpl %i7+8, %g0;						\
+	 restore
+#else
+#define SYSCALL_ERROR_HANDLER						\
+	SYSCALL_ERROR_HANDLER1(%o0);					\
+	retl;								\
+	 sub %g0,1,%i0
+#endif
+
+#define PSEUDO(name, syscall_name, args)				\
+	.text;								\
+	ENTRY(name);							\
+	LOADSYSCALL(syscall_name);					\
+	ta 0x11;							\
+	bcc,pt %xcc,1f;							\
+	 nop;								\
+	SYSCALL_ERROR_HANDLER;						\
+1:
+
+#undef PSEUDO_END
+#define PSEUDO_END(name)						\
+	.size name,.-name
+
+#undef END
+#define END(name)							\
+	.size name,.-name
+
+/* Careful here!  This "ret" define can interfere; use jmpl if unsure.  */
+#define ret             retl; nop
+#define r0              %o0
+#define r1              %o1
+#define MOVE(x,y)       mov x, y
+
+#endif	/* ASSEMBLER */
+
+/* This is the offset from the %sp to the backing store above the 
+   register windows.  So if you poke stack memory directly you add this.  */
+#define STACK_BIAS	2047
+
+#endif /* linux/sparc64/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/sparc64/ucontext.h b/sysdeps/unix/sysv/linux/sparc64/ucontext.h
new file mode 100644
index 0000000000..160e2fc43a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/ucontext.h
@@ -0,0 +1,67 @@
+#ifndef _UCONTEXT_H
+#define _UCONTEXT_H
+
+#include <signal.h>
+
+#define MC_TSTATE	0
+#define MC_PC		1
+#define MC_NPC		2
+#define MC_Y		3
+#define MC_G1		4
+#define MC_G2		5
+#define MC_G3		6
+#define MC_G4		7
+#define MC_G5		8
+#define MC_G6		9
+#define MC_G7		10
+#define MC_O0		11
+#define MC_O1		12
+#define MC_O2		13
+#define MC_O3		14
+#define MC_O4		15
+#define MC_O5		16
+#define MC_O6		17
+#define MC_O7		18
+#define MC_NGREG	19
+
+typedef unsigned long mc_greg_t;
+typedef mc_greg_t mc_gregset_t[MC_NGREG];
+
+#define MC_MAXFPQ	16
+struct mc_fq {
+	unsigned long	*mcfq_addr;
+	unsigned int	mcfq_insn;
+};
+
+struct mc_fpu {
+	union {
+		unsigned int	sregs[32];
+		unsigned long	dregs[32];
+		long double	qregs[16];
+	} mcfpu_fregs;
+	unsigned long	mcfpu_fsr;
+	unsigned long	mcfpu_fprs;
+	unsigned long	mcfpu_gsr;
+	struct mc_fq	*mcfpu_fq;
+	unsigned char	mcfpu_qcnt;
+	unsigned char	mcfpu_qentsz;
+	unsigned char	mcfpu_enab;
+};
+typedef struct mc_fpu mc_fpu_t;
+
+typedef struct {
+	mc_gregset_t	mc_gregs;
+	mc_greg_t	mc_fp;
+	mc_greg_t	mc_i7;
+	mc_fpu_t	mc_fpregs;
+} mcontext_t;
+
+struct ucontext {
+	struct ucontext		*uc_link;
+	unsigned long		uc_flags;
+	unsigned long		uc_sigmask;
+	mcontext_t		uc_mcontext;
+};
+typedef struct ucontext ucontext_t;
+
+#endif /* ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index 5d91a2edfe..f11370d6cb 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -13,6 +13,7 @@ geteuid		-	geteuid		0	__geteuid	geteuid
 getpgid		-	getpgid		1	__getpgid	getpgid
 getpgrp		-	getpgrp		0	getpgrp
 getppid		-	getppid		0	__getppid	getppid
+getresgid	EXTRA	getresgid	3	getresgid
 getresuid	EXTRA	getresuid	3	getresuid
 getsid		-	getsid		1	getsid
 init_module	EXTRA	init_module	5	init_module
@@ -54,6 +55,7 @@ select		-	_newselect	5	__select	select
 setfsgid	EXTRA	setfsgid	1	setfsgid
 setfsuid	EXTRA	setfsuid	1	setfsuid
 setpgid		-	setpgid		2	__setpgid	setpgid
+setresgid	EXTRA	setresgid	3	setresgid
 setresuid	EXTRA	setresuid	3	setresuid
 sigpending	-	sigpending	1	sigpending
 sigprocmask	-	sigprocmask	3	__sigprocmask	sigprocmask