Annotation of 43BSD/usr.lib/libm/VAX/sqrt.s, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Copyright (c) 1985 Regents of the University of California.
                      3:  * 
                      4:  * Use and reproduction of this software are granted  in  accordance  with
                      5:  * the terms and conditions specified in  the  Berkeley  Software  License
                      6:  * Agreement (in particular, this entails acknowledgement of the programs'
                      7:  * source, and inclusion of this notice) with the additional understanding
                      8:  * that  all  recipients  should regard themselves as participants  in  an
                      9:  * ongoing  research  project and hence should  feel  obligated  to report
                     10:  * their  experiences (good or bad) with these elementary function  codes,
                     11:  * using "sendbug 4bsd-bugs@BERKELEY", to the authors.
                     12:  *
                     13:  *
                     14:  * @(#)sqrt.s  1.1 (Berkeley) 8/21/85
                     15:  *
                     16:  * double sqrt(arg)   revised August 15,1982
                     17:  * double arg;
                     18:  * if(arg<0.0) { _errno = EDOM; return(<a reserved operand>); }
                     19:  * if arg is a reserved operand it is returned as it is
                     20:  * W. Kahan's magic square root
                     21:  * coded by Heidi Stettner and revised by Emile LeBlanc 8/18/82
                     22:  *
                     23:  * entry points:_d_sqrt                address of double arg is on the stack
                     24:  *             _sqrt           double arg is on the stack
                     25:  */
                     26:        .text
                     27:        .align  1
                     28:        .globl  _sqrt
                     29:        .globl  _d_sqrt
                     30:        .globl  libm$dsqrt_r5
                     31:        .set    EDOM,33
                     32: 
                     33: _d_sqrt:
                     34:        .word   0x003c          # save r5,r4,r3,r2
                     35:        movq    *4(ap),r0
                     36:        jmp     dsqrt2
                     37: _sqrt:
                     38:        .word   0x003c          # save r5,r4,r3,r2
                     39:        movq    4(ap),r0
                     40: dsqrt2:        bicw3   $0x807f,r0,r2   # check exponent of input
                     41:        jeql    noexp           # biased exponent is zero -> 0.0 or reserved
                     42:        bsbb    libm$dsqrt_r5
                     43: noexp: ret
                     44: 
                     45: /* **************************** internal procedure */
                     46: 
                     47: libm$dsqrt_r5:                 # ENTRY POINT FOR cdabs and cdsqrt
                     48:                                # returns double square root scaled by
                     49:                                # 2^r6
                     50: 
                     51:        movd    r0,r4
                     52:        jleq    nonpos          # argument is not positive
                     53:        movzwl  r4,r2
                     54:        ashl    $-1,r2,r0
                     55:        addw2   $0x203c,r0      # r0 has magic initial approximation
                     56: /*
                     57:  * Do two steps of Heron's rule
                     58:  * ((arg/guess) + guess) / 2 = better guess
                     59:  */
                     60:        divf3   r0,r4,r2
                     61:        addf2   r2,r0
                     62:        subw2   $0x80,r0        # divide by two
                     63: 
                     64:        divf3   r0,r4,r2
                     65:        addf2   r2,r0
                     66:        subw2   $0x80,r0        # divide by two
                     67: 
                     68: /* Scale argument and approximation to prevent over/underflow */
                     69: 
                     70:        bicw3   $0x807f,r4,r1
                     71:        subw2   $0x4080,r1              # r1 contains scaling factor
                     72:        subw2   r1,r4
                     73:        movl    r0,r2
                     74:        subw2   r1,r2
                     75: 
                     76: /* Cubic step
                     77:  *
                     78:  * b = a + 2*a*(n-a*a)/(n+3*a*a) where b is better approximation,
                     79:  * a is approximation, and n is the original argument.
                     80:  * (let s be scale factor in the following comments)
                     81:  */
                     82:        clrl    r1
                     83:        clrl    r3
                     84:        muld2   r0,r2                   # r2:r3 = a*a/s
                     85:        subd2   r2,r4                   # r4:r5 = n/s - a*a/s
                     86:        addw2   $0x100,r2               # r2:r3 = 4*a*a/s
                     87:        addd2   r4,r2                   # r2:r3 = n/s + 3*a*a/s
                     88:        muld2   r0,r4                   # r4:r5 = a*n/s - a*a*a/s
                     89:        divd2   r2,r4                   # r4:r5 = a*(n-a*a)/(n+3*a*a)
                     90:        addw2   $0x80,r4                # r4:r5 = 2*a*(n-a*a)/(n+3*a*a)
                     91:        addd2   r4,r0                   # r0:r1 = a + 2*a*(n-a*a)/(n+3*a*a)
                     92:        rsb                             # DONE!
                     93: nonpos:
                     94:        jneq    negarg
                     95:        ret                     # argument and root are zero
                     96: negarg:
                     97:        pushl   $EDOM
                     98:        calls   $1,_infnan      # generate the reserved op fault
                     99:        ret

unix.superglobalmegacorp.com

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