Annotation of gcc/sco-memmove.s, revision 1.1.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.