From ab5a66cebe862b43a2380b01f831b1d5a85213a9 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Tue, 14 Oct 2014 18:08:46 +0400 Subject: [PATCH] Implementing __aeabi_llsr (ARM Runtime ABI: long long right shift). --- src/libruntime/target/stm32f4/abi.S | 49 +++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/libruntime/target/stm32f4/abi.S b/src/libruntime/target/stm32f4/abi.S index 20be117d8..013e0f506 100644 --- a/src/libruntime/target/stm32f4/abi.S +++ b/src/libruntime/target/stm32f4/abi.S @@ -53,3 +53,52 @@ __aeabi_llsl: bx lr .end __aeabi_llsl + + +/** + * long long __aeabi_llsr(long long {r1, r0}, int {r2}) + */ +.thumb_func +.global __aeabi_llsr +__aeabi_llsr: + // if (r2 >= 64) goto 2f; + cmp r2, #64 + bhs 2f + + // if (r2 < 32) goto 1f; + cmp r2, #32 + blo 1f + + // r0 = (r1 >> (r2 - 32)); + // r1 = 0 + mov r0, r0 + sub r2, #32 + lsr r0, r1, r2 + mov r1, #0 + + bx lr + + 1: + // r0 >>= r2 + lsr r0, r2 + + // r0 |= r1 << (32 - r2) + mov r3, r1 + rsb r2, r2, #32 + lsl r3, r3, r2 + orr r0, r3 + rsb r2, r2, #32 + + // r1 >>= r2 + lsr r1, r2 + + bx lr + + 2: + // r1 = 0; + // r0 = 0; + mov r1, #0 + mov r0, #0 + + bx lr +.end __aeabi_llsr