Annotation of gcc/sco-memmove.s, revision 1.1

1.1     ! root        1: / SCO's memmove() function in the 3.2v2 development system libc.a
        !             2: / library has an insidious bug: it trashes the EBX register.  This
        !             3: / register is used to hold register variables.  I suspect the bug crept
        !             4: / in due to a simple-minded translation of a '286 routine, because on
        !             5: / the '286, BX need not be preserved.
        !             6: / 
        !             7: / The fix is to replace memmove.o in /lib/libc.a with the version
        !             8: / included below.  Note that if you use profiling, you must also put a
        !             9: / profiling version of memmove() in /usr/lib/libp/libc.a.
        !            10: / 
        !            11: / To assemble the non-profiling version:
        !            12: / 
        !            13: /     as -m -o memmove.o memmove.s
        !            14: / 
        !            15: / To assemble the profiling verson:
        !            16: / 
        !            17: /     as -m -o memmove_p.o profile.s memmove.s
        !            18: / 
        !            19: / where the file profile.s contains the following single line:
        !            20: /
        !            21: / define(`PROFILE',``PROFILE'')
        !            22: /
        !            23: / (How strange that this bug has gone unnoticed for so long...)
        !            24: 
        !            25: / $Id: memmove.s,v 1.3 1991/06/05 19:15:44 chip Exp $
        !            26: /
        !            27: / Implementation of memmove(), which is inexplicably missing
        !            28: / from the SCO Unix C library.
        !            29: /
        !            30: 
        !            31:        .globl  memmove
        !            32: memmove:
        !            33: ifdef(`PROFILE',`
        !            34:        .bss
        !            35: .L1:   .=.+4
        !            36:        .text
        !            37:        mov     $.L1,%edx
        !            38:        .globl  _mcount
        !            39:        call    _mcount
        !            40: ')
        !            41:        push    %edi
        !            42:        push    %esi
        !            43:        mov     12(%esp),%edi
        !            44:        mov     16(%esp),%esi
        !            45:        mov     20(%esp),%ecx
        !            46:        mov     %edi,%eax               / return value: dest
        !            47:        jcxz    mm_exit
        !            48: 
        !            49:        mov     %edi,%edx
        !            50:        sub     %esi,%edx
        !            51:        jb      mm_simple
        !            52:        cmp     %edx,%ecx
        !            53:        jb      mm_simple
        !            54: 
        !            55:        add     %ecx,%edi
        !            56:        dec     %edi
        !            57:        add     %ecx,%esi
        !            58:        dec     %esi
        !            59:        std
        !            60:        rep; movsb
        !            61:        cld
        !            62:        jmp     mm_exit
        !            63: 
        !            64: mm_simple:
        !            65:        cld
        !            66:        mov     %ecx,%edx
        !            67:        shr     $2,%ecx
        !            68:        rep; movs
        !            69:        mov     %edx,%ecx
        !            70:        and     $3,%ecx
        !            71:        rep; movsb
        !            72: 
        !            73: mm_exit:
        !            74:        pop     %esi
        !            75:        pop     %edi
        !            76:        ret

unix.superglobalmegacorp.com

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