Annotation of MiNT/src/quickmov.spp, revision 1.1.1.4

1.1.1.2   root        1: ; Copyright 1992 Eric R. Smith
                      2: 
1.1.1.3   root        3: ; Copyright 1993 Atari Corporation
                      4: 
1.1.1.2   root        5: ; All rights reserved.
                      6: 
1.1       root        7: ;
                      8: 
                      9: ; quickmove(char *dst, char *src, long nbytes):
                     10: 
                     11: ; quickly copy "nbytes" bytes from src to dst. Assumes that both
                     12: 
                     13: ; src and dst are word aligned.
                     14: 
                     15: ;
                     16: 
1.1.1.4 ! root       17: ; quickmovb(char *dst, char *src, long nbytes):
        !            18: 
        !            19: ; like memcpy, does unaligned too...  does not check for overlap (memmove).
        !            20: 
        !            21: ;
        !            22: 
1.1       root       23:        TEXT
                     24: 
                     25: 
                     26: 
                     27:        XDEF    _quickmove
                     28: 
1.1.1.4 ! root       29:        XDEF    _quickmovb
        !            30: 
        !            31: 
        !            32: 
        !            33: ;%ifdef OWN_LIB
        !            34: 
        !            35:        XDEF    _bcopy
        !            36: 
        !            37:        XDEF    __bcopy
        !            38: 
        !            39:        XDEF    _memcpy
        !            40: 
        !            41: 
        !            42: 
        !            43: _bcopy:
        !            44: 
        !            45: __bcopy:
        !            46: 
        !            47:        move.l  8(sp),a0                ; get dst
        !            48: 
        !            49:        move.l  4(sp),a1                ; get src
        !            50: 
        !            51:        bra.s   _quickmovb1
        !            52: 
        !            53: ;%endif
        !            54: 
        !            55: 
        !            56: 
        !            57: ; for gcc >= 2.5.8
        !            58: 
        !            59: _memcpy:
        !            60: 
        !            61: 
        !            62: 
        !            63: _quickmovb:
        !            64: 
        !            65:        move.l  4(sp),a0                ; get dst
        !            66: 
        !            67:        move.l  8(sp),a1                ; get src
        !            68: 
        !            69: _quickmovb1:
        !            70: 
        !            71:        move.w  a0,d0
        !            72: 
        !            73:        move.w  a1,d1
        !            74: 
        !            75:        eor.w   d1,d0                   ; bit 0 == unaligned
        !            76: 
        !            77:        lsr.w   #1,d0                   ; ...now in x flag
        !            78: 
        !            79:        move.l  12(sp),d0               ; get nbytes
        !            80: 
        !            81:        beq             Ldone
        !            82: 
        !            83:        roxr.w  #1,d1                   ; bit 0 == both odd, msb == unaligned
1.1       root       84: 
1.1.1.4 ! root       85:        bmi             bytecopy                ; unaligned, do the slow thing...
        !            86: 
        !            87:        bcc.s   quickmov1               ; both even, ok
        !            88: 
        !            89:        subq.l  #1,d0                   ; both odd, can be fixed
        !            90: 
        !            91:        move.b  (a1)+,(a0)+
        !            92: 
        !            93:        bra.s   quickmov1
        !            94: 
        !            95:  
1.1       root       96: 
                     97: _quickmove:
                     98: 
                     99:        move.l  4(sp),a0                ; get dst
                    100: 
                    101:        move.l  8(sp),a1                ; get src
                    102: 
                    103:        move.l  12(sp),d0               ; get nbytes
                    104: 
1.1.1.4 ! root      105: quickmov1:
        !           106: 
        !           107:        move.w  #$1ff,d1
        !           108: 
        !           109:        and.w   d0,d1                   ; d1 = nbytes % 512
        !           110: 
1.1       root      111:        lsr.l   #8,d0                   ; 
                    112: 
                    113:        lsr.l   #1,d0                   ; d0 = nbytes / 512
                    114: 
1.1.1.4 ! root      115:        ble.s   Leftover                ; if <= 0, skip
        !           116: 
