Annotation of 43BSD/usr.lib/libm/VAX/cbrt.s, revision 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: # @(#)cbrt.s   1.1 (Berkeley) 5/23/85
        !            15: 
        !            16: # double cbrt(double arg)
        !            17: # W. Kahan, 10/13/80. revised 1/13/84 for keeping sign symmetry
        !            18: # error check by E LeBlanc, 8/18/82
        !            19: # Revised and tested by K.C. Ng, 5/2/85  
        !            20: # Max error less than 0.667 ulps (unit in the last places)
        !            21:        .globl  _cbrt
        !            22:        .globl  _d_cbrt
        !            23:        .globl  _dcbrt_
        !            24:        .text
        !            25:        .align  1
        !            26: 
        !            27: _cbrt:
        !            28: _d_cbrt:
        !            29:        .word   0x00fc          # save r2 to r7
        !            30:        movq    4(ap),r0        # r0 = argument x
        !            31:        jmp     dcbrt2
        !            32: _dcbrt_:
        !            33:        .word   0x00fc          # save r2 to r7
        !            34:        movq    *4(ap),r0       # r0 = argument x
        !            35: 
        !            36: dcbrt2:        bicw3   $0x807f,r0,r2   # biased exponent of x
        !            37:        jeql    return          # dcbrt(0)=0  dcbrt(res)=res. operand
        !            38:        bicw3   $0x7fff,r0,ap   # ap has sign(x)
        !            39:        xorw2   ap,r0           # r0 is abs(x)
        !            40:        movl    r0,r2           # r2 has abs(x)
        !            41:        rotl    $16,r2,r2       # r2 = |x| with bits unscrambled
        !            42:        divl2   $3,r2           # rough dcbrt with bias/3
        !            43:        addl2   B,r2            # restore bias, diminish fraction
        !            44:        rotl    $16,r2,r2       # r2=|q|=|dcbrt| to 5 bits
        !            45:        mulf3   r2,r2,r3        # r3 =qq
        !            46:        divf2   r0,r3           # r3 = qq/x
        !            47:        mulf2   r2,r3
        !            48:        addf2   C,r3            # r3 = s = C + qqq/x
        !            49:        divf3   r3,D,r4         # r4 = D/s
        !            50:        addf2   E,r4
        !            51:        addf2   r4,r3           # r3 = s + E + D/s
        !            52:        divf3   r3,F,r3         # r3 = F / (s + E + D/s)
        !            53:        addf2   G,r3            # r3 = G + F / (s + E + D/s)
        !            54:        mulf2   r3,r2           # r2 = qr3 = new q to 23 bits
        !            55:        clrl    r3              # r2:r3 = q as double float
        !            56:        muld3   r2,r2,r4        # r4:r5 = qq exactly
        !            57:        divd2   r4,r0           # r0:r1 = x/(q*q) rounded
        !            58:        subd3   r2,r0,r6        # r6:r7 = x/(q*q) - q exactly
        !            59:        movq    r2,r4           # r4:r5 = q
        !            60:        addw2   $0x80,r4        # r4:r5 = 2 * q
        !            61:        addd2   r0,r4           # r4:r5 = 2*q + x/(q*q)
        !            62:        divd2   r4,r6           # r6:r7 = (x/(q*q)-q)/(2*q+x/(q*q))
        !            63:        muld2   r2,r6           # r6:r7 = q*(x/(q*q)-q)/(2*q+x/(q*q))
        !            64:        addd3   r6,r2,r0        # r0:r1 = q + r6:r7
        !            65:        bisw2   ap,r0           # restore the sign bit
        !            66: return:
        !            67:        ret                     # error less than 0.667 ulps
        !            68: 
        !            69: .data
        !            70: .align 2
        !            71: B :    .long            721142941              # (86-0.03306235651)*(2^23)
        !            72: C :    .float          0f0.5428571429          # 19/35
        !            73: D :    .float          0f-0.7053061224         # -864/1225
        !            74: E :    .float          0f1.414285714           # 99/70
        !            75: F :    .float          0f1.607142857           # 45/28
        !            76: G :    .float          0f0.3571428571          # 5/14
        !            77: 

unix.superglobalmegacorp.com

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