about summary refs log tree commit diff
path: root/sysdeps/sparc/sparc64
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/sparc/sparc64')
-rw-r--r--sysdeps/sparc/sparc64/Dist1
-rw-r--r--sysdeps/sparc/sparc64/Makefile3
-rw-r--r--sysdeps/sparc/sparc64/Versions7
-rw-r--r--sysdeps/sparc/sparc64/bits/atomic.h14
-rw-r--r--sysdeps/sparc/sparc64/dl-machine.h683
-rw-r--r--sysdeps/sparc/sparc64/dl-trampoline.S327
-rw-r--r--sysdeps/sparc/sparc64/elf/start.S10
-rw-r--r--sysdeps/sparc/sparc64/fpu/libm-test-ulps13
-rw-r--r--sysdeps/sparc/sparc64/jmpbuf-unwind.h37
-rw-r--r--sysdeps/sparc/sparc64/memcmp.S2
-rw-r--r--sysdeps/sparc/sparc64/memcpy.S8
-rw-r--r--sysdeps/sparc/sparc64/memset.S2
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/Dist32
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_add.c8
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_dtoq.c10
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_itoq.c6
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_qtod.c10
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c6
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_qtos.c10
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c4
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c4
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_qtox.c6
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_stoq.c10
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_sub.c8
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_uitoq.c6
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_uxtoq.c6
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_xtoq.c6
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/sfp-machine.h3
-rw-r--r--sysdeps/sparc/sparc64/sparcv9b/memcpy.S10
-rw-r--r--sysdeps/sparc/sparc64/sparcv9v/memcpy.S593
-rw-r--r--sysdeps/sparc/sparc64/sparcv9v/memset.S127
31 files changed, 440 insertions, 1532 deletions
diff --git a/sysdeps/sparc/sparc64/Dist b/sysdeps/sparc/sparc64/Dist
new file mode 100644
index 0000000000..dbf11d5009
--- /dev/null
+++ b/sysdeps/sparc/sparc64/Dist
@@ -0,0 +1 @@
+hp-timing.c
diff --git a/sysdeps/sparc/sparc64/Makefile b/sysdeps/sparc/sparc64/Makefile
index c1df31727c..6335984c7d 100644
--- a/sysdeps/sparc/sparc64/Makefile
+++ b/sysdeps/sparc/sparc64/Makefile
@@ -1,3 +1,6 @@
+# The Sparc `long double' is a distinct type we support.
+long-double-fcts = yes
+
 ifeq ($(subdir),csu)
 sysdep_routines += hp-timing
 elide-routines.os += hp-timing
diff --git a/sysdeps/sparc/sparc64/Versions b/sysdeps/sparc/sparc64/Versions
index 4cef7bcc71..99fe741a12 100644
--- a/sysdeps/sparc/sparc64/Versions
+++ b/sysdeps/sparc/sparc64/Versions
@@ -5,10 +5,3 @@ libc {
     __align_cpy_8; __align_cpy_16;
   }
 }
-libm {
-  GLIBC_2.1 {
-    # A generic bug got this omitted from other configurations' version
-    # sets, but we always had it.
-    exp2l;
-  }
-}
diff --git a/sysdeps/sparc/sparc64/bits/atomic.h b/sysdeps/sparc/sparc64/bits/atomic.h
index d0a64afce8..8f97753140 100644
--- a/sysdeps/sparc/sparc64/bits/atomic.h
+++ b/sysdeps/sparc/sparc64/bits/atomic.h
@@ -1,5 +1,5 @@
 /* Atomic operations.  sparc64 version.
-   Copyright (C) 2003, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
 
@@ -59,7 +59,7 @@ typedef uintmax_t uatomic_max_t;
   __asm __volatile ("cas [%4], %2, %0"					      \
 		    : "=r" (__acev_tmp), "=m" (*__acev_mem)		      \
 		    : "r" (oldval), "m" (*__acev_mem), "r" (__acev_mem),      \
-		      "0" (newval) : "memory");				      \
+		      "0" (newval));					      \
   __acev_tmp; })
 
 #define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
@@ -69,7 +69,7 @@ typedef uintmax_t uatomic_max_t;
   __asm __volatile ("casx [%4], %2, %0"					      \
 		    : "=r" (__acev_tmp), "=m" (*__acev_mem)		      \
 		    : "r" ((long) (oldval)), "m" (*__acev_mem),		      \
-		      "r" (__acev_mem), "0" ((long) (newval)) : "memory");    \
+		      "r" (__acev_mem), "0" ((long) (newval)));		      \
   __acev_tmp; })
 
 #define atomic_exchange_acq(mem, newvalue) \
@@ -80,7 +80,7 @@ typedef uintmax_t uatomic_max_t;
      if (sizeof (*(mem)) == 4)						      \
        __asm ("swap %0, %1"						      \
 	      : "=m" (*__memp), "=r" (__oldval)				      \
-	      : "m" (*__memp), "1" (__value) : "memory");		      \
+	      : "m" (*__memp), "1" (__value));				      \
      else								      \
        {								      \
 	 __val = *__memp;						      \
@@ -94,12 +94,6 @@ typedef uintmax_t uatomic_max_t;
        }								      \
      __oldval; })
 
-#define atomic_compare_and_exchange_val_24_acq(mem, newval, oldval) \
-  atomic_compare_and_exchange_val_acq (mem, newval, oldval)
-
-#define atomic_exchange_24_rel(mem, newval) \
-  atomic_exchange_rel (mem, newval)
-
 #define atomic_full_barrier() \
   __asm __volatile ("membar #LoadLoad | #LoadStore"			      \
 			  " | #StoreLoad | #StoreStore" : : : "memory")
diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h
index 314a784dbc..474aa0e6e6 100644
--- a/sysdeps/sparc/sparc64/dl-machine.h
+++ b/sysdeps/sparc/sparc64/dl-machine.h
@@ -1,5 +1,5 @@
 /* Machine-dependent ELF dynamic relocation inline functions.  Sparc64 version.
-   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
 	Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -18,9 +18,6 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#ifndef dl_machine_h
-#define dl_machine_h
-
 #define ELF_MACHINE_NAME "sparc64"
 
 #include <string.h>
@@ -91,7 +88,7 @@ elf_machine_load_address (void)
 
 /* We have 4 cases to handle.  And we code different code sequences
    for each one.  I love V9 code models...  */
-static inline void __attribute__ ((always_inline))
+static inline void
 sparc64_fixup_plt (struct link_map *map, const Elf64_Rela *reloc,
 		   Elf64_Addr *reloc_addr, Elf64_Addr value,
 		   Elf64_Addr high, int t)
@@ -215,7 +212,7 @@ sparc64_fixup_plt (struct link_map *map, const Elf64_Rela *reloc,
     }
 }
 
-static inline Elf64_Addr __attribute__ ((always_inline))
+static inline Elf64_Addr
 elf_machine_fixup_plt (struct link_map *map, lookup_t t,
 		       const Elf64_Rela *reloc,
 		       Elf64_Addr *reloc_addr, Elf64_Addr value)
@@ -236,21 +233,236 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
   return value;
 }
 
