ce426f
From 2fd1041a8d9684978546886d58fdf8add8c8d9f7 Mon Sep 17 00:00:00 2001
ce426f
From: Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com>
ce426f
Date: Tue, 5 Jul 2016 21:20:41 +0530
ce426f
Subject: [PATCH] powerpc: Fix return code of strcasecmp for unaligned inputs
ce426f
ce426f
If the input values are unaligned and if there are null characters in the
ce426f
memory before the starting address of the input values, strcasecmp
ce426f
gives incorrect return code. Fixed it by adding mask the bits that
ce426f
are not part of the string.
ce426f
ce426f
(cherry picked from commit 30e4cc5413f72c2c728a544389da0c48500d9904)
ce426f
---
ce426f
 ChangeLog                                     |  6 ++++++
ce426f
 sysdeps/powerpc/powerpc64/power8/strcasecmp.S | 17 ++++++++++++++---
ce426f
 2 files changed, 20 insertions(+), 3 deletions(-)
ce426f
ce426f
diff --git a/ChangeLog b/ChangeLog
ce426f
index 9385bd0..af5f694 100644
ce426f
diff --git a/sysdeps/powerpc/powerpc64/power8/strcasecmp.S b/sysdeps/powerpc/powerpc64/power8/strcasecmp.S
ce426f
index 63f6217..c83dc52 100644
ce426f
--- a/sysdeps/powerpc/powerpc64/power8/strcasecmp.S
ce426f
+++ b/sysdeps/powerpc/powerpc64/power8/strcasecmp.S
ce426f
@@ -40,11 +40,20 @@
ce426f
 	vsel	v5, v7, v5, v8; \
ce426f
 	vcmpequb.	v7, v5, v4;
ce426f
 
ce426f
-/* Get 16 bytes for unaligned case.  */
ce426f
+/*
ce426f
+ * Get 16 bytes for unaligned case.
ce426f
+ * reg1: Vector to hold next 16 bytes.
ce426f
+ * reg2: Address to read from.
ce426f
+ * reg3: Permute control vector.
ce426f
+ * v8: Tmp vector used to mask unwanted bytes.
ce426f
+ * v9: Tmp vector,0 when null is found on first 16 bytes
ce426f
+ */
ce426f
 #ifdef __LITTLE_ENDIAN__
ce426f
 #define GET16BYTES(reg1, reg2, reg3) \
ce426f
 	lvx	reg1, 0, reg2; \
ce426f
-	vcmpequb.	v8, v0, reg1; \
ce426f
+	vspltisb	v8, -1; \
ce426f
+	vperm	v8, v8, reg1, reg3; \
ce426f
+	vcmpequb.	v8, v0, v8; \
ce426f
 	beq	cr6, 1f; \
ce426f
 	vspltisb	v9, 0; \
ce426f
 	b	2f; \
ce426f
@@ -57,7 +66,9 @@
ce426f
 #else
ce426f
 #define GET16BYTES(reg1, reg2, reg3) \
ce426f
 	lvx	reg1, 0, reg2; \
ce426f
-	vcmpequb.	v8, v0, reg1; \
ce426f
+	vspltisb	 v8, -1; \
ce426f
+	vperm	v8, reg1, v8,  reg3; \
ce426f
+	vcmpequb.	v8, v0, v8; \
ce426f
 	beq	cr6, 1f; \
ce426f
 	vspltisb	v9, 0; \
ce426f
 	b	2f; \
ce426f
-- 
ce426f
2.1.0
ce426f