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
|
#include <linux/linkage.h>
ENTRY(insl)
add r0, r0, #0xff000000
add r0, r0, #0x00e00000
ands ip, r1, #3
bne 2f
1: ldr r3, [r0]
str r3, [r1], #4
subs r2, r2, #1
bne 1b
mov pc, lr
2: cmp ip, #2
ldr ip, [r0]
blt 3f
bgt 4f
strh ip, [r1], #2
mov ip, ip, lsr #16
1: subs r2, r2, #1
ldrne r3, [r0]
orrne ip, ip, r3, lsl #16
strne ip, [r1], #4
movne ip, r3, lsr #16
bne 1b
strh ip, [r1], #2
mov pc, lr
3: strb ip, [r1], #1
mov ip, ip, lsr #8
strh ip, [r1], #2
mov ip, ip, lsr #16
1: subs r2, r2, #1
ldrne r3, [r0]
orrne ip, ip, r3, lsl #8
strne ip, [r1], #4
movne ip, r3, lsr #24
bne 1b
strb ip, [r1], #1
mov pc, lr
4: strb ip, [r1], #1
mov ip, ip, lsr #8
1: subs r2, r2, #1
ldrne r3, [r0]
orrne ip, ip, r3, lsl #24
strne ip, [r1], #4
movne ip, r3, lsr #8
bne 1b
strb ip, [r1], #1
mov ip, ip, lsr #8
strh ip, [r1], #2
mov pc, lr
ENTRY(outsl)
add r0, r0, #0xff000000
add r0, r0, #0x00e00000
ands ip, r1, #3
bne 2f
1: ldr r3, [r1], #4
str r3, [r0]
subs r2, r2, #1
bne 1b
mov pc, lr
2: bic r1, r1, #3
cmp ip, #2
ldr ip, [r1], #4
mov ip, ip, lsr #16
blt 3f
bgt 4f
1: ldr r3, [r1], #4
orr ip, ip, r3, lsl #16
str ip, [r0]
mov ip, r3, lsr #16
subs r2, r2, #1
bne 1b
mov pc, lr
3: ldr r3, [r1], #4
orr ip, ip, r3, lsl #8
str ip, [r0]
mov ip, r3, lsr #24
subs r2, r2, #1
bne 3b
mov pc, lr
4: ldr r3, [r1], #4
orr ip, ip, r3, lsl #24
str ip, [r0]
mov ip, r3, lsr #8
subs r2, r2, #1
bne 4b
mov pc, lr
/* Nobody could say these are optimal, but not to worry. */
ENTRY(outswb)
mov r2, r2, lsr #1
ENTRY(outsw)
add r0, r0, #0xff000000
add r0, r0, #0x00e00000
1: subs r2, r2, #1
ldrgeh r3, [r1], #2
strgeh r3, [r0]
bgt 1b
mov pc, lr
ENTRY(inswb)
mov r2, r2, lsr #1
ENTRY(insw)
stmfd sp!, {r4, r5, lr}
add r0, r0, #0xff000000
add r0, r0, #0x00e00000
@ + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17
subs ip, r2, #8
blo too_little
@ + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9
ands lr, r1, #3 @ check alignment
beq 1f
ldrh r3, [r0]
strh r3, [r1], #2
sub ip, ip, #1
cmn ip, #8
blo too_little
1: ldrh r2, [r0]
ldrh r3, [r0]
orr r2, r2, r3, lsl #16
ldrh r3, [r0]
ldrh r4, [r0]
orr r3, r3, r4, lsl #16
ldrh r4, [r0]
ldrh r5, [r0]
orr r4, r4, r5, lsl #16
ldrh r5, [r0]
ldrh lr, [r0]
orr r5, r5, lr, lsl #16
stmia r1!, {r2, r3, r4, r5}
subs ip, ip, #8
@ - 8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 + 0 + 1
bhs 1b
@ - 8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 8 - 7
cmn ip, #4
ldrhsh r2, [r0] @ ... ... ... ... - 4 - 3 - 2 - 1 ... ...
ldrhsh r3, [r0]
orrhs r2, r2, r3, lsl #16
ldrhsh r3, [r0]
ldrhsh r4, [r0]
orrhs r3, r3, r4, lsl #16
stmhsia r1!, {r2, r3}
tst ip, #2
ldrneh r2, [r0] @ ... ... - 6 - 5 ... ... - 2 - 1 ... ...
ldrneh r3, [r0]
orrne r2, r2, r3, lsl #16
strne r2, [r1], #4
tst ip, #1
ldrneh r2, [r0]
strneh r2, [r1], #2
ldmfd sp!, {r4, r5, pc}
too_little: subs r2, r2, #1
ldrgeh r3, [r0]
strgeh r3, [r1], #2
bgt too_little
ldmfd sp!, {r4, r5, pc}
ENTRY(insb)
add r0, r0, #0xff000000
add r0, r0, #0x00e00000
1: teq r2, #0
ldrneb r3, [r0]
strneb r3, [r1], #1
subne r2, r2, #1
bne 1b
mov pc, lr
ENTRY(outsb)
add r0, r0, #0xff000000
add r0, r0, #0x00e00000
1: teq r2, #0
ldrneb r3, [r1], #1
strneb r3, [r0]
subne r2, r2, #1
bne 1b
mov pc, lr
|