From ded219589f184b296190aebcba56b57564f5f337 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Tue, 31 Jan 2006 01:41:16 +0000 Subject: Khem Raj says: add support for using BX instruction for THUMB aware architectures --- libc/string/arm/_memcpy.S | 19 ++++++++++++++----- libc/string/arm/memcmp.S | 11 +++++++++-- libc/string/arm/memset.S | 12 ++++++++++-- libc/string/arm/strcmp.S | 6 +++++- libc/string/arm/strlen.S | 6 +++++- libc/string/arm/strncmp.S | 10 +++++++++- 6 files changed, 52 insertions(+), 12 deletions(-) (limited to 'libc/string') diff --git a/libc/string/arm/_memcpy.S b/libc/string/arm/_memcpy.S index e8d78af23..3704f96b5 100644 --- a/libc/string/arm/_memcpy.S +++ b/libc/string/arm/_memcpy.S @@ -37,7 +37,7 @@ * by Erik Andersen */ - +#include #include /* @@ -83,8 +83,11 @@ _memcpy: bcc .Lmemcpy_backwards moveq r0, #0 /* Quick abort for len=0 */ - moveq pc, lr - +#if defined(__USE_BX__) + bxeq lr +#else + moveq pc, lr +#endif stmdb sp!, {r0, lr} /* memcpy() returns dest addr */ subs r2, r2, #4 blt .Lmemcpy_fl4 /* less than 4 bytes */ @@ -389,8 +392,11 @@ _memcpy: .Lmemcpy_bl4: /* less than 4 bytes to go */ adds r2, r2, #4 +#if defined(__USE_BX__) + bxeq lr +#else moveq pc, lr /* done */ - +#endif /* copy the crud byte at a time */ cmp r2, #2 ldrb r3, [r1, #-1]! @@ -399,8 +405,11 @@ _memcpy: strgeb r3, [r0, #-1]! ldrgtb r3, [r1, #-1]! strgtb r3, [r0, #-1]! +#if defined(__USE_BX__) + bx lr +#else mov pc, lr - +#endif /* erg - unaligned destination */ .Lmemcpy_bdestul: cmp r12, #2 diff --git a/libc/string/arm/memcmp.S b/libc/string/arm/memcmp.S index e97bbc480..af1b876ed 100644 --- a/libc/string/arm/memcmp.S +++ b/libc/string/arm/memcmp.S @@ -40,8 +40,11 @@ memcmp: /* if ((len - 1) < 0) return 0 */ subs r2, r2, #1 movmi r0, #0 +#if defined(__USE_BX__) + bxmi lr +#else movmi pc, lr - +#endif /* ip == last src address to compare */ add ip, r0, r2 1: @@ -51,7 +54,11 @@ memcmp: cmpcs r2, r3 beq 1b sub r0, r2, r3 - mov pc, lr +#if defined(__USE_BX__) + bx lr +#else + mov pc, lr +#endif .size memcmp,.-memcmp diff --git a/libc/string/arm/memset.S b/libc/string/arm/memset.S index 476dad52a..16bfe0dc5 100644 --- a/libc/string/arm/memset.S +++ b/libc/string/arm/memset.S @@ -56,7 +56,11 @@ memset: bge 1b 2: movs a3, a3 @ anything left? - moveq pc, lr @ nope +#if defined(__USE_BX__) + bxeq lr +#else + moveq pc, lr @ nope +#endif rsb a3, a3, $7 add pc, pc, a3, lsl $2 mov r0, r0 @@ -67,7 +71,11 @@ memset: strb a2, [a4], $1 strb a2, [a4], $1 strb a2, [a4], $1 - mov pc, lr +#if defined(__USE_BX__) + bx lr +#else + mov pc, lr +#endif .size memset,.-memset diff --git a/libc/string/arm/strcmp.S b/libc/string/arm/strcmp.S index cdc4ac469..89aa38874 100644 --- a/libc/string/arm/strcmp.S +++ b/libc/string/arm/strcmp.S @@ -44,7 +44,11 @@ strcmp: cmpcs r2, r3 beq 1b sub r0, r2, r3 - mov pc, lr +#if defined(__USE_BX__) + bx lr +#else + mov pc, lr +#endif .size strcmp,.-strcmp diff --git a/libc/string/arm/strlen.S b/libc/string/arm/strlen.S index b7af3480d..5b4b02e17 100644 --- a/libc/string/arm/strlen.S +++ b/libc/string/arm/strlen.S @@ -75,7 +75,11 @@ Llastword: @ drop through to here once we find a tstne r2, $0x00ff0000 @ (if first three all non-zero, 4th addne r0, r0, $1 @ must be zero) #endif - mov pc,lr +#if defined(__USE_BX__) + bx lr +#else + mov pc,lr +#endif .size strlen,.-strlen diff --git a/libc/string/arm/strncmp.S b/libc/string/arm/strncmp.S index 82d45e8f3..d6b36312a 100644 --- a/libc/string/arm/strncmp.S +++ b/libc/string/arm/strncmp.S @@ -40,7 +40,11 @@ strncmp: /* if (len == 0) return 0 */ cmp r2, #0 moveq r0, #0 +#if defined(__USE_BX__) + bxeq lr +#else moveq pc, lr +#endif subs r2, r2, #1 /* ip == last src address to compare */ @@ -53,7 +57,11 @@ strncmp: cmpcs r2, r3 beq 1b sub r0, r2, r3 - mov pc, lr +#if defined(__USE_BX__) + bx lr +#else + mov pc, lr +#endif .size strncmp,.-strncmp -- cgit v1.2.3