xref: /linux/lib/raid/xor/xor-32regs-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_32regs_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 
11c46928fdSChristoph Hellwig 	prefetchw(p1);
12c46928fdSChristoph Hellwig 	prefetch(p2);
13c46928fdSChristoph Hellwig 
14c46928fdSChristoph Hellwig 	do {
15c46928fdSChristoph Hellwig 		register long d0, d1, d2, d3, d4, d5, d6, d7;
16c46928fdSChristoph Hellwig 
17c46928fdSChristoph Hellwig 		prefetchw(p1+8);
18c46928fdSChristoph Hellwig 		prefetch(p2+8);
19c46928fdSChristoph Hellwig  once_more:
20c46928fdSChristoph Hellwig 		d0 = p1[0];	/* Pull the stuff into registers	*/
21c46928fdSChristoph Hellwig 		d1 = p1[1];	/*  ... in bursts, if possible.		*/
22c46928fdSChristoph Hellwig 		d2 = p1[2];
23c46928fdSChristoph Hellwig 		d3 = p1[3];
24c46928fdSChristoph Hellwig 		d4 = p1[4];
25c46928fdSChristoph Hellwig 		d5 = p1[5];
26c46928fdSChristoph Hellwig 		d6 = p1[6];
27c46928fdSChristoph Hellwig 		d7 = p1[7];
28c46928fdSChristoph Hellwig 		d0 ^= p2[0];
29c46928fdSChristoph Hellwig 		d1 ^= p2[1];
30c46928fdSChristoph Hellwig 		d2 ^= p2[2];
31c46928fdSChristoph Hellwig 		d3 ^= p2[3];
32c46928fdSChristoph Hellwig 		d4 ^= p2[4];
33c46928fdSChristoph Hellwig 		d5 ^= p2[5];
34c46928fdSChristoph Hellwig 		d6 ^= p2[6];
35c46928fdSChristoph Hellwig 		d7 ^= p2[7];
36c46928fdSChristoph Hellwig 		p1[0] = d0;	/* Store the result (in bursts)		*/
37c46928fdSChristoph Hellwig 		p1[1] = d1;
38c46928fdSChristoph Hellwig 		p1[2] = d2;
39c46928fdSChristoph Hellwig 		p1[3] = d3;
40c46928fdSChristoph Hellwig 		p1[4] = d4;
41c46928fdSChristoph Hellwig 		p1[5] = d5;
42c46928fdSChristoph Hellwig 		p1[6] = d6;
43c46928fdSChristoph Hellwig 		p1[7] = d7;
44c46928fdSChristoph Hellwig 		p1 += 8;
45c46928fdSChristoph Hellwig 		p2 += 8;
46c46928fdSChristoph Hellwig 	} while (--lines > 0);
47c46928fdSChristoph Hellwig 	if (lines == 0)
48c46928fdSChristoph Hellwig 		goto once_more;
49c46928fdSChristoph Hellwig }
50c46928fdSChristoph Hellwig 
51c46928fdSChristoph Hellwig static void
52c46928fdSChristoph Hellwig xor_32regs_p_3(unsigned long bytes, unsigned long * __restrict p1,
53c46928fdSChristoph Hellwig 	       const unsigned long * __restrict p2,
54c46928fdSChristoph Hellwig 	       const unsigned long * __restrict p3)
55c46928fdSChristoph Hellwig {
56c46928fdSChristoph Hellwig 	long lines = bytes / (sizeof (long)) / 8 - 1;
57c46928fdSChristoph Hellwig 
58c46928fdSChristoph Hellwig 	prefetchw(p1);
59c46928fdSChristoph Hellwig 	prefetch(p2);
60c46928fdSChristoph Hellwig 	prefetch(p3);
61c46928fdSChristoph Hellwig 
62c46928fdSChristoph Hellwig 	do {
63c46928fdSChristoph Hellwig 		register long d0, d1, d2, d3, d4, d5, d6, d7;
64c46928fdSChristoph Hellwig 
65c46928fdSChristoph Hellwig 		prefetchw(p1+8);
66c46928fdSChristoph Hellwig 		prefetch(p2+8);
67c46928fdSChristoph Hellwig 		prefetch(p3+8);
68c46928fdSChristoph Hellwig  once_more:
69c46928fdSChristoph Hellwig 		d0 = p1[0];	/* Pull the stuff into registers	*/
70c46928fdSChristoph Hellwig 		d1 = p1[1];	/*  ... in bursts, if possible.		*/
71c46928fdSChristoph Hellwig 		d2 = p1[2];
72c46928fdSChristoph Hellwig 		d3 = p1[3];
73c46928fdSChristoph Hellwig 		d4 = p1[4];
74c46928fdSChristoph Hellwig 		d5 = p1[5];
75c46928fdSChristoph Hellwig 		d6 = p1[6];
76c46928fdSChristoph Hellwig 		d7 = p1[7];
77c46928fdSChristoph Hellwig 		d0 ^= p2[0];
78c46928fdSChristoph Hellwig 		d1 ^= p2[1];
79c46928fdSChristoph Hellwig 		d2 ^= p2[2];
80c46928fdSChristoph Hellwig 		d3 ^= p2[3];
81c46928fdSChristoph Hellwig 		d4 ^= p2[4];
82c46928fdSChristoph Hellwig 		d5 ^= p2[5];
83c46928fdSChristoph Hellwig 		d6 ^= p2[6];
84c46928fdSChristoph Hellwig 		d7 ^= p2[7];
85c46928fdSChristoph Hellwig 		d0 ^= p3[0];
86c46928fdSChristoph Hellwig 		d1 ^= p3[1];
87c46928fdSChristoph Hellwig 		d2 ^= p3[2];
88c46928fdSChristoph Hellwig 		d3 ^= p3[3];
89c46928fdSChristoph Hellwig 		d4 ^= p3[4];
90c46928fdSChristoph Hellwig 		d5 ^= p3[5];
91c46928fdSChristoph Hellwig 		d6 ^= p3[6];
92c46928fdSChristoph Hellwig 		d7 ^= p3[7];
93c46928fdSChristoph Hellwig 		p1[0] = d0;	/* Store the result (in bursts)		*/
94c46928fdSChristoph Hellwig 		p1[1] = d1;
95c46928fdSChristoph Hellwig 		p1[2] = d2;
96c46928fdSChristoph Hellwig 		p1[3] = d3;
97c46928fdSChristoph Hellwig 		p1[4] = d4;
98c46928fdSChristoph Hellwig 		p1[5] = d5;
99c46928fdSChristoph Hellwig 		p1[6] = d6;
100c46928fdSChristoph Hellwig 		p1[7] = d7;
101c46928fdSChristoph Hellwig 		p1 += 8;
102c46928fdSChristoph Hellwig 		p2 += 8;
103c46928fdSChristoph Hellwig 		p3 += 8;
104c46928fdSChristoph Hellwig 	} while (--lines > 0);
105c46928fdSChristoph Hellwig 	if (lines == 0)
106c46928fdSChristoph Hellwig 		goto once_more;
107c46928fdSChristoph Hellwig }
108c46928fdSChristoph Hellwig 
109c46928fdSChristoph Hellwig static void
110c46928fdSChristoph Hellwig xor_32regs_p_4(unsigned long bytes, unsigned long * __restrict p1,
111c46928fdSChristoph Hellwig 	       const unsigned long * __restrict p2,
112c46928fdSChristoph Hellwig 	       const unsigned long * __restrict p3,
113c46928fdSChristoph Hellwig 	       const unsigned long * __restrict p4)
114c46928fdSChristoph Hellwig {
115c46928fdSChristoph Hellwig 	long lines = bytes / (sizeof (long)) / 8 - 1;
116c46928fdSChristoph Hellwig 
117c46928fdSChristoph Hellwig 	prefetchw(p1);
118c46928fdSChristoph Hellwig 	prefetch(p2);
119c46928fdSChristoph Hellwig 	prefetch(p3);
120c46928fdSChristoph Hellwig 	prefetch(p4);
121c46928fdSChristoph Hellwig 
122c46928fdSChristoph Hellwig 	do {
123c46928fdSChristoph Hellwig 		register long d0, d1, d2, d3, d4, d5, d6, d7;
124c46928fdSChristoph Hellwig 
125c46928fdSChristoph Hellwig 		prefetchw(p1+8);
126c46928fdSChristoph Hellwig 		prefetch(p2+8);
127c46928fdSChristoph Hellwig 		prefetch(p3+8);
128c46928fdSChristoph Hellwig 		prefetch(p4+8);
129c46928fdSChristoph Hellwig  once_more:
130c46928fdSChristoph Hellwig 		d0 = p1[0];	/* Pull the stuff into registers	*/
131c46928fdSChristoph Hellwig 		d1 = p1[1];	/*  ... in bursts, if possible.		*/
132c46928fdSChristoph Hellwig 		d2 = p1[2];
133c46928fdSChristoph Hellwig 		d3 = p1[3];
134c46928fdSChristoph Hellwig 		d4 = p1[4];
135c46928fdSChristoph Hellwig 		d5 = p1[5];
136c46928fdSChristoph Hellwig 		d6 = p1[6];
137c46928fdSChristoph Hellwig 		d7 = p1[7];
138c46928fdSChristoph Hellwig 		d0 ^= p2[0];
139c46928fdSChristoph Hellwig 		d1 ^= p2[1];
140c46928fdSChristoph Hellwig 		d2 ^= p2[2];
141c46928fdSChristoph Hellwig 		d3 ^= p2[3];
142c46928fdSChristoph Hellwig 		d4 ^= p2[4];
143c46928fdSChristoph Hellwig 		d5 ^= p2[5];
144c46928fdSChristoph Hellwig 		d6 ^= p2[6];
145c46928fdSChristoph Hellwig 		d7 ^= p2[7];
146c46928fdSChristoph Hellwig 		d0 ^= p3[0];
147c46928fdSChristoph Hellwig 		d1 ^= p3[1];
148c46928fdSChristoph Hellwig 		d2 ^= p3[2];
149c46928fdSChristoph Hellwig 		d3 ^= p3[3];
150c46928fdSChristoph Hellwig 		d4 ^= p3[4];
151c46928fdSChristoph Hellwig 		d5 ^= p3[5];
152c46928fdSChristoph Hellwig 		d6 ^= p3[6];
153c46928fdSChristoph Hellwig 		d7 ^= p3[7];
154c46928fdSChristoph Hellwig 		d0 ^= p4[0];
155c46928fdSChristoph Hellwig 		d1 ^= p4[1];
156c46928fdSChristoph Hellwig 		d2 ^= p4[2];
157c46928fdSChristoph Hellwig 		d3 ^= p4[3];
158c46928fdSChristoph Hellwig 		d4 ^= p4[4];
159c46928fdSChristoph Hellwig 		d5 ^= p4[5];
160c46928fdSChristoph Hellwig 		d6 ^= p4[6];
161c46928fdSChristoph Hellwig 		d7 ^= p4[7];
162c46928fdSChristoph Hellwig 		p1[0] = d0;	/* Store the result (in bursts)		*/
163c46928fdSChristoph Hellwig 		p1[1] = d1;
164c46928fdSChristoph Hellwig 		p1[2] = d2;
165c46928fdSChristoph Hellwig 		p1[3] = d3;
166c46928fdSChristoph Hellwig 		p1[4] = d4;
167c46928fdSChristoph Hellwig 		p1[5] = d5;
168c46928fdSChristoph Hellwig 		p1[6] = d6;
169c46928fdSChristoph Hellwig 		p1[7] = d7;
170c46928fdSChristoph Hellwig 		p1 += 8;
171c46928fdSChristoph Hellwig 		p2 += 8;
172c46928fdSChristoph Hellwig 		p3 += 8;
173c46928fdSChristoph Hellwig 		p4 += 8;
174c46928fdSChristoph Hellwig 	} while (--lines > 0);
175c46928fdSChristoph Hellwig 	if (lines == 0)
176c46928fdSChristoph Hellwig 		goto once_more;
177c46928fdSChristoph Hellwig }
178c46928fdSChristoph Hellwig 
179c46928fdSChristoph Hellwig static void
180c46928fdSChristoph Hellwig xor_32regs_p_5(unsigned long bytes, unsigned long * __restrict p1,
181c46928fdSChristoph Hellwig 	       const unsigned long * __restrict p2,
182c46928fdSChristoph Hellwig 	       const unsigned long * __restrict p3,
183c46928fdSChristoph Hellwig 	       const unsigned long * __restrict p4,
184c46928fdSChristoph Hellwig 	       const unsigned long * __restrict p5)
185c46928fdSChristoph Hellwig {
186c46928fdSChristoph Hellwig 	long lines = bytes / (sizeof (long)) / 8 - 1;
187c46928fdSChristoph Hellwig 
188c46928fdSChristoph Hellwig 	prefetchw(p1);
189c46928fdSChristoph Hellwig 	prefetch(p2);
190c46928fdSChristoph Hellwig 	prefetch(p3);
191c46928fdSChristoph Hellwig 	prefetch(p4);
192c46928fdSChristoph Hellwig 	prefetch(p5);
193c46928fdSChristoph Hellwig 
194c46928fdSChristoph Hellwig 	do {
195c46928fdSChristoph Hellwig 		register long d0, d1, d2, d3, d4, d5, d6, d7;
196c46928fdSChristoph Hellwig 
197c46928fdSChristoph Hellwig 		prefetchw(p1+8);
198c46928fdSChristoph Hellwig 		prefetch(p2+8);
199c46928fdSChristoph Hellwig 		prefetch(p3+8);
200c46928fdSChristoph Hellwig 		prefetch(p4+8);
201c46928fdSChristoph Hellwig 		prefetch(p5+8);
202c46928fdSChristoph Hellwig  once_more:
203c46928fdSChristoph Hellwig 		d0 = p1[0];	/* Pull the stuff into registers	*/
204c46928fdSChristoph Hellwig 		d1 = p1[1];	/*  ... in bursts, if possible.		*/
205c46928fdSChristoph Hellwig 		d2 = p1[2];
206c46928fdSChristoph Hellwig 		d3 = p1[3];
207c46928fdSChristoph Hellwig 		d4 = p1[4];
208c46928fdSChristoph Hellwig 		d5 = p1[5];
209c46928fdSChristoph Hellwig 		d6 = p1[6];
210c46928fdSChristoph Hellwig 		d7 = p1[7];
211c46928fdSChristoph Hellwig 		d0 ^= p2[0];
212c46928fdSChristoph Hellwig 		d1 ^= p2[1];
213c46928fdSChristoph Hellwig 		d2 ^= p2[2];
214c46928fdSChristoph Hellwig 		d3 ^= p2[3];
215c46928fdSChristoph Hellwig 		d4 ^= p2[4];
216c46928fdSChristoph Hellwig 		d5 ^= p2[5];
217c46928fdSChristoph Hellwig 		d6 ^= p2[6];
218c46928fdSChristoph Hellwig 		d7 ^= p2[7];
219c46928fdSChristoph Hellwig 		d0 ^= p3[0];
220c46928fdSChristoph Hellwig 		d1 ^= p3[1];
221c46928fdSChristoph Hellwig 		d2 ^= p3[2];
222c46928fdSChristoph Hellwig 		d3 ^= p3[3];
223c46928fdSChristoph Hellwig 		d4 ^= p3[4];
224c46928fdSChristoph Hellwig 		d5 ^= p3[5];
225c46928fdSChristoph Hellwig 		d6 ^= p3[6];
226c46928fdSChristoph Hellwig 		d7 ^= p3[7];
227c46928fdSChristoph Hellwig 		d0 ^= p4[0];
228c46928fdSChristoph Hellwig 		d1 ^= p4[1];
229c46928fdSChristoph Hellwig 		d2 ^= p4[2];
230c46928fdSChristoph Hellwig 		d3 ^= p4[3];
231c46928fdSChristoph Hellwig 		d4 ^= p4[4];
232c46928fdSChristoph Hellwig 		d5 ^= p4[5];
233c46928fdSChristoph Hellwig 		d6 ^= p4[6];
234c46928fdSChristoph Hellwig 		d7 ^= p4[7];
235c46928fdSChristoph Hellwig 		d0 ^= p5[0];
236c46928fdSChristoph Hellwig 		d1 ^= p5[1];
237c46928fdSChristoph Hellwig 		d2 ^= p5[2];
238c46928fdSChristoph Hellwig 		d3 ^= p5[3];
239c46928fdSChristoph Hellwig 		d4 ^= p5[4];
240c46928fdSChristoph Hellwig 		d5 ^= p5[5];
241c46928fdSChristoph Hellwig 		d6 ^= p5[6];
242c46928fdSChristoph Hellwig 		d7 ^= p5[7];
243c46928fdSChristoph Hellwig 		p1[0] = d0;	/* Store the result (in bursts)		*/
244c46928fdSChristoph Hellwig 		p1[1] = d1;
245c46928fdSChristoph Hellwig 		p1[2] = d2;
246c46928fdSChristoph Hellwig 		p1[3] = d3;
247c46928fdSChristoph Hellwig 		p1[4] = d4;
248c46928fdSChristoph Hellwig 		p1[5] = d5;
249c46928fdSChristoph Hellwig 		p1[6] = d6;
250c46928fdSChristoph Hellwig 		p1[7] = d7;
251c46928fdSChristoph Hellwig 		p1 += 8;
252c46928fdSChristoph Hellwig 		p2 += 8;
253c46928fdSChristoph Hellwig 		p3 += 8;
254c46928fdSChristoph Hellwig 		p4 += 8;
255c46928fdSChristoph Hellwig 		p5 += 8;
256c46928fdSChristoph Hellwig 	} while (--lines > 0);
257c46928fdSChristoph Hellwig 	if (lines == 0)
258c46928fdSChristoph Hellwig 		goto once_more;
259c46928fdSChristoph Hellwig }
260c46928fdSChristoph Hellwig 
261*80dcf0a7SChristoph Hellwig DO_XOR_BLOCKS(32regs_p, xor_32regs_p_2, xor_32regs_p_3, xor_32regs_p_4,
262*80dcf0a7SChristoph Hellwig 		xor_32regs_p_5);
263*80dcf0a7SChristoph Hellwig 
264c46928fdSChristoph Hellwig struct xor_block_template xor_block_32regs_p = {
265c46928fdSChristoph Hellwig 	.name		= "32regs_prefetch",
266*80dcf0a7SChristoph Hellwig 	.xor_gen	= xor_gen_32regs_p,
267c46928fdSChristoph Hellwig };
268