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