This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.23-358-g4c01126


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  4c011268960c6f24650672597deed756f21ad363 (commit)
       via  71655832555411915d157b17253c8ffe0848533a (commit)
       via  074b0f27d9b9cdfb58c5c7e7f4129546084582b2 (commit)
       via  04bb21ac93e90d7696bcaf8febe2b2dd2d83585a (commit)
      from  dea39b13e2958a7f0e75b5594a06d97d61cc439f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=4c011268960c6f24650672597deed756f21ad363

commit 4c011268960c6f24650672597deed756f21ad363
Author: Stefan Liebler <stli@linux.vnet.ibm.com>
Date:   Tue May 24 10:39:13 2016 +0200

    S390: Implement mempcpy with help of memcpy. [BZ #19765]
    
    There exist optimized memcpy functions on s390, but no optimized mempcpy.
    This patch adds mempcpy entry points in memcpy.S files, which
    use the memcpy implementation. Now mempcpy itself is also an IFUNC function
    as memcpy is and the variants are listed in ifunc-impl-list.c.
    
    The s390 string.h does not define _HAVE_STRING_ARCH_mempcpy.
    Instead mempcpy string/string.h inlines memcpy() + n.
    If n is constant and small enough, GCC emits instructions like mvi or mvc
    and avoids the function call to memcpy.
    If n is not constant, then memcpy is called and n is added afterwards.
    If _HAVE_STRING_ARCH_mempcpy would be defined, mempcpy would be called in
    every case.
    
    According to PR70140 "Inefficient expansion of __builtin_mempcpy"
    (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70140) GCC should handle a
    call to mempcpy in the same way as memcpy. Then either the mempcpy macro
    in string/string.h has to be removed or _HAVE_STRING_ARCH_mempcpy has to
    be defined for S390.
    
    ChangeLog:
    
    	[BZ #19765]
    	* sysdeps/s390/mempcpy.S: New File.
    	* sysdeps/s390/multiarch/mempcpy.c: Likewise.
    	* sysdeps/s390/multiarch/Makefile (sysdep_routines): Add mempcpy.
    	* sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list):
    	Add mempcpy variants.
    	* sysdeps/s390/s390-32/memcpy.S: Add mempcpy entry point.
    	(memcpy): Adjust to be usable from mempcpy entry point.
    	(__memcpy_mvcle): Likewise.
    	* sysdeps/s390/s390-64/memcpy.S: Likewise.
    	* sysdeps/s390/s390-32/multiarch/memcpy-s390.S: Add entry points
    	____mempcpy_z196, ____mempcpy_z10 and add __GI_ symbols for mempcpy.
    	(__memcpy_z196): Adjust to be usable from mempcpy entry point.
    	(__memcpy_z10): Likewise.
    	* sysdeps/s390/s390-64/multiarch/memcpy-s390x.S: Likewise.

diff --git a/ChangeLog b/ChangeLog
index 1054ca7..3345a1d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
 2016-05-24  Stefan Liebler  <stli@linux.vnet.ibm.com>
 
+	[BZ #19765]
+	* sysdeps/s390/mempcpy.S: New File.
+	* sysdeps/s390/multiarch/mempcpy.c: Likewise.
+	* sysdeps/s390/multiarch/Makefile (sysdep_routines): Add mempcpy.
+	* sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list):
+	Add mempcpy variants.
+	* sysdeps/s390/s390-32/memcpy.S: Add mempcpy entry point.
+	(memcpy): Adjust to be usable from mempcpy entry point.
+	(__memcpy_mvcle): Likewise.
+	* sysdeps/s390/s390-64/memcpy.S: Likewise.
+	* sysdeps/s390/s390-32/multiarch/memcpy-s390.S: Add entry points
+	____mempcpy_z196, ____mempcpy_z10 and add __GI_ symbols for mempcpy.
+	(__memcpy_z196): Adjust to be usable from mempcpy entry point.
+	(__memcpy_z10): Likewise.
+	* sysdeps/s390/s390-64/multiarch/memcpy-s390x.S: Likewise.
+
+2016-05-24  Stefan Liebler  <stli@linux.vnet.ibm.com>
+
 	* sysdeps/s390/multiarch/ifunc-resolve.h (s390_libc_ifunc):
 	Remove __GI_ symbol.
 	* sysdeps/s390/s390-32/multiarch/memcmp-s390.S: Add __GI_memcmp symbol.
diff --git a/sysdeps/s390/mempcpy.S b/sysdeps/s390/mempcpy.S
new file mode 100644
index 0000000..c62074b
--- /dev/null
+++ b/sysdeps/s390/mempcpy.S
@@ -0,0 +1,19 @@
+/* CPU specific mempcpy without multiarch - 32/64 bit S/390 version.
+   Copyright (C) 2016 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/>.  */
+
+/* mempcpy is implemented in memcpy.S.  */
diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile
index 0805b07..89324ca 100644
--- a/sysdeps/s390/multiarch/Makefile
+++ b/sysdeps/s390/multiarch/Makefile
@@ -18,7 +18,8 @@ sysdep_routines += strlen strlen-vx strlen-c \
 		   memchr memchr-vx \
 		   rawmemchr rawmemchr-vx rawmemchr-c \
 		   memccpy memccpy-vx memccpy-c \
-		   memrchr memrchr-vx memrchr-c
+		   memrchr memrchr-vx memrchr-c \
+		   mempcpy
 endif
 
 ifeq ($(subdir),wcsmbs)
diff --git a/sysdeps/s390/multiarch/ifunc-impl-list.c b/sysdeps/s390/multiarch/ifunc-impl-list.c
index 62a4359..89898ec 100644
--- a/sysdeps/s390/multiarch/ifunc-impl-list.c
+++ b/sysdeps/s390/multiarch/ifunc-impl-list.c
@@ -69,6 +69,13 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
 			      S390_IS_Z10 (stfle_bits), __memcpy_z10)
 	      IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_default))
 
