summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2010-02-25 23:52:07 -0800
committerDavid S. Miller <davem@davemloft.net>2010-02-25 23:58:51 -0800
commit3afd5a3b555694361181f854f658f669105d0ad6 (patch)
tree6b4df892f2d5be5ff3f777ed186153ff6765b173
parente44f6f89da537816aff71d926a0b774a77545b48 (diff)
downloadglibc-3afd5a3b555694361181f854f658f669105d0ad6.tar.gz
sparc: Add multiarch support for memset/bzero/memcpy.davem/sparc
2010-02-25 David S. Miller <davem@davemloft.net> * sysdeps/sparc/elf/rtld-global-offsets.sym: New file. * sysdeps/sparc/Makefile (csu): Add rtld-global-offsets.sym to gen-as-const-headers. * sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile: New file. * sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S: New file. * sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S: New file. * sysdeps/sparc/sparc32/sparcv9/sparcv9b/memcpy.S: Move to... * sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra3.S: ...here. * sysdeps/sparc/sparc32/sparcv9/sparcv9v/memcpy.S: Move to... * sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara1.S: ...here. * sysdeps/sparc/sparc32/sparcv9/sparcv9v/memset.S: Move to... * sysdeps/sparc/sparc32/sparcv9/multiarch/memset-niagara1.S: ...here. * sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memcpy.S: Move to... * sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara2.S: ...here. * sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memset.S: Removed. * sysdeps/sparc/sparc64/multiarch/Makefile: New file. * sysdeps/sparc/sparc64/sparcv9v/memcpy.S: Move to... * sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S: ...here. * sysdeps/sparc/sparc64/sparcv9v2/memcpy.S: Move to... * sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S: ...here. * sysdeps/sparc/sparc64/sparcv9b/memcpy.S: Move to... * sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: ...here. * sysdeps/sparc/sparc64/sparcv9v/memset.S: Move to... * sysdeps/sparc/sparc64/multiarch/memset-niagara1.S: ...here. * sysdeps/sparc/sparc64/sparcv9v2/memset.S: Removed. * sysdeps/sparc/sparc64/multiarch/memcpy.S: New file. * sysdeps/sparc/sparc64/multiarch/memset.S: New file.
-rw-r--r--ChangeLog28
-rw-r--r--sysdeps/sparc/Makefile5
-rw-r--r--sysdeps/sparc/elf/rtld-global-offsets.sym7
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara1.S2
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara2.S2
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra3.S2
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/multiarch/memset-niagara1.S2
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/sparcv9b/memcpy.S2
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/sparcv9v/memcpy.S2
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/sparcv9v/memset.S2
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memcpy.S2
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memset.S2
-rw-r--r--sysdeps/sparc/sparc64/multiarch/Makefile4
-rw-r--r--sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S (renamed from sysdeps/sparc/sparc64/sparcv9v/memcpy.S)12
-rw-r--r--sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S (renamed from sysdeps/sparc/sparc64/sparcv9v2/memcpy.S)12
-rw-r--r--sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S (renamed from sysdeps/sparc/sparc64/sparcv9b/memcpy.S)8
-rw-r--r--sysdeps/sparc/sparc64/multiarch/memcpy.S107
-rw-r--r--sysdeps/sparc/sparc64/multiarch/memset-niagara1.S (renamed from sysdeps/sparc/sparc64/sparcv9v/memset.S)17
-rw-r--r--sysdeps/sparc/sparc64/multiarch/memset.S145
-rw-r--r--sysdeps/sparc/sparc64/sparcv9v2/memset.S1
23 files changed, 344 insertions, 32 deletions
diff --git a/ChangeLog b/ChangeLog
index ed2409a539..f21abc5c3e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -27,6 +27,34 @@
* sysdeps/sparc/sparc64/sparcv9v/memcpy.S (bcopy, memmove): Likewise.
* sysdeps/sparc/sparc64/sparcv9v2/memcpy.S (bcopy, memmove): Likewise.
+ * sysdeps/sparc/elf/rtld-global-offsets.sym: New file.
+ * sysdeps/sparc/Makefile (csu): Add rtld-global-offsets.sym to
+ gen-as-const-headers.
+ * sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile: New file.
+ * sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S: New file.
+ * sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S: New file.
+ * sysdeps/sparc/sparc32/sparcv9/sparcv9b/memcpy.S: Move to...
+ * sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra3.S: ...here.
+ * sysdeps/sparc/sparc32/sparcv9/sparcv9v/memcpy.S: Move to...
+ * sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara1.S: ...here.
+ * sysdeps/sparc/sparc32/sparcv9/sparcv9v/memset.S: Move to...
+ * sysdeps/sparc/sparc32/sparcv9/multiarch/memset-niagara1.S: ...here.
+ * sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memcpy.S: Move to...
+ * sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara2.S: ...here.
+ * sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memset.S: Removed.
+ * sysdeps/sparc/sparc64/multiarch/Makefile: New file.
+ * sysdeps/sparc/sparc64/sparcv9v/memcpy.S: Move to...
+ * sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S: ...here.
+ * sysdeps/sparc/sparc64/sparcv9v2/memcpy.S: Move to...
+ * sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S: ...here.
+ * sysdeps/sparc/sparc64/sparcv9b/memcpy.S: Move to...
+ * sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: ...here.
+ * sysdeps/sparc/sparc64/sparcv9v/memset.S: Move to...
+ * sysdeps/sparc/sparc64/multiarch/memset-niagara1.S: ...here.
+ * sysdeps/sparc/sparc64/sparcv9v2/memset.S: Removed.
+ * sysdeps/sparc/sparc64/multiarch/memcpy.S: New file.
+ * sysdeps/sparc/sparc64/multiarch/memset.S: New file.
+
2009-02-20 David S. Miller <davem@davemloft.net>
* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_runtime_setup):
diff --git a/sysdeps/sparc/Makefile b/sysdeps/sparc/Makefile
index 73b926554e..735e4a40db 100644
--- a/sysdeps/sparc/Makefile
+++ b/sysdeps/sparc/Makefile
@@ -10,3 +10,8 @@ endif
ifeq ($(subdir),db2)
CPPFLAGS += -DHAVE_SPINLOCKS=1 -DHAVE_ASSEM_SPARC_GCC=1
endif
+
+ifeq ($(subdir),csu)
+# get offset to rtld_global._dl_hwcap
+gen-as-const-headers += rtld-global-offsets.sym
+endif
diff --git a/sysdeps/sparc/elf/rtld-global-offsets.sym b/sysdeps/sparc/elf/rtld-global-offsets.sym
new file mode 100644
index 0000000000..ff4e97f2a6
--- /dev/null
+++ b/sysdeps/sparc/elf/rtld-global-offsets.sym
@@ -0,0 +1,7 @@
+#define SHARED 1
+
+#include <ldsodefs.h>
+
+#define rtld_global_ro_offsetof(mem) offsetof (struct rtld_global_ro, mem)
+
+RTLD_GLOBAL_RO_DL_HWCAP_OFFSET rtld_global_ro_offsetof (_dl_hwcap)
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
new file mode 100644
index 0000000000..4d45042a95
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
@@ -0,0 +1,4 @@
+ifeq ($(subdir),string)
+sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
+ memset-niagara1
+endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara1.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara1.S
new file mode 100644
index 0000000000..10aef85fe1
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara1.S
@@ -0,0 +1,2 @@
+#define XCC icc
+#include <sparc64/multiarch/memcpy-niagara1.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara2.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara2.S
new file mode 100644
index 0000000000..6b1bf6ea70
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara2.S
@@ -0,0 +1,2 @@
+#define XCC icc
+#include <sparc64/multiarch/memcpy-niagara2.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra3.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra3.S
new file mode 100644
index 0000000000..77adf151aa
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra3.S
@@ -0,0 +1,2 @@
+#define XCC icc
+#include <sparc64/multiarch/memcpy-ultra3.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S
new file mode 100644
index 0000000000..14df91e005
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S
@@ -0,0 +1,4 @@
+#define ASI_PNF 0x82
+#define ASI_BLK_P 0xf0
+#define XCC icc
+#include <sparc64/multiarch/memcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-niagara1.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-niagara1.S
new file mode 100644
index 0000000000..b432420876
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-niagara1.S
@@ -0,0 +1,2 @@
+#define XCC icc
+#include <sparc64/multiarch/memset-niagara1.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S
new file mode 100644
index 0000000000..8f8264337d
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S
@@ -0,0 +1,4 @@
+#define ASI_PNF 0x82
+#define ASI_BLK_P 0xf0
+#define XCC icc
+#include <sparc64/multiarch/memset.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/sparcv9b/memcpy.S b/sysdeps/sparc/sparc32/sparcv9/sparcv9b/memcpy.S
deleted file mode 100644
index 61960dce61..0000000000
--- a/sysdeps/sparc/sparc32/sparcv9/sparcv9b/memcpy.S
+++ /dev/null
@@ -1,2 +0,0 @@
-#define XCC icc
-#include <sparc64/sparcv9b/memcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memcpy.S b/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memcpy.S
deleted file mode 100644
index 4c05f57bc2..0000000000
--- a/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memcpy.S
+++ /dev/null
@@ -1,2 +0,0 @@
-#define XCC icc
-#include <sparc64/sparcv9v/memcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memset.S b/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memset.S
deleted file mode 100644
index 5e46c7489f..0000000000
--- a/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memset.S
+++ /dev/null
@@ -1,2 +0,0 @@
-#define XCC icc
-#include <sparc64/sparcv9v/memset.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memcpy.S b/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memcpy.S
deleted file mode 100644
index 7f4606037c..0000000000
--- a/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memcpy.S
+++ /dev/null
@@ -1,2 +0,0 @@
-#define XCC icc
-#include <sparc64/sparcv9v2/memcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memset.S b/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memset.S
deleted file mode 100644
index 72de7bb0cf..0000000000
--- a/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memset.S
+++ /dev/null
@@ -1,2 +0,0 @@
-#define XCC icc
-#include <sparc64/sparcv9v2/memset.S>
diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
new file mode 100644
index 0000000000..4d45042a95
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/Makefile
@@ -0,0 +1,4 @@
+ifeq ($(subdir),string)
+sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
+ memset-niagara1
+endif
diff --git a/sysdeps/sparc/sparc64/sparcv9v/memcpy.S b/sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S
index 116c7113ff..6a78295e81 100644
--- a/sysdeps/sparc/sparc64/sparcv9v/memcpy.S
+++ b/sysdeps/sparc/sparc64/multiarch/memcpy-niagara1.S
@@ -36,6 +36,8 @@
#define XCC xcc
#endif
+#if !defined NOT_IN_libc
+
.register %g2,#scratch
.register %g3,#scratch
.register %g6,#scratch
@@ -43,10 +45,10 @@
.text
.align 32
-ENTRY(memcpy)
-#ifndef USE_BPR
+ENTRY(__memcpy_niagara1)
+# ifndef USE_BPR
srl %o2, 0, %o2
-#endif
+# endif
100: /* %o0=dst, %o1=src, %o2=len */
mov %o0, %g5
cmp %o2, 0
@@ -335,6 +337,6 @@ ENTRY(memcpy)
retl
mov %g5, %o0
-END(memcpy)
+END(__memcpy_niagara1)
-libc_hidden_builtin_def (memcpy)
+#endif
diff --git a/sysdeps/sparc/sparc64/sparcv9v2/memcpy.S b/sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S
index 300b12f427..35f6989aca 100644
--- a/sysdeps/sparc/sparc64/sparcv9v2/memcpy.S
+++ b/sysdeps/sparc/sparc64/multiarch/memcpy-niagara2.S
@@ -138,6 +138,8 @@
LOAD(ldd, base + 0x28, %x5); \
LOAD(ldd, base + 0x30, %x6);
+#if !defined NOT_IN_libc
+
.register %g2,#scratch
.register %g3,#scratch
.register %g6,#scratch
@@ -145,10 +147,10 @@
.text
.align 32
-ENTRY(memcpy)
-#ifndef USE_BPR
+ENTRY(__memcpy_niagara2)
+# ifndef USE_BPR
srl %o2, 0, %o2
-#endif
+# endif
100: /* %o0=dst, %o1=src, %o2=len */
mov %o0, %g5
cmp %o2, 0
@@ -485,6 +487,6 @@ ENTRY(memcpy)
retl
mov %g5, %o0
-END(memcpy)
+END(__memcpy_niagara2)
-libc_hidden_builtin_def (memcpy)
+#endif
diff --git a/sysdeps/sparc/sparc64/sparcv9b/memcpy.S b/sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
index 389e09d820..34ca089f93 100644
--- a/sysdeps/sparc/sparc64/sparcv9b/memcpy.S
+++ b/sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
@@ -31,6 +31,8 @@
#define XCC xcc
#endif
+#if !defined NOT_IN_libc
+
.register %g2,#scratch
.register %g3,#scratch
.register %g6,#scratch
@@ -52,7 +54,7 @@
* of up to 2.4GB per second.
*/
.align 32
-ENTRY(memcpy)
+ENTRY(__memcpy_ultra3)
100: /* %o0=dst, %o1=src, %o2=len */
mov %o0, %g5
@@ -313,6 +315,6 @@ small_copy_unaligned:
retl
mov %g5, %o0
-END(memcpy)
+END(__memcpy_ultra3)
-libc_hidden_builtin_def (memcpy)
+#endif \ No newline at end of file
diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy.S b/sysdeps/sparc/sparc64/multiarch/memcpy.S
new file mode 100644
index 0000000000..a708de10e2
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/memcpy.S
@@ -0,0 +1,107 @@
+/* Multiple versions of memcpy
+ Copyright (C) 2010 Free Software Foundation, Inc.
+ Contributed by David S. Miller (davem@davemloft.net)
+ 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>
+#include <rtld-global-offsets.h>
+
+#if !defined NOT_IN_libc
+ .text
+ENTRY(memcpy)
+ .type memcpy, @gnu_indirect_function
+# ifdef SHARED
+ mov %o7, %o5
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o3
+ call 1f
+ or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3
+1: add %o7, %o3, %o3
+ mov %o5, %o7
+ sethi %hi(_rtld_global_ro), %o2
+ or %o2, %lo(_rtld_global_ro), %o2
+# ifdef __arch64__
+ ldx [%o3 + %o2], %o2
+ ldx [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET], %o2
+# else
+ ld [%o3 + %o2], %o2
+ ld [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET + 4], %o2
+# endif
+# else
+ set _dl_hwcap, %o3
+# ifdef __arch64__
+ ldx [%o3], %o2
+# else
+ ld [%o3 + 4], %o2
+# endif
+# endif
+ andcc %o2, 0x80, %g0 ! HWCAP_SPARC_N2
+ be 1f
+ andcc %o2, 0x40, %g0 ! HWCAP_SPARC_BLKINIT
+# ifdef SHARED
+ sethi %gdop_hix22(__memcpy_niagara2), %o1
+ xor %o1, %gdop_lox10(__memcpy_niagara2), %o1
+# else
+ set __memcpy_niagara2, %o1
+# endif
+ ba 10f
+ nop
+1: be 1f
+ andcc %o2, 0x20, %g0 ! HWCAP_SPARC_ULTRA3
+# ifdef SHARED
+ sethi %gdop_hix22(__memcpy_niagara1), %o1
+ xor %o1, %gdop_lox10(__memcpy_niagara1), %o1
+# else
+ set __memcpy_niagara1, %o1
+# endif
+ ba 10f
+ nop
+1: be 9f
+ nop
+# ifdef SHARED
+ sethi %gdop_hix22(__memcpy_ultra3), %o1
+ xor %o1, %gdop_lox10(__memcpy_ultra3), %o1
+# else
+ set __memcpy_ultra3, %o1
+# endif
+ ba 10f
+ nop
+9:
+# ifdef SHARED
+ sethi %gdop_hix22(__memcpy_ultra1), %o1
+ xor %o1, %gdop_lox10(__memcpy_ultra1), %o1
+# else
+ set __memcpy_ultra1, %o1
+# endif
+10:
+# ifdef SHARED
+ add %o3, %o1, %o1
+# endif
+ retl
+ mov %o1, %o0
+END(memcpy)
+
+# undef libc_hidden_builtin_def
+/* IFUNC doesn't work with the hidden functions in a shared library. */
+# define libc_hidden_builtin_def(name) \
+ .globl __GI_memcpy; __GI_memcpy = __memcpy_ultra1
+
+#define memcpy __memcpy_ultra1
+
+#endif
+
+#include "../memcpy.S"
diff --git a/sysdeps/sparc/sparc64/sparcv9v/memset.S b/sysdeps/sparc/sparc64/multiarch/memset-niagara1.S
index 64817b8871..20ea056216 100644
--- a/sysdeps/sparc/sparc64/sparcv9v/memset.S
+++ b/sysdeps/sparc/sparc64/multiarch/memset-niagara1.S
@@ -29,12 +29,14 @@
#define XCC xcc
#endif
+#if !defined NOT_IN_libc
+
.register %g2,#scratch
.text
.align 32
-ENTRY(memset)
+ENTRY(__memset_niagara1)
/* %o0=buf, %o1=pat, %o2=len */
and %o1, 0xff, %o3
mov %o2, %o1
@@ -45,14 +47,14 @@ ENTRY(memset)
sllx %o2, 32, %g1
ba,pt %XCC, 1f
or %g1, %o2, %o2
-END(memset)
+END(__memset_niagara1)
-ENTRY(__bzero)
+ENTRY(__bzero_niagara1)
clr %o2
1:
-#ifndef USE_BRP
+# ifndef USE_BRP
srl %o1, 0, %o1
-#endif
+# endif
brz,pn %o1, 90f
mov %o0, %o3
@@ -125,7 +127,6 @@ ENTRY(__bzero)
90:
retl
mov %o3, %o0
-END(__bzero)
+END(__bzero_niagara1)
-libc_hidden_builtin_def (memset)
-weak_alias (__bzero, bzero)
+#endif
diff --git a/sysdeps/sparc/sparc64/multiarch/memset.S b/sysdeps/sparc/sparc64/multiarch/memset.S
new file mode 100644
index 0000000000..23e513f18f
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/memset.S
@@ -0,0 +1,145 @@
+/* Multiple versions of memset and bzero
+ Copyright (C) 2010 Free Software Foundation, Inc.
+ Contributed by David S. Miller (davem@davemloft.net)
+ 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>
+#include <rtld-global-offsets.h>
+
+#if !defined NOT_IN_libc
+ .text
+ENTRY(memset)
+ .type memset, @gnu_indirect_function
+# ifdef SHARED
+ mov %o7, %o5
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o3
+ call 1f
+ or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3
+1: add %o7, %o3, %o3
+ mov %o5, %o7
+ sethi %hi(_rtld_global_ro), %o2
+ or %o2, %lo(_rtld_global_ro), %o2
+# ifdef __arch64__
+ ldx [%o3 + %o2], %o2
+ ldx [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET], %o2
+# else
+ ld [%o3 + %o2], %o2
+ ld [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET + 4], %o2
+# endif
+# else
+ set _dl_hwcap, %o3
+# ifdef __arch64__
+ ldx [%o3], %o2
+# else
+ ld [%o3 + 4], %o2
+# endif
+# endif
+ andcc %o2, 0x40, %g0 ! HWCAP_SPARC_BLKINIT
+ be 9f
+ nop
+# ifdef SHARED
+ sethi %gdop_hix22(__memset_niagara1), %o1
+ xor %o1, %gdop_lox10(__memset_niagara1), %o1
+# else
+ set __memset_niagara1, %o1
+# endif
+ ba 10f
+ nop
+9:
+# ifdef SHARED
+ sethi %gdop_hix22(__memset_ultra1), %o1
+ xor %o1, %gdop_lox10(__memset_ultra1), %o1
+# else
+ set __memset_ultra1, %o1
+# endif
+10:
+# ifdef SHARED
+ add %o3, %o1, %o1
+# endif
+ retl
+ mov %o1, %o0
+END(memset)
+
+ENTRY(__bzero)
+ .type bzero, @gnu_indirect_function
+# ifdef SHARED
+ mov %o7, %o5
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o3
+ call 1f
+ or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3
+1: add %o7, %o3, %o3
+ mov %o5, %o7
+ sethi %hi(_rtld_global_ro), %o2
+ or %o2, %lo(_rtld_global_ro), %o2
+# ifdef __arch64__
+ ldx [%o3 + %o2], %o2
+ ldx [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET], %o2
+# else
+ ld [%o3 + %o2], %o2
+ ld [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET + 4], %o2
+# endif
+# else
+ set _dl_hwcap, %o3
+# ifdef __arch64__
+ ldx [%o3], %o2
+# else
+ ld [%o3 + 4], %o2
+# endif
+# endif
+ andcc %o2, 0x40, %g0 ! HWCAP_SPARC_BLKINIT
+ be 9f
+ nop
+# ifdef SHARED
+ sethi %gdop_hix22(__bzero_niagara1), %o1
+ xor %o1, %gdop_lox10(__bzero_niagara1), %o1
+# else
+ set __bzero_niagara1, %o1
+# endif
+ ba 10f
+ nop
+9:
+# ifdef SHARED
+ sethi %gdop_hix22(__memset_ultra1), %o1
+ xor %o1, %gdop_lox10(__memset_ultra1), %o1
+# else
+ set __bzero_ultra1, %o1
+# endif
+10:
+# ifdef SHARED
+ add %o3, %o1, %o1
+# endif
+ retl
+ mov %o1, %o0
+END(__bzero)
+
+weak_alias (__bzero, bzero)
+
+# undef weak_alias
+# define weak_alias(a, b)
+
+# undef libc_hidden_builtin_def
+/* IFUNC doesn't work with the hidden functions in a shared library. */
+# define libc_hidden_builtin_def(name) \
+ .globl __GI_memset; __GI_memset = __memset_ultra1
+
+#define memset __memset_ultra1
+#define __bzero __bzero_ultra1
+
+#endif
+
+#include "../memset.S"
diff --git a/sysdeps/sparc/sparc64/sparcv9v2/memset.S b/sysdeps/sparc/sparc64/sparcv9v2/memset.S
deleted file mode 100644
index 809d3ed9c6..0000000000
--- a/sysdeps/sparc/sparc64/sparcv9v2/memset.S
+++ /dev/null
@@ -1 +0,0 @@
-#include <sparc64/sparcv9v/memset.S>