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

1.1     ! root        1: //////////
        !             2: / libc/crt/i386/dfcvt.s
        !             3: / i386 C runtime library.
        !             4: / IEEE software floating point support.
        !             5: //////////
        !             6: 
        !             7: //////////
        !             8: / double _dfcvt()
        !             9: / Convert float in %eax to double, return in %edx:%eax.
        !            10: / Ignores denormals and NaNs.
        !            11: //////////
        !            12: 
        !            13: BIAS           .equ    1023
        !            14: FBIAS          .equ    127
        !            15: SGNMASK                .equ    0x80000000
        !            16: EXPMASK                .equ    0x7FF00000
        !            17: FEXPMASK       .equ    0x7F800000
        !            18: FMANMASK       .equ    0x007FFFFF
        !            19: FMAXEXP                .equ    255
        !            20: 
        !            21:        .globl  _dfcvt
        !            22: 
        !            23: _dfcvt:
        !            24:        push    %ecx
        !            25:        subl    %edx, %edx              / 0 to EDX
        !            26:        movl    %ecx, %eax              / copy float to ECX
        !            27:        andl    %ecx, $FEXPMASK         / extract float exponent
        !            28:        jz      ?zero                   / return 0.0, ignoring denormals
        !            29:        orl     %eax, %eax
        !            30:        pushfl                          / save arg flag
        !            31:        shrl    %ecx, $23               / unshift float exponent
        !            32:        cmpl    %ecx, $FMAXEXP          / check for big exponent
        !            33:        jz      ?inf                    / return +-infinity, ignoring NaNs
        !            34:        addl    %ecx, $BIAS-FBIAS       / adjust to double exponent bias
        !            35:        shll    %ecx, $20               / double exponent to correct position
        !            36:        and     %eax, $FMANMASK         / extract float mantissa in EAX
        !            37:        movl    %edx, %eax              / and copy to EDX
        !            38:        shrl    %edx, $3                / shift hi mantissa
        !            39:        shll    %eax, $29               / and lo mantissa
        !            40:        orl     %edx, %ecx              / exponent
        !            41: 
        !            42: ?setsign:
        !            43:        popfl                           / restore arg sign flag
        !            44:        jns     ?L0
        !            45:        orl     %edx, $SGNMASK          / set sign bit
        !            46: ?L0:
        !            47:        pop     %ecx
        !            48:        ret
        !            49: 
        !            50: ?inf:
        !            51:        movl    %edx, $EXPMASK
        !            52:        subl    %eax, %eax
        !            53:        jmp     ?setsign
        !            54: 
        !            55: ?zero:
        !            56:        subl    %eax, %eax              / EDX is already 0, return 0.0
        !            57:        pop     %ecx
        !            58:        ret
        !            59: 
        !            60: / end of libc/crt/i386/dfcvt.s

unix.superglobalmegacorp.com

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