+  IFUNC_IMPL (i, name, mempcpy,
+	      IFUNC_IMPL_ADD (array, i, mempcpy,
+			      S390_IS_Z196 (stfle_bits), ____mempcpy_z196)
+	      IFUNC_IMPL_ADD (array, i, mempcpy,
+			      S390_IS_Z10 (stfle_bits), ____mempcpy_z10)
+	      IFUNC_IMPL_ADD (array, i, mempcpy, 1, ____mempcpy_default))
+
 #endif /* SHARED */
 
 #ifdef HAVE_S390_VX_ASM_SUPPORT
diff --git a/sysdeps/s390/multiarch/mempcpy.c b/sysdeps/s390/multiarch/mempcpy.c
new file mode 100644
index 0000000..34d8329
--- /dev/null
+++ b/sysdeps/s390/multiarch/mempcpy.c
@@ -0,0 +1,26 @@
+/* Multiple versions of mempcpy.
+   Copyright (C) 2016 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 <ifunc-resolve.h>
+s390_libc_ifunc (__mempcpy)
+
+__asm__ (".weak mempcpy\n\t"
+	 ".set mempcpy,__mempcpy\n\t");
+#endif
diff --git a/sysdeps/s390/s390-32/memcpy.S b/sysdeps/s390/s390-32/memcpy.S
index 2ac51ab..6be5104 100644
--- a/sysdeps/s390/s390-32/memcpy.S
+++ b/sysdeps/s390/s390-32/memcpy.S
@@ -25,12 +25,23 @@
      %r3 = address of source memory area
      %r4 = number of bytes to copy.  */
 
-#ifdef USE_MULTIARCH
-ENTRY(__memcpy_default)
-#else
-ENTRY(memcpy)
+       .text
+ENTRY(__mempcpy)
+	.machine "g5"
+	lr      %r1,%r2             # Use as dest
+	la      %r2,0(%r4,%r2)      # Return dest + n
+	j	.L_G5_start
+END(__mempcpy)
+#ifndef USE_MULTIARCH
+libc_hidden_def (__mempcpy)
+weak_alias (__mempcpy, mempcpy)
+libc_hidden_builtin_def (mempcpy)
 #endif
+
+ENTRY(memcpy)
 	.machine "g5"
