1
2
3
4
5
6
7
8
9
10
11
12
13 #include <linux/errno.h>
14 #include <linux/linkage.h>
15 #include <asm/asmmacro.h>
16 #include <asm/core.h>
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #define ONES_ADD(sum, val) \
34 add sum, sum, val ; \
35 bgeu sum, val, 99f ; \
36 addi sum, sum, 1 ; \
37 99: ;
38
39 .text
40 ENTRY(csum_partial)
41
42
43
44
45
46 abi_entry_default
47 extui a5, a2, 0, 2
48 bnez a5, 8f
49
50 1:
51 srli a5, a3, 5
52 #if XCHAL_HAVE_LOOPS
53 loopgtz a5, 2f
54 #else
55 beqz a5, 2f
56 slli a5, a5, 5
57 add a5, a5, a2
58 .Loop1:
59 #endif
60 l32i a6, a2, 0
61 l32i a7, a2, 4
62 ONES_ADD(a4, a6)
63 ONES_ADD(a4, a7)
64 l32i a6, a2, 8
65 l32i a7, a2, 12
66 ONES_ADD(a4, a6)
67 ONES_ADD(a4, a7)
68 l32i a6, a2, 16
69 l32i a7, a2, 20
70 ONES_ADD(a4, a6)
71 ONES_ADD(a4, a7)
72 l32i a6, a2, 24
73 l32i a7, a2, 28
74 ONES_ADD(a4, a6)
75 ONES_ADD(a4, a7)
76 addi a2, a2, 4*8
77 #if !XCHAL_HAVE_LOOPS
78 blt a2, a5, .Loop1
79 #endif
80 2:
81 extui a5, a3, 2, 3
82 #if XCHAL_HAVE_LOOPS
83 loopgtz a5, 3f
84 #else
85 beqz a5, 3f
86 slli a5, a5, 2
87 add a5, a5, a2
88 .Loop2:
89 #endif
90 l32i a6, a2, 0
91 ONES_ADD(a4, a6)
92 addi a2, a2, 4
93 #if !XCHAL_HAVE_LOOPS
94 blt a2, a5, .Loop2
95 #endif
96 3:
97 _bbci.l a3, 1, 5f
98 l16ui a6, a2, 0
99 ONES_ADD(a4, a6)
100 addi a2, a2, 2
101 5:
102 _bbci.l a3, 0, 7f
103 6: l8ui a6, a2, 0
104 #ifdef __XTENSA_EB__
105 slli a6, a6, 8
106 #endif
107 ONES_ADD(a4, a6)
108 7:
109 mov a2, a4
110 abi_ret_default
111
112
113 8:
114 beqz a3, 7b
115 beqi a3, 1, 6b
116
117 extui a5, a2, 0, 1
118 bnez a5, 8f
119
120 l16ui a6, a2, 0
121 ONES_ADD(a4, a6)
122 addi a2, a2, 2
123 addi a3, a3, -2
124 j 1b
125
126
127
128
129
130 8:
131 srli a5, a3, 2
132 #if XCHAL_HAVE_LOOPS
133 loopgtz a5, 2f
134 #else
135 beqz a5, 2f
136 slli a5, a5, 2
137 add a5, a5, a2
138 .Loop3:
139 #endif
140 l8ui a6, a2, 0
141 l16ui a7, a2, 1
142 l8ui a8, a2, 3
143 #ifdef __XTENSA_EB__
144 slli a6, a6, 24
145 #else
146 slli a8, a8, 24
147 #endif
148 slli a7, a7, 8
149 or a7, a7, a6
150 or a7, a7, a8
151 ONES_ADD(a4, a7)
152 addi a2, a2, 4
153 #if !XCHAL_HAVE_LOOPS
154 blt a2, a5, .Loop3
155 #endif
156 2:
157 _bbci.l a3, 1, 3f
158 l8ui a6, a2, 0
159 l8ui a7, a2, 1
160 #ifdef __XTENSA_EB__
161 slli a6, a6, 8
162 #else
163 slli a7, a7, 8
164 #endif
165 or a7, a7, a6
166 ONES_ADD(a4, a7)
167 addi a2, a2, 2
168 3:
169 j 5b
170
171 ENDPROC(csum_partial)
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 ENTRY(csum_partial_copy_generic)
197
198 abi_entry_default
199 mov a12, a3
200 mov a11, a4
201 or a10, a2, a3
202
203
204
205
206
207
208
209
210 extui a9, a10, 0, 2
211 beqz a9, 1f
212 bbsi.l a10, 0, 5f
213 j 3f
214
215
216
217
218 1:
219
220 srli a10, a4, 5
221 #if XCHAL_HAVE_LOOPS
222 loopgtz a10, 2f
223 #else
224 beqz a10, 2f
225 slli a10, a10, 5
226 add a10, a10, a2
227 .Loop5:
228 #endif
229 EX(10f) l32i a9, a2, 0
230 EX(10f) l32i a8, a2, 4
231 EX(11f) s32i a9, a3, 0
232 EX(11f) s32i a8, a3, 4
233 ONES_ADD(a5, a9)
234 ONES_ADD(a5, a8)
235 EX(10f) l32i a9, a2, 8
236 EX(10f) l32i a8, a2, 12
237 EX(11f) s32i a9, a3, 8
238 EX(11f) s32i a8, a3, 12
239 ONES_ADD(a5, a9)
240 ONES_ADD(a5, a8)
241 EX(10f) l32i a9, a2, 16
242 EX(10f) l32i a8, a2, 20
243 EX(11f) s32i a9, a3, 16
244 EX(11f) s32i a8, a3, 20
245 ONES_ADD(a5, a9)
246 ONES_ADD(a5, a8)
247 EX(10f) l32i a9, a2, 24
248 EX(10f) l32i a8, a2, 28
249 EX(11f) s32i a9, a3, 24
250 EX(11f) s32i a8, a3, 28
251 ONES_ADD(a5, a9)
252 ONES_ADD(a5, a8)
253 addi a2, a2, 32
254 addi a3, a3, 32
255 #if !XCHAL_HAVE_LOOPS
256 blt a2, a10, .Loop5
257 #endif
258 2:
259 extui a10, a4, 2, 3
260 extui a4, a4, 0, 2
261 #if XCHAL_HAVE_LOOPS
262 loopgtz a10, 3f
263 #else
264 beqz a10, 3f
265 slli a10, a10, 2
266 add a10, a10, a2
267 .Loop6:
268 #endif
269 EX(10f) l32i a9, a2, 0
270 EX(11f) s32i a9, a3, 0
271 ONES_ADD(a5, a9)
272 addi a2, a2, 4
273 addi a3, a3, 4
274 #if !XCHAL_HAVE_LOOPS
275 blt a2, a10, .Loop6
276 #endif
277 3:
278
279
280
281
282
283
284
285
286
287
288
289
290
291 srli a10, a4, 1
292 #if XCHAL_HAVE_LOOPS
293 loopgtz a10, 4f
294 #else
295 beqz a10, 4f
296 slli a10, a10, 1
297 add a10, a10, a2
298 .Loop7:
299 #endif
300 EX(10f) l16ui a9, a2, 0
301 EX(11f) s16i a9, a3, 0
302 ONES_ADD(a5, a9)
303 addi a2, a2, 2
304 addi a3, a3, 2
305 #if !XCHAL_HAVE_LOOPS
306 blt a2, a10, .Loop7
307 #endif
308 4:
309
310 _bbci.l a4, 0, 8f
311 EX(10f) l8ui a9, a2, 0
312 EX(11f) s8i a9, a3, 0
313 #ifdef __XTENSA_EB__
314 slli a9, a9, 8
315 #endif
316 ONES_ADD(a5, a9)
317 8:
318 mov a2, a5
319 abi_ret_default
320
321 5:
322
323
324
325
326 srli a10, a4, 1
327 #if XCHAL_HAVE_LOOPS
328 loopgtz a10, 6f
329 #else
330 beqz a10, 6f
331 slli a10, a10, 1
332 add a10, a10, a2
333 .Loop8:
334 #endif
335 EX(10f) l8ui a9, a2, 0
336 EX(10f) l8ui a8, a2, 1
337 EX(11f) s8i a9, a3, 0
338 EX(11f) s8i a8, a3, 1
339 #ifdef __XTENSA_EB__
340 slli a9, a9, 8
341 #else
342 slli a8, a8, 8
343 #endif
344 or a9, a9, a8
345 ONES_ADD(a5, a9)
346 addi a2, a2, 2
347 addi a3, a3, 2
348 #if !XCHAL_HAVE_LOOPS
349 blt a2, a10, .Loop8
350 #endif
351 6:
352 j 4b
353
354 ENDPROC(csum_partial_copy_generic)
355
356
357
358 .section .fixup, "ax"
359
360
361
362
363
364
365
366 10:
367 _movi a2, -EFAULT
368 s32i a2, a6, 0
369
370
371
372 movi a2, 0
373 #if XCHAL_HAVE_LOOPS
374 loopgtz a11, 2f
375 #else
376 beqz a11, 2f
377 add a11, a11, a12
378 .Leloop:
379 #endif
380 s8i a2, a12, 0
381 addi a12, a12, 1
382 #if !XCHAL_HAVE_LOOPS
383 blt a12, a11, .Leloop
384 #endif
385 2:
386 abi_ret_default
387
388 11:
389 movi a2, -EFAULT
390 s32i a2, a7, 0
391 movi a2, 0
392 abi_ret_default
393
394 .previous