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