Home | History | Annotate | Download | only in asm-generic
      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 <asm/processor.h>
     17 
     18 static void
     19 xor_8regs_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
     20 {
     21 	long lines = bytes / (sizeof (long)) / 8;
     22 
     23 	do {
     24 		p1[0] ^= p2[0];
     25 		p1[1] ^= p2[1];
     26 		p1[2] ^= p2[2];
     27 		p1[3] ^= p2[3];
     28 		p1[4] ^= p2[4];
     29 		p1[5] ^= p2[5];
     30 		p1[6] ^= p2[6];
     31 		p1[7] ^= p2[7];
     32 		p1 += 8;
     33 		p2 += 8;
     34 	} while (--lines > 0);
     35 }
     36 
     37 static void
     38 xor_8regs_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
     39 	    unsigned long *p3)
     40 {
     41 	long lines = bytes / (sizeof (long)) / 8;
     42 
     43 	do {
     44 		p1[0] ^= p2[0] ^ p3[0];
     45 		p1[1] ^= p2[1] ^ p3[1];
     46 		p1[2] ^= p2[2] ^ p3[2];
     47 		p1[3] ^= p2[3] ^ p3[3];
     48 		p1[4] ^= p2[4] ^ p3[4];
     49 		p1[5] ^= p2[5] ^ p3[5];
     50 		p1[6] ^= p2[6] ^ p3[6];
     51 		p1[7] ^= p2[7] ^ p3[7];
     52 		p1 += 8;
     53 		p2 += 8;
     54 		p3 += 8;
     55 	} while (--lines > 0);
     56 }
     57 
     58 static void
     59 xor_8regs_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
     60 	    unsigned long *p3, unsigned long *p4)
     61 {
     62 	long lines = bytes / (sizeof (long)) / 8;
     63 
     64 	do {
     65 		p1[0] ^= p2[0] ^ p3[0] ^ p4[0];
     66 		p1[1] ^= p2[1] ^ p3[1] ^ p4[1];
     67 		p1[2] ^= p2[2] ^ p3[2] ^ p4[2];
     68 		p1[3] ^= p2[3] ^ p3[3] ^ p4[3];
     69 		p1[4] ^= p2[4] ^ p3[4] ^ p4[4];
     70 		p1[5] ^= p2[5] ^ p3[5] ^ p4[5];
     71 		p1[6] ^= p2[6] ^ p3[6] ^ p4[6];
     72 		p1[7] ^= p2[7] ^ p3[7] ^ p4[7];
     73 		p1 += 8;
     74 		p2 += 8;
     75 		p3 += 8;
     76 		p4 += 8;
     77 	} while (--lines > 0);
     78 }
     79 
     80 static void
     81 xor_8regs_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
     82 	    unsigned long *p3, unsigned long *p4, unsigned long *p5)
     83 {
     84 	long lines = bytes / (sizeof (long)) / 8;
     85 
     86 	do {
     87 		p1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0];
     88 		p1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1];
     89 		p1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2];
     90 		p1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3];
     91 		p1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4];
     92 		p1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5];
     93 		p1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6];
     94 		p1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7];
     95 		p1 += 8;
     96 		p2 += 8;
     97 		p3 += 8;
     98 		p4 += 8;
     99 		p5 += 8;
    100 	} while (--lines > 0);
    101 }
    102 
    103 static void
    104 xor_32regs_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
    105 {
    106 	long lines = bytes / (sizeof (long)) / 8;
    107 
    108 	do {
    109 		register long d0, d1, d2, d3, d4, d5, d6, d7;
    110 		d0 = p1[0];	/* Pull the stuff into registers	*/
    111 		d1 = p1[1];	/*  ... in bursts, if possible.		*/
    112 		d2 = p1[2];
    113 		d3 = p1[3];
    114 		d4 = p1[4];
    115 		d5 = p1[5];
    116 		d6 = p1[6];
    117 		d7 = p1[7];
    118 		d0 ^= p2[0];
    119 		d1 ^= p2[1];
    120 		d2 ^= p2[2];
    121 		d3 ^= p2[3];
    122 		d4 ^= p2[4];
    123 		d5 ^= p2[5];
    124 		d6 ^= p2[6];
    125 		d7 ^= p2[7];
    126 		p1[0] = d0;	/* Store the result (in bursts)		*/
    127 		p1[1] = d1;
    128 		p1[2] = d2;
    129 		p1[3] = d3;
    130 		p1[4] = d4;
    131 		p1[5] = d5;
    132 		p1[6] = d6;
    133 		p1[7] = d7;
    134 		p1 += 8;
    135 		p2 += 8;
    136 	} while (--lines > 0);
    137 }
    138 
    139 static void
    140 xor_32regs_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
    141 	    unsigned long *p3)
    142 {
    143 	long lines = bytes / (sizeof (long)) / 8;
    144 
    145 	do {
    146 		register long d0, d1, d2, d3, d4, d5, d6, d7;
    147 		d0 = p1[0];	/* Pull the stuff into registers	*/
    148 		d1 = p1[1];	/*  ... in bursts, if possible.		*/
    149 		d2 = p1[2];
    150 		d3 = p1[3];
    151 		d4 = p1[4];
    152 		d5 = p1[5];
    153 		d6 = p1[6];
    154 		d7 = p1[7];
    155 		d0 ^= p2[0];
    156 		d1 ^= p2[1];
    157 		d2 ^= p2[2];
    158 		d3 ^= p2[3];
    159 		d4 ^= p2[4];
    160 		d5 ^= p2[5];
    161 		d6 ^= p2[6];
    162 		d7 ^= p2[7];
    163 		d0 ^= p3[0];
    164 		d1 ^= p3[1];
    165 		d2 ^= p3[2];
    166 		d3 ^= p3[3];
    167 		d4 ^= p3[4];
    168 		d5 ^= p3[5];
    169 		d6 ^= p3[6];
    170 		d7 ^= p3[7];
    171 		p1[0] = d0;	/* Store the result (in bursts)		*/
    172 		p1[1] = d1;
    173 		p1[2] = d2;
    174 		p1[3] = d3;
    175 		p1[4] = d4;
    176 		p1[5] = d5;
    177 		p1[6] = d6;
    178 		p1[7] = d7;
    179 		p1 += 8;
    180 		p2 += 8;
    181 		p3 += 8;
    182 	} while (--lines > 0);
    183 }
    184 
    185 static void
    186 xor_32regs_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
    187 	    unsigned long *p3, unsigned long *p4)
    188 {
    189 	long lines = bytes / (sizeof (long)) / 8;
    190 
    191 	do {
    192 		register long d0, d1, d2, d3, d4, d5, d6, d7;
    193 		d0 = p1[0];	/* Pull the stuff into registers	*/
    194 		d1 = p1[1];	/*  ... in bursts, if possible.		*/
    195 		d2 = p1[2];
    196 		d3 = p1[3];
    197 		d4 = p1[4];
    198 		d5 = p1[5];
    199 		d6 = p1[6];
    200 		d7 = p1[7];
    201 		d0 ^= p2[0];
    202 		d1 ^= p2[1];
    203 		d2 ^= p2[2];
    204 		d3 ^= p2[3];
    205 		d4 ^= p2[4];
    206 		d5 ^= p2[5];
    207 		d6 ^= p2[6];
    208 		d7 ^= p2[7];
    209 		d0 ^= p3[0];
    210 		d1 ^= p3[1];
    211 		d2 ^= p3[2];
    212 		d3 ^= p3[3];
    213 		d4 ^= p3[4];
    214 		d5 ^= p3[5];
    215 		d6 ^= p3[6];
    216 		d7 ^= p3[7];
    217 		d0 ^= p4[0];
    218 		d1 ^= p4[1];
    219 		d2 ^= p4[2];
    220 		d3 ^= p4[3];
    221 		d4 ^= p4[4];
    222 		d5 ^= p4[5];
    223 		d6 ^= p4[6];
    224 		d7 ^= p4[7];
    225 		p1[0] = d0;	/* Store the result (in bursts)		*/
    226 		p1[1] = d1;
    227 		p1[2] = d2;
    228 		p1[3] = d3;
    229 		p1[4] = d4;
    230 		p1[5] = d5;
    231 		p1[6] = d6;
    232 		p1[7] = d7;
    233 		p1 += 8;
    234 		p2 += 8;
    235 		p3 += 8;
    236 		p4 += 8;
    237 	} while (--lines > 0);
    238 }
    239 
    240 static void
    241 xor_32regs_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
    242 	    unsigned long *p3, unsigned long *p4, unsigned long *p5)
    243 {
    244 	long lines = bytes / (sizeof (long)) / 8;
    245 
    246 	do {
    247 		register long d0, d1, d2, d3, d4, d5, d6, d7;
    248 		d0 = p1[0];	/* Pull the stuff into registers	*/
    249 		d1 = p1[1];	/*  ... in bursts, if possible.		*/
    250 		d2 = p1[2];
    251 		d3 = p1[3];
    252 		d4 = p1[4];
    253 		d5 = p1[5];
    254 		d6 = p1[6];
    255 		d7 = p1[7];
    256 		d0 ^= p2[0];
    257 		d1 ^= p2[1];
    258 		d2 ^= p2[2];
    259 		d3 ^= p2[3];
    260 		d4 ^= p2[4];
    261 		d5 ^= p2[5];
    262 		d6 ^= p2[6];
    263 		d7 ^= p2[7];
    264 		d0 ^= p3[0];
    265 		d1 ^= p3[1];
    266 		d2 ^= p3[2];
    267 		d3 ^= p3[3];
    268 		d4 ^= p3[4];
    269 		d5 ^= p3[5];
    270 		d6 ^= p3[6];
    271 		d7 ^= p3[7];
    272 		d0 ^= p4[0];
    273 		d1 ^= p4[1];
    274 		d2 ^= p4[2];
    275 		d3 ^= p4[3];
    276 		d4 ^= p4[4];
    277 		d5 ^= p4[5];
    278 		d6 ^= p4[6];
    279 		d7 ^= p4[7];
    280 		d0 ^= p5[0];
    281 		d1 ^= p5[1];
    282 		d2 ^= p5[2];
    283 		d3 ^= p5[3];
    284 		d4 ^= p5[4];
    285 		d5 ^= p5[5];
    286 		d6 ^= p5[6];
    287 		d7 ^= p5[7];
    288 		p1[0] = d0;	/* Store the result (in bursts)		*/
    289 		p1[1] = d1;
    290 		p1[2] = d2;
    291 		p1[3] = d3;
    292 		p1[4] = d4;
    293 		p1[5] = d5;
    294 		p1[6] = d6;
    295 		p1[7] = d7;
    296 		p1 += 8;
    297 		p2 += 8;
    298 		p3 += 8;
    299 		p4 += 8;
    300 		p5 += 8;
    301 	} while (--lines > 0);
    302 }
    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 = {
    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 = {
    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)
    719