all repos — mgba @ 3ee3f7625f5f60248ff2a05853bf93e8a00d9171

mGBA Game Boy Advance Emulator

src/util/arm-algo.S (view raw)

 1# r0: Destination
 2# r1: Source
 3# r2: Number of words to copy as halfwords
 4.global _to16Bit
 5_to16Bit:
 6push {r4-r10}
 7mov r8, r0
 8mov r9, r1
 9mov r10, r2
10.L0:
11tst r10, #7
12beq .L1
13ldr r0, [r9], #4
14strh r0, [r8], #2
15sub r10, #1
16b .L0
17.L1:
18ldmia r9!, {r0-r7}
19strh r0, [r8], #2
20strh r1, [r8], #2
21strh r2, [r8], #2
22strh r3, [r8], #2
23strh r4, [r8], #2
24strh r5, [r8], #2
25strh r6, [r8], #2
26strh r7, [r8], #2
27subs r10, #8
28bne .L1
29pop {r4-r10}
30bx lr
31
32# r0: Destination
33# r1: Source
34# r2: Width
35# r3: Height
36.global _neon2x
37_neon2x:
38push {r4-r5}
39lsl r4, r2, #2
40.n20:
41mov r2, r4, lsr #4
42add r5, r0, r4
43.n21:
44vld2.32 {d0[], d1[]}, [r1]!
45vmov d2, d0
46vmov d3, d1
47vzip.16 d0, d2
48vzip.16 d1, d3
49vst1.32 {q0}, [r0]!
50vst1.32 {q0}, [r5]!
51subs r2, #1
52bne .n21
53subs r3, #1
54mov r0, r5
55bne .n20
56pop {r4-r5}
57bx lr
58
59.global _neon4x
60_neon4x:
61push {r4-r7}
62lsl r4, r2, #3
63.n40:
64mov r2, r4, lsr #5
65add r5, r0, r4
66add r6, r5, r4
67add r7, r6, r4
68.n41:
69vld4.16 {d0[], d1[], d2[], d3[]}, [r1]!
70vst1.16 {d0}, [r0]!
71vst1.16 {d0}, [r5]!
72vst1.16 {d0}, [r6]!
73vst1.16 {d0}, [r7]!
74vst1.16 {d1}, [r0]!
75vst1.16 {d1}, [r5]!
76vst1.16 {d1}, [r6]!
77vst1.16 {d1}, [r7]!
78vst1.16 {d2}, [r0]!
79vst1.16 {d2}, [r5]!
80vst1.16 {d2}, [r6]!
81vst1.16 {d2}, [r7]!
82vst1.16 {d3}, [r0]!
83vst1.16 {d3}, [r5]!
84vst1.16 {d3}, [r6]!
85vst1.16 {d3}, [r7]!
86subs r2, #1
87bne .n41
88subs r3, #1
89mov r0, r7
90bne .n40
91pop {r4-r7}
92bx lr