xref: /linux/arch/sparc/include/asm/xor_32.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1af1a8899SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2a439fe51SSam Ravnborg /*
3a439fe51SSam Ravnborg  * include/asm/xor.h
4a439fe51SSam Ravnborg  *
5a439fe51SSam Ravnborg  * Optimized RAID-5 checksumming functions for 32-bit Sparc.
6a439fe51SSam Ravnborg  */
7a439fe51SSam Ravnborg 
8a439fe51SSam Ravnborg /*
9a439fe51SSam Ravnborg  * High speed xor_block operation for RAID4/5 utilizing the
10a439fe51SSam Ravnborg  * ldd/std SPARC instructions.
11a439fe51SSam Ravnborg  *
12a439fe51SSam Ravnborg  * Copyright (C) 1999 Jakub Jelinek (jj@ultra.linux.cz)
13a439fe51SSam Ravnborg  */
14a439fe51SSam Ravnborg 
15a439fe51SSam Ravnborg static void
sparc_2(unsigned long bytes,unsigned long * __restrict p1,const unsigned long * __restrict p2)16*297565aaSArd Biesheuvel sparc_2(unsigned long bytes, unsigned long * __restrict p1,
17*297565aaSArd Biesheuvel 	const unsigned long * __restrict p2)
18a439fe51SSam Ravnborg {
19a439fe51SSam Ravnborg 	int lines = bytes / (sizeof (long)) / 8;
20a439fe51SSam Ravnborg 
21a439fe51SSam Ravnborg 	do {
22a439fe51SSam Ravnborg 		__asm__ __volatile__(
23a439fe51SSam Ravnborg 		  "ldd [%0 + 0x00], %%g2\n\t"
24a439fe51SSam Ravnborg 		  "ldd [%0 + 0x08], %%g4\n\t"
25a439fe51SSam Ravnborg 		  "ldd [%0 + 0x10], %%o0\n\t"
26a439fe51SSam Ravnborg 		  "ldd [%0 + 0x18], %%o2\n\t"
27a439fe51SSam Ravnborg 		  "ldd [%1 + 0x00], %%o4\n\t"
28a439fe51SSam Ravnborg 		  "ldd [%1 + 0x08], %%l0\n\t"
29a439fe51SSam Ravnborg 		  "ldd [%1 + 0x10], %%l2\n\t"
30a439fe51SSam Ravnborg 		  "ldd [%1 + 0x18], %%l4\n\t"
31a439fe51SSam Ravnborg 		  "xor %%g2, %%o4, %%g2\n\t"
32a439fe51SSam Ravnborg 		  "xor %%g3, %%o5, %%g3\n\t"
33a439fe51SSam Ravnborg 		  "xor %%g4, %%l0, %%g4\n\t"
34a439fe51SSam Ravnborg 		  "xor %%g5, %%l1, %%g5\n\t"
35a439fe51SSam Ravnborg 		  "xor %%o0, %%l2, %%o0\n\t"
36a439fe51SSam Ravnborg 		  "xor %%o1, %%l3, %%o1\n\t"
37a439fe51SSam Ravnborg 		  "xor %%o2, %%l4, %%o2\n\t"
38a439fe51SSam Ravnborg 		  "xor %%o3, %%l5, %%o3\n\t"
39a439fe51SSam Ravnborg 		  "std %%g2, [%0 + 0x00]\n\t"
40a439fe51SSam Ravnborg 		  "std %%g4, [%0 + 0x08]\n\t"
41a439fe51SSam Ravnborg 		  "std %%o0, [%0 + 0x10]\n\t"
42a439fe51SSam Ravnborg 		  "std %%o2, [%0 + 0x18]\n"
43a439fe51SSam Ravnborg 		:
44a439fe51SSam Ravnborg 		: "r" (p1), "r" (p2)
45a439fe51SSam Ravnborg 		: "g2", "g3", "g4", "g5",
46a439fe51SSam Ravnborg 		  "o0", "o1", "o2", "o3", "o4", "o5",
47a439fe51SSam Ravnborg 		  "l0", "l1", "l2", "l3", "l4", "l5");
48a439fe51SSam Ravnborg 		p1 += 8;
49a439fe51SSam Ravnborg 		p2 += 8;
50a439fe51SSam Ravnborg 	} while (--lines > 0);
51a439fe51SSam Ravnborg }
52a439fe51SSam Ravnborg 
53a439fe51SSam Ravnborg static void
sparc_3(unsigned long bytes,unsigned long * __restrict p1,const unsigned long * __restrict p2,const unsigned long * __restrict p3)54*297565aaSArd Biesheuvel sparc_3(unsigned long bytes, unsigned long * __restrict p1,
55*297565aaSArd Biesheuvel 	const unsigned long * __restrict p2,
56*297565aaSArd Biesheuvel 	const unsigned long * __restrict p3)
57a439fe51SSam Ravnborg {
58a439fe51SSam Ravnborg 	int lines = bytes / (sizeof (long)) / 8;
59a439fe51SSam Ravnborg 
60a439fe51SSam Ravnborg 	do {
61a439fe51SSam Ravnborg 		__asm__ __volatile__(
62a439fe51SSam Ravnborg 		  "ldd [%0 + 0x00], %%g2\n\t"
63a439fe51SSam Ravnborg 		  "ldd [%0 + 0x08], %%g4\n\t"
64a439fe51SSam Ravnborg 		  "ldd [%0 + 0x10], %%o0\n\t"
65a439fe51SSam Ravnborg 		  "ldd [%0 + 0x18], %%o2\n\t"
66a439fe51SSam Ravnborg 		  "ldd [%1 + 0x00], %%o4\n\t"
67a439fe51SSam Ravnborg 		  "ldd [%1 + 0x08], %%l0\n\t"
68a439fe51SSam Ravnborg 		  "ldd [%1 + 0x10], %%l2\n\t"
69a439fe51SSam Ravnborg 		  "ldd [%1 + 0x18], %%l4\n\t"
70a439fe51SSam Ravnborg 		  "xor %%g2, %%o4, %%g2\n\t"
71a439fe51SSam Ravnborg 		  "xor %%g3, %%o5, %%g3\n\t"
72a439fe51SSam Ravnborg 		  "ldd [%2 + 0x00], %%o4\n\t"
73a439fe51SSam Ravnborg 		  "xor %%g4, %%l0, %%g4\n\t"
74a439fe51SSam Ravnborg 		  "xor %%g5, %%l1, %%g5\n\t"
75a439fe51SSam Ravnborg 		  "ldd [%2 + 0x08], %%l0\n\t"
76a439fe51SSam Ravnborg 		  "xor %%o0, %%l2, %%o0\n\t"
77a439fe51SSam Ravnborg 		  "xor %%o1, %%l3, %%o1\n\t"
78a439fe51SSam Ravnborg 		  "ldd [%2 + 0x10], %%l2\n\t"
79a439fe51SSam Ravnborg 		  "xor %%o2, %%l4, %%o2\n\t"
80a439fe51SSam Ravnborg 		  "xor %%o3, %%l5, %%o3\n\t"
81a439fe51SSam Ravnborg 		  "ldd [%2 + 0x18], %%l4\n\t"
82a439fe51SSam Ravnborg 		  "xor %%g2, %%o4, %%g2\n\t"
83a439fe51SSam Ravnborg 		  "xor %%g3, %%o5, %%g3\n\t"
84a439fe51SSam Ravnborg 		  "xor %%g4, %%l0, %%g4\n\t"
85a439fe51SSam Ravnborg 		  "xor %%g5, %%l1, %%g5\n\t"
86a439fe51SSam Ravnborg 		  "xor %%o0, %%l2, %%o0\n\t"
87a439fe51SSam Ravnborg 		  "xor %%o1, %%l3, %%o1\n\t"
88a439fe51SSam Ravnborg 		  "xor %%o2, %%l4, %%o2\n\t"
89a439fe51SSam Ravnborg 		  "xor %%o3, %%l5, %%o3\n\t"
90a439fe51SSam Ravnborg 		  "std %%g2, [%0 + 0x00]\n\t"
91a439fe51SSam Ravnborg 		  "std %%g4, [%0 + 0x08]\n\t"
92a439fe51SSam Ravnborg 		  "std %%o0, [%0 + 0x10]\n\t"
93a439fe51SSam Ravnborg 		  "std %%o2, [%0 + 0x18]\n"
94a439fe51SSam Ravnborg 		:
95a439fe51SSam Ravnborg 		: "r" (p1), "r" (p2), "r" (p3)
96a439fe51SSam Ravnborg 		: "g2", "g3", "g4", "g5",
97a439fe51SSam Ravnborg 		  "o0", "o1", "o2", "o3", "o4", "o5",
98a439fe51SSam Ravnborg 		  "l0", "l1", "l2", "l3", "l4", "l5");
99a439fe51SSam Ravnborg 		p1 += 8;
100a439fe51SSam Ravnborg 		p2 += 8;
101a439fe51SSam Ravnborg 		p3 += 8;
102a439fe51SSam Ravnborg 	} while (--lines > 0);
103a439fe51SSam Ravnborg }
104a439fe51SSam Ravnborg 
105a439fe51SSam Ravnborg static void
sparc_4(unsigned long bytes,unsigned long * __restrict p1,const unsigned long * __restrict p2,const unsigned long * __restrict p3,const unsigned long * __restrict p4)106*297565aaSArd Biesheuvel sparc_4(unsigned long bytes, unsigned long * __restrict p1,
107*297565aaSArd Biesheuvel 	const unsigned long * __restrict p2,
108*297565aaSArd Biesheuvel 	const unsigned long * __restrict p3,
109*297565aaSArd Biesheuvel 	const unsigned long * __restrict p4)
110a439fe51SSam Ravnborg {
111a439fe51SSam Ravnborg 	int lines = bytes / (sizeof (long)) / 8;
112a439fe51SSam Ravnborg 
113a439fe51SSam Ravnborg 	do {
114a439fe51SSam Ravnborg 		__asm__ __volatile__(
115a439fe51SSam Ravnborg 		  "ldd [%0 + 0x00], %%g2\n\t"
116a439fe51SSam Ravnborg 		  "ldd [%0 + 0x08], %%g4\n\t"
117a439fe51SSam Ravnborg 		  "ldd [%0 + 0x10], %%o0\n\t"
118a439fe51SSam Ravnborg 		  "ldd [%0 + 0x18], %%o2\n\t"
119a439fe51SSam Ravnborg 		  "ldd [%1 + 0x00], %%o4\n\t"
120a439fe51SSam Ravnborg 		  "ldd [%1 + 0x08], %%l0\n\t"
121a439fe51SSam Ravnborg 		  "ldd [%1 + 0x10], %%l2\n\t"
122a439fe51SSam Ravnborg 		  "ldd [%1 + 0x18], %%l4\n\t"
123a439fe51SSam Ravnborg 		  "xor %%g2, %%o4, %%g2\n\t"
124a439fe51SSam Ravnborg 		  "xor %%g3, %%o5, %%g3\n\t"
125a439fe51SSam Ravnborg 		  "ldd [%2 + 0x00], %%o4\n\t"
126a439fe51SSam Ravnborg 		  "xor %%g4, %%l0, %%g4\n\t"
127a439fe51SSam Ravnborg 		  "xor %%g5, %%l1, %%g5\n\t"
128a439fe51SSam Ravnborg 		  "ldd [%2 + 0x08], %%l0\n\t"
129a439fe51SSam Ravnborg 		  "xor %%o0, %%l2, %%o0\n\t"
130a439fe51SSam Ravnborg 		  "xor %%o1, %%l3, %%o1\n\t"
131a439fe51SSam Ravnborg 		  "ldd [%2 + 0x10], %%l2\n\t"
132a439fe51SSam Ravnborg 		  "xor %%o2, %%l4, %%o2\n\t"
133a439fe51SSam Ravnborg 		  "xor %%o3, %%l5, %%o3\n\t"
134a439fe51SSam Ravnborg 		  "ldd [%2 + 0x18], %%l4\n\t"
135a439fe51SSam Ravnborg 		  "xor %%g2, %%o4, %%g2\n\t"
136a439fe51SSam Ravnborg 		  "xor %%g3, %%o5, %%g3\n\t"
137a439fe51SSam Ravnborg 		  "ldd [%3 + 0x00], %%o4\n\t"
138a439fe51SSam Ravnborg 		  "xor %%g4, %%l0, %%g4\n\t"
139a439fe51SSam Ravnborg 		  "xor %%g5, %%l1, %%g5\n\t"
140a439fe51SSam Ravnborg 		  "ldd [%3 + 0x08], %%l0\n\t"
141a439fe51SSam Ravnborg 		  "xor %%o0, %%l2, %%o0\n\t"
142a439fe51SSam Ravnborg 		  "xor %%o1, %%l3, %%o1\n\t"
143a439fe51SSam Ravnborg 		  "ldd [%3 + 0x10], %%l2\n\t"
144a439fe51SSam Ravnborg 		  "xor %%o2, %%l4, %%o2\n\t"
145a439fe51SSam Ravnborg 		  "xor %%o3, %%l5, %%o3\n\t"
146a439fe51SSam Ravnborg 		  "ldd [%3 + 0x18], %%l4\n\t"
147a439fe51SSam Ravnborg 		  "xor %%g2, %%o4, %%g2\n\t"
148a439fe51SSam Ravnborg 		  "xor %%g3, %%o5, %%g3\n\t"
149a439fe51SSam Ravnborg 		  "xor %%g4, %%l0, %%g4\n\t"
150a439fe51SSam Ravnborg 		  "xor %%g5, %%l1, %%g5\n\t"
151a439fe51SSam Ravnborg 		  "xor %%o0, %%l2, %%o0\n\t"
152a439fe51SSam Ravnborg 		  "xor %%o1, %%l3, %%o1\n\t"
153a439fe51SSam Ravnborg 		  "xor %%o2, %%l4, %%o2\n\t"
154a439fe51SSam Ravnborg 		  "xor %%o3, %%l5, %%o3\n\t"
155a439fe51SSam Ravnborg 		  "std %%g2, [%0 + 0x00]\n\t"
156a439fe51SSam Ravnborg 		  "std %%g4, [%0 + 0x08]\n\t"
157a439fe51SSam Ravnborg 		  "std %%o0, [%0 + 0x10]\n\t"
158a439fe51SSam Ravnborg 		  "std %%o2, [%0 + 0x18]\n"
159a439fe51SSam Ravnborg 		:
160a439fe51SSam Ravnborg 		: "r" (p1), "r" (p2), "r" (p3), "r" (p4)
161a439fe51SSam Ravnborg 		: "g2", "g3", "g4", "g5",
162a439fe51SSam Ravnborg 		  "o0", "o1", "o2", "o3", "o4", "o5",
163a439fe51SSam Ravnborg 		  "l0", "l1", "l2", "l3", "l4", "l5");
164a439fe51SSam Ravnborg 		p1 += 8;
165a439fe51SSam Ravnborg 		p2 += 8;
166a439fe51SSam Ravnborg 		p3 += 8;
167a439fe51SSam Ravnborg 		p4 += 8;
168a439fe51SSam Ravnborg 	} while (--lines > 0);
169a439fe51SSam Ravnborg }
170a439fe51SSam Ravnborg 
171a439fe51SSam Ravnborg static void
sparc_5(unsigned long bytes,unsigned long * __restrict p1,const unsigned long * __restrict p2,const unsigned long * __restrict p3,const unsigned long * __restrict p4,const unsigned long * __restrict p5)172*297565aaSArd Biesheuvel sparc_5(unsigned long bytes, unsigned long * __restrict p1,
173*297565aaSArd Biesheuvel 	const unsigned long * __restrict p2,
174*297565aaSArd Biesheuvel 	const unsigned long * __restrict p3,
175*297565aaSArd Biesheuvel 	const unsigned long * __restrict p4,
176*297565aaSArd Biesheuvel 	const unsigned long * __restrict p5)
177a439fe51SSam Ravnborg {
178a439fe51SSam Ravnborg 	int lines = bytes / (sizeof (long)) / 8;
179a439fe51SSam Ravnborg 
180a439fe51SSam Ravnborg 	do {
181a439fe51SSam Ravnborg 		__asm__ __volatile__(
182a439fe51SSam Ravnborg 		  "ldd [%0 + 0x00], %%g2\n\t"
183a439fe51SSam Ravnborg 		  "ldd [%0 + 0x08], %%g4\n\t"
184a439fe51SSam Ravnborg 		  "ldd [%0 + 0x10], %%o0\n\t"
185a439fe51SSam Ravnborg 		  "ldd [%0 + 0x18], %%o2\n\t"
186a439fe51SSam Ravnborg 		  "ldd [%1 + 0x00], %%o4\n\t"
187a439fe51SSam Ravnborg 		  "ldd [%1 + 0x08], %%l0\n\t"
188a439fe51SSam Ravnborg 		  "ldd [%1 + 0x10], %%l2\n\t"
189a439fe51SSam Ravnborg 		  "ldd [%1 + 0x18], %%l4\n\t"
190a439fe51SSam Ravnborg 		  "xor %%g2, %%o4, %%g2\n\t"
191a439fe51SSam Ravnborg 		  "xor %%g3, %%o5, %%g3\n\t"
192a439fe51SSam Ravnborg 		  "ldd [%2 + 0x00], %%o4\n\t"
193a439fe51SSam Ravnborg 		  "xor %%g4, %%l0, %%g4\n\t"
194a439fe51SSam Ravnborg 		  "xor %%g5, %%l1, %%g5\n\t"
195a439fe51SSam Ravnborg 		  "ldd [%2 + 0x08], %%l0\n\t"
196a439fe51SSam Ravnborg 		  "xor %%o0, %%l2, %%o0\n\t"
197a439fe51SSam Ravnborg 		  "xor %%o1, %%l3, %%o1\n\t"
198a439fe51SSam Ravnborg 		  "ldd [%2 + 0x10], %%l2\n\t"
199a439fe51SSam Ravnborg 		  "xor %%o2, %%l4, %%o2\n\t"
200a439fe51SSam Ravnborg 		  "xor %%o3, %%l5, %%o3\n\t"
201a439fe51SSam Ravnborg 		  "ldd [%2 + 0x18], %%l4\n\t"
202a439fe51SSam Ravnborg 		  "xor %%g2, %%o4, %%g2\n\t"
203a439fe51SSam Ravnborg 		  "xor %%g3, %%o5, %%g3\n\t"
204a439fe51SSam Ravnborg 		  "ldd [%3 + 0x00], %%o4\n\t"
205a439fe51SSam Ravnborg 		  "xor %%g4, %%l0, %%g4\n\t"
206a439fe51SSam Ravnborg 		  "xor %%g5, %%l1, %%g5\n\t"
207a439fe51SSam Ravnborg 		  "ldd [%3 + 0x08], %%l0\n\t"
208a439fe51SSam Ravnborg 		  "xor %%o0, %%l2, %%o0\n\t"
209a439fe51SSam Ravnborg 		  "xor %%o1, %%l3, %%o1\n\t"
210a439fe51SSam Ravnborg 		  "ldd [%3 + 0x10], %%l2\n\t"
211a439fe51SSam Ravnborg 		  "xor %%o2, %%l4, %%o2\n\t"
212a439fe51SSam Ravnborg 		  "xor %%o3, %%l5, %%o3\n\t"
213a439fe51SSam Ravnborg 		  "ldd [%3 + 0x18], %%l4\n\t"
214a439fe51SSam Ravnborg 		  "xor %%g2, %%o4, %%g2\n\t"
215a439fe51SSam Ravnborg 		  "xor %%g3, %%o5, %%g3\n\t"
216a439fe51SSam Ravnborg 		  "ldd [%4 + 0x00], %%o4\n\t"
217a439fe51SSam Ravnborg 		  "xor %%g4, %%l0, %%g4\n\t"
218a439fe51SSam Ravnborg 		  "xor %%g5, %%l1, %%g5\n\t"
219a439fe51SSam Ravnborg 		  "ldd [%4 + 0x08], %%l0\n\t"
220a439fe51SSam Ravnborg 		  "xor %%o0, %%l2, %%o0\n\t"
221a439fe51SSam Ravnborg 		  "xor %%o1, %%l3, %%o1\n\t"
222a439fe51SSam Ravnborg 		  "ldd [%4 + 0x10], %%l2\n\t"
223a439fe51SSam Ravnborg 		  "xor %%o2, %%l4, %%o2\n\t"
224a439fe51SSam Ravnborg 		  "xor %%o3, %%l5, %%o3\n\t"
225a439fe51SSam Ravnborg 		  "ldd [%4 + 0x18], %%l4\n\t"
226a439fe51SSam Ravnborg 		  "xor %%g2, %%o4, %%g2\n\t"
227a439fe51SSam Ravnborg 		  "xor %%g3, %%o5, %%g3\n\t"
228a439fe51SSam Ravnborg 		  "xor %%g4, %%l0, %%g4\n\t"
229a439fe51SSam Ravnborg 		  "xor %%g5, %%l1, %%g5\n\t"
230a439fe51SSam Ravnborg 		  "xor %%o0, %%l2, %%o0\n\t"
231a439fe51SSam Ravnborg 		  "xor %%o1, %%l3, %%o1\n\t"
232a439fe51SSam Ravnborg 		  "xor %%o2, %%l4, %%o2\n\t"
233a439fe51SSam Ravnborg 		  "xor %%o3, %%l5, %%o3\n\t"
234a439fe51SSam Ravnborg 		  "std %%g2, [%0 + 0x00]\n\t"
235a439fe51SSam Ravnborg 		  "std %%g4, [%0 + 0x08]\n\t"
236a439fe51SSam Ravnborg 		  "std %%o0, [%0 + 0x10]\n\t"
237a439fe51SSam Ravnborg 		  "std %%o2, [%0 + 0x18]\n"
238a439fe51SSam Ravnborg 		:
239a439fe51SSam Ravnborg 		: "r" (p1), "r" (p2), "r" (p3), "r" (p4), "r" (p5)
240a439fe51SSam Ravnborg 		: "g2", "g3", "g4", "g5",
241a439fe51SSam Ravnborg 		  "o0", "o1", "o2", "o3", "o4", "o5",
242a439fe51SSam Ravnborg 		  "l0", "l1", "l2", "l3", "l4", "l5");
243a439fe51SSam Ravnborg 		p1 += 8;
244a439fe51SSam Ravnborg 		p2 += 8;
245a439fe51SSam Ravnborg 		p3 += 8;
246a439fe51SSam Ravnborg 		p4 += 8;
247a439fe51SSam Ravnborg 		p5 += 8;
248a439fe51SSam Ravnborg 	} while (--lines > 0);
249a439fe51SSam Ravnborg }
250a439fe51SSam Ravnborg 
251a439fe51SSam Ravnborg static struct xor_block_template xor_block_SPARC = {
252a439fe51SSam Ravnborg 	.name	= "SPARC",
253a439fe51SSam Ravnborg 	.do_2	= sparc_2,
254a439fe51SSam Ravnborg 	.do_3	= sparc_3,
255a439fe51SSam Ravnborg 	.do_4	= sparc_4,
256a439fe51SSam Ravnborg 	.do_5	= sparc_5,
257a439fe51SSam Ravnborg };
258a439fe51SSam Ravnborg 
259a439fe51SSam Ravnborg /* For grins, also test the generic routines.  */
260a439fe51SSam Ravnborg #include <asm-generic/xor.h>
261a439fe51SSam Ravnborg 
262a439fe51SSam Ravnborg #undef XOR_TRY_TEMPLATES
263a439fe51SSam Ravnborg #define XOR_TRY_TEMPLATES				\
264a439fe51SSam Ravnborg 	do {						\
265a439fe51SSam Ravnborg 		xor_speed(&xor_block_8regs);		\
266a439fe51SSam Ravnborg 		xor_speed(&xor_block_32regs);		\
267a439fe51SSam Ravnborg 		xor_speed(&xor_block_SPARC);		\
268a439fe51SSam Ravnborg 	} while (0)
269