[BACK]Return to stanh.sa CVS log [TXT][DIR] Up to [local] / sys / arch / m68k / fpsp

Annotation of sys/arch/m68k/fpsp/stanh.sa, Revision 1.1.1.1

1.1       nbrk        1: *      $OpenBSD: stanh.sa,v 1.2 1996/05/29 21:05:43 niklas Exp $
                      2: *      $NetBSD: stanh.sa,v 1.3 1994/10/26 07:50:12 cgd Exp $
                      3:
                      4: *      MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
                      5: *      M68000 Hi-Performance Microprocessor Division
                      6: *      M68040 Software Package
                      7: *
                      8: *      M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
                      9: *      All rights reserved.
                     10: *
                     11: *      THE SOFTWARE is provided on an "AS IS" basis and without warranty.
                     12: *      To the maximum extent permitted by applicable law,
                     13: *      MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
                     14: *      INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
                     15: *      PARTICULAR PURPOSE and any warranty against infringement with
                     16: *      regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
                     17: *      and any accompanying written materials.
                     18: *
                     19: *      To the maximum extent permitted by applicable law,
                     20: *      IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
                     21: *      (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
                     22: *      PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
                     23: *      OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
                     24: *      SOFTWARE.  Motorola assumes no responsibility for the maintenance
                     25: *      and support of the SOFTWARE.
                     26: *
                     27: *      You are hereby granted a copyright license to use, modify, and
                     28: *      distribute the SOFTWARE so long as this entire notice is retained
                     29: *      without alteration in any modified and/or redistributed versions,
                     30: *      and that such modified versions are clearly identified as such.
                     31: *      No licenses are granted by implication, estoppel or otherwise
                     32: *      under any patents or trademarks of Motorola, Inc.
                     33:
                     34: *
                     35: *      stanh.sa 3.1 12/10/90
                     36: *
                     37: *      The entry point sTanh computes the hyperbolic tangent of
                     38: *      an input argument; sTanhd does the same except for denormalized
                     39: *      input.
                     40: *
                     41: *      Input: Double-extended number X in location pointed to
                     42: *              by address register a0.
                     43: *
                     44: *      Output: The value tanh(X) returned in floating-point register Fp0.
                     45: *
                     46: *      Accuracy and Monotonicity: The returned result is within 3 ulps in
                     47: *              64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
                     48: *              result is subsequently rounded to double precision. The
                     49: *              result is provably monotonic in double precision.
                     50: *
                     51: *      Speed: The program stanh takes approximately 270 cycles.
                     52: *
                     53: *      Algorithm:
                     54: *
                     55: *      TANH
                     56: *      1. If |X| >= (5/2) log2 or |X| <= 2**(-40), go to 3.
                     57: *
                     58: *      2. (2**(-40) < |X| < (5/2) log2) Calculate tanh(X) by
                     59: *              sgn := sign(X), y := 2|X|, z := expm1(Y), and
                     60: *              tanh(X) = sgn*( z/(2+z) ).
                     61: *              Exit.
                     62: *
                     63: *      3. (|X| <= 2**(-40) or |X| >= (5/2) log2). If |X| < 1,
                     64: *              go to 7.
                     65: *
                     66: *      4. (|X| >= (5/2) log2) If |X| >= 50 log2, go to 6.
                     67: *
                     68: *      5. ((5/2) log2 <= |X| < 50 log2) Calculate tanh(X) by
                     69: *              sgn := sign(X), y := 2|X|, z := exp(Y),
                     70: *              tanh(X) = sgn - [ sgn*2/(1+z) ].
                     71: *              Exit.
                     72: *
                     73: *      6. (|X| >= 50 log2) Tanh(X) = +-1 (round to nearest). Thus, we
                     74: *              calculate Tanh(X) by
                     75: *              sgn := sign(X), Tiny := 2**(-126),
                     76: *              tanh(X) := sgn - sgn*Tiny.
                     77: *              Exit.
                     78: *
                     79: *      7. (|X| < 2**(-40)). Tanh(X) = X.       Exit.
                     80: *
                     81:
                     82: STANH  IDNT    2,1 Motorola 040 Floating Point Software Package
                     83:
                     84:        section 8
                     85:
                     86:        include fpsp.h
                     87:
                     88: X      equ     FP_SCR5
                     89: XDCARE equ     X+2
                     90: XFRAC  equ     X+4
                     91:
                     92: SGN    equ     L_SCR3
                     93:
                     94: V      equ     FP_SCR6
                     95:
                     96: BOUNDS1        DC.L $3FD78000,$3FFFDDCE ... 2^(-40), (5/2)LOG2
                     97:
                     98:        xref    t_frcinx
                     99:        xref    t_extdnrm
                    100:        xref    setox
                    101:        xref    setoxm1
                    102:
                    103:        xdef    stanhd
                    104: stanhd:
                    105: *--TANH(X) = X FOR DENORMALIZED X
                    106:
                    107:        bra             t_extdnrm
                    108:
                    109:        xdef    stanh
                    110: stanh:
                    111:        FMOVE.X         (a0),FP0        ...LOAD INPUT
                    112:
                    113:        FMOVE.X         FP0,X(a6)
                    114:        move.l          (a0),d0
                    115:        move.w          4(a0),d0
                    116:        MOVE.L          D0,X(a6)
                    117:        AND.L           #$7FFFFFFF,D0
                    118:        CMP2.L          BOUNDS1(pc),D0  ...2**(-40) < |X| < (5/2)LOG2 ?
                    119:        BCS.B           TANHBORS
                    120:
                    121: *--THIS IS THE USUAL CASE
                    122: *--Y = 2|X|, Z = EXPM1(Y), TANH(X) = SIGN(X) * Z / (Z+2).
                    123:
                    124:        MOVE.L          X(a6),D0
                    125:        MOVE.L          D0,SGN(a6)
                    126:        AND.L           #$7FFF0000,D0
                    127:        ADD.L           #$00010000,D0   ...EXPONENT OF 2|X|
                    128:        MOVE.L          D0,X(a6)
                    129:        AND.L           #$80000000,SGN(a6)
                    130:        FMOVE.X         X(a6),FP0               ...FP0 IS Y = 2|X|
                    131:
                    132:        move.l          d1,-(a7)
                    133:        clr.l           d1
                    134:        fmovem.x        fp0,(a0)
                    135:        bsr             setoxm1         ...FP0 IS Z = EXPM1(Y)
                    136:        move.l          (a7)+,d1
                    137:
                    138:        FMOVE.X         FP0,FP1
                    139:        FADD.S          #:40000000,FP1  ...Z+2
                    140:        MOVE.L          SGN(a6),D0
                    141:        FMOVE.X         FP1,V(a6)
                    142:        EOR.L           D0,V(a6)
                    143:
                    144:        FMOVE.L         d1,FPCR         ;restore users exceptions
                    145:        FDIV.X          V(a6),FP0
                    146:        bra             t_frcinx
                    147:
                    148: TANHBORS:
                    149:        CMP.L           #$3FFF8000,D0
                    150:        BLT.W           TANHSM
                    151:
                    152:        CMP.L           #$40048AA1,D0
                    153:        BGT.W           TANHHUGE
                    154:
                    155: *-- (5/2) LOG2 < |X| < 50 LOG2,
                    156: *--TANH(X) = 1 - (2/[EXP(2X)+1]). LET Y = 2|X|, SGN = SIGN(X),
                    157: *--TANH(X) = SGN -     SGN*2/[EXP(Y)+1].
                    158:
                    159:        MOVE.L          X(a6),D0
                    160:        MOVE.L          D0,SGN(a6)
                    161:        AND.L           #$7FFF0000,D0
                    162:        ADD.L           #$00010000,D0   ...EXPO OF 2|X|
                    163:        MOVE.L          D0,X(a6)                ...Y = 2|X|
                    164:        AND.L           #$80000000,SGN(a6)
                    165:        MOVE.L          SGN(a6),D0
                    166:        FMOVE.X         X(a6),FP0               ...Y = 2|X|
                    167:
                    168:        move.l          d1,-(a7)
                    169:        clr.l           d1
                    170:        fmovem.x        fp0,(a0)
                    171:        bsr             setox           ...FP0 IS EXP(Y)
                    172:        move.l          (a7)+,d1
                    173:        move.l          SGN(a6),d0
                    174:        FADD.S          #:3F800000,FP0  ...EXP(Y)+1
                    175:
                    176:        EOR.L           #$C0000000,D0   ...-SIGN(X)*2
                    177:        FMOVE.S         d0,FP1          ...-SIGN(X)*2 IN SGL FMT
                    178:        FDIV.X          FP0,FP1         ...-SIGN(X)2 / [EXP(Y)+1 ]
                    179:
                    180:        MOVE.L          SGN(a6),D0
                    181:        OR.L            #$3F800000,D0   ...SGN
                    182:        FMOVE.S         d0,FP0          ...SGN IN SGL FMT
                    183:
                    184:        FMOVE.L         d1,FPCR         ;restore users exceptions
                    185:        FADD.X          fp1,FP0
                    186:
                    187:        bra             t_frcinx
                    188:
                    189: TANHSM:
                    190:        CLR.W           XDCARE(a6)
                    191:
                    192:        FMOVE.L         d1,FPCR         ;restore users exceptions
                    193:        FMOVE.X         X(a6),FP0               ;last inst - possible exception set
                    194:
                    195:        bra             t_frcinx
                    196:
                    197: TANHHUGE:
                    198: *---RETURN SGN(X) - SGN(X)EPS
                    199:        MOVE.L          X(a6),D0
                    200:        AND.L           #$80000000,D0
                    201:        OR.L            #$3F800000,D0
                    202:        FMOVE.S         d0,FP0
                    203:        AND.L           #$80000000,D0
                    204:        EOR.L           #$80800000,D0   ...-SIGN(X)*EPS
                    205:
                    206:        FMOVE.L         d1,FPCR         ;restore users exceptions
                    207:        FADD.S          d0,FP0
                    208:
                    209:        bra             t_frcinx
                    210:
                    211:        end

CVSweb