xref: /linux/lib/raid/xor/xor-8regs.c (revision 440d6635b20037bc9ad46b20817d7b61cef0fc1b)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 #include "xor_impl.h"
3 
4 static void
5 xor_8regs_2(unsigned long bytes, unsigned long * __restrict p1,
6 	    const unsigned long * __restrict p2)
7 {
8 	long lines = bytes / (sizeof (long)) / 8;
9 
10 	do {
11 		p1[0] ^= p2[0];
12 		p1[1] ^= p2[1];
13 		p1[2] ^= p2[2];
14 		p1[3] ^= p2[3];
15 		p1[4] ^= p2[4];
16 		p1[5] ^= p2[5];
17 		p1[6] ^= p2[6];
18 		p1[7] ^= p2[7];
19 		p1 += 8;
20 		p2 += 8;
21 	} while (--lines > 0);
22 }
23 
24 static void
25 xor_8regs_3(unsigned long bytes, unsigned long * __restrict p1,
26 	    const unsigned long * __restrict p2,
27 	    const unsigned long * __restrict p3)
28 {
29 	long lines = bytes / (sizeof (long)) / 8;
30 
31 	do {
32 		p1[0] ^= p2[0] ^ p3[0];
33 		p1[1] ^= p2[1] ^ p3[1];
34 		p1[2] ^= p2[2] ^ p3[2];
35 		p1[3] ^= p2[3] ^ p3[3];
36 		p1[4] ^= p2[4] ^ p3[4];
37 		p1[5] ^= p2[5] ^ p3[5];
38 		p1[6] ^= p2[6] ^ p3[6];
39 		p1[7] ^= p2[7] ^ p3[7];
40 		p1 += 8;
41 		p2 += 8;
42 		p3 += 8;
43 	} while (--lines > 0);
44 }
45 
46 static void
47 xor_8regs_4(unsigned long bytes, unsigned long * __restrict p1,
48 	    const unsigned long * __restrict p2,
49 	    const unsigned long * __restrict p3,
50 	    const unsigned long * __restrict p4)
51 {
52 	long lines = bytes / (sizeof (long)) / 8;
53 
54 	do {
55 		p1[0] ^= p2[0] ^ p3[0] ^ p4[0];
56 		p1[1] ^= p2[1] ^ p3[1] ^ p4[1];
57 		p1[2] ^= p2[2] ^ p3[2] ^ p4[2];
58 		p1[3] ^= p2[3] ^ p3[3] ^ p4[3];
59 		p1[4] ^= p2[4] ^ p3[4] ^ p4[4];
60 		p1[5] ^= p2[5] ^ p3[5] ^ p4[5];
61 		p1[6] ^= p2[6] ^ p3[6] ^ p4[6];
62 		p1[7] ^= p2[7] ^ p3[7] ^ p4[7];
63 		p1 += 8;
64 		p2 += 8;
65 		p3 += 8;
66 		p4 += 8;
67 	} while (--lines > 0);
68 }
69 
70 static void
71 xor_8regs_5(unsigned long bytes, unsigned long * __restrict p1,
72 	    const unsigned long * __restrict p2,
73 	    const unsigned long * __restrict p3,
74 	    const unsigned long * __restrict p4,
75 	    const unsigned long * __restrict p5)
76 {
77 	long lines = bytes / (sizeof (long)) / 8;
78 
79 	do {
80 		p1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0];
81 		p1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1];
82 		p1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2];
83 		p1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3];
84 		p1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4];
85 		p1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5];
86 		p1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6];
87 		p1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7];
88 		p1 += 8;
89 		p2 += 8;
90 		p3 += 8;
91 		p4 += 8;
92 		p5 += 8;
93 	} while (--lines > 0);
94 }
95 
96 #ifndef NO_TEMPLATE
97 DO_XOR_BLOCKS(8regs, xor_8regs_2, xor_8regs_3, xor_8regs_4, xor_8regs_5);
98 
99 struct xor_block_template xor_block_8regs = {
100 	.name		= "8regs",
101 	.xor_gen	= xor_gen_8regs,
102 };
103 #endif /* NO_TEMPLATE */
104