xref: /linux/lib/raid/xor/xor-8regs-prefetch.c (revision 440d6635b20037bc9ad46b20817d7b61cef0fc1b)
1c46928fdSChristoph Hellwig // SPDX-License-Identifier: GPL-2.0-or-later
2c46928fdSChristoph Hellwig #include <linux/prefetch.h>
3e20043b4SChristoph Hellwig #include "xor_impl.h"
4c46928fdSChristoph Hellwig 
5c46928fdSChristoph Hellwig static void
6c46928fdSChristoph Hellwig xor_8regs_p_2(unsigned long bytes, unsigned long * __restrict p1,
7c46928fdSChristoph Hellwig 	      const unsigned long * __restrict p2)
8c46928fdSChristoph Hellwig {
9c46928fdSChristoph Hellwig 	long lines = bytes / (sizeof (long)) / 8 - 1;
10c46928fdSChristoph Hellwig 	prefetchw(p1);
11c46928fdSChristoph Hellwig 	prefetch(p2);
12c46928fdSChristoph Hellwig 
13c46928fdSChristoph Hellwig 	do {
14c46928fdSChristoph Hellwig 		prefetchw(p1+8);
15c46928fdSChristoph Hellwig 		prefetch(p2+8);
16c46928fdSChristoph Hellwig  once_more:
17c46928fdSChristoph Hellwig 		p1[0] ^= p2[0];
18c46928fdSChristoph Hellwig 		p1[1] ^= p2[1];
19c46928fdSChristoph Hellwig 		p1[2] ^= p2[2];
20c46928fdSChristoph Hellwig 		p1[3] ^= p2[3];
21c46928fdSChristoph Hellwig 		p1[4] ^= p2[4];
22c46928fdSChristoph Hellwig 		p1[5] ^= p2[5];
23c46928fdSChristoph Hellwig 		p1[6] ^= p2[6];
24c46928fdSChristoph Hellwig 		p1[7] ^= p2[7];
25c46928fdSChristoph Hellwig 		p1 += 8;
26c46928fdSChristoph Hellwig 		p2 += 8;
27c46928fdSChristoph Hellwig 	} while (--lines > 0);
28c46928fdSChristoph Hellwig 	if (lines == 0)
29c46928fdSChristoph Hellwig 		goto once_more;
30c46928fdSChristoph Hellwig }
31c46928fdSChristoph Hellwig 
32c46928fdSChristoph Hellwig static void
33c46928fdSChristoph Hellwig xor_8regs_p_3(unsigned long bytes, unsigned long * __restrict p1,
34c46928fdSChristoph Hellwig 	      const unsigned long * __restrict p2,
35c46928fdSChristoph Hellwig 	      const unsigned long * __restrict p3)
36c46928fdSChristoph Hellwig {
37c46928fdSChristoph Hellwig 	long lines = bytes / (sizeof (long)) / 8 - 1;
38c46928fdSChristoph Hellwig 	prefetchw(p1);
39c46928fdSChristoph Hellwig 	prefetch(p2);
40c46928fdSChristoph Hellwig 	prefetch(p3);
41c46928fdSChristoph Hellwig 
42c46928fdSChristoph Hellwig 	do {
43c46928fdSChristoph Hellwig 		prefetchw(p1+8);
44c46928fdSChristoph Hellwig 		prefetch(p2+8);
45c46928fdSChristoph Hellwig 		prefetch(p3+8);
46c46928fdSChristoph Hellwig  once_more:
47c46928fdSChristoph Hellwig 		p1[0] ^= p2[0] ^ p3[0];
48c46928fdSChristoph Hellwig 		p1[1] ^= p2[1] ^ p3[1];
49c46928fdSChristoph Hellwig 		p1[2] ^= p2[2] ^ p3[2];
50c46928fdSChristoph Hellwig 		p1[3] ^= p2[3] ^ p3[3];
51c46928fdSChristoph Hellwig 		p1[4] ^= p2[4] ^ p3[4];
52c46928fdSChristoph Hellwig 		p1[5] ^= p2[5] ^ p3[5];
53c46928fdSChristoph Hellwig 		p1[6] ^= p2[6] ^ p3[6];
54c46928fdSChristoph Hellwig 		p1[7] ^= p2[7] ^ p3[7];
55c46928fdSChristoph Hellwig 		p1 += 8;
56c46928fdSChristoph Hellwig 		p2 += 8;
57c46928fdSChristoph Hellwig 		p3 += 8;
58c46928fdSChristoph Hellwig 	} while (--lines > 0);
59c46928fdSChristoph Hellwig 	if (lines == 0)
60c46928fdSChristoph Hellwig 		goto once_more;
61c46928fdSChristoph Hellwig }
62c46928fdSChristoph Hellwig 
63c46928fdSChristoph Hellwig static void
64c46928fdSChristoph Hellwig xor_8regs_p_4(unsigned long bytes, unsigned long * __restrict p1,
65c46928fdSChristoph Hellwig 	      const unsigned long * __restrict p2,
66c46928fdSChristoph Hellwig 	      const unsigned long * __restrict p3,
67c46928fdSChristoph Hellwig 	      const unsigned long * __restrict p4)
68c46928fdSChristoph Hellwig {
69c46928fdSChristoph Hellwig 	long lines = bytes / (sizeof (long)) / 8 - 1;
70c46928fdSChristoph Hellwig 
71c46928fdSChristoph Hellwig 	prefetchw(p1);
72c46928fdSChristoph Hellwig 	prefetch(p2);
73c46928fdSChristoph Hellwig 	prefetch(p3);
74c46928fdSChristoph Hellwig 	prefetch(p4);
75c46928fdSChristoph Hellwig 
76c46928fdSChristoph Hellwig 	do {
77c46928fdSChristoph Hellwig 		prefetchw(p1+8);
78c46928fdSChristoph Hellwig 		prefetch(p2+8);
79c46928fdSChristoph Hellwig 		prefetch(p3+8);
80c46928fdSChristoph Hellwig 		prefetch(p4+8);
81c46928fdSChristoph Hellwig  once_more:
82c46928fdSChristoph Hellwig 		p1[0] ^= p2[0] ^ p3[0] ^ p4[0];
83c46928fdSChristoph Hellwig 		p1[1] ^= p2[1] ^ p3[1] ^ p4[1];
84c46928fdSChristoph Hellwig 		p1[2] ^= p2[2] ^ p3[2] ^ p4[2];
85c46928fdSChristoph Hellwig 		p1[3] ^= p2[3] ^ p3[3] ^ p4[3];
86c46928fdSChristoph Hellwig 		p1[4] ^= p2[4] ^ p3[4] ^ p4[4];
87c46928fdSChristoph Hellwig 		p1[5] ^= p2[5] ^ p3[5] ^ p4[5];
88c46928fdSChristoph Hellwig 		p1[6] ^= p2[6] ^ p3[6] ^ p4[6];
89c46928fdSChristoph Hellwig 		p1[7] ^= p2[7] ^ p3[7] ^ p4[7];
90c46928fdSChristoph Hellwig 		p1 += 8;
91c46928fdSChristoph Hellwig 		p2 += 8;
92c46928fdSChristoph Hellwig 		p3 += 8;
93c46928fdSChristoph Hellwig 		p4 += 8;
94c46928fdSChristoph Hellwig 	} while (--lines > 0);
95c46928fdSChristoph Hellwig 	if (lines == 0)
96c46928fdSChristoph Hellwig 		goto once_more;
97c46928fdSChristoph Hellwig }
98c46928fdSChristoph Hellwig 
99c46928fdSChristoph Hellwig static void
100c46928fdSChristoph Hellwig xor_8regs_p_5(unsigned long bytes, unsigned long * __restrict p1,
101c46928fdSChristoph Hellwig 	      const unsigned long * __restrict p2,
102c46928fdSChristoph Hellwig 	      const unsigned long * __restrict p3,
103c46928fdSChristoph Hellwig 	      const unsigned long * __restrict p4,
104c46928fdSChristoph Hellwig 	      const unsigned long * __restrict p5)
105c46928fdSChristoph Hellwig {
106c46928fdSChristoph Hellwig 	long lines = bytes / (sizeof (long)) / 8 - 1;
107c46928fdSChristoph Hellwig 
108c46928fdSChristoph Hellwig 	prefetchw(p1);
109c46928fdSChristoph Hellwig 	prefetch(p2);
110c46928fdSChristoph Hellwig 	prefetch(p3);
111c46928fdSChristoph Hellwig 	prefetch(p4);
112c46928fdSChristoph Hellwig 	prefetch(p5);
113c46928fdSChristoph Hellwig 
114c46928fdSChristoph Hellwig 	do {
115c46928fdSChristoph Hellwig 		prefetchw(p1+8);
116c46928fdSChristoph Hellwig 		prefetch(p2+8);
117c46928fdSChristoph Hellwig 		prefetch(p3+8);
118c46928fdSChristoph Hellwig 		prefetch(p4+8);
119c46928fdSChristoph Hellwig 		prefetch(p5+8);
120c46928fdSChristoph Hellwig  once_more:
121c46928fdSChristoph Hellwig 		p1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0];
122c46928fdSChristoph Hellwig 		p1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1];
123c46928fdSChristoph Hellwig 		p1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2];
124c46928fdSChristoph Hellwig 		p1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3];
125c46928fdSChristoph Hellwig 		p1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4];
126c46928fdSChristoph Hellwig 		p1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5];
127c46928fdSChristoph Hellwig 		p1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6];
128c46928fdSChristoph Hellwig 		p1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7];
129c46928fdSChristoph Hellwig 		p1 += 8;
130c46928fdSChristoph Hellwig 		p2 += 8;
131c46928fdSChristoph Hellwig 		p3 += 8;
132c46928fdSChristoph Hellwig 		p4 += 8;
133c46928fdSChristoph Hellwig 		p5 += 8;
134c46928fdSChristoph Hellwig 	} while (--lines > 0);
135c46928fdSChristoph Hellwig 	if (lines == 0)
136c46928fdSChristoph Hellwig 		goto once_more;
137c46928fdSChristoph Hellwig }
138c46928fdSChristoph Hellwig 
139*80dcf0a7SChristoph Hellwig 
140*80dcf0a7SChristoph Hellwig DO_XOR_BLOCKS(8regs_p, xor_8regs_p_2, xor_8regs_p_3, xor_8regs_p_4,
141*80dcf0a7SChristoph Hellwig 		xor_8regs_p_5);
142*80dcf0a7SChristoph Hellwig 
143c46928fdSChristoph Hellwig struct xor_block_template xor_block_8regs_p = {
144c46928fdSChristoph Hellwig 	.name		= "8regs_prefetch",
145*80dcf0a7SChristoph Hellwig 	.xor_gen	= xor_gen_8regs_p,
146c46928fdSChristoph Hellwig };
147