ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / arch / sparc64 / lib / xor.S
1 /*
2  * arch/sparc64/lib/xor.S
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
10 #include <asm/visasm.h>
11 #include <asm/asi.h>
12 #include <asm/dcu.h>
13 #include <asm/spitfire.h>
14
15 /*
16  *      Requirements:
17  *      !(((long)dest | (long)sourceN) & (64 - 1)) &&
18  *      !(len & 127) && len >= 256
19  */
20         .text
21         .globl xor_vis_2
22         .type xor_vis_2,@function
23 xor_vis_2:
24         rd      %fprs, %o5
25         andcc   %o5, FPRS_FEF|FPRS_DU, %g0
26         be,pt   %icc, 0f
27          sethi  %hi(VISenter), %g1
28         jmpl    %g1 + %lo(VISenter), %g7
29          add    %g7, 8, %g7
30 0:      wr      %g0, FPRS_FEF, %fprs
31         rd      %asi, %g1
32         wr      %g0, ASI_BLK_P, %asi
33         membar  #LoadStore|#StoreLoad|#StoreStore
34         sub     %o0, 128, %o0
35         ldda    [%o1] %asi, %f0
36         ldda    [%o2] %asi, %f16
37
38 2:      ldda    [%o1 + 64] %asi, %f32
39         fxor    %f0, %f16, %f16
40         fxor    %f2, %f18, %f18
41         fxor    %f4, %f20, %f20
42         fxor    %f6, %f22, %f22
43         fxor    %f8, %f24, %f24
44         fxor    %f10, %f26, %f26
45         fxor    %f12, %f28, %f28
46         fxor    %f14, %f30, %f30
47         stda    %f16, [%o1] %asi
48         ldda    [%o2 + 64] %asi, %f48
49         ldda    [%o1 + 128] %asi, %f0
50         fxor    %f32, %f48, %f48
51         fxor    %f34, %f50, %f50
52         add     %o1, 128, %o1
53         fxor    %f36, %f52, %f52
54         add     %o2, 128, %o2
55         fxor    %f38, %f54, %f54
56         subcc   %o0, 128, %o0
57         fxor    %f40, %f56, %f56
58         fxor    %f42, %f58, %f58
59         fxor    %f44, %f60, %f60
60         fxor    %f46, %f62, %f62
61         stda    %f48, [%o1 - 64] %asi
62         bne,pt  %xcc, 2b
63          ldda   [%o2] %asi, %f16
64
65         ldda    [%o1 + 64] %asi, %f32
66         fxor    %f0, %f16, %f16
67         fxor    %f2, %f18, %f18
68         fxor    %f4, %f20, %f20
69         fxor    %f6, %f22, %f22
70         fxor    %f8, %f24, %f24
71         fxor    %f10, %f26, %f26
72         fxor    %f12, %f28, %f28
73         fxor    %f14, %f30, %f30
74         stda    %f16, [%o1] %asi
75         ldda    [%o2 + 64] %asi, %f48
76         membar  #Sync
77         fxor    %f32, %f48, %f48
78         fxor    %f34, %f50, %f50
79         fxor    %f36, %f52, %f52
80         fxor    %f38, %f54, %f54
81         fxor    %f40, %f56, %f56
82         fxor    %f42, %f58, %f58
83         fxor    %f44, %f60, %f60
84         fxor    %f46, %f62, %f62
85         stda    %f48, [%o1 + 64] %asi
86         membar  #Sync|#StoreStore|#StoreLoad
87         wr      %g1, %g0, %asi
88         retl
89           wr    %g0, 0, %fprs
90         .size xor_vis_2, .-xor_vis_2
91
92
93         .globl xor_vis_3
94         .type xor_vis_3,@function
95 xor_vis_3:
96         rd      %fprs, %o5
97         andcc   %o5, FPRS_FEF|FPRS_DU, %g0
98         be,pt   %icc, 0f
99          sethi  %hi(VISenter), %g1
100         jmpl    %g1 + %lo(VISenter), %g7
101          add    %g7, 8, %g7
102 0:      wr      %g0, FPRS_FEF, %fprs
103         rd      %asi, %g1
104         wr      %g0, ASI_BLK_P, %asi
105         membar  #LoadStore|#StoreLoad|#StoreStore
106         sub     %o0, 64, %o0
107         ldda    [%o1] %asi, %f0
108         ldda    [%o2] %asi, %f16
109
110 3:      ldda    [%o3] %asi, %f32
111         fxor    %f0, %f16, %f48
112         fxor    %f2, %f18, %f50
113         add     %o1, 64, %o1
114         fxor    %f4, %f20, %f52
115         fxor    %f6, %f22, %f54
116         add     %o2, 64, %o2
117         fxor    %f8, %f24, %f56
118         fxor    %f10, %f26, %f58
119         fxor    %f12, %f28, %f60
120         fxor    %f14, %f30, %f62
121         ldda    [%o1] %asi, %f0
122         fxor    %f48, %f32, %f48
123         fxor    %f50, %f34, %f50
124         fxor    %f52, %f36, %f52
125         fxor    %f54, %f38, %f54
126         add     %o3, 64, %o3
127         fxor    %f56, %f40, %f56
128         fxor    %f58, %f42, %f58
129         subcc   %o0, 64, %o0
130         fxor    %f60, %f44, %f60
131         fxor    %f62, %f46, %f62
132         stda    %f48, [%o1 - 64] %asi
133         bne,pt  %xcc, 3b
134          ldda   [%o2] %asi, %f16
135
136         ldda    [%o3] %asi, %f32
137         fxor    %f0, %f16, %f48
138         fxor    %f2, %f18, %f50
139         fxor    %f4, %f20, %f52
140         fxor    %f6, %f22, %f54
141         fxor    %f8, %f24, %f56
142         fxor    %f10, %f26, %f58
143         fxor    %f12, %f28, %f60
144         fxor    %f14, %f30, %f62
145         membar  #Sync
146         fxor    %f48, %f32, %f48
147         fxor    %f50, %f34, %f50
148         fxor    %f52, %f36, %f52
149         fxor    %f54, %f38, %f54
150         fxor    %f56, %f40, %f56
151         fxor    %f58, %f42, %f58
152         fxor    %f60, %f44, %f60
153         fxor    %f62, %f46, %f62
154         stda    %f48, [%o1] %asi
155         membar  #Sync|#StoreStore|#StoreLoad
156         wr      %g1, %g0, %asi
157         retl
158          wr     %g0, 0, %fprs
159         .size xor_vis_3, .-xor_vis_3
160
161
162         .globl xor_vis_4
163         .type xor_vis_4,@function
164 xor_vis_4:
165         rd      %fprs, %o5
166         andcc   %o5, FPRS_FEF|FPRS_DU, %g0
167         be,pt   %icc, 0f
168          sethi  %hi(VISenter), %g1
169         jmpl    %g1 + %lo(VISenter), %g7
170          add    %g7, 8, %g7
171 0:      wr      %g0, FPRS_FEF, %fprs
172         rd      %asi, %g1
173         wr      %g0, ASI_BLK_P, %asi
174         membar  #LoadStore|#StoreLoad|#StoreStore
175         sub     %o0, 64, %o0
176         ldda    [%o1] %asi, %f0
177         ldda    [%o2] %asi, %f16
178
179 4:      ldda    [%o3] %asi, %f32
180         fxor    %f0, %f16, %f16
181         fxor    %f2, %f18, %f18
182         add     %o1, 64, %o1
183         fxor    %f4, %f20, %f20
184         fxor    %f6, %f22, %f22
185         add     %o2, 64, %o2
186         fxor    %f8, %f24, %f24
187         fxor    %f10, %f26, %f26
188         fxor    %f12, %f28, %f28
189         fxor    %f14, %f30, %f30
190         ldda    [%o4] %asi, %f48
191         fxor    %f16, %f32, %f32
192         fxor    %f18, %f34, %f34
193         fxor    %f20, %f36, %f36
194         fxor    %f22, %f38, %f38
195         add     %o3, 64, %o3
196         fxor    %f24, %f40, %f40
197         fxor    %f26, %f42, %f42
198         fxor    %f28, %f44, %f44
199         fxor    %f30, %f46, %f46
200         ldda    [%o1] %asi, %f0
201         fxor    %f32, %f48, %f48
202         fxor    %f34, %f50, %f50
203         fxor    %f36, %f52, %f52
204         add     %o4, 64, %o4
205         fxor    %f38, %f54, %f54
206         fxor    %f40, %f56, %f56
207         fxor    %f42, %f58, %f58
208         subcc   %o0, 64, %o0
209         fxor    %f44, %f60, %f60
210         fxor    %f46, %f62, %f62
211         stda    %f48, [%o1 - 64] %asi
212         bne,pt  %xcc, 4b
213          ldda   [%o2] %asi, %f16
214
215         ldda    [%o3] %asi, %f32
216         fxor    %f0, %f16, %f16
217         fxor    %f2, %f18, %f18
218         fxor    %f4, %f20, %f20
219         fxor    %f6, %f22, %f22
220         fxor    %f8, %f24, %f24
221         fxor    %f10, %f26, %f26
222         fxor    %f12, %f28, %f28
223         fxor    %f14, %f30, %f30
224         ldda    [%o4] %asi, %f48
225         fxor    %f16, %f32, %f32
226         fxor    %f18, %f34, %f34
227         fxor    %f20, %f36, %f36
228         fxor    %f22, %f38, %f38
229         fxor    %f24, %f40, %f40
230         fxor    %f26, %f42, %f42
231         fxor    %f28, %f44, %f44
232         fxor    %f30, %f46, %f46
233         membar  #Sync
234         fxor    %f32, %f48, %f48
235         fxor    %f34, %f50, %f50
236         fxor    %f36, %f52, %f52
237         fxor    %f38, %f54, %f54
238         fxor    %f40, %f56, %f56
239         fxor    %f42, %f58, %f58
240         fxor    %f44, %f60, %f60
241         fxor    %f46, %f62, %f62
242         stda    %f48, [%o1] %asi
243         membar  #Sync|#StoreStore|#StoreLoad
244         wr      %g1, %g0, %asi
245         retl
246          wr     %g0, 0, %fprs
247         .size xor_vis_4, .-xor_vis_4
248
249
250         .globl xor_vis_5
251         .type xor_vis_5,@function
252 xor_vis_5:
253         mov     %o5, %g5
254         rd      %fprs, %o5
255         andcc   %o5, FPRS_FEF|FPRS_DU, %g0
256         be,pt   %icc, 0f
257          sethi  %hi(VISenter), %g1
258         jmpl    %g1 + %lo(VISenter), %g7
259          add    %g7, 8, %g7
260 0:      wr      %g0, FPRS_FEF, %fprs
261         mov     %g5, %o5
262         rd      %asi, %g1
263         wr      %g0, ASI_BLK_P, %asi
264         membar  #LoadStore|#StoreLoad|#StoreStore
265         sub     %o0, 64, %o0
266         ldda    [%o1] %asi, %f0
267         ldda    [%o2] %asi, %f16
268
269 5:      ldda    [%o3] %asi, %f32
270         fxor    %f0, %f16, %f48
271         fxor    %f2, %f18, %f50
272         add     %o1, 64, %o1
273         fxor    %f4, %f20, %f52
274         fxor    %f6, %f22, %f54
275         add     %o2, 64, %o2
276         fxor    %f8, %f24, %f56
277         fxor    %f10, %f26, %f58
278         fxor    %f12, %f28, %f60
279         fxor    %f14, %f30, %f62
280         ldda    [%o4] %asi, %f16
281         fxor    %f48, %f32, %f48
282         fxor    %f50, %f34, %f50
283         fxor    %f52, %f36, %f52
284         fxor    %f54, %f38, %f54
285         add     %o3, 64, %o3
286         fxor    %f56, %f40, %f56
287         fxor    %f58, %f42, %f58
288         fxor    %f60, %f44, %f60
289         fxor    %f62, %f46, %f62
290         ldda    [%o5] %asi, %f32
291         fxor    %f48, %f16, %f48
292         fxor    %f50, %f18, %f50
293         add     %o4, 64, %o4
294         fxor    %f52, %f20, %f52
295         fxor    %f54, %f22, %f54
296         add     %o5, 64, %o5
297         fxor    %f56, %f24, %f56
298         fxor    %f58, %f26, %f58
299         fxor    %f60, %f28, %f60
300         fxor    %f62, %f30, %f62
301         ldda    [%o1] %asi, %f0
302         fxor    %f48, %f32, %f48
303         fxor    %f50, %f34, %f50
304         fxor    %f52, %f36, %f52
305         fxor    %f54, %f38, %f54
306         fxor    %f56, %f40, %f56
307         fxor    %f58, %f42, %f58
308         subcc   %o0, 64, %o0
309         fxor    %f60, %f44, %f60
310         fxor    %f62, %f46, %f62
311         stda    %f48, [%o1 - 64] %asi
312         bne,pt  %xcc, 5b
313          ldda   [%o2] %asi, %f16
314
315         ldda    [%o3] %asi, %f32
316         fxor    %f0, %f16, %f48
317         fxor    %f2, %f18, %f50
318         fxor    %f4, %f20, %f52
319         fxor    %f6, %f22, %f54
320         fxor    %f8, %f24, %f56
321         fxor    %f10, %f26, %f58
322         fxor    %f12, %f28, %f60
323         fxor    %f14, %f30, %f62
324         ldda    [%o4] %asi, %f16
325         fxor    %f48, %f32, %f48
326         fxor    %f50, %f34, %f50
327         fxor    %f52, %f36, %f52
328         fxor    %f54, %f38, %f54
329         fxor    %f56, %f40, %f56
330         fxor    %f58, %f42, %f58
331         fxor    %f60, %f44, %f60
332         fxor    %f62, %f46, %f62
333         ldda    [%o5] %asi, %f32
334         fxor    %f48, %f16, %f48
335         fxor    %f50, %f18, %f50
336         fxor    %f52, %f20, %f52
337         fxor    %f54, %f22, %f54
338         fxor    %f56, %f24, %f56
339         fxor    %f58, %f26, %f58
340         fxor    %f60, %f28, %f60
341         fxor    %f62, %f30, %f62
342         membar  #Sync
343         fxor    %f48, %f32, %f48
344         fxor    %f50, %f34, %f50
345         fxor    %f52, %f36, %f52
346         fxor    %f54, %f38, %f54
347         fxor    %f56, %f40, %f56
348         fxor    %f58, %f42, %f58
349         fxor    %f60, %f44, %f60
350         fxor    %f62, %f46, %f62
351         stda    %f48, [%o1] %asi
352         membar  #Sync|#StoreStore|#StoreLoad
353         wr      %g1, %g0, %asi
354         retl
355          wr     %g0, 0, %fprs
356         .size xor_vis_5, .-xor_vis_5