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