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

1.1     ! root        1: //////////
        !             2: / libc/crt/i386/_modf.s
        !             3: / i386 C compiler library.
        !             4: / IEEE software floating point support.
        !             5: //////////
        !             6: 
        !             7: //////////
        !             8: / double _modf(real, dp, exp) double real; double *dp; int exp;
        !             9: / 
        !            10: / Stores g == greatest integer <= real through dp and returns real - g.
        !            11: / This assumes real >= 0, 1 <= exp = exponent(real) <= DMBITS+1,
        !            12: / where DMBITS is the number of mantissa bits in a double.
        !            13: / modf.c deals with the other cases.
        !            14: //////////
        !            15: 
        !            16: d      .equ    4
        !            17: dp     .equ    d+8
        !            18: exp    .equ    dp+4
        !            19: EXPMASK        .equ    0x7FF00000
        !            20: MANMASK        .equ    0x000FFFFF
        !            21: HIDDEN .equ    0x00100000
        !            22: DEFEXP .equ    1022
        !            23: DMBITS .equ    52
        !            24: 
        !            25:        .globl  _modf
        !            26: 
        !            27: _modf:
        !            28:        movl    %edx, d+4(%esp)
        !            29:        andl    %edx, $MANMASK
        !            30:        movl    %eax, d(%esp)           / mantissa to EDX:EAX
        !            31:        movl    %ecx, $DMBITS+1         / mantissa bits
        !            32:        subl    %ecx, exp(%esp)         / bits in integer result to ECX
        !            33: 
        !            34:        / Shift EDX:EAX right to clobber unwanted digits.
        !            35:        shrd    %eax, %edx, %cl         / shift by CL mod 32
        !            36:        shrl    %edx, %cl
        !            37:        cmpl    %ecx, $32
        !            38:        jl      ?L0
        !            39:        subl    %eax, %eax              / zap lo dword, same effect as long shifts
        !            40: ?L0:
        !            41:        shld    %edx, %eax, %cl         / shift back to original position
        !            42:        shll    %eax, %cl
        !            43: 
        !            44:        / EDX:EAX contains the integer part mantissa, now supply the exponent.
        !            45:        movl    %ecx, d+4(%esp)
        !            46:        andl    %ecx, $EXPMASK          / grab old exponent
        !            47:        orl     %edx, %ecx              / combine mantissa and exponent
        !            48:        movl    %ecx, dp(%esp)          / destination to ECX
        !            49:        movl    4(%ecx), %edx
        !            50:        movl    (%ecx), %eax            / store integer part through dp
        !            51: 
        !            52:        / Compute remainder.  First, shift away the integer part bits.
        !            53:        movl    %edx, d+4(%esp)
        !            54:        movl    %eax, d(%esp)           / mantissa to EDX:EAX
        !            55:        movl    %ecx, exp(%esp)         / exponent to ECX
        !            56:        cmpl    %ecx, $32
        !            57:        jl      ?L1
        !            58:        movl    %edx, %eax              / shift EDX:EAX 32 bits left
        !            59:        subl    %eax, %eax
        !            60: ?L1:
        !            61:        shld    %edx, %eax, %cl         / first fraction digit to hidden bit
        !            62:        shll    %eax, %cl               / shift by CL mod 32
        !            63:        movl    %ecx, $DEFEXP           / default exponent to ECX
        !            64:        andl    %edx, $MANMASK|HIDDEN   / mask result
        !            65:        jnz     ?loop
        !            66:        orl     %eax, %eax
        !            67:        jz      ?done                   / no bits left, return 0
        !            68: 
        !            69:        / Normalize.  This should use "bsrl" but currently uses a loop instead.
        !            70: ?loop:
        !            71:        testl   %edx, $HIDDEN           / watch for hidden bit
        !            72:        jnz     ?pack
        !            73:        shld    %edx, %eax, $1
        !            74:        shll    %eax, $1                / shift left one bit
        !            75:        decl    %ecx                    / and adjust the exponent
        !            76:        jmp     ?loop                   / and repeat until hidden bit appears
        !            77: 
        !            78: ?pack:
        !            79:        andl    %edx, $MANMASK          / mask
        !            80:        shll    %ecx, $20
        !            81:        orl     %edx, %ecx              / and supply appropriate exponent
        !            82: ?done:
        !            83:        ret
        !            84: 
        !            85: / end of libc/crt/i386/_modf.s

unix.superglobalmegacorp.com

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