WIP FPC-III support
[linux/fpc-iii.git] / arch / sparc / lib / xor.S
blobf6af7c7ee6fc16a6ad7640e1be0986c086b62363
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * arch/sparc64/lib/xor.S
4  *
5  * High speed xor_block operation for RAID4/5 utilizing the
6  * UltraSparc Visual Instruction Set and Niagara store-init/twin-load.
7  *
8  * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
9  * Copyright (C) 2006 David S. Miller <davem@davemloft.net>
10  */
12 #include <linux/linkage.h>
13 #include <asm/visasm.h>
14 #include <asm/asi.h>
15 #include <asm/dcu.h>
16 #include <asm/spitfire.h>
17 #include <asm/export.h>
20  *      Requirements:
21  *      !(((long)dest | (long)sourceN) & (64 - 1)) &&
22  *      !(len & 127) && len >= 256
23  */
24         .text
26         /* VIS versions. */
27 ENTRY(xor_vis_2)
28         rd      %fprs, %o5
29         andcc   %o5, FPRS_FEF|FPRS_DU, %g0
30         be,pt   %icc, 0f
31          sethi  %hi(VISenter), %g1
32         jmpl    %g1 + %lo(VISenter), %g7
33          add    %g7, 8, %g7
34 0:      wr      %g0, FPRS_FEF, %fprs
35         rd      %asi, %g1
36         wr      %g0, ASI_BLK_P, %asi
37         membar  #LoadStore|#StoreLoad|#StoreStore
38         sub     %o0, 128, %o0
39         ldda    [%o1] %asi, %f0
40         ldda    [%o2] %asi, %f16
42 2:      ldda    [%o1 + 64] %asi, %f32
43         fxor    %f0, %f16, %f16
44         fxor    %f2, %f18, %f18
45         fxor    %f4, %f20, %f20
46         fxor    %f6, %f22, %f22
47         fxor    %f8, %f24, %f24
48         fxor    %f10, %f26, %f26
49         fxor    %f12, %f28, %f28
50         fxor    %f14, %f30, %f30
51         stda    %f16, [%o1] %asi
52         ldda    [%o2 + 64] %asi, %f48
53         ldda    [%o1 + 128] %asi, %f0
54         fxor    %f32, %f48, %f48
55         fxor    %f34, %f50, %f50
56         add     %o1, 128, %o1
57         fxor    %f36, %f52, %f52
58         add     %o2, 128, %o2
59         fxor    %f38, %f54, %f54
60         subcc   %o0, 128, %o0
61         fxor    %f40, %f56, %f56
62         fxor    %f42, %f58, %f58
63         fxor    %f44, %f60, %f60
64         fxor    %f46, %f62, %f62
65         stda    %f48, [%o1 - 64] %asi
66         bne,pt  %xcc, 2b
67          ldda   [%o2] %asi, %f16
69         ldda    [%o1 + 64] %asi, %f32
70         fxor    %f0, %f16, %f16
71         fxor    %f2, %f18, %f18
72         fxor    %f4, %f20, %f20
73         fxor    %f6, %f22, %f22
74         fxor    %f8, %f24, %f24
75         fxor    %f10, %f26, %f26
76         fxor    %f12, %f28, %f28
77         fxor    %f14, %f30, %f30
78         stda    %f16, [%o1] %asi
79         ldda    [%o2 + 64] %asi, %f48
80         membar  #Sync
81         fxor    %f32, %f48, %f48
82         fxor    %f34, %f50, %f50
83         fxor    %f36, %f52, %f52
84         fxor    %f38, %f54, %f54
85         fxor    %f40, %f56, %f56
86         fxor    %f42, %f58, %f58
87         fxor    %f44, %f60, %f60
88         fxor    %f46, %f62, %f62
89         stda    %f48, [%o1 + 64] %asi
90         membar  #Sync|#StoreStore|#StoreLoad
91         wr      %g1, %g0, %asi
92         retl
93           wr    %g0, 0, %fprs
94 ENDPROC(xor_vis_2)
95 EXPORT_SYMBOL(xor_vis_2)
97 ENTRY(xor_vis_3)
98         rd      %fprs, %o5
99         andcc   %o5, FPRS_FEF|FPRS_DU, %g0
100         be,pt   %icc, 0f
101          sethi  %hi(VISenter), %g1
102         jmpl    %g1 + %lo(VISenter), %g7
103          add    %g7, 8, %g7
104 0:      wr      %g0, FPRS_FEF, %fprs
105         rd      %asi, %g1
106         wr      %g0, ASI_BLK_P, %asi
107         membar  #LoadStore|#StoreLoad|#StoreStore
108         sub     %o0, 64, %o0
109         ldda    [%o1] %asi, %f0
110         ldda    [%o2] %asi, %f16
112 3:      ldda    [%o3] %asi, %f32
113         fxor    %f0, %f16, %f48
114         fxor    %f2, %f18, %f50
115         add     %o1, 64, %o1
116         fxor    %f4, %f20, %f52
117         fxor    %f6, %f22, %f54
118         add     %o2, 64, %o2
119         fxor    %f8, %f24, %f56
120         fxor    %f10, %f26, %f58
121         fxor    %f12, %f28, %f60
122         fxor    %f14, %f30, %f62
123         ldda    [%o1] %asi, %f0
124         fxor    %f48, %f32, %f48
125         fxor    %f50, %f34, %f50
126         fxor    %f52, %f36, %f52
127         fxor    %f54, %f38, %f54
128         add     %o3, 64, %o3
129         fxor    %f56, %f40, %f56
130         fxor    %f58, %f42, %f58
131         subcc   %o0, 64, %o0
132         fxor    %f60, %f44, %f60
133         fxor    %f62, %f46, %f62
134         stda    %f48, [%o1 - 64] %asi
135         bne,pt  %xcc, 3b
136          ldda   [%o2] %asi, %f16
138         ldda    [%o3] %asi, %f32
139         fxor    %f0, %f16, %f48
140         fxor    %f2, %f18, %f50
141         fxor    %f4, %f20, %f52
142         fxor    %f6, %f22, %f54
143         fxor    %f8, %f24, %f56
144         fxor    %f10, %f26, %f58
145         fxor    %f12, %f28, %f60
146         fxor    %f14, %f30, %f62
147         membar  #Sync
148         fxor    %f48, %f32, %f48
149         fxor    %f50, %f34, %f50
150         fxor    %f52, %f36, %f52
151         fxor    %f54, %f38, %f54
152         fxor    %f56, %f40, %f56
153         fxor    %f58, %f42, %f58
154         fxor    %f60, %f44, %f60
155         fxor    %f62, %f46, %f62
156         stda    %f48, [%o1] %asi
157         membar  #Sync|#StoreStore|#StoreLoad
158         wr      %g1, %g0, %asi
159         retl
160          wr     %g0, 0, %fprs
161 ENDPROC(xor_vis_3)
162 EXPORT_SYMBOL(xor_vis_3)
164 ENTRY(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
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
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 ENDPROC(xor_vis_4)
248 EXPORT_SYMBOL(xor_vis_4)
250 ENTRY(xor_vis_5)
251         save    %sp, -192, %sp
252         rd      %fprs, %o5
253         andcc   %o5, FPRS_FEF|FPRS_DU, %g0
254         be,pt   %icc, 0f
255          sethi  %hi(VISenter), %g1
256         jmpl    %g1 + %lo(VISenter), %g7
257          add    %g7, 8, %g7
258 0:      wr      %g0, FPRS_FEF, %fprs
259         rd      %asi, %g1
260         wr      %g0, ASI_BLK_P, %asi
261         membar  #LoadStore|#StoreLoad|#StoreStore
262         sub     %i0, 64, %i0
263         ldda    [%i1] %asi, %f0
264         ldda    [%i2] %asi, %f16
266 5:      ldda    [%i3] %asi, %f32
267         fxor    %f0, %f16, %f48
268         fxor    %f2, %f18, %f50
269         add     %i1, 64, %i1
270         fxor    %f4, %f20, %f52
271         fxor    %f6, %f22, %f54
272         add     %i2, 64, %i2
273         fxor    %f8, %f24, %f56
274         fxor    %f10, %f26, %f58
275         fxor    %f12, %f28, %f60
276         fxor    %f14, %f30, %f62
277         ldda    [%i4] %asi, %f16
278         fxor    %f48, %f32, %f48
279         fxor    %f50, %f34, %f50
280         fxor    %f52, %f36, %f52
281         fxor    %f54, %f38, %f54
282         add     %i3, 64, %i3
283         fxor    %f56, %f40, %f56
284         fxor    %f58, %f42, %f58
285         fxor    %f60, %f44, %f60
286         fxor    %f62, %f46, %f62
287         ldda    [%i5] %asi, %f32
288         fxor    %f48, %f16, %f48
289         fxor    %f50, %f18, %f50
290         add     %i4, 64, %i4
291         fxor    %f52, %f20, %f52
292         fxor    %f54, %f22, %f54
293         add     %i5, 64, %i5
294         fxor    %f56, %f24, %f56
295         fxor    %f58, %f26, %f58
296         fxor    %f60, %f28, %f60
297         fxor    %f62, %f30, %f62
298         ldda    [%i1] %asi, %f0
299         fxor    %f48, %f32, %f48
300         fxor    %f50, %f34, %f50
301         fxor    %f52, %f36, %f52
302         fxor    %f54, %f38, %f54
303         fxor    %f56, %f40, %f56
304         fxor    %f58, %f42, %f58
305         subcc   %i0, 64, %i0
306         fxor    %f60, %f44, %f60
307         fxor    %f62, %f46, %f62
308         stda    %f48, [%i1 - 64] %asi
309         bne,pt  %xcc, 5b
310          ldda   [%i2] %asi, %f16
312         ldda    [%i3] %asi, %f32
313         fxor    %f0, %f16, %f48
314         fxor    %f2, %f18, %f50
315         fxor    %f4, %f20, %f52
316         fxor    %f6, %f22, %f54
317         fxor    %f8, %f24, %f56
318         fxor    %f10, %f26, %f58
319         fxor    %f12, %f28, %f60
320         fxor    %f14, %f30, %f62
321         ldda    [%i4] %asi, %f16
322         fxor    %f48, %f32, %f48
323         fxor    %f50, %f34, %f50
324         fxor    %f52, %f36, %f52
325         fxor    %f54, %f38, %f54
326         fxor    %f56, %f40, %f56
327         fxor    %f58, %f42, %f58
328         fxor    %f60, %f44, %f60
329         fxor    %f62, %f46, %f62
330         ldda    [%i5] %asi, %f32
331         fxor    %f48, %f16, %f48
332         fxor    %f50, %f18, %f50
333         fxor    %f52, %f20, %f52
334         fxor    %f54, %f22, %f54
335         fxor    %f56, %f24, %f56
336         fxor    %f58, %f26, %f58
337         fxor    %f60, %f28, %f60
338         fxor    %f62, %f30, %f62
339         membar  #Sync
340         fxor    %f48, %f32, %f48
341         fxor    %f50, %f34, %f50
342         fxor    %f52, %f36, %f52
343         fxor    %f54, %f38, %f54
344         fxor    %f56, %f40, %f56
345         fxor    %f58, %f42, %f58
346         fxor    %f60, %f44, %f60
347         fxor    %f62, %f46, %f62
348         stda    %f48, [%i1] %asi
349         membar  #Sync|#StoreStore|#StoreLoad
350         wr      %g1, %g0, %asi
351         wr      %g0, 0, %fprs
352         ret
353          restore
354 ENDPROC(xor_vis_5)
355 EXPORT_SYMBOL(xor_vis_5)
357         /* Niagara versions. */
358 ENTRY(xor_niagara_2) /* %o0=bytes, %o1=dest, %o2=src */
359         save            %sp, -192, %sp
360         prefetch        [%i1], #n_writes
361         prefetch        [%i2], #one_read
362         rd              %asi, %g7
363         wr              %g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
364         srlx            %i0, 6, %g1
365         mov             %i1, %i0
366         mov             %i2, %i1
367 1:      ldda            [%i1 + 0x00] %asi, %i2  /* %i2/%i3 = src  + 0x00 */
368         ldda            [%i1 + 0x10] %asi, %i4  /* %i4/%i5 = src  + 0x10 */
369         ldda            [%i1 + 0x20] %asi, %g2  /* %g2/%g3 = src  + 0x20 */
370         ldda            [%i1 + 0x30] %asi, %l0  /* %l0/%l1 = src  + 0x30 */
371         prefetch        [%i1 + 0x40], #one_read
372         ldda            [%i0 + 0x00] %asi, %o0  /* %o0/%o1 = dest + 0x00 */
373         ldda            [%i0 + 0x10] %asi, %o2  /* %o2/%o3 = dest + 0x10 */
374         ldda            [%i0 + 0x20] %asi, %o4  /* %o4/%o5 = dest + 0x20 */
375         ldda            [%i0 + 0x30] %asi, %l2  /* %l2/%l3 = dest + 0x30 */
376         prefetch        [%i0 + 0x40], #n_writes
377         xor             %o0, %i2, %o0
378         xor             %o1, %i3, %o1
379         stxa            %o0, [%i0 + 0x00] %asi
380         stxa            %o1, [%i0 + 0x08] %asi
381         xor             %o2, %i4, %o2
382         xor             %o3, %i5, %o3
383         stxa            %o2, [%i0 + 0x10] %asi
384         stxa            %o3, [%i0 + 0x18] %asi
385         xor             %o4, %g2, %o4
386         xor             %o5, %g3, %o5
387         stxa            %o4, [%i0 + 0x20] %asi
388         stxa            %o5, [%i0 + 0x28] %asi
389         xor             %l2, %l0, %l2
390         xor             %l3, %l1, %l3
391         stxa            %l2, [%i0 + 0x30] %asi
392         stxa            %l3, [%i0 + 0x38] %asi
393         add             %i0, 0x40, %i0
394         subcc           %g1, 1, %g1
395         bne,pt          %xcc, 1b
396          add            %i1, 0x40, %i1
397         membar          #Sync
398         wr              %g7, 0x0, %asi
399         ret
400          restore
401 ENDPROC(xor_niagara_2)
402 EXPORT_SYMBOL(xor_niagara_2)
404 ENTRY(xor_niagara_3) /* %o0=bytes, %o1=dest, %o2=src1, %o3=src2 */
405         save            %sp, -192, %sp
406         prefetch        [%i1], #n_writes
407         prefetch        [%i2], #one_read
408         prefetch        [%i3], #one_read
409         rd              %asi, %g7
410         wr              %g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
411         srlx            %i0, 6, %g1
412         mov             %i1, %i0
413         mov             %i2, %i1
414         mov             %i3, %l7
415 1:      ldda            [%i1 + 0x00] %asi, %i2  /* %i2/%i3 = src1 + 0x00 */
416         ldda            [%i1 + 0x10] %asi, %i4  /* %i4/%i5 = src1 + 0x10 */
417         ldda            [%l7 + 0x00] %asi, %g2  /* %g2/%g3 = src2 + 0x00 */
418         ldda            [%l7 + 0x10] %asi, %l0  /* %l0/%l1 = src2 + 0x10 */
419         ldda            [%i0 + 0x00] %asi, %o0  /* %o0/%o1 = dest + 0x00 */
420         ldda            [%i0 + 0x10] %asi, %o2  /* %o2/%o3 = dest + 0x10 */
421         xor             %g2, %i2, %g2
422         xor             %g3, %i3, %g3
423         xor             %o0, %g2, %o0
424         xor             %o1, %g3, %o1
425         stxa            %o0, [%i0 + 0x00] %asi
426         stxa            %o1, [%i0 + 0x08] %asi
427         ldda            [%i1 + 0x20] %asi, %i2  /* %i2/%i3 = src1 + 0x20 */
428         ldda            [%l7 + 0x20] %asi, %g2  /* %g2/%g3 = src2 + 0x20 */
429         ldda            [%i0 + 0x20] %asi, %o0  /* %o0/%o1 = dest + 0x20 */
430         xor             %l0, %i4, %l0
431         xor             %l1, %i5, %l1
432         xor             %o2, %l0, %o2
433         xor             %o3, %l1, %o3
434         stxa            %o2, [%i0 + 0x10] %asi
435         stxa            %o3, [%i0 + 0x18] %asi
436         ldda            [%i1 + 0x30] %asi, %i4  /* %i4/%i5 = src1 + 0x30 */
437         ldda            [%l7 + 0x30] %asi, %l0  /* %l0/%l1 = src2 + 0x30 */
438         ldda            [%i0 + 0x30] %asi, %o2  /* %o2/%o3 = dest + 0x30 */
439         prefetch        [%i1 + 0x40], #one_read
440         prefetch        [%l7 + 0x40], #one_read
441         prefetch        [%i0 + 0x40], #n_writes
442         xor             %g2, %i2, %g2
443         xor             %g3, %i3, %g3
444         xor             %o0, %g2, %o0
445         xor             %o1, %g3, %o1
446         stxa            %o0, [%i0 + 0x20] %asi
447         stxa            %o1, [%i0 + 0x28] %asi
448         xor             %l0, %i4, %l0
449         xor             %l1, %i5, %l1
450         xor             %o2, %l0, %o2
451         xor             %o3, %l1, %o3
452         stxa            %o2, [%i0 + 0x30] %asi
453         stxa            %o3, [%i0 + 0x38] %asi
454         add             %i0, 0x40, %i0
455         add             %i1, 0x40, %i1
456         subcc           %g1, 1, %g1
457         bne,pt          %xcc, 1b
458          add            %l7, 0x40, %l7
459         membar          #Sync
460         wr              %g7, 0x0, %asi
461         ret
462          restore
463 ENDPROC(xor_niagara_3)
464 EXPORT_SYMBOL(xor_niagara_3)
466 ENTRY(xor_niagara_4) /* %o0=bytes, %o1=dest, %o2=src1, %o3=src2, %o4=src3 */
467         save            %sp, -192, %sp
468         prefetch        [%i1], #n_writes
469         prefetch        [%i2], #one_read
470         prefetch        [%i3], #one_read
471         prefetch        [%i4], #one_read
472         rd              %asi, %g7
473         wr              %g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
474         srlx            %i0, 6, %g1
475         mov             %i1, %i0
476         mov             %i2, %i1
477         mov             %i3, %l7
478         mov             %i4, %l6
479 1:      ldda            [%i1 + 0x00] %asi, %i2  /* %i2/%i3 = src1 + 0x00 */
480         ldda            [%l7 + 0x00] %asi, %i4  /* %i4/%i5 = src2 + 0x00 */
481         ldda            [%l6 + 0x00] %asi, %g2  /* %g2/%g3 = src3 + 0x00 */
482         ldda            [%i0 + 0x00] %asi, %l0  /* %l0/%l1 = dest + 0x00 */
483         xor             %i4, %i2, %i4
484         xor             %i5, %i3, %i5
485         ldda            [%i1 + 0x10] %asi, %i2  /* %i2/%i3 = src1 + 0x10 */
486         xor             %g2, %i4, %g2
487         xor             %g3, %i5, %g3
488         ldda            [%l7 + 0x10] %asi, %i4  /* %i4/%i5 = src2 + 0x10 */
489         xor             %l0, %g2, %l0
490         xor             %l1, %g3, %l1
491         stxa            %l0, [%i0 + 0x00] %asi
492         stxa            %l1, [%i0 + 0x08] %asi
493         ldda            [%l6 + 0x10] %asi, %g2  /* %g2/%g3 = src3 + 0x10 */
494         ldda            [%i0 + 0x10] %asi, %l0  /* %l0/%l1 = dest + 0x10 */
496         xor             %i4, %i2, %i4
497         xor             %i5, %i3, %i5
498         ldda            [%i1 + 0x20] %asi, %i2  /* %i2/%i3 = src1 + 0x20 */
499         xor             %g2, %i4, %g2
500         xor             %g3, %i5, %g3
501         ldda            [%l7 + 0x20] %asi, %i4  /* %i4/%i5 = src2 + 0x20 */
502         xor             %l0, %g2, %l0
503         xor             %l1, %g3, %l1
504         stxa            %l0, [%i0 + 0x10] %asi
505         stxa            %l1, [%i0 + 0x18] %asi
506         ldda            [%l6 + 0x20] %asi, %g2  /* %g2/%g3 = src3 + 0x20 */
507         ldda            [%i0 + 0x20] %asi, %l0  /* %l0/%l1 = dest + 0x20 */
509         xor             %i4, %i2, %i4
510         xor             %i5, %i3, %i5
511         ldda            [%i1 + 0x30] %asi, %i2  /* %i2/%i3 = src1 + 0x30 */
512         xor             %g2, %i4, %g2
513         xor             %g3, %i5, %g3
514         ldda            [%l7 + 0x30] %asi, %i4  /* %i4/%i5 = src2 + 0x30 */
515         xor             %l0, %g2, %l0
516         xor             %l1, %g3, %l1
517         stxa            %l0, [%i0 + 0x20] %asi
518         stxa            %l1, [%i0 + 0x28] %asi
519         ldda            [%l6 + 0x30] %asi, %g2  /* %g2/%g3 = src3 + 0x30 */
520         ldda            [%i0 + 0x30] %asi, %l0  /* %l0/%l1 = dest + 0x30 */
522         prefetch        [%i1 + 0x40], #one_read
523         prefetch        [%l7 + 0x40], #one_read
524         prefetch        [%l6 + 0x40], #one_read
525         prefetch        [%i0 + 0x40], #n_writes
527         xor             %i4, %i2, %i4
528         xor             %i5, %i3, %i5
529         xor             %g2, %i4, %g2
530         xor             %g3, %i5, %g3
531         xor             %l0, %g2, %l0
532         xor             %l1, %g3, %l1
533         stxa            %l0, [%i0 + 0x30] %asi
534         stxa            %l1, [%i0 + 0x38] %asi
536         add             %i0, 0x40, %i0
537         add             %i1, 0x40, %i1
538         add             %l7, 0x40, %l7
539         subcc           %g1, 1, %g1
540         bne,pt          %xcc, 1b
541          add            %l6, 0x40, %l6
542         membar          #Sync
543         wr              %g7, 0x0, %asi
544         ret
545          restore
546 ENDPROC(xor_niagara_4)
547 EXPORT_SYMBOL(xor_niagara_4)
549 ENTRY(xor_niagara_5) /* %o0=bytes, %o1=dest, %o2=src1, %o3=src2, %o4=src3, %o5=src4 */
550         save            %sp, -192, %sp
551         prefetch        [%i1], #n_writes
552         prefetch        [%i2], #one_read
553         prefetch        [%i3], #one_read
554         prefetch        [%i4], #one_read
555         prefetch        [%i5], #one_read
556         rd              %asi, %g7
557         wr              %g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
558         srlx            %i0, 6, %g1
559         mov             %i1, %i0
560         mov             %i2, %i1
561         mov             %i3, %l7
562         mov             %i4, %l6
563         mov             %i5, %l5
564 1:      ldda            [%i1 + 0x00] %asi, %i2  /* %i2/%i3 = src1 + 0x00 */
565         ldda            [%l7 + 0x00] %asi, %i4  /* %i4/%i5 = src2 + 0x00 */
566         ldda            [%l6 + 0x00] %asi, %g2  /* %g2/%g3 = src3 + 0x00 */
567         ldda            [%l5 + 0x00] %asi, %l0  /* %l0/%l1 = src4 + 0x00 */
568         ldda            [%i0 + 0x00] %asi, %l2  /* %l2/%l3 = dest + 0x00 */
569         xor             %i4, %i2, %i4
570         xor             %i5, %i3, %i5
571         ldda            [%i1 + 0x10] %asi, %i2  /* %i2/%i3 = src1 + 0x10 */
572         xor             %g2, %i4, %g2
573         xor             %g3, %i5, %g3
574         ldda            [%l7 + 0x10] %asi, %i4  /* %i4/%i5 = src2 + 0x10 */
575         xor             %l0, %g2, %l0
576         xor             %l1, %g3, %l1
577         ldda            [%l6 + 0x10] %asi, %g2  /* %g2/%g3 = src3 + 0x10 */
578         xor             %l2, %l0, %l2
579         xor             %l3, %l1, %l3
580         stxa            %l2, [%i0 + 0x00] %asi
581         stxa            %l3, [%i0 + 0x08] %asi
582         ldda            [%l5 + 0x10] %asi, %l0  /* %l0/%l1 = src4 + 0x10 */
583         ldda            [%i0 + 0x10] %asi, %l2  /* %l2/%l3 = dest + 0x10 */
585         xor             %i4, %i2, %i4
586         xor             %i5, %i3, %i5
587         ldda            [%i1 + 0x20] %asi, %i2  /* %i2/%i3 = src1 + 0x20 */
588         xor             %g2, %i4, %g2
589         xor             %g3, %i5, %g3
590         ldda            [%l7 + 0x20] %asi, %i4  /* %i4/%i5 = src2 + 0x20 */
591         xor             %l0, %g2, %l0
592         xor             %l1, %g3, %l1
593         ldda            [%l6 + 0x20] %asi, %g2  /* %g2/%g3 = src3 + 0x20 */
594         xor             %l2, %l0, %l2
595         xor             %l3, %l1, %l3
596         stxa            %l2, [%i0 + 0x10] %asi
597         stxa            %l3, [%i0 + 0x18] %asi
598         ldda            [%l5 + 0x20] %asi, %l0  /* %l0/%l1 = src4 + 0x20 */
599         ldda            [%i0 + 0x20] %asi, %l2  /* %l2/%l3 = dest + 0x20 */
601         xor             %i4, %i2, %i4
602         xor             %i5, %i3, %i5
603         ldda            [%i1 + 0x30] %asi, %i2  /* %i2/%i3 = src1 + 0x30 */
604         xor             %g2, %i4, %g2
605         xor             %g3, %i5, %g3
606         ldda            [%l7 + 0x30] %asi, %i4  /* %i4/%i5 = src2 + 0x30 */
607         xor             %l0, %g2, %l0
608         xor             %l1, %g3, %l1
609         ldda            [%l6 + 0x30] %asi, %g2  /* %g2/%g3 = src3 + 0x30 */
610         xor             %l2, %l0, %l2
611         xor             %l3, %l1, %l3
612         stxa            %l2, [%i0 + 0x20] %asi
613         stxa            %l3, [%i0 + 0x28] %asi
614         ldda            [%l5 + 0x30] %asi, %l0  /* %l0/%l1 = src4 + 0x30 */
615         ldda            [%i0 + 0x30] %asi, %l2  /* %l2/%l3 = dest + 0x30 */
617         prefetch        [%i1 + 0x40], #one_read
618         prefetch        [%l7 + 0x40], #one_read
619         prefetch        [%l6 + 0x40], #one_read
620         prefetch        [%l5 + 0x40], #one_read
621         prefetch        [%i0 + 0x40], #n_writes
623         xor             %i4, %i2, %i4
624         xor             %i5, %i3, %i5
625         xor             %g2, %i4, %g2
626         xor             %g3, %i5, %g3
627         xor             %l0, %g2, %l0
628         xor             %l1, %g3, %l1
629         xor             %l2, %l0, %l2
630         xor             %l3, %l1, %l3
631         stxa            %l2, [%i0 + 0x30] %asi
632         stxa            %l3, [%i0 + 0x38] %asi
634         add             %i0, 0x40, %i0
635         add             %i1, 0x40, %i1
636         add             %l7, 0x40, %l7
637         add             %l6, 0x40, %l6
638         subcc           %g1, 1, %g1
639         bne,pt          %xcc, 1b
640          add            %l5, 0x40, %l5
641         membar          #Sync
642         wr              %g7, 0x0, %asi
643         ret
644          restore
645 ENDPROC(xor_niagara_5)
646 EXPORT_SYMBOL(xor_niagara_5)