2 * include/asm-sparc64/xor.h
4 * High speed xor_block operation for RAID4/5 utilizing the
5 * UltraSparc Visual Instruction Set.
7 * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2, or (at your option)
14 * You should have received a copy of the GNU General Public License
15 * (for example /usr/src/linux/COPYING); if not, write to the Free
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * !(((long)dest | (long)sourceN) & (64 - 1)) &&
22 * !(len & 127) && len >= 256
24 * It is done in pure assembly, as otherwise gcc makes it a non-leaf
25 * function, which is not what we want.
28 #include <asm/pstate.h>
31 extern void xor_vis_2(unsigned long, unsigned long *, unsigned long *);
32 extern void xor_vis_3(unsigned long, unsigned long *, unsigned long *,
34 extern void xor_vis_4(unsigned long, unsigned long *, unsigned long *,
35 unsigned long *, unsigned long *);
36 extern void xor_vis_5(unsigned long, unsigned long *, unsigned long *,
37 unsigned long *, unsigned long *, unsigned long *);
41 #define DEF(x) __asm__(#x " = " _S(x))
47 /* ??? We set and use %asi instead of using ASI_BLK_P directly because gas
48 currently does not accept symbolic constants for the ASI specifier. */
53 .type xor_vis_2,@function\n\
56 andcc %o5, FPRS_FEF|FPRS_DU, %g0\n\
58 sethi %hi(VISenter), %g1\n\
59 jmpl %g1 + %lo(VISenter), %g7\n\
61 0: wr %g0, FPRS_FEF, %fprs\n\
63 wr %g0, ASI_BLK_P, %asi\n\
64 membar #LoadStore|#StoreLoad|#StoreStore\n\
66 ldda [%o1] %asi, %f0\n\
67 ldda [%o2] %asi, %f16\n\
69 2: ldda [%o1 + 64] %asi, %f32\n\
70 fxor %f0, %f16, %f16\n\
71 fxor %f2, %f18, %f18\n\
72 fxor %f4, %f20, %f20\n\
73 fxor %f6, %f22, %f22\n\
74 fxor %f8, %f24, %f24\n\
75 fxor %f10, %f26, %f26\n\
76 fxor %f12, %f28, %f28\n\
77 fxor %f14, %f30, %f30\n\
78 stda %f16, [%o1] %asi\n\
79 ldda [%o2 + 64] %asi, %f48\n\
80 ldda [%o1 + 128] %asi, %f0\n\
81 fxor %f32, %f48, %f48\n\
82 fxor %f34, %f50, %f50\n\
84 fxor %f36, %f52, %f52\n\
86 fxor %f38, %f54, %f54\n\
87 subcc %o0, 128, %o0\n\
88 fxor %f40, %f56, %f56\n\
89 fxor %f42, %f58, %f58\n\
90 fxor %f44, %f60, %f60\n\
91 fxor %f46, %f62, %f62\n\
92 stda %f48, [%o1 - 64] %asi\n\
94 ldda [%o2] %asi, %f16\n\
96 ldda [%o1 + 64] %asi, %f32\n\
97 fxor %f0, %f16, %f16\n\
98 fxor %f2, %f18, %f18\n\
99 fxor %f4, %f20, %f20\n\
100 fxor %f6, %f22, %f22\n\
101 fxor %f8, %f24, %f24\n\
102 fxor %f10, %f26, %f26\n\
103 fxor %f12, %f28, %f28\n\
104 fxor %f14, %f30, %f30\n\
105 stda %f16, [%o1] %asi\n\
106 ldda [%o2 + 64] %asi, %f48\n\
108 fxor %f32, %f48, %f48\n\
109 fxor %f34, %f50, %f50\n\
110 fxor %f36, %f52, %f52\n\
111 fxor %f38, %f54, %f54\n\
112 fxor %f40, %f56, %f56\n\
113 fxor %f42, %f58, %f58\n\
114 fxor %f44, %f60, %f60\n\
115 fxor %f46, %f62, %f62\n\
116 stda %f48, [%o1 + 64] %asi\n\
117 membar #Sync|#StoreStore|#StoreLoad\n\
121 .size xor_vis_2, .-xor_vis_2\n\
125 .type xor_vis_3,@function\n\
128 andcc %o5, FPRS_FEF|FPRS_DU, %g0\n\
130 sethi %hi(VISenter), %g1\n\
131 jmpl %g1 + %lo(VISenter), %g7\n\
133 0: wr %g0, FPRS_FEF, %fprs\n\
135 wr %g0, ASI_BLK_P, %asi\n\
136 membar #LoadStore|#StoreLoad|#StoreStore\n\
138 ldda [%o1] %asi, %f0\n\
139 ldda [%o2] %asi, %f16\n\
141 3: ldda [%o3] %asi, %f32\n\
142 fxor %f0, %f16, %f48\n\
143 fxor %f2, %f18, %f50\n\
145 fxor %f4, %f20, %f52\n\
146 fxor %f6, %f22, %f54\n\
148 fxor %f8, %f24, %f56\n\
149 fxor %f10, %f26, %f58\n\
150 fxor %f12, %f28, %f60\n\
151 fxor %f14, %f30, %f62\n\
152 ldda [%o1] %asi, %f0\n\
153 fxor %f48, %f32, %f48\n\
154 fxor %f50, %f34, %f50\n\
155 fxor %f52, %f36, %f52\n\
156 fxor %f54, %f38, %f54\n\
158 fxor %f56, %f40, %f56\n\
159 fxor %f58, %f42, %f58\n\
160 subcc %o0, 64, %o0\n\
161 fxor %f60, %f44, %f60\n\
162 fxor %f62, %f46, %f62\n\
163 stda %f48, [%o1 - 64] %asi\n\
165 ldda [%o2] %asi, %f16\n\
167 ldda [%o3] %asi, %f32\n\
168 fxor %f0, %f16, %f48\n\
169 fxor %f2, %f18, %f50\n\
170 fxor %f4, %f20, %f52\n\
171 fxor %f6, %f22, %f54\n\
172 fxor %f8, %f24, %f56\n\
173 fxor %f10, %f26, %f58\n\
174 fxor %f12, %f28, %f60\n\
175 fxor %f14, %f30, %f62\n\
177 fxor %f48, %f32, %f48\n\
178 fxor %f50, %f34, %f50\n\
179 fxor %f52, %f36, %f52\n\
180 fxor %f54, %f38, %f54\n\
181 fxor %f56, %f40, %f56\n\
182 fxor %f58, %f42, %f58\n\
183 fxor %f60, %f44, %f60\n\
184 fxor %f62, %f46, %f62\n\
185 stda %f48, [%o1] %asi\n\
186 membar #Sync|#StoreStore|#StoreLoad\n\
190 .size xor_vis_3, .-xor_vis_3\n\
194 .type xor_vis_4,@function\n\
197 andcc %o5, FPRS_FEF|FPRS_DU, %g0\n\
199 sethi %hi(VISenter), %g1\n\
200 jmpl %g1 + %lo(VISenter), %g7\n\
202 0: wr %g0, FPRS_FEF, %fprs\n\
204 wr %g0, ASI_BLK_P, %asi\n\
205 membar #LoadStore|#StoreLoad|#StoreStore\n\
207 ldda [%o1] %asi, %f0\n\
208 ldda [%o2] %asi, %f16\n\
210 4: ldda [%o3] %asi, %f32\n\
211 fxor %f0, %f16, %f16\n\
212 fxor %f2, %f18, %f18\n\
214 fxor %f4, %f20, %f20\n\
215 fxor %f6, %f22, %f22\n\
217 fxor %f8, %f24, %f24\n\
218 fxor %f10, %f26, %f26\n\
219 fxor %f12, %f28, %f28\n\
220 fxor %f14, %f30, %f30\n\
221 ldda [%o4] %asi, %f48\n\
222 fxor %f16, %f32, %f32\n\
223 fxor %f18, %f34, %f34\n\
224 fxor %f20, %f36, %f36\n\
225 fxor %f22, %f38, %f38\n\
227 fxor %f24, %f40, %f40\n\
228 fxor %f26, %f42, %f42\n\
229 fxor %f28, %f44, %f44\n\
230 fxor %f30, %f46, %f46\n\
231 ldda [%o1] %asi, %f0\n\
232 fxor %f32, %f48, %f48\n\
233 fxor %f34, %f50, %f50\n\
234 fxor %f36, %f52, %f52\n\
236 fxor %f38, %f54, %f54\n\
237 fxor %f40, %f56, %f56\n\
238 fxor %f42, %f58, %f58\n\
239 subcc %o0, 64, %o0\n\
240 fxor %f44, %f60, %f60\n\
241 fxor %f46, %f62, %f62\n\
242 stda %f48, [%o1 - 64] %asi\n\
244 ldda [%o2] %asi, %f16\n\
246 ldda [%o3] %asi, %f32\n\
247 fxor %f0, %f16, %f16\n\
248 fxor %f2, %f18, %f18\n\
249 fxor %f4, %f20, %f20\n\
250 fxor %f6, %f22, %f22\n\
251 fxor %f8, %f24, %f24\n\
252 fxor %f10, %f26, %f26\n\
253 fxor %f12, %f28, %f28\n\
254 fxor %f14, %f30, %f30\n\
255 ldda [%o4] %asi, %f48\n\
256 fxor %f16, %f32, %f32\n\
257 fxor %f18, %f34, %f34\n\
258 fxor %f20, %f36, %f36\n\
259 fxor %f22, %f38, %f38\n\
260 fxor %f24, %f40, %f40\n\
261 fxor %f26, %f42, %f42\n\
262 fxor %f28, %f44, %f44\n\
263 fxor %f30, %f46, %f46\n\
265 fxor %f32, %f48, %f48\n\
266 fxor %f34, %f50, %f50\n\
267 fxor %f36, %f52, %f52\n\
268 fxor %f38, %f54, %f54\n\
269 fxor %f40, %f56, %f56\n\
270 fxor %f42, %f58, %f58\n\
271 fxor %f44, %f60, %f60\n\
272 fxor %f46, %f62, %f62\n\
273 stda %f48, [%o1] %asi\n\
274 membar #Sync|#StoreStore|#StoreLoad\n\
278 .size xor_vis_4, .-xor_vis_4\n\
282 .type xor_vis_5,@function\n\
286 andcc %o5, FPRS_FEF|FPRS_DU, %g0\n\
288 sethi %hi(VISenter), %g1\n\
289 jmpl %g1 + %lo(VISenter), %g7\n\
291 0: wr %g0, FPRS_FEF, %fprs\n\
294 wr %g0, ASI_BLK_P, %asi\n\
295 membar #LoadStore|#StoreLoad|#StoreStore\n\
297 ldda [%o1] %asi, %f0\n\
298 ldda [%o2] %asi, %f16\n\
300 5: ldda [%o3] %asi, %f32\n\
301 fxor %f0, %f16, %f48\n\
302 fxor %f2, %f18, %f50\n\
304 fxor %f4, %f20, %f52\n\
305 fxor %f6, %f22, %f54\n\
307 fxor %f8, %f24, %f56\n\
308 fxor %f10, %f26, %f58\n\
309 fxor %f12, %f28, %f60\n\
310 fxor %f14, %f30, %f62\n\
311 ldda [%o4] %asi, %f16\n\
312 fxor %f48, %f32, %f48\n\
313 fxor %f50, %f34, %f50\n\
314 fxor %f52, %f36, %f52\n\
315 fxor %f54, %f38, %f54\n\
317 fxor %f56, %f40, %f56\n\
318 fxor %f58, %f42, %f58\n\
319 fxor %f60, %f44, %f60\n\
320 fxor %f62, %f46, %f62\n\
321 ldda [%o5] %asi, %f32\n\
322 fxor %f48, %f16, %f48\n\
323 fxor %f50, %f18, %f50\n\
325 fxor %f52, %f20, %f52\n\
326 fxor %f54, %f22, %f54\n\
328 fxor %f56, %f24, %f56\n\
329 fxor %f58, %f26, %f58\n\
330 fxor %f60, %f28, %f60\n\
331 fxor %f62, %f30, %f62\n\
332 ldda [%o1] %asi, %f0\n\
333 fxor %f48, %f32, %f48\n\
334 fxor %f50, %f34, %f50\n\
335 fxor %f52, %f36, %f52\n\
336 fxor %f54, %f38, %f54\n\
337 fxor %f56, %f40, %f56\n\
338 fxor %f58, %f42, %f58\n\
339 subcc %o0, 64, %o0\n\
340 fxor %f60, %f44, %f60\n\
341 fxor %f62, %f46, %f62\n\
342 stda %f48, [%o1 - 64] %asi\n\
344 ldda [%o2] %asi, %f16\n\
346 ldda [%o3] %asi, %f32\n\
347 fxor %f0, %f16, %f48\n\
348 fxor %f2, %f18, %f50\n\
349 fxor %f4, %f20, %f52\n\
350 fxor %f6, %f22, %f54\n\
351 fxor %f8, %f24, %f56\n\
352 fxor %f10, %f26, %f58\n\
353 fxor %f12, %f28, %f60\n\
354 fxor %f14, %f30, %f62\n\
355 ldda [%o4] %asi, %f16\n\
356 fxor %f48, %f32, %f48\n\
357 fxor %f50, %f34, %f50\n\
358 fxor %f52, %f36, %f52\n\
359 fxor %f54, %f38, %f54\n\
360 fxor %f56, %f40, %f56\n\
361 fxor %f58, %f42, %f58\n\
362 fxor %f60, %f44, %f60\n\
363 fxor %f62, %f46, %f62\n\
364 ldda [%o5] %asi, %f32\n\
365 fxor %f48, %f16, %f48\n\
366 fxor %f50, %f18, %f50\n\
367 fxor %f52, %f20, %f52\n\
368 fxor %f54, %f22, %f54\n\
369 fxor %f56, %f24, %f56\n\
370 fxor %f58, %f26, %f58\n\
371 fxor %f60, %f28, %f60\n\
372 fxor %f62, %f30, %f62\n\
374 fxor %f48, %f32, %f48\n\
375 fxor %f50, %f34, %f50\n\
376 fxor %f52, %f36, %f52\n\
377 fxor %f54, %f38, %f54\n\
378 fxor %f56, %f40, %f56\n\
379 fxor %f58, %f42, %f58\n\
380 fxor %f60, %f44, %f60\n\
381 fxor %f62, %f46, %f62\n\
382 stda %f48, [%o1] %asi\n\
383 membar #Sync|#StoreStore|#StoreLoad\n\
387 .size xor_vis_5, .-xor_vis_5\n\
390 static struct xor_block_template xor_block_VIS = {
398 #define XOR_TRY_TEMPLATES xor_speed(&xor_block_VIS)