+#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,
+		  void *const reloc_addr_arg)
+{
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
+  const unsigned long int r_type = ELF64_R_TYPE_ID (reloc->r_info);
+
+#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
+  if (__builtin_expect (r_type == R_SPARC_RELATIVE, 0))
+    *reloc_addr = map->l_addr + reloc->r_addend;
+# ifndef RTLD_BOOTSTRAP
+  else if (r_type == R_SPARC_NONE) /* Who is Wilbur? */
+    return;
+# endif
+  else
+#endif
+    {
+#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
+      const Elf64_Sym *const refsym = sym;
+#endif
+      Elf64_Addr value;
+#ifndef RESOLVE_CONFLICT_FIND_MAP
+      if (sym->st_shndx != SHN_UNDEF &&
+	  ELF64_ST_BIND (sym->st_info) == STB_LOCAL)
+	value = map->l_addr;
+      else
+	{
+	  value = RESOLVE (&sym, version, r_type);
+	  if (sym)
+	    value += sym->st_value;
+	}
+#else
+      value = 0;
+#endif
+      value += reloc->r_addend;	/* Assume copy relocs have zero addend.  */
+
+      switch (r_type)
+	{
+#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
+	case R_SPARC_COPY:
+	  if (sym == NULL)
+	    /* This can happen in trace mode if an object could not be
+	       found.  */
+	    break;
+	  if (sym->st_size > refsym->st_size
+	      || (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
+	    {
+	      const char *strtab;
+
+	      strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
+	      _dl_error_printf ("\
+%s: Symbol `%s' has different size in shared object, consider re-linking\n",
+				rtld_progname ?: "<program name unknown>",
+				strtab + refsym->st_name);
+	    }
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
+	  break;
+#endif
+	case R_SPARC_64:
+	case R_SPARC_GLOB_DAT:
+	  *reloc_addr = value;
+	  break;
+#ifndef RTLD_BOOTSTRAP
+	case R_SPARC_8:
+	  *(char *) reloc_addr = value;
+	  break;
+	case R_SPARC_16:
+	  *(short *) reloc_addr = value;
+	  break;
+	case R_SPARC_32:
+	  *(unsigned int *) 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_WDISP30:
+	  *(unsigned int *) reloc_addr =
+	    ((*(unsigned int *)reloc_addr & 0xc0000000) |
+	     ((value - (Elf64_Addr) reloc_addr) >> 2));
+	  break;
+
+	/* MEDLOW code model relocs */
+	case R_SPARC_LO10:
+	  *(unsigned int *) reloc_addr =
+	    ((*(unsigned int *)reloc_addr & ~0x3ff) |
+	     (value & 0x3ff));
+	  break;
+	case R_SPARC_HI22:
+	  *(unsigned int *) reloc_addr =
+	    ((*(unsigned int *)reloc_addr & 0xffc00000) |
+	     (value >> 10));
+	  break;
+	case R_SPARC_OLO10:
+	  *(unsigned int *) reloc_addr =
+	    ((*(unsigned int *)reloc_addr & ~0x1fff) |
+	     (((value & 0x3ff) + ELF64_R_TYPE_DATA (reloc->r_info)) & 0x1fff));
+	  break;
+
+	/* MEDMID code model relocs */
+	case R_SPARC_H44:
+	  *(unsigned int *) reloc_addr =
+	    ((*(unsigned int *)reloc_addr & 0xffc00000) |
+	     (value >> 22));
+	  break;
+	case R_SPARC_M44:
+	  *(unsigned int *) reloc_addr =
+	    ((*(unsigned int *)reloc_addr & ~0x3ff) |
+	     ((value >> 12) & 0x3ff));
+	  break;
+	case R_SPARC_L44:
+	  *(unsigned int *) reloc_addr =
+	    ((*(unsigned int *)reloc_addr & ~0xfff) |
+	     (value & 0xfff));
+	  break;
+
+	/* MEDANY code model relocs */
+	case R_SPARC_HH22:
+	  *(unsigned int *) reloc_addr =
+	    ((*(unsigned int *)reloc_addr & 0xffc00000) |
+	     (value >> 42));
+	  break;
+	case R_SPARC_HM10:
+	  *(unsigned int *) reloc_addr =
+	    ((*(unsigned int *)reloc_addr & ~0x3ff) |
+	     ((value >> 32) & 0x3ff));
+	  break;
+	case R_SPARC_LM22:
+	  *(unsigned int *) reloc_addr =
+	    ((*(unsigned int *)reloc_addr & 0xffc00000) |
+	     ((value >> 10) & 0x003fffff));
+	  break;
+#endif
+	case R_SPARC_JMP_SLOT:
+#ifdef RESOLVE_CONFLICT_FIND_MAP
+	  /* R_SPARC_JMP_SLOT conflicts against .plt[32768+]
+	     relocs should be turned into R_SPARC_64 relocs
+	     in .gnu.conflict section.
+	     r_addend non-zero does not mean it is a .plt[32768+]
+	     reloc, instead it is the actual address of the function
+	     to call.  */
+	  sparc64_fixup_plt (NULL, reloc, reloc_addr, value, 0, 0);
+#else
+	  sparc64_fixup_plt (map, reloc, reloc_addr, value,
+			     reloc->r_addend, 0);
+#endif
+	  break;
+#ifndef RTLD_BOOTSTRAP
+	case R_SPARC_UA16:
+	  ((unsigned char *) reloc_addr_arg) [0] = value >> 8;
+	  ((unsigned char *) reloc_addr_arg) [1] = value;
+	  break;
+	case R_SPARC_UA32:
+	  ((unsigned char *) reloc_addr_arg) [0] = value >> 24;
+	  ((unsigned char *) reloc_addr_arg) [1] = value >> 16;
+	  ((unsigned char *) reloc_addr_arg) [2] = value >> 8;
+	  ((unsigned char *) reloc_addr_arg) [3] = value;
+	  break;
+	case R_SPARC_UA64:
+	  if (! ((long) reloc_addr_arg & 3))
+	    {
+	      /* Common in .eh_frame */
+	      ((unsigned int *) reloc_addr_arg) [0] = value >> 32;
+	      ((unsigned int *) reloc_addr_arg) [1] = value;
+	      break;
+	    }
+	  ((unsigned char *) reloc_addr_arg) [0] = value >> 56;
+	  ((unsigned char *) reloc_addr_arg) [1] = value >> 48;
+	  ((unsigned char *) reloc_addr_arg) [2] = value >> 40;
+	  ((unsigned char *) reloc_addr_arg) [3] = value >> 32;
+	  ((unsigned char *) reloc_addr_arg) [4] = value >> 24;
+	  ((unsigned char *) reloc_addr_arg) [5] = value >> 16;
+	  ((unsigned char *) reloc_addr_arg) [6] = value >> 8;
+	  ((unsigned char *) reloc_addr_arg) [7] = value;
+	  break;
+#endif
+#if !defined RTLD_BOOTSTRAP || defined _NDEBUG
+	default:
+	  _dl_reloc_bad_type (map, r_type, 0);
+	  break;
+#endif
+	}
+    }
+}
+
+static inline void
+elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+			   void *const reloc_addr_arg)
+{
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
+  *reloc_addr = l_addr + reloc->r_addend;
+}
+
+static inline void
+elf_machine_lazy_rel (struct link_map *map,
+		      Elf64_Addr l_addr, const Elf64_Rela *reloc)
+{
+  switch (ELF64_R_TYPE (reloc->r_info))
+    {
+    case R_SPARC_NONE:
+      break;
+    case R_SPARC_JMP_SLOT:
+      break;
+    default:
+      _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
+      break;
+    }
+}
+
+#endif	/* RESOLVE */
+
 /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
    PLT entries should not be allowed to define the value.
    ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
    of the main executable's symbols, as for a COPY reloc.  */
-#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
-# define elf_machine_type_class(type) \
-  ((((type) == R_SPARC_JMP_SLOT						      \
-     || ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64))     \
-    * ELF_RTYPE_CLASS_PLT)						      \
-   | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
-#else
-# define elf_machine_type_class(type) \
+#define elf_machine_type_class(type) \
   ((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)	\
    | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
-#endif
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT	R_SPARC_JMP_SLOT
@@ -275,67 +487,74 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
       extern void _dl_runtime_profile_1 (void);
       Elf64_Addr res0_addr, res1_addr;
       unsigned int *plt = (void *) D_PTR (l, l_info[DT_PLTGOT]);
+      int i = 0;
 
-      if (__builtin_expect(profile, 0))
+      if (! profile)
 	{
-	  res0_addr = (Elf64_Addr) &_dl_runtime_profile_0;
-	  res1_addr = (Elf64_Addr) &_dl_runtime_profile_1;
-
-	  if (GLRO(dl_profile) != NULL
-	      && _dl_name_match_p (GLRO(dl_profile), l))
-	    GL(dl_profile_map) = l;
+	  res0_addr = (Elf64_Addr) &_dl_runtime_resolve_0;
+	  res1_addr = (Elf64_Addr) &_dl_runtime_resolve_1;
 	}
       else
 	{
-	  res0_addr = (Elf64_Addr) &_dl_runtime_resolve_0;
-	  res1_addr = (Elf64_Addr) &_dl_runtime_resolve_1;
+	  res0_addr = (Elf64_Addr) &_dl_runtime_profile_0;
+	  res1_addr = (Elf64_Addr) &_dl_runtime_profile_1;
+	  if (_dl_name_match_p (GLRO(dl_profile), l))
+	    GL(dl_profile_map) = l;
 	}
 
       /* PLT0 looks like:
 
-         sethi	%uhi(_dl_runtime_{resolve,profile}_0), %g4
-	 sethi	%hi(_dl_runtime_{resolve,profile}_0), %g5
-	 or	%g4, %ulo(_dl_runtime_{resolve,profile}_0), %g4
-	 or	%g5, %lo(_dl_runtime_{resolve,profile}_0), %g5
-	 sllx	%g4, 32, %g4
-	 add	%g4, %g5, %g5
-	 jmpl	%g5, %g4
-	  nop
+	 save	%sp, -192, %sp
+	 sethi	%hh(_dl_runtime_{resolve,profile}_0), %l0
+	 sethi	%lm(_dl_runtime_{resolve,profile}_0), %l1
+	 or	%l0, %hm(_dl_runtime_{resolve,profile}_0), %l0
+	 or	%l1, %lo(_dl_runtime_{resolve,profile}_0), %l1
+	 sllx	%l0, 32, %l0
+	 jmpl	%l0 + %l1, %l6
+	  sethi	%hi(0xffc00), %l2
        */
 
-      plt[0] = 0x09000000 | (res0_addr >> (64 - 22));
-      plt[1] = 0x0b000000 | ((res0_addr >> 10) & 0x003fffff);
-      plt[2] = 0x88112000 | ((res0_addr >> 32) & 0x3ff);
-      plt[3] = 0x8a116000 | (res0_addr & 0x3ff);
-      plt[4] = 0x89293020;
-      plt[5] = 0x8a010005;
-      plt[6] = 0x89c14000;
-      plt[7] = 0x01000000;
+      plt[0] = 0x9de3bf40;
+      plt[1] = 0x21000000 | (res0_addr >> (64 - 22));
+      plt[2] = 0x23000000 | ((res0_addr >> 10) & 0x003fffff);
+      plt[3] = 0xa0142000 | ((res0_addr >> 32) & 0x3ff);
+      plt[4] = 0xa2146000 | (res0_addr & 0x3ff);
+      plt[5] = 0xa12c3020;
+      plt[6] = 0xadc40011;
+      plt[7] = 0x250003ff;
 
       /* PLT1 looks like:
 
-         sethi	%uhi(_dl_runtime_{resolve,profile}_1), %g4
-	 sethi	%hi(_dl_runtime_{resolve,profile}_1), %g5
-	 or	%g4, %ulo(_dl_runtime_{resolve,profile}_1), %g4
-	 or	%g5, %lo(_dl_runtime_{resolve,profile}_1), %g5
-	 sllx	%g4, 32, %g4
-	 add	%g4, %g5, %g5
-	 jmpl	%g5, %g4
-	  nop
+	 save	%sp, -192, %sp
+	 sethi	%hh(_dl_runtime_{resolve,profile}_1), %l0
+	 sethi	%lm(_dl_runtime_{resolve,profile}_1), %l1
+	 or	%l0, %hm(_dl_runtime_{resolve,profile}_1), %l0
+	 or	%l1, %lo(_dl_runtime_{resolve,profile}_1), %l1
+	 sllx	%l0, 32, %l0
+	 jmpl	%l0 + %l1, %l6
+	  srlx	%g1, 12, %o1
        */
 
-      plt[8] = 0x09000000 | (res1_addr >> (64 - 22));
-      plt[9] = 0x0b000000 | ((res1_addr >> 10) & 0x003fffff);
-      plt[10] = 0x88112000 | ((res1_addr >> 32) & 0x3ff);
-      plt[11] = 0x8a116000 | (res1_addr & 0x3ff);
-      plt[12] = 0x89293020;
-      plt[13] = 0x8a010005;
-      plt[14] = 0x89c14000;
-      plt[15] = 0x01000000;
+      plt[8 + 0] = 0x9de3bf40;
+      if (__builtin_expect (((res1_addr + 4) >> 32) & 0x3ff, 0))
+	i = 1;
+      else
+	res1_addr += 4;
+      plt[8 + 1] = 0x21000000 | (res1_addr >> (64 - 22));
+      plt[8 + 2] = 0x23000000 | ((res1_addr >> 10) & 0x003fffff);
+      if (__builtin_expect (i, 0))
+	plt[8 + 3] = 0xa0142000 | ((res1_addr >> 32) & 0x3ff);
+      else
+	plt[8 + 3] = 0xa12c3020;
+      plt[8 + 4] = 0xa2146000 | (res1_addr & 0x3ff);
+      if (__builtin_expect (i, 0))
+	plt[8 + 5] = 0xa12c3020;
+      plt[8 + 5 + i] = 0xadc40011;
+      plt[8 + 6 + i] = 0x9330700c;
 
       /* Now put the magic cookie at the beginning of .PLT2
 	 Entry .PLT3 is unused by this implementation.  */
-      *((struct link_map **)(&plt[16])) = l;
+      *((struct link_map **)(&plt[16 + 0])) = l;
 
       if (__builtin_expect (l->l_info[VALIDX(DT_GNU_PRELINKED)] != NULL, 0)
 	  || __builtin_expect (l->l_info [VALIDX (DT_GNU_LIBLISTSZ)] != NULL, 0))
@@ -382,6 +601,68 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
   return lazy;
 }
 
+/* This code is used in dl-runtime.c to call the `fixup' function
+   and then redirect to the address it returns.  */
+#define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name)	\
+  asm ("\n"						\
+"	.text\n"					\
+"	.globl	" #tramp_name "_0\n"			\
+"	.type	" #tramp_name "_0, @function\n"		\
+"	.align	32\n"					\
+"\t" #tramp_name "_0:\n"				\
+"	! sethi   %hi(1047552), %l2 - Done in .PLT0\n"	\
+"	ldx	[%l6 + 32 + 8], %o0\n"			\
+"	sub     %g1, %l6, %l0\n"			\
+"	xor     %l2, -1016, %l2\n"			\
+"	sethi   %hi(5120), %l3	! 160 * 32\n"		\
+"	add     %l0, %l2, %l0\n"			\
+"	sethi   %hi(32768), %l4\n"			\
+"	udivx   %l0, %l3, %l3\n"			\
+"	sllx    %l3, 2, %l1\n"				\
+"	add     %l1, %l3, %l1\n"			\
+"	sllx    %l1, 10, %l2\n"				\
+"	sub	%l4, 4, %l4	! No thanks to Sun for not obeying their own ABI\n" \
+"	sllx    %l1, 5, %l1\n"				\
+"	sub     %l0, %l2, %l0\n"			\
+"	udivx   %l0, 24, %l0\n"				\
+"	add     %l0, %l4, %l0\n"			\
+"	add     %l1, %l0, %l1\n"			\
+"	add     %l1, %l1, %l0\n"			\
+"	add     %l0, %l1, %l0\n"			\
+"	mov	%i7, %o2\n"				\
+"	call	" #fixup_name "\n"			\
+"	 sllx    %l0, 3, %o1\n"				\
+"	jmp	%o0\n"					\
+"	 restore\n"					\
+"	.size	" #tramp_name "_0, . - " #tramp_name "_0\n" \
+"\n"							\
+"	.globl	" #tramp_name "_1\n"			\
+"	.type	" #tramp_name "_1, @function\n"		\
+"	! tramp_name_1 + 4 needs to be .align 32\n"	\
+"\t" #tramp_name "_1:\n"				\
+"	sub	%l6, 4, %l6\n"				\
+"	! srlx	%g1, 12, %o1 - Done in .PLT1\n"		\
+"	ldx	[%l6 + 12], %o0\n"			\
+"	add	%o1, %o1, %o3\n"			\
+"	sub	%o1, 96, %o1	! No thanks to Sun for not obeying their own ABI\n" \
+"	mov	%i7, %o2\n"				\
+"	call	" #fixup_name "\n"			\
+"	 add	%o1, %o3, %o1\n"			\
+"	jmp	%o0\n"					\
+"	 restore\n"					\
+"	.size	" #tramp_name "_1, . - " #tramp_name "_1\n" \
+"	.previous\n");
+
+#ifndef PROF
+#define ELF_MACHINE_RUNTIME_TRAMPOLINE			\
+  TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup);	\
+  TRAMPOLINE_TEMPLATE (_dl_runtime_profile, profile_fixup);
+#else
+#define ELF_MACHINE_RUNTIME_TRAMPOLINE			\
+  TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup);	\
+  TRAMPOLINE_TEMPLATE (_dl_runtime_profile, fixup);
+#endif
+
 /* The PLT uses Elf64_Rela relocs.  */
 #define elf_machine_relplt elf_machine_rela
 
