diff options
Diffstat (limited to 'sysdeps/powerpc')
-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/rtld-strnlen.c | 1 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/multiarch/strnlen-c.c | 8 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/multiarch/strnlen-power7.S (renamed from sysdeps/powerpc/powerpc32/power7/strnlen.S) | 6 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/multiarch/strnlen.S | 70 |
6 files changed, 90 insertions, 5 deletions
diff --git a/sysdeps/powerpc/powerpc32/multiarch/Makefile b/sysdeps/powerpc/powerpc32/multiarch/Makefile index 22deb1759f..e5981f404c 100644 --- a/sysdeps/powerpc/powerpc32/multiarch/Makefile +++ b/sysdeps/powerpc/powerpc32/multiarch/Makefile @@ -3,5 +3,6 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \ memcmp-power7 memset-power4 memset-power6 memset-power7 \ bzero-power4 bzero-power6 bzero-power7 \ strncmp-power7 strncmp-power4 strlen-power7 \ - strcasecmp-power7 strcasecmp_l-power7 + strcasecmp-power7 strcasecmp_l-power7 \ + strnlen-power7 strnlen-c endif diff --git a/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c index 7ca97acdf7..7975c00bba 100644 --- a/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c +++ b/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c @@ -106,6 +106,13 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, __strcasecmp_l_power7) IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1, __strcasecmp_l_ppc32)) + + IFUNC_IMPL (i, name, strnlen, + IFUNC_IMPL_ADD (array, i, strnlen, + hwcap & PPC_FEATURE_HAS_VSX, + __strnlen_power7) + IFUNC_IMPL_ADD (array, i, strnlen, 1, + __strnlen_ppc32)) #endif return i; diff --git a/sysdeps/powerpc/powerpc32/multiarch/rtld-strnlen.c b/sysdeps/powerpc/powerpc32/multiarch/rtld-strnlen.c new file mode 100644 index 0000000000..1aa5440644 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/multiarch/rtld-strnlen.c @@ -0,0 +1 @@ +#include <string/strnlen.c> diff --git a/sysdeps/powerpc/powerpc32/multiarch/strnlen-c.c b/sysdeps/powerpc/powerpc32/multiarch/strnlen-c.c new file mode 100644 index 0000000000..cc27cc1039 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/multiarch/strnlen-c.c @@ -0,0 +1,8 @@ +#define STRNLEN __strnlen_ppc32 +#ifdef SHARED +# undef libc_hidden_def +# define libc_hidden_def(name) \ + __hidden_ver1 (__strnlen_ppc32, __GI_strnlen, __strnlen_ppc32); +#endif + +#include "string/strnlen.c" diff --git a/sysdeps/powerpc/powerpc32/power7/strnlen.S b/sysdeps/powerpc/powerpc32/multiarch/strnlen-power7.S index ed088366a2..63ac8215b6 100644 --- a/sysdeps/powerpc/powerpc32/power7/strnlen.S +++ b/sysdeps/powerpc/powerpc32/multiarch/strnlen-power7.S @@ -21,7 +21,7 @@ /* int [r3] strnlen (char *s [r3], int size [r4]) */ .machine power7 -ENTRY (__strnlen) +ENTRY (__strnlen_power7) CALL_MCOUNT dcbt 0,r3 clrrwi r8,r3,2 /* Align the address to word boundary. */ @@ -164,6 +164,4 @@ L(loop_small): cmplw r9,r7 bge L(end_max) b L(loop_small) -END (__strnlen) -weak_alias (__strnlen, strnlen) -libc_hidden_builtin_def (strnlen) +END (__strnlen_power7) diff --git a/sysdeps/powerpc/powerpc32/multiarch/strnlen.S b/sysdeps/powerpc/powerpc32/multiarch/strnlen.S new file mode 100644 index 0000000000..1b3f46eaf1 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/multiarch/strnlen.S @@ -0,0 +1,70 @@ +/* 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/>. */ + +#include <sysdep.h> +#include <rtld-global-offsets.h> + +/* Define multiple versions only for the definition in libc. */ +#ifndef NOT_IN_libc + .text +ENTRY(__strnlen) + .type __strnlen, @gnu_indirect_function +# ifdef PIC + mflr r6 + cfi_register (lr,r6) + SETUP_GOT_ACCESS (r5,got_label) + addis r5,r5,_GLOBAL_OFFSET_TABLE_-got_label@ha + addi r5,r5,_GLOBAL_OFFSET_TABLE_-got_label@l + mtlr r6 + cfi_same_value (lr) +# ifdef SHARED + lwz r6,_rtld_global_ro@got(r5) + /* If _rtld_global_ro is not initialized use the default ppc32 + implementation. */ + cmplwi r6,0 + beq L(ppc32) + lwz r6,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(r6) +# else + lwz r6,_dl_hwcap@got(r5) + lwz r6,4(r6) +# endif +# else /* PIC */ + lis r6,(_dl_hwcap+4)@ha + lwz r6,(_dl_hwcap+4)@l(r6) +# endif + andi. r7,r6,PPC_FEATURE_HAS_VSX + bne L(power7) +L(ppc32): +# ifdef PIC + lwz r3,__strnlen_ppc32@got(r5) +# else + lis r3,__strnlen_ppc32@ha + lwz r3,__strnlen_ppc32@l(r3) +# endif + blr +L(power7): +# ifdef PIC + lwz r3,__strnlen_power7@got(r5) +# else + lis r3,__strnlen_power7@ha + lwz r3,__strnlen_power7@l(r3) +# endif + blr +END(__strnlen) + +weak_alias (__strnlen, strnlen) +#endif |