+	lr      %r1,%r2             # r1: Use as dest ; r2: Return dest
+.L_G5_start:
 	st      %r13,52(%r15)
 	.cfi_offset 13, -44
 	basr    %r13,0
@@ -41,14 +52,13 @@ ENTRY(memcpy)
 	lr      %r5,%r4
 	srl     %r5,8
 	ltr     %r5,%r5
-	lr      %r1,%r2
 	jne     .L_G5_13
 	ex      %r4,.L_G5_17-.L_G5_16(%r13)
 .L_G5_4:
 	l       %r13,52(%r15)
 	br      %r14
 .L_G5_13:
-	chi	%r5,4096             # Switch to mvcle for copies >1MB
+	chi	%r5,4096            # Switch to mvcle for copies >1MB
 	jh	__memcpy_mvcle
 .L_G5_12:
 	mvc     0(256,%r1),0(%r3)
@@ -59,24 +69,24 @@ ENTRY(memcpy)
 	j       .L_G5_4
 .L_G5_17:
 	mvc     0(1,%r1),0(%r3)
-#ifdef USE_MULTIARCH
-END(__memcpy_default)
-#else
 END(memcpy)
+#ifndef USE_MULTIARCH
 libc_hidden_builtin_def (memcpy)
 #endif
 
 ENTRY(__memcpy_mvcle)
-       # Using as standalone function will result in unexpected
-       # results since the length field is incremented by 1 in order to
-       # compensate the changes already done in the functions above.
-       ahi     %r4,1               # length + 1
-       lr      %r5,%r4             # source length
-       lr      %r4,%r3             # source address
-       lr      %r3,%r5             # destination length = source length
+	# Using as standalone function will result in unexpected
+	# results since the length field is incremented by 1 in order to
+	# compensate the changes already done in the functions above.
+	lr      %r0,%r2             # backup return dest [ + n ]
+	ahi     %r4,1               # length + 1
+	lr      %r5,%r4             # source length
+	lr      %r4,%r3             # source address
+	lr      %r2,%r1             # destination address
+	lr      %r3,%r5             # destination length = source length
 .L_MVCLE_1:
-       mvcle   %r2,%r4,0           # thats it, MVCLE is your friend
-       jo      .L_MVCLE_1
-       lr      %r2,%r1             # return destination address
-       br      %r14
+	mvcle   %r2,%r4,0           # thats it, MVCLE is your friend
+	jo      .L_MVCLE_1
+	lr      %r2,%r0             # return destination address
+	br      %r14
 END(__memcpy_mvcle)
diff --git a/sysdeps/s390/s390-32/multiarch/memcpy-s390.S b/sysdeps/s390/s390-32/multiarch/memcpy-s390.S
index 92ffaea..297a894 100644
--- a/sysdeps/s390/s390-32/multiarch/memcpy-s390.S
+++ b/sysdeps/s390/s390-32/multiarch/memcpy-s390.S
@@ -29,14 +29,23 @@
 
 #if defined SHARED && IS_IN (libc)
 
+ENTRY(____mempcpy_z196)
+	.machine "z196"
+	.machinemode "zarch_nohighgprs"
+	lr      %r1,%r2         # Use as dest
+	la      %r2,0(%r4,%r2)  # Return dest + n
+	j	.L_Z196_start
+END(____mempcpy_z196)
+
 ENTRY(__memcpy_z196)
 	.machine "z196"
 	.machinemode "zarch_nohighgprs"
+	lr      %r1,%r2         # r1: Use as dest ; r2: Return dest
+.L_Z196_start:
 	llgfr   %r4,%r4
 	ltgr    %r4,%r4
 	je      .L_Z196_4
 	aghi    %r4,-1
-	lr      %r1,%r2
 	srlg    %r5,%r4,8
 	ltgr    %r5,%r5
 	jne     .L_Z196_5
@@ -60,13 +69,22 @@ ENTRY(__memcpy_z196)
 	mvc     0(1,%r1),0(%r3)
 END(__memcpy_z196)
 
