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. */ 27ENTRY(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 340: 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 422: 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 94ENDPROC(xor_vis_2) 95EXPORT_SYMBOL(xor_vis_2) 96 97ENTRY(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 1040: 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 1123: 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 161ENDPROC(xor_vis_3) 162EXPORT_SYMBOL(xor_vis_3) 163 164ENTRY(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 1710: 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 1794: 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 247ENDPROC(xor_vis_4) 248EXPORT_SYMBOL(xor_vis_4) 249 250ENTRY(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 2580: 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 2665: 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 354ENDPROC(xor_vis_5) 355EXPORT_SYMBOL(xor_vis_5) 356 357 /* Niagara versions. */ 358ENTRY(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 3671: 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 401ENDPROC(xor_niagara_2) 402EXPORT_SYMBOL(xor_niagara_2) 403 404ENTRY(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 4151: 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 463ENDPROC(xor_niagara_3) 464EXPORT_SYMBOL(xor_niagara_3) 465 466ENTRY(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 4791: 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 546ENDPROC(xor_niagara_4) 547EXPORT_SYMBOL(xor_niagara_4) 548 549ENTRY(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 5641: 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 645ENDPROC(xor_niagara_5) 646EXPORT_SYMBOL(xor_niagara_5) 647