diff options
Diffstat (limited to 'arch/m68k/fpsp040/satanh.S')
-rw-r--r-- | arch/m68k/fpsp040/satanh.S | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/arch/m68k/fpsp040/satanh.S b/arch/m68k/fpsp040/satanh.S new file mode 100644 index 000000000000..20f07810bcda --- /dev/null +++ b/arch/m68k/fpsp040/satanh.S | |||
@@ -0,0 +1,104 @@ | |||
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 | ||