summaryrefslogtreecommitdiff
path: root/arm7/lib/src/MI_memory.c
blob: acb982a4e8f3e754fa2e40e39b93907bbfd5a71b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#include "function_target.h"
#include "MI_memory.h"

asm void MIi_CpuClear16(register u16 value, register u16 * dst, register u32 size) {
    mov	r3, #0
loop:
    cmp	r3, r2
    strlth	r0, [r1, r3]
    addlt	r3, r3, #2
    blt	loop
    bx	lr
}

asm void MIi_CpuCopy16(register u16 * src, register u16 * dst, register u32 size) {
    mov	ip, #0
_037FB31C:
    cmp	ip, r2
    ldrlth	r3, [r0, ip]
    strlth	r3, [r1, ip]
    addlt	ip, ip, #2
    blt	_037FB31C
    bx	lr
}

asm void MIi_CpuClear32(register u32 value, register u32 * dst, register u32 size) {
    add	ip, r1, r2
_037FB338:
    cmp	r1, ip
    stmltia	r1!, {r0}
    blt	_037FB338
    bx	lr
}

asm void MIi_CpuCopy32(register u32 * src, register u32 * dst, register u32 size) {
    add	ip, r1, r2
_037FB34C:
    cmp	r1, ip
    ldmltia	r0!, {r2}
    stmltia	r1!, {r2}
    blt	_037FB34C
    bx	lr
}

asm void MIi_CpuClearFast(register u32 value, register u32 * dst, register u32 size) {
    stmdb	sp!, {r4, r5, r6, r7, r8, r9}
    add	r9, r1, r2
    mov	ip, r2, lsr #5
    add	ip, r1, ip, lsl #5
    mov	r2, r0
    mov	r3, r2
    mov	r4, r2
    mov	r5, r2
    mov	r6, r2
    mov	r7, r2
    mov	r8, r2
_037FB38C:
    cmp	r1, ip
    stmltia	r1!, {r0, r2, r3, r4, r5, r6, r7, r8}
    blt	_037FB38C
_037FB398:
    cmp	r1, r9
    stmltia	r1!, {r0}
    blt	_037FB398
    ldmia	sp!, {r4, r5, r6, r7, r8, r9}
    bx	lr
}

asm void MIi_CpuCopyFast(register u32 * src, register u32 * dst, register u32 size) {
    stmdb	sp!, {r4-r9, r10}
    add	r10, r1, r2
    mov	ip, r2, lsr #5
    add	ip, r1, ip, lsl #5
_037FB3BC:
    cmp	r1, ip
    ldmltia	r0!, {r2-r9}
    stmltia	r1!, {r2-r9}
    blt	_037FB3BC
_037FB3CC:
    cmp	r1, r10
    ldmltia	r0!, {r2}
    stmltia	r1!, {r2}
    blt	_037FB3CC
    ldmia	sp!, {r4-r9, r10}
    bx	lr
}

asm void MI_CpuFill8(register u8 value, register u8 * dst, register u32 size) {
    cmp	r2, #0
    bxeq	lr
    tst	r0, #1
    beq	_037FB410
    ldrh	ip, [r0, #-1]
    and	ip, ip, #0xff
    orr	r3, ip, r1, lsl #8
    strh	r3, [r0, #-1]
    add	r0, r0, #1
    subs	r2, r2, #1
    bxeq	lr
_037FB410:
    cmp	r2, #2
    bcc	_037FB458
    orr	r1, r1, r1, lsl #8
    tst	r0, #2
    beq	_037FB430
    strh	r1, [r0], #2
    subs	r2, r2, #2
    bxeq	lr
_037FB430:
    orr	r1, r1, r1, lsl #16
    bics	r3, r2, #3
    beq	_037FB450
    sub	r2, r2, r3
    add	ip, r3, r0
_037FB444:
    str	r1, [r0], #4
    cmp	r0, ip
    bcc	_037FB444
_037FB450:
    tst	r2, #2
    strneh	r1, [r0], #2
_037FB458:
    tst	r2, #1
    bxeq	lr
    ldrh	r3, [r0]
    and	r3, r3, #0xff00
    and	r1, r1, #0xff
    orr	r1, r1, r3
    strh	r1, [r0]
    bx	lr
}

asm void MI_CpuCopy8(register u8 * src, register u8 * dst, u32 size) {
    cmp	r2, #0
    bxeq	lr
    tst	r1, #1
    beq	_037FB4B8
    ldrh	ip, [r1, #-1]
    and	ip, ip, #0xff
    tst	r0, #1
    ldrneh	r3, [r0, #-1]
    movne	r3, r3, lsr #8
    ldreqh	r3, [r0]
    orr	r3, ip, r3, lsl #8
    strh	r3, [r1, #-1]
    add	r0, r0, #1
    add	r1, r1, #1
    subs	r2, r2, #1
    bxeq	lr
_037FB4B8:
    eor	ip, r1, r0
    tst	ip, #1
    beq	_037FB50C
    bic	r0, r0, #1
    ldrh	ip, [r0], #2
    mov	r3, ip, lsr #8
    subs	r2, r2, #2
    bcc	_037FB4F0
_037FB4D8:
    ldrh	ip, [r0], #2
    orr	ip, r3, ip, lsl #8
    strh	ip, [r1], #2
    mov	r3, ip, lsr #16
    subs	r2, r2, #2
    bcs	_037FB4D8
_037FB4F0:
    tst	r2, #1
    bxeq	lr
    ldrh	ip, [r1]
    and	ip, ip, #0xff00
    orr	ip, ip, r3
    strh	ip, [r1]
    bx	lr
_037FB50C:
    tst	ip, #2
    beq	_037FB538
    bics	r3, r2, #1
    beq	_037FB584
    sub	r2, r2, r3
    add	ip, r3, r1
_037FB524:
    ldrh	r3, [r0], #2
    strh	r3, [r1], #2
    cmp	r1, ip
    bcc	_037FB524
    b	_037FB584
_037FB538:
    cmp	r2, #2
    bcc	_037FB584
    tst	r1, #2
    beq	_037FB558
    ldrh	r3, [r0], #2
    strh	r3, [r1], #2
    subs	r2, r2, #2
    bxeq	lr
_037FB558:
    bics	r3, r2, #3
    beq	_037FB578
    sub	r2, r2, r3
    add	ip, r3, r1
_037FB568:
    ldr	r3, [r0], #4
    str	r3, [r1], #4
    cmp	r1, ip
    bcc	_037FB568
_037FB578:
    tst	r2, #2
    ldrneh	r3, [r0], #2
    strneh	r3, [r1], #2
_037FB584:
    tst	r2, #1
    bxeq	lr
    ldrh	r2, [r1]
    ldrh	r0, [r0]
    and	r2, r2, #0xff00
    and	r0, r0, #0xff
    orr	r0, r2, r0
    strh	r0, [r1]
    bx	lr
}