clean
[linux-2.4.21-pre4.git] / include / asm-sparc64 / xor.h
1 /*
2  * include/asm-sparc64/xor.h
3  *
4  * High speed xor_block operation for RAID4/5 utilizing the
5  * UltraSparc Visual Instruction Set.
6  *
7  * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
8  *
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)
12  * any later version.
13  *
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.
17  */
18
19 /*
20  *      Requirements:
21  *      !(((long)dest | (long)sourceN) & (64 - 1)) &&
22  *      !(len & 127) && len >= 256
23  *
24  * It is done in pure assembly, as otherwise gcc makes it a non-leaf
25  * function, which is not what we want.
26  */
27
28 #include <asm/pstate.h>
29 #include <asm/asi.h>
30
31 extern void xor_vis_2(unsigned long, unsigned long *, unsigned long *);
32 extern void xor_vis_3(unsigned long, unsigned long *, unsigned long *,
33                       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 *);
38
39 #define _S(x) __S(x)
40 #define __S(x) #x
41 #define DEF(x) __asm__(#x " = " _S(x))
42
43 DEF(FPRS_FEF);
44 DEF(FPRS_DU);
45 DEF(ASI_BLK_P);
46
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.  */
49
50 __asm__ ("\n\
51         .text\n\
52         .globl xor_vis_2\n\
53         .type xor_vis_2,@function\n\
54 xor_vis_2:\n\
55         rd      %fprs, %o5\n\
56         andcc   %o5, FPRS_FEF|FPRS_DU, %g0\n\
57         be,pt   %icc, 0f\n\
58          sethi  %hi(VISenter), %g1\n\
59         jmpl    %g1 + %lo(VISenter), %g7\n\
60          add    %g7, 8, %g7\n\
61 0:      wr      %g0, FPRS_FEF, %fprs\n\
62         rd      %asi, %g1\n\
63         wr      %g0, ASI_BLK_P, %asi\n\
64         membar  #LoadStore|#StoreLoad|#StoreStore\n\
65         sub     %o0, 128, %o0\n\
66         ldda    [%o1] %asi, %f0\n\
67         ldda    [%o2] %asi, %f16\n\
68 \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\
83         add     %o1, 128, %o1\n\
84         fxor    %f36, %f52, %f52\n\
85         add     %o2, 128, %o2\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\
93         bne,pt  %xcc, 2b\n\
94          ldda   [%o2] %asi, %f16\n\
95 \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\
107         membar  #Sync\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\
118         wr      %g1, %g0, %asi\n\
119         retl\n\
120           wr    %g0, 0, %fprs\n\
121         .size xor_vis_2, .-xor_vis_2\n\
122 \n\
123 \n\
124         .globl xor_vis_3\n\
125         .type xor_vis_3,@function\n\
126 xor_vis_3:\n\
127         rd      %fprs, %o5\n\
128         andcc   %o5, FPRS_FEF|FPRS_DU, %g0\n\
129         be,pt   %icc, 0f\n\
130          sethi  %hi(VISenter), %g1\n\
131         jmpl    %g1 + %lo(VISenter), %g7\n\
132          add    %g7, 8, %g7\n\
133 0:      wr      %g0, FPRS_FEF, %fprs\n\
134         rd      %asi, %g1\n\
135         wr      %g0, ASI_BLK_P, %asi\n\
136         membar  #LoadStore|#StoreLoad|#StoreStore\n\
137         sub     %o0, 64, %o0\n\
138         ldda    [%o1] %asi, %f0\n\
139         ldda    [%o2] %asi, %f16\n\
140 \n\
141 3:      ldda    [%o3] %asi, %f32\n\
142         fxor    %f0, %f16, %f48\n\
143         fxor    %f2, %f18, %f50\n\
144         add     %o1, 64, %o1\n\
145         fxor    %f4, %f20, %f52\n\
146         fxor    %f6, %f22, %f54\n\
147         add     %o2, 64, %o2\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\
157         add     %o3, 64, %o3\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\
164         bne,pt  %xcc, 3b\n\
165          ldda   [%o2] %asi, %f16\n\
166 \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\
176         membar  #Sync\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\
187         wr      %g1, %g0, %asi\n\
188         retl\n\
189          wr     %g0, 0, %fprs\n\
190         .size xor_vis_3, .-xor_vis_3\n\
191 \n\
192 \n\
193         .globl xor_vis_4\n\
194         .type xor_vis_4,@function\n\
195 xor_vis_4:\n\
196         rd      %fprs, %o5\n\
197         andcc   %o5, FPRS_FEF|FPRS_DU, %g0\n\
198         be,pt   %icc, 0f\n\
199          sethi  %hi(VISenter), %g1\n\
200         jmpl    %g1 + %lo(VISenter), %g7\n\
201          add    %g7, 8, %g7\n\
202 0:      wr      %g0, FPRS_FEF, %fprs\n\
203         rd      %asi, %g1\n\
204         wr      %g0, ASI_BLK_P, %asi\n\
205         membar  #LoadStore|#StoreLoad|#StoreStore\n\
206         sub     %o0, 64, %o0\n\
207         ldda    [%o1] %asi, %f0\n\
208         ldda    [%o2] %asi, %f16\n\
209 \n\
210 4:      ldda    [%o3] %asi, %f32\n\
211         fxor    %f0, %f16, %f16\n\
212         fxor    %f2, %f18, %f18\n\
213         add     %o1, 64, %o1\n\
214         fxor    %f4, %f20, %f20\n\
215         fxor    %f6, %f22, %f22\n\
216         add     %o2, 64, %o2\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\
226         add     %o3, 64, %o3\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\
235         add     %o4, 64, %o4\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\
243         bne,pt  %xcc, 4b\n\
244          ldda   [%o2] %asi, %f16\n\
245 \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\
264         membar  #Sync\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\
275         wr      %g1, %g0, %asi\n\
276         retl\n\
277          wr     %g0, 0, %fprs\n\
278         .size xor_vis_4, .-xor_vis_4\n\
279 \n\
280 \n\
281         .globl xor_vis_5\n\
282         .type xor_vis_5,@function\n\
283 xor_vis_5:\n\
284         mov     %o5, %g5\n\
285         rd      %fprs, %o5\n\
286         andcc   %o5, FPRS_FEF|FPRS_DU, %g0\n\
287         be,pt   %icc, 0f\n\
288          sethi  %hi(VISenter), %g1\n\
289         jmpl    %g1 + %lo(VISenter), %g7\n\
290          add    %g7, 8, %g7\n\
291 0:      wr      %g0, FPRS_FEF, %fprs\n\
292         mov     %g5, %o5\n\
293         rd      %asi, %g1\n\
294         wr      %g0, ASI_BLK_P, %asi\n\
295         membar  #LoadStore|#StoreLoad|#StoreStore\n\
296         sub     %o0, 64, %o0\n\
297         ldda    [%o1] %asi, %f0\n\
298         ldda    [%o2] %asi, %f16\n\
299 \n\
300 5:      ldda    [%o3] %asi, %f32\n\
301         fxor    %f0, %f16, %f48\n\
302         fxor    %f2, %f18, %f50\n\
303         add     %o1, 64, %o1\n\
304         fxor    %f4, %f20, %f52\n\
305         fxor    %f6, %f22, %f54\n\
306         add     %o2, 64, %o2\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\
316         add     %o3, 64, %o3\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\
324         add     %o4, 64, %o4\n\
325         fxor    %f52, %f20, %f52\n\
326         fxor    %f54, %f22, %f54\n\
327         add     %o5, 64, %o5\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\
343         bne,pt  %xcc, 5b\n\
344          ldda   [%o2] %asi, %f16\n\
345 \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\
373         membar  #Sync\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\
384         wr      %g1, %g0, %asi\n\
385         retl\n\
386          wr     %g0, 0, %fprs\n\
387         .size xor_vis_5, .-xor_vis_5\n\
388 ");
389
390 static struct xor_block_template xor_block_VIS = {
391         name: "VIS",
392         do_2: xor_vis_2,
393         do_3: xor_vis_3,
394         do_4: xor_vis_4,
395         do_5: xor_vis_5,
396 };
397
398 #define XOR_TRY_TEMPLATES       xor_speed(&xor_block_VIS)