@@ -482,291 +763,3 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
 "	 add	%sp, 6*8, %sp\n"					\
 "	.size	_dl_start_user, . - _dl_start_user\n"			\
 "	.previous\n");
-
-#endif /* dl_machine_h */
-
-#define ARCH_LA_PLTENTER	sparc64_gnu_pltenter
-#define ARCH_LA_PLTEXIT		sparc64_gnu_pltexit
-
-#ifdef RESOLVE_MAP
-
-/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
-   MAP is the object containing the reloc.  */
-
-auto inline void
-__attribute__ ((always_inline))
-elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
-		  const Elf64_Sym *sym, const struct r_found_version *version,
-		  void *const reloc_addr_arg)
-{
-  Elf64_Addr *const reloc_addr = reloc_addr_arg;
-#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
-  const Elf64_Sym *const refsym = sym;
-#endif
-  Elf64_Addr value;
-  const unsigned long int r_type = ELF64_R_TYPE_ID (reloc->r_info);
-#if !defined RESOLVE_CONFLICT_FIND_MAP
-  struct link_map *sym_map = NULL;
-#endif
-
-#if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
-  /* 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 (__builtin_expect (r_type == R_SPARC_NONE, 0))
-    return;
-
-#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
-  if (__builtin_expect (r_type == R_SPARC_RELATIVE, 0))
-    {
-# if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
-      if (map != &_dl_rtld_map) /* Already done in rtld itself. */
-# endif
-	*reloc_addr += map->l_addr + reloc->r_addend;
-      return;
-    }
-#endif
-
-#ifndef RESOLVE_CONFLICT_FIND_MAP
-  if (__builtin_expect (ELF64_ST_BIND (sym->st_info) == STB_LOCAL, 0)
-      && sym->st_shndx != SHN_UNDEF)
-    {
-      value = map->l_addr;
-    }
-  else
-    {
-      sym_map = RESOLVE_MAP (&sym, version, r_type);
-      value = sym_map == NULL ? 0 : sym_map->l_addr + sym->st_value;
-    }
-#else
-  value = 0;
-#endif
-
-  value += reloc->r_addend;	/* Assume copy relocs have zero addend.  */
-
-  switch (r_type)
-    {
-#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
-    case R_SPARC_COPY:
-      if (sym == NULL)
-	/* This can happen in trace mode if an object could not be
-	   found.  */
-	break;
-      if (sym->st_size > refsym->st_size
-	  || (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
-	{
-	  const char *strtab;
-
-	  strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
-	  _dl_error_printf ("\
-%s: Symbol `%s' has different size in shared object, consider re-linking\n",
-			    rtld_progname ?: "<program name unknown>",
-			    strtab + refsym->st_name);
-	}
-      memcpy (reloc_addr_arg, (void *) value,
-	      MIN (sym->st_size, refsym->st_size));
-      break;
-#endif
-    case R_SPARC_64:
-    case R_SPARC_GLOB_DAT:
-      *reloc_addr = value;
-      break;
-    case R_SPARC_JMP_SLOT:
-#ifdef RESOLVE_CONFLICT_FIND_MAP
-      /* R_SPARC_JMP_SLOT conflicts against .plt[32768+]
-	 relocs should be turned into R_SPARC_64 relocs
-	 in .gnu.conflict section.
-	 r_addend non-zero does not mean it is a .plt[32768+]
-	 reloc, instead it is the actual address of the function
-	 to call.  */
-      sparc64_fixup_plt (NULL, reloc, reloc_addr, value, 0, 0);
-#else
-      sparc64_fixup_plt (map, reloc, reloc_addr, value, reloc->r_addend, 0);
-#endif
-      break;
-#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) \
-    && !defined RESOLVE_CONFLICT_FIND_MAP
-    case R_SPARC_TLS_DTPMOD64:
-      /* Get the information from the link map returned by the
-	 resolv function.  */
-      if (sym_map != NULL)
-	*reloc_addr = sym_map->l_tls_modid;
-      break;
-    case R_SPARC_TLS_DTPOFF64:
-      /* During relocation all TLS symbols are defined and used.
-	 Therefore the offset is already correct.  */
-      *reloc_addr = (sym == NULL ? 0 : sym->st_value) + reloc->r_addend;
-      break;
-    case R_SPARC_TLS_TPOFF64:
-      /* The offset is negative, forward from the thread pointer.  */
-      /* We know the offset of object the symbol is contained in.
-	 It is a negative value which will be added to the
-	 thread pointer.  */
-      if (sym != NULL)
-	{
-	  CHECK_STATIC_TLS (map, sym_map);
-	  *reloc_addr = sym->st_value - sym_map->l_tls_offset
-	    + reloc->r_addend;
-	}
-      break;
-# ifndef RTLD_BOOTSTRAP
-    case R_SPARC_TLS_LE_HIX22:
-    case R_SPARC_TLS_LE_LOX10:
-      if (sym != NULL)
-	{
-	  CHECK_STATIC_TLS (map, sym_map);
-	  value = sym->st_value - sym_map->l_tls_offset
-	    + reloc->r_addend;
-	  if (r_type == R_SPARC_TLS_LE_HIX22)
-	    *reloc_addr = (*reloc_addr & 0xffc00000)
-	      | (((~value) >> 10) & 0x3fffff);
-	  else
-	    *reloc_addr = (*reloc_addr & 0xffffe000) | (value & 0x3ff)
-	      | 0x1c00;
-	}
-      break;
-# endif
-#endif
-#ifndef RTLD_BOOTSTRAP
-    case R_SPARC_8:
-      *(char *) reloc_addr = value;
-      break;
-    case R_SPARC_16:
-      *(short *) reloc_addr = value;
-      break;
-    case R_SPARC_32:
-      *(unsigned int *) 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_WDISP30:
-      *(unsigned int *) reloc_addr =
-	((*(unsigned int *)reloc_addr & 0xc0000000) |
-	 (((value - (Elf64_Addr) reloc_addr) >> 2) & 0x3fffffff));
-      break;
-
-      /* MEDLOW code model relocs */
-    case R_SPARC_LO10:
-      *(unsigned int *) reloc_addr =
-	((*(unsigned int *)reloc_addr & ~0x3ff) |
-	 (value & 0x3ff));
-      break;
-    case R_SPARC_HI22:
-      *(unsigned int *) reloc_addr =
-	((*(unsigned int *)reloc_addr & 0xffc00000) |
-	 ((value >> 10) & 0x3fffff));
-      break;
-    case R_SPARC_OLO10:
-      *(unsigned int *) reloc_addr =
-	((*(unsigned int *)reloc_addr & ~0x1fff) |
-	 (((value & 0x3ff) + ELF64_R_TYPE_DATA (reloc->r_info)) & 0x1fff));
-      break;
-
-      /* MEDMID code model relocs */
-    case R_SPARC_H44:
-      *(unsigned int *) reloc_addr =
-	((*(unsigned int *)reloc_addr & 0xffc00000) |
-	 ((value >> 22) & 0x3fffff));
-      break;
-    case R_SPARC_M44:
-      *(unsigned int *) reloc_addr =
-	((*(unsigned int *)reloc_addr & ~0x3ff) |
-	 ((value >> 12) & 0x3ff));
-      break;
-    case R_SPARC_L44:
-      *(unsigned int *) reloc_addr =
-	((*(unsigned int *)reloc_addr & ~0xfff) |
-	 (value & 0xfff));
-      break;
-
-      /* MEDANY code model relocs */
-    case R_SPARC_HH22:
-      *(unsigned int *) reloc_addr =
-	((*(unsigned int *)reloc_addr & 0xffc00000) |
-	 (value >> 42));
-      break;
-    case R_SPARC_HM10:
-      *(unsigned int *) reloc_addr =
-	((*(unsigned int *)reloc_addr & ~0x3ff) |
-	 ((value >> 32) & 0x3ff));
-      break;
-    case R_SPARC_LM22:
-      *(unsigned int *) reloc_addr =
-	((*(unsigned int *)reloc_addr & 0xffc00000) |
-	 ((value >> 10) & 0x003fffff));
-      break;
-    case R_SPARC_UA16:
-      ((unsigned char *) reloc_addr_arg) [0] = value >> 8;
-      ((unsigned char *) reloc_addr_arg) [1] = value;
-      break;
-    case R_SPARC_UA32:
-      ((unsigned char *) reloc_addr_arg) [0] = value >> 24;
-      ((unsigned char *) reloc_addr_arg) [1] = value >> 16;
-      ((unsigned char *) reloc_addr_arg) [2] = value >> 8;
-      ((unsigned char *) reloc_addr_arg) [3] = value;
-      break;
-    case R_SPARC_UA64:
-      if (! ((long) reloc_addr_arg & 3))
-	{
-	  /* Common in .eh_frame */
-	  ((unsigned int *) reloc_addr_arg) [0] = value >> 32;
-	  ((unsigned int *) reloc_addr_arg) [1] = value;
-	  break;
-	}
-      ((unsigned char *) reloc_addr_arg) [0] = value >> 56;
-      ((unsigned char *) reloc_addr_arg) [1] = value >> 48;
-      ((unsigned char *) reloc_addr_arg) [2] = value >> 40;
-      ((unsigned char *) reloc_addr_arg) [3] = value >> 32;
-      ((unsigned char *) reloc_addr_arg) [4] = value >> 24;
-      ((unsigned char *) reloc_addr_arg) [5] = value >> 16;
-      ((unsigned char *) reloc_addr_arg) [6] = value >> 8;
-      ((unsigned char *) reloc_addr_arg) [7] = value;
-      break;
-#endif
-#if !defined RTLD_BOOTSTRAP || defined _NDEBUG
-    default:
-      _dl_reloc_bad_type (map, r_type, 0);
-      break;
-#endif
-    }
-}
-
-auto inline void
-__attribute__ ((always_inline))
-elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
-			   void *const reloc_addr_arg)
-{
-  Elf64_Addr *const reloc_addr = reloc_addr_arg;
-  *reloc_addr = l_addr + reloc->r_addend;
-}
-
-auto inline void
-__attribute__ ((always_inline))
-elf_machine_lazy_rel (struct link_map *map,
-		      Elf64_Addr l_addr, const Elf64_Rela *reloc)
-{
-  switch (ELF64_R_TYPE (reloc->r_info))
-    {
-    case R_SPARC_NONE:
-      break;
-    case R_SPARC_JMP_SLOT:
-      break;
-    default:
-      _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
-      break;
-    }
-}
-
-#endif	/* RESOLVE_MAP */
diff --git a/sysdeps/sparc/sparc64/dl-trampoline.S b/sysdeps/sparc/sparc64/dl-trampoline.S
deleted file mode 100644
index 81e5c556c3..0000000000
--- a/sysdeps/sparc/sparc64/dl-trampoline.S
+++ /dev/null
@@ -1,327 +0,0 @@
-/* PLT trampolines.  Sparc 64-bit version.
-   Copyright (C) 2005 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 Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <sysdep.h>
-
-	.text
-	.align	32
-
-	/* %g1:	PLT offset loaded by PLT entry
-	 * %g4: callers PC, which is PLT0 + 24, therefore we
-	 *      add (32 + 8) to get the address of PLT2 which
-	 *      is where the magic cookie is stored
-	 */
-	.globl	_dl_runtime_resolve_0
-	.type	_dl_runtime_resolve_0, @function
-_dl_runtime_resolve_0:
-	cfi_startproc
-
-	save	%sp, -192, %sp
-	cfi_def_cfa_register(%fp)
-	cfi_window_save
-	cfi_register(%o7, %i7)
-
-	sethi   %hi(1047552), %l2
-	ldx	[%g4 + 32 + 8], %o0
-	sub     %g1, %g4, %l0
-	xor     %l2, -1016, %l2
-	sethi   %hi(5120), %l3	/* 160 * 32 */
-	add     %l0, %l2, %l0
-	sethi   %hi(32768), %l4
-	udivx   %l0, %l3, %l3
-	sllx    %l3, 2, %l1
-	add     %l1, %l3, %l1
-	sllx    %l1, 10, %l2
-	sub	%l4, 4, %l4
-	sllx    %l1, 5, %l1
-	sub     %l0, %l2, %l0
-	udivx   %l0, 24, %l0
-	add     %l0, %l4, %l0
-	add     %l1, %l0, %l1
-	add     %l1, %l1, %l0
-	add     %l0, %l1, %l0
-	call	_dl_fixup
-	 sllx    %l0, 3, %o1
-	jmp	%o0
-	 restore
-
-	cfi_endproc
-
-	.size	_dl_runtime_resolve_0, .-_dl_runtime_resolve_0
-
-	/* %g1:	PLT offset loaded by PLT entry
-	 * %g4: callers PC, which is PLT1 + 24, therefore we
-	 *      add 8 to get the address of PLT2 which
-	 *      is where the magic cookie is stored
-	 */
-	.globl	_dl_runtime_resolve_1
-	.type	_dl_runtime_resolve_1, @function
-_dl_runtime_resolve_1:
-	cfi_startproc
-
-	save	%sp, -192, %sp
-	cfi_def_cfa_register(%fp)
-	cfi_window_save
-	cfi_register(%o7, %i7)
-
-	srlx	%g1, 12, %o1
-	ldx	[%g4 + 8], %o0
-	add	%o1, %o1, %o3
-	sub	%o1, 96, %o1
-	call	_dl_fixup
-	 add	%o1, %o3, %o1
-	jmp	%o0
-	 restore
-
-	cfi_endproc
-
-	.size	_dl_runtime_resolve_1, .-_dl_runtime_resolve_1
-
-	/* For the profiling cases we pass in our stack frame
-	 * as the base of the La_sparc64_regs, so it looks
-	 * like:
-	 *	%l0			%sp
-	 *	...
-	 *	%l7			%sp + (7 * 8)
-	 *	%i0			%sp + (8 * 8)
-	 *	...
-	 *	%i7			%sp + (15 * 8)
-	 *	%f0			%sp + (16 * 8)
-	 *	%f16			%sp + (31 * 8)
-	 *	framesize		%sp + (32 * 8)
-	 */
-
-	.globl	_dl_profile_save_regs
-	.type	_dl_profile_save_regs, @function
-_dl_profile_save_regs:
-	cfi_startproc
-
-	stx	%l0, [%sp + STACK_BIAS + ( 0 * 8)]
-	stx	%l1, [%sp + STACK_BIAS + ( 1 * 8)]
-	stx	%l2, [%sp + STACK_BIAS + ( 2 * 8)]
-	stx	%l3, [%sp + STACK_BIAS + ( 3 * 8)]
-	stx	%l4, [%sp + STACK_BIAS + ( 4 * 8)]
-	stx	%l5, [%sp + STACK_BIAS + ( 5 * 8)]
-	stx	%l6, [%sp + STACK_BIAS + ( 6 * 8)]
-	stx	%l7, [%sp + STACK_BIAS + ( 7 * 8)]
-	stx	%i0, [%sp + STACK_BIAS + ( 8 * 8)]
-	stx	%i1, [%sp + STACK_BIAS + ( 9 * 8)]
-	stx	%i2, [%sp + STACK_BIAS + (10 * 8)]
-	stx	%i3, [%sp + STACK_BIAS + (11 * 8)]
-	stx	%i4, [%sp + STACK_BIAS + (12 * 8)]
-	stx	%i5, [%sp + STACK_BIAS + (13 * 8)]
-	stx	%i6, [%sp + STACK_BIAS + (14 * 8)]
-	stx	%i7, [%sp + STACK_BIAS + (15 * 8)]
-	std	%f0, [%sp + STACK_BIAS + (16 * 8)]
-	std	%f2, [%sp + STACK_BIAS + (17 * 8)]
-	std	%f4, [%sp + STACK_BIAS + (18 * 8)]
-	std	%f6, [%sp + STACK_BIAS + (19 * 8)]
-	std	%f8, [%sp + STACK_BIAS + (20 * 8)]
-	std	%f10, [%sp + STACK_BIAS + (21 * 8)]
-	std	%f12, [%sp + STACK_BIAS + (22 * 8)]
-	std	%f14, [%sp + STACK_BIAS + (23 * 8)]
-	std	%f16, [%sp + STACK_BIAS + (24 * 8)]
-	std	%f18, [%sp + STACK_BIAS + (25 * 8)]
-	std	%f20, [%sp + STACK_BIAS + (26 * 8)]
-	std	%f22, [%sp + STACK_BIAS + (27 * 8)]
-	std	%f24, [%sp + STACK_BIAS + (28 * 8)]
-	std	%f26, [%sp + STACK_BIAS + (29 * 8)]
-	std	%f28, [%sp + STACK_BIAS + (30 * 8)]
-	retl
-	 std	%f30, [%sp + STACK_BIAS + (31 * 8)]
-
-	cfi_endproc
-
-	.size	_dl_profile_save_regs, .-_dl_profile_save_regs
-
-	/* If we are going to call pltexit, then we must replicate
-	 * the caller's stack frame.
-	 * %o0: PLT resolved function address
-	 */
-	.globl	_dl_profile_invoke
-	.type	_dl_profile_invoke, @function
-_dl_profile_invoke:
-	cfi_startproc
-
-	sub	%sp, %l0, %sp
-1:
-	srlx	%l0, 3, %l7
-	mov	%o0, %l1
-	mov	%i0, %o0
-	mov	%i1, %o1
-	mov	%i2, %o2
-	mov	%i3, %o3
-	mov	%i4, %o4
-	mov	%i5, %o5
-	add	%fp, STACK_BIAS, %l2
-	add	%sp, STACK_BIAS, %l3
-1:	ldx	[%l2], %l4
-	add	%l2, 0x8, %l2
-	subcc	%l7, 1, %l7
-	stx	%l4, [%l3]
-	bne,pt	%xcc, 1b
-	 add	%l3, 0x8, %l3
-
-	jmpl	%l1, %o7
-	 nop
-
-	stx	%o0, [%sp + STACK_BIAS + (16 * 8)]
-	stx	%o1, [%sp + STACK_BIAS + (17 * 8)]
-	stx	%o2, [%sp + STACK_BIAS + (18 * 8)]
-	stx	%o3, [%sp + STACK_BIAS + (19 * 8)]
-	std	%f0, [%sp + STACK_BIAS + (20 * 8)]
-	std	%f2, [%sp + STACK_BIAS + (21 * 8)]
-	std	%f4, [%sp + STACK_BIAS + (22 * 8)]
-	std	%f8, [%sp + STACK_BIAS + (23 * 8)]
-
-	mov	%l5, %o0
-	mov	%l6, %o1
-	add	%sp, %l0, %o2
-	add	%sp, STACK_BIAS + (16 * 8), %o3
-	call	_dl_call_pltexit
-	 add	%o2, STACK_BIAS, %o2
-
-	ldx	[%sp + STACK_BIAS + (16 * 8)], %i0
-	ldx	[%sp + STACK_BIAS + (17 * 8)], %i1
-	ldx	[%sp + STACK_BIAS + (18 * 8)], %i2
-	ldx	[%sp + STACK_BIAS + (19 * 8)], %i3
-
-	jmpl	%i7 + 8, %g0
-	 restore
-
-	cfi_endproc
-
-	.size	_dl_profile_invoke, .-_dl_profile_invoke
-
-	/* %g1:	PLT offset loaded by PLT entry
-	 * %g4: callers PC, which is PLT0 + 24, therefore we
-	 *      add (32 + 8) to get the address of PLT2 which
-	 *      is where the magic cookie is stored
-	 */
-	.align	32
-	.globl	_dl_runtime_profile_0
-	.type	_dl_runtime_profile_0, @function
-_dl_runtime_profile_0:
-	cfi_startproc
-
-	brz,a,pn %fp, 1f
-	 mov	192, %g5
-	sub	%fp, %sp, %g5
-1:	save	%sp, -336, %sp
-	cfi_def_cfa_register(%fp)
-	cfi_window_save
-	cfi_register(%o7, %i7)
-
-	sethi   %hi(1047552), %l2
-	ldx	[%g4 + 32 + 8], %o0
-	sub     %g1, %g4, %l0
-	xor     %l2, -1016, %l2
-	sethi   %hi(5120), %l3	/* 160 * 32 */
-	add     %l0, %l2, %l0
-	sethi   %hi(32768), %l4
-	udivx   %l0, %l3, %l3
-	sllx    %l3, 2, %l1
-	add     %l1, %l3, %l1
-	sllx    %l1, 10, %l2
-	sub	%l4, 4, %l4
-	sllx    %l1, 5, %l1
-	sub     %l0, %l2, %l0
-	udivx   %l0, 24, %l0
-	add     %l0, %l4, %l0
-	add     %l1, %l0, %l1
-	add     %l1, %l1, %l0
-	add     %l0, %l1, %l0
-
-	mov	%i7, %o2
-	sllx    %l0, 3, %o1
-
-	mov	%g5, %l0
-	mov	%o0, %l5
-	mov	%o1, %l6
-
-	call	_dl_profile_save_regs
-	 nop
-
-	add	%sp, STACK_BIAS, %o3
-	call	_dl_profile_fixup
-	 add	%sp, (STACK_BIAS + (32 * 8)), %o4
-
-	ldx	[%sp + STACK_BIAS + (32 * 8)], %o1
-	brgez,pt %o1, 1f
-	 nop
-
-	call	_dl_profile_invoke
-	 nop
-
-1:	jmp	%o0
-	 restore
-
-	cfi_endproc
-
-	.size	_dl_runtime_profile_0, .-_dl_runtime_profile_0
-
-	/* %g1:	PLT offset loaded by PLT entry
-	 * %g4: callers PC, which is PLT1 + 24, therefore we
-	 *      add 8 to get the address of PLT2 which
-	 *      is where the magic cookie is stored
-	 */
-	.globl	_dl_runtime_profile_1
-	.type	_dl_runtime_profile_1, @function
-_dl_runtime_profile_1:
-	cfi_startproc
-
-	brz,a,pn %fp, 1f
-	 mov	192, %g5
-	sub	%fp, %sp, %g5
-1:	save	%sp, -336, %sp
-	cfi_def_cfa_register(%fp)
-	cfi_window_save
-	cfi_register(%o7, %i7)
-
-	srlx	%g1, 12, %o1
-	ldx	[%g4 + 8], %o0
-	add	%o1, %o1, %o3
-	sub	%o1, 96, %o1
-	mov	%i7, %o2
-	add	%o1, %o3, %o1
-
-	mov	%g5, %l0
-	mov	%o0, %l5
-	mov	%o1, %l6
-
-	call	_dl_profile_save_regs
-	 nop
-
-	add	%sp, STACK_BIAS, %o3
-	call	_dl_profile_fixup
-	 add	%sp, (STACK_BIAS + (32 * 8)), %o4
-
-	ldx	[%sp + STACK_BIAS + (32 * 8)], %o1
-	brgez,pt %o1, 1f
-	 nop
-
-	call	_dl_profile_invoke
-	 nop
-
-1:	jmp	%o0
-	 restore
-
-	cfi_endproc
-
-	.size	_dl_runtime_resolve_1, .-_dl_runtime_resolve_1
diff --git a/sysdeps/sparc/sparc64/elf/start.S b/sysdeps/sparc/sparc64/elf/start.S
index df44cae068..b0ef9d355d 100644
--- a/sysdeps/sparc/sparc64/elf/start.S
+++ b/sysdeps/sparc/sparc64/elf/start.S
@@ -48,7 +48,6 @@
 	.global _start
 	.type _start,#function
 _start:
