e2f06130589c4c26cc5dc24c7a288e54a83fb0d6
[tpg/acess2.git] / KernelLand / Kernel / arch / armv7 / lib.S
1 /*
2  * Acess2 ARM
3  * - By John Hodge (thePowersGang)
4  *
5  * arch/arm7/lib.S
6  * - Assembly editions of library functions
7  */
8 #include "include/assembly.h"
9
10 .globl __memcpy_byte
11 __memcpy_byte:
12 1:
13         tst r2, r2      @ Check counter
14         moveq pc, lr    @ Return if zero
15         ldrb r3, [r1],#1        @ Read
16         strb r3, [r0],#1        @ Write
17         sub r2, #1
18         b 1b
19
20
21 @ Pre-aligned memcpy (32-bit blocks)
22
23 .globl __memcpy_align4
24 __memcpy_align4:
25         push {r4}
26         mvn r3, #3      @ Mask for checking length
27         
28         @ 4 byte chunk copies
29 1:      tst r2, r3
30         ldrne r4, [r1],#4
31         strne r4, [r0],#4
32         subne r2, #4
33         bne 1b
34
35         @ single byte copies to finish off
36 2:      tst r2, #3
37         beq 3f
38         ldrb r4, [r1],#1
39         strb r4, [r0],#1
40         sub r2, #1
41         b 2b
42
43 3:      pop {r4}
44         mov pc, lr
45
46 @
47 @ Division
48 @
49 .globl __divmod32_asm
50 __divmod32_asm:
51         push {r4}
52         mov r4, #0      @ Return value
53         mov r3, #1      @ add value
54
55         @ Scan up for first larger multiple of 2
56 1:      cmp r0, r1      @ N < D
57         bmi 2f          @ ^^
58         lsl r1, r1, #1  @ D <<= 1
59         lsls r3, r3, #1 @ add <<= 1
60         beq .err        @ result is zero
61         b 1b
62         
63         @ Go back down
64 2:      lsrs r3, r3, #1 @ add >>= 1
65         beq 3f          @ Done (value is zero)
66         lsr r1, r1, #1  @ D >>= 1
67         cmp r0, r1      @ N < D
68         bmi 2b
69         sub r0, r1      @ N -= D
70         add r4, r3      @ ret += add
71         b 2b
72 3:
73         tst r2, r2      @ Remainder (if wanted)
74         strne r0,[r2]
75         mov r0, r4      @ Return value
76         pop {r4}
77         mov pc, lr
78 .err:
79         mov r0, #0
80         tst r2, r2
81         strne r0, [r2]
82         pop {r4}
83         mov pc, lr
84

UCC git Repository :: git.ucc.asn.au