summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/cortex-m0/thumb_case.S64
1 files changed, 53 insertions, 11 deletions
diff --git a/core/cortex-m0/thumb_case.S b/core/cortex-m0/thumb_case.S
index 1229988d9f..be6c02b764 100644
--- a/core/cortex-m0/thumb_case.S
+++ b/core/cortex-m0/thumb_case.S
@@ -13,10 +13,10 @@
.code 16
/*
- * Helper for compact switch
+ * Helpers for compact switch
*
* r0: the table index
- * lr: the table base address
+ * lr: the table base address (need to clear bit 0)
*
* r0 and lr must be PRESERVED.
* r12 can be clobbered.
@@ -24,12 +24,54 @@
.global __gnu_thumb1_case_uqi
.thumb_func
__gnu_thumb1_case_uqi:
- push {r1}
- mov r1, lr
- lsrs r1, r1, #1
- lsls r1, r1, #1
- ldrb r1, [r1, r0]
- lsls r1, r1, #1
- add lr, lr, r1
- pop {r1}
- bx lr
+ mov r12, r1
+ mov r1, lr
+ lsrs r1, r1, #1
+ lsls r1, r1, #1
+ ldrb r1, [r1, r0]
+ lsls r1, r1, #1
+ add lr, lr, r1
+ mov r1, r12
+ bx lr
+
+.global __gnu_thumb1_case_sqi
+.thumb_func
+__gnu_thumb1_case_sqi:
+ mov r12, r1
+ mov r1, lr
+ lsrs r1, r1, #1
+ lsls r1, r1, #1
+ ldrsb r1, [r1, r0]
+ lsls r1, r1, #1
+ add lr, lr, r1
+ mov r1, r12
+ bx lr
+
+.global __gnu_thumb1_case_uhi
+.thumb_func
+__gnu_thumb1_case_uhi:
+ push {r0, r1}
+ mov r1, lr
+ lsrs r1, r1, #1
+ lsls r0, r0, #1
+ lsls r1, r1, #1
+ ldrh r1, [r1, r0]
+ lsls r1, r1, #1
+ add lr, lr, r1
+ pop {r0, r1}
+ bx lr
+
+
+.global __gnu_thumb1_case_shi
+.thumb_func
+__gnu_thumb1_case_shi:
+ push {r0, r1}
+ mov r1, lr
+ lsrs r1, r1, #1
+ lsls r0, r0, #1
+ lsls r1, r1, #1
+ ldrsh r1, [r1, r0]
+ lsls r1, r1, #1
+ add lr, lr, r1
+ pop {r0, r1}
+ bx lr