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
}
|