-	cfi_startproc
 
 #ifdef SHARED
 	sethi	%hi(_GLOBAL_OFFSET_TABLE_-4), %l7
@@ -60,7 +59,6 @@ _start:
      drop their arguments.  */
 	mov	%g0, %fp
 	sub	%sp, 6*8, %sp
-	cfi_adjust_cfa_offset(6*8)
 
   /* Extract the arguments and environment as encoded on the stack.  The
      argument info starts after one register window (16 words) past the SP,
@@ -94,12 +92,4 @@ _start:
   /* Die very horribly if exit returns.  */
 	illtrap	0
 
-	cfi_endproc
-
 	.size _start, .-_start
-
-/* Define a symbol for the first piece of initialized data.  */
-	.data
-	.globl	__data_start
-__data_start:
-weak_alias (__data_start, data_start)
diff --git a/sysdeps/sparc/sparc64/fpu/libm-test-ulps b/sysdeps/sparc/sparc64/fpu/libm-test-ulps
index db5543e9eb..4888dd2149 100644
--- a/sysdeps/sparc/sparc64/fpu/libm-test-ulps
+++ b/sysdeps/sparc/sparc64/fpu/libm-test-ulps
@@ -33,14 +33,14 @@ ildouble: 1
 ldouble: 1
 
 # cacosh
