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. */ 26ENTRY(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 330: 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 412: 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 93ENDPROC(xor_vis_2) 94EXPORT_SYMBOL(xor_vis_2) 95 96ENTRY(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 1030: 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 1113: 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 160ENDPROC(xor_vis_3) 161EXPORT_SYMBOL(xor_vis_3) 162 163ENTRY(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 1700: 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 1784: 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 246ENDPROC(xor_vis_4) 247EXPORT_SYMBOL(xor_vis_4) 248 249ENTRY(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 2570: 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 2655: 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 353ENDPROC(xor_vis_5) 354EXPORT_SYMBOL(xor_vis_5) 355 356 /* Niagara versions. */ 357ENTRY(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 3661: 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 400ENDPROC(xor_niagara_2) 401EXPORT_SYMBOL(xor_niagara_2) 402 403ENTRY(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 4141: 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 462ENDPROC(xor_niagara_3) 463EXPORT_SYMBOL(xor_niagara_3) 464 465ENTRY(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 4781: 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 545ENDPROC(xor_niagara_4) 546EXPORT_SYMBOL(xor_niagara_4) 547 548ENTRY(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 5631: 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 644ENDPROC(xor_niagara_5) 645EXPORT_SYMBOL(xor_niagara_5) 646