diff options
author | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2013-03-29 09:41:33 -0500 |
---|---|---|
committer | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2013-03-29 09:41:33 -0500 |
commit | 6c46b8fb4683ffdb45b121d4e2ea641dd8a97158 (patch) | |
tree | 70ecb381348b8e68c937c6909f8ce530f32e5149 | |
parent | 4a39ed05f9036246a32a2faddbb42b28c303bc91 (diff) | |
download | glibc-6c46b8fb4683ffdb45b121d4e2ea641dd8a97158.tar glibc-6c46b8fb4683ffdb45b121d4e2ea641dd8a97158.tar.gz glibc-6c46b8fb4683ffdb45b121d4e2ea641dd8a97158.tar.bz2 glibc-6c46b8fb4683ffdb45b121d4e2ea641dd8a97158.zip |
PowerPC: mempcpy ifunc for PPC32
-rw-r--r-- | string/mempcpy.c | 8 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/multiarch/Makefile | 3 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c | 7 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/multiarch/mempcpy-c.c | 8 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/multiarch/mempcpy-power7.S (renamed from sysdeps/powerpc/powerpc32/power7/mempcpy.S) | 7 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/multiarch/mempcpy.c | 36 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/multiarch/rtld-memcpy.c | 2 |
7 files changed, 63 insertions, 8 deletions
diff --git a/string/mempcpy.c b/string/mempcpy.c index c0d2448205..92a1137cb0 100644 --- a/string/mempcpy.c +++ b/string/mempcpy.c @@ -21,14 +21,18 @@ #include <string.h> -#undef mempcpy #undef __mempcpy +#ifdef MEMPCPY +# define __mempcpy MEMPCPY +#endif void * __mempcpy (void *dest, const void *src, size_t len) { return memcpy (dest, src, len) + len; } -libc_hidden_def (__mempcpy) +#ifndef MEMPCPY weak_alias (__mempcpy, mempcpy) +libc_hidden_def (__mempcpy) +#endif libc_hidden_builtin_def (mempcpy) diff --git a/sysdeps/powerpc/powerpc32/multiarch/Makefile b/sysdeps/powerpc/powerpc32/multiarch/Makefile index e5981f404c..c7c0d8c455 100644 --- a/sysdeps/powerpc/powerpc32/multiarch/Makefile +++ b/sysdeps/powerpc/powerpc32/multiarch/Makefile @@ -4,5 +4,6 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \ bzero-power4 bzero-power6 bzero-power7 \ strncmp-power7 strncmp-power4 strlen-power7 \ strcasecmp-power7 strcasecmp_l-power7 \ - strnlen-power7 strnlen-c + strnlen-power7 strnlen-c \ + mempcpy-power7 mempcpy-c endif diff --git a/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c index 7975c00bba..c295caf720 100644 --- a/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c +++ b/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c @@ -82,6 +82,13 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, __memcpy_cell) IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_ppc32)) + IFUNC_IMPL (i, name, mempcpy, + IFUNC_IMPL_ADD (array, i, mempcpy, + hwcap & PPC_FEATURE_HAS_VSX, + __mempcpy_power7) + IFUNC_IMPL_ADD (array, i, mempcpy, 1, + __mempcpy_ppc32)) + IFUNC_IMPL (i, name, strlen, IFUNC_IMPL_ADD (array, i, strlen, hwcap & PPC_FEATURE_HAS_VSX, __strlen_power7) diff --git a/sysdeps/powerpc/powerpc32/multiarch/mempcpy-c.c b/sysdeps/powerpc/powerpc32/multiarch/mempcpy-c.c new file mode 100644 index 0000000000..0ca7a0e03d --- /dev/null +++ b/sysdeps/powerpc/powerpc32/multiarch/mempcpy-c.c @@ -0,0 +1,8 @@ +#define MEMPCPY __mempcpy_ppc32 +#ifdef SHARED +# undef libc_hidden_builtin_def +# define libc_hidden_builtin_def(name) \ + __hidden_ver1 (__mempcpy_ppc32, __GI_mempcpy, __mempcpy_ppc32); +#endif + +#include "string/mempcpy.c" diff --git a/sysdeps/powerpc/powerpc32/power7/mempcpy.S b/sysdeps/powerpc/powerpc32/multiarch/mempcpy-power7.S index 5ad4edb580..0cc37ae4c1 100644 --- a/sysdeps/powerpc/powerpc32/power7/mempcpy.S +++ b/sysdeps/powerpc/powerpc32/multiarch/mempcpy-power7.S @@ -23,7 +23,7 @@ Returns 'dst' + 'len'. */ .machine power7 -EALIGN (__mempcpy, 5, 0) +EALIGN (__mempcpy_power7, 5, 0) CALL_MCOUNT stwu 1,-32(1) @@ -462,7 +462,4 @@ L(end_unaligned_loop): addi 1,1,32 blr -END (__mempcpy) -libc_hidden_def (__mempcpy) -weak_alias (__mempcpy, mempcpy) -libc_hidden_builtin_def (mempcpy) +END (__mempcpy_power7) diff --git a/sysdeps/powerpc/powerpc32/multiarch/mempcpy.c b/sysdeps/powerpc/powerpc32/multiarch/mempcpy.c new file mode 100644 index 0000000000..d2a3a8b39c --- /dev/null +++ b/sysdeps/powerpc/powerpc32/multiarch/mempcpy.c @@ -0,0 +1,36 @@ +/* Multiple versions of mempcpy. + Copyright (C) 2013 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/>. */ + +#ifndef NOT_IN_libc +# include <string.h> +# include <shlib-compat.h> +# include "init-arch.h" + +extern __typeof (__mempcpy) __mempcpy_ppc32 attribute_hidden; +extern __typeof (__mempcpy) __mempcpy_power7 attribute_hidden; + +/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle + ifunc symbol properly. */ +libc_ifunc (__mempcpy, + (hwcap & PPC_FEATURE_HAS_VSX) + ? __mempcpy_power7 + : __mempcpy_ppc32); + +weak_alias (__mempcpy, mempcpy) +libc_hidden_def (mempcpy) +#endif diff --git a/sysdeps/powerpc/powerpc32/multiarch/rtld-memcpy.c b/sysdeps/powerpc/powerpc32/multiarch/rtld-memcpy.c new file mode 100644 index 0000000000..b1b06479d2 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/multiarch/rtld-memcpy.c @@ -0,0 +1,2 @@ +#include <string/memcpy.c> +#include <string/mempcpy.c> |