|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* ! 26: * HISTORY ! 27: * Revision 1.3 1997/11/06 00:15:22 tmason ! 28: * Fixed spl bug in pmap.c as well as fixes for bcopy ! 29: * ! 30: * Revision 1.2 1997/10/29 02:13:43 tmason ! 31: * Fixed oodles of bugs related to pmap issues as well as bcopy, FLOAT!, and cached accesses. ! 32: * ! 33: * Revision 1.1.1.1 1997/09/30 02:45:28 wsanchez ! 34: * Import of kernel from umeshv/kernel ! 35: * ! 36: * Revision 1.1.1.1 1997/06/28 10:47:00 rvega ! 37: * Radar #1665906 ! 38: * Add integer load/store method to avoid use of floating ! 39: * point load/stores in kernel until full support is completed. ! 40: * Note: this restores code that was regressed during integration. ! 41: * [1997/06/28 10:47:00 rvega] ! 42: * ! 43: * Revision 1.1.1.1 1997/04/30 15:00:00 rvega ! 44: * Use the Tim Olson fast copy function. ! 45: * [1997/04/30 15:00:00 rvega] ! 46: * ! 47: */ ! 48: ! 49: /* ! 50: * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991 ! 51: * All Rights Reserved ! 52: * ! 53: * Permission to use, copy, modify, and distribute this software and ! 54: * its documentation for any purpose and without fee is hereby granted, ! 55: * provided that the above copyright notice appears in all copies and ! 56: * that both the copyright notice and this permission notice appear in ! 57: * supporting documentation. ! 58: * ! 59: * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE ! 60: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ! 61: * FOR A PARTICULAR PURPOSE. ! 62: * ! 63: * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR ! 64: * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ! 65: * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, ! 66: * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION ! 67: * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ! 68: */ ! 69: /* ! 70: * MKLINUX-1.0DR2 ! 71: */ ! 72: ! 73: #include <ppc/asm.h> ! 74: #include <assym.h> ! 75: #include <ppc/bcopy.h> ! 76: #include <ppc/proc_reg.h> /* For CACHE_LINE_SIZE */ ! 77: ! 78: #ifndef USE_FLOATING_POINT_IN_KERNEL ! 79: #define USE_FLOATING_POINT_IN_KERNEL 0 ! 80: #else ! 81: #undef USE_FLOATING_POINT_IN_KERNEL ! 82: #define USE_FLOATING_POINT_IN_KERNEL 0 ! 83: #endif ! 84: ! 85: /* If we are permitted to use floating point registers, this goes faster ! 86: * for cache-aligned copies ! 87: */ ! 88: ! 89: ! 90: /* registers used: */ ! 91: ! 92: /* IMPORTANT - copyin/copyout assumes that bcopy won't trash r10 */ ! 93: ! 94: #define src r4 ! 95: #define byteCount r5 ! 96: #define wordCount r6 ! 97: #define dst r7 ! 98: #define bufA r8 ! 99: #define bufB r9 ! 100: #define bufC r0 ! 101: #define fbufA f8 ! 102: #define fbufB f9 ! 103: #define fbufC f0 ! 104: ! 105: #define rs r3 ! 106: #define rd r4 ! 107: #define rc r5 ! 108: ! 109: #define CACHE_FLAG 4 ! 110: #define crCached 4 ! 111: ! 112: /* ! 113: * bcopy(const char *from, chat *to, vm_size_t nbytes) ! 114: * ! 115: * bcopy_nc is simply bcopy except the dcbz & dcbst ! 116: * instructions are not to be used. This is for non-cached ! 117: * areas of memory. ! 118: * ! 119: * Various device drivers heavily use this routine. ! 120: */ ! 121: ! 122: ENTRY(bcopy_nc, TAG_NO_FRAME_USED) ! 123: mfcr r0 ! 124: stw r0, FM_CR_SAVE(r1) ! 125: mflr r0 ! 126: stw r0, FM_LR_SAVE(r1) ! 127: ! 128: crxor CACHE_FLAG,CACHE_FLAG,CACHE_FLAG ! 129: b .L_bcopy_common ! 130: ! 131: /* ! 132: * void bcopy(const char *from, char *to, vm_size_t nbytes) ! 133: * ! 134: * bcopy uses memcpy, shouldn't this be done with a #define?? ! 135: */ ! 136: ! 137: #if USE_FAST_BCOPY ! 138: ! 139: #if ORG_BCOPY ! 140: ENTRY(fast_bcopy, TAG_NO_FRAME_USED) ! 141: #else /* ORG_BCOPY */ ! 142: ENTRY2(bcopy,fast_bcopy, TAG_NO_FRAME_USED) ! 143: #endif /* ORG_BCOPY */ ! 144: ! 145: #endif /* USE_FAST_BCOPY */ ! 146: mfcr r0 ! 147: stw r0, FM_CR_SAVE(r1) ! 148: mflr r0 ! 149: stw r0, FM_LR_SAVE(r1) ! 150: ! 151: creqv CACHE_FLAG,CACHE_FLAG,CACHE_FLAG ! 152: ! 153: .L_bcopy_common: ! 154: cmpwi CR0, byteCount, 0 ! 155: beqlr- CR0 ! 156: ! 157: /* Convert to memcpy style arguments */ ! 158: mr dst, ARG1 /* Move dst from arg to 'dst' */ ! 159: mr src, ARG0 /* put src in expected register too */ ! 160: b .L_memcpy_bcopy ! 161: ! 162: #if 0 /* ndef PPC604 */ ! 163: /* The 601 and 603 cope well with unaligned word accesses, so we can ! 164: * forget about worrying about word alignment issues - the only exception ! 165: * to this is on a page boundary. This means that we can go faster than ! 166: * on a 604 ! 167: */ ! 168: ! 169: /* For the moment, just use the 604 version, TODO NMGS optimise */ ! 170: ! 171: #else /* PPC604 */ ! 172: ! 173: /* ! 174: * Copyright (C) 1993, 1994, 1995 Tim Olson ! 175: * ! 176: * This software is distributed absolutely without warranty. You are ! 177: * free to use and modify the software as you wish. You are also free ! 178: * to distribute the software as long as you retain the above copyright ! 179: * notice, and you make clear what your modifications were. ! 180: * ! 181: * Send comments and bug reports to [email protected] ! 182: */ ! 183: ! 184: .align 2 ! 185: LmemcpyAlignVector: ! 186: .long .mm0s0c0 ! 187: .long .mm0s0c1 ! 188: .long .mm0s0c2 ! 189: .long .mm0s0c3 ! 190: .long .mm0s1c0 ! 191: .long .mm0s1c1 ! 192: .long .mm0s1c2 ! 193: .long .mm0s1c3 ! 194: .long .mm0s2c0 ! 195: .long .mm0s2c1 ! 196: .long .mm0s2c2 ! 197: .long .mm0s2c3 ! 198: .long .mm0s3c0 ! 199: .long .mm0s3c1 ! 200: .long .mm0s3c2 ! 201: .long .mm0s3c3 ! 202: .long .mm1s0c0 ! 203: .long .mm1s0c1 ! 204: .long .mm1s0c2 ! 205: .long .mm1s0c3 ! 206: .long .mm1s1c0 ! 207: .long .mm1s1c1 ! 208: .long .mm1s1c2 ! 209: .long .mm1s1c3 ! 210: .long .mm1s2c0 ! 211: .long .mm1s2c1 ! 212: .long .mm1s2c2 ! 213: .long .mm1s2c3 ! 214: .long .mm1s3c0 ! 215: .long .mm1s3c1 ! 216: .long .mm1s3c2 ! 217: .long .mm1s3c3 ! 218: .long .mm2s0c0 ! 219: .long .mm2s0c1 ! 220: .long .mm2s0c2 ! 221: .long .mm2s0c3 ! 222: .long .mm2s1c0 ! 223: .long .mm2s1c1 ! 224: .long .mm2s1c2 ! 225: .long .mm2s1c3 ! 226: .long .mm2s2c0 ! 227: .long .mm2s2c1 ! 228: .long .mm2s2c2 ! 229: .long .mm2s2c3 ! 230: .long .mm2s3c0 ! 231: .long .mm2s3c1 ! 232: .long .mm2s3c2 ! 233: .long .mm2s3c3 ! 234: .long .mm3s0c0 ! 235: .long .mm3s0c1 ! 236: .long .mm3s0c2 ! 237: .long .mm3s0c3 ! 238: .long .mm3s1c0 ! 239: .long .mm3s1c1 ! 240: .long .mm3s1c2 ! 241: .long .mm3s1c3 ! 242: .long .mm3s2c0 ! 243: .long .mm3s2c1 ! 244: .long .mm3s2c2 ! 245: .long .mm3s2c3 ! 246: .long .mm3s3c0 ! 247: .long .mm3s3c1 ! 248: .long .mm3s3c2 ! 249: .long .mm3s3c3 ! 250: ! 251: /* ! 252: * high-performance memcpy implementation for 604 ! 253: * uses aligned transfers plus alignment shuffling code ! 254: */ ! 255: ! 256: ! 257: #if USE_FAST_BCOPY ! 258: ENTRY(memcpy, TAG_NO_FRAME_USED) ! 259: #endif /* USE_FAST_BCOPY */ ! 260: mfcr r0 ! 261: stw r0, FM_CR_SAVE(r1) ! 262: mflr r0 ! 263: stw r0, FM_LR_SAVE(r1) ! 264: ! 265: cmpwi CR0, byteCount, 0 ! 266: beqlr- CR0 ! 267: mr dst, ARG0 /* Move dst from retval to 'dst' */ ! 268: ! 269: creqv CACHE_FLAG,CACHE_FLAG,CACHE_FLAG ! 270: ! 271: .L_memcpy_bcopy: ! 272: /* (jumped to) entry point for fast_bcopy */ ! 273: ! 274: cmplw src, dst ! 275: beqlr /* they are equal, so exit */ ! 276: ! 277: stwu r1, -48(r1) ! 278: stw r3, 12(r1) ! 279: ! 280: /* disable ints */ ! 281: mfmsr r12 ! 282: rlwinm r8, r12, 0 , MSR_EE_BIT+1, MSR_EE_BIT-1 ! 283: mtmsr r8 ! 284: ! 285: #if USE_FLOATING_POINT_IN_KERNEL ! 286: bl EXT(fpu_save) // save fpu state if in use ! 287: #endif /* USE_FLOATING_POINT_IN_KERNEL */ ! 288: ! 289: //bgt+ awm0 /* src > dst */ ! 290: ! 291: sub r0,dst,src ! 292: cmplw r0,byteCount ! 293: bge+ awm0 ! 294: ! 295: add r8, dst, byteCount ! 296: add r6, src, byteCount ! 297: mtctr byteCount ! 298: mmc00: /* move it all, backwards */ ! 299: subi r6, r6, 1 ! 300: subi r8, r8, 1 ! 301: lbz r0, 0(r6) ! 302: stb r0, 0(r8) ! 303: bdnz+ mmc00 ! 304: ! 305: ! 306: bcopy_exit: ! 307: #if USE_FLOATING_POINT_IN_KERNEL ! 308: bl EXT(fpu_disable) ! 309: #endif ! 310: mtmsr r12 ! 311: ! 312: lwz r3, 12(r1) ! 313: addi r1, r1, 48 ! 314: ! 315: lwz r0, FM_LR_SAVE(r1) ! 316: mtlr r0 ! 317: lwz r0, FM_CR_SAVE(r1) ! 318: mtcr r0 ! 319: ! 320: blr ! 321: ! 322: awm0: ! 323: cmpwi CR0, byteCount, 8 ! 324: bge .awm2 ! 325: ! 326: /* handle a byte at a time for short moves */ ! 327: mtctr byteCount ! 328: .awm1: ! 329: lbz r0, 0(src) ! 330: stb r0, 0(dst) ! 331: addi src, src, 1 ! 332: addi dst, dst, 1 ! 333: ! 334: bdnz .awm1 ! 335: ! 336: b bcopy_exit ! 337: ! 338: ! 339: .awm2: ! 340: /* special case long, cache-block aligned transfers */ ! 341: andi. r0, src, CACHE_LINE_SIZE-1 /* cache block aligned? */ ! 342: bne .awm3 ! 343: andi. r0, dst, CACHE_LINE_SIZE-1 ! 344: bne .awm3 ! 345: andi. r0, byteCount, CACHE_LINE_SIZE-1 ! 346: bne .awm3 ! 347: ! 348: srwi wordCount, byteCount, 5 /* compute blocks to transfer */ ! 349: ! 350: #if USE_FLOATING_POINT_IN_KERNEL ! 351: ! 352: cmpwi wordCount, 1 ! 353: beq L_bcopy_one_fp ! 354: ! 355: srwi bufA, byteCount, 6 /* compute blocks to transfer */ ! 356: mtctr bufA ! 357: ! 358: li bufB, CACHE_LINE_SIZE ! 359: #else /* USE_FLOATING_POINT_IN_KERNEL */ ! 360: ! 361: mtctr wordCount ! 362: ! 363: #endif /* USE_FLOATING_POINT_IN_KERNEL */ ! 364: ! 365: .mmc0: ! 366: ! 367: #if CACHE_LINE_SIZE < 32 ! 368: #error code assumes CACHE_LINE_SIZE >= 32, and prefers it at 32 exactly ! 369: #endif ! 370: ! 371: #ifndef UNCACHED_DATA_604 ! 372: bf CACHE_FLAG,.L_bcopy_skip_dcbz ! 373: dcbz 0, dst ! 374: #if USE_FLOATING_POINT_IN_KERNEL ! 375: dcbz bufB, dst ! 376: #endif /* USE_FLOATING_POINT_IN_KERNEL */ ! 377: .L_bcopy_skip_dcbz: ! 378: #endif /* UNCACHED_DATA_604 */ ! 379: ! 380: #if USE_FLOATING_POINT_IN_KERNEL ! 381: /* We can use floating point regs, this zooms */ ! 382: lfd f0, 0(src) ! 383: lfd f1, 8(src) ! 384: lfd f2, 16(src) ! 385: lfd f3, 24(src) ! 386: lfd f4, 32(src) ! 387: lfd f5, 40(src) ! 388: lfd f6, 48(src) ! 389: lfd f7, 56(src) ! 390: addi src, src, (2*CACHE_LINE_SIZE) ! 391: ! 392: stfd f0, 0(dst) ! 393: stfd f1, 8(dst) ! 394: stfd f2, 16(dst) ! 395: stfd f3, 24(dst) ! 396: stfd f4, 32(dst) ! 397: stfd f5, 40(dst) ! 398: stfd f6, 48(dst) ! 399: stfd f7, 56(dst) ! 400: addi dst, dst, (2*CACHE_LINE_SIZE) ! 401: ! 402: #else /* USE_FLOATING_POINT_IN_KERNEL */ ! 403: lwz r0, 0(src) ! 404: lwz r3, 4(src) ! 405: lwz r5, 8(src) ! 406: lwz r6, 12(src) ! 407: lwz r8, 16(src) ! 408: lwz r9, 20(src) ! 409: lwz r10, 24(src) ! 410: lwz r11, 28(src) ! 411: addi src, src, CACHE_LINE_SIZE ! 412: ! 413: stw r0, 0(dst) ! 414: stw r3, 4(dst) ! 415: stw r5, 8(dst) ! 416: stw r6, 12(dst) ! 417: stw r8, 16(dst) ! 418: stw r9, 20(dst) ! 419: stw r10, 24(dst) ! 420: stw r11, 28(dst) ! 421: addi dst, dst, CACHE_LINE_SIZE ! 422: ! 423: #endif /* USE_FLOATING_POINT_IN_KERNEL */ ! 424: ! 425: bdnz .mmc0 ! 426: ! 427: #if USE_FLOATING_POINT_IN_KERNEL ! 428: L_bcopy_one_fp: ! 429: /* check just in case we fell through from above */ ! 430: andi. r0, wordCount, 1 ! 431: beq L_bcopy_fpu_end ! 432: ! 433: #ifndef UNCACHED_DATA_604 ! 434: bf CACHE_FLAG,.L_bcopy_skip_dcbz1 ! 435: dcbz 0, dst ! 436: .L_bcopy_skip_dcbz1: ! 437: #endif /* UNCACHED_DATA_604 */ ! 438: ! 439: /* We can use floating point regs, this zooms */ ! 440: lfd f0, 0(src) ! 441: lfd f1, 8(src) ! 442: lfd f2, 16(src) ! 443: lfd f3, 24(src) ! 444: ! 445: stfd f0, 0(dst) ! 446: stfd f1, 8(dst) ! 447: stfd f2, 16(dst) ! 448: stfd f3, 24(dst) ! 449: L_bcopy_fpu_end: ! 450: #endif /* USE_FLOATING_POINT_IN_KERNEL */ ! 451: b bcopy_exit ! 452: ! 453: ! 454: ! 455: .awm3: ! 456: /* compute alignment transfer vector */ ! 457: addis bufB, 0, ha16(LmemcpyAlignVector) ! 458: addi bufB, bufB, lo16(LmemcpyAlignVector) ! 459: ! 460: srwi. wordCount, byteCount, 2 /* compute words to transfer */ ! 461: rlwinm bufA, dst, 6, 24, 25 ! 462: rlwimi bufA, src, 4, 26, 27 ! 463: rlwimi bufA, byteCount, 2, 28, 29 ! 464: lwzx r0, bufA, bufB ! 465: mtctr r0 ! 466: bctr ! 467: ! 468: ! 469: ! 470: /* forward copy destination aligned at 0, source aligned at 0, byte count 0 */ ! 471: /* d = 0123 4567 89ab xxxx */ ! 472: /* s = 0123 4567 89ab xxxx */ ! 473: .align 4 ! 474: .mm0s0c0: ! 475: srwi r0, wordCount, 1 ! 476: mtctr r0 ! 477: ! 478: .mm0s0c0a: ! 479: lwz bufA, 0(src) ! 480: lwz bufB, 4(src) ! 481: stw bufA, 0(dst) ! 482: stw bufB, 4(dst) ! 483: addi src, src, 8 ! 484: addi dst, dst, 8 ! 485: bdnz .mm0s0c0a ! 486: ! 487: /* if even number of words, return */ ! 488: andi. wordCount, wordCount, 1 ! 489: beq bcopy_exit ! 490: ! 491: /* otherwise copy last word */ ! 492: .mm0s0c0a1: ! 493: lwz bufA, 0(src) ! 494: stw bufA, 0(dst) ! 495: ! 496: b bcopy_exit ! 497: ! 498: /* forward copy destination aligned at 0, source aligned at 0, byte count 1 */ ! 499: /* d = 0123 4567 89ab cxxx */ ! 500: /* s = 0123 4567 89ab cxxx */ ! 501: .align 4 ! 502: .mm0s0c1: ! 503: mtctr wordCount ! 504: ! 505: .mm0s0c1a: ! 506: lwz bufA, 0(src) ! 507: stw bufA, 0(dst) ! 508: addi src, src, 4 ! 509: addi dst, dst, 4 ! 510: bdnz .mm0s0c1a ! 511: ! 512: lwz bufC, 0(dst) ! 513: lwz bufA, 0(src) ! 514: rlwimi bufC, bufA, 0, 0, 7 ! 515: stw bufC, 0(dst) ! 516: b bcopy_exit ! 517: ! 518: /* forward copy destination aligned at 0, source aligned at 0, byte count 2 */ ! 519: /* d = 0123 4567 89ab cdxx */ ! 520: /* s = 0123 4567 89ab cdxx */ ! 521: .align 4 ! 522: .mm0s0c2: ! 523: mtctr wordCount ! 524: .mm0s0c2a: ! 525: lwz bufA, 0(src) ! 526: stw bufA, 0(dst) ! 527: addi src, src, 4 ! 528: addi dst, dst, 4 ! 529: bdnz .mm0s0c2a ! 530: ! 531: lwz bufC, 0(dst) ! 532: lwz bufA, 0(src) ! 533: rlwimi bufC, bufA, 0, 0, 15 ! 534: stw bufC, 0(dst) ! 535: b bcopy_exit ! 536: ! 537: /* forward copy destination aligned at 0, source aligned at 0, byte count 3 */ ! 538: /* d = 0123 4567 89ab cdex */ ! 539: /* s = 0123 4567 89ab cdex */ ! 540: .align 4 ! 541: .mm0s0c3: ! 542: mtctr wordCount ! 543: ! 544: .mm0s0c3a: ! 545: lwz bufA, 0(src) ! 546: stw bufA, 0(dst) ! 547: addi src, src, 4 ! 548: addi dst, dst, 4 ! 549: bdnz .mm0s0c3a ! 550: ! 551: lwz bufC, 0(dst) ! 552: lwz bufA, 0(src) ! 553: rlwimi bufC, bufA, 0, 0, 23 ! 554: stw bufC, 0(dst) ! 555: b bcopy_exit ! 556: ! 557: /* forward copy destination aligned at 0, source aligned at 1, byte count 0 */ ! 558: /* d = 0123 4567 89ab xxxx */ ! 559: /* s = x012 3456 789a bxxx */ ! 560: .align 4 ! 561: .mm0s1c0: ! 562: lwz bufA, -1(src) ! 563: lwz bufB, 3(src) ! 564: addi src, src, 3 ! 565: addi wordCount, wordCount, -1 ! 566: mtctr wordCount ! 567: rlwimi bufC, bufA, 8, 0, 23 ! 568: rlwimi bufC, bufB, 8, 24, 31 ! 569: stw bufC, 0(dst) ! 570: slwi bufA, bufB, 8 ! 571: ! 572: .mm0s1c0a: ! 573: lwz bufB, 4(src) ! 574: rlwimi bufA, bufB, 8, 24, 31 ! 575: stw bufA, 4(dst) ! 576: addi src, src, 4 ! 577: slwi bufA, bufB, 8 ! 578: addi dst, dst, 4 ! 579: bdnz .mm0s1c0a ! 580: ! 581: b bcopy_exit ! 582: ! 583: /* forward copy destination aligned at 0, source aligned at 1, byte count 1 */ ! 584: /* d = 0123 4567 89ab cxxx */ ! 585: /* s = x012 3456 789a bcxx */ ! 586: .align 4 ! 587: .mm0s1c1: ! 588: lwz bufA, -1(src) ! 589: lwz bufB, 3(src) ! 590: addi src, src, 3 ! 591: addi wordCount, wordCount, -1 ! 592: mtctr wordCount ! 593: rlwimi bufC, bufA, 8, 0, 23 ! 594: rlwimi bufC, bufB, 8, 24, 31 ! 595: stw bufC, 0(dst) ! 596: slwi bufA, bufB, 8 ! 597: ! 598: .mm0s1c1a: ! 599: lwz bufB, 4(src) ! 600: addi src, src, 4 ! 601: rlwimi bufA, bufB, 8, 24, 31 ! 602: stw bufA, 4(dst) ! 603: addi dst, dst, 4 ! 604: slwi bufA, bufB, 8 ! 605: bdnz .mm0s1c1a ! 606: ! 607: lwz bufC, 4(dst) ! 608: rlwimi bufC, bufA, 0, 0, 7 ! 609: stw bufC, 4(dst) ! 610: b bcopy_exit ! 611: ! 612: /* forward copy destination aligned at 0, source aligned at 1, byte count 2 */ ! 613: /* d = 0123 4567 89ab cdxx */ ! 614: /* s = x012 3456 789a bcdx */ ! 615: .align 4 ! 616: .mm0s1c2: ! 617: lwz bufA, -1(src) ! 618: lwz bufB, 3(src) ! 619: addi src, src, 3 ! 620: addi wordCount, wordCount, -1 ! 621: mtctr wordCount ! 622: rlwimi bufC, bufA, 8, 0, 23 ! 623: rlwimi bufC, bufB, 8, 24, 31 ! 624: stw bufC, 0(dst) ! 625: slwi bufA, bufB, 8 ! 626: ! 627: .mm0s1c2a: ! 628: lwz bufB, 4(src) ! 629: addi src, src, 4 ! 630: rlwimi bufA, bufB, 8, 24, 31 ! 631: stw bufA, 4(dst) ! 632: addi dst, dst, 4 ! 633: slwi bufA, bufB, 8 ! 634: bdnz .mm0s1c2a ! 635: ! 636: lwz bufC, 4(dst) ! 637: rlwimi bufC, bufA, 0, 0, 15 ! 638: stw bufC, 4(dst) ! 639: b bcopy_exit ! 640: ! 641: /* forward copy destination aligned at 0, source aligned at 1, byte count 3 */ ! 642: /* d = 0123 4567 89ab cdex */ ! 643: /* s = x012 3456 789a bcde xxxx */ ! 644: .align 4 ! 645: .mm0s1c3: ! 646: lwz bufA, -1(src) ! 647: lwz bufB, 3(src) ! 648: addi src, src, 3 ! 649: addi wordCount, wordCount, -1 ! 650: mtctr wordCount ! 651: rlwimi bufC, bufA, 8, 0, 23 ! 652: rlwimi bufC, bufB, 8, 24, 31 ! 653: stw bufC, 0(dst) ! 654: slwi bufA, bufB, 8 ! 655: ! 656: .mm0s1c3a: ! 657: lwz bufB, 4(src) ! 658: addi src, src, 4 ! 659: rlwimi bufA, bufB, 8, 24, 31 ! 660: stw bufA, 4(dst) ! 661: addi dst, dst, 4 ! 662: slwi bufA, bufB, 8 ! 663: bdnz .mm0s1c3a ! 664: ! 665: lwz bufC, 4(dst) ! 666: rlwimi bufC, bufA, 0, 0, 23 ! 667: stw bufC, 4(dst) ! 668: b bcopy_exit ! 669: ! 670: /* forward copy destination aligned at 0, source aligned at 2, byte count 0 */ ! 671: /* d = 0123 4567 89ab xxxx */ ! 672: /* s = xx01 2345 6789 abxx */ ! 673: .align 4 ! 674: .mm0s2c0: ! 675: lwz bufA, -2(src) ! 676: lwz bufB, 2(src) ! 677: addi src, src, 2 ! 678: addi wordCount, wordCount, -1 ! 679: mtctr wordCount ! 680: rlwimi bufC, bufA, 16, 0, 15 ! 681: rlwimi bufC, bufB, 16, 16, 31 ! 682: stw bufC, 0(dst) ! 683: slwi bufA, bufB, 16 ! 684: ! 685: .mm0s2c0a: ! 686: lwz bufB, 4(src) ! 687: addi src, src, 4 ! 688: rlwimi bufA, bufB, 16, 16, 31 ! 689: stw bufA, 4(dst) ! 690: addi dst, dst, 4 ! 691: slwi bufA, bufB, 16 ! 692: bdnz .mm0s2c0a ! 693: ! 694: b bcopy_exit ! 695: ! 696: /* forward copy destination aligned at 0, source aligned at 2, byte count 1 */ ! 697: /* d = 0123 4567 89ab cxxx */ ! 698: /* s = xx01 2345 6789 abcx */ ! 699: .align 4 ! 700: .mm0s2c1: ! 701: lwz bufA, -2(src) ! 702: lwz bufB, 2(src) ! 703: addi src, src, 2 ! 704: addi wordCount, wordCount, -1 ! 705: mtctr wordCount ! 706: rlwimi bufC, bufA, 16, 0, 15 ! 707: rlwimi bufC, bufB, 16, 16, 31 ! 708: stw bufC, 0(dst) ! 709: slwi bufA, bufB, 16 ! 710: ! 711: .mm0s2c1a: ! 712: lwz bufB, 4(src) ! 713: addi src, src, 4 ! 714: rlwimi bufA, bufB, 16, 16, 31 ! 715: stw bufA, 4(dst) ! 716: addi dst, dst, 4 ! 717: slwi bufA, bufB, 16 ! 718: bdnz .mm0s2c1a ! 719: ! 720: lwz bufC, 4(dst) ! 721: rlwimi bufC, bufA, 0, 0, 7 ! 722: stw bufC, 4(dst) ! 723: b bcopy_exit ! 724: ! 725: /* forward copy destination aligned at 0, source aligned at 2, byte count 2 */ ! 726: /* d = 0123 4567 89ab cdxx */ ! 727: /* s = xx01 2345 6789 abcd xxxx */ ! 728: .align 4 ! 729: .mm0s2c2: ! 730: lwz bufA, -2(src) ! 731: lwz bufB, 2(src) ! 732: addi src, src, 2 ! 733: addi wordCount, wordCount, -1 ! 734: mtctr wordCount ! 735: rlwimi bufC, bufA, 16, 0, 15 ! 736: rlwimi bufC, bufB, 16, 16, 31 ! 737: stw bufC, 0(dst) ! 738: slwi bufA, bufB, 16 ! 739: ! 740: .mm0s2c2a: ! 741: lwz bufB, 4(src) ! 742: addi src, src, 4 ! 743: rlwimi bufA, bufB, 16, 16, 31 ! 744: stw bufA, 4(dst) ! 745: addi dst, dst, 4 ! 746: slwi bufA, bufB, 16 ! 747: bdnz .mm0s2c2a ! 748: ! 749: lwz bufC, 4(dst) ! 750: rlwimi bufC, bufA, 0, 0, 15 ! 751: stw bufC, 4(dst) ! 752: b bcopy_exit ! 753: ! 754: /* forward copy destination aligned at 0, source aligned at 2, byte count 3 */ ! 755: /* d = 0123 4567 89ab cdex */ ! 756: /* s = xx01 2345 6789 abcd exxx */ ! 757: .align 4 ! 758: .mm0s2c3: ! 759: lwz bufA, -2(src) ! 760: lwz bufB, 2(src) ! 761: addi src, src, 2 ! 762: addi wordCount, wordCount, -1 ! 763: mtctr wordCount ! 764: rlwimi bufC, bufA, 16, 0, 15 ! 765: rlwimi bufC, bufB, 16, 16, 31 ! 766: stw bufC, 0(dst) ! 767: slwi bufA, bufB, 16 ! 768: ! 769: .mm0s2c3a: ! 770: lwz bufB, 4(src) ! 771: addi src, src, 4 ! 772: rlwimi bufA, bufB, 16, 16, 31 ! 773: stw bufA, 4(dst) ! 774: addi dst, dst, 4 ! 775: slwi bufA, bufB, 16 ! 776: bdnz .mm0s2c3a ! 777: ! 778: lwz bufB, 4(src) ! 779: lwz bufC, 4(dst) ! 780: rlwimi bufA, bufB, 16, 16, 31 ! 781: rlwimi bufC, bufA, 0, 0, 23 ! 782: stw bufC, 4(dst) ! 783: b bcopy_exit ! 784: ! 785: /* forward copy destination aligned at 0, source aligned at 3, byte count 0 */ ! 786: /* d = 0123 4567 89ab xxxx */ ! 787: /* s = xxx0 1234 5678 9abx */ ! 788: .align 4 ! 789: .mm0s3c0: ! 790: lwz bufA, -3(src) ! 791: lwz bufB, 1(src) ! 792: addi src, src, 1 ! 793: addi wordCount, wordCount, -1 ! 794: mtctr wordCount ! 795: rlwimi bufC, bufA, 24, 0, 7 ! 796: rlwimi bufC, bufB, 24, 8, 31 ! 797: stw bufC, 0(dst) ! 798: slwi bufA, bufB, 24 ! 799: ! 800: .mm0s3c0a: ! 801: lwz bufB, 4(src) ! 802: addi src, src, 4 ! 803: rlwimi bufA, bufB, 24, 8, 31 ! 804: stw bufA, 4(dst) ! 805: addi dst, dst, 4 ! 806: slwi bufA, bufB, 24 ! 807: bdnz .mm0s3c0a ! 808: ! 809: b bcopy_exit ! 810: ! 811: /* forward copy destination aligned at 0, source aligned at 3, byte count 1 */ ! 812: /* d = 0123 4567 89ab cxxx */ ! 813: /* s = xxx0 1234 5678 9abc xxxx */ ! 814: .align 4 ! 815: .mm0s3c1: ! 816: lwz bufA, -3(src) ! 817: lwz bufB, 1(src) ! 818: addi src, src, 1 ! 819: addi wordCount, wordCount, -1 ! 820: mtctr wordCount ! 821: rlwimi bufC, bufA, 24, 0, 7 ! 822: rlwimi bufC, bufB, 24, 8, 31 ! 823: stw bufC, 0(dst) ! 824: slwi bufA, bufB, 24 ! 825: ! 826: .mm0s3c1a: ! 827: lwz bufB, 4(src) ! 828: addi src, src, 4 ! 829: rlwimi bufA, bufB, 24, 8, 31 ! 830: stw bufA, 4(dst) ! 831: addi dst, dst, 4 ! 832: slwi bufA, bufB, 24 ! 833: bdnz .mm0s3c1a ! 834: ! 835: lwz bufC, 4(dst) ! 836: rlwimi bufC, bufA, 0, 0, 7 ! 837: stw bufC, 4(dst) ! 838: b bcopy_exit ! 839: ! 840: /* forward copy destination aligned at 0, source aligned at 3, byte count 2 */ ! 841: /* d = 0123 4567 89ab cdxx */ ! 842: /* s = xxx0 1234 5678 9abc dxxx */ ! 843: .align 4 ! 844: .mm0s3c2: ! 845: lwz bufA, -3(src) ! 846: lwz bufB, 1(src) ! 847: addi src, src, 1 ! 848: addi wordCount, wordCount, -1 ! 849: mtctr wordCount ! 850: rlwimi bufC, bufA, 24, 0, 7 ! 851: rlwimi bufC, bufB, 24, 8, 31 ! 852: stw bufC, 0(dst) ! 853: slwi bufA, bufB, 24 ! 854: ! 855: .mm0s3c2a: ! 856: lwz bufB, 4(src) ! 857: addi src, src, 4 ! 858: rlwimi bufA, bufB, 24, 8, 31 ! 859: stw bufA, 4(dst) ! 860: addi dst, dst, 4 ! 861: slwi bufA, bufB, 24 ! 862: bdnz .mm0s3c2a ! 863: ! 864: lwz bufB, 4(src) ! 865: lwz bufC, 4(dst) ! 866: rlwimi bufA, bufB, 24, 8, 31 ! 867: rlwimi bufC, bufA, 0, 0, 15 ! 868: stw bufC, 4(dst) ! 869: b bcopy_exit ! 870: ! 871: /* forward copy destination aligned at 0, source aligned at 3, byte count 3 */ ! 872: /* d = 0123 4567 89ab cdex */ ! 873: /* s = xxx0 1234 5678 9abc dexx */ ! 874: .align 4 ! 875: .mm0s3c3: ! 876: lwz bufA, -3(src) ! 877: lwz bufB, 1(src) ! 878: addi src, src, 1 ! 879: addi wordCount, wordCount, -1 ! 880: mtctr wordCount ! 881: rlwimi bufC, bufA, 24, 0, 7 ! 882: rlwimi bufC, bufB, 24, 8, 31 ! 883: stw bufC, 0(dst) ! 884: slwi bufA, bufB, 24 ! 885: ! 886: .mm0s3c3a: ! 887: lwz bufB, 4(src) ! 888: addi src, src, 4 ! 889: rlwimi bufA, bufB, 24, 8, 31 ! 890: stw bufA, 4(dst) ! 891: addi dst, dst, 4 ! 892: slwi bufA, bufB, 24 ! 893: bdnz .mm0s3c3a ! 894: ! 895: lwz bufB, 4(src) ! 896: lwz bufC, 4(dst) ! 897: rlwimi bufA, bufB, 24, 8, 31 ! 898: rlwimi bufC, bufA, 0, 0, 23 ! 899: stw bufC, 4(dst) ! 900: b bcopy_exit ! 901: ! 902: /* forward copy destination aligned at 1, source aligned at 0, byte count 0 */ ! 903: /* d = x012 3456 789a bxxx */ ! 904: /* s = 0123 4567 89ab xxxx */ ! 905: .align 4 ! 906: .mm1s0c0: ! 907: lwz bufA, 0(src) ! 908: lwz bufC, -1(dst) ! 909: addi wordCount, wordCount, -1 ! 910: mtctr wordCount ! 911: rlwimi bufC, bufA, 24, 8, 31 ! 912: stw bufC, -1(dst) ! 913: subi dst, dst, 1 ! 914: slwi bufA, bufA, 24 ! 915: ! 916: .mm1s0c0a: ! 917: lwz bufB, 4(src) ! 918: addi src, src, 4 ! 919: rlwimi bufA, bufB, 24, 8, 31 ! 920: stw bufA, 4(dst) ! 921: addi dst, dst, 4 ! 922: slwi bufA, bufB, 24 ! 923: bdnz .mm1s0c0a ! 924: ! 925: lwz bufC, 4(dst) ! 926: rlwimi bufC, bufA, 0, 0, 7 ! 927: stw bufC, 4(dst) ! 928: b bcopy_exit ! 929: ! 930: /* forward copy destination aligned at 1, source aligned at 0, byte count 1 */ ! 931: /* d = x012 3456 789a bcxx */ ! 932: /* s = 0123 4567 89ab cxxx */ ! 933: .align 4 ! 934: .mm1s0c1: ! 935: lwz bufA, 0(src) ! 936: lwz bufC, -1(dst) ! 937: addi wordCount, wordCount, -1 ! 938: mtctr wordCount ! 939: rlwimi bufC, bufA, 24, 8, 31 ! 940: stw bufC, -1(dst) ! 941: subi dst, dst, 1 ! 942: slwi bufA, bufA, 24 ! 943: ! 944: .mm1s0c1a: ! 945: lwz bufB, 4(src) ! 946: addi src, src, 4 ! 947: rlwimi bufA, bufB, 24, 8, 31 ! 948: stw bufA, 4(dst) ! 949: addi dst, dst, 4 ! 950: slwi bufA, bufB, 24 ! 951: bdnz .mm1s0c1a ! 952: ! 953: lwz bufB, 4(src) ! 954: lwz bufC, 4(dst) ! 955: rlwimi bufA, bufB, 24, 8, 31 ! 956: rlwimi bufC, bufA, 0, 0, 15 ! 957: stw bufC, 4(dst) ! 958: b bcopy_exit ! 959: ! 960: /* forward copy destination aligned at 1, source aligned at 0, byte count 2 */ ! 961: /* d = x012 3456 789a bcdx */ ! 962: /* s = 0123 4567 89ab cdxx */ ! 963: .align 4 ! 964: .mm1s0c2: ! 965: lwz bufA, 0(src) ! 966: lwz bufC, -1(dst) ! 967: addi wordCount, wordCount, -1 ! 968: mtctr wordCount ! 969: rlwimi bufC, bufA, 24, 8, 31 ! 970: stw bufC, -1(dst) ! 971: subi dst, dst, 1 ! 972: slwi bufA, bufA, 24 ! 973: ! 974: .mm1s0c2a: ! 975: lwz bufB, 4(src) ! 976: addi src, src, 4 ! 977: rlwimi bufA, bufB, 24, 8, 31 ! 978: stw bufA, 4(dst) ! 979: addi dst, dst, 4 ! 980: slwi bufA, bufB, 24 ! 981: bdnz .mm1s0c2a ! 982: ! 983: lwz bufB, 4(src) ! 984: lwz bufC, 4(dst) ! 985: rlwimi bufA, bufB, 24, 8, 31 ! 986: rlwimi bufC, bufA, 0, 0, 23 ! 987: stw bufC, 4(dst) ! 988: b bcopy_exit ! 989: ! 990: /* forward copy destination aligned at 1, source aligned at 0, byte count 3 */ ! 991: /* d = x012 3456 789a bcde xxxx */ ! 992: /* s = 0123 4567 89ab cdex */ ! 993: .align 4 ! 994: .mm1s0c3: ! 995: lwz bufA, 0(src) ! 996: lwz bufC, -1(dst) ! 997: mtctr wordCount ! 998: rlwimi bufC, bufA, 24, 8, 31 ! 999: stw bufC, -1(dst) ! 1000: subi dst, dst, 1 ! 1001: slwi bufA, bufA, 24 ! 1002: ! 1003: .mm1s0c3a: ! 1004: lwz bufB, 4(src) ! 1005: addi src, src, 4 ! 1006: rlwimi bufA, bufB, 24, 8, 31 ! 1007: stw bufA, 4(dst) ! 1008: addi dst, dst, 4 ! 1009: slwi bufA, bufB, 24 ! 1010: bdnz .mm1s0c3a ! 1011: ! 1012: b bcopy_exit ! 1013: ! 1014: /* forward copy destination aligned at 1, source aligned at 1, byte count 0 */ ! 1015: /* d = x012 3456 789a bxxx */ ! 1016: /* s = x012 3456 789a bxxx */ ! 1017: .align 4 ! 1018: .mm1s1c0: ! 1019: lwz bufA, -1(src) ! 1020: subi src, src, 1 ! 1021: lwz bufC, -1(dst) ! 1022: addi wordCount, wordCount, -1 ! 1023: mtctr wordCount ! 1024: rlwimi bufC, bufA, 0, 8, 31 ! 1025: stw bufC, -1(dst) ! 1026: subi dst, dst, 1 ! 1027: ! 1028: .mm1s1c0a: ! 1029: lwz bufA, 4(src) ! 1030: stw bufA, 4(dst) ! 1031: addi src, src, 4 ! 1032: addi dst, dst, 4 ! 1033: bdnz .mm1s1c0a ! 1034: ! 1035: lwz bufC, 4(dst) ! 1036: lwz bufA, 4(src) ! 1037: rlwimi bufC, bufA, 0, 0, 7 ! 1038: stw bufC, 4(dst) ! 1039: b bcopy_exit ! 1040: ! 1041: /* forward copy destination aligned at 1, source aligned at 1, byte count 1 */ ! 1042: /* d = x012 3456 789a bcxx */ ! 1043: /* s = x012 3456 789a bcxx */ ! 1044: .align 4 ! 1045: .mm1s1c1: ! 1046: lwz bufA, -1(src) ! 1047: subi src, src, 1 ! 1048: lwz bufC, -1(dst) ! 1049: addi wordCount, wordCount, -1 ! 1050: mtctr wordCount ! 1051: rlwimi bufC, bufA, 0, 8, 31 ! 1052: stw bufC, -1(dst) ! 1053: subi dst, dst, 1 ! 1054: ! 1055: .mm1s1c1a: ! 1056: lwz bufA, 4(src) ! 1057: stw bufA, 4(dst) ! 1058: addi src, src, 4 ! 1059: addi dst, dst, 4 ! 1060: bdnz .mm1s1c1a ! 1061: ! 1062: lwz bufC, 4(dst) ! 1063: lwz bufA, 4(src) ! 1064: rlwimi bufC, bufA, 0, 0, 15 ! 1065: stw bufC, 4(dst) ! 1066: b bcopy_exit ! 1067: ! 1068: /* forward copy destination aligned at 1, source aligned at 1, byte count 2 */ ! 1069: /* d = x012 3456 789a bcdx */ ! 1070: /* s = x012 3456 789a bcdx */ ! 1071: .align 4 ! 1072: .mm1s1c2: ! 1073: lwz bufA, -1(src) ! 1074: subi src, src, 1 ! 1075: lwz bufC, -1(dst) ! 1076: addi wordCount, wordCount, -1 ! 1077: mtctr wordCount ! 1078: rlwimi bufC, bufA, 0, 8, 31 ! 1079: stw bufC, -1(dst) ! 1080: subi dst, dst, 1 ! 1081: ! 1082: .mm1s1c2a: ! 1083: lwz bufA, 4(src) ! 1084: stw bufA, 4(dst) ! 1085: addi src, src, 4 ! 1086: addi dst, dst, 4 ! 1087: bdnz .mm1s1c2a ! 1088: ! 1089: lwz bufC, 4(dst) ! 1090: lwz bufA, 4(src) ! 1091: rlwimi bufC, bufA, 0, 0, 23 ! 1092: stw bufC, 4(dst) ! 1093: b bcopy_exit ! 1094: ! 1095: /* forward copy destination aligned at 1, source aligned at 1, byte count 3 */ ! 1096: /* d = x012 3456 789a bcde xxxx */ ! 1097: /* s = x012 3456 789a bcde xxxx */ ! 1098: .align 4 ! 1099: .mm1s1c3: ! 1100: lwz bufA, -1(src) ! 1101: subi src, src, 1 ! 1102: lwz bufC, -1(dst) ! 1103: mtctr wordCount ! 1104: rlwimi bufC, bufA, 0, 8, 31 ! 1105: stw bufC, -1(dst) ! 1106: subi dst, dst, 1 ! 1107: ! 1108: .mm1s1c3a: ! 1109: lwz bufA, 4(src) ! 1110: stw bufA, 4(dst) ! 1111: addi src, src, 4 ! 1112: addi dst, dst, 4 ! 1113: bdnz .mm1s1c3a ! 1114: ! 1115: b bcopy_exit ! 1116: ! 1117: /* forward copy destination aligned at 1, source aligned at 2, byte count 0 */ ! 1118: /* d = x012 3456 789a bxxx */ ! 1119: /* s = xx01 2345 6789 abxx */ ! 1120: .align 4 ! 1121: .mm1s2c0: ! 1122: lwz bufA, -2(src) ! 1123: lwz bufB, 2(src) ! 1124: addi src, src, 2 ! 1125: lwz bufC, -1(dst) ! 1126: addi wordCount, wordCount, -1 ! 1127: mtctr wordCount ! 1128: rlwimi bufC, bufA, 8, 8, 23 ! 1129: rlwimi bufC, bufB, 8, 24, 31 ! 1130: stw bufC, -1(dst) ! 1131: subi dst, dst, 1 ! 1132: slwi bufA, bufB, 8 ! 1133: ! 1134: .mm1s2c0a: ! 1135: lwz bufB, 4(src) ! 1136: addi src, src, 4 ! 1137: rlwimi bufA, bufB, 8, 24, 31 ! 1138: stw bufA, 4(dst) ! 1139: addi dst, dst, 4 ! 1140: slwi bufA, bufB, 8 ! 1141: bdnz .mm1s2c0a ! 1142: ! 1143: lwz bufC, 4(dst) ! 1144: rlwimi bufC, bufA, 0, 0, 7 ! 1145: stw bufC, 4(dst) ! 1146: b bcopy_exit ! 1147: ! 1148: /* forward copy destination aligned at 1, source aligned at 2, byte count 1 */ ! 1149: /* d = x012 3456 789a bcxx */ ! 1150: /* s = xx01 2345 6789 abcx */ ! 1151: .align 4 ! 1152: .mm1s2c1: ! 1153: lwz bufA, -2(src) ! 1154: lwz bufB, 2(src) ! 1155: addi src, src, 2 ! 1156: lwz bufC, -1(dst) ! 1157: addi wordCount, wordCount, -1 ! 1158: mtctr wordCount ! 1159: rlwimi bufC, bufA, 8, 8, 23 ! 1160: rlwimi bufC, bufB, 8, 24, 31 ! 1161: stw bufC, -1(dst) ! 1162: subi dst, dst, 1 ! 1163: slwi bufA, bufB, 8 ! 1164: ! 1165: .mm1s2c1a: ! 1166: lwz bufB, 4(src) ! 1167: addi src, src, 4 ! 1168: rlwimi bufA, bufB, 8, 24, 31 ! 1169: stw bufA, 4(dst) ! 1170: addi dst, dst, 4 ! 1171: slwi bufA, bufB, 8 ! 1172: bdnz .mm1s2c1a ! 1173: ! 1174: lwz bufC, 4(dst) ! 1175: rlwimi bufC, bufA, 0, 0, 15 ! 1176: stw bufC, 4(dst) ! 1177: b bcopy_exit ! 1178: ! 1179: /* forward copy destination aligned at 1, source aligned at 2, byte count 2 */ ! 1180: /* d = x012 3456 789a bcdx */ ! 1181: /* s = xx01 2345 6789 abcd xxxx */ ! 1182: .align 4 ! 1183: .mm1s2c2: ! 1184: lwz bufA, -2(src) ! 1185: lwz bufB, 2(src) ! 1186: addi src, src, 2 ! 1187: lwz bufC, -1(dst) ! 1188: addi wordCount, wordCount, -1 ! 1189: mtctr wordCount ! 1190: rlwimi bufC, bufA, 8, 8, 23 ! 1191: rlwimi bufC, bufB, 8, 24, 31 ! 1192: stw bufC, -1(dst) ! 1193: subi dst, dst, 1 ! 1194: slwi bufA, bufB, 8 ! 1195: ! 1196: .mm1s2c2a: ! 1197: lwz bufB, 4(src) ! 1198: addi src, src, 4 ! 1199: rlwimi bufA, bufB, 8, 24, 31 ! 1200: stw bufA, 4(dst) ! 1201: addi dst, dst, 4 ! 1202: slwi bufA, bufB, 8 ! 1203: bdnz .mm1s2c2a ! 1204: ! 1205: lwz bufC, 4(dst) ! 1206: rlwimi bufC, bufA, 0, 0, 23 ! 1207: stw bufC, 4(dst) ! 1208: b bcopy_exit ! 1209: ! 1210: /* forward copy destination aligned at 1, source aligned at 2, byte count 3 */ ! 1211: /* d = x012 3456 789a bcde xxxx */ ! 1212: /* s = xx01 2345 6789 abcd exxx */ ! 1213: .align 4 ! 1214: .mm1s2c3: ! 1215: lwz bufA, -2(src) ! 1216: lwz bufB, 2(src) ! 1217: addi src, src, 2 ! 1218: lwz bufC, -1(dst) ! 1219: mtctr wordCount ! 1220: rlwimi bufC, bufA, 8, 8, 23 ! 1221: rlwimi bufC, bufB, 8, 24, 31 ! 1222: stw bufC, -1(dst) ! 1223: subi dst, dst, 1 ! 1224: slwi bufA, bufB, 8 ! 1225: ! 1226: .mm1s2c3a: ! 1227: lwz bufB, 4(src) ! 1228: addi src, src, 4 ! 1229: rlwimi bufA, bufB, 8, 24, 31 ! 1230: stw bufA, 4(dst) ! 1231: addi dst, dst, 4 ! 1232: slwi bufA, bufB, 8 ! 1233: bdnz .mm1s2c3a ! 1234: ! 1235: b bcopy_exit ! 1236: ! 1237: /* forward copy destination aligned at 1, source aligned at 3, byte count 0 */ ! 1238: /* d = x012 3456 789a bxxx */ ! 1239: /* s = xxx0 1234 5678 9abx */ ! 1240: .align 4 ! 1241: .mm1s3c0: ! 1242: lwz bufA, -3(src) ! 1243: lwz bufB, 1(src) ! 1244: addi src, src, 1 ! 1245: lwz bufC, -1(dst) ! 1246: addi wordCount, wordCount, -1 ! 1247: mtctr wordCount ! 1248: rlwimi bufC, bufA, 16, 8, 15 ! 1249: rlwimi bufC, bufB, 16, 16, 31 ! 1250: stw bufC, -1(dst) ! 1251: subi dst, dst, 1 ! 1252: slwi bufA, bufB, 16 ! 1253: ! 1254: .mm1s3c0a: ! 1255: lwz bufB, 4(src) ! 1256: addi src, src, 4 ! 1257: rlwimi bufA, bufB, 16, 16, 31 ! 1258: stw bufA, 4(dst) ! 1259: addi dst, dst, 4 ! 1260: slwi bufA, bufB, 16 ! 1261: bdnz .mm1s3c0a ! 1262: ! 1263: lwz bufC, 4(dst) ! 1264: rlwimi bufC, bufA, 0, 0, 7 ! 1265: stw bufC, 4(dst) ! 1266: b bcopy_exit ! 1267: ! 1268: /* forward copy destination aligned at 1, source aligned at 3, byte count 1 */ ! 1269: /* d = x012 3456 789a bcxx */ ! 1270: /* s = xxx0 1234 5678 9abc xxxx */ ! 1271: .align 4 ! 1272: .mm1s3c1: ! 1273: lwz bufA, -3(src) ! 1274: lwz bufB, 1(src) ! 1275: addi src, src, 1 ! 1276: lwz bufC, -1(dst) ! 1277: addi wordCount, wordCount, -1 ! 1278: mtctr wordCount ! 1279: rlwimi bufC, bufA, 16, 8, 15 ! 1280: rlwimi bufC, bufB, 16, 16, 31 ! 1281: stw bufC, -1(dst) ! 1282: subi dst, dst, 1 ! 1283: slwi bufA, bufB, 16 ! 1284: ! 1285: .mm1s3c1a: ! 1286: lwz bufB, 4(src) ! 1287: addi src, src, 4 ! 1288: rlwimi bufA, bufB, 16, 16, 31 ! 1289: stw bufA, 4(dst) ! 1290: addi dst, dst, 4 ! 1291: slwi bufA, bufB, 16 ! 1292: bdnz .mm1s3c1a ! 1293: ! 1294: lwz bufC, 4(dst) ! 1295: rlwimi bufC, bufA, 0, 0, 15 ! 1296: stw bufC, 4(dst) ! 1297: b bcopy_exit ! 1298: ! 1299: /* forward copy destination aligned at 1, source aligned at 3, byte count 2 */ ! 1300: /* d = x012 3456 789a bcdx */ ! 1301: /* s = xxx0 1234 5678 9abc dxxx */ ! 1302: .align 4 ! 1303: .mm1s3c2: ! 1304: lwz bufA, -3(src) ! 1305: lwz bufB, 1(src) ! 1306: addi src, src, 1 ! 1307: lwz bufC, -1(dst) ! 1308: addi wordCount, wordCount, -1 ! 1309: mtctr wordCount ! 1310: rlwimi bufC, bufA, 16, 8, 15 ! 1311: rlwimi bufC, bufB, 16, 16, 31 ! 1312: stw bufC, -1(dst) ! 1313: subi dst, dst, 1 ! 1314: slwi bufA, bufB, 16 ! 1315: ! 1316: .mm1s3c2a: ! 1317: lwz bufB, 4(src) ! 1318: addi src, src, 4 ! 1319: rlwimi bufA, bufB, 16, 16, 31 ! 1320: stw bufA, 4(dst) ! 1321: addi dst, dst, 4 ! 1322: slwi bufA, bufB, 16 ! 1323: bdnz .mm1s3c2a ! 1324: ! 1325: lwz bufB, 4(src) ! 1326: lwz bufC, 4(dst) ! 1327: rlwimi bufA, bufB, 16, 16, 31 ! 1328: rlwimi bufC, bufA, 0, 0, 23 ! 1329: stw bufC, 4(dst) ! 1330: b bcopy_exit ! 1331: ! 1332: /* forward copy destination aligned at 1, source aligned at 3, byte count 3 */ ! 1333: /* d = x012 3456 789a bcde xxxx */ ! 1334: /* s = xxx0 1234 5678 9abc dexx */ ! 1335: .align 4 ! 1336: .mm1s3c3: ! 1337: lwz bufA, -3(src) ! 1338: lwz bufB, 1(src) ! 1339: addi src, src, 1 ! 1340: lwz bufC, -1(dst) ! 1341: mtctr wordCount ! 1342: rlwimi bufC, bufA, 16, 8, 15 ! 1343: rlwimi bufC, bufB, 16, 16, 31 ! 1344: stw bufC, -1(dst) ! 1345: subi dst, dst, 1 ! 1346: slwi bufA, bufB, 16 ! 1347: ! 1348: .mm1s3c3a: ! 1349: lwz bufB, 4(src) ! 1350: addi src, src, 4 ! 1351: rlwimi bufA, bufB, 16, 16, 31 ! 1352: stw bufA, 4(dst) ! 1353: addi dst, dst, 4 ! 1354: slwi bufA, bufB, 16 ! 1355: bdnz .mm1s3c3a ! 1356: ! 1357: b bcopy_exit ! 1358: ! 1359: /* forward copy destination aligned at 2, source aligned at 0, byte count 0 */ ! 1360: /* d = xx01 2345 6789 abxx */ ! 1361: /* s = 0123 4567 89ab xxxx */ ! 1362: .align 4 ! 1363: .mm2s0c0: ! 1364: lwz bufA, 0(src) ! 1365: lwz bufC, -2(dst) ! 1366: addi wordCount, wordCount, -1 ! 1367: mtctr wordCount ! 1368: rlwimi bufC, bufA, 16, 16, 31 ! 1369: stw bufC, -2(dst) ! 1370: subi dst, dst, 2 ! 1371: slwi bufA, bufA, 16 ! 1372: ! 1373: .mm2s0c0a: ! 1374: lwz bufB, 4(src) ! 1375: addi src, src, 4 ! 1376: rlwimi bufA, bufB, 16, 16, 31 ! 1377: stw bufA, 4(dst) ! 1378: addi dst, dst, 4 ! 1379: slwi bufA, bufB, 16 ! 1380: bdnz .mm2s0c0a ! 1381: ! 1382: lwz bufC, 4(dst) ! 1383: rlwimi bufC, bufA, 0, 0, 15 ! 1384: stw bufC, 4(dst) ! 1385: b bcopy_exit ! 1386: ! 1387: /* forward copy destination aligned at 2, source aligned at 0, byte count 1 */ ! 1388: /* d = xx01 2345 6789 abcx */ ! 1389: /* s = 0123 4567 89ab cxxx */ ! 1390: .align 4 ! 1391: .mm2s0c1: ! 1392: lwz bufA, 0(src) ! 1393: lwz bufC, -2(dst) ! 1394: addi wordCount, wordCount, -1 ! 1395: mtctr wordCount ! 1396: rlwimi bufC, bufA, 16, 16, 31 ! 1397: stw bufC, -2(dst) ! 1398: subi dst, dst, 2 ! 1399: slwi bufA, bufA, 16 ! 1400: ! 1401: .mm2s0c1a: ! 1402: lwz bufB, 4(src) ! 1403: addi src, src, 4 ! 1404: rlwimi bufA, bufB, 16, 16, 31 ! 1405: stw bufA, 4(dst) ! 1406: addi dst, dst, 4 ! 1407: slwi bufA, bufB, 16 ! 1408: bdnz .mm2s0c1a ! 1409: ! 1410: lwz bufB, 4(src) ! 1411: lwz bufC, 4(dst) ! 1412: rlwimi bufA, bufB, 16, 16, 31 ! 1413: rlwimi bufC, bufA, 0, 0, 23 ! 1414: stw bufC, 4(dst) ! 1415: b bcopy_exit ! 1416: ! 1417: /* forward copy destination aligned at 2, source aligned at 0, byte count 2 */ ! 1418: /* d = xx01 2345 6789 abcd xxxx */ ! 1419: /* s = 0123 4567 89ab cdxx */ ! 1420: .align 4 ! 1421: .mm2s0c2: ! 1422: lwz bufA, 0(src) ! 1423: lwz bufC, -2(dst) ! 1424: mtctr wordCount ! 1425: rlwimi bufC, bufA, 16, 16, 31 ! 1426: stw bufC, -2(dst) ! 1427: subi dst, dst, 2 ! 1428: slwi bufA, bufA, 16 ! 1429: ! 1430: .mm2s0c2a: ! 1431: lwz bufB, 4(src) ! 1432: addi src, src, 4 ! 1433: rlwimi bufA, bufB, 16, 16, 31 ! 1434: stw bufA, 4(dst) ! 1435: addi dst, dst, 4 ! 1436: slwi bufA, bufB, 16 ! 1437: bdnz .mm2s0c2a ! 1438: ! 1439: b bcopy_exit ! 1440: ! 1441: /* forward copy destination aligned at 2, source aligned at 0, byte count 3 */ ! 1442: /* d = xx01 2345 6789 abcd exxx */ ! 1443: /* s = 0123 4567 89ab cdex */ ! 1444: .align 4 ! 1445: .mm2s0c3: ! 1446: lwz bufA, 0(src) ! 1447: lwz bufC, -2(dst) ! 1448: mtctr wordCount ! 1449: rlwimi bufC, bufA, 16, 16, 31 ! 1450: stw bufC, -2(dst) ! 1451: subi dst, dst, 2 ! 1452: slwi bufA, bufA, 16 ! 1453: ! 1454: .mm2s0c3a: ! 1455: lwz bufB, 4(src) ! 1456: addi src, src, 4 ! 1457: rlwimi bufA, bufB, 16, 16, 31 ! 1458: stw bufA, 4(dst) ! 1459: addi dst, dst, 4 ! 1460: slwi bufA, bufB, 16 ! 1461: bdnz .mm2s0c3a ! 1462: ! 1463: lwz bufC, 4(dst) ! 1464: rlwimi bufC, bufA, 0, 0, 7 ! 1465: stw bufC, 4(dst) ! 1466: b bcopy_exit ! 1467: ! 1468: /* forward copy destination aligned at 2, source aligned at 1, byte count 0 */ ! 1469: /* d = xx01 2345 6789 abxx */ ! 1470: /* s = x012 3456 789a bxxx */ ! 1471: .align 4 ! 1472: .mm2s1c0: ! 1473: lwz bufA, -1(src) ! 1474: subi src, src, 1 ! 1475: lwz bufC, -2(dst) ! 1476: addi wordCount, wordCount, -1 ! 1477: mtctr wordCount ! 1478: rlwimi bufC, bufA, 24, 16, 31 ! 1479: stw bufC, -2(dst) ! 1480: subi dst, dst, 2 ! 1481: slwi bufA, bufA, 24 ! 1482: ! 1483: .mm2s1c0a: ! 1484: lwz bufB, 4(src) ! 1485: addi src, src, 4 ! 1486: rlwimi bufA, bufB, 24, 8, 31 ! 1487: stw bufA, 4(dst) ! 1488: addi dst, dst, 4 ! 1489: slwi bufA, bufB, 24 ! 1490: bdnz .mm2s1c0a ! 1491: ! 1492: lwz bufB, 4(src) ! 1493: lwz bufC, 4(dst) ! 1494: rlwimi bufA, bufB, 24, 8, 31 ! 1495: rlwimi bufC, bufA, 0, 0, 15 ! 1496: stw bufC, 4(dst) ! 1497: b bcopy_exit ! 1498: ! 1499: /* forward copy destination aligned at 2, source aligned at 1, byte count 1 */ ! 1500: /* d = xx01 2345 6789 abcx */ ! 1501: /* s = x012 3456 789a bcxx */ ! 1502: .align 4 ! 1503: .mm2s1c1: ! 1504: lwz bufA, -1(src) ! 1505: subi src, src, 1 ! 1506: lwz bufC, -2(dst) ! 1507: addi wordCount, wordCount, -1 ! 1508: mtctr wordCount ! 1509: rlwimi bufC, bufA, 24, 16, 31 ! 1510: stw bufC, -2(dst) ! 1511: subi dst, dst, 2 ! 1512: slwi bufA, bufA, 24 ! 1513: ! 1514: .mm2s1c1a: ! 1515: lwz bufB, 4(src) ! 1516: addi src, src, 4 ! 1517: rlwimi bufA, bufB, 24, 8, 31 ! 1518: stw bufA, 4(dst) ! 1519: addi dst, dst, 4 ! 1520: slwi bufA, bufB, 24 ! 1521: bdnz .mm2s1c1a ! 1522: ! 1523: lwz bufB, 4(src) ! 1524: lwz bufC, 4(dst) ! 1525: rlwimi bufA, bufB, 24, 8, 31 ! 1526: rlwimi bufC, bufA, 0, 0, 23 ! 1527: stw bufC, 4(dst) ! 1528: b bcopy_exit ! 1529: ! 1530: /* forward copy destination aligned at 2, source aligned at 1, byte count 2 */ ! 1531: /* d = xx01 2345 6789 abcd xxxx */ ! 1532: /* s = x012 3456 789a bcdx */ ! 1533: .align 4 ! 1534: .mm2s1c2: ! 1535: lwz bufA, -1(src) ! 1536: subi src, src, 1 ! 1537: lwz bufC, -2(dst) ! 1538: mtctr wordCount ! 1539: rlwimi bufC, bufA, 24, 16, 31 ! 1540: stw bufC, -2(dst) ! 1541: subi dst, dst, 2 ! 1542: slwi bufA, bufA, 24 ! 1543: ! 1544: .mm2s1c2a: ! 1545: lwz bufB, 4(src) ! 1546: addi src, src, 4 ! 1547: rlwimi bufA, bufB, 24, 8, 31 ! 1548: stw bufA, 4(dst) ! 1549: addi dst, dst, 4 ! 1550: slwi bufA, bufB, 24 ! 1551: bdnz .mm2s1c2a ! 1552: ! 1553: b bcopy_exit ! 1554: ! 1555: /* forward copy destination aligned at 2, source aligned at 1, byte count 3 */ ! 1556: /* d = xx01 2345 6789 abcd exxx */ ! 1557: /* s = x012 3456 789a bcde xxxx */ ! 1558: .align 4 ! 1559: .mm2s1c3: ! 1560: lwz bufA, -1(src) ! 1561: subi src, src, 1 ! 1562: lwz bufC, -2(dst) ! 1563: mtctr wordCount ! 1564: rlwimi bufC, bufA, 24, 16, 31 ! 1565: stw bufC, -2(dst) ! 1566: subi dst, dst, 2 ! 1567: slwi bufA, bufA, 24 ! 1568: ! 1569: .mm2s1c3a: ! 1570: lwz bufB, 4(src) ! 1571: addi src, src, 4 ! 1572: rlwimi bufA, bufB, 24, 8, 31 ! 1573: stw bufA, 4(dst) ! 1574: addi dst, dst, 4 ! 1575: slwi bufA, bufB, 24 ! 1576: bdnz .mm2s1c3a ! 1577: ! 1578: lwz bufC, 4(dst) ! 1579: rlwimi bufC, bufA, 0, 0, 7 ! 1580: stw bufC, 4(dst) ! 1581: b bcopy_exit ! 1582: ! 1583: /* forward copy destination aligned at 2, source aligned at 2, byte count 0 */ ! 1584: /* d = xx01 2345 6789 abxx */ ! 1585: /* s = xx01 2345 6789 abxx */ ! 1586: .align 4 ! 1587: .mm2s2c0: ! 1588: lwz bufA, -2(src) ! 1589: subi src, src, 2 ! 1590: lwz bufC, -2(dst) ! 1591: addi wordCount, wordCount, -1 ! 1592: mtctr wordCount ! 1593: rlwimi bufC, bufA, 0, 16, 31 ! 1594: stw bufC, -2(dst) ! 1595: subi dst, dst, 2 ! 1596: ! 1597: .mm2s2c0a: ! 1598: lwz bufA, 4(src) ! 1599: stw bufA, 4(dst) ! 1600: addi src, src, 4 ! 1601: addi dst, dst, 4 ! 1602: bdnz .mm2s2c0a ! 1603: ! 1604: lwz bufC, 4(dst) ! 1605: lwz bufA, 4(src) ! 1606: rlwimi bufC, bufA, 0, 0, 15 ! 1607: stw bufC, 4(dst) ! 1608: b bcopy_exit ! 1609: ! 1610: /* forward copy destination aligned at 2, source aligned at 2, byte count 1 */ ! 1611: /* d = xx01 2345 6789 abcx */ ! 1612: /* s = xx01 2345 6789 abcx */ ! 1613: .align 4 ! 1614: .mm2s2c1: ! 1615: lwz bufA, -2(src) ! 1616: subi src, src, 2 ! 1617: lwz bufC, -2(dst) ! 1618: addi wordCount, wordCount, -1 ! 1619: mtctr wordCount ! 1620: rlwimi bufC, bufA, 0, 16, 31 ! 1621: stw bufC, -2(dst) ! 1622: subi dst, dst, 2 ! 1623: ! 1624: .mm2s2c1a: ! 1625: lwz bufA, 4(src) ! 1626: stw bufA, 4(dst) ! 1627: addi src, src, 4 ! 1628: addi dst, dst, 4 ! 1629: bdnz .mm2s2c1a ! 1630: ! 1631: lwz bufC, 4(dst) ! 1632: lwz bufA, 4(src) ! 1633: rlwimi bufC, bufA, 0, 0, 23 ! 1634: stw bufC, 4(dst) ! 1635: b bcopy_exit ! 1636: ! 1637: /* forward copy destination aligned at 2, source aligned at 2, byte count 2 */ ! 1638: /* d = xx01 2345 6789 abcd xxxx */ ! 1639: /* s = xx01 2345 6789 abcd xxxx */ ! 1640: .align 4 ! 1641: .mm2s2c2: ! 1642: lwz bufA, -2(src) ! 1643: subi src, src, 2 ! 1644: lwz bufC, -2(dst) ! 1645: mtctr wordCount ! 1646: rlwimi bufC, bufA, 0, 16, 31 ! 1647: stw bufC, -2(dst) ! 1648: subi dst, dst, 2 ! 1649: ! 1650: .mm2s2c2a: ! 1651: lwz bufA, 4(src) ! 1652: stw bufA, 4(dst) ! 1653: addi src, src, 4 ! 1654: addi dst, dst, 4 ! 1655: bdnz .mm2s2c2a ! 1656: ! 1657: b bcopy_exit ! 1658: ! 1659: /* forward copy destination aligned at 2, source aligned at 2, byte count 3 */ ! 1660: /* d = xx01 2345 6789 abcd exxx */ ! 1661: /* s = xx01 2345 6789 abcd exxx */ ! 1662: .align 4 ! 1663: .mm2s2c3: ! 1664: lwz bufA, -2(src) ! 1665: subi src, src, 2 ! 1666: lwz bufC, -2(dst) ! 1667: mtctr wordCount ! 1668: rlwimi bufC, bufA, 0, 16, 31 ! 1669: stw bufC, -2(dst) ! 1670: subi dst, dst, 2 ! 1671: ! 1672: .mm2s2c3a: ! 1673: lwz bufA, 4(src) ! 1674: stw bufA, 4(dst) ! 1675: addi src, src, 4 ! 1676: addi dst, dst, 4 ! 1677: bdnz .mm2s2c3a ! 1678: ! 1679: lwz bufC, 4(dst) ! 1680: lwz bufA, 4(src) ! 1681: rlwimi bufC, bufA, 0, 0, 7 ! 1682: stw bufC, 4(dst) ! 1683: b bcopy_exit ! 1684: ! 1685: /* forward copy destination aligned at 2, source aligned at 3, byte count 0 */ ! 1686: /* d = xx01 2345 6789 abxx */ ! 1687: /* s = xxx0 1234 5678 9abx */ ! 1688: .align 4 ! 1689: .mm2s3c0: ! 1690: lwz bufA, -3(src) ! 1691: lwz bufB, 1(src) ! 1692: addi src, src, 1 ! 1693: lwz bufC, -2(dst) ! 1694: addi wordCount, wordCount, -1 ! 1695: mtctr wordCount ! 1696: rlwimi bufC, bufA, 8, 16, 23 ! 1697: rlwimi bufC, bufB, 8, 24, 31 ! 1698: stw bufC, -2(dst) ! 1699: subi dst, dst, 2 ! 1700: slwi bufA, bufB, 8 ! 1701: ! 1702: .mm2s3c0a: ! 1703: lwz bufB, 4(src) ! 1704: addi src, src, 4 ! 1705: rlwimi bufA, bufB, 8, 24, 31 ! 1706: stw bufA, 4(dst) ! 1707: addi dst, dst, 4 ! 1708: slwi bufA, bufB, 8 ! 1709: bdnz .mm2s3c0a ! 1710: ! 1711: lwz bufC, 4(dst) ! 1712: rlwimi bufC, bufA, 0, 0, 15 ! 1713: stw bufC, 4(dst) ! 1714: b bcopy_exit ! 1715: ! 1716: /* forward copy destination aligned at 2, source aligned at 3, byte count 1 */ ! 1717: /* d = xx01 2345 6789 abcx */ ! 1718: /* s = xxx0 1234 5678 9abc xxxx */ ! 1719: .align 4 ! 1720: .mm2s3c1: ! 1721: lwz bufA, -3(src) ! 1722: lwz bufB, 1(src) ! 1723: addi src, src, 1 ! 1724: lwz bufC, -2(dst) ! 1725: addi wordCount, wordCount, -1 ! 1726: mtctr wordCount ! 1727: rlwimi bufC, bufA, 8, 16, 23 ! 1728: rlwimi bufC, bufB, 8, 24, 31 ! 1729: stw bufC, -2(dst) ! 1730: subi dst, dst, 2 ! 1731: slwi bufA, bufB, 8 ! 1732: ! 1733: .mm2s3c1a: ! 1734: lwz bufB, 4(src) ! 1735: addi src, src, 4 ! 1736: rlwimi bufA, bufB, 8, 24, 31 ! 1737: stw bufA, 4(dst) ! 1738: addi dst, dst, 4 ! 1739: slwi bufA, bufB, 8 ! 1740: bdnz .mm2s3c1a ! 1741: ! 1742: lwz bufC, 4(dst) ! 1743: rlwimi bufC, bufA, 0, 0, 23 ! 1744: stw bufC, 4(dst) ! 1745: b bcopy_exit ! 1746: ! 1747: /* forward copy destination aligned at 2, source aligned at 3, byte count 2 */ ! 1748: /* d = xx01 2345 6789 abcd xxxx */ ! 1749: /* s = xxx0 1234 5678 9abc dxxx */ ! 1750: .align 4 ! 1751: .mm2s3c2: ! 1752: lwz bufA, -3(src) ! 1753: lwz bufB, 1(src) ! 1754: addi src, src, 1 ! 1755: lwz bufC, -2(dst) ! 1756: mtctr wordCount ! 1757: rlwimi bufC, bufA, 8, 16, 23 ! 1758: rlwimi bufC, bufB, 8, 24, 31 ! 1759: stw bufC, -2(dst) ! 1760: subi dst, dst, 2 ! 1761: slwi bufA, bufB, 8 ! 1762: ! 1763: .mm2s3c2a: ! 1764: lwz bufB, 4(src) ! 1765: addi src, src, 4 ! 1766: rlwimi bufA, bufB, 8, 24, 31 ! 1767: stw bufA, 4(dst) ! 1768: addi dst, dst, 4 ! 1769: slwi bufA, bufB, 8 ! 1770: bdnz .mm2s3c2a ! 1771: ! 1772: b bcopy_exit ! 1773: ! 1774: /* forward copy destination aligned at 2, source aligned at 3, byte count 3 */ ! 1775: /* d = xx01 2345 6789 abcd exxx */ ! 1776: /* s = xxx0 1234 5678 9abc dexx */ ! 1777: .align 4 ! 1778: .mm2s3c3: ! 1779: lwz bufA, -3(src) ! 1780: lwz bufB, 1(src) ! 1781: addi src, src, 1 ! 1782: lwz bufC, -2(dst) ! 1783: mtctr wordCount ! 1784: rlwimi bufC, bufA, 8, 16, 23 ! 1785: rlwimi bufC, bufB, 8, 24, 31 ! 1786: stw bufC, -2(dst) ! 1787: subi dst, dst, 2 ! 1788: slwi bufA, bufB, 8 ! 1789: ! 1790: .mm2s3c3a: ! 1791: lwz bufB, 4(src) ! 1792: addi src, src, 4 ! 1793: rlwimi bufA, bufB, 8, 24, 31 ! 1794: stw bufA, 4(dst) ! 1795: addi dst, dst, 4 ! 1796: slwi bufA, bufB, 8 ! 1797: bdnz .mm2s3c3a ! 1798: ! 1799: lwz bufC, 4(dst) ! 1800: rlwimi bufC, bufA, 0, 0, 7 ! 1801: stw bufC, 4(dst) ! 1802: b bcopy_exit ! 1803: ! 1804: /* forward copy destination aligned at 3, source aligned at 0, byte count 0 */ ! 1805: /* d = xxx0 1234 5678 9abx */ ! 1806: /* s = 0123 4567 89ab xxxx */ ! 1807: .align 4 ! 1808: .mm3s0c0: ! 1809: lwz bufA, 0(src) ! 1810: lwz bufC, -3(dst) ! 1811: addi wordCount, wordCount, -1 ! 1812: mtctr wordCount ! 1813: rlwimi bufC, bufA, 8, 24, 31 ! 1814: stw bufC, -3(dst) ! 1815: subi dst, dst, 3 ! 1816: slwi bufA, bufA, 8 ! 1817: ! 1818: .mm3s0c0a: ! 1819: lwz bufB, 4(src) ! 1820: addi src, src, 4 ! 1821: rlwimi bufA, bufB, 8, 24, 31 ! 1822: stw bufA, 4(dst) ! 1823: addi dst, dst, 4 ! 1824: slwi bufA, bufB, 8 ! 1825: bdnz .mm3s0c0a ! 1826: ! 1827: lwz bufC, 4(dst) ! 1828: rlwimi bufC, bufA, 0, 0, 23 ! 1829: stw bufC, 4(dst) ! 1830: b bcopy_exit ! 1831: ! 1832: /* forward copy destination aligned at 3, source aligned at 0, byte count 1 */ ! 1833: /* d = xxx0 1234 5678 9abc xxxx */ ! 1834: /* s = 0123 4567 89ab cxxx */ ! 1835: .align 4 ! 1836: .mm3s0c1: ! 1837: lwz bufA, 0(src) ! 1838: lwz bufC, -3(dst) ! 1839: mtctr wordCount ! 1840: rlwimi bufC, bufA, 8, 24, 31 ! 1841: stw bufC, -3(dst) ! 1842: subi dst, dst, 3 ! 1843: slwi bufA, bufA, 8 ! 1844: ! 1845: .mm3s0c1a: ! 1846: lwz bufB, 4(src) ! 1847: addi src, src, 4 ! 1848: rlwimi bufA, bufB, 8, 24, 31 ! 1849: stw bufA, 4(dst) ! 1850: addi dst, dst, 4 ! 1851: slwi bufA, bufB, 8 ! 1852: bdnz .mm3s0c1a ! 1853: ! 1854: b bcopy_exit ! 1855: ! 1856: /* forward copy destination aligned at 3, source aligned at 0, byte count 2 */ ! 1857: /* d = xxx0 1234 5678 9abc dxxx */ ! 1858: /* s = 0123 4567 89ab cdxx */ ! 1859: .align 4 ! 1860: .mm3s0c2: ! 1861: lwz bufA, 0(src) ! 1862: lwz bufC, -3(dst) ! 1863: mtctr wordCount ! 1864: rlwimi bufC, bufA, 8, 24, 31 ! 1865: stw bufC, -3(dst) ! 1866: subi dst, dst, 3 ! 1867: slwi bufA, bufA, 8 ! 1868: ! 1869: .mm3s0c2a: ! 1870: lwz bufB, 4(src) ! 1871: addi src, src, 4 ! 1872: rlwimi bufA, bufB, 8, 24, 31 ! 1873: stw bufA, 4(dst) ! 1874: addi dst, dst, 4 ! 1875: slwi bufA, bufB, 8 ! 1876: bdnz .mm3s0c2a ! 1877: ! 1878: lwz bufC, 4(dst) ! 1879: rlwimi bufC, bufA, 0, 0, 7 ! 1880: stw bufC, 4(dst) ! 1881: b bcopy_exit ! 1882: ! 1883: /* forward copy destination aligned at 3, source aligned at 0, byte count 3 */ ! 1884: /* d = xxx0 1234 5678 9abc dexx */ ! 1885: /* s = 0123 4567 89ab cdex */ ! 1886: .align 4 ! 1887: .mm3s0c3: ! 1888: lwz bufA, 0(src) ! 1889: lwz bufC, -3(dst) ! 1890: mtctr wordCount ! 1891: rlwimi bufC, bufA, 8, 24, 31 ! 1892: stw bufC, -3(dst) ! 1893: subi dst, dst, 3 ! 1894: slwi bufA, bufA, 8 ! 1895: ! 1896: .mm3s0c3a: ! 1897: lwz bufB, 4(src) ! 1898: addi src, src, 4 ! 1899: rlwimi bufA, bufB, 8, 24, 31 ! 1900: stw bufA, 4(dst) ! 1901: addi dst, dst, 4 ! 1902: slwi bufA, bufB, 8 ! 1903: bdnz .mm3s0c3a ! 1904: ! 1905: lwz bufC, 4(dst) ! 1906: rlwimi bufC, bufA, 0, 0, 15 ! 1907: stw bufC, 4(dst) ! 1908: b bcopy_exit ! 1909: ! 1910: /* forward copy destination aligned at 3, source aligned at 1, byte count 0 */ ! 1911: /* d = xxx0 1234 5678 9abx */ ! 1912: /* s = x012 3456 789a bxxx */ ! 1913: .align 4 ! 1914: .mm3s1c0: ! 1915: lwz bufA, -1(src) ! 1916: subi src, src, 1 ! 1917: lwz bufC, -3(dst) ! 1918: addi wordCount, wordCount, -1 ! 1919: mtctr wordCount ! 1920: rlwimi bufC, bufA, 16, 24, 31 ! 1921: stw bufC, -3(dst) ! 1922: subi dst, dst, 3 ! 1923: slwi bufA, bufA, 16 ! 1924: ! 1925: .mm3s1c0a: ! 1926: lwz bufB, 4(src) ! 1927: addi src, src, 4 ! 1928: rlwimi bufA, bufB, 16, 16, 31 ! 1929: stw bufA, 4(dst) ! 1930: addi dst, dst, 4 ! 1931: slwi bufA, bufB, 16 ! 1932: bdnz .mm3s1c0a ! 1933: ! 1934: lwz bufB, 4(src) ! 1935: lwz bufC, 4(dst) ! 1936: rlwimi bufA, bufB, 16, 16, 31 ! 1937: rlwimi bufC, bufA, 0, 0, 23 ! 1938: stw bufC, 4(dst) ! 1939: b bcopy_exit ! 1940: ! 1941: /* forward copy destination aligned at 3, source aligned at 1, byte count 1 */ ! 1942: /* d = xxx0 1234 5678 9abc xxxx */ ! 1943: /* s = x012 3456 789a bcxx */ ! 1944: .align 4 ! 1945: .mm3s1c1: ! 1946: lwz bufA, -1(src) ! 1947: subi src, src, 1 ! 1948: lwz bufC, -3(dst) ! 1949: mtctr wordCount ! 1950: rlwimi bufC, bufA, 16, 24, 31 ! 1951: stw bufC, -3(dst) ! 1952: subi dst, dst, 3 ! 1953: slwi bufA, bufA, 16 ! 1954: ! 1955: .mm3s1c1a: ! 1956: lwz bufB, 4(src) ! 1957: addi src, src, 4 ! 1958: rlwimi bufA, bufB, 16, 16, 31 ! 1959: stw bufA, 4(dst) ! 1960: addi dst, dst, 4 ! 1961: slwi bufA, bufB, 16 ! 1962: bdnz .mm3s1c1a ! 1963: ! 1964: b bcopy_exit ! 1965: ! 1966: /* forward copy destination aligned at 3, source aligned at 1, byte count 2 */ ! 1967: /* d = xxx0 1234 5678 9abc dxxx */ ! 1968: /* s = x012 3456 789a bcdx */ ! 1969: .align 4 ! 1970: .mm3s1c2: ! 1971: lwz bufA, -1(src) ! 1972: subi src, src, 1 ! 1973: lwz bufC, -3(dst) ! 1974: mtctr wordCount ! 1975: rlwimi bufC, bufA, 16, 24, 31 ! 1976: stw bufC, -3(dst) ! 1977: subi dst, dst, 3 ! 1978: slwi bufA, bufA, 16 ! 1979: ! 1980: .mm3s1c2a: ! 1981: lwz bufB, 4(src) ! 1982: addi src, src, 4 ! 1983: rlwimi bufA, bufB, 16, 16, 31 ! 1984: stw bufA, 4(dst) ! 1985: addi dst, dst, 4 ! 1986: slwi bufA, bufB, 16 ! 1987: bdnz .mm3s1c2a ! 1988: ! 1989: lwz bufC, 4(dst) ! 1990: rlwimi bufC, bufA, 0, 0, 7 ! 1991: stw bufC, 4(dst) ! 1992: b bcopy_exit ! 1993: ! 1994: /* forward copy destination aligned at 3, source aligned at 1, byte count 3 */ ! 1995: /* d = xxx0 1234 5678 9abc dexx */ ! 1996: /* s = x012 3456 789a bcde xxxx */ ! 1997: .align 4 ! 1998: .mm3s1c3: ! 1999: lwz bufA, -1(src) ! 2000: subi src, src, 1 ! 2001: lwz bufC, -3(dst) ! 2002: mtctr wordCount ! 2003: rlwimi bufC, bufA, 16, 24, 31 ! 2004: stw bufC, -3(dst) ! 2005: subi dst, dst, 3 ! 2006: slwi bufA, bufA, 16 ! 2007: ! 2008: .mm3s1c3a: ! 2009: lwz bufB, 4(src) ! 2010: addi src, src, 4 ! 2011: rlwimi bufA, bufB, 16, 16, 31 ! 2012: stw bufA, 4(dst) ! 2013: addi dst, dst, 4 ! 2014: slwi bufA, bufB, 16 ! 2015: bdnz .mm3s1c3a ! 2016: ! 2017: lwz bufC, 4(dst) ! 2018: rlwimi bufC, bufA, 0, 0, 15 ! 2019: stw bufC, 4(dst) ! 2020: b bcopy_exit ! 2021: ! 2022: /* forward copy destination aligned at 3, source aligned at 2, byte count 0 */ ! 2023: /* d = xxx0 1234 5678 9abx */ ! 2024: /* s = xx01 2345 6789 abxx */ ! 2025: .align 4 ! 2026: .mm3s2c0: ! 2027: lwz bufA, -2(src) ! 2028: subi src, src, 2 ! 2029: lwz bufC, -3(dst) ! 2030: addi wordCount, wordCount, -1 ! 2031: mtctr wordCount ! 2032: rlwimi bufC, bufA, 24, 24, 31 ! 2033: stw bufC, -3(dst) ! 2034: subi dst, dst, 3 ! 2035: slwi bufA, bufA, 24 ! 2036: ! 2037: .mm3s2c0a: ! 2038: lwz bufB, 4(src) ! 2039: addi src, src, 4 ! 2040: rlwimi bufA, bufB, 24, 8, 31 ! 2041: stw bufA, 4(dst) ! 2042: addi dst, dst, 4 ! 2043: slwi bufA, bufB, 24 ! 2044: bdnz .mm3s2c0a ! 2045: ! 2046: lwz bufB, 4(src) ! 2047: lwz bufC, 4(dst) ! 2048: rlwimi bufA, bufB, 24, 8, 31 ! 2049: rlwimi bufC, bufA, 0, 0, 23 ! 2050: stw bufC, 4(dst) ! 2051: b bcopy_exit ! 2052: ! 2053: /* forward copy destination aligned at 3, source aligned at 2, byte count 1 */ ! 2054: /* d = xxx0 1234 5678 9abc xxxx */ ! 2055: /* s = xx01 2345 6789 abcx */ ! 2056: .align 4 ! 2057: .mm3s2c1: ! 2058: lwz bufA, -2(src) ! 2059: subi src, src, 2 ! 2060: lwz bufC, -3(dst) ! 2061: mtctr wordCount ! 2062: rlwimi bufC, bufA, 24, 24, 31 ! 2063: stw bufC, -3(dst) ! 2064: subi dst, dst, 3 ! 2065: slwi bufA, bufA, 24 ! 2066: ! 2067: .mm3s2c1a: ! 2068: lwz bufB, 4(src) ! 2069: addi src, src, 4 ! 2070: rlwimi bufA, bufB, 24, 8, 31 ! 2071: stw bufA, 4(dst) ! 2072: addi dst, dst, 4 ! 2073: slwi bufA, bufB, 24 ! 2074: bdnz .mm3s2c1a ! 2075: ! 2076: b bcopy_exit ! 2077: ! 2078: /* forward copy destination aligned at 3, source aligned at 2, byte count 2 */ ! 2079: /* d = xxx0 1234 5678 9abc dxxx */ ! 2080: /* s = xx01 2345 6789 abcd xxxx */ ! 2081: .align 4 ! 2082: .mm3s2c2: ! 2083: lwz bufA, -2(src) ! 2084: subi src, src, 2 ! 2085: lwz bufC, -3(dst) ! 2086: mtctr wordCount ! 2087: rlwimi bufC, bufA, 24, 24, 31 ! 2088: stw bufC, -3(dst) ! 2089: subi dst, dst, 3 ! 2090: slwi bufA, bufA, 24 ! 2091: ! 2092: .mm3s2c2a: ! 2093: lwz bufB, 4(src) ! 2094: addi src, src, 4 ! 2095: rlwimi bufA, bufB, 24, 8, 31 ! 2096: stw bufA, 4(dst) ! 2097: addi dst, dst, 4 ! 2098: slwi bufA, bufB, 24 ! 2099: bdnz .mm3s2c2a ! 2100: ! 2101: lwz bufC, 4(dst) ! 2102: rlwimi bufC, bufA, 0, 0, 7 ! 2103: stw bufC, 4(dst) ! 2104: b bcopy_exit ! 2105: ! 2106: /* forward copy destination aligned at 3, source aligned at 2, byte count 3 */ ! 2107: /* d = xxx0 1234 5678 9abc dexx */ ! 2108: /* s = xx01 2345 6789 abcd exxx */ ! 2109: .align 4 ! 2110: .mm3s2c3: ! 2111: lwz bufA, -2(src) ! 2112: subi src, src, 2 ! 2113: lwz bufC, -3(dst) ! 2114: mtctr wordCount ! 2115: rlwimi bufC, bufA, 24, 24, 31 ! 2116: stw bufC, -3(dst) ! 2117: subi dst, dst, 3 ! 2118: slwi bufA, bufA, 24 ! 2119: ! 2120: .mm3s2c3a: ! 2121: lwz bufB, 4(src) ! 2122: addi src, src, 4 ! 2123: rlwimi bufA, bufB, 24, 8, 31 ! 2124: stw bufA, 4(dst) ! 2125: addi dst, dst, 4 ! 2126: slwi bufA, bufB, 24 ! 2127: bdnz .mm3s2c3a ! 2128: ! 2129: lwz bufB, 4(src) ! 2130: lwz bufC, 4(dst) ! 2131: rlwimi bufA, bufB, 24, 8, 31 ! 2132: rlwimi bufC, bufA, 0, 0, 15 ! 2133: stw bufC, 4(dst) ! 2134: b bcopy_exit ! 2135: ! 2136: /* forward copy destination aligned at 3, source aligned at 3, byte count 0 */ ! 2137: /* d = xxx0 1234 5678 9abx */ ! 2138: /* s = xxx0 1234 5678 9abx */ ! 2139: .align 4 ! 2140: .mm3s3c0: ! 2141: lwz bufA, -3(src) ! 2142: subi src, src, 3 ! 2143: lwz bufC, -3(dst) ! 2144: addi wordCount, wordCount, -1 ! 2145: mtctr wordCount ! 2146: rlwimi bufC, bufA, 0, 24, 31 ! 2147: stw bufC, -3(dst) ! 2148: subi dst, dst, 3 ! 2149: ! 2150: .mm3s3c0a: ! 2151: lwz bufA, 4(src) ! 2152: stw bufA, 4(dst) ! 2153: addi src, src, 4 ! 2154: addi dst, dst, 4 ! 2155: bdnz .mm3s3c0a ! 2156: ! 2157: lwz bufC, 4(dst) ! 2158: lwz bufA, 4(src) ! 2159: rlwimi bufC, bufA, 0, 0, 23 ! 2160: stw bufC, 4(dst) ! 2161: b bcopy_exit ! 2162: ! 2163: /* forward copy destination aligned at 3, source aligned at 3, byte count 1 */ ! 2164: /* d = xxx0 1234 5678 9abc xxxx */ ! 2165: /* s = xxx0 1234 5678 9abc xxxx */ ! 2166: .align 4 ! 2167: .mm3s3c1: ! 2168: lwz bufA, -3(src) ! 2169: subi src, src, 3 ! 2170: lwz bufC, -3(dst) ! 2171: mtctr wordCount ! 2172: rlwimi bufC, bufA, 0, 24, 31 ! 2173: stw bufC, -3(dst) ! 2174: subi dst, dst, 3 ! 2175: ! 2176: .mm3s3c1a: ! 2177: lwz bufA, 4(src) ! 2178: stw bufA, 4(dst) ! 2179: addi src, src, 4 ! 2180: addi dst, dst, 4 ! 2181: bdnz .mm3s3c1a ! 2182: ! 2183: b bcopy_exit ! 2184: ! 2185: /* forward copy destination aligned at 3, source aligned at 3, byte count 2 */ ! 2186: /* d = xxx0 1234 5678 9abc dxxx */ ! 2187: /* s = xxx0 1234 5678 9abc dxxx */ ! 2188: .align 4 ! 2189: .mm3s3c2: ! 2190: lwz bufA, -3(src) ! 2191: subi src, src, 3 ! 2192: lwz bufC, -3(dst) ! 2193: mtctr wordCount ! 2194: rlwimi bufC, bufA, 0, 24, 31 ! 2195: stw bufC, -3(dst) ! 2196: subi dst, dst, 3 ! 2197: ! 2198: .mm3s3c2a: ! 2199: lwz bufA, 4(src) ! 2200: stw bufA, 4(dst) ! 2201: addi src, src, 4 ! 2202: addi dst, dst, 4 ! 2203: bdnz .mm3s3c2a ! 2204: ! 2205: lwz bufC, 4(dst) ! 2206: lwz bufA, 4(src) ! 2207: rlwimi bufC, bufA, 0, 0, 7 ! 2208: stw bufC, 4(dst) ! 2209: b bcopy_exit ! 2210: ! 2211: /* forward copy destination aligned at 3, source aligned at 3, byte count 3 */ ! 2212: /* d = xxx0 1234 5678 9abc dexx */ ! 2213: /* s = xxx0 1234 5678 9abc dexx */ ! 2214: .align 4 ! 2215: .mm3s3c3: ! 2216: lwz bufA, -3(src) ! 2217: subi src, src, 3 ! 2218: lwz bufC, -3(dst) ! 2219: mtctr wordCount ! 2220: rlwimi bufC, bufA, 0, 24, 31 ! 2221: stw bufC, -3(dst) ! 2222: subi dst, dst, 3 ! 2223: ! 2224: .mm3s3c3a: ! 2225: lwz bufA, 4(src) ! 2226: stw bufA, 4(dst) ! 2227: addi src, src, 4 ! 2228: addi dst, dst, 4 ! 2229: bdnz .mm3s3c3a ! 2230: ! 2231: lwz bufC, 4(dst) ! 2232: lwz bufA, 4(src) ! 2233: rlwimi bufC, bufA, 0, 0, 15 ! 2234: stw bufC, 4(dst) ! 2235: b bcopy_exit ! 2236: #endif /* PPC604 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.