PowerPC64 strncpy, stpncpy and strstr fixes

Makes __stpncpy_power8 call __memset_power8 directly rather than via an
IFUNC.  Fixes a missing _mcount, and removes some redundant NOPS.  The
*_is_local defines are also used in a followup patch.

	* sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S: Define
	MEMSET_is_local.
	* sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S: Likewise.
	* sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S: Likewise.
	* sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S: Likewise.
	Define MEMSET.
	* sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S: Define
	STRLEN_is_local, STRNLEN_is_local, and STRCHR_is_local.
	* sysdeps/powerpc/powerpc64/power7/strstr.S: Likewise.  Don't add
	nop after local calls.
	* sysdeps/powerpc/powerpc64/power7/strncpy.S: Define MEMSET_is_local.
	Don't add nop after local call.
	* sysdeps/powerpc/powerpc64/power8/strncpy.S: Likewise.  Add missing
	CALL_MCOUNT.
This commit is contained in:
Alan Modra 2017-06-14 10:44:59 +09:30
parent 4b6e7667db
commit de7ee73d6f
9 changed files with 56 additions and 0 deletions

View File

@ -1,3 +1,20 @@
2017-06-14 Alan Modra <amodra@gmail.com>
* sysdeps/powerpc/powerpc64/multiarch/strncpy-power7.S: Define
MEMSET_is_local.
* sysdeps/powerpc/powerpc64/multiarch/strncpy-power8.S: Likewise.
* sysdeps/powerpc/powerpc64/multiarch/stpncpy-power7.S: Likewise.
* sysdeps/powerpc/powerpc64/multiarch/stpncpy-power8.S: Likewise.
Define MEMSET.
* sysdeps/powerpc/powerpc64/multiarch/strstr-power7.S: Define
STRLEN_is_local, STRNLEN_is_local, and STRCHR_is_local.
* sysdeps/powerpc/powerpc64/power7/strstr.S: Likewise. Don't add
nop after local calls.
* sysdeps/powerpc/powerpc64/power7/strncpy.S: Define MEMSET_is_local.
Don't add nop after local call.
* sysdeps/powerpc/powerpc64/power8/strncpy.S: Likewise. Add missing
CALL_MCOUNT.
2017-06-14 Alan Modra <amodra@gmail.com>
* sysdeps/powerpc/powerpc64/sysdep.h: Formatting.

View File

@ -26,5 +26,8 @@
#define libc_hidden_builtin_def(name)
#define MEMSET __memset_power7
#ifdef SHARED
#define MEMSET_is_local
#endif
#include <sysdeps/powerpc/powerpc64/power7/stpncpy.S>

View File

@ -25,4 +25,9 @@
#undef libc_hidden_builtin_def
#define libc_hidden_builtin_def(name)
#define MEMSET __memset_power8
#ifdef SHARED
#define MEMSET_is_local
#endif
#include <sysdeps/powerpc/powerpc64/power8/stpncpy.S>

View File

@ -24,5 +24,8 @@
#define libc_hidden_builtin_def(name)
#define MEMSET __memset_power7
#ifdef SHARED
#define MEMSET_is_local
#endif
#include <sysdeps/powerpc/powerpc64/power7/strncpy.S>

View File

@ -25,5 +25,8 @@
/* memset is used to pad the end of the string. */
#define MEMSET __memset_power8
#ifdef SHARED
#define MEMSET_is_local
#endif
#include <sysdeps/powerpc/powerpc64/power8/strncpy.S>

View File

@ -26,5 +26,10 @@
#define STRLEN __strlen_power7
#define STRNLEN __strnlen_power7
#define STRCHR __strchr_power7
#ifdef SHARED
#define STRLEN_is_local
#define STRNLEN_is_local
#define STRCHR_is_local
#endif
#include <sysdeps/powerpc/powerpc64/power7/strstr.S>

View File

@ -59,6 +59,7 @@
/* For builds with no IFUNC support, local calls should be made to internal
GLIBC symbol (created by libc_hidden_builtin_def). */
# ifdef SHARED
# define MEMSET_is_local
# define MEMSET __GI_memset
# else
# define MEMSET memset
@ -223,7 +224,9 @@ L(zeroFill):
li r4, 0 /* zero fill buffer */
mr r5, r8 /* how many bytes to fill buffer with */
bl MEMSET /* call optimized memset */
#ifndef MEMSET_is_local
nop
#endif
L(update3return):
#ifdef USE_AS_STPNCPY

View File

@ -34,6 +34,7 @@
GLIBC symbol (created by libc_hidden_builtin_def). */
# ifdef SHARED
# define STRLEN __GI_strlen
# define STRLEN_is_local
# else
# define STRLEN strlen
# endif
@ -44,6 +45,7 @@
GLIBC symbol (created by libc_hidden_builtin_def). */
# ifdef SHARED
# define STRNLEN __GI_strnlen
# define STRNLEN_is_local
# else
# define STRNLEN __strnlen
# endif
@ -52,6 +54,7 @@
#ifndef STRCHR
# ifdef SHARED
# define STRCHR __GI_strchr
# define STRCHR_is_local
# else
# define STRCHR strchr
# endif
@ -86,7 +89,9 @@ EALIGN (STRSTR, 4, 0)
mr r30, r4
mr r3, r4
bl STRLEN
#ifndef STRLEN_is_local
nop
#endif
cmpdi cr7, r3, 0 /* If search str is null. */
beq cr7, L(ret_r3)
@ -95,14 +100,18 @@ EALIGN (STRSTR, 4, 0)
mr r4, r3
mr r3, r29
bl STRNLEN
#ifndef STRNLEN_is_local
nop
#endif
cmpd cr7, r3, r31 /* If len(r3) < len(r4). */
blt cr7, L(retnull)
mr r3, r29
lbz r4, 0(r30)
bl STRCHR
#ifndef STRCHR_is_local
nop
#endif
mr r11, r3
/* If first char of search str is not present. */
@ -334,7 +343,9 @@ L(begin):
beq cr7, L(default)
lbz r4, 0(r30)
bl STRCHR
#ifndef STRCHR_is_local
nop
#endif
/* If first char of search str is not present. */
cmpdi cr7, r3, 0
ble cr7, L(end)
@ -437,7 +448,9 @@ L(nextbyte):
beq cr7, L(default)
lbz r4, 0(r30)
bl STRCHR
#ifndef STRCHR_is_local
nop
#endif
/* If first char of search str is not present. */
cmpdi cr7, r3, 0
ble cr7, L(end)

View File

@ -36,6 +36,7 @@
/* For builds without IFUNC support, local calls should be made to internal
GLIBC symbol (created by libc_hidden_builtin_def). */
# ifdef SHARED
# define MEMSET_is_local
# define MEMSET __GI_memset
# else
# define MEMSET memset
@ -61,6 +62,7 @@
.machine power7
EALIGN (FUNC_NAME, 4, 0)
CALL_MCOUNT 3
/* Check if the [src]+15 will cross a 4K page by checking if the bit
indicating the page size changes. Basically:
@ -242,7 +244,9 @@ L(zero_pad_start_1):
cfi_adjust_cfa_offset(FRAMESIZE)
bl MEMSET
#ifndef MEMSET_is_local
nop
#endif
/* Restore the stack frame. */
addi r1,r1,FRAMESIZE