Annotation of coherent/b/lib/libc/crt/i8086/dxmul.s, revision 1.1.1.1

1.1       root        1: ////////
                      2: /
                      3: / Intel 8086 floating point.
                      4: / Double multiply.
                      5: / SMALL model.
                      6: /
                      7: ////////
                      8: 
                      9:        .globl  drmul
                     10:        .globl  dlmul
                     11:        .globl  _fpac_
                     12:        .globl  dzero
                     13: 
                     14: ////////
                     15: /
                     16: / drmul - double multiply (rvalue)
                     17: / dlmul - double multiply (lvalue)
                     18: /
                     19: / compiler calling sequences:
                     20: /      push    <right double argument>
                     21: /      push    <left  double argument>
                     22: /      call    drmul
                     23: /      add     sp, $16
                     24: /
                     25: /      mov     ax,offset <right double argument>
                     26: /      push    ax
                     27: /      push    <left  double argument>
                     28: /      call    dlmul
                     29: /      add     sp, $10
                     30: /
                     31: / outputs:
                     32: /      _fpac_ = result.
                     33: /
                     34: ////////
                     35: 
                     36: l      =       8       / left argument.
                     37: r      =       16      / right argument (rvalue)
                     38: rp     =       16      / right argument (lvalue)
                     39: 
                     40: sign   =       -2      / sign of result
                     41: r0     =       -4      / hi fraction of r arg has implicit bit
                     42: s3     =       -6
                     43: exp    =       -8      / exponent of result
                     44: 
                     45: claim  =       8
                     46: 
                     47: drmul: push    si
                     48:        push    di
                     49:        push    bp
                     50:        mov     bp,sp
                     51: 
                     52:        lea     si, r(bp)       / si = pointer to right op.
                     53:        jmp     0f
                     54: 
                     55: dlmul: push    si
                     56:        push    di
                     57:        push    bp
                     58:        mov     bp,sp
                     59: 
                     60:        mov     si, rp(bp)      / si = ptr to r op
                     61: 
                     62: 0:     sub     sp, $claim
                     63: 
                     64:        mov     ax, l+6(bp)
                     65:        shl     ax, $1          / ah = l exp
                     66:        jne     0f
                     67: retz:
                     68:        call    dzero
                     69:        jmp     done
                     70: 0:
                     71:        rclb    dh, $1          / l sign
                     72:        mov     cx, 6(si)
                     73:        shl     cx, $1          / ch = r exp
                     74:        je      retz
                     75: 
                     76:        adcb    dh, $0          / result sign
                     77:        movb    sign(bp), dh
                     78: 
                     79:        movb    al, ah
                     80:        movb    cl, ch
                     81:        subb    ah, ah
                     82:        subb    ch, ch
                     83:        add     ax, cx
                     84:        sub     ax, $128        / result exp
                     85:        jng     retz
                     86: 
                     87:        cmp     ax, $256        / will decrease by at most 1
                     88:        ja      retinf
                     89: 
                     90:        mov     exp(bp), ax
                     91:        orb     l+6(bp), $128   / set implicit bit of l arg
                     92:        mov     cx, 5(si)
                     93:        orb     ch, $128        / cx = r0 = hi word of r fraction
                     94:        sub     bx, bx          / bx = s2
                     95: 
                     96:        movb    ah, l(bp)       / compute r0 * l3
                     97:        subb    al, al
                     98:        mul     cx
                     99:        mov     di, dx          / di = s3
                    100: 
                    101:        mov     ax, 3(si)       / r1 * l2
                    102:        mul     l+1(bp)
                    103:        add     di, dx
                    104:        adcb    bl, bh
                    105: 
                    106:        mov     ax, 1(si)       / r2 * l1
                    107:        mul     l+3(bp)
                    108:        add     di, dx
                    109:        adcb    bl, bh
                    110: 
                    111:        subb    al, al          / r3 * l0
                    112:        movb    ah, (si)
                    113:        mul     l+5(bp)
                    114:        add     di, dx
                    115:        adcb    bl, bh
                    116: 
                    117:        mov     ax, l+1(bp)     / r0 * l2
                    118:        mul     cx
                    119:        mov     r0(bp), cx      / save
                    120:        sub     cx, cx          / cx = s1
                    121:        add     di, ax
                    122:        adc     bx, dx
                    123:        adcb    cl, ch
                    124: 
                    125:        mov     ax, 3(si)       / r1 * l1
                    126:        mul     l+3(bp)
                    127:        add     di, ax
                    128:        adc     bx, dx
                    129:        adcb    cl, ch
                    130: 
                    131:        mov     ax, 1(si)       / r2 * l0
                    132:        mul     l+5(bp)
                    133:        add     di, ax
                    134:        adc     bx, dx
                    135:        adcb    cl, ch
                    136: 
                    137:        mov     s3(bp), di
                    138:        sub     di, di          / di = s0
                    139: 
                    140:        mov     ax, r0(bp)      / r0 * l1
                    141:        mul     l+3(bp)
                    142:        add     bx, ax
                    143:        adc     cx, dx
                    144:        adc     di, di
                    145: 
                    146:        mov     ax, 3(si)       / r1 * l0
                    147:        mul     l+5(bp)
                    148:        add     bx, ax
                    149:        adc     cx, dx
                    150:        adc     di, $0
                    151: 
                    152:        mov     ax, r0(bp)      / r0 * l0
                    153:        mul     l+5(bp)
                    154:        add     cx, ax
                    155:        adc     di, dx
                    156: 
                    157:        js      0f              / no adjust
                    158: 
                    159:        sub     exp(bp), $1
                    160: 
                    161:        shl     s3(bp), $1
                    162:        rcl     bx, $1
                    163:        rcl     cx, $1
                    164:        rcl     di, $1
                    165: 0:
                    166:        sub     ax, ax
                    167:        sub     dx, dx
                    168:        shlb    s3(bp), $1      / round
                    169:        adcb    ah, s3+1(bp)
                    170:        adc     bx, dx
                    171:        adc     cx, dx
                    172:        adc     di, dx
                    173:        adc     exp(bp), $0
                    174: 
                    175:        movb    _fpac_, ah      / store fraction in _fpac_
                    176:        mov     _fpac_+1, bx    / s2
                    177:        mov     _fpac_+3, cx    / s1
                    178: 
                    179:        mov     ax, exp(bp)
                    180:        je      retz
                    181:        orb     ah, ah
                    182:        jne     retinf
                    183: 
                    184:        shl     di, $1          / punt implicit bit
                    185:        movb    ah, sign(bp)
                    186:        shr     ax, $1
                    187:        rcr     di, $1
                    188: 
                    189:        mov     _fpac_+5, di    / and store
                    190:        movb    _fpac_+7, al
                    191: done:
                    192:        mov     sp, bp
                    193:        pop     bp
                    194:        pop     di
                    195:        pop     si
                    196:        ret
                    197: retinf:
                    198:        mov     ax, $-1
                    199:        mov     _fpac_, ax
                    200:        mov     _fpac_+2, ax
                    201:        mov     _fpac_+4, ax
                    202:        shr     sign(bp), $1
                    203:        rcr     ax, $1
                    204:        mov     _fpac_+6, ax
                    205:        jmp     done
                    206: 
                    207: 

unix.superglobalmegacorp.com

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