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  */
11 
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>
18 
19 /*
20  *	Requirements:
21  *	!(((long)dest | (long)sourceN) & (64 - 1)) &&
22  *	!(len & 127) && len >= 256
23  */
24 	.text
25 
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
41 
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
68 
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)
96 
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
111 
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
137 
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)
163 
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
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 ENDPROC(xor_vis_4)
248 EXPORT_SYMBOL(xor_vis_4)
249 
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
265 
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
311 
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)
356 
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)
403 
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)
465 
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 */
495 
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 */
508 
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 */
521 
522 	prefetch	[%i1 + 0x40], #one_read
523 	prefetch	[%l7 + 0x40], #one_read
524 	prefetch	[%l6 + 0x40], #one_read
525 	prefetch	[%i0 + 0x40], #n_writes
526 
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
535 
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)
548 
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 */
584 
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 */
600 
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 */
616 
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
622 
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
633 
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)
647