aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-08-20 06:28:49 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-08-27 09:35:10 -0700
commit21596c745d841e6b3384f1af93cfe1df4afc6648 (patch)
treea64b3953f72d1a160fd207276299c65ba4490b03
parent42f926f9bd9e52fddd526268efccf5bd93d4f0dd (diff)
downloadglibc-21596c745d841e6b3384f1af93cfe1df4afc6648.tar
glibc-21596c745d841e6b3384f1af93cfe1df4afc6648.tar.gz
glibc-21596c745d841e6b3384f1af93cfe1df4afc6648.tar.bz2
glibc-21596c745d841e6b3384f1af93cfe1df4afc6648.zip
Add i386 memcpy family multiarch functions
-rw-r--r--sysdeps/i386/i586/multiarch/memcpy.c1
-rw-r--r--sysdeps/i386/i586/multiarch/mempcpy.c1
-rw-r--r--sysdeps/i386/i586/multiarch/rtld-memcpy.S19
-rw-r--r--sysdeps/i386/i586/multiarch/static-memcpy.S21
-rw-r--r--sysdeps/i386/i586/multiarch/static-mempcpy.S21
-rw-r--r--sysdeps/i386/i686/multiarch/Makefile9
-rw-r--r--sysdeps/i386/i686/multiarch/bcopy-i386.S1
-rw-r--r--sysdeps/i386/i686/multiarch/bcopy-i686.S7
-rw-r--r--sysdeps/i386/i686/multiarch/bcopy.S59
-rw-r--r--sysdeps/i386/i686/multiarch/bcopy.c1
-rw-r--r--sysdeps/i386/i686/multiarch/memcpy-i386.S1
-rw-r--r--sysdeps/i386/i686/multiarch/memcpy-i586.S1
-rw-r--r--sysdeps/i386/i686/multiarch/memcpy-i686.S7
-rw-r--r--sysdeps/i386/i686/multiarch/memcpy.S78
-rw-r--r--sysdeps/i386/i686/multiarch/memcpy.c1
-rw-r--r--sysdeps/i386/i686/multiarch/memcpy_chk.S50
-rw-r--r--sysdeps/i386/i686/multiarch/memmove-i386.S1
-rw-r--r--sysdeps/i386/i686/multiarch/memmove-i686.S7
-rw-r--r--sysdeps/i386/i686/multiarch/memmove.S89
-rw-r--r--sysdeps/i386/i686/multiarch/memmove.c1
-rw-r--r--sysdeps/i386/i686/multiarch/memmove_chk.S94
-rw-r--r--sysdeps/i386/i686/multiarch/mempcpy-i386.S1
-rw-r--r--sysdeps/i386/i686/multiarch/mempcpy-i586.S1
-rw-r--r--sysdeps/i386/i686/multiarch/mempcpy-i686.S10
-rw-r--r--sysdeps/i386/i686/multiarch/mempcpy.S81
-rw-r--r--sysdeps/i386/i686/multiarch/mempcpy.c1
-rw-r--r--sysdeps/i386/i686/multiarch/mempcpy_chk.S50
-rw-r--r--sysdeps/i386/i686/multiarch/rtld-memcpy.S19
-rw-r--r--sysdeps/i386/i686/multiarch/rtld-memmove.S19
-rw-r--r--sysdeps/i386/i686/multiarch/static-memcpy.S21
-rw-r--r--sysdeps/i386/i686/multiarch/static-memmove.S21
-rw-r--r--sysdeps/i386/i686/multiarch/static-mempcpy.S21
-rw-r--r--sysdeps/i386/multiarch/Makefile11
-rw-r--r--sysdeps/i386/multiarch/bcopy-i386.S12
-rw-r--r--sysdeps/i386/multiarch/bcopy-i686.S6
-rw-r--r--sysdeps/i386/multiarch/bcopy-sse2-unaligned.S (renamed from sysdeps/i386/i686/multiarch/bcopy-sse2-unaligned.S)0
-rw-r--r--sysdeps/i386/multiarch/bcopy-ssse3-rep.S (renamed from sysdeps/i386/i686/multiarch/bcopy-ssse3-rep.S)0
-rw-r--r--sysdeps/i386/multiarch/bcopy-ssse3.S (renamed from sysdeps/i386/i686/multiarch/bcopy-ssse3.S)0
-rw-r--r--sysdeps/i386/multiarch/bcopy.c64
-rw-r--r--sysdeps/i386/multiarch/ifunc-impl-list.c55
-rw-r--r--sysdeps/i386/multiarch/memcpy-i386.S11
-rw-r--r--sysdeps/i386/multiarch/memcpy-i586.S7
-rw-r--r--sysdeps/i386/multiarch/memcpy-i686.S7
-rw-r--r--sysdeps/i386/multiarch/memcpy-sse2-unaligned.S (renamed from sysdeps/i386/i686/multiarch/memcpy-sse2-unaligned.S)0
-rw-r--r--sysdeps/i386/multiarch/memcpy-ssse3-rep.S (renamed from sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S)0
-rw-r--r--sysdeps/i386/multiarch/memcpy-ssse3.S (renamed from sysdeps/i386/i686/multiarch/memcpy-ssse3.S)0
-rw-r--r--sysdeps/i386/multiarch/memcpy.c69
-rw-r--r--sysdeps/i386/multiarch/memcpy_chk.c70
-rw-r--r--sysdeps/i386/multiarch/memmove-i386.S11
-rw-r--r--sysdeps/i386/multiarch/memmove-i686.S7
-rw-r--r--sysdeps/i386/multiarch/memmove-sse2-unaligned.S (renamed from sysdeps/i386/i686/multiarch/memmove-sse2-unaligned.S)0
-rw-r--r--sysdeps/i386/multiarch/memmove-ssse3-rep.S (renamed from sysdeps/i386/i686/multiarch/memmove-ssse3-rep.S)0
-rw-r--r--sysdeps/i386/multiarch/memmove-ssse3.S (renamed from sysdeps/i386/i686/multiarch/memmove-ssse3.S)0
-rw-r--r--sysdeps/i386/multiarch/memmove.c66
-rw-r--r--sysdeps/i386/multiarch/memmove_chk.c105
-rw-r--r--sysdeps/i386/multiarch/mempcpy-i386.S18
-rw-r--r--sysdeps/i386/multiarch/mempcpy-i586.S11
-rw-r--r--sysdeps/i386/multiarch/mempcpy-i686.S11
-rw-r--r--sysdeps/i386/multiarch/mempcpy-sse2-unaligned.S (renamed from sysdeps/i386/i686/multiarch/mempcpy-sse2-unaligned.S)0
-rw-r--r--sysdeps/i386/multiarch/mempcpy-ssse3-rep.S (renamed from sysdeps/i386/i686/multiarch/mempcpy-ssse3-rep.S)0
-rw-r--r--sysdeps/i386/multiarch/mempcpy-ssse3.S (renamed from sysdeps/i386/i686/multiarch/mempcpy-ssse3.S)0
-rw-r--r--sysdeps/i386/multiarch/mempcpy.c71
-rw-r--r--sysdeps/i386/multiarch/mempcpy_chk.c70
-rw-r--r--sysdeps/i386/multiarch/rtld-memmove.S19
-rw-r--r--sysdeps/i386/multiarch/static-memcpy.S21
-rw-r--r--sysdeps/i386/multiarch/static-memmove.S21
-rw-r--r--sysdeps/i386/multiarch/static-mempcpy.S21
67 files changed, 962 insertions, 517 deletions
diff --git a/sysdeps/i386/i586/multiarch/memcpy.c b/sysdeps/i386/i586/multiarch/memcpy.c
new file mode 100644
index 0000000000..a23ae5c20c
--- /dev/null
+++ b/sysdeps/i386/i586/multiarch/memcpy.c
@@ -0,0 +1 @@
+#include <sysdeps/i386/multiarch/memcpy.c>
diff --git a/sysdeps/i386/i586/multiarch/mempcpy.c b/sysdeps/i386/i586/multiarch/mempcpy.c
new file mode 100644
index 0000000000..1ae8773514
--- /dev/null
+++ b/sysdeps/i386/i586/multiarch/mempcpy.c
@@ -0,0 +1 @@
+#include <sysdeps/i386/multiarch/mempcpy.c>
diff --git a/sysdeps/i386/i586/multiarch/rtld-memcpy.S b/sysdeps/i386/i586/multiarch/rtld-memcpy.S
new file mode 100644
index 0000000000..2e53b40139
--- /dev/null
+++ b/sysdeps/i386/i586/multiarch/rtld-memcpy.S
@@ -0,0 +1,19 @@
+/* memcpy for ld.so
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdeps/i386/i586/memcpy.S>
diff --git a/sysdeps/i386/i586/multiarch/static-memcpy.S b/sysdeps/i386/i586/multiarch/static-memcpy.S
new file mode 100644
index 0000000000..37b0917636
--- /dev/null
+++ b/sysdeps/i386/i586/multiarch/static-memcpy.S
@@ -0,0 +1,21 @@
+/* memcpy for libc.a
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#if !defined SHARED && IS_IN (libc)
+# include <sysdeps/i386/i586/memcpy.S>
+#endif
diff --git a/sysdeps/i386/i586/multiarch/static-mempcpy.S b/sysdeps/i386/i586/multiarch/static-mempcpy.S
new file mode 100644
index 0000000000..418420fd50
--- /dev/null
+++ b/sysdeps/i386/i586/multiarch/static-mempcpy.S
@@ -0,0 +1,21 @@
+/* memcpy for libc.a
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#if !defined SHARED && IS_IN (libc)
+# include <sysdeps/i386/i586/mempcpy.S>
+#endif
diff --git a/sysdeps/i386/i686/multiarch/Makefile b/sysdeps/i386/i686/multiarch/Makefile
index 59072b94da..3b1190eb12 100644
--- a/sysdeps/i386/i686/multiarch/Makefile
+++ b/sysdeps/i386/i686/multiarch/Makefile
@@ -1,8 +1,5 @@
ifeq ($(subdir),string)
-sysdep_routines += memcpy-ssse3 mempcpy-ssse3 \
- memmove-ssse3 memcpy-ssse3-rep mempcpy-ssse3-rep \
- memmove-ssse3-rep bcopy-ssse3 bcopy-ssse3-rep \
- strcmp-ssse3 \
+sysdep_routines += strcmp-ssse3 \
strcmp-sse4 strncmp-c strncmp-ssse3 strncmp-sse4 \
memcmp-ssse3 memcmp-sse4 varshift \
strlen-sse2 strlen-sse2-bsf strncpy-c strcpy-ssse3 \
@@ -16,9 +13,7 @@ sysdep_routines += memcpy-ssse3 mempcpy-ssse3 \
strnlen-sse2 strnlen-c \
strcasecmp_l-c strcasecmp-c strcasecmp_l-ssse3 \
strncase_l-c strncase-c strncase_l-ssse3 \
- strcasecmp_l-sse4 strncase_l-sse4 \
- bcopy-sse2-unaligned memcpy-sse2-unaligned \
- mempcpy-sse2-unaligned memmove-sse2-unaligned
+ strcasecmp_l-sse4 strncase_l-sse4
ifeq (yes,$(config-cflags-sse4))
sysdep_routines += strcspn-c strpbrk-c strspn-c
CFLAGS-varshift.c += -msse4
diff --git a/sysdeps/i386/i686/multiarch/bcopy-i386.S b/sysdeps/i386/i686/multiarch/bcopy-i386.S
new file mode 100644
index 0000000000..9d841c9fd1
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/bcopy-i386.S
@@ -0,0 +1 @@
+/* Dummy file. */
diff --git a/sysdeps/i386/i686/multiarch/bcopy-i686.S b/sysdeps/i386/i686/multiarch/bcopy-i686.S
new file mode 100644
index 0000000000..bb13d280d6
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/bcopy-i686.S
@@ -0,0 +1,7 @@
+#include <sysdeps/i386/multiarch/bcopy-i686.S>
+
+#ifdef SHARED
+ .globl __GI_bcopy
+ .hidden __GI_bcopy
+ __GI_bcopy = __bcopy_i686
+#endif
diff --git a/sysdeps/i386/i686/multiarch/bcopy.S b/sysdeps/i386/i686/multiarch/bcopy.S
deleted file mode 100644
index 3fc95dcba9..0000000000
--- a/sysdeps/i386/i686/multiarch/bcopy.S
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Multiple versions of bcopy
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2015 Free Software Foundation, Inc.
- Contributed by Intel Corporation.
- 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
-/* Define multiple versions only for the definition in lib. */
-#if IS_IN (libc)
- .text
-ENTRY(bcopy)
- .type bcopy, @gnu_indirect_function
- LOAD_GOT_AND_RTLD_GLOBAL_RO
- LOAD_FUNC_GOT_EAX (__bcopy_ia32)
- HAS_CPU_FEATURE (SSE2)
- jz 2f
- LOAD_FUNC_GOT_EAX (__bcopy_sse2_unaligned)
- HAS_ARCH_FEATURE (Fast_Unaligned_Load)
- jnz 2f
- HAS_CPU_FEATURE (SSSE3)
- jz 2f
- LOAD_FUNC_GOT_EAX (__bcopy_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
- jz 2f
- LOAD_FUNC_GOT_EAX (__bcopy_ssse3_rep)
-2: ret
-END(bcopy)
-
-# undef ENTRY
-# define ENTRY(name) \
- .type __bcopy_ia32, @function; \
- .p2align 4; \
- .globl __bcopy_ia32; \
- .hidden __bcopy_ia32; \
- __bcopy_ia32: cfi_startproc; \
- CALL_MCOUNT
-# undef END
-# define END(name) \
- cfi_endproc; .size __bcopy_ia32, .-__bcopy_ia32
-
-#endif
-
-#include "../bcopy.S"
diff --git a/sysdeps/i386/i686/multiarch/bcopy.c b/sysdeps/i386/i686/multiarch/bcopy.c
new file mode 100644
index 0000000000..6fb21e864c
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/bcopy.c
@@ -0,0 +1 @@
+#include <sysdeps/i386/multiarch/bcopy.c>
diff --git a/sysdeps/i386/i686/multiarch/memcpy-i386.S b/sysdeps/i386/i686/multiarch/memcpy-i386.S
new file mode 100644
index 0000000000..9d841c9fd1
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/memcpy-i386.S
@@ -0,0 +1 @@
+/* Dummy file. */
diff --git a/sysdeps/i386/i686/multiarch/memcpy-i586.S b/sysdeps/i386/i686/multiarch/memcpy-i586.S
new file mode 100644
index 0000000000..9d841c9fd1
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/memcpy-i586.S
@@ -0,0 +1 @@
+/* Dummy file. */
diff --git a/sysdeps/i386/i686/multiarch/memcpy-i686.S b/sysdeps/i386/i686/multiarch/memcpy-i686.S
new file mode 100644
index 0000000000..e7f84df9fe
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/memcpy-i686.S
@@ -0,0 +1,7 @@
+#include <sysdeps/i386/multiarch/memcpy-i686.S>
+
+#ifdef SHARED
+ .globl __GI_memcpy
+ .hidden __GI_memcpy
+ __GI_memcpy = __memcpy_i686
+#endif
diff --git a/sysdeps/i386/i686/multiarch/memcpy.S b/sysdeps/i386/i686/multiarch/memcpy.S
deleted file mode 100644
index 9a4d183e01..0000000000
--- a/sysdeps/i386/i686/multiarch/memcpy.S
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Multiple versions of memcpy
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2015 Free Software Foundation, Inc.
- Contributed by Intel Corporation.
- 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
-/* Define multiple versions only for the definition in lib and for
- DSO. In static binaries we need memcpy before the initialization
- happened. */
-#if defined SHARED && IS_IN (libc)
- .text
-ENTRY(memcpy)
- .type memcpy, @gnu_indirect_function
- LOAD_GOT_AND_RTLD_GLOBAL_RO
- LOAD_FUNC_GOT_EAX (__memcpy_ia32)
- HAS_CPU_FEATURE (SSE2)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memcpy_sse2_unaligned)
- HAS_ARCH_FEATURE (Fast_Unaligned_Load)
- jnz 2f
- HAS_CPU_FEATURE (SSSE3)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memcpy_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memcpy_ssse3_rep)
-2: ret
-END(memcpy)
-
-# undef ENTRY
-# define ENTRY(name) \
- .type __memcpy_ia32, @function; \
- .p2align 4; \
- .globl __memcpy_ia32; \
- .hidden __memcpy_ia32; \
- __memcpy_ia32: cfi_startproc; \
- CALL_MCOUNT
-# undef END
-# define END(name) \
- cfi_endproc; .size __memcpy_ia32, .-__memcpy_ia32
-
-# undef ENTRY_CHK
-# define ENTRY_CHK(name) \
- .type __memcpy_chk_ia32, @function; \
- .globl __memcpy_chk_ia32; \
- .p2align 4; \
- __memcpy_chk_ia32: cfi_startproc; \
- CALL_MCOUNT
-# undef END_CHK
-# define END_CHK(name) \
- cfi_endproc; .size __memcpy_chk_ia32, .-__memcpy_chk_ia32
-
-# undef libc_hidden_builtin_def
-/* IFUNC doesn't work with the hidden functions in shared library since
- they will be called without setting up EBX needed for PLT which is
- used by IFUNC. */
-# define libc_hidden_builtin_def(name) \
- .globl __GI_memcpy; __GI_memcpy = __memcpy_ia32
-#endif
-
-#include "../memcpy.S"
diff --git a/sysdeps/i386/i686/multiarch/memcpy.c b/sysdeps/i386/i686/multiarch/memcpy.c
new file mode 100644
index 0000000000..a23ae5c20c
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/memcpy.c
@@ -0,0 +1 @@
+#include <sysdeps/i386/multiarch/memcpy.c>
diff --git a/sysdeps/i386/i686/multiarch/memcpy_chk.S b/sysdeps/i386/i686/multiarch/memcpy_chk.S
deleted file mode 100644
index 3bbd921555..0000000000
--- a/sysdeps/i386/i686/multiarch/memcpy_chk.S
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Multiple versions of __memcpy_chk
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2015 Free Software Foundation, Inc.
- Contributed by Intel Corporation.
- 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
-/* Define multiple versions only for the definition in lib and for
- DSO. There are no multiarch memcpy functions for static binaries.
- */
-#if IS_IN (libc)
-# ifdef SHARED
- .text
-ENTRY(__memcpy_chk)
- .type __memcpy_chk, @gnu_indirect_function
- LOAD_GOT_AND_RTLD_GLOBAL_RO
- LOAD_FUNC_GOT_EAX (__memcpy_chk_ia32)
- HAS_CPU_FEATURE (SSE2)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memcpy_chk_sse2_unaligned)
- HAS_ARCH_FEATURE (Fast_Unaligned_Load)
- jnz 2f
- HAS_CPU_FEATURE (SSSE3)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memcpy_chk_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memcpy_chk_ssse3_rep)
-2: ret
-END(__memcpy_chk)
-# else
-# include "../memcpy_chk.S"
-# endif
-#endif
diff --git a/sysdeps/i386/i686/multiarch/memmove-i386.S b/sysdeps/i386/i686/multiarch/memmove-i386.S
new file mode 100644
index 0000000000..9d841c9fd1
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/memmove-i386.S
@@ -0,0 +1 @@
+/* Dummy file. */
diff --git a/sysdeps/i386/i686/multiarch/memmove-i686.S b/sysdeps/i386/i686/multiarch/memmove-i686.S
new file mode 100644
index 0000000000..35ad32749a
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/memmove-i686.S
@@ -0,0 +1,7 @@
+#include <sysdeps/i386/multiarch/memmove-i686.S>
+
+#ifdef SHARED
+ .globl __GI_memmove
+ .hidden __GI_memmove
+ __GI_memmove = __memmove_i686
+#endif
diff --git a/sysdeps/i386/i686/multiarch/memmove.S b/sysdeps/i386/i686/multiarch/memmove.S
deleted file mode 100644
index 2bf427fe93..0000000000
--- a/sysdeps/i386/i686/multiarch/memmove.S
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Multiple versions of memmove
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2015 Free Software Foundation, Inc.
- Contributed by Intel Corporation.
- 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
-/* Define multiple versions only for the definition in lib. */
-#if IS_IN (libc)
- .text
-ENTRY(memmove)
- .type memmove, @gnu_indirect_function
- LOAD_GOT_AND_RTLD_GLOBAL_RO
- LOAD_FUNC_GOT_EAX (__memmove_ia32)
- HAS_CPU_FEATURE (SSE2)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memmove_sse2_unaligned)
- HAS_ARCH_FEATURE (Fast_Unaligned_Load)
- jnz 2f
- HAS_CPU_FEATURE (SSSE3)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memmove_ssse3)
- HAS_ARCH_FEATURE (Fast_Rep_String)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memmove_ssse3_rep)
-2: ret
-END(memmove)
-
-# ifdef SHARED
-# undef ENTRY
-# define ENTRY(name) \
- .type __memmove_ia32, @function; \
- .p2align 4; \
- .globl __memmove_ia32; \
- .hidden __memmove_ia32; \
- __memmove_ia32: cfi_startproc; \
- CALL_MCOUNT
-# else
-# undef ENTRY
-# define ENTRY(name) \
- .type __memmove_ia32, @function; \
- .globl __memmove_ia32; \
- .p2align 4; \
- __memmove_ia32: cfi_startproc; \
- CALL_MCOUNT
-# endif
-
-# undef END
-# define END(name) \
- cfi_endproc; .size __memmove_ia32, .-__memmove_ia32
-
-# undef ENTRY_CHK
-# define ENTRY_CHK(name) \
- .type __memmove_chk_ia32, @function; \
- .globl __memmove_chk_ia32; \
- .p2align 4; \
- __memmove_chk_ia32: cfi_startproc; \
- CALL_MCOUNT
-# undef END_CHK
-# define END_CHK(name) \
- cfi_endproc; .size __memmove_chk_ia32, .-__memmove_chk_ia32
-
-# ifdef SHARED
-# undef libc_hidden_builtin_def
-/* IFUNC doesn't work with the hidden functions in shared library since
- they will be called without setting up EBX needed for PLT which is
- used by IFUNC. */
-# define libc_hidden_builtin_def(name) \
- .globl __GI_memmove; __GI_memmove = __memmove_ia32
-# endif
-#endif
-
-#include "../memmove.S"
diff --git a/sysdeps/i386/i686/multiarch/memmove.c b/sysdeps/i386/i686/multiarch/memmove.c
new file mode 100644
index 0000000000..5953add6e4
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/memmove.c
@@ -0,0 +1 @@
+#include <sysdeps/i386/multiarch/memmove.c>
diff --git a/sysdeps/i386/i686/multiarch/memmove_chk.S b/sysdeps/i386/i686/multiarch/memmove_chk.S
deleted file mode 100644
index b17f6edbdc..0000000000
--- a/sysdeps/i386/i686/multiarch/memmove_chk.S
+++ /dev/null
@@ -1,94 +0,0 @@
-/* Multiple versions of __memmove_chk
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2015 Free Software Foundation, Inc.
- Contributed by Intel Corporation.
- 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
-/* Define multiple versions only for the definition in lib. */
-#if IS_IN (libc)
- .text
-ENTRY(__memmove_chk)
- .type __memmove_chk, @gnu_indirect_function
- LOAD_GOT_AND_RTLD_GLOBAL_RO
- LOAD_FUNC_GOT_EAX (__memmove_chk_ia32)
- HAS_CPU_FEATURE (SSE2)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memmove_chk_sse2_unaligned)
- HAS_ARCH_FEATURE (Fast_Unaligned_Load)
- jnz 2f
- HAS_CPU_FEATURE (SSSE3)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memmove_chk_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
- jz 2f
- LOAD_FUNC_GOT_EAX (__memmove_chk_ssse3_rep)
-2: ret
-END(__memmove_chk)
-
-# ifndef SHARED
- .type __memmove_chk_sse2_unaligned, @function
- .p2align 4;
-__memmove_chk_sse2_unaligned:
- cfi_startproc
- CALL_MCOUNT
- movl 12(%esp), %eax
- cmpl %eax, 16(%esp)
- jb __chk_fail
- jmp __memmove_sse2_unaligned
- cfi_endproc
- .size __memmove_chk_sse2_unaligned, .-__memmove_chk_sse2_unaligned
-
- .type __memmove_chk_ssse3, @function
- .p2align 4;
-__memmove_chk_ssse3:
- cfi_startproc
- CALL_MCOUNT
- movl 12(%esp), %eax
- cmpl %eax, 16(%esp)
- jb __chk_fail
- jmp __memmove_ssse3
- cfi_endproc
- .size __memmove_chk_ssse3, .-__memmove_chk_ssse3
-
- .type __memmove_chk_ssse3_rep, @function
- .p2align 4;
-__memmove_chk_ssse3_rep:
- cfi_startproc
- CALL_MCOUNT
- movl 12(%esp), %eax
- cmpl %eax, 16(%esp)
- jb __chk_fail
- jmp __memmove_ssse3_rep
- cfi_endproc
- .size __memmove_chk_ssse3_rep, .-__memmove_chk_ssse3_rep
-
- .type __memmove_chk_ia32, @function
- .p2align 4;
-__memmove_chk_ia32:
- cfi_startproc
- CALL_MCOUNT
- movl 12(%esp), %eax
- cmpl %eax, 16(%esp)
- jb __chk_fail
- jmp __memmove_ia32
- cfi_endproc
- .size __memmove_chk_ia32, .-__memmove_chk_ia32
-# endif
-#endif
diff --git a/sysdeps/i386/i686/multiarch/mempcpy-i386.S b/sysdeps/i386/i686/multiarch/mempcpy-i386.S
new file mode 100644
index 0000000000..9d841c9fd1
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/mempcpy-i386.S
@@ -0,0 +1 @@
+/* Dummy file. */
diff --git a/sysdeps/i386/i686/multiarch/mempcpy-i586.S b/sysdeps/i386/i686/multiarch/mempcpy-i586.S
new file mode 100644
index 0000000000..9d841c9fd1
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/mempcpy-i586.S
@@ -0,0 +1 @@
+/* Dummy file. */
diff --git a/sysdeps/i386/i686/multiarch/mempcpy-i686.S b/sysdeps/i386/i686/multiarch/mempcpy-i686.S
new file mode 100644
index 0000000000..f87cac34af
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/mempcpy-i686.S
@@ -0,0 +1,10 @@
+#include <sysdeps/i386/multiarch/mempcpy-i686.S>
+
+#ifdef SHARED
+ .globl __GI_mempcpy
+ .hidden __GI_mempcpy
+ __GI_mempcpy = __mempcpy_i686
+ .globl __GI___mempcpy
+ .hidden __GI___mempcpy
+ __GI___mempcpy = __mempcpy_i686
+#endif
diff --git a/sysdeps/i386/i686/multiarch/mempcpy.S b/sysdeps/i386/i686/multiarch/mempcpy.S
deleted file mode 100644
index 021558a5b0..0000000000
--- a/sysdeps/i386/i686/multiarch/mempcpy.S
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Multiple versions of mempcpy
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2015 Free Software Foundation, Inc.
- Contributed by Intel Corporation.
- 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
-/* Define multiple versions only for the definition in lib and for
- DSO. In static binaries we need mempcpy before the initialization
- happened. */
-#if defined SHARED && IS_IN (libc)
- .text
-ENTRY(__mempcpy)
- .type __mempcpy, @gnu_indirect_function
- LOAD_GOT_AND_RTLD_GLOBAL_RO
- LOAD_FUNC_GOT_EAX (__mempcpy_ia32)
- HAS_CPU_FEATURE (SSE2)
- jz 2f
- LOAD_FUNC_GOT_EAX (__mempcpy_sse2_unaligned)
- HAS_ARCH_FEATURE (Fast_Unaligned_Load)
- jnz 2f
- HAS_CPU_FEATURE (SSSE3)
- jz 2f
- LOAD_FUNC_GOT_EAX (__mempcpy_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
- jz 2f
- LOAD_FUNC_GOT_EAX (__mempcpy_ssse3_rep)
-2: ret
-END(__mempcpy)
-
-# undef ENTRY
-# define ENTRY(name) \
- .type __mempcpy_ia32, @function; \
- .p2align 4; \
- .globl __mempcpy_ia32; \
- .hidden __mempcpy_ia32; \
- __mempcpy_ia32: cfi_startproc; \
- CALL_MCOUNT
-# undef END
-# define END(name) \
- cfi_endproc; .size __mempcpy_ia32, .-__mempcpy_ia32
-
-# undef ENTRY_CHK
-# define ENTRY_CHK(name) \
- .type __mempcpy_chk_ia32, @function; \
- .globl __mempcpy_chk_ia32; \
- .p2align 4; \
- __mempcpy_chk_ia32: cfi_startproc; \
- CALL_MCOUNT
-# undef END_CHK
-# define END_CHK(name) \
- cfi_endproc; .size __mempcpy_chk_ia32, .-__mempcpy_chk_ia32
-
-# undef libc_hidden_def
-# undef libc_hidden_builtin_def
-/* IFUNC doesn't work with the hidden functions in shared library since
- they will be called without setting up EBX needed for PLT which is
- used by IFUNC. */
-# define libc_hidden_def(name) \
- .globl __GI_mempcpy; __GI_mempcpy = __mempcpy_ia32
-# define libc_hidden_builtin_def(name) \
- .globl __GI___mempcpy; __GI___mempcpy = __mempcpy_ia32
-#endif
-
-#include "../mempcpy.S"
diff --git a/sysdeps/i386/i686/multiarch/mempcpy.c b/sysdeps/i386/i686/multiarch/mempcpy.c
new file mode 100644
index 0000000000..1ae8773514
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/mempcpy.c
@@ -0,0 +1 @@
+#include <sysdeps/i386/multiarch/mempcpy.c>
diff --git a/sysdeps/i386/i686/multiarch/mempcpy_chk.S b/sysdeps/i386/i686/multiarch/mempcpy_chk.S
deleted file mode 100644
index 1bea6eab38..0000000000
--- a/sysdeps/i386/i686/multiarch/mempcpy_chk.S
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Multiple versions of __mempcpy_chk
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2015 Free Software Foundation, Inc.
- Contributed by Intel Corporation.
- 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
-/* Define multiple versions only for the definition in lib and for
- DSO. There are no multiarch mempcpy functions for static binaries.
- */
-#if IS_IN (libc)
-# ifdef SHARED
- .text
-ENTRY(__mempcpy_chk)
- .type __mempcpy_chk, @gnu_indirect_function
- LOAD_GOT_AND_RTLD_GLOBAL_RO
- LOAD_FUNC_GOT_EAX (__mempcpy_chk_ia32)
- HAS_CPU_FEATURE (SSE2)
- jz 2f
- LOAD_FUNC_GOT_EAX (__mempcpy_chk_sse2_unaligned)
- HAS_ARCH_FEATURE (Fast_Unaligned_Load)
- jnz 2f
- HAS_CPU_FEATURE (SSSE3)
- jz 2f
- LOAD_FUNC_GOT_EAX (__mempcpy_chk_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
- jz 2f
- LOAD_FUNC_GOT_EAX (__mempcpy_chk_ssse3_rep)
-2: ret
-END(__mempcpy_chk)
-# else
-# include "../mempcpy_chk.S"
-# endif
-#endif
diff --git a/sysdeps/i386/i686/multiarch/rtld-memcpy.S b/sysdeps/i386/i686/multiarch/rtld-memcpy.S
new file mode 100644
index 0000000000..0ab09fb554
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/rtld-memcpy.S
@@ -0,0 +1,19 @@
+/* memcpy for ld.so
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdeps/i386/i686/memcpy.S>
diff --git a/sysdeps/i386/i686/multiarch/rtld-memmove.S b/sysdeps/i386/i686/multiarch/rtld-memmove.S
new file mode 100644
index 0000000000..38f589af04
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/rtld-memmove.S
@@ -0,0 +1,19 @@
+/* memmove for ld.so
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdeps/i386/i686/memmove.S>
diff --git a/sysdeps/i386/i686/multiarch/static-memcpy.S b/sysdeps/i386/i686/multiarch/static-memcpy.S
new file mode 100644
index 0000000000..ef9f0b931f
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/static-memcpy.S
@@ -0,0 +1,21 @@
+/* memcpy for libc.a
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#if !defined SHARED && IS_IN (libc)
+# include <sysdeps/i386/i686/memcpy.S>
+#endif
diff --git a/sysdeps/i386/i686/multiarch/static-memmove.S b/sysdeps/i386/i686/multiarch/static-memmove.S
new file mode 100644
index 0000000000..6fc3a39664
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/static-memmove.S
@@ -0,0 +1,21 @@
+/* memmove for libc.a
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#if !defined SHARED && IS_IN (libc)
+# include <sysdeps/i386/i686/memmove.S>
+#endif
diff --git a/sysdeps/i386/i686/multiarch/static-mempcpy.S b/sysdeps/i386/i686/multiarch/static-mempcpy.S
new file mode 100644
index 0000000000..60db75c61b
--- /dev/null
+++ b/sysdeps/i386/i686/multiarch/static-mempcpy.S
@@ -0,0 +1,21 @@
+/* memcpy for libc.a
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#if !defined SHARED && IS_IN (libc)
+# include <sysdeps/i386/i686/mempcpy.S>
+#endif
diff --git a/sysdeps/i386/multiarch/Makefile b/sysdeps/i386/multiarch/Makefile
index 44fabedd1d..58dffcd78e 100644
--- a/sysdeps/i386/multiarch/Makefile
+++ b/sysdeps/i386/multiarch/Makefile
@@ -5,7 +5,16 @@ endif
ifeq ($(subdir),string)
gen-as-const-headers += locale-defines.sym
-sysdep_routines += bzero-i386 bzero-i586 bzero-i686 \
+sysdep_routines += bcopy-i386 bcopy-i686 bcopy-sse2-unaligned \
+ bcopy-ssse3 bcopy-ssse3-rep \
+ memcpy-i386 memcpy-i586 memcpy-i686 \
+ memcpy-sse2-unaligned memcpy-ssse3 memcpy-ssse3-rep \
+ memmove-i386 memmove-i686 memmove-sse2-unaligned \
+ memmove-ssse3 memmove-ssse3-rep \
+ mempcpy-i386 mempcpy-i586 mempcpy-i686 \
+ mempcpy-sse2-unaligned mempcpy-ssse3 mempcpy-ssse3-rep \
+ static-memcpy static-memmove static-mempcpy \
+ bzero-i386 bzero-i586 bzero-i686 \
bzero-sse2 bzero-sse2-rep \
memset-i386 memset-i586 memset-i686 \
memset-sse2 memset-sse2-rep
diff --git a/sysdeps/i386/multiarch/bcopy-i386.S b/sysdeps/i386/multiarch/bcopy-i386.S
new file mode 100644
index 0000000000..dbc9bd176f
--- /dev/null
+++ b/sysdeps/i386/multiarch/bcopy-i386.S
@@ -0,0 +1,12 @@
+#define bcopy __bcopy_i386
+#undef libc_hidden_builtin_def
+#define libc_hidden_builtin_def(name)
+#undef weak_alias
+#define weak_alias(name, aliasname)
+#include <sysdeps/i386/bcopy.S>
+
+#ifdef SHARED
+ .globl __GI_bcopy
+ .hidden __GI_bcopy
+ __GI_bcopy = __bcopy_i386
+#endif
diff --git a/sysdeps/i386/multiarch/bcopy-i686.S b/sysdeps/i386/multiarch/bcopy-i686.S
new file mode 100644
index 0000000000..335ac858e1
--- /dev/null
+++ b/sysdeps/i386/multiarch/bcopy-i686.S
@@ -0,0 +1,6 @@
+#define bcopy __bcopy_i686
+#undef libc_hidden_builtin_def
+#define libc_hidden_builtin_def(name)
+#undef weak_alias
+#define weak_alias(name, aliasname)
+#include <sysdeps/i386/i686/bcopy.S>
diff --git a/sysdeps/i386/i686/multiarch/bcopy-sse2-unaligned.S b/sysdeps/i386/multiarch/bcopy-sse2-unaligned.S
index efef2a10dd..efef2a10dd 100644
--- a/sysdeps/i386/i686/multiarch/bcopy-sse2-unaligned.S
+++ b/sysdeps/i386/multiarch/bcopy-sse2-unaligned.S
diff --git a/sysdeps/i386/i686/multiarch/bcopy-ssse3-rep.S b/sysdeps/i386/multiarch/bcopy-ssse3-rep.S
index cbc8b420e8..cbc8b420e8 100644
--- a/sysdeps/i386/i686/multiarch/bcopy-ssse3-rep.S
+++ b/sysdeps/i386/multiarch/bcopy-ssse3-rep.S
diff --git a/sysdeps/i386/i686/multiarch/bcopy-ssse3.S b/sysdeps/i386/multiarch/bcopy-ssse3.S
index 36aac44b9c..36aac44b9c 100644
--- a/sysdeps/i386/i686/multiarch/bcopy-ssse3.S
+++ b/sysdeps/i386/multiarch/bcopy-ssse3.S
diff --git a/sysdeps/i386/multiarch/bcopy.c b/sysdeps/i386/multiarch/bcopy.c
new file mode 100644
index 0000000000..eefbd4eb86
--- /dev/null
+++ b/sysdeps/i386/multiarch/bcopy.c
@@ -0,0 +1,64 @@
+/* Multiple versions of bcopy.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Define multiple versions only for the definition in lib. */
+#if IS_IN (libc)
+/* Redefine bcopy so that the compiler won't complain about the type
+ mismatch with the IFUNC selector in strong_alias, below. */
+# undef bcopy
+# define bcopy __redirect_bcopy
+# include <string.h>
+# undef bcopy
+
+# include <init-arch.h>
+
+extern __typeof (__redirect_bcopy) __bcopy_i386 attribute_hidden;
+extern __typeof (__redirect_bcopy) __bcopy_i686 attribute_hidden;
+extern __typeof (__redirect_bcopy) __bcopy_sse2_unaligned attribute_hidden;
+extern __typeof (__redirect_bcopy) __bcopy_ssse3 attribute_hidden;
+extern __typeof (__redirect_bcopy) __bcopy_ssse3_rep attribute_hidden;
+
+/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
+ ifunc symbol properly. */
+extern __typeof (__redirect_bcopy) bcopy;
+extern void *bcopy_ifunc (void) __asm__ ("bcopy");
+
+void *
+bcopy_ifunc (void)
+{
+ if (HAS_CPU_FEATURE (SSE2))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Unaligned_Load))
+ return __bcopy_sse2_unaligned;
+ else if (HAS_CPU_FEATURE (SSSE3))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Rep_String))
+ return __bcopy_ssse3_rep;
+ else
+ return __bcopy_ssse3;
+ }
+ }
+
+ if (USE_I686)
+ return __bcopy_i686;
+ else
+ return __bcopy_i386;
+}
+__asm__ (".type bcopy, %gnu_indirect_function");
+#endif
diff --git a/sysdeps/i386/multiarch/ifunc-impl-list.c b/sysdeps/i386/multiarch/ifunc-impl-list.c
index 7bde24e112..d5df5de426 100644
--- a/sysdeps/i386/multiarch/ifunc-impl-list.c
+++ b/sysdeps/i386/multiarch/ifunc-impl-list.c
@@ -36,7 +36,6 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
size_t i = 0;
-#if 0
/* Support sysdeps/i386/i686/multiarch/bcopy.S. */
IFUNC_IMPL (i, name, bcopy,
IFUNC_IMPL_ADD (array, i, bcopy, HAS_CPU_FEATURE (SSSE3),
@@ -45,8 +44,11 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
__bcopy_ssse3)
IFUNC_IMPL_ADD (array, i, bcopy, HAS_CPU_FEATURE (SSE2),
__bcopy_sse2_unaligned)
- IFUNC_IMPL_ADD (array, i, bcopy, 1, __bcopy_ia32))
+ IFUNC_IMPL_ADD (array, i, bcopy, HAS_I686, __bcopy_i686)
+#if MINIMUM_ISA < 686
+ IFUNC_IMPL_ADD (array, i, bcopy, 1, __bcopy_i386)
#endif
+ )
/* Support sysdeps/i386/i686/multiarch/bzero.S. */
IFUNC_IMPL (i, name, bzero,
@@ -77,6 +79,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
IFUNC_IMPL_ADD (array, i, memcmp, HAS_CPU_FEATURE (SSSE3),
__memcmp_ssse3)
IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_ia32))
+#endif
/* Support sysdeps/i386/i686/multiarch/memmove_chk.S. */
IFUNC_IMPL (i, name, __memmove_chk,
@@ -89,8 +92,13 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
IFUNC_IMPL_ADD (array, i, __memmove_chk,
HAS_CPU_FEATURE (SSE2),
__memmove_chk_sse2_unaligned)
+ IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_I686,
+ __memmove_chk_i686)
+#if MINIMUM_ISA < 686
IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
- __memmove_chk_ia32))
+ __memmove_chk_i386)
+#endif
+ )
/* Support sysdeps/i386/i686/multiarch/memmove.S. */
IFUNC_IMPL (i, name, memmove,
@@ -100,8 +108,13 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
__memmove_ssse3)
IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSE2),
__memmove_sse2_unaligned)
- IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_ia32))
+ IFUNC_IMPL_ADD (array, i, memmove, HAS_I686, __memmove_i686)
+#if MINIMUM_ISA < 686
+ IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_i386)
+#endif
+ )
+#if 0
/* Support sysdeps/i386/i686/multiarch/memrchr.S. */
IFUNC_IMPL (i, name, memrchr,
IFUNC_IMPL_ADD (array, i, memrchr, HAS_CPU_FEATURE (SSE2),
@@ -329,6 +342,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSSE3),
__wmemcmp_ssse3)
IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_ia32))
+#endif
#ifdef SHARED
/* Support sysdeps/i386/i686/multiarch/memcpy_chk.S. */
@@ -342,8 +356,15 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
IFUNC_IMPL_ADD (array, i, __memcpy_chk,
HAS_CPU_FEATURE (SSE2),
__memcpy_chk_sse2_unaligned)
+ IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_I686,
+ __memcpy_chk_i686)
+# if MINIMUM_ISA < 686
+ IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_I586,
+ __memcpy_chk_i586)
IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
- __memcpy_chk_ia32))
+ __memcpy_chk_i386)
+# endif
+ )
/* Support sysdeps/i386/i686/multiarch/memcpy.S. */
IFUNC_IMPL (i, name, memcpy,
@@ -353,7 +374,12 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
__memcpy_ssse3)
IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSE2),
__memcpy_sse2_unaligned)
- IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_ia32))
+ IFUNC_IMPL_ADD (array, i, memcpy, HAS_I686, __memcpy_i686)
+#if MINIMUM_ISA < 686
+ IFUNC_IMPL_ADD (array, i, memcpy, HAS_I586, __memcpy_i586)
+ IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_i386)
+# endif
+ )
/* Support sysdeps/i386/i686/multiarch/mempcpy_chk.S. */
IFUNC_IMPL (i, name, __mempcpy_chk,
@@ -366,8 +392,15 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
HAS_CPU_FEATURE (SSE2),
__mempcpy_chk_sse2_unaligned)
+ IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_I686,
+ __mempcpy_chk_i686)
+# if MINIMUM_ISA < 686
+ IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_I586,
+ __mempcpy_chk_i586)
IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
- __mempcpy_chk_ia32))
+ __mempcpy_chk_i386)
+# endif
+ )
/* Support sysdeps/i386/i686/multiarch/mempcpy.S. */
IFUNC_IMPL (i, name, mempcpy,
@@ -377,8 +410,14 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
__mempcpy_ssse3)
IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSE2),
__mempcpy_sse2_unaligned)
- IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_ia32))
+ IFUNC_IMPL_ADD (array, i, mempcpy, HAS_I686, __mempcpy_i686)
+# if MINIMUM_ISA < 686
+ IFUNC_IMPL_ADD (array, i, mempcpy, HAS_I586, __mempcpy_i586)
+ IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_i386)
+# endif
+ )
+#if 0
/* Support sysdeps/i386/i686/multiarch/strlen.S. */
IFUNC_IMPL (i, name, strlen,
IFUNC_IMPL_ADD (array, i, strlen, HAS_CPU_FEATURE (SSE2),
diff --git a/sysdeps/i386/multiarch/memcpy-i386.S b/sysdeps/i386/multiarch/memcpy-i386.S
new file mode 100644
index 0000000000..d26b195369
--- /dev/null
+++ b/sysdeps/i386/multiarch/memcpy-i386.S
@@ -0,0 +1,11 @@
+#ifdef SHARED
+# define memcpy __memcpy_i386
+# define __memcpy_chk __memcpy_chk_i386
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# include <sysdeps/i386/memcpy.S>
+
+ .globl __GI_memcpy
+ .hidden __GI_memcpy
+ __GI_memcpy = __memcpy_i386
+#endif
diff --git a/sysdeps/i386/multiarch/memcpy-i586.S b/sysdeps/i386/multiarch/memcpy-i586.S
new file mode 100644
index 0000000000..a9d89d97d1
--- /dev/null
+++ b/sysdeps/i386/multiarch/memcpy-i586.S
@@ -0,0 +1,7 @@
+#ifdef SHARED
+# define memcpy __memcpy_i586
+# define __memcpy_chk __memcpy_chk_i586
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# include <sysdeps/i386/i586/memcpy.S>
+#endif
diff --git a/sysdeps/i386/multiarch/memcpy-i686.S b/sysdeps/i386/multiarch/memcpy-i686.S
new file mode 100644
index 0000000000..c5f516e931
--- /dev/null
+++ b/sysdeps/i386/multiarch/memcpy-i686.S
@@ -0,0 +1,7 @@
+#ifdef SHARED
+# define memcpy __memcpy_i686
+# define __memcpy_chk __memcpy_chk_i686
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# include <sysdeps/i386/i686/memcpy.S>
+#endif
diff --git a/sysdeps/i386/i686/multiarch/memcpy-sse2-unaligned.S b/sysdeps/i386/multiarch/memcpy-sse2-unaligned.S
index 8215c70b15..8215c70b15 100644
--- a/sysdeps/i386/i686/multiarch/memcpy-sse2-unaligned.S
+++ b/sysdeps/i386/multiarch/memcpy-sse2-unaligned.S
diff --git a/sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S b/sysdeps/i386/multiarch/memcpy-ssse3-rep.S
index 08d877c03a..08d877c03a 100644
--- a/sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S
+++ b/sysdeps/i386/multiarch/memcpy-ssse3-rep.S
diff --git a/sysdeps/i386/i686/multiarch/memcpy-ssse3.S b/sysdeps/i386/multiarch/memcpy-ssse3.S
index 27ab6a2c3e..27ab6a2c3e 100644
--- a/sysdeps/i386/i686/multiarch/memcpy-ssse3.S
+++ b/sysdeps/i386/multiarch/memcpy-ssse3.S
diff --git a/sysdeps/i386/multiarch/memcpy.c b/sysdeps/i386/multiarch/memcpy.c
new file mode 100644
index 0000000000..68401c754a
--- /dev/null
+++ b/sysdeps/i386/multiarch/memcpy.c
@@ -0,0 +1,69 @@
+/* Multiple versions of memcpy.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Define multiple versions only for the definition in lib and for
+ DSO. In static binaries we need memcpy before the initialization
+ happened. */
+#if defined SHARED && IS_IN (libc)
+/* Redefine memcpy so that the compiler won't complain about the type
+ mismatch with the IFUNC selector in strong_alias, below. */
+# undef memcpy
+# define memcpy __redirect_memcpy
+# include <string.h>
+# undef memcpy
+
+# include <init-arch.h>
+
+extern __typeof (__redirect_memcpy) __memcpy_i386 attribute_hidden;
+extern __typeof (__redirect_memcpy) __memcpy_i586 attribute_hidden;
+extern __typeof (__redirect_memcpy) __memcpy_i686 attribute_hidden;
+extern __typeof (__redirect_memcpy) __memcpy_sse2_unaligned attribute_hidden;
+extern __typeof (__redirect_memcpy) __memcpy_ssse3 attribute_hidden;
+extern __typeof (__redirect_memcpy) __memcpy_ssse3_rep attribute_hidden;
+
+/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
+ ifunc symbol properly. */
+extern __typeof (__redirect_memcpy) memcpy;
+extern void *memcpy_ifunc (void) __asm__ ("memcpy");
+
+void *
+memcpy_ifunc (void)
+{
+ if (HAS_CPU_FEATURE (SSE2))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Unaligned_Load))
+ return __memcpy_sse2_unaligned;
+ else if (HAS_CPU_FEATURE (SSSE3))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Rep_String))
+ return __memcpy_ssse3_rep;
+ else
+ return __memcpy_ssse3;
+ }
+ }
+
+ if (USE_I686)
+ return __memcpy_i686;
+ else if (USE_I586)
+ return __memcpy_i586;
+ else
+ return __memcpy_i386;
+}
+__asm__ (".type memcpy, %gnu_indirect_function");
+#endif
diff --git a/sysdeps/i386/multiarch/memcpy_chk.c b/sysdeps/i386/multiarch/memcpy_chk.c
new file mode 100644
index 0000000000..aad6f87a45
--- /dev/null
+++ b/sysdeps/i386/multiarch/memcpy_chk.c
@@ -0,0 +1,70 @@
+/* Multiple versions of __memcpy_chk
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2015 Free Software Foundation, Inc.
+ Contributed by Intel Corporation.
+ 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, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Define multiple versions only for the definition in lib and for
+ DSO. There are no multiarch memcpy functions for static binaries.
+ */
+#if IS_IN (libc)
+# ifdef SHARED
+# include <stddef.h>
+
+extern void * __memcpy_chk (void *, const void *, size_t, size_t);
+
+extern __typeof (__memcpy_chk) __memcpy_chk_i386 attribute_hidden;
+extern __typeof (__memcpy_chk) __memcpy_chk_i586 attribute_hidden;
+extern __typeof (__memcpy_chk) __memcpy_chk_i686 attribute_hidden;
+extern __typeof (__memcpy_chk) __memcpy_chk_sse2_unaligned attribute_hidden;
+extern __typeof (__memcpy_chk) __memcpy_chk_ssse3 attribute_hidden;
+extern __typeof (__memcpy_chk) __memcpy_chk_ssse3_rep attribute_hidden;
+
+# include <init-arch.h>
+
+/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
+ ifunc symbol properly. */
+extern void *memcpy_chk_ifunc (void) __asm__ ("__memcpy_chk");
+
+void *
+memcpy_chk_ifunc (void)
+{
+ if (HAS_CPU_FEATURE (SSE2))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Unaligned_Load))
+ return __memcpy_chk_sse2_unaligned;
+ else if (HAS_CPU_FEATURE (SSSE3))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Rep_String))
+ return __memcpy_chk_ssse3_rep;
+ else
+ return __memcpy_chk_ssse3;
+ }
+ }
+
+ if (USE_I686)
+ return __memcpy_chk_i686;
+ else if (USE_I586)
+ return __memcpy_chk_i586;
+ else
+ return __memcpy_chk_i386;
+}
+__asm__ (".type __memcpy_chk, %gnu_indirect_function");
+# else
+# include <debug/memcpy_chk.c>
+# endif
+#endif
diff --git a/sysdeps/i386/multiarch/memmove-i386.S b/sysdeps/i386/multiarch/memmove-i386.S
new file mode 100644
index 0000000000..af21d2d305
--- /dev/null
+++ b/sysdeps/i386/multiarch/memmove-i386.S
@@ -0,0 +1,11 @@
+#ifdef SHARED
+# define memmove __memmove_i386
+# define __memmove_chk __memmove_chk_i386
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# include <sysdeps/i386/memmove.S>
+
+ .globl __GI_memmove
+ .hidden __GI_memmove
+ __GI_memmove = __memmove_i386
+#endif
diff --git a/sysdeps/i386/multiarch/memmove-i686.S b/sysdeps/i386/multiarch/memmove-i686.S
new file mode 100644
index 0000000000..bde4051b49
--- /dev/null
+++ b/sysdeps/i386/multiarch/memmove-i686.S
@@ -0,0 +1,7 @@
+#ifdef SHARED
+# define memmove __memmove_i686
+# define __memmove_chk __memmove_chk_i686
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# include <sysdeps/i386/i686/memmove.S>
+#endif
diff --git a/sysdeps/i386/i686/multiarch/memmove-sse2-unaligned.S b/sysdeps/i386/multiarch/memmove-sse2-unaligned.S
index 3873594cb2..3873594cb2 100644
--- a/sysdeps/i386/i686/multiarch/memmove-sse2-unaligned.S
+++ b/sysdeps/i386/multiarch/memmove-sse2-unaligned.S
diff --git a/sysdeps/i386/i686/multiarch/memmove-ssse3-rep.S b/sysdeps/i386/multiarch/memmove-ssse3-rep.S
index d202fc4a13..d202fc4a13 100644
--- a/sysdeps/i386/i686/multiarch/memmove-ssse3-rep.S
+++ b/sysdeps/i386/multiarch/memmove-ssse3-rep.S
diff --git a/sysdeps/i386/i686/multiarch/memmove-ssse3.S b/sysdeps/i386/multiarch/memmove-ssse3.S
index 295430b1ef..295430b1ef 100644
--- a/sysdeps/i386/i686/multiarch/memmove-ssse3.S
+++ b/sysdeps/i386/multiarch/memmove-ssse3.S
diff --git a/sysdeps/i386/multiarch/memmove.c b/sysdeps/i386/multiarch/memmove.c
new file mode 100644
index 0000000000..e47d15ee5e
--- /dev/null
+++ b/sysdeps/i386/multiarch/memmove.c
@@ -0,0 +1,66 @@
+/* Multiple versions of memmove.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Define multiple versions only for the definition in lib and for
+ DSO. In static binaries we need memmove before the initialization
+ happened. */
+#if defined SHARED && IS_IN (libc)
+/* Redefine memmove so that the compiler won't complain about the type
+ mismatch with the IFUNC selector in strong_alias, below. */
+# undef memmove
+# define memmove __redirect_memmove
+# include <string.h>
+# undef memmove
+
+# include <init-arch.h>
+
+extern __typeof (__redirect_memmove) __memmove_i386 attribute_hidden;
+extern __typeof (__redirect_memmove) __memmove_i686 attribute_hidden;
+extern __typeof (__redirect_memmove) __memmove_sse2_unaligned attribute_hidden;
+extern __typeof (__redirect_memmove) __memmove_ssse3 attribute_hidden;
+extern __typeof (__redirect_memmove) __memmove_ssse3_rep attribute_hidden;
+
+/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
+ ifunc symbol properly. */
+extern __typeof (__redirect_memmove) memmove;
+extern void *memmove_ifunc (void) __asm__ ("memmove");
+
+void *
+memmove_ifunc (void)
+{
+ if (HAS_CPU_FEATURE (SSE2))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Unaligned_Load))
+ return __memmove_sse2_unaligned;
+ else if (HAS_CPU_FEATURE (SSSE3))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Rep_String))
+ return __memmove_ssse3_rep;
+ else
+ return __memmove_ssse3;
+ }
+ }
+
+ if (USE_I686)
+ return __memmove_i686;
+ else
+ return __memmove_i386;
+}
+__asm__ (".type memmove, %gnu_indirect_function");
+#endif
diff --git a/sysdeps/i386/multiarch/memmove_chk.c b/sysdeps/i386/multiarch/memmove_chk.c
new file mode 100644
index 0000000000..d34c19ab67
--- /dev/null
+++ b/sysdeps/i386/multiarch/memmove_chk.c
@@ -0,0 +1,105 @@
+/* Multiple versions of __memmove_chk
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2015 Free Software Foundation, Inc.
+ Contributed by Intel Corporation.
+ 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, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Define multiple versions only for the definition in lib. */
+#if IS_IN (libc)
+# include <stddef.h>
+
+extern void * __memmove_chk (void *, const void *, size_t, size_t);
+
+# ifdef SHARED
+extern __typeof (__memmove_chk) __memmove_chk_i386 attribute_hidden;
+extern __typeof (__memmove_chk) __memmove_chk_i686 attribute_hidden;
+extern __typeof (__memmove_chk) __memmove_chk_sse2_unaligned attribute_hidden;
+extern __typeof (__memmove_chk) __memmove_chk_ssse3 attribute_hidden;
+extern __typeof (__memmove_chk) __memmove_chk_ssse3_rep attribute_hidden;
+
+# include <init-arch.h>
+# else
+/* Redefine memmove so that the compiler won't complain about the type
+ mismatch with the IFUNC selector in strong_alias, below. */
+# undef memmove
+# define memmove __redirect_memmove
+# include <string.h>
+# undef memmove
+
+extern __typeof (__redirect_memmove) __memmove_i386 attribute_hidden;
+extern __typeof (__redirect_memmove) __memmove_i686 attribute_hidden;
+extern __typeof (__redirect_memmove) __memmove_sse2_unaligned attribute_hidden;
+extern __typeof (__redirect_memmove) __memmove_ssse3 attribute_hidden;
+extern __typeof (__redirect_memmove) __memmove_ssse3_rep attribute_hidden;
+
+/* Due to
+ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=10837
+ noreturn attribute disable tail call optimization. Removes noreturn
+ attribute to enable tail call optimization. */
+extern void *chk_fail (void) __asm__ ("__chk_fail") attribute_hidden;
+
+# include <init-arch.h>
+
+#define ifunc_chk(func, arch) \
+static void * \
+func##_chk_##arch (void *dstpp, const void *srcpp, size_t len, \
+ size_t dstlen) \
+{ \
+ if (__glibc_unlikely (dstlen < len)) \
+ return chk_fail (); \
+ return func##_##arch (dstpp, srcpp, len); \
+}
+
+# if MINIMUM_ISA < 686
+ifunc_chk (__memmove, i386)
+# else
+extern __typeof (__memmove_chk) __memmove_chk_i386 attribute_hidden;
+# endif
+
+ifunc_chk (__memmove, i686)
+ifunc_chk (__memmove, sse2_unaligned)
+ifunc_chk (__memmove, ssse3)
+ifunc_chk (__memmove, ssse3_rep)
+# endif
+
+/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
+ ifunc symbol properly. */
+extern void *memmove_chk_ifunc (void) __asm__ ("__memmove_chk");
+
+void *
+memmove_chk_ifunc (void)
+{
+ if (HAS_CPU_FEATURE (SSE2))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Unaligned_Load))
+ return __memmove_chk_sse2_unaligned;
+ else if (HAS_CPU_FEATURE (SSSE3))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Rep_String))
+ return __memmove_chk_ssse3_rep;
+ else
+ return __memmove_chk_ssse3;
+ }
+ }
+
+ if (USE_I686)
+ return __memmove_chk_i686;
+ else
+ return __memmove_chk_i386;
+}
+__asm__ (".type __memmove_chk, %gnu_indirect_function");
+#endif
diff --git a/sysdeps/i386/multiarch/mempcpy-i386.S b/sysdeps/i386/multiarch/mempcpy-i386.S
new file mode 100644
index 0000000000..39f72b6a1c
--- /dev/null
+++ b/sysdeps/i386/multiarch/mempcpy-i386.S
@@ -0,0 +1,18 @@
+#ifdef SHARED
+# define __mempcpy __mempcpy_i386
+# define __mempcpy_chk __mempcpy_chk_i386
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# undef libc_hidden_def
+# define libc_hidden_def(name)
+# undef weak_alias
+# define weak_alias(name, aliasname)
+# include <sysdeps/i386/mempcpy.S>
+
+ .globl __GI_mempcpy
+ .hidden __GI_mempcpy
+ __GI_mempcpy = __mempcpy_i386
+ .globl __GI___mempcpy
+ .hidden __GI___mempcpy
+ __GI___mempcpy = __mempcpy_i386
+#endif
diff --git a/sysdeps/i386/multiarch/mempcpy-i586.S b/sysdeps/i386/multiarch/mempcpy-i586.S
new file mode 100644
index 0000000000..cb0d241a60
--- /dev/null
+++ b/sysdeps/i386/multiarch/mempcpy-i586.S
@@ -0,0 +1,11 @@
+#ifdef SHARED
+# define __mempcpy __mempcpy_i586
+# define __mempcpy_chk __mempcpy_chk_i586
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# undef libc_hidden_def
+# define libc_hidden_def(name)
+# undef weak_alias
+# define weak_alias(name, aliasname)
+# include <sysdeps/i386/i586/mempcpy.S>
+#endif
diff --git a/sysdeps/i386/multiarch/mempcpy-i686.S b/sysdeps/i386/multiarch/mempcpy-i686.S
new file mode 100644
index 0000000000..1b5fba6c1a
--- /dev/null
+++ b/sysdeps/i386/multiarch/mempcpy-i686.S
@@ -0,0 +1,11 @@
+#ifdef SHARED
+# define __mempcpy __mempcpy_i686
+# define __mempcpy_chk __mempcpy_chk_i686
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# undef libc_hidden_def
+# define libc_hidden_def(name)
+# undef weak_alias
+# define weak_alias(name, aliasname)
+# include <sysdeps/i386/i686/mempcpy.S>
+#endif
diff --git a/sysdeps/i386/i686/multiarch/mempcpy-sse2-unaligned.S b/sysdeps/i386/multiarch/mempcpy-sse2-unaligned.S
index a1cea50771..a1cea50771 100644
--- a/sysdeps/i386/i686/multiarch/mempcpy-sse2-unaligned.S
+++ b/sysdeps/i386/multiarch/mempcpy-sse2-unaligned.S
diff --git a/sysdeps/i386/i686/multiarch/mempcpy-ssse3-rep.S b/sysdeps/i386/multiarch/mempcpy-ssse3-rep.S
index 5357b33e18..5357b33e18 100644
--- a/sysdeps/i386/i686/multiarch/mempcpy-ssse3-rep.S
+++ b/sysdeps/i386/multiarch/mempcpy-ssse3-rep.S
diff --git a/sysdeps/i386/i686/multiarch/mempcpy-ssse3.S b/sysdeps/i386/multiarch/mempcpy-ssse3.S
index 822d98e954..822d98e954 100644
--- a/sysdeps/i386/i686/multiarch/mempcpy-ssse3.S
+++ b/sysdeps/i386/multiarch/mempcpy-ssse3.S
diff --git a/sysdeps/i386/multiarch/mempcpy.c b/sysdeps/i386/multiarch/mempcpy.c
new file mode 100644
index 0000000000..a267477d20
--- /dev/null
+++ b/sysdeps/i386/multiarch/mempcpy.c
@@ -0,0 +1,71 @@
+/* Multiple versions of mempcpy.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Define multiple versions only for the definition in lib and for
+ DSO. In static binaries we need mempcpy before the initialization
+ happened. */
+#if defined SHARED && IS_IN (libc)
+# define _HAVE_STRING_ARCH_mempcpy
+/* Redefine mempcpy so that the compiler won't complain about the type
+ mismatch with the IFUNC selector in strong_alias, below. */
+# undef mempcpy
+# define mempcpy __redirect_mempcpy
+# include <string.h>
+# undef mempcpy
+
+# include <init-arch.h>
+
+extern __typeof (__redirect_mempcpy) __mempcpy_i386 attribute_hidden;
+extern __typeof (__redirect_mempcpy) __mempcpy_i586 attribute_hidden;
+extern __typeof (__redirect_mempcpy) __mempcpy_i686 attribute_hidden;
+extern __typeof (__redirect_mempcpy) __mempcpy_sse2_unaligned attribute_hidden;
+extern __typeof (__redirect_mempcpy) __mempcpy_ssse3 attribute_hidden;
+extern __typeof (__redirect_mempcpy) __mempcpy_ssse3_rep attribute_hidden;
+
+/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
+ ifunc symbol properly. */
+extern __typeof (__redirect_mempcpy) __mempcpy;
+extern void *mempcpy_ifunc (void) __asm__ ("__mempcpy");
+
+void *
+mempcpy_ifunc (void)
+{
+ if (HAS_CPU_FEATURE (SSE2))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Unaligned_Load))
+ return __mempcpy_sse2_unaligned;
+ else if (HAS_CPU_FEATURE (SSSE3))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Rep_String))
+ return __mempcpy_ssse3_rep;
+ else
+ return __mempcpy_ssse3;
+ }
+ }
+
+ if (USE_I686)
+ return __mempcpy_i686;
+ else if (USE_I586)
+ return __mempcpy_i586;
+ else
+ return __mempcpy_i386;
+}
+__asm__ (".type __mempcpy, %gnu_indirect_function");
+weak_alias (__mempcpy, mempcpy)
+#endif
diff --git a/sysdeps/i386/multiarch/mempcpy_chk.c b/sysdeps/i386/multiarch/mempcpy_chk.c
new file mode 100644
index 0000000000..b1e1fd6b8d
--- /dev/null
+++ b/sysdeps/i386/multiarch/mempcpy_chk.c
@@ -0,0 +1,70 @@
+/* Multiple versions of __mempcpy_chk
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2015 Free Software Foundation, Inc.
+ Contributed by Intel Corporation.
+ 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, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Define multiple versions only for the definition in lib and for
+ DSO. There are no multiarch mempcpy functions for static binaries.
+ */
+#if IS_IN (libc)
+# ifdef SHARED
+# include <stddef.h>
+
+extern void * __mempcpy_chk (void *, const void *, size_t, size_t);
+
+extern __typeof (__mempcpy_chk) __mempcpy_chk_i386 attribute_hidden;
+extern __typeof (__mempcpy_chk) __mempcpy_chk_i586 attribute_hidden;
+extern __typeof (__mempcpy_chk) __mempcpy_chk_i686 attribute_hidden;
+extern __typeof (__mempcpy_chk) __mempcpy_chk_sse2_unaligned attribute_hidden;
+extern __typeof (__mempcpy_chk) __mempcpy_chk_ssse3 attribute_hidden;
+extern __typeof (__mempcpy_chk) __mempcpy_chk_ssse3_rep attribute_hidden;
+
+# include <init-arch.h>
+
+/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
+ ifunc symbol properly. */
+extern void *mempcpy_chk_ifunc (void) __asm__ ("__mempcpy_chk");
+
+void *
+mempcpy_chk_ifunc (void)
+{
+ if (HAS_CPU_FEATURE (SSE2))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Unaligned_Load))
+ return __mempcpy_chk_sse2_unaligned;
+ else if (HAS_CPU_FEATURE (SSSE3))
+ {
+ if (HAS_ARCH_FEATURE (Fast_Rep_String))
+ return __mempcpy_chk_ssse3_rep;
+ else
+ return __mempcpy_chk_ssse3;
+ }
+ }
+
+ if (USE_I686)
+ return __mempcpy_chk_i686;
+ else if (USE_I586)
+ return __mempcpy_chk_i586;
+ else
+ return __mempcpy_chk_i386;
+}
+__asm__ (".type __mempcpy_chk, %gnu_indirect_function");
+# else
+# include <debug/mempcpy_chk.c>
+# endif
+#endif
diff --git a/sysdeps/i386/multiarch/rtld-memmove.S b/sysdeps/i386/multiarch/rtld-memmove.S
new file mode 100644
index 0000000000..d1312ecf3c
--- /dev/null
+++ b/sysdeps/i386/multiarch/rtld-memmove.S
@@ -0,0 +1,19 @@
+/* memmove for ld.so
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdeps/i386/memmove.S>
diff --git a/sysdeps/i386/multiarch/static-memcpy.S b/sysdeps/i386/multiarch/static-memcpy.S
new file mode 100644
index 0000000000..b7d6b2aea9
--- /dev/null
+++ b/sysdeps/i386/multiarch/static-memcpy.S
@@ -0,0 +1,21 @@
+/* memcpy for libc.a
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#if !defined SHARED && IS_IN (libc)
+# include <sysdeps/i386/memcpy.S>
+#endif
diff --git a/sysdeps/i386/multiarch/static-memmove.S b/sysdeps/i386/multiarch/static-memmove.S
new file mode 100644
index 0000000000..086f394b29
--- /dev/null
+++ b/sysdeps/i386/multiarch/static-memmove.S
@@ -0,0 +1,21 @@
+/* memmove for libc.a
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#if !defined SHARED && IS_IN (libc)
+# include <sysdeps/i386/memmove.S>
+#endif
diff --git a/sysdeps/i386/multiarch/static-mempcpy.S b/sysdeps/i386/multiarch/static-mempcpy.S
new file mode 100644
index 0000000000..27c035c003
--- /dev/null
+++ b/sysdeps/i386/multiarch/static-mempcpy.S
@@ -0,0 +1,21 @@
+/* memcpy for libc.a
+ Copyright (C) 2015 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#if !defined SHARED && IS_IN (libc)
+# include <sysdeps/i386/mempcpy.S>
+#endif