Branch data Line data Source code
1 : : /*
2 : : * include/asm-generic/xor.h
3 : : *
4 : : * Generic optimized RAID-5 checksumming functions.
5 : : *
6 : : * This program is free software; you can redistribute it and/or modify
7 : : * it under the terms of the GNU General Public License as published by
8 : : * the Free Software Foundation; either version 2, or (at your option)
9 : : * any later version.
10 : : *
11 : : * You should have received a copy of the GNU General Public License
12 : : * (for example /usr/src/linux/COPYING); if not, write to the Free
13 : : * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
14 : : */
15 : :
16 : : #include <linux/prefetch.h>
17 : :
18 : : static void
19 : 0 : xor_8regs_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
20 : : {
21 : 0 : long lines = bytes / (sizeof (long)) / 8;
22 : :
23 : : do {
24 : 0 : p1[0] ^= p2[0];
25 : 0 : p1[1] ^= p2[1];
26 : 0 : p1[2] ^= p2[2];
27 : 0 : p1[3] ^= p2[3];
28 : 0 : p1[4] ^= p2[4];
29 : 0 : p1[5] ^= p2[5];
30 : 0 : p1[6] ^= p2[6];
31 : 0 : p1[7] ^= p2[7];
32 : 0 : p1 += 8;
33 : 0 : p2 += 8;
34 [ # # ]: 0 : } while (--lines > 0);
35 : 0 : }
36 : :
37 : : static void
38 : 0 : xor_8regs_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
39 : : unsigned long *p3)
40 : : {
41 : 0 : long lines = bytes / (sizeof (long)) / 8;
42 : :
43 : : do {
44 : 0 : p1[0] ^= p2[0] ^ p3[0];
45 : 0 : p1[1] ^= p2[1] ^ p3[1];
46 : 0 : p1[2] ^= p2[2] ^ p3[2];
47 : 0 : p1[3] ^= p2[3] ^ p3[3];
48 : 0 : p1[4] ^= p2[4] ^ p3[4];
49 : 0 : p1[5] ^= p2[5] ^ p3[5];
50 : 0 : p1[6] ^= p2[6] ^ p3[6];
51 : 0 : p1[7] ^= p2[7] ^ p3[7];
52 : 0 : p1 += 8;
53 : 0 : p2 += 8;
54 : 0 : p3 += 8;
55 [ # # ]: 0 : } while (--lines > 0);
56 : 0 : }
57 : :
58 : : static void
59 : 0 : xor_8regs_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
60 : : unsigned long *p3, unsigned long *p4)
61 : : {
62 : 0 : long lines = bytes / (sizeof (long)) / 8;
63 : :
64 : : do {
65 : 0 : p1[0] ^= p2[0] ^ p3[0] ^ p4[0];
66 : 0 : p1[1] ^= p2[1] ^ p3[1] ^ p4[1];
67 : 0 : p1[2] ^= p2[2] ^ p3[2] ^ p4[2];
68 : 0 : p1[3] ^= p2[3] ^ p3[3] ^ p4[3];
69 : 0 : p1[4] ^= p2[4] ^ p3[4] ^ p4[4];
70 : 0 : p1[5] ^= p2[5] ^ p3[5] ^ p4[5];
71 : 0 : p1[6] ^= p2[6] ^ p3[6] ^ p4[6];
72 : 0 : p1[7] ^= p2[7] ^ p3[7] ^ p4[7];
73 : 0 : p1 += 8;
74 : 0 : p2 += 8;
75 : 0 : p3 += 8;
76 : 0 : p4 += 8;
77 [ # # ]: 0 : } while (--lines > 0);
78 : 0 : }
79 : :
80 : : static void
81 : 0 : xor_8regs_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
82 : : unsigned long *p3, unsigned long *p4, unsigned long *p5)
83 : : {
84 : 0 : long lines = bytes / (sizeof (long)) / 8;
85 : :
86 : : do {
87 : 0 : p1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0];
88 : 0 : p1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1];
89 : 0 : p1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2];
90 : 0 : p1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3];
91 : 0 : p1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4];
92 : 0 : p1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5];
93 : 0 : p1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6];
94 : 0 : p1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7];
95 : 0 : p1 += 8;
96 : 0 : p2 += 8;
97 : 0 : p3 += 8;
98 : 0 : p4 += 8;
99 : 0 : p5 += 8;
100 [ # # ]: 0 : } while (--lines > 0);
101 : 0 : }
102 : :
103 : : static void
104 : 0 : xor_32regs_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
105 : : {
106 : 0 : long lines = bytes / (sizeof (long)) / 8;
107 : :
108 : : do {
109 : : register long d0, d1, d2, d3, d4, d5, d6, d7;
110 : 0 : d0 = p1[0]; /* Pull the stuff into registers */
111 : 0 : d1 = p1[1]; /* ... in bursts, if possible. */
112 : 0 : d2 = p1[2];
113 : 0 : d3 = p1[3];
114 : 0 : d4 = p1[4];
115 : 0 : d5 = p1[5];
116 : 0 : d6 = p1[6];
117 : 0 : d7 = p1[7];
118 : 0 : d0 ^= p2[0];
119 : 0 : d1 ^= p2[1];
120 : 0 : d2 ^= p2[2];
121 : 0 : d3 ^= p2[3];
122 : 0 : d4 ^= p2[4];
123 : 0 : d5 ^= p2[5];
124 : 0 : d6 ^= p2[6];
125 : 0 : d7 ^= p2[7];
126 : 0 : p1[0] = d0; /* Store the result (in bursts) */
127 : 0 : p1[1] = d1;
128 : 0 : p1[2] = d2;
129 : 0 : p1[3] = d3;
130 : 0 : p1[4] = d4;
131 : 0 : p1[5] = d5;
132 : 0 : p1[6] = d6;
133 : 0 : p1[7] = d7;
134 : 0 : p1 += 8;
135 : 0 : p2 += 8;
136 [ # # ]: 0 : } while (--lines > 0);
137 : 0 : }
138 : :
139 : : static void
140 : 0 : xor_32regs_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
141 : : unsigned long *p3)
142 : : {
143 : 0 : long lines = bytes / (sizeof (long)) / 8;
144 : :
145 : : do {
146 : : register long d0, d1, d2, d3, d4, d5, d6, d7;
147 : 0 : d0 = p1[0]; /* Pull the stuff into registers */
148 : 0 : d1 = p1[1]; /* ... in bursts, if possible. */
149 : 0 : d2 = p1[2];
150 : 0 : d3 = p1[3];
151 : 0 : d4 = p1[4];
152 : 0 : d5 = p1[5];
153 : 0 : d6 = p1[6];
154 : 0 : d7 = p1[7];
155 : 0 : d0 ^= p2[0];
156 : 0 : d1 ^= p2[1];
157 : 0 : d2 ^= p2[2];
158 : 0 : d3 ^= p2[3];
159 : 0 : d4 ^= p2[4];
160 : 0 : d5 ^= p2[5];
161 : 0 : d6 ^= p2[6];
162 : 0 : d7 ^= p2[7];
163 : 0 : d0 ^= p3[0];
164 : 0 : d1 ^= p3[1];
165 : 0 : d2 ^= p3[2];
166 : 0 : d3 ^= p3[3];
167 : 0 : d4 ^= p3[4];
168 : 0 : d5 ^= p3[5];
169 : 0 : d6 ^= p3[6];
170 : 0 : d7 ^= p3[7];
171 : 0 : p1[0] = d0; /* Store the result (in bursts) */
172 : 0 : p1[1] = d1;
173 : 0 : p1[2] = d2;
174 : 0 : p1[3] = d3;
175 : 0 : p1[4] = d4;
176 : 0 : p1[5] = d5;
177 : 0 : p1[6] = d6;
178 : 0 : p1[7] = d7;
179 : 0 : p1 += 8;
180 : 0 : p2 += 8;
181 : 0 : p3 += 8;
182 [ # # ]: 0 : } while (--lines > 0);
183 : 0 : }
184 : :
185 : : static void
186 : 0 : xor_32regs_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
187 : : unsigned long *p3, unsigned long *p4)
188 : : {
189 : 0 : long lines = bytes / (sizeof (long)) / 8;
190 : :
191 : : do {
192 : : register long d0, d1, d2, d3, d4, d5, d6, d7;
193 : 0 : d0 = p1[0]; /* Pull the stuff into registers */
194 : 0 : d1 = p1[1]; /* ... in bursts, if possible. */
195 : 0 : d2 = p1[2];
196 : 0 : d3 = p1[3];
197 : 0 : d4 = p1[4];
198 : 0 : d5 = p1[5];
199 : 0 : d6 = p1[6];
200 : 0 : d7 = p1[7];
201 : 0 : d0 ^= p2[0];
202 : 0 : d1 ^= p2[1];
203 : 0 : d2 ^= p2[2];
204 : 0 : d3 ^= p2[3];
205 : 0 : d4 ^= p2[4];
206 : 0 : d5 ^= p2[5];
207 : 0 : d6 ^= p2[6];
208 : 0 : d7 ^= p2[7];
209 : 0 : d0 ^= p3[0];
210 : 0 : d1 ^= p3[1];
211 : 0 : d2 ^= p3[2];
212 : 0 : d3 ^= p3[3];
213 : 0 : d4 ^= p3[4];
214 : 0 : d5 ^= p3[5];
215 : 0 : d6 ^= p3[6];
216 : 0 : d7 ^= p3[7];
217 : 0 : d0 ^= p4[0];
218 : 0 : d1 ^= p4[1];
219 : 0 : d2 ^= p4[2];
220 : 0 : d3 ^= p4[3];
221 : 0 : d4 ^= p4[4];
222 : 0 : d5 ^= p4[5];
223 : 0 : d6 ^= p4[6];
224 : 0 : d7 ^= p4[7];
225 : 0 : p1[0] = d0; /* Store the result (in bursts) */
226 : 0 : p1[1] = d1;
227 : 0 : p1[2] = d2;
228 : 0 : p1[3] = d3;
229 : 0 : p1[4] = d4;
230 : 0 : p1[5] = d5;
231 : 0 : p1[6] = d6;
232 : 0 : p1[7] = d7;
233 : 0 : p1 += 8;
234 : 0 : p2 += 8;
235 : 0 : p3 += 8;
236 : 0 : p4 += 8;
237 [ # # ]: 0 : } while (--lines > 0);
238 : 0 : }
239 : :
240 : : static void
241 : 0 : xor_32regs_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
242 : : unsigned long *p3, unsigned long *p4, unsigned long *p5)
243 : : {
244 : 0 : long lines = bytes / (sizeof (long)) / 8;
245 : :
246 : : do {
247 : : register long d0, d1, d2, d3, d4, d5, d6, d7;
248 : 0 : d0 = p1[0]; /* Pull the stuff into registers */
249 : 0 : d1 = p1[1]; /* ... in bursts, if possible. */
250 : 0 : d2 = p1[2];
251 : 0 : d3 = p1[3];
252 : 0 : d4 = p1[4];
253 : 0 : d5 = p1[5];
254 : 0 : d6 = p1[6];
255 : 0 : d7 = p1[7];
256 : 0 : d0 ^= p2[0];
257 : 0 : d1 ^= p2[1];
258 : 0 : d2 ^= p2[2];
259 : 0 : d3 ^= p2[3];
260 : 0 : d4 ^= p2[4];
261 : 0 : d5 ^= p2[5];
262 : 0 : d6 ^= p2[6];
263 : 0 : d7 ^= p2[7];
264 : 0 : d0 ^= p3[0];
265 : 0 : d1 ^= p3[1];
266 : 0 : d2 ^= p3[2];
267 : 0 : d3 ^= p3[3];
268 : 0 : d4 ^= p3[4];
269 : 0 : d5 ^= p3[5];
270 : 0 : d6 ^= p3[6];
271 : 0 : d7 ^= p3[7];
272 : 0 : d0 ^= p4[0];
273 : 0 : d1 ^= p4[1];
274 : 0 : d2 ^= p4[2];
275 : 0 : d3 ^= p4[3];
276 : 0 : d4 ^= p4[4];
277 : 0 : d5 ^= p4[5];
278 : 0 : d6 ^= p4[6];
279 : 0 : d7 ^= p4[7];
280 : 0 : d0 ^= p5[0];
281 : 0 : d1 ^= p5[1];
282 : 0 : d2 ^= p5[2];
283 : 0 : d3 ^= p5[3];
284 : 0 : d4 ^= p5[4];
285 : 0 : d5 ^= p5[5];
286 : 0 : d6 ^= p5[6];
287 : 0 : d7 ^= p5[7];
288 : 0 : p1[0] = d0; /* Store the result (in bursts) */
289 : 0 : p1[1] = d1;
290 : 0 : p1[2] = d2;
291 : 0 : p1[3] = d3;
292 : 0 : p1[4] = d4;
293 : 0 : p1[5] = d5;
294 : 0 : p1[6] = d6;
295 : 0 : p1[7] = d7;
296 : 0 : p1 += 8;
297 : 0 : p2 += 8;
298 : 0 : p3 += 8;
299 : 0 : p4 += 8;
300 : 0 : p5 += 8;
301 [ # # ]: 0 : } while (--lines > 0);
302 : 0 : }
303 : :
304 : : static void
305 : : xor_8regs_p_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
306 : : {
307 : : long lines = bytes / (sizeof (long)) / 8 - 1;
308 : : prefetchw(p1);
309 : : prefetch(p2);
310 : :
311 : : do {
312 : : prefetchw(p1+8);
313 : : prefetch(p2+8);
314 : : once_more:
315 : : p1[0] ^= p2[0];
316 : : p1[1] ^= p2[1];
317 : : p1[2] ^= p2[2];
318 : : p1[3] ^= p2[3];
319 : : p1[4] ^= p2[4];
320 : : p1[5] ^= p2[5];
321 : : p1[6] ^= p2[6];
322 : : p1[7] ^= p2[7];
323 : : p1 += 8;
324 : : p2 += 8;
325 : : } while (--lines > 0);
326 : : if (lines == 0)
327 : : goto once_more;
328 : : }
329 : :
330 : : static void
331 : : xor_8regs_p_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
332 : : unsigned long *p3)
333 : : {
334 : : long lines = bytes / (sizeof (long)) / 8 - 1;
335 : : prefetchw(p1);
336 : : prefetch(p2);
337 : : prefetch(p3);
338 : :
339 : : do {
340 : : prefetchw(p1+8);
341 : : prefetch(p2+8);
342 : : prefetch(p3+8);
343 : : once_more:
344 : : p1[0] ^= p2[0] ^ p3[0];
345 : : p1[1] ^= p2[1] ^ p3[1];
346 : : p1[2] ^= p2[2] ^ p3[2];
347 : : p1[3] ^= p2[3] ^ p3[3];
348 : : p1[4] ^= p2[4] ^ p3[4];
349 : : p1[5] ^= p2[5] ^ p3[5];
350 : : p1[6] ^= p2[6] ^ p3[6];
351 : : p1[7] ^= p2[7] ^ p3[7];
352 : : p1 += 8;
353 : : p2 += 8;
354 : : p3 += 8;
355 : : } while (--lines > 0);
356 : : if (lines == 0)
357 : : goto once_more;
358 : : }
359 : :
360 : : static void
361 : : xor_8regs_p_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
362 : : unsigned long *p3, unsigned long *p4)
363 : : {
364 : : long lines = bytes / (sizeof (long)) / 8 - 1;
365 : :
366 : : prefetchw(p1);
367 : : prefetch(p2);
368 : : prefetch(p3);
369 : : prefetch(p4);
370 : :
371 : : do {
372 : : prefetchw(p1+8);
373 : : prefetch(p2+8);
374 : : prefetch(p3+8);
375 : : prefetch(p4+8);
376 : : once_more:
377 : : p1[0] ^= p2[0] ^ p3[0] ^ p4[0];
378 : : p1[1] ^= p2[1] ^ p3[1] ^ p4[1];
379 : : p1[2] ^= p2[2] ^ p3[2] ^ p4[2];
380 : : p1[3] ^= p2[3] ^ p3[3] ^ p4[3];
381 : : p1[4] ^= p2[4] ^ p3[4] ^ p4[4];
382 : : p1[5] ^= p2[5] ^ p3[5] ^ p4[5];
383 : : p1[6] ^= p2[6] ^ p3[6] ^ p4[6];
384 : : p1[7] ^= p2[7] ^ p3[7] ^ p4[7];
385 : : p1 += 8;
386 : : p2 += 8;
387 : : p3 += 8;
388 : : p4 += 8;
389 : : } while (--lines > 0);
390 : : if (lines == 0)
391 : : goto once_more;
392 : : }
393 : :
394 : : static void
395 : : xor_8regs_p_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
396 : : unsigned long *p3, unsigned long *p4, unsigned long *p5)
397 : : {
398 : : long lines = bytes / (sizeof (long)) / 8 - 1;
399 : :
400 : : prefetchw(p1);
401 : : prefetch(p2);
402 : : prefetch(p3);
403 : : prefetch(p4);
404 : : prefetch(p5);
405 : :
406 : : do {
407 : : prefetchw(p1+8);
408 : : prefetch(p2+8);
409 : : prefetch(p3+8);
410 : : prefetch(p4+8);
411 : : prefetch(p5+8);
412 : : once_more:
413 : : p1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0];
414 : : p1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1];
415 : : p1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2];
416 : : p1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3];
417 : : p1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4];
418 : : p1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5];
419 : : p1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6];
420 : : p1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7];
421 : : p1 += 8;
422 : : p2 += 8;
423 : : p3 += 8;
424 : : p4 += 8;
425 : : p5 += 8;
426 : : } while (--lines > 0);
427 : : if (lines == 0)
428 : : goto once_more;
429 : : }
430 : :
431 : : static void
432 : : xor_32regs_p_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
433 : : {
434 : : long lines = bytes / (sizeof (long)) / 8 - 1;
435 : :
436 : : prefetchw(p1);
437 : : prefetch(p2);
438 : :
439 : : do {
440 : : register long d0, d1, d2, d3, d4, d5, d6, d7;
441 : :
442 : : prefetchw(p1+8);
443 : : prefetch(p2+8);
444 : : once_more:
445 : : d0 = p1[0]; /* Pull the stuff into registers */
446 : : d1 = p1[1]; /* ... in bursts, if possible. */
447 : : d2 = p1[2];
448 : : d3 = p1[3];
449 : : d4 = p1[4];
450 : : d5 = p1[5];
451 : : d6 = p1[6];
452 : : d7 = p1[7];
453 : : d0 ^= p2[0];
454 : : d1 ^= p2[1];
455 : : d2 ^= p2[2];
456 : : d3 ^= p2[3];
457 : : d4 ^= p2[4];
458 : : d5 ^= p2[5];
459 : : d6 ^= p2[6];
460 : : d7 ^= p2[7];
461 : : p1[0] = d0; /* Store the result (in bursts) */
462 : : p1[1] = d1;
463 : : p1[2] = d2;
464 : : p1[3] = d3;
465 : : p1[4] = d4;
466 : : p1[5] = d5;
467 : : p1[6] = d6;
468 : : p1[7] = d7;
469 : : p1 += 8;
470 : : p2 += 8;
471 : : } while (--lines > 0);
472 : : if (lines == 0)
473 : : goto once_more;
474 : : }
475 : :
476 : : static void
477 : : xor_32regs_p_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
478 : : unsigned long *p3)
479 : : {
480 : : long lines = bytes / (sizeof (long)) / 8 - 1;
481 : :
482 : : prefetchw(p1);
483 : : prefetch(p2);
484 : : prefetch(p3);
485 : :
486 : : do {
487 : : register long d0, d1, d2, d3, d4, d5, d6, d7;
488 : :
489 : : prefetchw(p1+8);
490 : : prefetch(p2+8);
491 : : prefetch(p3+8);
492 : : once_more:
493 : : d0 = p1[0]; /* Pull the stuff into registers */
494 : : d1 = p1[1]; /* ... in bursts, if possible. */
495 : : d2 = p1[2];
496 : : d3 = p1[3];
497 : : d4 = p1[4];
498 : : d5 = p1[5];
499 : : d6 = p1[6];
500 : : d7 = p1[7];
501 : : d0 ^= p2[0];
502 : : d1 ^= p2[1];
503 : : d2 ^= p2[2];
504 : : d3 ^= p2[3];
505 : : d4 ^= p2[4];
506 : : d5 ^= p2[5];
507 : : d6 ^= p2[6];
508 : : d7 ^= p2[7];
509 : : d0 ^= p3[0];
510 : : d1 ^= p3[1];
511 : : d2 ^= p3[2];
512 : : d3 ^= p3[3];
513 : : d4 ^= p3[4];
514 : : d5 ^= p3[5];
515 : : d6 ^= p3[6];
516 : : d7 ^= p3[7];
517 : : p1[0] = d0; /* Store the result (in bursts) */
518 : : p1[1] = d1;
519 : : p1[2] = d2;
520 : : p1[3] = d3;
521 : : p1[4] = d4;
522 : : p1[5] = d5;
523 : : p1[6] = d6;
524 : : p1[7] = d7;
525 : : p1 += 8;
526 : : p2 += 8;
527 : : p3 += 8;
528 : : } while (--lines > 0);
529 : : if (lines == 0)
530 : : goto once_more;
531 : : }
532 : :
533 : : static void
534 : : xor_32regs_p_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
535 : : unsigned long *p3, unsigned long *p4)
536 : : {
537 : : long lines = bytes / (sizeof (long)) / 8 - 1;
538 : :
539 : : prefetchw(p1);
540 : : prefetch(p2);
541 : : prefetch(p3);
542 : : prefetch(p4);
543 : :
544 : : do {
545 : : register long d0, d1, d2, d3, d4, d5, d6, d7;
546 : :
547 : : prefetchw(p1+8);
548 : : prefetch(p2+8);
549 : : prefetch(p3+8);
550 : : prefetch(p4+8);
551 : : once_more:
552 : : d0 = p1[0]; /* Pull the stuff into registers */
553 : : d1 = p1[1]; /* ... in bursts, if possible. */
554 : : d2 = p1[2];
555 : : d3 = p1[3];
556 : : d4 = p1[4];
557 : : d5 = p1[5];
558 : : d6 = p1[6];
559 : : d7 = p1[7];
560 : : d0 ^= p2[0];
561 : : d1 ^= p2[1];
562 : : d2 ^= p2[2];
563 : : d3 ^= p2[3];
564 : : d4 ^= p2[4];
565 : : d5 ^= p2[5];
566 : : d6 ^= p2[6];
567 : : d7 ^= p2[7];
568 : : d0 ^= p3[0];
569 : : d1 ^= p3[1];
570 : : d2 ^= p3[2];
571 : : d3 ^= p3[3];
572 : : d4 ^= p3[4];
573 : : d5 ^= p3[5];
574 : : d6 ^= p3[6];
575 : : d7 ^= p3[7];
576 : : d0 ^= p4[0];
577 : : d1 ^= p4[1];
578 : : d2 ^= p4[2];
579 : : d3 ^= p4[3];
580 : : d4 ^= p4[4];
581 : : d5 ^= p4[5];
582 : : d6 ^= p4[6];
583 : : d7 ^= p4[7];
584 : : p1[0] = d0; /* Store the result (in bursts) */
585 : : p1[1] = d1;
586 : : p1[2] = d2;
587 : : p1[3] = d3;
588 : : p1[4] = d4;
589 : : p1[5] = d5;
590 : : p1[6] = d6;
591 : : p1[7] = d7;
592 : : p1 += 8;
593 : : p2 += 8;
594 : : p3 += 8;
595 : : p4 += 8;
596 : : } while (--lines > 0);
597 : : if (lines == 0)
598 : : goto once_more;
599 : : }
600 : :
601 : : static void
602 : : xor_32regs_p_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
603 : : unsigned long *p3, unsigned long *p4, unsigned long *p5)
604 : : {
605 : : long lines = bytes / (sizeof (long)) / 8 - 1;
606 : :
607 : : prefetchw(p1);
608 : : prefetch(p2);
609 : : prefetch(p3);
610 : : prefetch(p4);
611 : : prefetch(p5);
612 : :
613 : : do {
614 : : register long d0, d1, d2, d3, d4, d5, d6, d7;
615 : :
616 : : prefetchw(p1+8);
617 : : prefetch(p2+8);
618 : : prefetch(p3+8);
619 : : prefetch(p4+8);
620 : : prefetch(p5+8);
621 : : once_more:
622 : : d0 = p1[0]; /* Pull the stuff into registers */
623 : : d1 = p1[1]; /* ... in bursts, if possible. */
624 : : d2 = p1[2];
625 : : d3 = p1[3];
626 : : d4 = p1[4];
627 : : d5 = p1[5];
628 : : d6 = p1[6];
629 : : d7 = p1[7];
630 : : d0 ^= p2[0];
631 : : d1 ^= p2[1];
632 : : d2 ^= p2[2];
633 : : d3 ^= p2[3];
634 : : d4 ^= p2[4];
635 : : d5 ^= p2[5];
636 : : d6 ^= p2[6];
637 : : d7 ^= p2[7];
638 : : d0 ^= p3[0];
639 : : d1 ^= p3[1];
640 : : d2 ^= p3[2];
641 : : d3 ^= p3[3];
642 : : d4 ^= p3[4];
643 : : d5 ^= p3[5];
644 : : d6 ^= p3[6];
645 : : d7 ^= p3[7];
646 : : d0 ^= p4[0];
647 : : d1 ^= p4[1];
648 : : d2 ^= p4[2];
649 : : d3 ^= p4[3];
650 : : d4 ^= p4[4];
651 : : d5 ^= p4[5];
652 : : d6 ^= p4[6];
653 : : d7 ^= p4[7];
654 : : d0 ^= p5[0];
655 : : d1 ^= p5[1];
656 : : d2 ^= p5[2];
657 : : d3 ^= p5[3];
658 : : d4 ^= p5[4];
659 : : d5 ^= p5[5];
660 : : d6 ^= p5[6];
661 : : d7 ^= p5[7];
662 : : p1[0] = d0; /* Store the result (in bursts) */
663 : : p1[1] = d1;
664 : : p1[2] = d2;
665 : : p1[3] = d3;
666 : : p1[4] = d4;
667 : : p1[5] = d5;
668 : : p1[6] = d6;
669 : : p1[7] = d7;
670 : : p1 += 8;
671 : : p2 += 8;
672 : : p3 += 8;
673 : : p4 += 8;
674 : : p5 += 8;
675 : : } while (--lines > 0);
676 : : if (lines == 0)
677 : : goto once_more;
678 : : }
679 : :
680 : : static struct xor_block_template xor_block_8regs = {
681 : : .name = "8regs",
682 : : .do_2 = xor_8regs_2,
683 : : .do_3 = xor_8regs_3,
684 : : .do_4 = xor_8regs_4,
685 : : .do_5 = xor_8regs_5,
686 : : };
687 : :
688 : : static struct xor_block_template xor_block_32regs = {
689 : : .name = "32regs",
690 : : .do_2 = xor_32regs_2,
691 : : .do_3 = xor_32regs_3,
692 : : .do_4 = xor_32regs_4,
693 : : .do_5 = xor_32regs_5,
694 : : };
695 : :
696 : : static struct xor_block_template xor_block_8regs_p __maybe_unused = {
697 : : .name = "8regs_prefetch",
698 : : .do_2 = xor_8regs_p_2,
699 : : .do_3 = xor_8regs_p_3,
700 : : .do_4 = xor_8regs_p_4,
701 : : .do_5 = xor_8regs_p_5,
702 : : };
703 : :
704 : : static struct xor_block_template xor_block_32regs_p __maybe_unused = {
705 : : .name = "32regs_prefetch",
706 : : .do_2 = xor_32regs_p_2,
707 : : .do_3 = xor_32regs_p_3,
708 : : .do_4 = xor_32regs_p_4,
709 : : .do_5 = xor_32regs_p_5,
710 : : };
711 : :
712 : : #define XOR_TRY_TEMPLATES \
713 : : do { \
714 : : xor_speed(&xor_block_8regs); \
715 : : xor_speed(&xor_block_8regs_p); \
716 : : xor_speed(&xor_block_32regs); \
717 : : xor_speed(&xor_block_32regs_p); \
718 : : } while (0)
|