Annotation of 43BSDReno/lib/libm/vax/cabs.s, revision 1.1

1.1     ! root        1: # Copyright (c) 1985 Regents of the University of California.
        !             2: # All rights reserved.
        !             3: #
        !             4: # Redistribution and use in source and binary forms are permitted
        !             5: # provided that the above copyright notice and this paragraph are
        !             6: # duplicated in all such forms and that any documentation,
        !             7: # advertising materials, and other materials related to such
        !             8: # distribution and use acknowledge that the software was developed
        !             9: # by the University of California, Berkeley.  The name of the
        !            10: # University may not be used to endorse or promote products derived
        !            11: # from this software without specific prior written permission.
        !            12: # THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            13: # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            14: # WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            15: #
        !            16: # All recipients should regard themselves as participants in an ongoing
        !            17: # research project and hence should feel obligated to report their
        !            18: # experiences (good or bad) with these elementary function codes, using
        !            19: # the sendbug(8) program, to the authors.
        !            20: #
        !            21: #      @(#)cabs.s      5.3 (Berkeley) 6/30/88
        !            22: #
        !            23:        .data
        !            24:        .align  2
        !            25: _sccsid:
        !            26: .asciz "@(#)cabs.s     1.2 (Berkeley) 8/21/85; 5.3 (ucb.elefunt) 6/30/88"
        !            27: 
        !            28: # double precision complex absolute value
        !            29: # CABS by W. Kahan, 9/7/80.
        !            30: # Revised for reserved operands by E. LeBlanc, 8/18/82
        !            31: # argument for complex absolute value by reference, *4(ap)
        !            32: # argument for cabs and hypot (C fcns) by value, 4(ap)
        !            33: # output is in r0:r1 (error less than 0.86 ulps)
        !            34: 
        !            35:        .text
        !            36:        .align  1
        !            37:        .globl  _cabs
        !            38:        .globl  _hypot
        !            39:        .globl  _z_abs
        !            40:        .globl  libm$cdabs_r6
        !            41:        .globl  libm$dsqrt_r5
        !            42: 
        !            43: #      entry for c functions cabs and hypot
        !            44: _cabs:
        !            45: _hypot:
        !            46:        .word   0x807c          # save r2-r6, enable floating overflow
        !            47:        movq    4(ap),r0        # r0:1 = x
        !            48:        movq    12(ap),r2       # r2:3 = y
        !            49:        jmp     cabs2
        !            50: #      entry for Fortran use, call by:   d = abs(z)
        !            51: _z_abs:
        !            52:        .word   0x807c          # save r2-r6, enable floating overflow
        !            53:        movl    4(ap),r2        # indirect addressing is necessary here
        !            54:        movq    (r2)+,r0        # r0:1 = x
        !            55:        movq    (r2),r2         # r2:3 = y
        !            56: 
        !            57: cabs2:
        !            58:        bicw3   $0x7f,r0,r4     # r4 has signed biased exp of x
        !            59:        cmpw    $0x8000,r4
        !            60:        jeql    return          # x is a reserved operand, so return it
        !            61:        bicw3   $0x7f,r2,r5     # r5 has signed biased exp of y
        !            62:        cmpw    $0x8000,r5
        !            63:        jneq    cont            # y isn't a reserved operand
        !            64:        movq    r2,r0           # return y if it's reserved
        !            65:        ret
        !            66: 
        !            67: cont:
        !            68:        bsbb    regs_set        # r0:1 = dsqrt(x^2+y^2)/2^r6
        !            69:        addw2   r6,r0           # unscaled cdabs in r0:1
        !            70:        jvc     return          # unless it overflows
        !            71:        subw2   $0x80,r0        # halve r0 to get meaningful overflow
        !            72:        addd2   r0,r0           # overflow; r0 is half of true abs value
        !            73: return:
        !            74:        ret
        !            75: 
        !            76: libm$cdabs_r6:                 # ENTRY POINT for cdsqrt
        !            77:                                # calculates a scaled (factor in r6)
        !            78:                                # complex absolute value
        !            79: 
        !            80:        movq    (r4)+,r0        # r0:r1 = x via indirect addressing
        !            81:        movq    (r4),r2         # r2:r3 = y via indirect addressing
        !            82: 
        !            83:        bicw3   $0x7f,r0,r5     # r5 has signed biased exp of x
        !            84:        cmpw    $0x8000,r5
        !            85:        jeql    cdreserved      # x is a reserved operand
        !            86:        bicw3   $0x7f,r2,r5     # r5 has signed biased exp of y
        !            87:        cmpw    $0x8000,r5
        !            88:        jneq    regs_set        # y isn't a reserved operand either?
        !            89: 
        !            90: cdreserved:
        !            91:        movl    *4(ap),r4       # r4 -> (u,v), if x or y is reserved
        !            92:        movq    r0,(r4)+        # copy u and v as is and return
        !            93:        movq    r2,(r4)         # (again addressing is indirect)
        !            94:        ret
        !            95: 
        !            96: regs_set:
        !            97:        bicw2   $0x8000,r0      # r0:r1 = dabs(x)
        !            98:        bicw2   $0x8000,r2      # r2:r3 = dabs(y)
        !            99:        cmpw    r0,r2
        !           100:        jgeq    ordered
        !           101:        movq    r0,r4
        !           102:        movq    r2,r0
        !           103:        movq    r4,r2           # force y's exp <= x's exp
        !           104: ordered:
        !           105:        bicw3   $0x7f,r0,r6     # r6 = exponent(x) + bias(129)
        !           106:        jeql    retsb           # if x = y = 0 then cdabs(x,y) = 0
        !           107:        subw2   $0x4780,r6      # r6 = exponent(x) - 14
        !           108:        subw2   r6,r0           # 2^14 <= scaled x < 2^15
        !           109:        bitw    $0xff80,r2
        !           110:        jeql    retsb           # if y = 0 return dabs(x)
        !           111:        subw2   r6,r2
        !           112:        cmpw    $0x3780,r2      # if scaled y < 2^-18
        !           113:        jgtr    retsb           #   return dabs(x)
        !           114:        emodd   r0,$0,r0,r4,r0  # r4 + r0:1 = scaled x^2
        !           115:        emodd   r2,$0,r2,r5,r2  # r5 + r2:3 = scaled y^2
        !           116:        addd2   r2,r0
        !           117:        addl2   r5,r4
        !           118:        cvtld   r4,r2
        !           119:        addd2   r2,r0           # r0:1 = scaled x^2 + y^2
        !           120:        jmp     libm$dsqrt_r5   # r0:1 = dsqrt(x^2+y^2)/2^r6
        !           121: retsb:
        !           122:        rsb                     # error < 0.86 ulp

unix.superglobalmegacorp.com

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