diff options
Diffstat (limited to 'sysdeps/powerpc/strcmp.S')
-rw-r--r-- | sysdeps/powerpc/strcmp.S | 21 |
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)) |