about summary refs log tree commit diff
path: root/sysdeps/powerpc/strcmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc/strcmp.S')
-rw-r--r--sysdeps/powerpc/strcmp.S21
1 files changed, 17 insertions, 4 deletions
diff --git a/sysdeps/powerpc/strcmp.S b/sysdeps/powerpc/strcmp.S
index 1accdd70cb..fb7b9f994a 100644
--- a/sysdeps/powerpc/strcmp.S
+++ b/sysdeps/powerpc/strcmp.S
@@ -18,24 +18,33 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
 
 /* See strlen.s for comments on how the end-of-string testing works.  */
 
 /* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4])  */
 
-EALIGN (strcmp, 4, 0)
+EALIGN (BP_SYM (strcmp), 4, 0)
 
 #define rTMP	r0
-#define rRTN	r3	/* return value */
+#define rRTN	r3
 #define rSTR1	r3	/* first string arg */
 #define rSTR2	r4	/* second string arg */
+#if __BOUNDED_POINTERS__
+# define rHIGH1	r11
+# define rHIGH2 r12
+#endif
 #define rWORD1	r5	/* current word in s1 */
 #define rWORD2	r6	/* current word in s2 */
 #define rFEFE	r7	/* constant 0xfefefeff (-0x01010101) */
-#define	r7F7F	r8	/* constant 0x7f7f7f7f */
+#define r7F7F	r8	/* constant 0x7f7f7f7f */
 #define rNEG	r9	/* ~(word in s1 | 0x7f7f7f7f) */
 #define rBITDIF	r10	/* bits that differ in s1 & s2 words */
 
+	CHECK_BOUNDS_LOW (rSTR1, rTMP, rHIGH1)
+	CHECK_BOUNDS_LOW (rSTR2, rTMP, rHIGH2)
+
 	or	rTMP, rSTR2, rSTR1
 	clrlwi.	rTMP, rTMP, 30
 	lis	rFEFE, -0x101
@@ -74,6 +83,7 @@ L(endstring):
 	bgelr+	cr1
 L(equal):
 	li	rRTN, 0
+	/* GKM FIXME: check high bounds.  */
 	blr
 
 L(different):
@@ -83,6 +93,7 @@ L(different):
 	bgelr+
 L(highbit):
 	ori	rRTN, rWORD2, 1
+	/* GKM FIXME: check high bounds.  */
 	blr
 
 
@@ -106,8 +117,10 @@ L(u1):	cmpwi	cr1, rWORD1, 0
 	cmpw	rWORD1, rWORD2
 	bne+	cr1, L(u0)
 L(u3):	sub	rRTN, rWORD1, rWORD2
+	/* GKM FIXME: check high bounds.  */
 	blr
 L(u4):	lbz	rWORD1, -1(rSTR1)
 	sub	rRTN, rWORD1, rWORD2
+	/* GKM FIXME: check high bounds.  */
 	blr
-END(strcmp)
+END (BP_SYM (strcmp))