]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | | |
2 | | satanh.sa 3.3 12/19/90 | |
3 | | | |
4 | | The entry point satanh computes the inverse | |
5 | | hyperbolic tangent of | |
6 | | an input argument; satanhd does the same except for denormalized | |
7 | | input. | |
8 | | | |
9 | | Input: Double-extended number X in location pointed to | |
10 | | by address register a0. | |
11 | | | |
12 | | Output: The value arctanh(X) returned in floating-point register Fp0. | |
13 | | | |
14 | | Accuracy and Monotonicity: The returned result is within 3 ulps in | |
15 | | 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the | |
16 | | result is subsequently rounded to double precision. The | |
17 | | result is provably monotonic in double precision. | |
18 | | | |
19 | | Speed: The program satanh takes approximately 270 cycles. | |
20 | | | |
21 | | Algorithm: | |
22 | | | |
23 | | ATANH | |
24 | | 1. If |X| >= 1, go to 3. | |
25 | | | |
26 | | 2. (|X| < 1) Calculate atanh(X) by | |
27 | | sgn := sign(X) | |
28 | | y := |X| | |
29 | | z := 2y/(1-y) | |
30 | | atanh(X) := sgn * (1/2) * logp1(z) | |
31 | | Exit. | |
32 | | | |
33 | | 3. If |X| > 1, go to 5. | |
34 | | | |
35 | | 4. (|X| = 1) Generate infinity with an appropriate sign and | |
36 | | divide-by-zero by | |
37 | | sgn := sign(X) | |
38 | | atan(X) := sgn / (+0). | |
39 | | Exit. | |
40 | | | |
41 | | 5. (|X| > 1) Generate an invalid operation by 0 * infinity. | |
42 | | Exit. | |
43 | | | |
44 | ||
45 | | Copyright (C) Motorola, Inc. 1990 | |
46 | | All Rights Reserved | |
47 | | | |
e00d82d0 MW |
48 | | For details on the license for this file, please see the |
49 | | file, README, in this same directory. | |
1da177e4 LT |
50 | |
51 | |satanh idnt 2,1 | Motorola 040 Floating Point Software Package | |
52 | ||
53 | |section 8 | |
54 | ||
55 | |xref t_dz | |
56 | |xref t_operr | |
57 | |xref t_frcinx | |
58 | |xref t_extdnrm | |
59 | |xref slognp1 | |
60 | ||
61 | .global satanhd | |
62 | satanhd: | |
63 | |--ATANH(X) = X FOR DENORMALIZED X | |
64 | ||
65 | bra t_extdnrm | |
66 | ||
67 | .global satanh | |
68 | satanh: | |
69 | movel (%a0),%d0 | |
70 | movew 4(%a0),%d0 | |
71 | andil #0x7FFFFFFF,%d0 | |
72 | cmpil #0x3FFF8000,%d0 | |
73 | bges ATANHBIG | |
74 | ||
75 | |--THIS IS THE USUAL CASE, |X| < 1 | |
76 | |--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z). | |
77 | ||
78 | fabsx (%a0),%fp0 | ...Y = |X| | |
79 | fmovex %fp0,%fp1 | |
80 | fnegx %fp1 | ...-Y | |
81 | faddx %fp0,%fp0 | ...2Y | |
82 | fadds #0x3F800000,%fp1 | ...1-Y | |
83 | fdivx %fp1,%fp0 | ...2Y/(1-Y) | |
84 | movel (%a0),%d0 | |
85 | andil #0x80000000,%d0 | |
86 | oril #0x3F000000,%d0 | ...SIGN(X)*HALF | |
87 | movel %d0,-(%sp) | |
88 | ||
89 | fmovemx %fp0-%fp0,(%a0) | ...overwrite input | |
90 | movel %d1,-(%sp) | |
91 | clrl %d1 | |
92 | bsr slognp1 | ...LOG1P(Z) | |
93 | fmovel (%sp)+,%fpcr | |
94 | fmuls (%sp)+,%fp0 | |
95 | bra t_frcinx | |
96 | ||
97 | ATANHBIG: | |
98 | fabsx (%a0),%fp0 | ...|X| | |
99 | fcmps #0x3F800000,%fp0 | |
100 | fbgt t_operr | |
101 | bra t_dz | |
102 | ||
103 | |end |