diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-08-20 06:28:49 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-08-27 09:35:10 -0700 |
commit | 21596c745d841e6b3384f1af93cfe1df4afc6648 (patch) | |
tree | a64b3953f72d1a160fd207276299c65ba4490b03 | |
parent | 42f926f9bd9e52fddd526268efccf5bd93d4f0dd (diff) | |
download | glibc-21596c745d841e6b3384f1af93cfe1df4afc6648.tar.gz glibc-21596c745d841e6b3384f1af93cfe1df4afc6648.tar.xz glibc-21596c745d841e6b3384f1af93cfe1df4afc6648.zip |
Add i386 memcpy family multiarch functions
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 |