+ENTRY(____mempcpy_z10)
+	.machine "z10"
+	.machinemode "zarch_nohighgprs"
+	lr      %r1,%r2         # Use as dest
+	la      %r2,0(%r4,%r2)  # Return dest + n
+	j	.L_Z10_start
+END(____mempcpy_z10)
+
 ENTRY(__memcpy_z10)
 	.machine "z10"
 	.machinemode "zarch_nohighgprs"
+	lr      %r1,%r2         # r1: Use as dest ; r2: Return dest
+.L_Z10_start:
 	llgfr   %r4,%r4
 	cgije   %r4,0,.L_Z10_4
 	aghi    %r4,-1
-	lr      %r1,%r2
 	srlg    %r5,%r4,8
 	cgijlh  %r5,0,.L_Z10_13
 .L_Z10_3:
@@ -88,14 +106,23 @@ ENTRY(__memcpy_z10)
 	mvc     0(1,%r1),0(%r3)
 END(__memcpy_z10)
 
+# define __mempcpy ____mempcpy_default
 #endif /* SHARED && IS_IN (libc) */
 
+#define memcpy __memcpy_default
 #include "../memcpy.S"
+#undef memcpy
 
 #if defined SHARED && IS_IN (libc)
 .globl   __GI_memcpy
 .set     __GI_memcpy,__memcpy_default
+.globl   __GI_mempcpy
+.set     __GI_mempcpy,____mempcpy_default
+.globl   __GI___mempcpy
+.set     __GI___mempcpy,____mempcpy_default
 #else
 .globl   memcpy
 .set     memcpy,__memcpy_default
+.weak    mempcpy
+.set     mempcpy,__mempcpy
 #endif
diff --git a/sysdeps/s390/s390-64/memcpy.S b/sysdeps/s390/s390-64/memcpy.S
index 9d60a14..e3ace0c 100644
--- a/sysdeps/s390/s390-64/memcpy.S
+++ b/sysdeps/s390/s390-64/memcpy.S
@@ -27,19 +27,27 @@
 
 
        .text
+ENTRY(__mempcpy)
+	.machine "z900"
+	lgr     %r1,%r2             # Use as dest
+	la      %r2,0(%r4,%r2)      # Return dest + n
+	j	.L_Z900_start
+END(__mempcpy)
+#ifndef USE_MULTIARCH
+libc_hidden_def (__mempcpy)
+weak_alias (__mempcpy, mempcpy)
+libc_hidden_builtin_def (mempcpy)
+#endif
 
-#ifdef USE_MULTIARCH
-ENTRY(__memcpy_default)
-#else
 ENTRY(memcpy)
-#endif
 	.machine "z900"
+	lgr     %r1,%r2             # r1: Use as dest ; r2: Return dest
+.L_Z900_start:
 	ltgr    %r4,%r4
 	je      .L_Z900_4
 	aghi    %r4,-1
 	srlg    %r5,%r4,8
 	ltgr    %r5,%r5
-	lgr     %r1,%r2
 	jne     .L_Z900_13
 .L_Z900_3:
 	larl    %r5,.L_Z900_15
@@ -57,25 +65,24 @@ ENTRY(memcpy)
 	j       .L_Z900_3
 .L_Z900_15:
 	mvc     0(1,%r1),0(%r3)
-
-#ifdef USE_MULTIARCH
-END(__memcpy_default)
-#else
 END(memcpy)
+#ifndef USE_MULTIARCH
 libc_hidden_builtin_def (memcpy)
 #endif
 
 ENTRY(__memcpy_mvcle)
-       # Using as standalone function will result in unexpected
-       # results since the length field is incremented by 1 in order to
-       # compensate the changes already done in the functions above.
-       aghi    %r4,1               # length + 1
-       lgr     %r5,%r4             # source length
-       lgr     %r4,%r3             # source address
-       lgr     %r3,%r5             # destination length = source length
+	# Using as standalone function will result in unexpected
+	# results since the length field is incremented by 1 in order to
+	# compensate the changes already done in the functions above.
+	lgr     %r0,%r2             # backup return dest [ + n ]
+	aghi    %r4,1               # length + 1
+	lgr     %r5,%r4             # source length
+	lgr     %r4,%r3             # source address
+	lgr     %r2,%r1             # destination address
+	lgr     %r3,%r5             # destination length = source length
 .L_MVCLE_1:
