diff options
author | Roland McGrath <roland@hack.frob.com> | 2013-08-30 10:43:39 -0700 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2013-08-30 10:43:39 -0700 |
commit | 21bfcecf7a4ac3c150430a1a312268781c145414 (patch) | |
tree | d93b0aa92c67c049272b2296c54b551b3abcabbe /ports/sysdeps | |
parent | f24a6d086b96a65a73c68ecf349b03321cb03720 (diff) | |
download | glibc-21bfcecf7a4ac3c150430a1a312268781c145414.tar glibc-21bfcecf7a4ac3c150430a1a312268781c145414.tar.gz glibc-21bfcecf7a4ac3c150430a1a312268781c145414.tar.bz2 glibc-21bfcecf7a4ac3c150430a1a312268781c145414.zip |
Make armv6t2 strlen work in ARM mode too.
Diffstat (limited to 'ports/sysdeps')
-rw-r--r-- | ports/sysdeps/arm/armv6t2/strlen.S | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/ports/sysdeps/arm/armv6t2/strlen.S b/ports/sysdeps/arm/armv6t2/strlen.S index a52e2e770c..4652c208d8 100644 --- a/ports/sysdeps/arm/armv6t2/strlen.S +++ b/ports/sysdeps/arm/armv6t2/strlen.S @@ -21,6 +21,7 @@ */ +#include <arm-features.h> /* This might #define NO_THUMB. */ #include <sysdep.h> #ifdef __ARMEB__ @@ -31,9 +32,24 @@ #define S2HI lsl #endif - /* This code requires Thumb. */ +#ifndef NO_THUMB +/* This code is best on Thumb. */ .thumb - .syntax unified +#else +/* Using bne.w explicitly is desirable in Thumb mode because it helps + align the following label without a nop. In ARM mode there is no + such difference. */ +.macro bne.w label + bne \label +.endm + +/* This clobbers the condition codes, which the real Thumb cbnz instruction + does not do. But it doesn't matter for any of the uses here. */ +.macro cbnz reg, label + cmp \reg, #0 + bne \label +.endm +#endif /* Parameters and result. */ #define srcin r0 @@ -130,9 +146,16 @@ ENTRY(strlen) tst tmp1, #4 pld [src, #64] S2HI tmp2, const_m1, tmp2 +#ifdef NO_THUMB + mvn tmp1, tmp2 + orr data1a, data1a, tmp1 + itt ne + orrne data1b, data1b, tmp1 +#else orn data1a, data1a, tmp2 itt ne ornne data1b, data1b, tmp2 +#endif movne data1a, const_m1 mov const_0, #0 b .Lstart_realigned |