Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/m68k/fpsp040/satanh.S
10817 views
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
| For details on the license for this file, please see the
49
| file, README, in this same directory.
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
104
105