-       mvcle   %r2,%r4,0           # thats it, MVCLE is your friend
-       jo      .L_MVCLE_1
-       lgr     %r2,%r1             # return destination address
-       br      %r14
+	mvcle   %r2,%r4,0           # thats it, MVCLE is your friend
+	jo      .L_MVCLE_1
+	lgr     %r2,%r0             # return destination address
+	br      %r14
 END(__memcpy_mvcle)
diff --git a/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S b/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S
index 8f54526..0f5a36e 100644
--- a/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S
+++ b/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S
@@ -29,12 +29,20 @@
 
 #if defined SHARED && IS_IN (libc)
 
+ENTRY(____mempcpy_z196)
+	.machine "z196"
+	lgr     %r1,%r2         # Use as dest
+	la      %r2,0(%r4,%r2)  # Return dest + n
+	j	.L_Z196_start
+END(____mempcpy_z196)
+
 ENTRY(__memcpy_z196)
 	.machine "z196"
+	lgr     %r1,%r2         # r1: Use as dest ; r2: Return dest
+.L_Z196_start:
 	ltgr    %r4,%r4
 	je      .L_Z196_4
 	aghi    %r4,-1
-	lgr     %r1,%r2
 	srlg    %r5,%r4,8
 	ltgr    %r5,%r5
 	jne     .L_Z196_5
@@ -58,11 +66,19 @@ ENTRY(__memcpy_z196)
 	mvc     0(1,%r1),0(%r3)
 END(__memcpy_z196)
 
+ENTRY(____mempcpy_z10)
+	.machine "z10"
+	lgr     %r1,%r2         # Use as dest
+	la      %r2,0(%r4,%r2)  # Return dest + n
+	j	.L_Z10_start
+END(____mempcpy_z10)
+
 ENTRY(__memcpy_z10)
 	.machine "z10"
+	lgr     %r1,%r2         # r1: Use as dest ; r2: Return dest
+.L_Z10_start:
 	cgije   %r4,0,.L_Z10_4
 	aghi    %r4,-1
-	lgr     %r1,%r2
 	srlg    %r5,%r4,8
 	cgijlh  %r5,0,.L_Z10_13
 .L_Z10_3:
@@ -84,14 +100,23 @@ ENTRY(__memcpy_z10)
 	mvc     0(1,%r1),0(%r3)
 END(__memcpy_z10)
 
+# define __mempcpy ____mempcpy_default
 #endif /* SHARED && IS_IN (libc) */
 
+#define memcpy __memcpy_default
 #include "../memcpy.S"
+#undef memcpy
 
 #if defined SHARED && IS_IN (libc)
 .globl   __GI_memcpy
 .set     __GI_memcpy,__memcpy_default
+.globl   __GI_mempcpy
+.set     __GI_mempcpy,____mempcpy_default
+.globl   __GI___mempcpy
+.set     __GI___mempcpy,____mempcpy_default
 #else
 .globl   memcpy
 .set     memcpy,__memcpy_default
+.weak    mempcpy
+.set     mempcpy,__mempcpy
 #endif

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=71655832555411915d157b17253c8ffe0848533a

