blob: 517fa45632463772b3b42d27d4a84267df4b3026 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001|
2| slog2.sa 3.1 12/10/90
3|
4| The entry point slog10 computes the base-10
5| logarithm of an input argument X.
6| slog10d does the same except the input value is a
7| denormalized number.
8| sLog2 and sLog2d are the base-2 analogues.
9|
10| INPUT: Double-extended value in memory location pointed to
11| by address register a0.
12|
13| OUTPUT: log_10(X) or log_2(X) returned in floating-point
14| register fp0.
15|
16| ACCURACY and MONOTONICITY: The returned result is within 1.7
17| ulps in 64 significant bit, i.e. within 0.5003 ulp
18| to 53 bits if the result is subsequently rounded
19| to double precision. The result is provably monotonic
20| in double precision.
21|
22| SPEED: Two timings are measured, both in the copy-back mode.
23| The first one is measured when the function is invoked
24| the first time (so the instructions and data are not
25| in cache), and the second one is measured when the
26| function is reinvoked at the same input argument.
27|
28| ALGORITHM and IMPLEMENTATION NOTES:
29|
30| slog10d:
31|
32| Step 0. If X < 0, create a NaN and raise the invalid operation
33| flag. Otherwise, save FPCR in D1; set FpCR to default.
34| Notes: Default means round-to-nearest mode, no floating-point
35| traps, and precision control = double extended.
36|
37| Step 1. Call slognd to obtain Y = log(X), the natural log of X.
38| Notes: Even if X is denormalized, log(X) is always normalized.
39|
40| Step 2. Compute log_10(X) = log(X) * (1/log(10)).
41| 2.1 Restore the user FPCR
42| 2.2 Return ans := Y * INV_L10.
43|
44|
45| slog10:
46|
47| Step 0. If X < 0, create a NaN and raise the invalid operation
48| flag. Otherwise, save FPCR in D1; set FpCR to default.
49| Notes: Default means round-to-nearest mode, no floating-point
50| traps, and precision control = double extended.
51|
52| Step 1. Call sLogN to obtain Y = log(X), the natural log of X.
53|
54| Step 2. Compute log_10(X) = log(X) * (1/log(10)).
55| 2.1 Restore the user FPCR
56| 2.2 Return ans := Y * INV_L10.
57|
58|
59| sLog2d:
60|
61| Step 0. If X < 0, create a NaN and raise the invalid operation
62| flag. Otherwise, save FPCR in D1; set FpCR to default.
63| Notes: Default means round-to-nearest mode, no floating-point
64| traps, and precision control = double extended.
65|
66| Step 1. Call slognd to obtain Y = log(X), the natural log of X.
67| Notes: Even if X is denormalized, log(X) is always normalized.
68|
69| Step 2. Compute log_10(X) = log(X) * (1/log(2)).
70| 2.1 Restore the user FPCR
71| 2.2 Return ans := Y * INV_L2.
72|
73|
74| sLog2:
75|
76| Step 0. If X < 0, create a NaN and raise the invalid operation
77| flag. Otherwise, save FPCR in D1; set FpCR to default.
78| Notes: Default means round-to-nearest mode, no floating-point
79| traps, and precision control = double extended.
80|
81| Step 1. If X is not an integer power of two, i.e., X != 2^k,
82| go to Step 3.
83|
84| Step 2. Return k.
85| 2.1 Get integer k, X = 2^k.
86| 2.2 Restore the user FPCR.
87| 2.3 Return ans := convert-to-double-extended(k).
88|
89| Step 3. Call sLogN to obtain Y = log(X), the natural log of X.
90|
91| Step 4. Compute log_2(X) = log(X) * (1/log(2)).
92| 4.1 Restore the user FPCR
93| 4.2 Return ans := Y * INV_L2.
94|
95
96| Copyright (C) Motorola, Inc. 1990
97| All Rights Reserved
98|
99| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
100| The copyright notice above does not evidence any
101| actual or intended publication of such source code.
102
103|SLOG2 idnt 2,1 | Motorola 040 Floating Point Software Package
104
105 |section 8
106
107 |xref t_frcinx
108 |xref t_operr
109 |xref slogn
110 |xref slognd
111
112INV_L10: .long 0x3FFD0000,0xDE5BD8A9,0x37287195,0x00000000
113
114INV_L2: .long 0x3FFF0000,0xB8AA3B29,0x5C17F0BC,0x00000000
115
116 .global slog10d
117slog10d:
118|--entry point for Log10(X), X is denormalized
119 movel (%a0),%d0
120 blt invalid
121 movel %d1,-(%sp)
122 clrl %d1
123 bsr slognd | ...log(X), X denorm.
124 fmovel (%sp)+,%fpcr
125 fmulx INV_L10,%fp0
126 bra t_frcinx
127
128 .global slog10
129slog10:
130|--entry point for Log10(X), X is normalized
131
132 movel (%a0),%d0
133 blt invalid
134 movel %d1,-(%sp)
135 clrl %d1
136 bsr slogn | ...log(X), X normal.
137 fmovel (%sp)+,%fpcr
138 fmulx INV_L10,%fp0
139 bra t_frcinx
140
141
142 .global slog2d
143slog2d:
144|--entry point for Log2(X), X is denormalized
145
146 movel (%a0),%d0
147 blt invalid
148 movel %d1,-(%sp)
149 clrl %d1
150 bsr slognd | ...log(X), X denorm.
151 fmovel (%sp)+,%fpcr
152 fmulx INV_L2,%fp0
153 bra t_frcinx
154
155 .global slog2
156slog2:
157|--entry point for Log2(X), X is normalized
158 movel (%a0),%d0
159 blt invalid
160
161 movel 8(%a0),%d0
162 bnes continue | ...X is not 2^k
163
164 movel 4(%a0),%d0
165 andl #0x7FFFFFFF,%d0
166 tstl %d0
167 bnes continue
168
169|--X = 2^k.
170 movew (%a0),%d0
171 andl #0x00007FFF,%d0
172 subl #0x3FFF,%d0
173 fmovel %d1,%fpcr
174 fmovel %d0,%fp0
175 bra t_frcinx
176
177continue:
178 movel %d1,-(%sp)
179 clrl %d1
180 bsr slogn | ...log(X), X normal.
181 fmovel (%sp)+,%fpcr
182 fmulx INV_L2,%fp0
183 bra t_frcinx
184
185invalid:
186 bra t_operr
187
188 |end