Annotation of coherent/b/lib/libc/crt/i386/dcmp.s, revision 1.1

1.1     ! root        1: //////////
        !             2: / libc/crt/i386/dcmp.s
        !             3: / i386 C runtime library.
        !             4: / IEEE software floating point support.
        !             5: //////////
        !             6: 
        !             7: //////////
        !             8: / _dcmp(d) double d;
        !             9: / 
        !            10: / Compare %edx:%eax to double d on stack, return flags set appropriately.
        !            11: / Pops argument d before returning!
        !            12: / Bogus for denormals.
        !            13: //////////
        !            14: 
        !            15: d      .equ    4
        !            16: SGNMASK        .equ    0x80000000
        !            17: 
        !            18:        .globl  _dcmp
        !            19: 
        !            20: _dcmp:                                 / Stack: hid lod ra
        !            21:        xchgl   %ebx, d(%esp)           / hid EBX ra, lod in EBX
        !            22:        xchgl   %ecx, (%esp)            / hid EBX ECX, ra in ECX
        !            23:        xchgl   %ecx, d+4(%esp)         / ra EBX ECX, d in ECX:EBX
        !            24:        push    %esi                    / ra EBX ECX ESI
        !            25:        movl    %esi, $1                / value for > to ESI
        !            26:        cmpl    %ecx, $SGNMASK          / be wary of arg -0.0
        !            27:        jnz     ?L1
        !            28:        subl    %ecx, %ecx              / replace arg -0.0 with 0.0
        !            29: 
        !            30: ?L1:   
        !            31:        orl     %edx, %edx
        !            32:        jns     ?lhspos
        !            33:        cmpl    %edx, $SGNMASK          / be wary of lhs -0.0
        !            34:        jnz     ?lhsneg
        !            35:        subl    %edx, %edx              / turn lhs -0.0 into 0.0
        !            36: 
        !            37: ?lhspos:                               / lhs is positive
        !            38:        orl     %ecx, %ecx
        !            39:        jns     ?samesign               / both positive
        !            40:                                        / else lhs positive, arg negative
        !            41: ?done:
        !            42:        orl     %esi, %esi
        !            43: 
        !            44: ?quit:
        !            45:        pop     %esi
        !            46:        pop     %ecx
        !            47:        pop     %ebx
        !            48:        ret
        !            49: 
        !            50: ?samesign:
        !            51:        cmpl    %edx, %ecx              / both positive, compare magnitudes
        !            52:        ja      ?done                   / lhs greater
        !            53:        jb      ?less                   / lhs less
        !            54:        cmpl    %eax, %ebx              / hi equal, compare lo mantissa words   
        !            55:        ja      ?done
        !            56:        jz      ?quit
        !            57: 
        !            58: ?less:
        !            59:        negl    %esi                    / negate result sense
        !            60:        jmp     ?quit
        !            61: 
        !            62: ?lhsneg:                               / lhs is negative
        !            63:        negl    %esi                    / negate result sense
        !            64:        orl     %ecx, %ecx
        !            65:        jns     ?done                   / lhs negative, arg positive, return less
        !            66:        jmp     ?samesign               / both negative, compare magnitudes
        !            67: 
        !            68: / end of libc/crt/i386/dcmp.s

unix.superglobalmegacorp.com

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