commit 71655832555411915d157b17253c8ffe0848533a
Author: Stefan Liebler <stli@linux.vnet.ibm.com>
Date:   Tue May 24 10:39:13 2016 +0200

    S390: Do not call memcpy, memcmp, memset within libc.so via ifunc-plt.
    
    On s390, the memcpy, memcmp, memset functions are IFUNC symbols,
    which are created with s390_libc_ifunc-macro.
    This macro creates a __GI_ symbol which is set to the
    ifunced symbol. Thus calls within libc.so to e.g. memcpy
    result in a call to *ABS*+0x954c0@plt stub and afterwards
    to the resolved memcpy-ifunc-variant.
    
    This patch sets the __GI_ symbol to the default-ifunc-variant
    to avoid the plt call. The __GI_ symbols are now created at the
    default variant of ifunced function.
    
    ChangeLog:
    
    	* sysdeps/s390/multiarch/ifunc-resolve.h (s390_libc_ifunc):
    	Remove __GI_ symbol.
    	* sysdeps/s390/s390-32/multiarch/memcmp-s390.S: Add __GI_memcmp symbol.
    	* sysdeps/s390/s390-64/multiarch/memcmp-s390x.S: Likewise.
    	* sysdeps/s390/s390-32/multiarch/memcpy-s390.S: Add __GI_memcpy symbol.
    	* sysdeps/s390/s390-64/multiarch/memcpy-s390x.S: Likewise.
    	* sysdeps/s390/s390-32/multiarch/memset-s390.S: Add __GI_memset symbol.
    	* sysdeps/s390/s390-64/multiarch/memset-s390x.S: Likewise.

diff --git a/ChangeLog b/ChangeLog
index 1bacd71..1054ca7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2016-05-24  Stefan Liebler  <stli@linux.vnet.ibm.com>
 
+	* sysdeps/s390/multiarch/ifunc-resolve.h (s390_libc_ifunc):
+	Remove __GI_ symbol.
+	* sysdeps/s390/s390-32/multiarch/memcmp-s390.S: Add __GI_memcmp symbol.
+	* sysdeps/s390/s390-64/multiarch/memcmp-s390x.S: Likewise.
+	* sysdeps/s390/s390-32/multiarch/memcpy-s390.S: Add __GI_memcpy symbol.
+	* sysdeps/s390/s390-64/multiarch/memcpy-s390x.S: Likewise.
+	* sysdeps/s390/s390-32/multiarch/memset-s390.S: Add __GI_memset symbol.
+	* sysdeps/s390/s390-64/multiarch/memset-s390x.S: Likewise.
+
+2016-05-24  Stefan Liebler  <stli@linux.vnet.ibm.com>
+
 	* sysdeps/s390/s390-64/memcpy.S (memcpy):
 	Use cghi instead of chi to compare 64bit value.
 
