Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | | |
2 | | scosh.sa 3.1 12/10/90 | |
3 | | | |
4 | | The entry point sCosh computes the hyperbolic cosine of | |
5 | | an input argument; sCoshd 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 cosh(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 sCOSH takes approximately 250 cycles. | |
19 | | | |
20 | | Algorithm: | |
21 | | | |
22 | | COSH | |
23 | | 1. If |X| > 16380 log2, go to 3. | |
24 | | | |
25 | | 2. (|X| <= 16380 log2) Cosh(X) is obtained by the formulae | |
26 | | y = |X|, z = exp(Y), and | |
27 | | cosh(X) = (1/2)*( z + 1/z ). | |
28 | | Exit. | |
29 | | | |
30 | | 3. (|X| > 16380 log2). If |X| > 16480 log2, go to 5. | |
31 | | | |
32 | | 4. (16380 log2 < |X| <= 16480 log2) | |
33 | | cosh(X) = sign(X) * exp(|X|)/2. | |
34 | | However, invoking exp(|X|) may cause premature overflow. | |
35 | | Thus, we calculate sinh(X) as follows: | |
36 | | Y := |X| | |
37 | | Fact := 2**(16380) | |
38 | | Y' := Y - 16381 log2 | |
39 | | cosh(X) := Fact * exp(Y'). | |
40 | | Exit. | |
41 | | | |
42 | | 5. (|X| > 16480 log2) sinh(X) must overflow. Return | |
43 | | Huge*Huge to generate overflow and an infinity with | |
44 | | the appropriate sign. Huge is the largest finite number in | |
45 | | extended format. Exit. | |
46 | | | |
47 | | | |
48 | ||
49 | | Copyright (C) Motorola, Inc. 1990 | |
50 | | All Rights Reserved | |
51 | | | |
52 | | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | |
53 | | The copyright notice above does not evidence any | |
54 | | actual or intended publication of such source code. | |
55 | ||
56 | |SCOSH idnt 2,1 | Motorola 040 Floating Point Software Package | |
57 | ||
58 | |section 8 | |
59 | ||
60 | |xref t_ovfl | |
61 | |xref t_frcinx | |
62 | |xref setox | |
63 | ||
64 | T1: .long 0x40C62D38,0xD3D64634 | ... 16381 LOG2 LEAD | |
65 | T2: .long 0x3D6F90AE,0xB1E75CC7 | ... 16381 LOG2 TRAIL | |
66 | ||
67 | TWO16380: .long 0x7FFB0000,0x80000000,0x00000000,0x00000000 | |
68 | ||
69 | .global scoshd | |
70 | scoshd: | |
71 | |--COSH(X) = 1 FOR DENORMALIZED X | |
72 | ||
73 | fmoves #0x3F800000,%fp0 | |
74 | ||
75 | fmovel %d1,%FPCR | |
76 | fadds #0x00800000,%fp0 | |
77 | bra t_frcinx | |
78 | ||
79 | .global scosh | |
80 | scosh: | |
81 | fmovex (%a0),%fp0 | ...LOAD INPUT | |
82 | ||
83 | movel (%a0),%d0 | |
84 | movew 4(%a0),%d0 | |
85 | andil #0x7FFFFFFF,%d0 | |
86 | cmpil #0x400CB167,%d0 | |
87 | bgts COSHBIG | |
88 | ||
89 | |--THIS IS THE USUAL CASE, |X| < 16380 LOG2 | |
90 | |--COSH(X) = (1/2) * ( EXP(X) + 1/EXP(X) ) | |
91 | ||
92 | fabsx %fp0 | ...|X| | |
93 | ||
94 | movel %d1,-(%sp) | |
95 | clrl %d1 | |
96 | fmovemx %fp0-%fp0,(%a0) |pass parameter to setox | |
97 | bsr setox | ...FP0 IS EXP(|X|) | |
98 | fmuls #0x3F000000,%fp0 | ...(1/2)EXP(|X|) | |
99 | movel (%sp)+,%d1 | |
100 | ||
101 | fmoves #0x3E800000,%fp1 | ...(1/4) | |
102 | fdivx %fp0,%fp1 | ...1/(2 EXP(|X|)) | |
103 | ||
104 | fmovel %d1,%FPCR | |
105 | faddx %fp1,%fp0 | |
106 | ||
107 | bra t_frcinx | |
108 | ||
109 | COSHBIG: | |
110 | cmpil #0x400CB2B3,%d0 | |
111 | bgts COSHHUGE | |
112 | ||
113 | fabsx %fp0 | |
114 | fsubd T1(%pc),%fp0 | ...(|X|-16381LOG2_LEAD) | |
115 | fsubd T2(%pc),%fp0 | ...|X| - 16381 LOG2, ACCURATE | |
116 | ||
117 | movel %d1,-(%sp) | |
118 | clrl %d1 | |
119 | fmovemx %fp0-%fp0,(%a0) | |
120 | bsr setox | |
121 | fmovel (%sp)+,%fpcr | |
122 | ||
123 | fmulx TWO16380(%pc),%fp0 | |
124 | bra t_frcinx | |
125 | ||
126 | COSHHUGE: | |
127 | fmovel #0,%fpsr |clr N bit if set by source | |
128 | bclrb #7,(%a0) |always return positive value | |
129 | fmovemx (%a0),%fp0-%fp0 | |
130 | bra t_ovfl | |
131 | ||
132 | |end |