Annotation of kernel/machdep/ppc/bcopy.s, revision 1.1

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 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.