-Test "Real part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
+Test "Real part of: cacosh (-2 - 3 i) == -1.9833870299165354323470769028940395 + 2.1414491111159960199416055713254211 i":
 double: 1
 float: 7
 idouble: 1
 ifloat: 7
 ildouble: 5
 ldouble: 5
-Test "Imaginary part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
+Test "Imaginary part of: cacosh (-2 - 3 i) == -1.9833870299165354323470769028940395 + 2.1414491111159960199416055713254211 i":
 double: 1
 float: 3
 idouble: 1
@@ -465,11 +465,6 @@ ifloat: 2
 ildouble: 1
 ldouble: 1
 
-# exp2
-Test "exp2 (10) == 1024":
-ildouble: 2
-ldouble: 2
-
 # expm1
 Test "expm1 (0.75) == 1.11700001661267466854536981983709561":
 double: 1
@@ -1197,10 +1192,6 @@ ifloat: 2
 ildouble: 1
 ldouble: 1
 
-Function: "exp2":
-ildouble: 2
-ldouble: 2
-
 Function: "expm1":
 double: 1
 float: 1
diff --git a/sysdeps/sparc/sparc64/jmpbuf-unwind.h b/sysdeps/sparc/sparc64/jmpbuf-unwind.h
deleted file mode 100644
index f7eed15ea1..0000000000
--- a/sysdeps/sparc/sparc64/jmpbuf-unwind.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by David S. Miller <davem@davemloft.net>, 2005.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <setjmp.h>
-#include <stdint.h>
-#include <unwind.h>
-
-/* Test if longjmp to JMPBUF would unwind the frame
-   containing a local variable at ADDRESS.  */
-#define _JMPBUF_UNWINDS(jmpbuf, address, demangle)			\
-  ((unsigned long int) (address) < (jmpbuf)->uc_mcontext.mc_fp + 2047)
-
-#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
-  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
-
-#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
-  ((uintptr_t) (_address) - (_adj) \
-   < (uintptr_t) (_jmpbuf)[0].uc_mcontext.mc_fp + 2047 - (_adj))
-
-/* We use the normal lobngjmp for unwinding.  */
-#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)
diff --git a/sysdeps/sparc/sparc64/memcmp.S b/sysdeps/sparc/sparc64/memcmp.S
index f9502d63f5..074767b983 100644
--- a/sysdeps/sparc/sparc64/memcmp.S
+++ b/sysdeps/sparc/sparc64/memcmp.S
@@ -139,5 +139,5 @@ ENTRY(memcmp)
 END(memcmp)
 
 #undef bcmp
-weak_alias (memcmp, bcmp)
+weak_alias(memcmp, bcmp)
 libc_hidden_builtin_def (memcmp)
diff --git a/sysdeps/sparc/sparc64/memcpy.S b/sysdeps/sparc/sparc64/memcpy.S
index 5993358017..3742573248 100644
--- a/sysdeps/sparc/sparc64/memcpy.S
+++ b/sysdeps/sparc/sparc64/memcpy.S
@@ -209,7 +209,6 @@ ENTRY(bcopy)
 END(bcopy)
 
 	.align		32
-ENTRY(__memcpy_large)
 200:	be,pt		%xcc, 201f			/* CTI				*/
 	 andcc		%o0, 0x38, %g5			/* IEU1		Group		*/
 	mov		8, %g1				/* IEU0				*/
@@ -444,7 +443,6 @@ ENTRY(__memcpy_large)
 	 stb		%o5, [%o0 - 1]			/* Store			*/
 209:	retl
 	 mov		%g4, %o0
-END(__memcpy_large)
 
 #ifdef USE_BPR
 
@@ -700,7 +698,6 @@ ENTRY(memcpy)
 END(memcpy)
 
 	.align		32
-ENTRY(__memmove_slowpath)
 228:	andcc		%o2, 1, %g0			/* IEU1		Group		*/
 	be,pt		%icc, 2f+4			/* CTI				*/
 1:	 ldub		[%o1 - 1], %o5			/* LOAD		Group		*/
@@ -721,7 +718,6 @@ ENTRY(__memmove_slowpath)
 	 mov		%g4, %o0
 219:	retl
 	 nop
-END(__memmove_slowpath)
 
 	.align		32
 ENTRY(memmove)
@@ -918,8 +914,8 @@ ENTRY(memmove)
 END(memmove)
 
 #ifdef USE_BPR
-weak_alias (memcpy, __align_cpy_1)
-weak_alias (memcpy, __align_cpy_2)
+weak_alias(memcpy, __align_cpy_1)
+weak_alias(memcpy, __align_cpy_2)
 #endif
 libc_hidden_builtin_def (memcpy)
 libc_hidden_builtin_def (memmove)
diff --git a/sysdeps/sparc/sparc64/memset.S b/sysdeps/sparc/sparc64/memset.S
index 99624ba9d7..b34ccc8869 100644
--- a/sysdeps/sparc/sparc64/memset.S
+++ b/sysdeps/sparc/sparc64/memset.S
@@ -312,4 +312,4 @@ ENTRY(__bzero)
 	 mov		%o5, %o0
 END(__bzero)
 
-weak_alias (__bzero, bzero)
+weak_alias(__bzero, bzero)
diff --git a/sysdeps/sparc/sparc64/soft-fp/Dist b/sysdeps/sparc/sparc64/soft-fp/Dist
new file mode 100644
index 0000000000..f98d85f7c2
--- /dev/null
+++ b/sysdeps/sparc/sparc64/soft-fp/Dist
@@ -0,0 +1,32 @@
+qp_add.c
+qp_cmp.c
+qp_cmpe.c
+qp_div.c
+qp_dtoq.c
+qp_feq.c
+qp_fge.c
+qp_fgt.c
+qp_fle.c
+qp_flt.c
+qp_fne.c
+qp_itoq.c
+qp_mul.c
+qp_neg.S
+qp_qtod.c
+qp_qtoi.c
+qp_qtos.c
+qp_qtoui.c
+qp_qtoux.c
+qp_qtox.c
+qp_sqrt.c
+qp_stoq.c
+qp_sub.c
+qp_uitoq.c
+qp_util.c
+qp_uxtoq.c
+qp_xtoq.c
+s_frexpl.c
+s_ilogbl.c
+s_scalblnl.c
+s_scalbnl.c
+sfp-machine.h
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_add.c b/sysdeps/sparc/sparc64/soft-fp/qp_add.c
index eced23fad8..bcfd0ff281 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_add.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_add.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    (*c) = (*a) + (*b)
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -29,10 +29,10 @@ void _Qp_add(long double *c, const long double *a, const long double *b)
   FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C);
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_QP(A, a);
-  FP_UNPACK_SEMIRAW_QP(B, b);
+  FP_UNPACK_QP(A, a);
+  FP_UNPACK_QP(B, b);
   FP_ADD_Q(C, A, B);
