diff --git a/glibc-RHEL-61259-1.patch b/glibc-RHEL-61259-1.patch new file mode 100644 index 0000000..8a7dcce --- /dev/null +++ b/glibc-RHEL-61259-1.patch @@ -0,0 +1,335 @@ +commit 2f47198b04a02097f438ecb765306fa39568a006 +Author: Rajalakshmi Srinivasaraghavan +Date: Fri Dec 2 14:26:41 2022 -0600 + + powerpc64: Remove old strncmp optimization + + This patch cleans up the power4 strncmp optimization for powerpc64 which + is unlikely to be used anywhere. + + Tested on ppc64le with and without --disable-multi-arch flag. + + Reviewed-by: Paul E. Murphy + Reviewed-by: Adhemerval Zanella + +Conflicts: + sysdeps/powerpc/powerpc64/multiarch/strncmp-power4.S + sysdeps/powerpc/powerpc64/power4/strncmp.S + (copyright year changes upstream) + sysdeps/powerpc/powerpc64/multiarch/strncmp.c - fix indentation + + +diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile +index 626845a43c4e8ded..5b20dab108de14ab 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile +@@ -12,8 +12,7 @@ sysdep_routines += memcpy-power8-cached memcpy-power7 memcpy-a2 memcpy-power6 \ + strnlen-power8 strnlen-power7 strnlen-ppc64 \ + strcasecmp-power7 strcasecmp_l-power7 \ + strncase-power7 strncase_l-power7 \ +- strncmp-power8 strncmp-power7 \ +- strncmp-power4 strncmp-ppc64 \ ++ strncmp-power8 strncmp-power7 strncmp-ppc64 \ + strchr-power8 strchr-power7 strchr-ppc64 \ + strchrnul-power8 strchrnul-power7 strchrnul-ppc64 \ + strcpy-power8 strcpy-power7 strcpy-ppc64 stpcpy-power8 \ +diff -Nrup a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c 2024-11-21 16:22:27.914201581 -0500 ++++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c 2024-11-21 16:25:31.721479517 -0500 +@@ -154,8 +154,6 @@ __libc_ifunc_impl_list (const char *name + __strncmp_power8) + IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_HAS_VSX, + __strncmp_power7) +- IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_POWER4, +- __strncmp_power4) + IFUNC_IMPL_ADD (array, i, strncmp, 1, + __strncmp_ppc)) + +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power4.S b/sysdeps/powerpc/powerpc64/multiarch/strncmp-power4.S +deleted file mode 100644 +index 6ead3b6374749e6a..0000000000000000 +--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power4.S ++++ /dev/null +@@ -1,23 +0,0 @@ +-/* Copyright (C) 2013-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 +- . */ +- +-#define STRNCMP __strncmp_power4 +- +-#undef libc_hidden_builtin_def +-#define libc_hidden_builtin_def(name) +- +-#include +diff -Nrup a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c +--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c 2024-11-21 19:52:23.420623986 -0500 ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c 2024-11-21 19:52:02.088475579 -0500 +@@ -26,7 +26,6 @@ + # include "init-arch.h" + + extern __typeof (strncmp) __strncmp_ppc attribute_hidden; +-extern __typeof (strncmp) __strncmp_power4 attribute_hidden; + extern __typeof (strncmp) __strncmp_power7 attribute_hidden; + extern __typeof (strncmp) __strncmp_power8 attribute_hidden; + # ifdef __LITTLE_ENDIAN__ +@@ -41,11 +40,9 @@ libc_ifunc_redirected (__redirect_strncm + (hwcap2 & PPC_FEATURE2_ARCH_3_00) + ? __strncmp_power9 : + # endif +- (hwcap2 & PPC_FEATURE2_ARCH_2_07) +- ? __strncmp_power8 +- : (hwcap & PPC_FEATURE_HAS_VSX) +- ? __strncmp_power7 +- : (hwcap & PPC_FEATURE_POWER4) +- ? __strncmp_power4 +- : __strncmp_ppc); ++ (hwcap2 & PPC_FEATURE2_ARCH_2_07) ++ ? __strncmp_power8 ++ : (hwcap & PPC_FEATURE_HAS_VSX) ++ ? __strncmp_power7 ++ : __strncmp_ppc); + #endif +diff --git a/sysdeps/powerpc/powerpc64/power4/strncmp.S b/sysdeps/powerpc/powerpc64/power4/strncmp.S +deleted file mode 100644 +index cf5f4e5fb8fb2522..0000000000000000 +--- a/sysdeps/powerpc/powerpc64/power4/strncmp.S ++++ /dev/null +@@ -1,225 +0,0 @@ +-/* Optimized strcmp implementation for PowerPC64. +- Copyright (C) 2003-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 +- . */ +- +-#include +- +-#ifndef STRNCMP +-# define STRNCMP strncmp +-#endif +- +-/* See strlen.s for comments on how the end-of-string testing works. */ +- +-/* int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */ +- +-ENTRY_TOCLESS (STRNCMP, 4) +- CALL_MCOUNT 3 +- +-#define rTMP2 r0 +-#define rRTN r3 +-#define rSTR1 r3 /* first string arg */ +-#define rSTR2 r4 /* second string arg */ +-#define rN r5 /* max string length */ +-#define rWORD1 r6 /* current word in s1 */ +-#define rWORD2 r7 /* current word in s2 */ +-#define rWORD3 r10 +-#define rWORD4 r11 +-#define rFEFE r8 /* constant 0xfefefefefefefeff (-0x0101010101010101) */ +-#define r7F7F r9 /* constant 0x7f7f7f7f7f7f7f7f */ +-#define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */ +-#define rBITDIF r11 /* bits that differ in s1 & s2 words */ +-#define rTMP r12 +- +- dcbt 0,rSTR1 +- or rTMP, rSTR2, rSTR1 +- lis r7F7F, 0x7f7f +- dcbt 0,rSTR2 +- clrldi. rTMP, rTMP, 61 +- cmpldi cr1, rN, 0 +- lis rFEFE, -0x101 +- bne L(unaligned) +-/* We are doubleword aligned so set up for two loops. first a double word +- loop, then fall into the byte loop if any residual. */ +- srdi. rTMP, rN, 3 +- clrldi rN, rN, 61 +- addi rFEFE, rFEFE, -0x101 +- addi r7F7F, r7F7F, 0x7f7f +- cmpldi cr1, rN, 0 +- beq L(unaligned) +- +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group. */ +- ld rWORD1, 0(rSTR1) +- ld rWORD2, 0(rSTR2) +- sldi rTMP, rFEFE, 32 +- insrdi r7F7F, r7F7F, 32, 0 +- add rFEFE, rFEFE, rTMP +- b L(g1) +- +-L(g0): +- ldu rWORD1, 8(rSTR1) +- bne- cr1, L(different) +- ldu rWORD2, 8(rSTR2) +-L(g1): add rTMP, rFEFE, rWORD1 +- nor rNEG, r7F7F, rWORD1 +- bdz L(tail) +- and. rTMP, rTMP, rNEG +- cmpd cr1, rWORD1, rWORD2 +- beq+ L(g0) +- +-/* OK. We've hit the end of the string. We need to be careful that +- we don't compare two strings as different because of gunk beyond +- the end of the strings... */ +- +-#ifdef __LITTLE_ENDIAN__ +-L(endstring): +- addi rTMP2, rTMP, -1 +- beq cr1, L(equal) +- andc rTMP2, rTMP2, rTMP +- rldimi rTMP2, rTMP2, 1, 0 +- and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */ +- and rWORD1, rWORD1, rTMP2 +- cmpd cr1, rWORD1, rWORD2 +- beq cr1, L(equal) +- xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */ +- neg rNEG, rBITDIF +- and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */ +- cntlzd rNEG, rNEG /* bitcount of the bit. */ +- andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */ +- sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */ +- sld rWORD2, rWORD2, rNEG +- xor. rBITDIF, rWORD1, rWORD2 +- sub rRTN, rWORD1, rWORD2 +- blt- L(highbit) +- sradi rRTN, rRTN, 63 /* must return an int. */ +- ori rRTN, rRTN, 1 +- blr +-L(equal): +- li rRTN, 0 +- blr +- +-L(different): +- ld rWORD1, -8(rSTR1) +- xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */ +- neg rNEG, rBITDIF +- and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */ +- cntlzd rNEG, rNEG /* bitcount of the bit. */ +- andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */ +- sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */ +- sld rWORD2, rWORD2, rNEG +- xor. rBITDIF, rWORD1, rWORD2 +- sub rRTN, rWORD1, rWORD2 +- blt- L(highbit) +- sradi rRTN, rRTN, 63 +- ori rRTN, rRTN, 1 +- blr +-L(highbit): +- sradi rRTN, rWORD2, 63 +- ori rRTN, rRTN, 1 +- blr +- +-#else +-L(endstring): +- and rTMP, r7F7F, rWORD1 +- beq cr1, L(equal) +- add rTMP, rTMP, r7F7F +- xor. rBITDIF, rWORD1, rWORD2 +- andc rNEG, rNEG, rTMP +- blt- L(highbit) +- cntlzd rBITDIF, rBITDIF +- cntlzd rNEG, rNEG +- addi rNEG, rNEG, 7 +- cmpd cr1, rNEG, rBITDIF +- sub rRTN, rWORD1, rWORD2 +- blt- cr1, L(equal) +- sradi rRTN, rRTN, 63 /* must return an int. */ +- ori rRTN, rRTN, 1 +- blr +-L(equal): +- li rRTN, 0 +- blr +- +-L(different): +- ld rWORD1, -8(rSTR1) +- xor. rBITDIF, rWORD1, rWORD2 +- sub rRTN, rWORD1, rWORD2 +- blt- L(highbit) +- sradi rRTN, rRTN, 63 +- ori rRTN, rRTN, 1 +- blr +-L(highbit): +- sradi rRTN, rWORD2, 63 +- ori rRTN, rRTN, 1 +- blr +-#endif +- +-/* Oh well. In this case, we just do a byte-by-byte comparison. */ +- .align 4 +-L(tail): +- and. rTMP, rTMP, rNEG +- cmpd cr1, rWORD1, rWORD2 +- bne- L(endstring) +- addi rSTR1, rSTR1, 8 +- bne- cr1, L(different) +- addi rSTR2, rSTR2, 8 +- cmpldi cr1, rN, 0 +-L(unaligned): +- mtctr rN /* Power4 wants mtctr 1st in dispatch group */ +- ble cr1, L(ux) +-L(uz): +- lbz rWORD1, 0(rSTR1) +- lbz rWORD2, 0(rSTR2) +- .align 4 +-L(u1): +- cmpdi cr1, rWORD1, 0 +- bdz L(u4) +- cmpd rWORD1, rWORD2 +- beq- cr1, L(u4) +- bne- L(u4) +- lbzu rWORD3, 1(rSTR1) +- lbzu rWORD4, 1(rSTR2) +- cmpdi cr1, rWORD3, 0 +- bdz L(u3) +- cmpd rWORD3, rWORD4 +- beq- cr1, L(u3) +- bne- L(u3) +- lbzu rWORD1, 1(rSTR1) +- lbzu rWORD2, 1(rSTR2) +- cmpdi cr1, rWORD1, 0 +- bdz L(u4) +- cmpd rWORD1, rWORD2 +- beq- cr1, L(u4) +- bne- L(u4) +- lbzu rWORD3, 1(rSTR1) +- lbzu rWORD4, 1(rSTR2) +- cmpdi cr1, rWORD3, 0 +- bdz L(u3) +- cmpd rWORD3, rWORD4 +- beq- cr1, L(u3) +- bne- L(u3) +- lbzu rWORD1, 1(rSTR1) +- lbzu rWORD2, 1(rSTR2) +- b L(u1) +- +-L(u3): sub rRTN, rWORD3, rWORD4 +- blr +-L(u4): sub rRTN, rWORD1, rWORD2 +- blr +-L(ux): +- li rRTN, 0 +- blr +-END (STRNCMP) +-libc_hidden_builtin_def (strncmp) diff --git a/glibc-RHEL-61259-2.patch b/glibc-RHEL-61259-2.patch new file mode 100644 index 0000000..d8aed62 --- /dev/null +++ b/glibc-RHEL-61259-2.patch @@ -0,0 +1,595 @@ +commit 92fdb11ae7aa1ab6b18622670ea702205cd6fdc5 +Author: Adhemerval Zanella Netto +Date: Tue Feb 28 14:23:59 2023 -0300 + + powerpc: Remove powerpc64 strncmp variants + + The default, and power7 implementation just adds word aligned + access when inputs have the same aligment. The unaligned case + is still done by byte operations. + + This is already covered by the generic implementation, which also add + the unaligned input optimization. + + Checked on powerpc64-linux-gnu built without multi-arch for powerpc64, + power7, power8, and power9 (build for le). + Reviewed-by: Rajalakshmi Srinivasaraghavan + +Conflicts: + sysdeps/powerpc/powerpc64/multiarch/strncmp-power7.S + sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S + sysdeps/powerpc/powerpc64/power7/strncmp.S + sysdeps/powerpc/powerpc64/strncmp.S + (copyright year changes upstream) + sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c - PPC_FEATURE difference + +diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile +index 5b20dab108de14ab..0ee7ce39d6470d80 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile ++++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile +@@ -12,7 +12,7 @@ sysdep_routines += memcpy-power8-cached memcpy-power7 memcpy-a2 memcpy-power6 \ + strnlen-power8 strnlen-power7 strnlen-ppc64 \ + strcasecmp-power7 strcasecmp_l-power7 \ + strncase-power7 strncase_l-power7 \ +- strncmp-power8 strncmp-power7 strncmp-ppc64 \ ++ strncmp-power8 strncmp-ppc64 \ + strchr-power8 strchr-power7 strchr-ppc64 \ + strchrnul-power8 strchrnul-power7 strchrnul-ppc64 \ + strcpy-power8 strcpy-power7 strcpy-ppc64 stpcpy-power8 \ +diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +index 914e7d5e28a98b5d..2c84d287ee76a7ea 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +@@ -152,8 +152,6 @@ __libc_ifunc_impl_list (const char *name + #endif + IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_2_07, + __strncmp_power8) +- IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_HAS_VSX, +- __strncmp_power7) + IFUNC_IMPL_ADD (array, i, strncmp, 1, + __strncmp_ppc)) + +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power7.S b/sysdeps/powerpc/powerpc64/multiarch/strncmp-power7.S +deleted file mode 100644 +index 8282ff076c9e00ce..0000000000000000 +--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp-power7.S ++++ /dev/null +@@ -1,23 +0,0 @@ +-/* Copyright (C) 2013-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 +- . */ +- +-#define STRNCMP __strncmp_power7 +- +-#undef libc_hidden_builtin_def +-#define libc_hidden_builtin_def(name) +- +-#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S b/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S +deleted file mode 100644 +index c6f325650c9ace3b..0000000000000000 +--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.S ++++ /dev/null +@@ -1,26 +0,0 @@ +-/* Copyright (C) 2013-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 +- . */ +- +-#if defined SHARED && IS_IN (libc) +-# define STRNCMP __strncmp_ppc +- +-# undef libc_hidden_builtin_def +-# define libc_hidden_builtin_def(name) \ +- .globl __GI_strncmp; __GI_strncmp = __strncmp_ppc +-#endif +- +-#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.c +new file mode 100644 +index 0000000000000000..09cc009a913ed169 +--- /dev/null ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncmp-ppc64.c +@@ -0,0 +1,7 @@ ++#if defined SHARED && IS_IN (libc) ++# define STRNCMP __strncmp_ppc ++# undef libc_hidden_builtin_def ++# define libc_hidden_builtin_def(name) \ ++ __hidden_ver1 (__strncmp_ppc, __GI_strncmp, __strncmp_ppc); ++#endif ++#include +diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c +index 275a558e4afa7d61..df2c0707a919ad79 100644 +--- a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c ++++ b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c +@@ -26,7 +26,6 @@ + # include "init-arch.h" + + extern __typeof (strncmp) __strncmp_ppc attribute_hidden; +-extern __typeof (strncmp) __strncmp_power7 attribute_hidden; + extern __typeof (strncmp) __strncmp_power8 attribute_hidden; + # ifdef __LITTLE_ENDIAN__ + extern __typeof (strncmp) __strncmp_power9 attribute_hidden; +@@ -42,7 +41,5 @@ libc_ifunc_redirected (__redirect_strncm + # endif + (hwcap2 & PPC_FEATURE2_ARCH_2_07) + ? __strncmp_power8 +- : (hwcap & PPC_FEATURE_HAS_VSX) +- ? __strncmp_power7 +- : __strncmp_ppc); ++ : __strncmp_ppc); + #endif +diff --git a/sysdeps/powerpc/powerpc64/power7/strncmp.S b/sysdeps/powerpc/powerpc64/power7/strncmp.S +deleted file mode 100644 +index d91aeb6077a558f2..0000000000000000 +--- a/sysdeps/powerpc/powerpc64/power7/strncmp.S ++++ /dev/null +@@ -1,227 +0,0 @@ +-/* Optimized strcmp implementation for POWER7/PowerPC64. +- Copyright (C) 2010-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 +- . */ +- +-#include +- +-#ifndef STRNCMP +-# define STRNCMP strncmp +-#endif +- +-/* See strlen.s for comments on how the end-of-string testing works. */ +- +-/* int [r3] strncmp (const char *s1 [r3], +- const char *s2 [r4], +- size_t size [r5]) */ +- +-ENTRY_TOCLESS (STRNCMP, 5) +- CALL_MCOUNT 3 +- +-#define rTMP2 r0 +-#define rRTN r3 +-#define rSTR1 r3 /* first string arg */ +-#define rSTR2 r4 /* second string arg */ +-#define rN r5 /* max string length */ +-#define rWORD1 r6 /* current word in s1 */ +-#define rWORD2 r7 /* current word in s2 */ +-#define rWORD3 r10 +-#define rWORD4 r11 +-#define rFEFE r8 /* constant 0xfefefefefefefeff (-0x0101010101010101) */ +-#define r7F7F r9 /* constant 0x7f7f7f7f7f7f7f7f */ +-#define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */ +-#define rBITDIF r11 /* bits that differ in s1 & s2 words */ +-#define rTMP r12 +- +- dcbt 0,rSTR1 +- nop +- or rTMP,rSTR2,rSTR1 +- lis r7F7F,0x7f7f +- dcbt 0,rSTR2 +- nop +- clrldi. rTMP,rTMP,61 +- cmpldi cr1,rN,0 +- lis rFEFE,-0x101 +- bne L(unaligned) +-/* We are doubleword aligned so set up for two loops. first a double word +- loop, then fall into the byte loop if any residual. */ +- srdi. rTMP,rN,3 +- clrldi rN,rN,61 +- addi rFEFE,rFEFE,-0x101 +- addi r7F7F,r7F7F,0x7f7f +- cmpldi cr1,rN,0 +- beq L(unaligned) +- +- mtctr rTMP +- ld rWORD1,0(rSTR1) +- ld rWORD2,0(rSTR2) +- sldi rTMP,rFEFE,32 +- insrdi r7F7F,r7F7F,32,0 +- add rFEFE,rFEFE,rTMP +- b L(g1) +- +-L(g0): +- ldu rWORD1,8(rSTR1) +- bne cr1,L(different) +- ldu rWORD2,8(rSTR2) +-L(g1): add rTMP,rFEFE,rWORD1 +- nor rNEG,r7F7F,rWORD1 +- bdz L(tail) +- and. rTMP,rTMP,rNEG +- cmpd cr1,rWORD1,rWORD2 +- beq L(g0) +- +-/* OK. We've hit the end of the string. We need to be careful that +- we don't compare two strings as different because of gunk beyond +- the end of the strings... */ +- +-#ifdef __LITTLE_ENDIAN__ +-L(endstring): +- addi rTMP2, rTMP, -1 +- beq cr1, L(equal) +- andc rTMP2, rTMP2, rTMP +- rldimi rTMP2, rTMP2, 1, 0 +- and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */ +- and rWORD1, rWORD1, rTMP2 +- cmpd cr1, rWORD1, rWORD2 +- beq cr1, L(equal) +- cmpb rBITDIF, rWORD1, rWORD2 /* 0xff on equal bytes. */ +- addi rNEG, rBITDIF, 1 +- orc rNEG, rNEG, rBITDIF /* 0's below LS differing byte. */ +- sldi rNEG, rNEG, 8 /* 1's above LS differing byte. */ +- andc rWORD1, rWORD1, rNEG /* mask off MS bytes. */ +- andc rWORD2, rWORD2, rNEG +- xor. rBITDIF, rWORD1, rWORD2 +- sub rRTN, rWORD1, rWORD2 +- blt L(highbit) +- sradi rRTN, rRTN, 63 /* must return an int. */ +- ori rRTN, rRTN, 1 +- blr +-L(equal): +- li rRTN, 0 +- blr +- +-L(different): +- ld rWORD1, -8(rSTR1) +- cmpb rBITDIF, rWORD1, rWORD2 /* 0xff on equal bytes. */ +- addi rNEG, rBITDIF, 1 +- orc rNEG, rNEG, rBITDIF /* 0's below LS differing byte. */ +- sldi rNEG, rNEG, 8 /* 1's above LS differing byte. */ +- andc rWORD1, rWORD1, rNEG /* mask off MS bytes. */ +- andc rWORD2, rWORD2, rNEG +- xor. rBITDIF, rWORD1, rWORD2 +- sub rRTN, rWORD1, rWORD2 +- blt L(highbit) +- sradi rRTN, rRTN, 63 +- ori rRTN, rRTN, 1 +- blr +-L(highbit): +- sradi rRTN, rWORD2, 63 +- ori rRTN, rRTN, 1 +- blr +- +-#else +-L(endstring): +- and rTMP,r7F7F,rWORD1 +- beq cr1,L(equal) +- add rTMP,rTMP,r7F7F +- xor. rBITDIF,rWORD1,rWORD2 +- andc rNEG,rNEG,rTMP +- blt L(highbit) +- cntlzd rBITDIF,rBITDIF +- cntlzd rNEG,rNEG +- addi rNEG,rNEG,7 +- cmpd cr1,rNEG,rBITDIF +- sub rRTN,rWORD1,rWORD2 +- blt cr1,L(equal) +- sradi rRTN,rRTN,63 /* must return an int. */ +- ori rRTN,rRTN,1 +- blr +-L(equal): +- li rRTN,0 +- blr +- +-L(different): +- ld rWORD1,-8(rSTR1) +- xor. rBITDIF,rWORD1,rWORD2 +- sub rRTN,rWORD1,rWORD2 +- blt L(highbit) +- sradi rRTN,rRTN,63 +- ori rRTN,rRTN,1 +- blr +-L(highbit): +- sradi rRTN,rWORD2,63 +- ori rRTN,rRTN,1 +- blr +-#endif +- +-/* Oh well. In this case, we just do a byte-by-byte comparison. */ +- .align 4 +-L(tail): +- and. rTMP,rTMP,rNEG +- cmpd cr1,rWORD1,rWORD2 +- bne L(endstring) +- addi rSTR1,rSTR1,8 +- bne cr1,L(different) +- addi rSTR2,rSTR2,8 +- cmpldi cr1,rN,0 +-L(unaligned): +- mtctr rN +- ble cr1,L(ux) +-L(uz): +- lbz rWORD1,0(rSTR1) +- lbz rWORD2,0(rSTR2) +- .align 4 +-L(u1): +- cmpdi cr1,rWORD1,0 +- bdz L(u4) +- cmpd rWORD1,rWORD2 +- beq cr1,L(u4) +- bne L(u4) +- lbzu rWORD3,1(rSTR1) +- lbzu rWORD4,1(rSTR2) +- cmpdi cr1,rWORD3,0 +- bdz L(u3) +- cmpd rWORD3,rWORD4 +- beq cr1,L(u3) +- bne L(u3) +- lbzu rWORD1,1(rSTR1) +- lbzu rWORD2,1(rSTR2) +- cmpdi cr1,rWORD1,0 +- bdz L(u4) +- cmpd rWORD1,rWORD2 +- beq cr1,L(u4) +- bne L(u4) +- lbzu rWORD3,1(rSTR1) +- lbzu rWORD4,1(rSTR2) +- cmpdi cr1,rWORD3,0 +- bdz L(u3) +- cmpd rWORD3,rWORD4 +- beq cr1,L(u3) +- bne L(u3) +- lbzu rWORD1,1(rSTR1) +- lbzu rWORD2,1(rSTR2) +- b L(u1) +- +-L(u3): sub rRTN,rWORD3,rWORD4 +- blr +-L(u4): sub rRTN,rWORD1,rWORD2 +- blr +-L(ux): +- li rRTN,0 +- blr +-END (STRNCMP) +-libc_hidden_builtin_def (strncmp) +diff --git a/sysdeps/powerpc/powerpc64/strncmp.S b/sysdeps/powerpc/powerpc64/strncmp.S +deleted file mode 100644 +index 40a230242cbdf733..0000000000000000 +--- a/sysdeps/powerpc/powerpc64/strncmp.S ++++ /dev/null +@@ -1,210 +0,0 @@ +-/* Optimized strcmp implementation for PowerPC64. +- Copyright (C) 2003-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 +- . */ +- +-#include +- +-/* See strlen.s for comments on how the end-of-string testing works. */ +- +-/* int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */ +- +-#ifndef STRNCMP +-# define STRNCMP strncmp +-#endif +- +-ENTRY_TOCLESS (STRNCMP, 4) +- CALL_MCOUNT 3 +- +-#define rTMP2 r0 +-#define rRTN r3 +-#define rSTR1 r3 /* first string arg */ +-#define rSTR2 r4 /* second string arg */ +-#define rN r5 /* max string length */ +-#define rWORD1 r6 /* current word in s1 */ +-#define rWORD2 r7 /* current word in s2 */ +-#define rFEFE r8 /* constant 0xfefefefefefefeff (-0x0101010101010101) */ +-#define r7F7F r9 /* constant 0x7f7f7f7f7f7f7f7f */ +-#define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */ +-#define rBITDIF r11 /* bits that differ in s1 & s2 words */ +-#define rTMP r12 +- +- dcbt 0,rSTR1 +- or rTMP, rSTR2, rSTR1 +- lis r7F7F, 0x7f7f +- dcbt 0,rSTR2 +- clrldi. rTMP, rTMP, 61 +- cmpldi cr1, rN, 0 +- lis rFEFE, -0x101 +- bne L(unaligned) +-/* We are doubleword aligned so set up for two loops. first a double word +- loop, then fall into the byte loop if any residual. */ +- srdi. rTMP, rN, 3 +- clrldi rN, rN, 61 +- addi rFEFE, rFEFE, -0x101 +- addi r7F7F, r7F7F, 0x7f7f +- cmpldi cr1, rN, 0 +- beq L(unaligned) +- +- mtctr rTMP /* Power4 wants mtctr 1st in dispatch group. */ +- ld rWORD1, 0(rSTR1) +- ld rWORD2, 0(rSTR2) +- sldi rTMP, rFEFE, 32 +- insrdi r7F7F, r7F7F, 32, 0 +- add rFEFE, rFEFE, rTMP +- b L(g1) +- +-L(g0): +- ldu rWORD1, 8(rSTR1) +- bne- cr1, L(different) +- ldu rWORD2, 8(rSTR2) +-L(g1): add rTMP, rFEFE, rWORD1 +- nor rNEG, r7F7F, rWORD1 +- bdz L(tail) +- and. rTMP, rTMP, rNEG +- cmpd cr1, rWORD1, rWORD2 +- beq+ L(g0) +- +-/* OK. We've hit the end of the string. We need to be careful that +- we don't compare two strings as different because of gunk beyond +- the end of the strings... */ +- +-#ifdef __LITTLE_ENDIAN__ +-L(endstring): +- addi rTMP2, rTMP, -1 +- beq cr1, L(equal) +- andc rTMP2, rTMP2, rTMP +- rldimi rTMP2, rTMP2, 1, 0 +- and rWORD2, rWORD2, rTMP2 /* Mask off gunk. */ +- and rWORD1, rWORD1, rTMP2 +- cmpd cr1, rWORD1, rWORD2 +- beq cr1, L(equal) +- xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */ +- neg rNEG, rBITDIF +- and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */ +- cntlzd rNEG, rNEG /* bitcount of the bit. */ +- andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */ +- sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */ +- sld rWORD2, rWORD2, rNEG +- xor. rBITDIF, rWORD1, rWORD2 +- sub rRTN, rWORD1, rWORD2 +- blt- L(highbit) +- sradi rRTN, rRTN, 63 /* must return an int. */ +- ori rRTN, rRTN, 1 +- blr +-L(equal): +- li rRTN, 0 +- blr +- +-L(different): +- ld rWORD1, -8(rSTR1) +- xor rBITDIF, rWORD1, rWORD2 /* rBITDIF has bits that differ. */ +- neg rNEG, rBITDIF +- and rNEG, rNEG, rBITDIF /* rNEG has LS bit that differs. */ +- cntlzd rNEG, rNEG /* bitcount of the bit. */ +- andi. rNEG, rNEG, 56 /* bitcount to LS byte that differs. */ +- sld rWORD1, rWORD1, rNEG /* shift left to clear MS bytes. */ +- sld rWORD2, rWORD2, rNEG +- xor. rBITDIF, rWORD1, rWORD2 +- sub rRTN, rWORD1, rWORD2 +- blt- L(highbit) +- sradi rRTN, rRTN, 63 +- ori rRTN, rRTN, 1 +- blr +-L(highbit): +- sradi rRTN, rWORD2, 63 +- ori rRTN, rRTN, 1 +- blr +- +-#else +-L(endstring): +- and rTMP, r7F7F, rWORD1 +- beq cr1, L(equal) +- add rTMP, rTMP, r7F7F +- xor. rBITDIF, rWORD1, rWORD2 +- andc rNEG, rNEG, rTMP +- blt- L(highbit) +- cntlzd rBITDIF, rBITDIF +- cntlzd rNEG, rNEG +- addi rNEG, rNEG, 7 +- cmpd cr1, rNEG, rBITDIF +- sub rRTN, rWORD1, rWORD2 +- blt- cr1, L(equal) +- sradi rRTN, rRTN, 63 /* must return an int. */ +- ori rRTN, rRTN, 1 +- blr +-L(equal): +- li rRTN, 0 +- blr +- +-L(different): +- ld rWORD1, -8(rSTR1) +- xor. rBITDIF, rWORD1, rWORD2 +- sub rRTN, rWORD1, rWORD2 +- blt- L(highbit) +- sradi rRTN, rRTN, 63 +- ori rRTN, rRTN, 1 +- blr +-L(highbit): +- sradi rRTN, rWORD2, 63 +- ori rRTN, rRTN, 1 +- blr +-#endif +- +-/* Oh well. In this case, we just do a byte-by-byte comparison. */ +- .align 4 +-L(tail): +- and. rTMP, rTMP, rNEG +- cmpd cr1, rWORD1, rWORD2 +- bne- L(endstring) +- addi rSTR1, rSTR1, 8 +- bne- cr1, L(different) +- addi rSTR2, rSTR2, 8 +- cmpldi cr1, rN, 0 +-L(unaligned): +- mtctr rN /* Power4 wants mtctr 1st in dispatch group */ +- bgt cr1, L(uz) +-L(ux): +- li rRTN, 0 +- blr +- .align 4 +-L(uz): +- lbz rWORD1, 0(rSTR1) +- lbz rWORD2, 0(rSTR2) +- nop +- b L(u1) +-L(u0): +- lbzu rWORD2, 1(rSTR2) +-L(u1): +- bdz L(u3) +- cmpdi cr1, rWORD1, 0 +- cmpd rWORD1, rWORD2 +- beq- cr1, L(u3) +- lbzu rWORD1, 1(rSTR1) +- bne- L(u2) +- lbzu rWORD2, 1(rSTR2) +- bdz L(u3) +- cmpdi cr1, rWORD1, 0 +- cmpd rWORD1, rWORD2 +- bne- L(u3) +- lbzu rWORD1, 1(rSTR1) +- bne+ cr1, L(u0) +- +-L(u2): lbzu rWORD1, -1(rSTR1) +-L(u3): sub rRTN, rWORD1, rWORD2 +- blr +-END (STRNCMP) +-libc_hidden_builtin_def (strncmp) diff --git a/glibc.spec b/glibc.spec index 8fc763a..14abe94 100644 --- a/glibc.spec +++ b/glibc.spec @@ -115,7 +115,7 @@ end \ Summary: The GNU libc libraries Name: glibc Version: %{glibcversion} -Release: %{glibcrelease}.9 +Release: %{glibcrelease}.10 # In general, GPLv2+ is used by programs, LGPLv2+ is used for # libraries. @@ -1245,6 +1245,8 @@ Patch1010: glibc-RHEL-36147-3.patch Patch1011: glibc-RHEL-49490-1.patch Patch1012: glibc-RHEL-49490-2.patch Patch1013: glibc-RHEL-61255.patch +Patch1014: glibc-RHEL-61259-1.patch +Patch1015: glibc-RHEL-61259-2.patch ############################################################################## # Continued list of core "glibc" package information: @@ -2906,6 +2908,9 @@ fi %{_libdir}/libpthread_nonshared.a %changelog +* Thu Nov 21 2024 Patsy Griffin - 2.28-251.10 +- Remove some unused ppc64le string functions (RHEL-61259) + * Wed Nov 13 2024 Florian Weimer - 2.28-251.9 - Use /sbin/ldconfig path for lorax compatibility (RHEL-63048)