Annotation of 3BSD/lib/libnm/sqrt.s, revision 1.1.1.1

1.1       root        1: # double sqrt(arg)
                      2: # double arg
                      3: # if(arg<0.0) { _errno=EDOM; return(0.0) }
                      4: # J. F. Jarvis August 2, 1978
                      5: .set   EDOM,98
                      6: .text
                      7: .align 1
                      8: .globl _sqrt
                      9: .globl _errno
                     10: _sqrt:
                     11:        .word   0x0c0
                     12:        movd    4(ap),r4
                     13:        jgtr    range
                     14:        jeql    retz
                     15:        movl    $EDOM,_errno
                     16: retz:
                     17:        clrd    r0
                     18:        ret
                     19: #
                     20: range:
                     21:        extzv   $7,$8,r4,r6     # r6 is exponent of arg
                     22:        insv    $128,$7,$8,r4   # r2: 0.5<=fraction(arg)<1.0
                     23:        incl    r6
                     24:        clrl    r7
                     25:        ediv    $2,r6,r6,r7     # r6=(exp+1)/2; r7=(exp+1)%2
                     26:        addb2   $64,r6  # r6 is correct exponent for result
                     27:        polyf   r4,$4,pcoef     # init estimate of sqrt(frac)
                     28:                                                # Hart&Cheney SQRT 0132 D=5.1
                     29:        divd3   r0,r4,r2        # Newtons method, 2 iterations
                     30:        addd2   r2,r0
                     31:        muld2   $0d0.5e+0,r0
                     32:        divd3   r0,r4,r2        # Hart&Cheney 6.1.7
                     33:        addd2   r2,r0   #d=21 at exit
                     34:        muld2   hc[r7],r0       # *sqrt(2) requ for even org exp.
                     35:        insv    r6,$7,$8,r0     # insert correct exp.
                     36:        ret
                     37: .data
                     38: .align 3
                     39: pcoef:
                     40:        .float 0f-0.1214683825e+0
                     41:        .float 0f0.5010420763e+0
                     42:        .float 0f-0.9093210498e+0
                     43:        .float 0f0.1300669049e+1
                     44:        .float 0f0.2290699453e+0
                     45: hc:            .double 0d0.35355339059327376220e+0     # sqrt(2)/4
                     46:                .double 0d0.5e+0

unix.superglobalmegacorp.com

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