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 | |
parent | f24a6d086b96a65a73c68ecf349b03321cb03720 (diff) | |
download | glibc-21bfcecf7a4ac3c150430a1a312268781c145414.zip glibc-21bfcecf7a4ac3c150430a1a312268781c145414.tar.gz glibc-21bfcecf7a4ac3c150430a1a312268781c145414.tar.bz2 |
Make armv6t2 strlen work in ARM mode too.
Diffstat (limited to 'ports')
-rw-r--r-- | ports/ChangeLog.arm | 5 | ||||
-rw-r--r-- | ports/sysdeps/arm/armv6t2/strlen.S | 27 |
2 files changed, 30 insertions, 2 deletions
diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm index 2a95834..1806b08 100644 --- a/ports/ChangeLog.arm +++ b/ports/ChangeLog.arm @@ -1,3 +1,8 @@ +2013-08-30 Roland McGrath <roland@hack.frob.com> + + * sysdeps/arm/armv6t2/strlen.S: Include <arm-features.h> first thing. + [NO_THUMB]: Adapt code for ARM mode. + 2013-08-30 Will Newton <will.newton@linaro.org> [BZ #15909] diff --git a/ports/sysdeps/arm/armv6t2/strlen.S b/ports/sysdeps/arm/armv6t2/strlen.S index a52e2e7..4652c20 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 |