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/export.h> |
13 | #include <linux/linkage.h> |
14 | #include <asm/visasm.h> |
15 | #include <asm/asi.h> |
16 | #include <asm/dcu.h> |
17 | #include <asm/spitfire.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 | |