OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [m68k/] [fpsp040/] [stanh.S] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
|
2
|       stanh.sa 3.1 12/10/90
3
|
4
|       The entry point sTanh computes the hyperbolic tangent of
5
|       an input argument; sTanhd does the same except for denormalized
6
|       input.
7
|
8
|       Input: Double-extended number X in location pointed to
9
|               by address register a0.
10
|
11
|       Output: The value tanh(X) returned in floating-point register Fp0.
12
|
13
|       Accuracy and Monotonicity: The returned result is within 3 ulps in
14
|               64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
15
|               result is subsequently rounded to double precision. The
16
|               result is provably monotonic in double precision.
17
|
18
|       Speed: The program stanh takes approximately 270 cycles.
19
|
20
|       Algorithm:
21
|
22
|       TANH
23
|       1. If |X| >= (5/2) log2 or |X| <= 2**(-40), go to 3.
24
|
25
|       2. (2**(-40) < |X| < (5/2) log2) Calculate tanh(X) by
26
|               sgn := sign(X), y := 2|X|, z := expm1(Y), and
27
|               tanh(X) = sgn*( z/(2+z) ).
28
|               Exit.
29
|
30
|       3. (|X| <= 2**(-40) or |X| >= (5/2) log2). If |X| < 1,
31
|               go to 7.
32
|
33
|       4. (|X| >= (5/2) log2) If |X| >= 50 log2, go to 6.
34
|
35
|       5. ((5/2) log2 <= |X| < 50 log2) Calculate tanh(X) by
36
|               sgn := sign(X), y := 2|X|, z := exp(Y),
37
|               tanh(X) = sgn - [ sgn*2/(1+z) ].
38
|               Exit.
39
|
40
|       6. (|X| >= 50 log2) Tanh(X) = +-1 (round to nearest). Thus, we
41
|               calculate Tanh(X) by
42
|               sgn := sign(X), Tiny := 2**(-126),
43
|               tanh(X) := sgn - sgn*Tiny.
44
|               Exit.
45
|
46
|       7. (|X| < 2**(-40)). Tanh(X) = X.       Exit.
47
|
48
 
49
|               Copyright (C) Motorola, Inc. 1990
50
|                       All Rights Reserved
51
|
52
|       For details on the license for this file, please see the
53
|       file, README, in this same directory.
54
 
55
|STANH  idnt    2,1 | Motorola 040 Floating Point Software Package
56
 
57
        |section        8
58
 
59
#include "fpsp.h"
60
 
61
        .set    X,FP_SCR5
62
        .set    XDCARE,X+2
63
        .set    XFRAC,X+4
64
 
65
        .set    SGN,L_SCR3
66
 
67
        .set    V,FP_SCR6
68
 
69
BOUNDS1:        .long 0x3FD78000,0x3FFFDDCE | ... 2^(-40), (5/2)LOG2
70
 
71
        |xref   t_frcinx
72
        |xref   t_extdnrm
73
        |xref   setox
74
        |xref   setoxm1
75
 
76
        .global stanhd
77
stanhd:
78
|--TANH(X) = X FOR DENORMALIZED X
79
 
80
        bra             t_extdnrm
81
 
82
        .global stanh
83
stanh:
84
        fmovex          (%a0),%fp0      | ...LOAD INPUT
85
 
86
        fmovex          %fp0,X(%a6)
87
        movel           (%a0),%d0
88
        movew           4(%a0),%d0
89
        movel           %d0,X(%a6)
90
        andl            #0x7FFFFFFF,%d0
91
        cmp2l           BOUNDS1(%pc),%d0        | ...2**(-40) < |X| < (5/2)LOG2 ?
92
        bcss            TANHBORS
93
 
94
|--THIS IS THE USUAL CASE
95
|--Y = 2|X|, Z = EXPM1(Y), TANH(X) = SIGN(X) * Z / (Z+2).
96
 
97
        movel           X(%a6),%d0
98
        movel           %d0,SGN(%a6)
