aboutsummaryrefslogtreecommitdiff
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))