Annotation of 43BSDTahoe/usr.lib/libm/tahoe/sqrt.s, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1987 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  *
                     17:  * All recipients should regard themselves as participants in an ongoing
                     18:  * research project and hence should feel obligated to report their
                     19:  * experiences (good or bad) with these elementary function codes, using
                     20:  * the sendbug(8) program, to the authors.
                     21:  */
                     22:        .data
                     23:        .align  2
                     24: _sccsid:
                     25: .asciz "@(#)sqrt.s     5.4     (ucb.elefunt)   6/30/88"
                     26: 
                     27: /*
                     28:  * double sqrt(arg)   revised August 15,1982
                     29:  * double arg;
                     30:  * if(arg<0.0) { _errno = EDOM; return(<a reserved operand>); }
                     31:  * if arg is a reserved operand it is returned as it is
                     32:  * W. Kahan's magic square root
                     33:  * Coded by Heidi Stettner and revised by Emile LeBlanc 8/18/82.
                     34:  * Re-coded in tahoe assembly language by Z. Alex Liu 7/13/87.
                     35:  *
                     36:  * entry points:_d_sqrt                address of double arg is on the stack
                     37:  *             _sqrt           double arg is on the stack
                     38:  */
                     39:        .text
                     40:        .align  2
                     41:        .globl  _sqrt
                     42:        .globl  _d_sqrt
                     43:        .globl  libm$dsqrt_r5
                     44:        .set    EDOM,33
                     45: 
                     46: _d_sqrt:
                     47:        .word   0x003c          # save r2-r5
                     48:        movl    4(fp),r2
                     49:        movl    (r2),r0
                     50:        movl    4(r2),r1        # r0:r1 = x
                     51:        brb     1f
                     52: _sqrt:
                     53:        .word   0x003c          # save r2-r5
                     54:        movl    4(fp),r0
                     55:        movl    8(fp),r1        # r0:r1 = x
                     56: 1:     andl3   $0x7f800000,r0,r2       # r2 = biased exponent
                     57:        bneq    2f
                     58:        ret                     # biased exponent is zero -> 0 or reserved op.
                     59: /*
                     60:  *                             # internal procedure
                     61:  *                             # ENTRY POINT FOR cdabs and cdsqrt
                     62:  */
                     63: libm$dsqrt_r5:                 # returns double square root scaled by 2^r6
                     64:        .word   0x0000          # save nothing
                     65: 2:     ldd     r0
                     66:        std     r4
                     67:        bleq    nonpos          # argument is not positive
                     68:        andl3   $0xfffe0000,r4,r2
                     69:        shar    $1,r2,r0
                     70:        addl2   $0x203c0000,r0  # r0 has magic initial approximation
                     71: /*
                     72:  *                             # Do two steps of Heron's rule
                     73:  *                             # ((arg/guess)+guess)/2 = better guess
                     74:  */
                     75:        ldf     r4
                     76:        divf    r0
                     77:        addf    r0
                     78:        stf     r0
                     79:        subl2   $0x800000,r0    # divide by two
                     80:        ldf     r4
                     81:        divf    r0
                     82:        addf    r0
                     83:        stf     r0
                     84:        subl2   $0x800000,r0    # divide by two
                     85: /*
                     86:  *                             # Scale argument and approximation
                     87:  *                             # to prevent over/underflow
                     88:  */
                     89:        andl3   $0x7f800000,r4,r1
                     90:        subl2   $0x40800000,r1  # r1 contains scaling factor
                     91:        subl2   r1,r4           # r4:r5 = n/s
                     92:        movl    r0,r2
                     93:        subl2   r1,r2           # r2 = a/s
                     94: /*
                     95:  *                             # Cubic step
                     96:  *                             # b = a+2*a*(n-a*a)/(n+3*a*a) where
                     97:  *                             # b is better approximation, a is approximation
                     98:  *                             # and n is the original argument.
                     99:  *                             # s := scale factor.
                    100:  */
                    101:        clrl    r1              # r0:r1 = a
                    102:        clrl    r3              # r2:r3 = a/s
                    103:        ldd     r0              # acc = a
                    104:        muld    r2              # acc = a*a/s
                    105:        std     r2              # r2:r3 = a*a/s
                    106:        negd                    # acc = -a*a/s
                    107:        addd    r4              # acc = n/s-a*a/s
                    108:        std     r4              # r4:r5 = n/s-a*a/s
                    109:        addl2   $0x1000000,r2   # r2:r3 = 4*a*a/s
                    110:        ldd     r2              # acc = 4*a*a/s
                    111:        addd    r4              # acc = n/s+3*a*a/s
                    112:        std     r2              # r2:r3 = n/s+3*a*a/s
                    113:        ldd     r0              # acc = a
                    114:        muld    r4              # acc = a*n/s-a*a*a/s
                    115:        divd    r2              # acc = a*(n-a*a)/(n+3*a*a)
                    116:        std     r4              # r4:r5 = a*(n-a*a)/(n+3*a*a)
                    117:        addl2   $0x800000,r4    # r4:r5 = 2*a*(n-a*a)/(n+3*a*a)
                    118:        ldd     r4              # acc = 2*a*(n-a*a)/(n+3*a*a)
                    119:        addd    r0              # acc = a+2*a*(n-a*a)/(n+3*a*a)
                    120:        std     r0              # r0:r1 = a+2*a*(n-a*a)/(n+3*a*a)
                    121:        ret                     # rsb
                    122: nonpos:
                    123:        bneq    negarg
                    124:        ret                     # argument and root are zero
                    125: negarg:
                    126:        pushl   $EDOM
                    127:        callf   $8,_infnan      # generate the reserved op fault
                    128:        ret

unix.superglobalmegacorp.com

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