summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extra/Configs/Config.arm7
-rw-r--r--libc/string/arm/_memcpy.S19
-rw-r--r--libc/string/arm/memcmp.S11
-rw-r--r--libc/string/arm/memset.S12
-rw-r--r--libc/string/arm/strcmp.S6
-rw-r--r--libc/string/arm/strlen.S6
-rw-r--r--libc/string/arm/strncmp.S10
7 files changed, 59 insertions, 12 deletions
diff --git a/extra/Configs/Config.arm b/extra/Configs/Config.arm
index 86a0aaa29..bbbf8e0dc 100644
--- a/extra/Configs/Config.arm
+++ b/extra/Configs/Config.arm
@@ -34,6 +34,13 @@ config CONFIG_ARM_EABI
need a kernel supporting the EABI system call interface, or "N"
for a compiler using the old Linux ABI.
+config USE_BX
+ bool "Use BX in function return"
+ default y
+ depends on !CONFIG_GENERIC_ARM && !CONFIG_ARM610 && !CONFIG_ARM710
+ help
+ Use BX instruction for THUMB aware architectures.
+
choice
prompt "Target Processor Type"
default CONFIG_GENERIC_ARM
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 <andersen@codepoet.org>
*/
-
+#include <features.h>
#include <endian.h>
/*
@@ -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