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