+2018-08-16 Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com>
+
+ * sysdeps/powerpc/powerpc64/multiarch/Makefile
+ (sysdep_routines): Build strcmp-power9 and strncmp-power9
+ only for little endian.
+ * sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
+ (strncmp): Move __strncmp_power9 inside ifdef __LITTLE_ENDIAN__.
+ (STRCMP): Move __strcmp_power9 inside ifdef __LITTLE_ENDIAN__.
+ * sysdeps/powerpc/powerpc64/multiarch/strcmp-power9.S:
+ Add check for little endian.
+ * sysdeps/powerpc/powerpc64/multiarch/strcmp.c
+ (__strcmp_power9): Add check for little endian.
+ * sysdeps/powerpc/powerpc64/multiarch/strncmp-power9.S:
+ Add check for little endian.
+ * sysdeps/powerpc/powerpc64/multiarch/strncmp.c
+ (__strncmp_power9): Add check for little endian.
+ * sysdeps/powerpc/powerpc64/power9/strcmp.S: Removed ifdef
+ __LITTLE_ENDIAN__ and moved to sysdeps/powerpc/powerpc64/le/power9.
+ * sysdeps/powerpc/powerpc64/power9/strncmp.S: Likewise.
+ * sysdeps/powerpc/powerpc64/le/power9/strcmp.S: New file.
+ * sysdeps/powerpc/powerpc64/le/power9/strncmp.S: Likewise.
+
2018-08-15 Siddhesh Poyarekar <siddhesh@sourceware.org>
* sysdeps/aarch64/strlen.S (__strlen): Rename to STRLEN.
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/>. */
-#ifdef __LITTLE_ENDIAN__
#include <sysdep.h>
#ifndef STRCMP
as in POWER8 patch and uses vectorised loops after that. */
/* TODO: Change this to actual instructions when minimum binutils is upgraded
- to 2.27. Macros are defined below for these newer instructions in order
+ to 2.27. Macros are defined below for these newer instructions in order
to maintain compatibility. */
-# define VCTZLSBB(r,v) .long (0x10010602 | ((r)<<(32-11)) | ((v)<<(32-21)))
+#define VCTZLSBB(r,v) .long (0x10010602 | ((r)<<(32-11)) | ((v)<<(32-21)))
-# define VEXTUBRX(t,a,b) .long (0x1000070d \
+#define VEXTUBRX(t,a,b) .long (0x1000070d \
| ((t)<<(32-11)) \
| ((a)<<(32-16)) \
| ((b)<<(32-21)) )
-# define VCMPNEZB(t,a,b) .long (0x10000507 \
+#define VCMPNEZB(t,a,b) .long (0x10000507 \
| ((t)<<(32-11)) \
| ((a)<<(32-16)) \
| ((b)<<(32-21)) )
reg1: Vector to hold next 16 bytes.
reg2: Address to read from.
reg3: Permute control vector. */
-# define GET16BYTES(reg1, reg2, reg3) \
+#define GET16BYTES(reg1, reg2, reg3) \
lvx reg1, 0, reg2; \
vperm v8, v2, reg1, reg3; \
vcmpequb. v8, v0, v8; \
b L(pagecross_retdiff)
END (STRCMP)
libc_hidden_builtin_def (strcmp)
-#else
-#include <sysdeps/powerpc/powerpc64/power8/strcmp.S>
-#endif
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/>. */
-#ifdef __LITTLE_ENDIAN__
#include <sysdep.h>
/* Implements the function
#endif
/* TODO: Change this to actual instructions when minimum binutils is upgraded
- to 2.27. Macros are defined below for these newer instructions in order
+ to 2.27. Macros are defined below for these newer instructions in order
to maintain compatibility. */
-# define VCTZLSBB(r,v) .long (0x10010602 | ((r)<<(32-11)) | ((v)<<(32-21)))
+#define VCTZLSBB(r,v) .long (0x10010602 | ((r)<<(32-11)) | ((v)<<(32-21)))
-# define VEXTUBRX(t,a,b) .long (0x1000070d \
+#define VEXTUBRX(t,a,b) .long (0x1000070d \
| ((t)<<(32-11)) \
| ((a)<<(32-16)) \
| ((b)<<(32-21)) )
-# define VCMPNEZB(t,a,b) .long (0x10000507 \
+#define VCMPNEZB(t,a,b) .long (0x10000507 \
| ((t)<<(32-11)) \
| ((a)<<(32-16)) \
| ((b)<<(32-21)) )
reg1: Vector to hold next 16 bytes.
reg2: Address to read from.
reg3: Permute control vector. */
-# define GET16BYTES(reg1, reg2, reg3) \
+#define GET16BYTES(reg1, reg2, reg3) \
lvx reg1, 0, reg2; \
vperm v8, v2, reg1, reg3; \
vcmpequb. v8, v0, v8; \
b L(byte_ne_1)
END(STRNCMP)
libc_hidden_builtin_def(strncmp)
-#else
-#include <sysdeps/powerpc/powerpc64/power8/strncmp.S>
-#endif
strnlen-power8 strnlen-power7 strnlen-ppc64 \
strcasecmp-power7 strcasecmp_l-power7 \
strncase-power7 strncase_l-power7 \
- strncmp-power9 strncmp-power8 strncmp-power7 \
+ strncmp-power8 strncmp-power7 \
strncmp-power4 strncmp-ppc64 \
strchr-power8 strchr-power7 strchr-ppc64 \
strchrnul-power8 strchrnul-power7 strchrnul-ppc64 \
strncat-power8 strncat-power7 strncat-ppc64 \
strncpy-power7 strncpy-ppc64 \
stpncpy-power8 stpncpy-power7 stpncpy-ppc64 \
- strcmp-power9 strcmp-power8 strcmp-power7 strcmp-ppc64 \
+ strcmp-power8 strcmp-power7 strcmp-ppc64 \
strcat-power8 strcat-power7 strcat-ppc64 \
memmove-power7 memmove-ppc64 wordcopy-ppc64 bcopy-ppc64 \
strncpy-power8 strstr-power7 strstr-ppc64 \
strcasecmp-ppc64 strcasecmp-power8 strncase-ppc64 \
strncase-power8
+ifneq (,$(filter %le,$(config-machine)))
+sysdep_routines += strcmp-power9 strncmp-power9
+endif
CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops
CFLAGS-strncase_l-power7.c += -mcpu=power7 -funroll-loops
endif
/* Support sysdeps/powerpc/powerpc64/multiarch/strncmp.c. */
IFUNC_IMPL (i, name, strncmp,
+#ifdef __LITTLE_ENDIAN__
IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_3_00,
__strncmp_power9)
+#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,
/* Support sysdeps/powerpc/powerpc64/multiarch/strcmp.c. */
IFUNC_IMPL (i, name, strcmp,
+#ifdef __LITTLE_ENDIAN__
IFUNC_IMPL_ADD (array, i, strcmp,
hwcap2 & PPC_FEATURE2_ARCH_3_00,
__strcmp_power9)
+#endif
IFUNC_IMPL_ADD (array, i, strcmp,
hwcap2 & PPC_FEATURE2_ARCH_2_07,
__strcmp_power8)
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#if IS_IN (libc)
+#if defined __LITTLE_ENDIAN__ && IS_IN (libc)
#define STRCMP __strcmp_power9
#undef libc_hidden_builtin_def
#define libc_hidden_builtin_def(name)
-#include <sysdeps/powerpc/powerpc64/power9/strcmp.S>
+#include <sysdeps/powerpc/powerpc64/le/power9/strcmp.S>
#endif
extern __typeof (strcmp) __strcmp_ppc attribute_hidden;
extern __typeof (strcmp) __strcmp_power7 attribute_hidden;
extern __typeof (strcmp) __strcmp_power8 attribute_hidden;
+# ifdef __LITTLE_ENDIAN__
extern __typeof (strcmp) __strcmp_power9 attribute_hidden;
+# endif
# undef strcmp
libc_ifunc_redirected (__redirect_strcmp, strcmp,
+# ifdef __LITTLE_ENDIAN__
(hwcap2 & PPC_FEATURE2_ARCH_3_00)
? __strcmp_power9 :
+# endif
(hwcap2 & PPC_FEATURE2_ARCH_2_07)
? __strcmp_power8
: (hwcap & PPC_FEATURE_HAS_VSX)
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#if IS_IN (libc)
+#if defined __LITTLE_ENDIAN__ && IS_IN (libc)
#define STRNCMP __strncmp_power9
#undef libc_hidden_builtin_def
#define libc_hidden_builtin_def(name)
-#include <sysdeps/powerpc/powerpc64/power9/strncmp.S>
+#include <sysdeps/powerpc/powerpc64/le/power9/strncmp.S>
#endif
extern __typeof (strncmp) __strncmp_power4 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;
+# endif
# undef strncmp
/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
ifunc symbol properly. */
libc_ifunc_redirected (__redirect_strncmp, strncmp,
+# ifdef __LITTLE_ENDIAN_
(hwcap2 & PPC_FEATURE2_ARCH_3_00)
? __strncmp_power9 :
+# endif
(hwcap2 & PPC_FEATURE2_ARCH_2_07)
? __strncmp_power8
: (hwcap & PPC_FEATURE_HAS_VSX)