diff options
-rw-r--r-- | core/cortex-m0/thumb_case.S | 64 |
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 |