-  FP_PACK_SEMIRAW_QP(c, C);
+  FP_PACK_QP(c, C);
   QP_HANDLE_EXCEPTIONS(__asm (
 "	ldd [%1], %%f52\n"
 "	ldd [%1+8], %%f54\n"
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_dtoq.c b/sysdeps/sparc/sparc64/soft-fp/qp_dtoq.c
index 63f3d742aa..9ba2fac9ce 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_dtoq.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_dtoq.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    (*c) = (long double)(a)
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -31,13 +31,13 @@ void _Qp_dtoq(long double *c, const double a)
   FP_DECL_Q(C);
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_D(A, a);
+  FP_UNPACK_D(A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_EXTEND(Q,D,4,2,C,A);
+  FP_CONV(Q,D,4,2,C,A);
 #else
-  FP_EXTEND(Q,D,2,1,C,A);
+  FP_CONV(Q,D,2,1,C,A);
 #endif
-  FP_PACK_RAW_QP(c, C);
+  FP_PACK_QP(c, C);
   QP_HANDLE_EXCEPTIONS(__asm (
 "	fdtoq %1, %%f60\n"
 "	std %%f60, [%0]\n"
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_itoq.c b/sysdeps/sparc/sparc64/soft-fp/qp_itoq.c
index 310d70c77a..dd28b6a56e 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_itoq.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_itoq.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    (*c) = (long double)(a)
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -29,7 +29,7 @@ void _Qp_itoq(long double *c, const int a)
   FP_DECL_Q(C);
   int b = a;
 
-  FP_FROM_INT_Q(C, b, 32, unsigned int);
-  FP_PACK_RAW_QP(c, C);
+  FP_FROM_INT_Q(C, b, 32, int);
+  FP_PACK_QP(c, C);
   QP_NO_EXCEPTIONS;
 }
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_qtod.c b/sysdeps/sparc/sparc64/soft-fp/qp_qtod.c
index 2e5edadcb7..c86967a5d4 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_qtod.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_qtod.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return (double)(*a)
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -32,13 +32,13 @@ double _Qp_qtod(const long double *a)
   double r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_QP(A, a);
+  FP_UNPACK_QP(A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_TRUNC(D,Q,2,4,R,A);
+  FP_CONV(D,Q,2,4,R,A);
 #else
-  FP_TRUNC(D,Q,1,2,R,A);
+  FP_CONV(D,Q,1,2,R,A);
 #endif
-  FP_PACK_SEMIRAW_D(r, R);
+  FP_PACK_D(r, R);
   QP_HANDLE_EXCEPTIONS(__asm (
 "	ldd [%1], %%f52\n"
 "	ldd [%1+8], %%f54\n"
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c b/sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c
index a40253654a..cf8aba73c6 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return (int)(*a)
-   Copyright (C) 1997, 1999, 2004, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -28,10 +28,10 @@ int _Qp_qtoi(const long double *a)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
-  unsigned int r;
+  int r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_QP(A, a);
+  FP_UNPACK_QP(A, a);
   FP_TO_INT_Q(r, A, 32, 1);
   QP_HANDLE_EXCEPTIONS(
   	int rx;
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_qtos.c b/sysdeps/sparc/sparc64/soft-fp/qp_qtos.c
index f5f9cdb190..52d52d6830 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_qtos.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_qtos.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return (float)(*a)
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -32,13 +32,13 @@ float _Qp_qtos(const long double *a)
   float r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_QP(A, a);
+  FP_UNPACK_QP(A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_TRUNC(S,Q,1,4,R,A);
+  FP_CONV(S,Q,1,4,R,A);
 #else
-  FP_TRUNC(S,Q,1,2,R,A);
+  FP_CONV(S,Q,1,2,R,A);
 #endif
-  FP_PACK_SEMIRAW_S(r, R);
+  FP_PACK_S(r, R);
 
   QP_HANDLE_EXCEPTIONS(__asm (
 "	ldd [%1], %%f52\n"
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c b/sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c
index 884d23e527..abee50b06a 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return (unsigned int)(*a)
-   Copyright (C) 1997, 1999, 2004, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -31,7 +31,7 @@ unsigned int _Qp_qtoui(const long double *a)
   unsigned int r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_QP(A, a);
+  FP_UNPACK_QP(A, a);
   FP_TO_INT_Q(r, A, 32, -1);
   QP_HANDLE_EXCEPTIONS(
   	int rx;
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c b/sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c
index 4b6f265a47..87c8478880 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return (unsigned long)(*a)
-   Copyright (C) 1997, 1999, 2004, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -31,7 +31,7 @@ unsigned long _Qp_qtoux(const long double *a)
   unsigned long r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_QP(A, a);
+  FP_UNPACK_QP(A, a);
   FP_TO_INT_Q(r, A, 64, -1);
   QP_HANDLE_EXCEPTIONS(
 	unsigned long rx;
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_qtox.c b/sysdeps/sparc/sparc64/soft-fp/qp_qtox.c
index fac6166c2c..35481196ee 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_qtox.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_qtox.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return (long)(*a)
-   Copyright (C) 1997, 1999, 2004, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -28,10 +28,10 @@ long _Qp_qtox(const long double *a)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
-  unsigned long r;
+  long r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_QP(A, a);
+  FP_UNPACK_QP(A, a);
   FP_TO_INT_Q(r, A, 64, 1);
   QP_HANDLE_EXCEPTIONS(
 	long rx;
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_stoq.c b/sysdeps/sparc/sparc64/soft-fp/qp_stoq.c
index 1a4a03df88..655813186e 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_stoq.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_stoq.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    (*c) = (long double)(a)
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -31,13 +31,13 @@ void _Qp_stoq(long double *c, const float a)
   FP_DECL_Q(C);
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_S(A, a);
+  FP_UNPACK_S(A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_EXTEND(Q,S,4,1,C,A);
+  FP_CONV(Q,S,4,1,C,A);
 #else
-  FP_EXTEND(Q,S,2,1,C,A);
+  FP_CONV(Q,S,2,1,C,A);
 #endif
-  FP_PACK_RAW_QP(c, C);
+  FP_PACK_QP(c, C);
   QP_HANDLE_EXCEPTIONS(__asm (
 "	fstoq %1, %%f60\n"
 "	std %%f60, [%0]\n"
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_sub.c b/sysdeps/sparc/sparc64/soft-fp/qp_sub.c
index 056224fb46..b1ed15a588 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_sub.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_sub.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    (*c) = (*a) - (*b)
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -29,10 +29,10 @@ void _Qp_sub(long double *c, const long double *a, const long double *b)
   FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C);
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_QP(A, a);
-  FP_UNPACK_SEMIRAW_QP(B, b);
+  FP_UNPACK_QP(A, a);
+  FP_UNPACK_QP(B, b);
   FP_SUB_Q(C, A, B);
-  FP_PACK_SEMIRAW_QP(c, C);
+  FP_PACK_QP(c, C);
   QP_HANDLE_EXCEPTIONS(__asm (
 "	ldd [%1], %%f52\n"
 "	ldd [%1+8], %%f54\n"
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_uitoq.c b/sysdeps/sparc/sparc64/soft-fp/qp_uitoq.c
index a3bfaedfc9..d143ba28d3 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_uitoq.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_uitoq.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    (*c) = (long double)(a)
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -29,7 +29,7 @@ void _Qp_uitoq(long double *c, const unsigned int a)
   FP_DECL_Q(C);
   unsigned int b = a;
 
-  FP_FROM_INT_Q(C, b, 32, unsigned int);
-  FP_PACK_RAW_QP(c, C);
+  FP_FROM_INT_Q(C, b, 32, int);
+  FP_PACK_QP(c, C);
   QP_NO_EXCEPTIONS;
 }
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_uxtoq.c b/sysdeps/sparc/sparc64/soft-fp/qp_uxtoq.c
index f691e4d36f..302147711c 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_uxtoq.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_uxtoq.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    (*c) = (long double)(a)
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -29,7 +29,7 @@ void _Qp_uxtoq(long double *c, const unsigned long a)
   FP_DECL_Q(C);
   unsigned long b = a;
 
-  FP_FROM_INT_Q(C, b, 64, unsigned long);
-  FP_PACK_RAW_QP(c, C);
+  FP_FROM_INT_Q(C, b, 64, long);
+  FP_PACK_QP(c, C);
   QP_NO_EXCEPTIONS;
 }
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_xtoq.c b/sysdeps/sparc/sparc64/soft-fp/qp_xtoq.c
index b7a6102693..9b4d16969e 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_xtoq.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_xtoq.c
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    (*c) = (long double)(*a)
-   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
@@ -29,7 +29,7 @@ void _Qp_xtoq(long double *c, const long a)
   FP_DECL_Q(C);
   long b = a;
 
-  FP_FROM_INT_Q(C, b, 64, unsigned long);
-  FP_PACK_RAW_QP(c, C);
+  FP_FROM_INT_Q(C, b, 64, long);
+  FP_PACK_QP(c, C);
   QP_NO_EXCEPTIONS;
 }
diff --git a/sysdeps/sparc/sparc64/soft-fp/sfp-machine.h b/sysdeps/sparc/sparc64/soft-fp/sfp-machine.h
index 449e955c16..42e6aa8506 100644
--- a/sysdeps/sparc/sparc64/soft-fp/sfp-machine.h
+++ b/sysdeps/sparc/sparc64/soft-fp/sfp-machine.h
@@ -1,6 +1,6 @@
 /* Machine-dependent software floating-point definitions.
    Sparc64 userland (_Q_* and _Qp_*) version.
-   Copyright (C) 1997, 1998, 1999, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz) and
@@ -23,7 +23,6 @@
    
 #include <fpu_control.h>
 #include <fenv.h>
-#include <stdlib.h>
 
 #define _FP_W_TYPE_SIZE		64
 #define _FP_W_TYPE		unsigned long
diff --git a/sysdeps/sparc/sparc64/sparcv9b/memcpy.S b/sysdeps/sparc/sparc64/sparcv9b/memcpy.S
index 760d526630..8b70b0a932 100644
--- a/sysdeps/sparc/sparc64/sparcv9b/memcpy.S
+++ b/sysdeps/sparc/sparc64/sparcv9b/memcpy.S
@@ -600,11 +600,11 @@ ENTRY(memmove)
 END(memmove)
 
 #ifdef USE_BPR
-weak_alias (memcpy, __align_cpy_1)
-weak_alias (memcpy, __align_cpy_2)
-weak_alias (memcpy, __align_cpy_4)
-weak_alias (memcpy, __align_cpy_8)
-weak_alias (memcpy, __align_cpy_16)
+weak_alias(memcpy, __align_cpy_1)
+weak_alias(memcpy, __align_cpy_2)
+weak_alias(memcpy, __align_cpy_4)
+weak_alias(memcpy, __align_cpy_8)
+weak_alias(memcpy, __align_cpy_16)
 #endif
 libc_hidden_builtin_def (memcpy)
 libc_hidden_builtin_def (memmove)
diff --git a/sysdeps/sparc/sparc64/sparcv9v/memcpy.S b/sysdeps/sparc/sparc64/sparcv9v/memcpy.S
deleted file mode 100644
index 05c837fa25..0000000000
--- a/sysdeps/sparc/sparc64/sparcv9v/memcpy.S
+++ /dev/null
@@ -1,593 +0,0 @@
-/* Copy SIZE bytes from SRC to DEST.  For SUN4V Niagara.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by David S. Miller (davem@davemloft.net)
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <sysdep.h>
-
-#define ASI_BLK_INIT_QUAD_LDD_P	0xe2
-#define ASI_P			0x80
-#define ASI_PNF			0x82
-
-#define LOAD(type,addr,dest)	type##a [addr] ASI_P, dest
-#define LOAD_TWIN(addr_reg,dest0,dest1)	\
-	ldda [addr_reg] ASI_BLK_INIT_QUAD_LDD_P, dest0
-
-#define STORE(type,src,addr)	type src, [addr]
-#define STORE_INIT(src,addr)	stxa src, [addr] %asi
-
-#ifndef XCC
-#define USE_BPR
-#define XCC xcc
-#endif
-
-	.register	%g2,#scratch
-	.register	%g3,#scratch
-	.register	%g6,#scratch
-
-	.text
-	.align		32
-
-ENTRY(bcopy)
-	sub		%o1, %o0, %o4
-	mov		%o0, %g4
-	cmp		%o4, %o2
-	mov		%o1, %o0
-	bgeu,pt		%XCC, 100f
-	 mov		%g4, %o1
-#ifndef USE_BPR
-	srl		%o2, 0, %o2
-#endif
-	brnz,pn		%o2, 220f
-	 add		%o0, %o2, %o0
-	retl
-	 nop
-END(bcopy)
-
-	.align		32
-ENTRY(memcpy)
-100:	/* %o0=dst, %o1=src, %o2=len */
-	mov		%o0, %g5
-	cmp		%o2, 0
-	be,pn		%XCC, 85f
-218:	 or		%o0, %o1, %o3
-	cmp		%o2, 16
-	blu,a,pn	%XCC, 80f
-	 or		%o3, %o2, %o3
-
-	/* 2 blocks (128 bytes) is the minimum we can do the block
-	 * copy with.  We need to ensure that we'll iterate at least
-	 * once in the block copy loop.  At worst we'll need to align
-	 * the destination to a 64-byte boundary which can chew up
-	 * to (64 - 1) bytes from the length before we perform the
-	 * block copy loop.
-	 */
-	cmp		%o2, (2 * 64)
-	blu,pt		%XCC, 70f
-	 andcc		%o3, 0x7, %g0
-
-	/* %o0:	dst
-	 * %o1:	src
-	 * %o2:	len  (known to be >= 128)
-	 *
-	 * The block copy loops will use %o4/%o5,%g2/%g3 as
-	 * temporaries while copying the data.
-	 */
-
-	LOAD(prefetch, %o1, #one_read)
-	wr		%g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
-
-	/* Align destination on 64-byte boundary.  */
-	andcc		%o0, (64 - 1), %o4
-	be,pt		%XCC, 2f
-	 sub		%o4, 64, %o4
-	sub		%g0, %o4, %o4	! bytes to align dst
-	sub		%o2, %o4, %o2
-1:	subcc		%o4, 1, %o4
-	LOAD(ldub, %o1, %g1)
-	STORE(stb, %g1, %o0)
-	add		%o1, 1, %o1
-	bne,pt		%XCC, 1b
-	add		%o0, 1, %o0
-
-	/* If the source is on a 16-byte boundary we can do
-	 * the direct block copy loop.  If it is 8-byte aligned
-	 * we can do the 16-byte loads offset by -8 bytes and the
-	 * init stores offset by one register.
-	 *
-	 * If the source is not even 8-byte aligned, we need to do
-	 * shifting and masking (basically integer faligndata).
-	 *
-	 * The careful bit with init stores is that if we store
-	 * to any part of the cache line we have to store the whole
-	 * cacheline else we can end up with corrupt L2 cache line
-	 * contents.  Since the loop works on 64-bytes of 64-byte
-	 * aligned store data at a time, this is easy to ensure.
-	 */
-2:
-	andcc		%o1, (16 - 1), %o4
-	andn		%o2, (64 - 1), %g1	! block copy loop iterator
-	sub		%o2, %g1, %o2		! final sub-block copy bytes
-	be,pt		%XCC, 50f
-	 cmp		%o4, 8
-	be,a,pt		%XCC, 10f
-	 sub		%o1, 0x8, %o1
-
-	/* Neither 8-byte nor 16-byte aligned, shift and mask.  */
-	mov		%g1, %o4
-	and		%o1, 0x7, %g1
-	sll		%g1, 3, %g1
-	mov		64, %o3
-	andn		%o1, 0x7, %o1
-	LOAD(ldx, %o1, %g2)
-	sub		%o3, %g1, %o3
-	sllx		%g2, %g1, %g2
-
-#define SWIVEL_ONE_DWORD(SRC, TMP1, TMP2, PRE_VAL, PRE_SHIFT, POST_SHIFT, DST)\
-	LOAD(ldx, SRC, TMP1); \
-	srlx		TMP1, PRE_SHIFT, TMP2; \
-	or		TMP2, PRE_VAL, TMP2; \
-	STORE_INIT(TMP2, DST); \
-	sllx		TMP1, POST_SHIFT, PRE_VAL;
-
-1:	add		%o1, 0x8, %o1
-	SWIVEL_ONE_DWORD(%o1, %g3, %o5, %g2, %o3, %g1, %o0 + 0x00)
-	add		%o1, 0x8, %o1
-	SWIVEL_ONE_DWORD(%o1, %g3, %o5, %g2, %o3, %g1, %o0 + 0x08)
-	add		%o1, 0x8, %o1
-	SWIVEL_ONE_DWORD(%o1, %g3, %o5, %g2, %o3, %g1, %o0 + 0x10)
-	add		%o1, 0x8, %o1
-	SWIVEL_ONE_DWORD(%o1, %g3, %o5, %g2, %o3, %g1, %o0 + 0x18)
-	add		%o1, 32, %o1
-	LOAD(prefetch, %o1, #one_read)
-	sub		%o1, 32 - 8, %o1
-	SWIVEL_ONE_DWORD(%o1, %g3, %o5, %g2, %o3, %g1, %o0 + 0x20)
-	add		%o1, 8, %o1
-	SWIVEL_ONE_DWORD(%o1, %g3, %o5, %g2, %o3, %g1, %o0 + 0x28)
-	add		%o1, 8, %o1
-	SWIVEL_ONE_DWORD(%o1, %g3, %o5, %g2, %o3, %g1, %o0 + 0x30)
-	add		%o1, 8, %o1
-	SWIVEL_ONE_DWORD(%o1, %g3, %o5, %g2, %o3, %g1, %o0 + 0x38)
-	subcc		%o4, 64, %o4
-	bne,pt		%XCC, 1b
-	 add		%o0, 64, %o0
-
-#undef SWIVEL_ONE_DWORD
-
-	srl		%g1, 3, %g1
-	ba,pt		%XCC, 60f
-	 add		%o1, %g1, %o1
-
-10:	/* Destination is 64-byte aligned, source was only 8-byte
-	 * aligned but it has been subtracted by 8 and we perform
-	 * one twin load ahead, then add 8 back into source when
-	 * we finish the loop.
-	 */
-	LOAD_TWIN(%o1, %o4, %o5)
-1:	add		%o1, 16, %o1
-	LOAD_TWIN(%o1, %g2, %g3)
-	add		%o1, 16 + 32, %o1
-	LOAD(prefetch, %o1, #one_read)
-	sub		%o1, 32, %o1
-	STORE_INIT(%o5, %o0 + 0x00)		! initializes cache line
-	STORE_INIT(%g2, %o0 + 0x08)
-	LOAD_TWIN(%o1, %o4, %o5)
-	add		%o1, 16, %o1
-	STORE_INIT(%g3, %o0 + 0x10)
-	STORE_INIT(%o4, %o0 + 0x18)
-	LOAD_TWIN(%o1, %g2, %g3)
-	add		%o1, 16, %o1
-	STORE_INIT(%o5, %o0 + 0x20)
-	STORE_INIT(%g2, %o0 + 0x28)
-	LOAD_TWIN(%o1, %o4, %o5)
-	STORE_INIT(%g3, %o0 + 0x30)
-	STORE_INIT(%o4, %o0 + 0x38)
-	subcc		%g1, 64, %g1
-	bne,pt		%XCC, 1b
-	 add		%o0, 64, %o0
-
-	ba,pt		%XCC, 60f
-	 add		%o1, 0x8, %o1
-
-50:	/* Destination is 64-byte aligned, and source is 16-byte
-	 * aligned.
-	 */
-1:	LOAD_TWIN(%o1, %o4, %o5)
-	add	%o1, 16, %o1
-	LOAD_TWIN(%o1, %g2, %g3)
-	add	%o1, 16 + 32, %o1
-	LOAD(prefetch, %o1, #one_read)
-	sub	%o1, 32, %o1
-	STORE_INIT(%o4, %o0 + 0x00)		! initializes cache line
-	STORE_INIT(%o5, %o0 + 0x08)
-	LOAD_TWIN(%o1, %o4, %o5)
-	add	%o1, 16, %o1
-	STORE_INIT(%g2, %o0 + 0x10)
-	STORE_INIT(%g3, %o0 + 0x18)
-	LOAD_TWIN(%o1, %g2, %g3)
-	add	%o1, 16, %o1
-	STORE_INIT(%o4, %o0 + 0x20)
-	STORE_INIT(%o5, %o0 + 0x28)
-	STORE_INIT(%g2, %o0 + 0x30)
-	STORE_INIT(%g3, %o0 + 0x38)
-	subcc	%g1, 64, %g1
-	bne,pt	%XCC, 1b
-	 add	%o0, 64, %o0
-	/* fall through */
-
-60:
-	/* %o2 contains any final bytes still needed to be copied
-	 * over. If anything is left, we copy it one byte at a time.
-	 */
-	wr		%g0, ASI_PNF, %asi
-	brz,pt		%o2, 85f
-	 sub		%o0, %o1, %o3
-	ba,a,pt		%XCC, 90f
-
-	.align		64
-70: /* 16 < len <= 64 */
-	bne,pn		%XCC, 75f
-	 sub		%o0, %o1, %o3
-
-72:
-	andn		%o2, 0xf, %o4
-	and		%o2, 0xf, %o2
-1:	subcc		%o4, 0x10, %o4
-	LOAD(ldx, %o1, %o5)
-	add		%o1, 0x08, %o1
-	LOAD(ldx, %o1, %g1)
-	sub		%o1, 0x08, %o1
-	STORE(stx, %o5, %o1 + %o3)
-	add		%o1, 0x8, %o1
-	STORE(stx, %g1, %o1 + %o3)
-	bgu,pt		%XCC, 1b
-	 add		%o1, 0x8, %o1
-73:	andcc		%o2, 0x8, %g0
-	be,pt		%XCC, 1f
-	 nop
-	sub		%o2, 0x8, %o2
-	LOAD(ldx, %o1, %o5)
-	STORE(stx, %o5, %o1 + %o3)
-	add		%o1, 0x8, %o1
-1:	andcc		%o2, 0x4, %g0
-	be,pt		%XCC, 1f
-	 nop
-	sub		%o2, 0x4, %o2
-	LOAD(lduw, %o1, %o5)
-	STORE(stw, %o5, %o1 + %o3)
-	add		%o1, 0x4, %o1
-1:	cmp		%o2, 0
-	be,pt		%XCC, 85f
-	 nop
-	ba,pt		%XCC, 90f
-	 nop
-
-75:
-	andcc		%o0, 0x7, %g1
-	sub		%g1, 0x8, %g1
-	be,pn		%icc, 2f
-	 sub		%g0, %g1, %g1
-	sub		%o2, %g1, %o2
-
-1:	subcc		%g1, 1, %g1
-	LOAD(ldub, %o1, %o5)
-	STORE(stb, %o5, %o1 + %o3)
-	bgu,pt		%icc, 1b
-	 add		%o1, 1, %o1
-
-2:	add		%o1, %o3, %o0
-	andcc		%o1, 0x7, %g1
-	bne,pt		%icc, 8f
-	 sll		%g1, 3, %g1
-
-	cmp		%o2, 16
-	bgeu,pt		%icc, 72b
-	 nop
-	ba,a,pt		%XCC, 73b
-
-8:	mov		64, %o3
-	andn		%o1, 0x7, %o1
-	LOAD(ldx, %o1, %g2)
-	sub		%o3, %g1, %o3
-	andn		%o2, 0x7, %o4
-	sllx		%g2, %g1, %g2
-1:	add		%o1, 0x8, %o1
-	LOAD(ldx, %o1, %g3)
-	subcc		%o4, 0x8, %o4
-	srlx		%g3, %o3, %o5
-	or		%o5, %g2, %o5
-	STORE(stx, %o5, %o0)
-	add		%o0, 0x8, %o0
-	bgu,pt		%icc, 1b
-	 sllx		%g3, %g1, %g2
-
-	srl		%g1, 3, %g1
-	andcc		%o2, 0x7, %o2
-	be,pn		%icc, 85f
-	 add		%o1, %g1, %o1
-	ba,pt		%XCC, 90f
-	 sub		%o0, %o1, %o3
-
-	.align		64
-80: /* 0 < len <= 16 */
-	andcc		%o3, 0x3, %g0
-	bne,pn		%XCC, 90f
-	 sub		%o0, %o1, %o3
-
-1:
-	subcc		%o2, 4, %o2
-	LOAD(lduw, %o1, %g1)
-	STORE(stw, %g1, %o1 + %o3)
-	bgu,pt		%XCC, 1b
-	 add		%o1, 4, %o1
-
-85:	retl
-	 mov		%g5, %o0
-
-	.align		32
-90:
-	subcc		%o2, 1, %o2
-	LOAD(ldub, %o1, %g1)
-	STORE(stb, %g1, %o1 + %o3)
-	bgu,pt		%XCC, 90b
-	 add		%o1, 1, %o1
-	retl
-	 mov		%g5, %o0
-
-END(memcpy)
-
-#define RMOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3)	\
-	ldx		[%src - offset - 0x20], %t0; 		\
-	ldx		[%src - offset - 0x18], %t1; 		\
-	ldx		[%src - offset - 0x10], %t2; 		\
-	ldx		[%src - offset - 0x08], %t3; 		\
-	stw		%t0, [%dst - offset - 0x1c]; 		\
-	srlx		%t0, 32, %t0;				\
-	stw		%t0, [%dst - offset - 0x20]; 		\
-	stw		%t1, [%dst - offset - 0x14]; 		\
-	srlx		%t1, 32, %t1;				\
-	stw		%t1, [%dst - offset - 0x18]; 		\
-	stw		%t2, [%dst - offset - 0x0c]; 		\
-	srlx		%t2, 32, %t2;				\
-	stw		%t2, [%dst - offset - 0x10]; 		\
-	stw		%t3, [%dst - offset - 0x04];		\
-	srlx		%t3, 32, %t3;				\
-	stw		%t3, [%dst - offset - 0x08];
-
-#define RMOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3)	\
-	ldx		[%src - offset - 0x20], %t0; 		\
-	ldx		[%src - offset - 0x18], %t1; 		\
-	ldx		[%src - offset - 0x10], %t2; 		\
-	ldx		[%src - offset - 0x08], %t3; 		\
-	stx		%t0, [%dst - offset - 0x20]; 		\
-	stx		%t1, [%dst - offset - 0x18]; 		\
-	stx		%t2, [%dst - offset - 0x10]; 		\
-	stx		%t3, [%dst - offset - 0x08];		\
-	ldx		[%src - offset - 0x40], %t0; 		\
-	ldx		[%src - offset - 0x38], %t1; 		\
-	ldx		[%src - offset - 0x30], %t2; 		\
-	ldx		[%src - offset - 0x28], %t3; 		\
-	stx		%t0, [%dst - offset - 0x40]; 		\
-	stx		%t1, [%dst - offset - 0x38]; 		\
-	stx		%t2, [%dst - offset - 0x30]; 		\
-	stx		%t3, [%dst - offset - 0x28];
-
-#define RMOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3)	\
-	ldx		[%src + offset + 0x00], %t0;		\
-	ldx		[%src + offset + 0x08], %t1; 		\
-	stw		%t0, [%dst + offset + 0x04]; 		\
-	srlx		%t0, 32, %t2;				\
-	stw		%t2, [%dst + offset + 0x00]; 		\
-	stw		%t1, [%dst + offset + 0x0c]; 		\
-	srlx		%t1, 32, %t3;				\
-	stw		%t3, [%dst + offset + 0x08];
-
-#define RMOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1)		\
-	ldx		[%src + offset + 0x00], %t0; 		\
-	ldx		[%src + offset + 0x08], %t1; 		\
-	stx		%t0, [%dst + offset + 0x00]; 		\
-	stx		%t1, [%dst + offset + 0x08];
-
-	.align		32
-228:	andcc		%o2, 1, %g0
-	be,pt		%icc, 2f+4
-1:	 ldub		[%o1 - 1], %o5
-	sub		%o1, 1, %o1
-	sub		%o0, 1, %o0
-	subcc		%o2, 1, %o2
-	be,pn		%xcc, 229f
-	 stb		%o5, [%o0]
-2:	ldub		[%o1 - 1], %o5
-	sub		%o0, 2, %o0
-	ldub		[%o1 - 2], %g5
-	sub		%o1, 2, %o1
-	subcc		%o2, 2, %o2
-	stb		%o5, [%o0 + 1]
-	bne,pt		%xcc, 2b
-	 stb		%g5, [%o0]
-229:	retl
-	 mov		%g4, %o0
-out:	retl
-	 mov		%g5, %o0
-
-	.align		32
-ENTRY(memmove)
-	mov		%o0, %g5
-#ifndef USE_BPR
-	srl		%o2, 0, %o2
-#endif
-	brz,pn		%o2, out
-	 sub		%o0, %o1, %o4
-	cmp		%o4, %o2
-	bgeu,pt		%XCC, 218b
-	 mov		%o0, %g4
-	add		%o0, %o2, %o0
-220:	add		%o1, %o2, %o1
-	cmp		%o2, 15
-	bleu,pn		%xcc, 228b
-	 andcc		%o0, 7, %g2
-	sub		%o0, %o1, %g5
-	andcc		%g5, 3, %o5
-	bne,pn		%xcc, 232f
-	 andcc		%o1, 3, %g0
-	be,a,pt		%xcc, 236f
-	 andcc		%o1, 4, %g0
-	andcc		%o1, 1, %g0
-	be,pn		%xcc, 4f
-	 andcc		%o1, 2, %g0
-	ldub		[%o1 - 1], %g2
-	sub		%o1, 1, %o1
-	sub		%o0, 1, %o0
-	sub		%o2, 1, %o2
-	be,pn		%xcc, 5f
-	 stb		%g2, [%o0]
-4:	lduh		[%o1 - 2], %g2
-	sub		%o1, 2, %o1
-	sub		%o0, 2, %o0
-	sub		%o2, 2, %o2
-	sth		%g2, [%o0]
-5:	andcc		%o1, 4, %g0
-236:	be,a,pn		%xcc, 2f
-	 andcc		%o2, -128, %g6
-	lduw		[%o1 - 4], %g5
-	sub		%o1, 4, %o1
-	sub		%o0, 4, %o0
-	sub		%o2, 4, %o2
-	stw		%g5, [%o0]
-	andcc		%o2, -128, %g6
-2:	be,pn		%xcc, 235f
-	 andcc		%o0, 4, %g0
-	be,pn		%xcc, 282f + 4
-5:	RMOVE_BIGCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
-	RMOVE_BIGCHUNK(o1, o0, 0x20, g1, g3, g5, o5)
-	RMOVE_BIGCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
-	RMOVE_BIGCHUNK(o1, o0, 0x60, g1, g3, g5, o5)
-	subcc		%g6, 128, %g6
-	sub		%o1, 128, %o1
-	bne,pt		%xcc, 5b
-	 sub		%o0, 128, %o0
-235:	andcc		%o2, 0x70, %g6
-41:	be,pn		%xcc, 280f
-	 andcc		%o2, 8, %g0
-
-279:	rd		%pc, %o5
-	sll		%g6, 1, %g5
-	sub		%o1, %g6, %o1
-	sub		%o5, %g5, %o5
-	jmpl		%o5 + %lo(280f - 279b), %g0
-	 sub		%o0, %g6, %o0
-	RMOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g5, o5)
-	RMOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g5, o5)
-	RMOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g5, o5)
-	RMOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g5, o5)
-	RMOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g5, o5)
-	RMOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g5, o5)
-	RMOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g5, o5)
-280:	be,pt		%xcc, 281f
-	 andcc		%o2, 4, %g0
-	ldx		[%o1 - 8], %g2
-	sub		%o0, 8, %o0
-	stw		%g2, [%o0 + 4]
-	sub		%o1, 8, %o1
-	srlx		%g2, 32, %g2
-	stw		%g2, [%o0]
-281:	be,pt		%xcc, 1f
-	 andcc		%o2, 2, %g0
-	lduw		[%o1 - 4], %g2
-	sub		%o1, 4, %o1
-	stw		%g2, [%o0 - 4]
-	sub		%o0, 4, %o0
-1:	be,pt		%xcc, 1f
-	 andcc		%o2, 1, %g0
-	lduh		[%o1 - 2], %g2
-	sub		%o1, 2, %o1
-	sth		%g2, [%o0 - 2]
-	sub		%o0, 2, %o0
-1:	be,pt		%xcc, 211f
-	 nop
-	ldub		[%o1 - 1], %g2
-	stb		%g2, [%o0 - 1]
-211:	retl
-	 mov		%g4, %o0
-
-282:	RMOVE_BIGALIGNCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
-	RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
-	subcc		%g6, 128, %g6
-	sub		%o1, 128, %o1
-	bne,pt		%xcc, 282b
-	 sub		%o0, 128, %o0
-	andcc		%o2, 0x70, %g6
-	be,pn		%xcc, 284f
-	 andcc		%o2, 8, %g0
-
-283:	rd		%pc, %o5
-	sub		%o1, %g6, %o1
-	sub		%o5, %g6, %o5
-	jmpl		%o5 + %lo(284f - 283b), %g0
-	 sub		%o0, %g6, %o0
-	RMOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3)
-	RMOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3)
-	RMOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3)
-	RMOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3)
-	RMOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3)
-	RMOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3)
-	RMOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3)
-284:	be,pt		%xcc, 285f
-	 andcc		%o2, 4, %g0
-	ldx		[%o1 - 8], %g2
-	sub		%o0, 8, %o0
-	sub		%o1, 8, %o1
-	stx		%g2, [%o0]
-285:	be,pt		%xcc, 1f
-	 andcc		%o2, 2, %g0
-	lduw		[%o1 - 4], %g2
-	sub		%o0, 4, %o0
-	sub		%o1, 4, %o1
-	stw		%g2, [%o0]
-1:	be,pt		%xcc, 1f
-	 andcc		%o2, 1, %g0
-	lduh		[%o1 - 2], %g2
-	sub		%o0, 2, %o0
-	sub		%o1, 2, %o1
-	sth		%g2, [%o0]
-1:	be,pt		%xcc, 1f
-	 nop
-	ldub		[%o1 - 1], %g2
-	stb		%g2, [%o0 - 1]
-1:	retl
-	 mov		%g4, %o0
-
-232:	ldub		[%o1 - 1], %g5
-	sub		%o1, 1, %o1
-	sub		%o0, 1, %o0
-	subcc		%o2, 1, %o2
-	bne,pt		%xcc, 232b
-	 stb		%g5, [%o0]
-234:	retl
-	 mov		%g4, %o0
-END(memmove)
-
-#ifdef USE_BPR
-weak_alias (memcpy, __align_cpy_1)
-weak_alias (memcpy, __align_cpy_2)
-weak_alias (memcpy, __align_cpy_4)
-weak_alias (memcpy, __align_cpy_8)
-weak_alias (memcpy, __align_cpy_16)
-#endif
-libc_hidden_builtin_def (memcpy)
-libc_hidden_builtin_def (memmove)
diff --git a/sysdeps/sparc/sparc64/sparcv9v/memset.S b/sysdeps/sparc/sparc64/sparcv9v/memset.S
deleted file mode 100644
index ac0a50cf8e..0000000000
--- a/sysdeps/sparc/sparc64/sparcv9v/memset.S
+++ /dev/null
@@ -1,127 +0,0 @@
-/* Set a block of memory to some byte value.  For SUN4V Niagara.
-   Copyright (C) 2006 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by David S. Miller (davem@davemloft.net)
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <sysdep.h>
-
-#define ASI_BLK_INIT_QUAD_LDD_P	0xe2
-#define ASI_P			0x80
-#define ASI_PNF			0x82
-
-#ifndef XCC
-#define USE_BPR
-#define XCC xcc
-#endif
-
-	.register	%g2,#scratch
-
-	.text
-	.align		32
-
-ENTRY(memset)
-	/* %o0=buf, %o1=pat, %o2=len */
-	and		%o1, 0xff, %o3
-	mov		%o2, %o1
-	sllx		%o3, 8, %g1
-	or		%g1, %o3, %o2
-	sllx		%o2, 16, %g1
-	or		%g1, %o2, %o2
-	sllx		%o2, 32, %g1
-	ba,pt		%XCC, 1f
-	 or		%g1, %o2, %o2
-END(memset)
-
-ENTRY(__bzero)
-	clr		%o2
-1:	brz,pn		%o1, 90f
-	 mov		%o0, %o3
-
-	wr		%g0, ASI_P, %asi
-
-	cmp		%o1, 15
-	bl,pn		%icc, 70f
-	 andcc		%o0, 0x7, %g1
-	be,pt		%XCC, 2f
-	 mov		8, %g2
-	sub		%g2, %g1, %g1
-	sub		%o1, %g1, %o1
-1:	stba		%o2, [%o0 + 0x00] %asi
-	subcc		%g1, 1, %g1
-	bne,pt		%XCC, 1b
-	 add		%o0, 1, %o0
-2:	cmp		%o1, 128
-	bl,pn		%icc, 60f
-	 andcc		%o0, (64 - 1), %g1
-	be,pt		%XCC, 40f
-	 mov		64, %g2
-	sub		%g2, %g1, %g1
-	sub		%o1, %g1, %o1
-1:	stxa		%o2, [%o0 + 0x00] %asi
-	subcc		%g1, 8, %g1
-	bne,pt		%XCC, 1b
-	 add		%o0, 8, %o0
-
-40:
-	wr		%g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
-	andn		%o1, (64 - 1), %g1
-	sub		%o1, %g1, %o1
-50:
-	stxa		%o2, [%o0 + 0x00] %asi
-	stxa		%o2, [%o0 + 0x08] %asi
-	stxa		%o2, [%o0 + 0x10] %asi
-	stxa		%o2, [%o0 + 0x18] %asi
-	stxa		%o2, [%o0 + 0x20] %asi
-	stxa		%o2, [%o0 + 0x28] %asi
-	stxa		%o2, [%o0 + 0x30] %asi
-	stxa		%o2, [%o0 + 0x38] %asi
-	subcc		%g1, 64, %g1
-	bne,pt		%XCC, 50b
-	 add		%o0, 64, %o0
-
-	wr		%g0, ASI_P, %asi
-	brz,pn		%o1, 80f
-60:
-	 andncc		%o1, 0x7, %g1
-	be,pn		%XCC, 2f
-	 sub		%o1, %g1, %o1
-1:	stxa		%o2, [%o0 + 0x00] %asi
-	subcc		%g1, 8, %g1
-	bne,pt		%XCC, 1b
-	 add		%o0, 8, %o0
-2:	brz,pt		%o1, 80f
-	 nop
-
-70:
-1:	stba		%o2, [%o0 + 0x00] %asi
-	subcc		%o1, 1, %o1
-	bne,pt		%icc, 1b
-	 add		%o0, 1, %o0
-
-	/* fallthrough */
-
-80:
-	wr		%g0, ASI_PNF, %asi
-
-90:
-	retl
-	 mov		%o3, %o0
-END(__bzero)
-
-libc_hidden_builtin_def (memset)
-weak_alias (__bzero, bzero)