Annotation of 43BSDTahoe/usr.lib/libm/vax/support.s, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1985 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:  *     @(#)support.s   5.3 (Berkeley) 6/30/88
                     23:  */
                     24:        .data
                     25:        .align  2
                     26: _sccsid:
                     27: .asciz "@(#)support.s  1.3 (Berkeley) 8/21/85; 5.3 (ucb.elefunt) 6/30/88"
                     28: 
                     29: /*
                     30:  * copysign(x,y),
                     31:  * logb(x),
                     32:  * scalb(x,N),
                     33:  * finite(x),
                     34:  * drem(x,y),
                     35:  * Coded in vax assembly language by K.C. Ng,  3/14/85.
                     36:  * Revised by K.C. Ng on 4/9/85.
                     37:  */
                     38: 
                     39: /*
                     40:  * double copysign(x,y)
                     41:  * double x,y;
                     42:  */
                     43:        .globl  _copysign
                     44:        .text
                     45:        .align  1
                     46: _copysign:
                     47:        .word   0x4
                     48:        movq    4(ap),r0                # load x into r0
                     49:        bicw3   $0x807f,r0,r2           # mask off the exponent of x
                     50:        beql    Lz                      # if zero or reserved op then return x
                     51:        bicw3   $0x7fff,12(ap),r2       # copy the sign bit of y into r2
                     52:        bicw2   $0x8000,r0              # replace x by |x|
                     53:        bisw2   r2,r0                   # copy the sign bit of y to x
                     54: Lz:    ret
                     55: 
                     56: /*
                     57:  * double logb(x)
                     58:  * double x;
                     59:  */
                     60:        .globl  _logb
                     61:        .text
                     62:        .align  1
                     63: _logb:
                     64:        .word   0x0
                     65:        bicl3   $0xffff807f,4(ap),r0    # mask off the exponent of x
                     66:        beql    Ln
                     67:        ashl    $-7,r0,r0               # get the bias exponent
                     68:        subl2   $129,r0                 # get the unbias exponent
                     69:        cvtld   r0,r0                   # return the answer in double
                     70:        ret
                     71: Ln:    movq    4(ap),r0                # r0:1 = x (zero or reserved op)
                     72:        bneq    1f                      # simply return if reserved op
                     73:        movq    $0x0000fe00ffffcfff,r0  # -2147483647.0
                     74: 1:     ret
                     75: 
                     76: /*
                     77:  * long finite(x)
                     78:  * double x;
                     79:  */
                     80:        .globl  _finite
                     81:        .text
                     82:        .align  1
                     83: _finite:
                     84:        .word   0x0000
                     85:        bicw3   $0x7f,4(ap),r0          # mask off the mantissa
                     86:        cmpw    r0,$0x8000              # to see if x is the reserved op
                     87:        beql    1f                      # if so, return FALSE (0)
                     88:        movl    $1,r0                   # else return TRUE (1)
                     89:        ret
                     90: 1:     clrl    r0
                     91:        ret
                     92: 
                     93: /*
                     94:  * double scalb(x,N)
                     95:  * double x; int N;
                     96:  */
                     97:        .globl  _scalb
                     98:        .set    ERANGE,34
                     99:        .text
                    100:        .align  1
                    101: _scalb:
                    102:        .word   0xc
                    103:        movq    4(ap),r0
                    104:        bicl3   $0xffff807f,r0,r3
                    105:        beql    ret1                    # 0 or reserved operand
                    106:        movl    12(ap),r2
                    107:        cmpl    r2,$0x12c
                    108:        bgeq    ovfl
                    109:        cmpl    r2,$-0x12c
                    110:        bleq    unfl
                    111:        ashl    $7,r2,r2
                    112:        addl2   r2,r3
                    113:        bleq    unfl
                    114:        cmpl    r3,$0x8000
                    115:        bgeq    ovfl
                    116:        addl2   r2,r0
                    117:        ret
                    118: ovfl:  pushl   $ERANGE
                    119:        calls   $1,_infnan              # if it returns
                    120:        bicw3   $0x7fff,4(ap),r2        # get the sign of input arg
                    121:        bisw2   r2,r0                   # re-attach the sign to r0/1
                    122:        ret
                    123: unfl:  movq    $0,r0
                    124: ret1:  ret
                    125: 
                    126: /*
                    127:  * DREM(X,Y)
                    128:  * RETURN X REM Y =X-N*Y, N=[X/Y] ROUNDED (ROUNDED TO EVEN IN THE HALF WAY CASE)
                    129:  * DOUBLE PRECISION (VAX D format 56 bits)
                    130:  * CODED IN VAX ASSEMBLY LANGUAGE BY K.C. NG, 4/8/85.
                    131:  */
                    132:        .globl  _drem
                    133:        .set    EDOM,33
                    134:        .text
                    135:        .align  1
                    136: _drem:
                    137:        .word   0xffc
                    138:        subl2   $12,sp  
                    139:        movq    4(ap),r0                #r0=x
                    140:        movq    12(ap),r2               #r2=y
                    141:        jeql    Rop                     #if y=0 then generate reserved op fault
                    142:        bicw3   $0x007f,r0,r4           #check if x is Rop
                    143:        cmpw    r4,$0x8000
                    144:        jeql    Ret                     #if x is Rop then return Rop
                    145:        bicl3   $0x007f,r2,r4           #check if y is Rop
                    146:        cmpw    r4,$0x8000
                    147:        jeql    Ret                     #if y is Rop then return Rop
                    148:        bicw2   $0x8000,r2              #y  := |y|
                    149:        movw    $0,-4(fp)               #-4(fp) = nx := 0
                    150:        cmpw    r2,$0x1c80              #yexp ? 57 
                    151:        bgtr    C1                      #if yexp > 57 goto C1
                    152:        addw2   $0x1c80,r2              #scale up y by 2**57
                    153:        movw    $0x1c80,-4(fp)          #nx := 57 (exponent field)
                    154: C1:
                    155:        movw    -4(fp),-8(fp)           #-8(fp) = nf := nx
                    156:        bicw3   $0x7fff,r0,-12(fp)      #-12(fp) = sign of x
                    157:        bicw2   $0x8000,r0              #x  := |x|
                    158:        movq    r2,r10                  #y1 := y
                    159:        bicl2   $0xffff07ff,r11         #clear the last 27 bits of y1
                    160: loop:
                    161:        cmpd    r0,r2                   #x ? y
                    162:        bleq    E1                      #if x <= y goto E1
                    163:  /* begin argument reduction */
                    164:        movq    r2,r4                   #t =y
                    165:        movq    r10,r6                  #t1=y1
                    166:        bicw3   $0x807f,r0,r8           #xexp= exponent of x
                    167:        bicw3   $0x807f,r2,r9           #yexp= exponent fo y
                    168:        subw2   r9,r8                   #xexp-yexp
                    169:        subw2   $0x0c80,r8              #k=xexp-yexp-25(exponent bit field)
                    170:        blss    C2                      #if k<0 goto C2
                    171:        addw2   r8,r4                   #t +=k  
                    172:        addw2   r8,r6                   #t1+=k, scale up t and t1
                    173: C2:
                    174:        divd3   r4,r0,r8                #x/t
                    175:        cvtdl   r8,r8                   #n=[x/t] truncated
                    176:        cvtld   r8,r8                   #float(n)
                    177:        subd2   r6,r4                   #t:=t-t1
                    178:        muld2   r8,r4                   #n*(t-t1)
                    179:        muld2   r8,r6                   #n*t1
                    180:        subd2   r6,r0                   #x-n*t1
                    181:        subd2   r4,r0                   #(x-n*t1)-n*(t-t1)
                    182:        brb     loop
                    183: E1:
                    184:        movw    -4(fp),r6               #r6=nx
                    185:        beql    C3                      #if nx=0 goto C3
                    186:        addw2   r6,r0                   #x:=x*2**57 scale up x by nx
                    187:        movw    $0,-4(fp)               #clear nx
                    188:        brb     loop
                    189: C3:
                    190:        movq    r2,r4                   #r4 = y
                    191:        subw2   $0x80,r4                #r4 = y/2
                    192:        cmpd    r0,r4                   #x:y/2
                    193:        blss    E2                      #if x < y/2 goto E2
                    194:        bgtr    C4                      #if x > y/2 goto C4
                    195:        cvtdl   r8,r8                   #ifix(float(n))
                    196:        blbc    r8,E2                   #if the last bit is zero, goto E2
                    197: C4:
                    198:        subd2   r2,r0                   #x-y
                    199: E2:
                    200:        xorw2   -12(fp),r0              #x^sign (exclusive or)
                    201:        movw    -8(fp),r6               #r6=nf
                    202:        bicw3   $0x807f,r0,r8           #r8=exponent of x
                    203:        bicw2   $0x7f80,r0              #clear the exponent of x
                    204:        subw2   r6,r8                   #r8=xexp-nf
                    205:        bgtr    C5                      #if xexp-nf is positive goto C5
                    206:        movw    $0,r8                   #clear r8
                    207:        movq    $0,r0                   #x underflow to zero
                    208: C5:
                    209:        bisw2   r8,r0                   #put r8 into x's exponent field
                    210:        ret
                    211: Rop:                                   #Reserved operand
                    212:        pushl   $EDOM
                    213:        calls   $1,_infnan              #generate reserved op fault
                    214:        ret
                    215: Ret:
                    216:        movq    $0x8000,r0              #propagate reserved op
                    217:        ret

unix.superglobalmegacorp.com

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