diff --git a/sysdeps/s390/multiarch/ifunc-resolve.h b/sysdeps/s390/multiarch/ifunc-resolve.h
index 744a0d8..26e097a 100644
--- a/sysdeps/s390/multiarch/ifunc-resolve.h
+++ b/sysdeps/s390/multiarch/ifunc-resolve.h
@@ -44,9 +44,7 @@
 #define s390_libc_ifunc(FUNC)						\
   __asm__ (".globl " #FUNC "\n\t"					\
 	   ".type  " #FUNC ",@gnu_indirect_function\n\t"		\
-	   ".set   " #FUNC ",__resolve_" #FUNC "\n\t"			\
-	   ".globl __GI_" #FUNC "\n\t"					\
-	   ".set   __GI_" #FUNC "," #FUNC "\n");			\
+	   ".set   " #FUNC ",__resolve_" #FUNC "\n\t");			\
 									\
   /* Make the declarations of the optimized functions hidden in order
      to prevent GOT slots being generated for them. */			\
diff --git a/sysdeps/s390/s390-32/multiarch/memcmp-s390.S b/sysdeps/s390/s390-32/multiarch/memcmp-s390.S
index e9ee6d2..a01f3b7 100644
--- a/sysdeps/s390/s390-32/multiarch/memcmp-s390.S
+++ b/sysdeps/s390/s390-32/multiarch/memcmp-s390.S
@@ -101,4 +101,7 @@ END(__memcmp_z10)
 .set     memcmp,__memcmp_default
 .weak    bcmp
 .set	 bcmp,__memcmp_default
+#elif defined SHARED && IS_IN (libc)
+.globl   __GI_memcmp
+.set     __GI_memcmp,__memcmp_default
 #endif
diff --git a/sysdeps/s390/s390-32/multiarch/memcpy-s390.S b/sysdeps/s390/s390-32/multiarch/memcpy-s390.S
index 4e30cdf..92ffaea 100644
--- a/sysdeps/s390/s390-32/multiarch/memcpy-s390.S
+++ b/sysdeps/s390/s390-32/multiarch/memcpy-s390.S
@@ -92,7 +92,10 @@ END(__memcpy_z10)
 
 #include "../memcpy.S"
 
-#if !defined SHARED || !IS_IN (libc)
+#if defined SHARED && IS_IN (libc)
+.globl   __GI_memcpy
+.set     __GI_memcpy,__memcpy_default
+#else
 .globl   memcpy
 .set     memcpy,__memcpy_default
 #endif
diff --git a/sysdeps/s390/s390-32/multiarch/memset-s390.S b/sysdeps/s390/s390-32/multiarch/memset-s390.S
index 47277c1..a2ddd98 100644
--- a/sysdeps/s390/s390-32/multiarch/memset-s390.S
+++ b/sysdeps/s390/s390-32/multiarch/memset-s390.S
@@ -110,4 +110,7 @@ END(__memset_mvcle)
 #if !IS_IN (libc)
 .globl   memset
 .set     memset,__memset_default
+#elif defined SHARED && IS_IN (libc)
+.globl   __GI_memset
+.set     __GI_memset,__memset_default
 #endif
diff --git a/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S b/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S
index 2a4c0ae..b28ccaf 100644
--- a/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S
+++ b/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S
@@ -98,4 +98,7 @@ END(__memcmp_z10)
 .set     memcmp,__memcmp_default
 .weak    bcmp
 .set	 bcmp,__memcmp_default
+#elif defined SHARED && IS_IN (libc)
+.globl   __GI_memcmp
+.set     __GI_memcmp,__memcmp_default
 #endif
diff --git a/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S b/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S
index 69fa562..8f54526 100644
--- a/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S
+++ b/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S
@@ -88,7 +88,10 @@ END(__memcpy_z10)
 
 #include "../memcpy.S"
 
-#if !defined SHARED || !IS_IN (libc)
+#if defined SHARED && IS_IN (libc)
+.globl   __GI_memcpy
+.set     __GI_memcpy,__memcpy_default
+#else
 .globl   memcpy
 .set     memcpy,__memcpy_default
 #endif
diff --git a/sysdeps/s390/s390-64/multiarch/memset-s390x.S b/sysdeps/s390/s390-64/multiarch/memset-s390x.S
index 05e0682..a77e798 100644
--- a/sysdeps/s390/s390-64/multiarch/memset-s390x.S
+++ b/sysdeps/s390/s390-64/multiarch/memset-s390x.S
@@ -106,4 +106,7 @@ END(__memset_mvcle)
 #if !IS_IN (libc)
 .globl   memset
 .set     memset,__memset_default
+#elif defined SHARED && IS_IN (libc)
+.globl   __GI_memset
+.set     __GI_memset,__memset_default
 #endif

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=074b0f27d9b9cdfb58c5c7e7f4129546084582b2

commit 074b0f27d9b9cdfb58c5c7e7f4129546084582b2
Author: Stefan Liebler <stli@linux.vnet.ibm.com>
Date:   Tue May 24 10:39:13 2016 +0200

    S390: Use 64bit instruction to check for copies of > 1MB with mvcle.
    
    The __memcpy_default variant on s390 64bit calculates the number of
    256byte blocks in a 64bit register and checks, if they exceed 1MB
    to jump to mvcle. Otherwise a mvc-loop is used. The compare-instruction
    only checks a 32bit value.
    This patch uses a 64bit compare.
    
    ChangeLog:
    
    	* sysdeps/s390/s390-64/memcpy.S (memcpy):
    	Use cghi instead of chi to compare 64bit value.

diff --git a/ChangeLog b/ChangeLog
index d2b34a8..1bacd71 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2016-05-24  Stefan Liebler  <stli@linux.vnet.ibm.com>
 
+	* sysdeps/s390/s390-64/memcpy.S (memcpy):
+	Use cghi instead of chi to compare 64bit value.
+
+2016-05-24  Stefan Liebler  <stli@linux.vnet.ibm.com>
+
 	* sysdeps/s390/s390-32/memcpy.S (memcpy):
 	Jump to 1MB check before executing mvc-loop.
 
diff --git a/sysdeps/s390/s390-64/memcpy.S b/sysdeps/s390/s390-64/memcpy.S
index e84a357..9d60a14 100644
--- a/sysdeps/s390/s390-64/memcpy.S
+++ b/sysdeps/s390/s390-64/memcpy.S
@@ -47,7 +47,7 @@ ENTRY(memcpy)
 .L_Z900_4:
 	br      %r14
 .L_Z900_13:
-	chi	%r5,4096             # Switch to mvcle for copies >1MB
+	cghi	%r5,4096            # Switch to mvcle for copies >1MB
 	jh      __memcpy_mvcle
 .L_Z900_12:
 	mvc     0(256,%r1),0(%r3)

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=04bb21ac93e90d7696bcaf8febe2b2dd2d83585a

commit 04bb21ac93e90d7696bcaf8febe2b2dd2d83585a
Author: Stefan Liebler <stli@linux.vnet.ibm.com>
Date:   Tue May 24 10:39:13 2016 +0200

    S390: Use mvcle for copies > 1MB on 32bit with default memcpy variant.
    
    If more than 255 bytes should be copied, the algorithm jumps away.
    Before this patch, it jumps to the mvc-loop (.L_G5_12).
    Now it jumps first to the "> 1MB" check, which jumps away to
    __memcpy_mvcle. Otherwise, the mvc-loop (.L_G5_12) copies the bytes.
    
    ChangeLog:
    
    	* sysdeps/s390/s390-32/memcpy.S (memcpy):
    	Jump to 1MB check before executing mvc-loop.

diff --git a/ChangeLog b/ChangeLog
index 2b51267..d2b34a8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-05-24  Stefan Liebler  <stli@linux.vnet.ibm.com>
+
+	* sysdeps/s390/s390-32/memcpy.S (memcpy):
+	Jump to 1MB check before executing mvc-loop.
+
 2016-05-24  Florian Weimer  <fweimer@redhat.com>
 
 	[BZ #6527]
diff --git a/sysdeps/s390/s390-32/memcpy.S b/sysdeps/s390/s390-32/memcpy.S
index 62ecbbf..2ac51ab 100644
--- a/sysdeps/s390/s390-32/memcpy.S
+++ b/sysdeps/s390/s390-32/memcpy.S
@@ -42,7 +42,7 @@ ENTRY(memcpy)
 	srl     %r5,8
 	ltr     %r5,%r5
 	lr      %r1,%r2
-	jne     .L_G5_12
+	jne     .L_G5_13
 	ex      %r4,.L_G5_17-.L_G5_16(%r13)
 .L_G5_4:
 	l       %r13,52(%r15)

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |   39 +++++++++++++++
 posix/tst-execvpe2.c => sysdeps/s390/mempcpy.S     |    5 +-
 sysdeps/s390/multiarch/Makefile                    |    3 +-
 sysdeps/s390/multiarch/ifunc-impl-list.c           |    7 +++
 sysdeps/s390/multiarch/ifunc-resolve.h             |    4 +-
 .../multiarch/memcpy.c => multiarch/mempcpy.c}     |   10 ++--
 sysdeps/s390/s390-32/memcpy.S                      |   52 ++++++++++++--------
 sysdeps/s390/s390-32/multiarch/memcmp-s390.S       |    3 +
 sysdeps/s390/s390-32/multiarch/memcpy-s390.S       |   36 ++++++++++++-
 sysdeps/s390/s390-32/multiarch/memset-s390.S       |    3 +
 sysdeps/s390/s390-64/memcpy.S                      |   49 +++++++++++--------
 sysdeps/s390/s390-64/multiarch/memcmp-s390x.S      |    3 +
 sysdeps/s390/s390-64/multiarch/memcpy-s390x.S      |   34 ++++++++++++-
 sysdeps/s390/s390-64/multiarch/memset-s390x.S      |    3 +
 14 files changed, 192 insertions(+), 59 deletions(-)
 copy posix/tst-execvpe2.c => sysdeps/s390/mempcpy.S (87%)
 copy sysdeps/s390/{s390-32/multiarch/memcpy.c => multiarch/mempcpy.c} (81%)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]