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 | | | |
48 | | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | |
49 | | The copyright notice above does not evidence any | |
50 | | actual or intended publication of such source code. | |
51 | ||
52 | |satanh idnt 2,1 | Motorola 040 Floating Point Software Package | |
53 | ||
54 | |section 8 | |
55 | ||
56 | |xref t_dz | |
57 | |xref t_operr | |
58 | |xref t_frcinx | |
59 | |xref t_extdnrm | |
60 | |xref slognp1 | |
61 | ||
62 | .global satanhd | |
63 | satanhd: | |
64 | |--ATANH(X) = X FOR DENORMALIZED X | |
65 | ||
66 | bra t_extdnrm | |
67 | ||
68 | .global satanh | |
69 | satanh: | |
70 | movel (%a0),%d0 | |
71 | movew 4(%a0),%d0 | |
72 | andil #0x7FFFFFFF,%d0 | |
73 | cmpil #0x3FFF8000,%d0 | |
74 | bges ATANHBIG | |
75 | ||
76 | |--THIS IS THE USUAL CASE, |X| < 1 | |
77 | |--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z). | |
78 | ||
79 | fabsx (%a0),%fp0 | ...Y = |X| | |
80 | fmovex %fp0,%fp1 | |
81 | fnegx %fp1 | ...-Y | |
82 | faddx %fp0,%fp0 | ...2Y | |
83 | fadds #0x3F800000,%fp1 | ...1-Y | |
84 | fdivx %fp1,%fp0 | ...2Y/(1-Y) | |
85 | movel (%a0),%d0 | |
86 | andil #0x80000000,%d0 | |
87 | oril #0x3F000000,%d0 | ...SIGN(X)*HALF | |
88 | movel %d0,-(%sp) | |
89 | ||
90 | fmovemx %fp0-%fp0,(%a0) | ...overwrite input | |
91 | movel %d1,-(%sp) | |
92 | clrl %d1 | |
93 | bsr slognp1 | ...LOG1P(Z) | |
94 | fmovel (%sp)+,%fpcr | |
95 | fmuls (%sp)+,%fp0 | |
96 | bra t_frcinx | |
97 | ||
98 | ATANHBIG: | |
99 | fabsx (%a0),%fp0 | ...|X| | |
100 | fcmps #0x3F800000,%fp0 | |
101 | fbgt t_operr | |
102 | bra t_dz | |
103 | ||
104 | |end |