Annotation of kernel/machdep/ppc/bcopy.s, revision 1.1.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.