Annotation of coherent/b/lib/libc/string/i386/_memxchg.s, revision 1.1

1.1     ! root        1: //////////
        !             2: / libc/string/i386/_memxchg.s
        !             3: / i386 C string library.
        !             4: / Not in ANSI C standard.
        !             5: //////////
        !             6: 
        !             7: 
        !             8: //////////
        !             9: / void _memxchg(char *S1, char *S2, size_t Count)
        !            10: /
        !            11: / Exchange records of Count bytes pointed to by S1 and S2.
        !            12: / Copies first by dwords, then by words, then by bytes, for efficiency;
        !            13: / does not try to align the arguments.
        !            14: //////////
        !            15: 
        !            16: S1     .equ    12
        !            17: S2     .equ    S1+4
        !            18: Count  .equ    S2+4
        !            19: 
        !            20:        .globl  _memxchg
        !            21: 
        !            22: _memxchg:
        !            23:        push    %esi
        !            24:        push    %edi
        !            25: 
        !            26:        movl    %ecx, Count(%esp)       / Count to ECX
        !            27:        movl    %esi, S2(%esp)          / S2 address to ESI
        !            28:        movl    %edi, S1(%esp)          / S1 address to EDI
        !            29:        cld
        !            30:        movl    %edx, %ecx              / Save Count in EDX
        !            31:        shrl    %ecx, $2                / Convert byte count to dword count
        !            32:        jz      ?word                   / No dwords to move
        !            33: 
        !            34: ?dword:
        !            35:        movl    %eax, (%edi)            / S1 dword to EAX
        !            36:        movsl                           / S2 dword to S1, bump EDI and ESI
        !            37:        movl    -4(%esi), %eax          / S1 word to old S2
        !            38:        loop    ?dword                  / Decrement dword count and repeat
        !            39: 
        !            40: ?word:
        !            41:        jnc     ?byte                   / No word move, CF is set from shrl above
        !            42:        movw    %ax, (%edi)             / S1 word to AX
        !            43:        movsw                           / S2 word to S1, bump EDI and ESI
        !            44:        movw    -2(%esi), %ax           / S1 word to old S2
        !            45: 
        !            46: ?byte:
        !            47:        shrl    %edx, $1                / Check bit 0 of Count
        !            48:        jnc     ?done                   / No byte move
        !            49:        movb    %al, (%edi)             / S1 byte to AL
        !            50:        movsb                           / S2 byte to S1, bump EDI and ESI
        !            51:        movb    -1(%esi), %al           / S1 byte to old S2
        !            52: 
        !            53: ?done:
        !            54:        pop     %edi
        !            55:        pop     %esi
        !            56:        ret
        !            57: 
        !            58: / end of libc/string/i386/_memxchg.s

unix.superglobalmegacorp.com

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