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