| commit 6c6b8c747096d74b900e2711b9b0d463677f6d31 |
| Author: Stefan Liebler <stli@linux.ibm.com> |
| Date: Tue Dec 18 13:57:05 2018 +0100 |
| |
| S390: Unify 31/64bit memcmp. |
| |
| The implementation of memcmp for s390-32 (31bit) and |
| s390-64 (64bit) is nearly the same. |
| This patch unifies it for maintability reasons. |
| |
| __memcmp_z10 and __memcmp_z196 differs between 31 and 64bit: |
| -31bit needs .machinemode "zarch_nohighgprs" and llgfr %r4,%r4 |
| -lr vs lgr and some other instructions: |
| But lgr and co can be also used on 31bit as this ifunc variant |
| is only called if we are on a zarch machine. |
| |
| __memcmp_default differs between 31 and 64bit: |
| -Some 31bit vs 64bit instructions (e.g. ltr vs ltgr. |
| Solved with 31/64 specific instruction macros). |
| -The address of mvc instruction is setup in different ways |
| (larl vs bras). Solved with #if defined __s390x__. |
| |
| Otherwise 31/64bit implementation has the same structure of the code. |
| |
| ChangeLog: |
| |
| * sysdeps/s390/s390-64/memcmp.S: Move to ... |
| * sysdeps/s390/memcmp.S: ... here. |
| Adjust to be usable for 31/64bit. |
| * sysdeps/s390/s390-32/memcmp.S: Delete File. |
| * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add memcmp. |
| * sysdeps/s390/s390-32/multiarch/Makefile (sysdep_routines): |
| Remove memcmp. |
| * sysdeps/s390/s390-64/multiarch/Makefile: Likewise. |
| * sysdeps/s390/s390-64/multiarch/memcmp-s390x.S: Move to ... |
| * sysdeps/s390/multiarch/memcmp-s390x.S: ... here. |
| Adjust to be usable for 31/64bit. |
| * sysdeps/s390/s390-32/multiarch/memcmp-s390.S: Delete File. |
| * sysdeps/s390/s390-64/multiarch/memcmp.c: Move to ... |
| * sysdeps/s390/multiarch/memcmp.c: ... here. |
| * sysdeps/s390/s390-32/multiarch/memcmp.c: Delete File. |
| |
| diff --git a/sysdeps/s390/s390-64/memcmp.S b/sysdeps/s390/memcmp.S |
| similarity index 60% |
| rename from sysdeps/s390/s390-64/memcmp.S |
| rename to sysdeps/s390/memcmp.S |
| index 005b19de45fcd883..751293a99e34f530 100644 |
| |
| |
| @@ -1,4 +1,4 @@ |
| -/* memcmp - compare two memory blocks. 64 bit S/390 version. |
| +/* memcmp - compare two memory blocks. 31/64 bit S/390 version. |
| Copyright (C) 2012-2018 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| @@ -26,34 +26,62 @@ |
| %r4 = number of bytes to compare. */ |
| |
| .text |
| +#if defined __s390x__ |
| +# define LTGR ltgr |
| +# define AGHI aghi |
| +# define BRCTG brctg |
| +#else |
| +# define LTGR ltr |
| +# define AGHI ahi |
| +# define BRCTG brct |
| +#endif /* ! defined __s390x__ */ |
| + |
| #ifdef USE_MULTIARCH |
| ENTRY(__memcmp_default) |
| #else |
| ENTRY(memcmp) |
| #endif |
| +#if defined __s390x__ |
| .machine "z900" |
| - ltgr %r4,%r4 |
| - je .L_Z900_4 |
| - aghi %r4,-1 |
| +#else |
| + .machine "g5" |
| + basr %r5,0 |
| +.L_Z900_G5_16: |
| +# define Z900_G5_EX_D .L_Z900_G5_15-.L_Z900_G5_16 |
| +#endif /* ! defined __s390x__ */ |
| + LTGR %r4,%r4 |
| + je .L_Z900_G5_4 |
| + AGHI %r4,-1 |
| +#if defined __s390x__ |
| srlg %r1,%r4,8 |
| - ltgr %r1,%r1 |
| - jne .L_Z900_12 |
| -.L_Z900_3: |
| - larl %r1,.L_Z900_15 |
| - ex %r4,0(%r1) |
| -.L_Z900_4: |
| + larl %r5,.L_Z900_G5_15 |
| +# define Z900_G5_EX_D 0 |
| +#else |
| + lr %r1,%r4 |
| + srl %r1,8 |
| +#endif /* ! defined __s390x__ */ |
| + LTGR %r1,%r1 |
| + jne .L_Z900_G5_12 |
| +.L_Z900_G5_3: |
| + ex %r4,Z900_G5_EX_D(%r5) |
| +.L_Z900_G5_4: |
| ipm %r2 |
| +#if defined __s390x__ |
| sllg %r2,%r2,34 |
| srag %r2,%r2,62 |
| +#else |
| + sll %r2,2 |
| + sra %r2,30 |
| +#endif /* ! defined __s390x__ */ |
| br %r14 |
| -.L_Z900_12: |
| +.L_Z900_G5_12: |
| clc 0(256,%r3),0(%r2) |
| - jne .L_Z900_4 |
| + jne .L_Z900_G5_4 |
| la %r3,256(%r3) |
| la %r2,256(%r2) |
| - brctg %r1,.L_Z900_12 |
| - j .L_Z900_3 |
| -.L_Z900_15: |
| + BRCTG %r1,.L_Z900_G5_12 |
| + j .L_Z900_G5_3 |
| +.L_Z900_G5_15: |
| clc 0(1,%r3),0(%r2) |
| #ifdef USE_MULTIARCH |
| END(__memcmp_default) |
| @@ -62,3 +90,7 @@ END(memcmp) |
| libc_hidden_builtin_def (memcmp) |
| weak_alias (memcmp, bcmp) |
| #endif |
| + |
| +#undef LTGR |
| +#undef AGHI |
| +#undef BRCTG |
| diff --git a/sysdeps/s390/multiarch/Makefile b/sysdeps/s390/multiarch/Makefile |
| index c893ebc5659fd4ae..53dd8654d73677db 100644 |
| |
| |
| @@ -19,7 +19,8 @@ sysdep_routines += strlen strlen-vx strlen-c \ |
| rawmemchr rawmemchr-vx rawmemchr-c \ |
| memccpy memccpy-vx memccpy-c \ |
| memrchr memrchr-vx memrchr-c \ |
| - mempcpy |
| + mempcpy \ |
| + memcmp memcmp-s390x |
| endif |
| |
| ifeq ($(subdir),wcsmbs) |
| diff --git a/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S b/sysdeps/s390/multiarch/memcmp-s390x.S |
| similarity index 89% |
| rename from sysdeps/s390/s390-64/multiarch/memcmp-s390x.S |
| rename to sysdeps/s390/multiarch/memcmp-s390x.S |
| index 35f9bf9cf72da503..6321737acec821ec 100644 |
| |
| |
| @@ -1,4 +1,4 @@ |
| -/* CPU specific memcmp implementations. 64 bit S/390 version. |
| +/* CPU specific memcmp implementations. 31/64 bit S/390 version. |
| Copyright (C) 2012-2018 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| @@ -31,6 +31,10 @@ |
| |
| ENTRY(__memcmp_z196) |
| .machine "z196" |
| + .machinemode "zarch_nohighgprs" |
| +# if !defined __s390x__ |
| + llgfr %r4,%r4 |
| +# endif /* !defined __s390x__ */ |
| ltgr %r4,%r4 |
| je .L_Z196_4 |
| aghi %r4,-1 |
| @@ -64,6 +68,10 @@ END(__memcmp_z196) |
| |
| ENTRY(__memcmp_z10) |
| .machine "z10" |
| + .machinemode "zarch_nohighgprs" |
| +# if !defined __s390x__ |
| + llgfr %r4,%r4 |
| +# endif /* !defined __s390x__ */ |
| ltgr %r4,%r4 |
| je .L_Z10_4 |
| aghi %r4,-1 |
| diff --git a/sysdeps/s390/s390-32/multiarch/memcmp.c b/sysdeps/s390/multiarch/memcmp.c |
| similarity index 100% |
| rename from sysdeps/s390/s390-32/multiarch/memcmp.c |
| rename to sysdeps/s390/multiarch/memcmp.c |
| diff --git a/sysdeps/s390/s390-32/memcmp.S b/sysdeps/s390/s390-32/memcmp.S |
| deleted file mode 100644 |
| index f9ad0bc745daf05f..0000000000000000 |
| |
| |
| @@ -1,66 +0,0 @@ |
| -/* memcmp - compare two memory blocks. 32 bit S/390 version. |
| - Copyright (C) 2012-2018 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 "asm-syntax.h" |
| - |
| -/* INPUT PARAMETERS |
| - %r2 = address of first memory area |
| - %r3 = address of second memory area |
| - %r4 = number of bytes to compare. */ |
| - |
| - .text |
| -#ifdef USE_MULTIARCH |
| -ENTRY(__memcmp_default) |
| -#else |
| -ENTRY(memcmp) |
| -#endif |
| - .machine "g5" |
| - basr %r5,0 |
| -.L_G5_16: |
| - ltr %r4,%r4 |
| - je .L_G5_4 |
| - ahi %r4,-1 |
| - lr %r1,%r4 |
| - srl %r1,8 |
| - ltr %r1,%r1 |
| - jne .L_G5_12 |
| - ex %r4,.L_G5_17-.L_G5_16(%r5) |
| -.L_G5_4: |
| - ipm %r2 |
| - sll %r2,2 |
| - sra %r2,30 |
| - br %r14 |
| -.L_G5_12: |
| - clc 0(256,%r3),0(%r2) |
| - jne .L_G5_4 |
| - la %r3,256(%r3) |
| - la %r2,256(%r2) |
| - brct %r1,.L_G5_12 |
| - ex %r4,.L_G5_17-.L_G5_16(%r5) |
| - j .L_G5_4 |
| -.L_G5_17: |
| - clc 0(1,%r3),0(%r2) |
| -#ifdef USE_MULTIARCH |
| -END(__memcmp_default) |
| -#else |
| -END(memcmp) |
| -libc_hidden_builtin_def (memcmp) |
| -weak_alias(memcmp, bcmp) |
| -#endif |
| diff --git a/sysdeps/s390/s390-32/multiarch/Makefile b/sysdeps/s390/s390-32/multiarch/Makefile |
| index 4b11e28656ac19ab..82a7492eb8436479 100644 |
| |
| |
| @@ -1,3 +1,3 @@ |
| ifeq ($(subdir),string) |
| -sysdep_routines += memcpy memcpy-s390 memcmp memcmp-s390 |
| +sysdep_routines += memcpy memcpy-s390 |
| endif |
| diff --git a/sysdeps/s390/s390-32/multiarch/memcmp-s390.S b/sysdeps/s390/s390-32/multiarch/memcmp-s390.S |
| deleted file mode 100644 |
| index e53b508c98bebeba..0000000000000000 |
| |
| |
| @@ -1,107 +0,0 @@ |
| -/* CPU specific memcmp implementations. 32 bit S/390 version. |
| - Copyright (C) 2012-2018 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 "asm-syntax.h" |
| - |
| -/* INPUT PARAMETERS |
| - %r2 = address of first memory area |
| - %r3 = address of second memory area |
| - %r4 = number of bytes to compare. */ |
| - |
| - .text |
| - |
| -#if IS_IN (libc) |
| - |
| -ENTRY(__memcmp_z196) |
| - .machine "z196" |
| - .machinemode "zarch_nohighgprs" |
| - ltr %r4,%r4 |
| - je .L_Z196_4 |
| - ahi %r4,-1 |
| - srlk %r1,%r4,8 |
| - ltr %r1,%r1 |
| - jne .L_Z196_2 |
| -.L_Z196_3: |
| - exrl %r4,.L_Z196_14 |
| -.L_Z196_4: |
| - ipm %r2 |
| - sll %r2,2 |
| - sra %r2,30 |
| - br %r14 |
| -.L_Z196_17: |
| - la %r3,256(%r3) |
| - la %r2,256(%r2) |
| - ahi %r1,-1 |
| - je .L_Z196_3 |
| -.L_Z196_2: |
| - pfd 1,512(%r3) |
| - pfd 1,512(%r2) |
| - clc 0(256,%r3),0(%r2) |
| - je .L_Z196_17 |
| - ipm %r2 |
| - sll %r2,2 |
| - sra %r2,30 |
| - br %r14 |
| -.L_Z196_14: |
| - clc 0(1,%r3),0(%r2) |
| -END(__memcmp_z196) |
| - |
| -ENTRY(__memcmp_z10) |
| - .machine "z10" |
| - .machinemode "zarch_nohighgprs" |
| - ltr %r4,%r4 |
| - je .L_Z10_4 |
| - ahi %r4,-1 |
| - lr %r1,%r4 |
| - srl %r1,8 |
| - cijlh %r1,0,.L_Z10_12 |
| -.L_Z10_3: |
| - exrl %r4,.L_Z10_15 |
| -.L_Z10_4: |
| - ipm %r2 |
| - sll %r2,2 |
| - sra %r2,30 |
| - br %r14 |
| -.L_Z10_12: |
| - pfd 1,512(%r3) |
| - pfd 1,512(%r2) |
| - clc 0(256,%r3),0(%r2) |
| - jne .L_Z10_4 |
| - la %r3,256(%r3) |
| - la %r2,256(%r2) |
| - brct %r1,.L_Z10_12 |
| - j .L_Z10_3 |
| -.L_Z10_15: |
| - clc 0(1,%r3),0(%r2) |
| -END(__memcmp_z10) |
| - |
| -#endif /* IS_IN (libc) */ |
| - |
| -#include "../memcmp.S" |
| - |
| -#if !IS_IN (libc) |
| -.globl memcmp |
| -.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/Makefile b/sysdeps/s390/s390-64/multiarch/Makefile |
| index e4870c7ee177ad0d..8a043e3327a1527a 100644 |
| |
| |
| @@ -1,3 +1,3 @@ |
| ifeq ($(subdir),string) |
| -sysdep_routines += memcpy memcpy-s390x memcmp memcmp-s390x |
| +sysdep_routines += memcpy memcpy-s390x |
| endif |
| diff --git a/sysdeps/s390/s390-64/multiarch/memcmp.c b/sysdeps/s390/s390-64/multiarch/memcmp.c |
| deleted file mode 100644 |
| index 1e6f31806e172d7d..0000000000000000 |
| |
| |
| @@ -1,27 +0,0 @@ |
| -/* Multiple versions of memcmp. |
| - Copyright (C) 2015-2018 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 IS_IN (libc) |
| -# define memcmp __redirect_memcmp |
| -# include <string.h> |
| -# undef memcmp |
| -# include <ifunc-resolve.h> |
| - |
| -s390_libc_ifunc (__redirect_memcmp, __memcmp, memcmp) |
| -weak_alias (memcmp, bcmp); |
| -#endif |