1.1       root      117: 
                    118: 
                    119:        movem.l d1-d7/a2-a6,-(sp)       ; save regs
                    120: 
                    121: L1:
                    122: 
                    123:        movem.l (a1)+,d1-d7/a2-a6       ; read 12*4 = 48 bytes
                    124: 
                    125:        movem.l d1-d7/a2-a6,(a0)        ;
                    126: 
                    127:        movem.l (a1)+,d1-d7/a2-a6       ; 2nd read
                    128: 
                    129:        movem.l d1-d7/a2-a6,48(a0)      ;
                    130: 
                    131:        movem.l (a1)+,d1-d7/a2-a6       ; 3rd read
                    132: 
                    133:        movem.l d1-d7/a2-a6,96(a0)      ;
                    134: 
                    135:        movem.l (a1)+,d1-d7/a2-a6       ; 4th read
                    136: 
                    137:        movem.l d1-d7/a2-a6,144(a0)     ;
                    138: 
                    139:        movem.l (a1)+,d1-d7/a2-a6       ; 5th
                    140: 
                    141:        movem.l d1-d7/a2-a6,192(a0)     ;
                    142: 
                    143:        movem.l (a1)+,d1-d7/a2-a6       ; 6th
                    144: 
                    145:        movem.l d1-d7/a2-a6,240(a0)     ;
                    146: 
                    147:        movem.l (a1)+,d1-d7/a2-a6       ; 7th
                    148: 
                    149:        movem.l d1-d7/a2-a6,288(a0)     ;
                    150: 
                    151:        movem.l (a1)+,d1-d7/a2-a6       ; 8th
                    152: 
                    153:        movem.l d1-d7/a2-a6,336(a0)     ;
                    154: 
                    155:        movem.l (a1)+,d1-d7/a2-a6       ; 9th
                    156: 
                    157:        movem.l d1-d7/a2-a6,384(a0)     ;
                    158: 
                    159:        movem.l (a1)+,d1-d7/a2-a6       ; 10th
                    160: 
                    161:        movem.l d1-d7/a2-a6,432(a0)     ; At this point, 480 bytes done
                    162: 
                    163:        movem.l (a1)+,d1-d7/a2          ; Only do 32 more bytes
                    164: 
                    165:        movem.l d1-d7/a2,480(a0)        ; for a total of 512
                    166: 
                    167: 
                    168: 
                    169:        lea     512(a0),a0
                    170: 
                    171:        subq.l  #1,d0
                    172: 
1.1.1.4 ! root      173:        bgt.s   L1
1.1       root      174: 
                    175: 
                    176: 
                    177:        movem.l (sp)+,d1-d7/a2-a6       ; pop registers
                    178: 
                    179: 
                    180: 
                    181: Leftover:                              ; do the remaining bytes
                    182: 
1.1.1.4 ! root      183:        moveq.l #3,d0
        !           184: 
        !           185:        and.w   d1,d0
1.1       root      186: 
1.1.1.4 ! root      187:        lsr.w   #2,d1
1.1       root      188: 
1.1.1.3   root      189:        subq.w  #1,d1                   ; prepare for dbra loop
1.1       root      190: 
1.1.1.4 ! root      191:        bmi.s   L4done
        !           192: 
        !           193:        lsr.w   #1,d1
        !           194: 
        !           195:        bcc.s   L23
        !           196: 
        !           197: L2l:
        !           198: 
        !           199:        move.l  (a1)+,(a0)+
        !           200: 
        !           201: L23:
        !           202: 
        !           203:        move.l  (a1)+,(a0)+
        !           204: 
        !           205:        dbra    d1,L2l
        !           206: 
        !           207: L4done:
        !           208: 
        !           209:        subq.w  #1,d0                   ; prepare for dbra loop
        !           210: 
1.1       root      211:        bmi.s   Ldone
                    212: 
                    213: L2:
                    214: 
                    215:        move.b  (a1)+,(a0)+
                    216: 
1.1.1.4 ! root      217:        dbra    d0,L2
1.1       root      218: 
                    219: Ldone:
                    220: 
                    221:        rts                             ; return
                    222: 
1.1.1.4 ! root      223: 
        !           224: 
        !           225: bytecopy:
        !           226: 
        !           227:        subq.l  #1,d0                   ; prepare for dbra loop
        !           228: 
        !           229:        move.l  d0,d1
        !           230: 
        !           231:        swap    d1
        !           232: 
        !           233: L3:
        !           234: 
        !           235:        move.b  (a1)+,(a0)+
        !           236: 
        !           237:        dbra    d0,L3
        !           238: 
        !           239:        dbra    d1,L3
        !           240: 
        !           241:        rts                             ; return
        !           242: 
1.1       root      243:        END
                    244: 

unix.superglobalmegacorp.com

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