99
        andl            #0x7FFF0000,%d0
100
        addl            #0x00010000,%d0 | ...EXPONENT OF 2|X|
101
        movel           %d0,X(%a6)
102
        andl            #0x80000000,SGN(%a6)
103
        fmovex          X(%a6),%fp0             | ...FP0 IS Y = 2|X|
104
 
105
        movel           %d1,-(%a7)
106
        clrl            %d1
107
        fmovemx %fp0-%fp0,(%a0)
108
        bsr             setoxm1         | ...FP0 IS Z = EXPM1(Y)
109
        movel           (%a7)+,%d1
110
 
111
        fmovex          %fp0,%fp1
112
        fadds           #0x40000000,%fp1        | ...Z+2
113
        movel           SGN(%a6),%d0
114
        fmovex          %fp1,V(%a6)
115
        eorl            %d0,V(%a6)
116
 
117
        fmovel          %d1,%FPCR               |restore users exceptions
118
        fdivx           V(%a6),%fp0
119
        bra             t_frcinx
120
 
121
TANHBORS:
122
        cmpl            #0x3FFF8000,%d0
123
        blt             TANHSM
124
 
125
        cmpl            #0x40048AA1,%d0
126
        bgt             TANHHUGE
127
 
128
|-- (5/2) LOG2 < |X| < 50 LOG2,
129
|--TANH(X) = 1 - (2/[EXP(2X)+1]). LET Y = 2|X|, SGN = SIGN(X),
130
|--TANH(X) = SGN -      SGN*2/[EXP(Y)+1].
131
 
132
        movel           X(%a6),%d0
133
        movel           %d0,SGN(%a6)
134
        andl            #0x7FFF0000,%d0
135
        addl            #0x00010000,%d0 | ...EXPO OF 2|X|
136
        movel           %d0,X(%a6)              | ...Y = 2|X|
137
        andl            #0x80000000,SGN(%a6)
138
        movel           SGN(%a6),%d0
139
        fmovex          X(%a6),%fp0             | ...Y = 2|X|
140
 
141
        movel           %d1,-(%a7)
142
        clrl            %d1
143
        fmovemx %fp0-%fp0,(%a0)
144
        bsr             setox           | ...FP0 IS EXP(Y)
145
        movel           (%a7)+,%d1
146
        movel           SGN(%a6),%d0
147
        fadds           #0x3F800000,%fp0        | ...EXP(Y)+1
148
 
149
        eorl            #0xC0000000,%d0 | ...-SIGN(X)*2
150
        fmoves          %d0,%fp1                | ...-SIGN(X)*2 IN SGL FMT
151
        fdivx           %fp0,%fp1               | ...-SIGN(X)2 / [EXP(Y)+1 ]
152
 
153
        movel           SGN(%a6),%d0
154
        orl             #0x3F800000,%d0 | ...SGN
155
        fmoves          %d0,%fp0                | ...SGN IN SGL FMT
156
 
157
        fmovel          %d1,%FPCR               |restore users exceptions
158
        faddx           %fp1,%fp0
159
 
160
        bra             t_frcinx
161
 
162
TANHSM:
163
        movew           #0x0000,XDCARE(%a6)
164
 
165
        fmovel          %d1,%FPCR               |restore users exceptions
166
        fmovex          X(%a6),%fp0             |last inst - possible exception set
167
 
168
        bra             t_frcinx
169
 
170
TANHHUGE:
171
|---RETURN SGN(X) - SGN(X)EPS
172
        movel           X(%a6),%d0
173
        andl            #0x80000000,%d0
174
        orl             #0x3F800000,%d0
175
        fmoves          %d0,%fp0
176
        andl            #0x80000000,%d0
177
        eorl            #0x80800000,%d0 | ...-SIGN(X)*EPS
178
 
179
        fmovel          %d1,%FPCR               |restore users exceptions
180
        fadds           %d0,%fp0
181
 
182
        bra             t_frcinx
183
 
184
        |end

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.