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

1.1       root        1: ////////
                      2: /
                      3: / Intel 8086 floating point.
                      4: / Double divide.
                      5: / SMALL model.
                      6: /
                      7: ////////
                      8: 
                      9:        .globl  drdiv
                     10:        .globl  dldiv
                     11:        .globl  _fpac_
                     12:        .globl  dzero
                     13: 
                     14: oerror_:       ret
                     15: 
                     16: ////////
                     17: /
                     18: / drdiv - double divide (rvalue)
                     19: / dldiv - double divide (lvalue)
                     20: /
                     21: / compiler calling sequences:
                     22: /      push    <right double argument>
                     23: /      push    <left  double argument>
                     24: /      call    drdiv
                     25: /      add     sp,16
                     26: /
                     27: /      mov     ax,offset <right double argument>
                     28: /      push    ax
                     29: /      push    <left  double argument>
                     30: /      call    dldiv
                     31: /      add     sp,10
                     32: /
                     33: / outputs:
                     34: /      _fpac_ = result.
                     35: /
                     36: / see Knuth "Art of Computer Programming" vol 2  for explanation of
                     37: / multiprecision divide.
                     38: /
                     39: ////////
                     40: 
                     41: l      =       8       / left argument
                     42: r      =       16      / right argument (rvalue)
                     43: rp     =       16      / right argument (lvalue)
                     44: 
                     45: sign   =       -2
                     46: exp    =       -4
                     47: q0     =       -6
                     48: q1     =       -8
                     49: q2     =       -10
                     50: q3     =       -12
                     51: 
                     52: claim  =       -q3     / stack claim size
                     53: 
                     54: drdiv:
                     55:        push    si
                     56:        push    di
                     57:        push    bp
                     58:        mov     bp, sp
                     59: 
                     60:        lea     si, r(bp)       / si = pointer to right op.
                     61:        jmp     0f
                     62: 
                     63: dldiv:
                     64:        push    si
                     65:        push    di
                     66:        push    bp
                     67:        mov     bp, sp
                     68: 
                     69:        mov     si, rp(bp)      / si = pointer to right op.
                     70: 0:
                     71:        sub     sp, $claim
                     72: 
                     73:        mov     ax, l+6(bp)
                     74:        shl     ax, $1          / l exp in ah
                     75:        jne     0f
                     76: retz:
                     77:        call    dzero
                     78:        jmp     done
                     79: 0:
                     80:        rclb    dl, $1          / form sign
                     81:        mov     bx, 6(si)
                     82:        shl     bx, $1          / r exp in bh
                     83:        adcb    dl, $0
                     84:        movb    sign(bp), dl
                     85:        orb     bh, bh
                     86:        je      retinf
                     87: 
                     88:        movb    al, ah
                     89:        movb    bl, bh
                     90:        subb    ah, ah
                     91:        movb    bh, ah
                     92:        sub     ax, bx
                     93:        add     ax, $129
                     94:        js      retz            / exp will only get smaller
                     95: 
                     96:        cmp     ax, $257        / by at most 2
                     97:        ja      retinf
                     98: 
                     99:        mov     exp(bp), ax
                    100:        mov     bx, l+5(bp)     / set up l fraction (u) for divide loop
                    101:        orb     bh, $128        / implicit bit of hi order word
                    102:        mov     cx, l+3(bp)
                    103:        mov     di, l+1(bp)
                    104:        movb    ah, l(bp)
                    105:        subb    al, al
                    106:        shr     bx, $1          / shift r to guarantee valid divide
                    107:        rcr     cx, $1
                    108:        rcr     di, $1
                    109:        rcr     ax, $1
                    110:        add     bp, $q0 + 2     / quotient pushed from here to top
                    111:        jmp     0f
                    112: overf:
                    113:        mov     (bp), $-1       / q^ = word size - 1
                    114:        sub     dx, cx          / do multiply and subtract using adds
                    115:        mov     bx, ax          / u1
                    116:        sub     ax, ax
                    117:        add     bx, cx
                    118:        adcb    dl, al          / must keep track of u0 for a while
                    119: 
                    120:        sub     bx, 3(si)       / u1 u2 -= q^ * v2
                    121:        sbbb    dl, al
                    122:        add     di, 3(si)
                    123:        adc     bx, ax
                    124:        adcb    dl, al
                    125:        js      2f              / adjust q^ and fall in
                    126: 
                    127:        mov     cx, di          / u2
                    128:        mov     di, 1(si)       / v3
                    129:        sub     cx, di          / u2 u3 -= q^ * v3
                    130:        sbb     bx, ax
                    131:        sbbb    dl, al
                    132:        add     di, _fpac_      / pick up u3
                    133:        adc     cx, ax
                    134:        adc     bx, ax
                    135:        adcb    dl, al
                    136: 
                    137:        movb    ah, (si)        / u3 u4 -= q^ * v4
                    138:        sub     di, ax
                    139:        jmp     3f              / fall in
                    140: 
                    141: 0:
                    142:        sub     bp, $2
                    143:        mov     _fpac_, ax      / u3
                    144: 
                    145:        mov     dx, bx          / u0
                    146:        mov     ax, cx          / u1
                    147:        mov     cx, 5(si)
                    148:        orb     ch, $128        / v1
                    149:        cmp     dx, cx
                    150:        je      overf
                    151:        jb      9f
                    152:        call    oerror_
                    153: 9:
                    154: 
                    155:        div     cx
                    156:        mov     (bp), ax        / q+2 >= a = q^ >= q
                    157:        mov     bx, dx          / bx = dx = remainder = new u1 <= v1
                    158: 
                    159:        mul     3(si)           / dx ax  =  q^ * v2
                    160:        sub     di, ax          / subtract from  new u1 new u2
                    161:        sbb     bx, dx          /          =     new u1 old u3
                    162:        jnc     1f              / ok - no prelim q^ adjust
                    163: 2:
                    164:        dec     (bp)            / q^ too big
                    165:        add     di, 3(si)       / adjust u1 u2
                    166:        adc     bx, cx
                    167:        jnc     2b              / until positive ( at most twice)
                    168: 1:                             / now q+1 >= q^ >= q
                    169:        mov     cx, di          / shift new u2 = old u3
                    170:        mov     di, _fpac_      / shift new u3 = old u4
                    171:                                / (     new u4 = 0)
                    172:        mov     ax, 1(si)
                    173:        mul     (bp)            / dx ax = v3 * q^
                    174:        sub     di, ax          / subtract from u2 u3
                    175:        sbb     cx, dx
                    176:        mov     ax, $0
                    177:        sbb     bx, ax
                    178:        sbbb    ah, ah
                    179:        movb    _fpac_+2, ah    / save carry into u0
                    180: 
                    181:        movb    ah, (si)        / last word is short 8 bits
                    182:        mul     (bp)            / dx ax = v4 * q^
                    183:        neg     ax              / ax := u4 - ax = 0 - ax
                    184:        sbb     di, dx
                    185:        movb    dl, _fpac_+2
                    186: 3:
                    187:        sbb     cx, $0
                    188:        sbb     bx, $0
                    189:        sbbb    dl, $0
                    190:        je      1f              / q = q^ ok ( this is usually the case)
                    191: 
                    192:        dec     (bp)            / else q = q^ - 1
                    193:        addb    ah, (si)        / add v1 v2 v3 v4  to  u1 u2 u3 u4
                    194:        adc     di, 1(si)
                    195:        adc     cx, 3(si)
                    196:        adc     bx, $0
                    197:        mov     dx, 5(si)
                    198:        orb     dh, $128
                    199:        add     bx, dx
                    200: 1:
                    201:        cmp     bp, sp
                    202:        jne     0b
                    203: 
                    204:        add     bp, $claim
                    205:        mov     ax, exp(bp)
                    206:        mov     dx, q3(bp)
                    207:        mov     di, q2(bp)
                    208:        mov     cx, q1(bp)
                    209:        mov     bx, q0(bp)
                    210:        orb     bh, bh
                    211:        js      0f              / normalized
                    212: 
                    213:        dec     ax              / only need to shift once
                    214:        shl     dx, $1
                    215:        rcl     di, $1
                    216:        rcl     cx, $1
                    217:        rcl     bx, $1
                    218: 0:
                    219:        shlb    dl, $1          / round
                    220:        adcb    dh, $0
                    221:        adc     di, $0
                    222:        adc     cx, $0
                    223:        adc     bx, $0
                    224:        jnc     0f
                    225: 
                    226:        rcr     bx, $1          / exactly 1/2
                    227:        dec     ax
                    228: 0:
                    229:        orb     ah, ah          / check exp
                    230:        js      retz            / too small
                    231:        jne     retinf          / too big
                    232: 
                    233:        movb    _fpac_, dh      / ok store it
                    234:        mov     _fpac_+1, di
                    235:        mov     _fpac_+3, cx
                    236:        shlb    bh, $1
                    237:        movb    ah, sign(bp)
                    238:        shr     ax, $1
                    239:        rcrb    bh, $1
                    240:        mov     _fpac_+5, bx
                    241:        movb    _fpac_+7, al
                    242: done:
                    243:        mov     sp, bp
                    244:        pop     bp
                    245:        pop     di
                    246:        pop     si
                    247:        ret
                    248: retinf:
                    249:        mov     ax, $-1
                    250:        mov     _fpac_, ax
                    251:        mov     _fpac_+2, ax
                    252:        mov     _fpac_+4, ax
                    253:        movb    dl, sign(bp)
                    254:        shrb    dl, $1
                    255:        rcrb    ah, $1
                    256:        mov     _fpac_+6, ax
                    257:        jmp     done

unix.superglobalmegacorp.com

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