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