Annotation of XNU/osfmk/ppc/bcopy.s, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: ;
                     23: ;                      Copy bytes of data around. handles overlapped data.
                     24: ;
                     25: ;                      Change this to use Altivec later on, and maybe floating point.
                     26: ;
                     27: ;                      NOTE: This file compiles and executes on both MacOX 8.x (Codewarrior)
                     28: ;                            and MacOX X.  The  "#if 0"s are treated as comments by CW so the
                     29: ;                                stuff between them is included by CW and excluded on MacOX X.
                     30: ;                                Same with the "#include"s.
                     31: ;
                     32: #include <ppc/asm.h>
                     33: #include <ppc/proc_reg.h>
                     34: 
                     35: ;              Use CR5_lt to indicate non-cached
                     36: #define noncache 20
                     37: #if 0
                     38: noncache:      equ     20
                     39: #endif
                     40: #if 0
                     41: br0:           equ     0
                     42: #endif
                     43: 
                     44: ;
                     45: ; bcopy_nc(from, to, nbytes)
                     46: ;
                     47: ; bcopy_nc operates on non-cached memory so we can not use any kind
                     48: ; of cache instructions.
                     49: ;
                     50: 
                     51: 
                     52: 
                     53: #if 0
                     54:                        IF 0
                     55: #endif
                     56: ENTRY(bcopy_nc, TAG_NO_FRAME_USED)
                     57: #if 0
                     58:                        ENDIF
                     59:                        export  xbcopy_nc[DS]
                     60:                        tc              xbcopy_nc[TC],xbcopy_nc[DS]
                     61:                        csect   xbcopy_nc[DS]
                     62:                        dc.l    .xbcopy_nc
                     63:                        dc.l    TOC[tc0]
                     64:                        export  .xbcopy_nc
                     65:                        csect   xbcopy_nc[PR]
                     66: .xbcopy_nc:
                     67: #endif
                     68:                        
                     69:                        crset   noncache                                        ; Set non-cached
                     70:                        b               bcpswap
                     71: 
                     72: ;      
                     73: ; void bcopy(from, to, nbytes)
                     74: ;
                     75: 
                     76: #if 0
                     77:                        IF 0
                     78: #endif
                     79: ENTRY(bcopy, TAG_NO_FRAME_USED)
                     80: #if 0
                     81:                        ENDIF
                     82:                        export  xbcopy[DS]
                     83:                        tc              xbcopyc[TC],xbcopy[DS]
                     84:                        csect   xbcopy[DS]
                     85:                        dc.l    .xbcopy
                     86:                        dc.l    TOC[tc0]
                     87:                        export  .xbcopy
                     88:                        csect   xbcopy[PR]
                     89: .xbcopy:
                     90: #endif
                     91: 
                     92:                        crclr   noncache                                        ; Set cached
                     93: 
                     94: bcpswap:       cmplw   cr1,r4,r3                                       ; Compare "to" and "from"
                     95:                        mr.             r5,r5                                           ; Check if we have a 0 length
                     96:                        mr              r6,r3                                           ; Set source
                     97:                        beqlr-  cr1                                                     ; Bail if "to" and "from" are the same  
                     98:                        beqlr-                                                          ; Bail if length is 0
                     99:                        b               copyit                                          ; Go copy it...
                    100: 
                    101: ;
                    102: ;                      When we move the memory, forward overlays must be handled.  We
                    103: ;                      also can not use the cache instructions if we are from bcopy_nc.
                    104: ;                      We need to preserve R3 because it needs to be returned for memcpy.
                    105: ;                      We can be interrupted and lose control here.
                    106: ;
                    107: ;                      There is no stack, so in order to used floating point, we would
                    108: ;                      need to take the FP exception. Any potential gains by using FP 
                    109: ;                      would be more than eaten up by this.
                    110: ;
                    111: ;                      Later, we should used Altivec for large moves.
                    112: ;
                    113:        
                    114: #if 0
                    115:                        IF 0
                    116: #endif
                    117: ENTRY(memcpy, TAG_NO_FRAME_USED)
                    118: #if 0
                    119:                        ENDIF
                    120:                        export  xmemcpy[DS]
                    121:                        tc              xmemcpy[TC],xmemcpy[DS]
                    122:                        csect   xmemcpy[DS]
                    123:                        dc.l    .xmemcpy
                    124:                        dc.l    TOC[tc0]
                    125:                        export  .xmemcpy
                    126:                        csect   xmemcpy[PR]
                    127: .xmemcpy:
                    128: #endif
                    129:                        cmplw   cr1,r3,r4                                       ; "to" and "from" the same?
                    130:                        mr              r6,r4                                           ; Set the "from"
                    131:                        mr.             r5,r5                                           ; Length zero?
                    132:                        crclr   noncache                                        ; Set cached
                    133:                        mr              r4,r3                                           ; Set the "to"
                    134:                        beqlr-  cr1                                                     ; "to" and "from" are the same
                    135:                        beqlr-                                                          ; Length is 0
                    136:                        
                    137: copyit:                sub             r12,r4,r6                                       ; Get potential overlap (negative if backward move)
                    138:                        lis             r8,0x7FFF                                       ; Start up a mask
                    139:                        srawi   r11,r12,31                                      ; Propagate the sign bit
                    140:                        dcbt    br0,r6                                          ; Touch in the first source line
                    141:                        cntlzw  r7,r5                                           ; Get the highest power of 2 factor of the length
                    142:                        ori             r8,r8,0xFFFF                            ; Make limit 0x7FFFFFFF
                    143:                        xor             r9,r12,r11                                      ; If sink - source was negative, invert bits
                    144:                        srw             r8,r8,r7                                        ; Get move length limitation
                    145:                        sub             r9,r9,r11                                       ; If sink - source was negative, add 1 and get absolute value
                    146:                        cmplw   r12,r5                                          ; See if we actually forward overlap
                    147:                        cmplwi  cr7,r9,32                                       ; See if at least a line between  source and sink
                    148:                        dcbtst  br0,r4                                          ; Touch in the first sink line
                    149:                        cmplwi  cr1,r5,32                                       ; Are we moving more than a line?
                    150:                        cror    noncache,noncache,28            ; Set to not DCBZ output line if not enough space
                    151:                        blt-    fwdovrlap                                       ; This is a forward overlapping area, handle it...
                    152: 
                    153: ;
                    154: ;                      R4 = sink
                    155: ;                      R5 = length
                    156: ;                      R6 = source
                    157: ;
                    158:                        
                    159: ;
                    160: ;                      Here we figure out how much we have to move to get the sink onto a
                    161: ;                      cache boundary.  If we can, and there are still more that 32 bytes
                    162: ;                      left to move, we can really speed things up by DCBZing the sink line.
                    163: ;                      We can not do this if noncache is set because we will take an 
                    164: ;                      alignment exception.
                    165: 
                    166:                        neg             r0,r4                                           ; Get the number of bytes to move to align to a line boundary
                    167:                        rlwinm. r0,r0,0,27,31                           ; Clean it up and test it
                    168:                        and             r0,r0,r8                                        ; limit to the maximum front end move
                    169:                        mtcrf   3,r0                                            ; Make branch mask for partial moves
                    170:                        sub             r5,r5,r0                                        ; Set the length left to move
                    171:                        beq             alline                                          ; Already on a line...
                    172:                        
                    173:                        bf              31,alhalf                                       ; No single byte to do...
                    174:                        lbz             r7,0(r6)                                        ; Get the byte
                    175:                        addi    r6,r6,1                                         ; Point to the next
                    176:                        stb             r7,0(r4)                                        ; Save the single
                    177:                        addi    r4,r4,1                                         ; Bump sink
                    178:                        
                    179: ;                      Sink is halfword aligned here
                    180: 
                    181: alhalf:                bf              30,alword                                       ; No halfword to do...
                    182:                        lhz             r7,0(r6)                                        ; Get the halfword
                    183:                        addi    r6,r6,2                                         ; Point to the next
                    184:                        sth             r7,0(r4)                                        ; Save the halfword
                    185:                        addi    r4,r4,2                                         ; Bump sink
                    186:                        
                    187: ;                      Sink is word aligned here
                    188: 
                    189: alword:                bf              29,aldouble                                     ; No word to do...
                    190:                        lwz             r7,0(r6)                                        ; Get the word
                    191:                        addi    r6,r6,4                                         ; Point to the next
                    192:                        stw             r7,0(r4)                                        ; Save the word
                    193:                        addi    r4,r4,4                                         ; Bump sink
                    194:                        
                    195: ;                      Sink is double aligned here
                    196: 
                    197: aldouble:      bf              28,alquad                                       ; No double to do...
                    198:                        lwz             r7,0(r6)                                        ; Get the first word
                    199:                        lwz             r8,4(r6)                                        ; Get the second word
                    200:                        addi    r6,r6,8                                         ; Point to the next
                    201:                        stw             r7,0(r4)                                        ; Save the first word
                    202:                        stw             r8,4(r4)                                        ; Save the second word
                    203:                        addi    r4,r4,8                                         ; Bump sink
                    204:                        
                    205: ;                      Sink is quadword aligned here
                    206: 
                    207: alquad:                bf              27,alline                                       ; No quad to do...
                    208:                        lwz             r7,0(r6)                                        ; Get the first word
                    209:                        lwz             r8,4(r6)                                        ; Get the second word
                    210:                        lwz             r9,8(r6)                                        ; Get the third word
                    211:                        stw             r7,0(r4)                                        ; Save the first word
                    212:                        lwz             r11,12(r6)                                      ; Get the fourth word
                    213:                        addi    r6,r6,16                                        ; Point to the next
                    214:                        stw             r8,4(r4)                                        ; Save the second word
                    215:                        stw             r9,8(r4)                                        ; Save the third word
                    216:                        stw             r11,12(r4)                                      ; Save the fourth word
                    217:                        addi    r4,r4,16                                        ; Bump sink
                    218:                        
                    219: ;                      Sink is line aligned here
                    220: 
                    221: alline:                rlwinm. r0,r5,27,5,31                           ; Get the number of full lines to move
                    222:                        mtcrf   3,r5                                            ; Make branch mask for backend partial moves
                    223:                        rlwinm  r11,r5,0,0,26                           ; Get number of bytes we are going to move
                    224:                        beq-    backend                                         ; No full lines to move
                    225:                        
                    226:                        sub             r5,r5,r11                                       ; Calculate the residual
                    227:                        li              r10,96                                          ; Stride for touch ahead
                    228:                        
                    229: nxtline:       subic.  r0,r0,1                                         ; Account for the line now
                    230: 
                    231:                        bt-             noncache,skipz                          ; Skip if we are not cached...
                    232:                        dcbz    br0,r4                                          ; Blow away the whole line because we are replacing it
                    233:                        dcbt    r6,r10                                          ; Touch ahead a bit
                    234:                        
                    235: skipz:         lwz             r7,0(r6)                                        ; Get the first word
                    236:                        lwz             r8,4(r6)                                        ; Get the second word
                    237:                        lwz             r9,8(r6)                                        ; Get the third word
                    238:                        stw             r7,0(r4)                                        ; Save the first word
                    239:                        lwz             r11,12(r6)                                      ; Get the fourth word
                    240:                        stw             r8,4(r4)                                        ; Save the second word
                    241:                        lwz             r7,16(r6)                                       ; Get the fifth word
                    242:                        stw             r9,8(r4)                                        ; Save the third word
                    243:                        lwz             r8,20(r6)                                       ; Get the sixth word
                    244:                        stw             r11,12(r4)                                      ; Save the fourth word
                    245:                        lwz             r9,24(r6)                                       ; Get the seventh word
                    246:                        stw             r7,16(r4)                                       ; Save the fifth word
                    247:                        lwz             r11,28(r6)                                      ; Get the eighth word
                    248:                        addi    r6,r6,32                                        ; Point to the next
                    249:                        stw             r8,20(r4)                                       ; Save the sixth word
                    250:                        stw             r9,24(r4)                                       ; Save the seventh word
                    251:                        stw             r11,28(r4)                                      ; Save the eighth word
                    252:                        addi    r4,r4,32                                        ; Bump sink
                    253:                        bgt+    nxtline                                         ; Do the next line, if any...
                    254: 
                    255:        
                    256: ;                      Move backend quadword
                    257: 
                    258: backend:       bf              27,noquad                                       ; No quad to do...
                    259:                        lwz             r7,0(r6)                                        ; Get the first word
                    260:                        lwz             r8,4(r6)                                        ; Get the second word
                    261:                        lwz             r9,8(r6)                                        ; Get the third word
                    262:                        lwz             r11,12(r6)                                      ; Get the fourth word
                    263:                        stw             r7,0(r4)                                        ; Save the first word
                    264:                        addi    r6,r6,16                                        ; Point to the next
                    265:                        stw             r8,4(r4)                                        ; Save the second word
                    266:                        stw             r9,8(r4)                                        ; Save the third word
                    267:                        stw             r11,12(r4)                                      ; Save the fourth word
                    268:                        addi    r4,r4,16                                        ; Bump sink
                    269:                        
                    270: ;                      Move backend double
                    271: 
                    272: noquad:                bf              28,nodouble                                     ; No double to do...
                    273:                        lwz             r7,0(r6)                                        ; Get the first word
                    274:                        lwz             r8,4(r6)                                        ; Get the second word
                    275:                        addi    r6,r6,8                                         ; Point to the next
                    276:                        stw             r7,0(r4)                                        ; Save the first word
                    277:                        stw             r8,4(r4)                                        ; Save the second word
                    278:                        addi    r4,r4,8                                         ; Bump sink
                    279:                        
                    280: ;                      Move backend word
                    281: 
                    282: nodouble:      bf              29,noword                                       ; No word to do...
                    283:                        lwz             r7,0(r6)                                        ; Get the word
                    284:                        addi    r6,r6,4                                         ; Point to the next
                    285:                        stw             r7,0(r4)                                        ; Save the word
                    286:                        addi    r4,r4,4                                         ; Bump sink
                    287:                        
                    288: ;                      Move backend halfword
                    289: 
                    290: noword:                bf              30,nohalf                                       ; No halfword to do...
                    291:                        lhz             r7,0(r6)                                        ; Get the halfword
                    292:                        addi    r6,r6,2                                         ; Point to the next
                    293:                        sth             r7,0(r4)                                        ; Save the halfword
                    294:                        addi    r4,r4,2                                         ; Bump sink
                    295: 
                    296: ;                      Move backend byte
                    297: 
                    298: nohalf:                bflr    31                                                      ; Leave cuz we are all done...  
                    299:                        lbz             r7,0(r6)                                        ; Get the byte
                    300:                        stb             r7,0(r4)                                        ; Save the single
                    301:                        
                    302:                        blr                                                                     ; Leave cuz we are all done...                  
                    303: 
                    304: ;
                    305: ;                      0123456789ABCDEF0123456789ABCDEF
                    306: ;                       0123456789ABCDEF0123456789ABCDEF
                    307: ;                                                                                  F
                    308: ;                                                                                DE
                    309: ;                                                                        9ABC
                    310: ;                                                        12345678
                    311: ;             123456789ABCDEF0 
                    312: ;            0
                    313: 
                    314: ;
                    315: ;                      Here is where we handle a forward overlapping move.  These will be slow
                    316: ;                      because we can not kill the cache of the destination until after we have
                    317: ;                      loaded/saved the source area.  Also, because reading memory backwards is
                    318: ;                      slower when the cache line needs to be loaded because the critical 
                    319: ;                      doubleword is loaded first, i.e., the last, then it goes back to the first,
                    320: ;                      and on in order.  That means that when we are at the second to last DW we
                    321: ;                      have to wait until the whole line is in cache before we can proceed.
                    322: ;
                    323:        
                    324: fwdovrlap:     add             r4,r5,r4                                        ; Point past the last sink byte
                    325:                        add             r6,r5,r6                                        ; Point past the last source byte 
                    326:                        and             r0,r4,r8                                        ; Apply movement limit
                    327:                        li              r12,-1                                          ; Make sure we touch in the actual line                         
                    328:                        mtcrf   3,r0                                            ; Figure out the best way to move backwards                     
                    329:                        dcbt    r12,r6                                          ; Touch in the last line of source
                    330:                        rlwinm. r0,r0,0,27,31                           ; Calculate the length to adjust to cache boundary
                    331:                        dcbtst  r12,r4                                          ; Touch in the last line of the sink
                    332:                        beq-    balline                                         ; Aready on cache line boundary
                    333:                        
                    334:                        sub             r5,r5,r0                                        ; Precaculate move length left after alignment
                    335:                        
                    336:                        bf              31,balhalf                                      ; No single byte to do...
                    337:                        lbz             r7,-1(r6)                                       ; Get the byte
                    338:                        subi    r6,r6,1                                         ; Point to the next
                    339:                        stb             r7,-1(r4)                                       ; Save the single
                    340:                        subi    r4,r4,1                                         ; Bump sink
                    341:                        
                    342: ;                      Sink is halfword aligned here
                    343: 
                    344: balhalf:       bf              30,balword                                      ; No halfword to do...
                    345:                        lhz             r7,-2(r6)                                       ; Get the halfword
                    346:                        subi    r6,r6,2                                         ; Point to the next
                    347:                        sth             r7,-2(r4)                                       ; Save the halfword
                    348:                        subi    r4,r4,2                                         ; Bump sink
                    349:                        
                    350: ;                      Sink is word aligned here
                    351: 
                    352: balword:       bf              29,baldouble                            ; No word to do...
                    353:                        lwz             r7,-4(r6)                                       ; Get the word
                    354:                        subi    r6,r6,4                                         ; Point to the next
                    355:                        stw             r7,-4(r4)                                       ; Save the word
                    356:                        subi    r4,r4,4                                         ; Bump sink
                    357:                        
                    358: ;                      Sink is double aligned here
                    359: 
                    360: baldouble:     bf              28,balquad                                      ; No double to do...
                    361:                        lwz             r7,-8(r6)                                       ; Get the first word
                    362:                        lwz             r8,-4(r6)                                       ; Get the second word
                    363:                        subi    r6,r6,8                                         ; Point to the next
                    364:                        stw             r7,-8(r4)                                       ; Save the first word
                    365:                        stw             r8,-4(r4)                                       ; Save the second word
                    366:                        subi    r4,r4,8                                         ; Bump sink
                    367:                        
                    368: ;                      Sink is quadword aligned here
                    369: 
                    370: balquad:       bf              27,balline                                      ; No quad to do...
                    371:                        lwz             r7,-16(r6)                                      ; Get the first word
                    372:                        lwz             r8,-12(r6)                                      ; Get the second word
                    373:                        lwz             r9,-8(r6)                                       ; Get the third word
                    374:                        lwz             r11,-4(r6)                                      ; Get the fourth word
                    375:                        stw             r7,-16(r4)                                      ; Save the first word
                    376:                        subi    r6,r6,16                                        ; Point to the next
                    377:                        stw             r8,-12(r4)                                      ; Save the second word
                    378:                        stw             r9,-8(r4)                                       ; Save the third word
                    379:                        stw             r11,-4(r4)                                      ; Save the fourth word
                    380:                        subi    r4,r4,16                                        ; Bump sink
                    381:                        
                    382: ;                      Sink is line aligned here
                    383: 
                    384: balline:       rlwinm. r0,r5,27,5,31                           ; Get the number of full lines to move
                    385:                        mtcrf   3,r5                                            ; Make branch mask for backend partial moves
                    386:                        beq-    bbackend                                        ; No full lines to move
                    387: #if 0
                    388:                        stwu    r1,-8(r1)                                       ; Dummy stack for MacOS
                    389:                        stw             r2,4(r1)                                        ; Save RTOC
                    390: #endif
                    391: 
                    392: 
                    393: ;                      Registers in use: R0, R1,     R3, R4, R5, R6
                    394: ;       Registers not in use:         R2,                 R7, R8, R9, R10, R11, R12 - Ok, we can make another free for 8 of them
                    395:                        
                    396: bnxtline:      subic.  r0,r0,1                                         ; Account for the line now
                    397: 
                    398:                        lwz             r7,-32(r6)                                      ; Get the first word
                    399:                        lwz             r5,-28(r6)                                      ; Get the second word
                    400:                        lwz             r2,-24(r6)                                      ; Get the third word
                    401:                        lwz             r12,-20(r6)                                     ; Get the third word
                    402:                        lwz             r11,-16(r6)                                     ; Get the fifth word
                    403:                        lwz             r10,-12(r6)                                     ; Get the sixth word
                    404:                        lwz             r9,-8(r6)                                       ; Get the seventh word
                    405:                        lwz             r8,-4(r6)                                       ; Get the eighth word
                    406:                        subi    r6,r6,32                                        ; Point to the next
                    407:                        
                    408:                        stw             r7,-32(r4)                                      ; Get the first word
                    409:                        ble-    bnotouch                                        ; Last time, skip touch of source...
                    410:                        dcbt    br0,r6                                          ; Touch in next source line
                    411:                        
                    412: bnotouch:      stw             r5,-28(r4)                                      ; Get the second word
                    413:                        stw             r2,-24(r4)                                      ; Get the third word
                    414:                        stw             r12,-20(r4)                                     ; Get the third word
                    415:                        stw             r11,-16(r4)                                     ; Get the fifth word
                    416:                        stw             r10,-12(r4)                                     ; Get the sixth word
                    417:                        stw             r9,-8(r4)                                       ; Get the seventh word
                    418:                        stw             r8,-4(r4)                                       ; Get the eighth word
                    419:                        subi    r4,r4,32                                        ; Bump sink
                    420:                        
                    421:                        bgt+    bnxtline                                        ; Do the next line, if any...
                    422: #if 0
                    423:                        lwz             r2,4(r1)                                        ; Restore RTOC
                    424:                        lwz             r1,0(r1)                                        ; Pop dummy stack
                    425: #endif
                    426: 
                    427: ;
                    428: ;                      Note: We touched these lines in at the beginning
                    429: ;
                    430:        
                    431: ;                      Move backend quadword
                    432: 
                    433: bbackend:      bf              27,bnoquad                                      ; No quad to do...
                    434:                        lwz             r7,-16(r6)                                      ; Get the first word
                    435:                        lwz             r8,-12(r6)                                      ; Get the second word
                    436:                        lwz             r9,-8(r6)                                       ; Get the third word
                    437:                        lwz             r11,-4(r6)                                      ; Get the fourth word
                    438:                        stw             r7,-16(r4)                                      ; Save the first word
                    439:                        subi    r6,r6,16                                        ; Point to the next
                    440:                        stw             r8,-12(r4)                                      ; Save the second word
                    441:                        stw             r9,-8(r4)                                       ; Save the third word
                    442:                        stw             r11,-4(r4)                                      ; Save the fourth word
                    443:                        subi    r4,r4,16                                        ; Bump sink
                    444:                        
                    445: ;                      Move backend double
                    446: 
                    447: bnoquad:       bf              28,bnodouble                            ; No double to do...
                    448:                        lwz             r7,-8(r6)                                       ; Get the first word
                    449:                        lwz             r8,-4(r6)                                       ; Get the second word
                    450:                        subi    r6,r6,8                                         ; Point to the next
                    451:                        stw             r7,-8(r4)                                       ; Save the first word
                    452:                        stw             r8,-4(r4)                                       ; Save the second word
                    453:                        subi    r4,r4,8                                         ; Bump sink
                    454:                        
                    455: ;                      Move backend word
                    456: 
                    457: bnodouble:     bf              29,bnoword                                      ; No word to do...
                    458:                        lwz             r7,-4(r6)                                       ; Get the word
                    459:                        subi    r6,r6,4                                         ; Point to the next
                    460:                        stw             r7,-4(r4)                                       ; Save the word
                    461:                        subi    r4,r4,4                                         ; Bump sink
                    462:                        
                    463: ;                      Move backend halfword
                    464: 
                    465: bnoword:       bf              30,bnohalf                                      ; No halfword to do...
                    466:                        lhz             r7,-2(r6)                                       ; Get the halfword
                    467:                        subi    r6,r6,2                                         ; Point to the next
                    468:                        sth             r7,-2(r4)                                       ; Save the halfword
                    469:                        subi    r4,r4,2                                         ; Bump sink
                    470: 
                    471: ;                      Move backend byte
                    472: 
                    473: bnohalf:       bflr    31                                                      ; Leave cuz we are all done...  
                    474:                        lbz             r7,-1(r6)                                       ; Get the byte
                    475:                        stb             r7,-1(r4)                                       ; Save the single
                    476:                        
                    477:                        blr                                                                     ; Leave cuz we are all done...                  

unix.superglobalmegacorp.com

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