Annotation of 43BSD/usr.lib/liboldnm/sqrt.s, revision 1.1

1.1     ! root        1: #
        !             2: # Copyright (c) 1980 Regents of the University of California.
        !             3: # All rights reserved.  The Berkeley software License Agreement
        !             4: # specifies the terms and conditions for redistribution.
        !             5: #
        !             6: #      @(#)sqrt.s      5.1 (Berkeley) 5/8/85
        !             7: # 
        !             8: #
        !             9: # double sqrt(arg):revised July 18,1980
        !            10: # double arg
        !            11: # if(arg<0.0) { _errno=EDOM; return(-sqrt(-arg)) }
        !            12: # W. Kahan's magic sqrt
        !            13: # coded by Heidi Stettner
        !            14: 
        !            15:        .set    EDOM,98
        !            16:        .text
        !            17:        .align  1
        !            18:        .globl  _sqrt
        !            19:        .globl  dsqrt_r5
        !            20:        .globl  _errno
        !            21: _sqrt:
        !            22:        .word   0x003c          # save r5,r4,r3,r2
        !            23:        bispsw  $0xe0
        !            24:        movd    4(ap),r0
        !            25:        bsbb    dsqrt_r5
        !            26:        ret
        !            27: dsqrt_r5:
        !            28:        movd    r0,r4
        !            29:        jleq    nonpos          #argument is not positive
        !            30:        movzwl  r4,r2
        !            31:        ashl    $-1,r2,r0
        !            32:        addw2   $0x203c,r0      #r0 has magic initial appx
        !            33: 
        !            34: # Do two steps of Heron's rule
        !            35: 
        !            36:        divf3   r0,r4,r2        
        !            37:        addf2   r2,r0
        !            38:        subw2   $0x80,r0
        !            39: 
        !            40:        divf3   r0,r4,r2
        !            41:        addf2   r2,r0
        !            42:        subw2   $0x80,r0
        !            43: 
        !            44: 
        !            45: # Scale argument and approximation to prevent over/underflow
        !            46: # NOTE: The following four steps would not be necessary if underflow
        !            47: #       were gentle.
        !            48: 
        !            49:        bicw3   $0xffff807f,r4,r1
        !            50:        subw2   $0x4080,r1              # r1 contains scaling factor
        !            51:        subw2   r1,r4
        !            52:        movl    r0,r2
        !            53:        subw2   r1,r2
        !            54: 
        !            55: # Cubic step
        !            56: 
        !            57:        clrl    r1
        !            58:        clrl    r3
        !            59:        muld2   r0,r2
        !            60:        subd2   r2,r4
        !            61:        addw2   $0x100,r2
        !            62:        addd2   r4,r2
        !            63:        muld2   r0,r4
        !            64:        divd2   r2,r4
        !            65:        addw2   $0x80,r4
        !            66:        addd2   r4,r0
        !            67:        rsb
        !            68: nonpos:
        !            69:        jneq    negarg
        !            70:        clrd    r0              #argument is zero
        !            71:        rsb
        !            72: negarg:
        !            73:        movl    $EDOM,_errno
        !            74:        mnegd   r4,-(sp)
        !            75:        calls   $2,_sqrt
        !            76:        mnegd   r0,r0           # returns -sqrt(-arg)
        !            77:        ret

unix.superglobalmegacorp.com

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