Annotation of 42BSD/usr.lib/libnm/exp.s, revision 1.1.1.1

1.1       root        1: # double exp(arg)
                      2: # double arg; 0<= arg< 88
                      3: # double exp10(arg)
                      4: # method: range reduction to [-0.5,0.5], Hart&Chenet EXPB 1067
                      5: # J F Jarvis, August 5, 1978
                      6: .set   ERANGE,34
                      7: .globl _exp
                      8: .globl _exp10
                      9: .globl _errno
                     10: .text
                     11: .align 1
                     12: _exp10:
                     13:        .word   0x07c0
                     14:        bispsw  $0xe0
                     15:        muld3   4(ap),loge10,r0
                     16:        jbr     argtst
                     17: .align 1
                     18: _exp:
                     19:        .word   0x07c0
                     20:        bispsw  $0xe0
                     21:        movd    4(ap),r0
                     22: argtst:
                     23:        jnequ   smlarg
                     24:        movd    $0d1.0e+0,r0
                     25:        ret
                     26: smlarg:
                     27:        cmpd    r0,minarg
                     28:        jgeq    lrgarg
                     29:        mnegd   huge,r0
                     30:        ret
                     31: lrgarg:
                     32:        cmpd    r0,maxarg
                     33:        jleq    range
                     34:        movl    $ERANGE,_errno
                     35:        movd    huge,r0
                     36:        ret
                     37: range:
                     38:        emodd   log2e,log2ex,r0,r10,r6  # r10=int(arg), r6=frac(arg)
                     39:        tstd    r0
                     40:        jgtr    l1
                     41:        addd2   $0d0.5e+0,r6
                     42:        subw2   $1,r10
                     43:        jbr     l2
                     44: l1:    subd2   $0d0.5e+0,r6
                     45: l2:                    # Hart&Cheney EXPB 1067
                     46:        muld3   r6,r6,r8        # range [-.5,.5] D=18.1
                     47:        polyd   r8,$2,pcoef
                     48:        muld2   r0,r6
                     49:        polyd   r8,$2,qcoef
                     50:        subd3   r6,r0,r2
                     51:        addd2   r6,r0
                     52:        divd2   r2,r0
                     53:        muld2   sqrt2,r0
                     54:        extzv $7,$8,r0,r2
                     55:        addl2   r2,r10
                     56:        insv    r10,$7,$8,r0    # load correct exponent
                     57:        ret
                     58: .data
                     59: .align 2
                     60: pcoef:
                     61:        .double 0d0.23093347753750233624e-1
                     62:        .double 0d0.20202065651286927227886e+2
                     63:        .double 0d0.15139067990543389159e+4
                     64: qcoef:
                     65:        .double 0d0.1e+1
                     66:        .double 0d0.23318421142748162379e+3
                     67:        .double 0d0.43682116627275584985e+4
                     68: minarg:
                     69:        .double 0d-88.028e+0
                     70: maxarg:
                     71:        .double 0d88.028e+0
                     72: huge:  .double 0d1.7e+38
                     73: loge10:
                     74:        .double 0d2.30258509299404568401e+0
                     75: sqrt2:
                     76:        .double 0d1.41421356237309504880e+0
                     77: log2e:
                     78:        .double 0d1.44269504088896340735e+0
                     79: log2ex:
                     80:        .byte   0xbb

unix.superglobalmegacorp.com

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