Implement __rt_srsh

svn path=/trunk/; revision=67642
This commit is contained in:
Timo Kreuzer 2015-05-10 21:04:48 +00:00
parent 70ff0e774d
commit c7e9f9e06c

View file

@ -13,10 +13,66 @@
TEXTAREA
/*
__int64
__rt_srsh(
__int64 value,
uint32_t shift);
R0 = loword of value
R1 = hiword of value
R2 = shift
*/
LEAF_ENTRY __rt_srsh
__assertfail
bx lr
/* r3 = 32 - r2 */
rsbs r3, r2, #32
/* Branch if minus (r2 > 32) */
bmi __rt_srsh2
/* r0 = r0 >> r2 (logical shift!) */
lsr r0, r0, r2
/* r3 = r1 << r3 */
lsl r3, r1, r3
/* r0 |= r1 << (32 - r2) */
orr r0, r0, r3
/* r1 = r1 >> r2 (arithmetic shift!) */
asr r1, r1, r2
bx lr
__rt_srsh2
/* Check if shift is > 64 */
cmp r2, 64
bhs __rt_srsh3
/* r3 = r2 - 32 */
sub r3, r2, #32
/* r0 = r1 >> r3 (arithmetic shift!) */
asr r0, r1, r3
/* r1 = r1 >> 32 (arithmetic shift!) */
asr r1, r1, #32
bx lr
__rt_srsh3
/* r1 = r1 >> 32 (arithmetic shift!) */
asr r1, r1, #32
/* r0 = r1 */
mov r0, r1
bx lr
LEAF_END __rt_srsh