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

unix.superglobalmegacorp.com

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