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#include <linux/linkage.h>
30#include <asm/assembler.h>
31#include <asm/errno.h>
32
33
34
35
36
37
38
39
40
41
42#ifdef CONFIG_ISA_DUAL_ISSUE
43
44
45
46
47
48
49
50
51
52 .text
53ENTRY(csum_partial)
54 ; Function args
55 ; r0: unsigned char *buff
56 ; r1: int len
57 ; r2: unsigned int sum
58
59 push r2 || ldi r2,
60 and3 r7, r0,
61 beqz r7, 1f ; Jump if alignment is ok.
62 ; 1-byte mis aligned
63 ldub r4, @r0 || addi r0,
64 ; clear c-bit || Alignment uses up bytes.
65 cmp r0, r0 || addi r1,
66 ldi r3,
67 addx r2, r3
68 .fillinsn
691:
70 and3 r4, r0,
71 beqz r4, 2f ; Jump if alignment is ok.
72 ; clear c-bit || Alignment uses up two bytes.
73 cmp r0, r0 || addi r1,
74 bgtz r1, 1f ; Jump if we had at least two bytes.
75 bra 4f || addi r1,
76 .fillinsn ; len(r1) was < 2. Deal with it.
771:
78 ; 2-byte aligned
79 lduh r4, @r0 || ldi r3,
80 addx r2, r4 || addi r0,
81 addx r2, r3
82 .fillinsn
832:
84 ; 4-byte aligned
85 cmp r0, r0 ; clear c-bit
86 srl3 r6, r1,
87 beqz r6, 2f
88 .fillinsn
89
901: ld r3, @r0+
91 ld r4, @r0+ ; +4
92 ld r5, @r0+ ; +8
93 ld r3, @r0+ || addx r2, r3 ; +12
94 ld r4, @r0+ || addx r2, r4 ; +16
95 ld r5, @r0+ || addx r2, r5 ; +20
96 ld r3, @r0+ || addx r2, r3 ; +24
97 ld r4, @r0+ || addx r2, r4 ; +28
98 addx r2, r5 || addi r6,
99 addx r2, r3
100 addx r2, r4
101 bnez r6, 1b
102
103 addx r2, r6 ; r6=0
104 cmp r0, r0 ; This clears c-bit
105 .fillinsn
1062: and3 r6, r1,
107 beqz r6, 4f
108 srli r6,
109 .fillinsn
110
1113: ld r4, @r0+ || addi r6,
112 addx r2, r4
113 bnez r6, 3b
114
115 addx r2, r6 ; r6=0
116 cmp r0, r0 ; This clears c-bit
117 .fillinsn
1184: and3 r1, r1,
119 beqz r1, 7f ; if len == 0 goto end
120 and3 r6, r1,
121 beqz r6, 5f ; if len < 2 goto 5f(1byte)
122 lduh r4, @r0 || addi r0,
123 addi r1,
124 addx r2, r4
125 beqz r1, 6f
126 .fillinsn
1275: ldub r4, @r0 || ldi r1,
128#ifndef __LITTLE_ENDIAN__
129 slli r4,
130#endif
131 addx r2, r4
132 .fillinsn
1336: addx r2, r1
134 .fillinsn
1357:
136 and3 r0, r2,
137 srli r2,
138 add r0, r2
139 srl3 r2, r0,
140 beqz r2, 1f
141 addi r0,
142 and3 r0, r0,
143 .fillinsn
1441:
145 beqz r7, 1f ; swap the upper byte for the lower
146 and3 r2, r0,
147 srl3 r0, r0,
148 slli r2,
149 or r0, r2
150 .fillinsn
1511:
152 pop r2 || cmp r0, r0
153 addx r0, r2 || ldi r2,
154 addx r0, r2
155 jmp r14
156
157#else
158
159
160
161
162
163
164
165
166
167 .text
168ENTRY(csum_partial)
169 ; Function args
170 ; r0: unsigned char *buff
171 ; r1: int len
172 ; r2: unsigned int sum
173
174 push r2
175 ldi r2,
176 and3 r7, r0,
177 beqz r7, 1f ; Jump if alignment is ok.
178 ; 1-byte mis aligned
179 ldub r4, @r0
180 addi r0,
181 addi r1,
182 cmp r0, r0 ; clear c-bit
183 ldi r3,
184 addx r2, r4
185 addx r2, r3
186 .fillinsn
1871:
188 and3 r4, r0,
189 beqz r4, 2f ; Jump if alignment is ok.
190 addi r1,
191 cmp r0, r0 ; clear c-bit
192 bgtz r1, 1f ; Jump if we had at least two bytes.
193 addi r1,
194 bra 4f
195 .fillinsn
1961:
197 ; 2-byte aligned
198 lduh r4, @r0
199 addi r0,
200 ldi r3,
201 addx r2, r4
202 addx r2, r3
203 .fillinsn
2042:
205 ; 4-byte aligned
206 cmp r0, r0 ; clear c-bit
207 srl3 r6, r1,
208 beqz r6, 2f
209 .fillinsn
210
2111: ld r3, @r0+
212 ld r4, @r0+ ; +4
213 ld r5, @r0+ ; +8
214 addx r2, r3
215 addx r2, r4
216 addx r2, r5
217 ld r3, @r0+ ; +12
218 ld r4, @r0+ ; +16
219 ld r5, @r0+ ; +20
220 addx r2, r3
221 addx r2, r4
222 addx r2, r5
223 ld r3, @r0+ ; +24
224 ld r4, @r0+ ; +28
225 addi r6,
226 addx r2, r3
227 addx r2, r4
228 bnez r6, 1b
229 addx r2, r6 ; r6=0
230 cmp r0, r0 ; This clears c-bit
231 .fillinsn
232
2332: and3 r6, r1,
234 beqz r6, 4f
235 srli r6,
236 .fillinsn
237
2383: ld r4, @r0+
239 addi r6,
240 addx r2, r4
241 bnez r6, 3b
242 addx r2, r6 ; r6=0
243 cmp r0, r0 ; This clears c-bit
244 .fillinsn
245
2464: and3 r1, r1,
247 beqz r1, 7f ; if len == 0 goto end
248 and3 r6, r1,
249 beqz r6, 5f ; if len < 2 goto 5f(1byte)
250
251 lduh r4, @r0
252 addi r0,
253 addi r1,
254 slli r4,
255 addx r2, r4
256 beqz r1, 6f
257 .fillinsn
2585: ldub r4, @r0
259#ifndef __LITTLE_ENDIAN__
260 slli r4,
261#endif
262 addx r2, r4
263 .fillinsn
2646: ldi r5,
265 addx r2, r5
266 .fillinsn
2677:
268 and3 r0, r2,
269 srli r2,
270 add r0, r2
271 srl3 r2, r0,
272 beqz r2, 1f
273 addi r0,
274 and3 r0, r0,
275 .fillinsn
2761:
277 beqz r7, 1f
278 mv r2, r0
279 srl3 r0, r2,
280 and3 r2, r2,
281 slli r2,
282 or r0, r2
283 .fillinsn
2841:
285 pop r2
286 cmp r0, r0
287 addx r0, r2
288 ldi r2,
289 addx r0, r2
290 jmp r14
291
292#endif
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310ENTRY(csum_partial_copy_generic)
311 nop
312 nop
313 nop
314 nop
315 jmp r14
316 nop
317 nop
318 nop
319
320 .end
321