Annotation of coherent/b/kernel/emulator/reg_u_mul.S, revision 1.1

1.1     ! root        1:        .file   "reg_u_mul.S"
        !             2: /*---------------------------------------------------------------------------+
        !             3:  |  reg_u_mul.S                                                              |
        !             4:  |                                                                           |
        !             5:  | Core multiplication routine                                               |
        !             6:  |                                                                           |
        !             7:  | Copyright (C) 1992    W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
        !             8:  |                       Australia.  E-mail [email protected]    |
        !             9:  |                                                                           |
        !            10:  |                                                                           |
        !            11:  +---------------------------------------------------------------------------*/
        !            12: 
        !            13: /*---------------------------------------------------------------------------+
        !            14:  |   Basic multiplication routine.                                           |
        !            15:  |   Does not check the resulting exponent for overflow/underflow            |
        !            16:  |                                                                           |
        !            17:  |   Internal working is at approx 96 bits.                                  |
        !            18:  |   Result is rounded to nearest 64 bits, using "nearest or even".          |
        !            19:  +---------------------------------------------------------------------------*/
        !            20: 
        !            21: #include "exception.h"
        !            22: #include "fpu_asm.h"
        !            23: 
        !            24: 
        !            25: 
        !            26: .data
        !            27:        .align 2,0
        !            28: accum_1:
        !            29:        .long   0
        !            30: 
        !            31: 
        !            32: .text
        !            33:        .align 2,144
        !            34: 
        !            35: .globl reg_u_mul
        !            36: reg_u_mul:
        !            37:        pushl   %ebp
        !            38:        movl    %esp,%ebp
        !            39:        pushl   %esi
        !            40:        pushl   %edi
        !            41:        pushl   %ebx
        !            42: 
        !            43:        movl    PARAM1,%esi
        !            44:        movl    PARAM2,%ecx
        !            45: 
        !            46: #ifdef PARANOID
        !            47:        testl   $0x80000000,SIGH(%esi)
        !            48:        jz      xL_bugged
        !            49:        testl   $0x80000000,SIGH(%ecx)
        !            50:        jz      xL_bugged
        !            51: #endif PARANOID
        !            52: 
        !            53:        xorl    %edi,%edi
        !            54:        xorl    %ebx,%ebx
        !            55: 
        !            56:        movl    SIGL(%esi),%eax
        !            57:        mull    SIGL(%ecx)
        !            58: //     movl    %eax,accum_0
        !            59:        movl    %edx,accum_1
        !            60: 
        !            61:        movl    SIGL(%esi),%eax
        !            62:        mull    SIGH(%ecx)
        !            63:        addl    %eax,accum_1
        !            64:        adcl    %edx,%ebx
        !            65: //     adcl    $0,%edi // overflow here is not possible
        !            66: 
        !            67:        movl    SIGH(%esi),%eax
        !            68:        mull    SIGL(%ecx)
        !            69:        addl    %eax,accum_1
        !            70:        adcl    %edx,%ebx
        !            71:        adcl    $0,%edi
        !            72: 
        !            73:        movl    SIGH(%esi),%eax
        !            74:        mull    SIGH(%ecx)
        !            75:        addl    %eax,%ebx
        !            76:        adcl    %edx,%edi
        !            77: 
        !            78:        movl    EXP(%esi),%eax  /* Compute the exponent */
        !            79:        addl    EXP(%ecx),%eax
        !            80: //  Have now finished with the sources
        !            81:        movl    PARAM3,%esi     // Point to the destination
        !            82:        movl    %eax,EXP(%esi)
        !            83: 
        !            84: //  Now make sure that the result is normalized
        !            85:        testl   $0x80000000,%edi
        !            86:        jnz     L20
        !            87: 
        !            88:        /* Normalize by shifting left one bit */
        !            89: //     shll    $1,accum_0      // If using this, change next to rcll
        !            90:        shll    $1,accum_1
        !            91:        rcll    $1,%ebx
        !            92:        rcll    $1,%edi
        !            93:        decl    EXP(%esi)
        !            94: 
        !            95: L20:
        !            96:        /* Do the rounding */
        !            97:        cmpl    $0x80000000,accum_1
        !            98:        jc      L40
        !            99: 
        !           100:        jne     L30
        !           101: 
        !           102:        /* 0x80000000, round up only if previous bit is 1 */
        !           103:        testl   $1,%ebx
        !           104:        jz L40
        !           105: 
        !           106: L30:
        !           107:        addl    $1,%ebx
        !           108:        adcl    $0,%edi
        !           109: 
        !           110:        /* An overflow can occur here (rare!) */
        !           111:        jc      xL_overflow_adjust
        !           112: 
        !           113: L40:
        !           114:        /* Copy the result to the destination register */
        !           115:        movl    %ebx,SIGL(%esi)
        !           116:        movl    %edi,SIGH(%esi)
        !           117: 
        !           118: xL_exit:
        !           119:        popl    %ebx
        !           120:        popl    %edi
        !           121:        popl    %esi
        !           122:        leave
        !           123:        ret
        !           124: 
        !           125: 
        !           126: xL_overflow_adjust:
        !           127:        rcrl    $1, %edi
        !           128:        incl    EXP(%esi)
        !           129:        jmp     L40
        !           130: 
        !           131: #ifdef PARANOID
        !           132: xL_bugged:
        !           133:        pushl   EX_INTERNAL|0x205
        !           134:        call    EXCEPTION
        !           135:        pop     %ebx
        !           136:        jmp     xL_exit
        !           137: #endif PARANOID

unix.superglobalmegacorp.com

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