Annotation of coherent/b/lib/libc/crt/i386/dcmp.s, revision 1.1.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.