2.9
[glibc/nacl-glibc.git] / sysdeps / ia64 / fpu / e_log2l.S
blobb3fe63f182860763957321842187345accb7b62b
1 .file "log2l.s"
4 // Copyright (c) 2000 - 2003, Intel Corporation
5 // All rights reserved.
6 //
7 // Contributed 2000 by the Intel Numerics Group, Intel Corporation
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are
11 // met:
13 // * Redistributions of source code must retain the above copyright
14 // notice, this list of conditions and the following disclaimer.
16 // * Redistributions in binary form must reproduce the above copyright
17 // notice, this list of conditions and the following disclaimer in the
18 // documentation and/or other materials provided with the distribution.
20 // * The name of Intel Corporation may not be used to endorse or promote
21 // products derived from this software without specific prior written
22 // permission.
24 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
25 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
26 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS 
28 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
30 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
31 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
32 // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING
33 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
34 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
35 // 
36 // Intel Corporation is the author of this code, and requests that all
37 // problem reports or change requests be submitted to it directly at 
38 // http://www.intel.com/software/products/opensource/libraries/num.htm.
40 // History
41 //==============================================================
42 // 09/25/00 Initial version 
43 // 11/22/00 Fixed accuracy bug (for mantissas near 1, 2)
44 // 12/07/00 Fixed C_1l constant, eliminated rounding errors in 
45 //          reduced argument (x*frcpa(x)-1)
46 // 05/20/02 Cleaned up namespace and sf0 syntax
47 // 02/10/03 Reordered header: .section, .global, .proc, .align
49 // API
50 //==============================================================
51 // long double log2l(long double)
53 // Overview of operation
54 //==============================================================
55 // Background
57 // Implementation
59 // Let x = 2^l * m, where     m=1.b1 b2 ... b8 b9 ... b52
60 //     y=frcpa(m),   r=m*y-1, f=b1 b2 .. b8 
61 // T_hi is a table that stores the 24 most significant bits of log2(1/y) 
62 // (in entries 1..255) in single precision format
63 // T_low is a table that stores (log2(1/y)-T_high), rounded to double
64 // precision 
66 // f is used as an index; T_high[255]=T_low[255]=0
67 // 
68 // If f=0 and b9=0, r is set to 2^{-8}* 0.b9 b10 ... b52 = m-1 (fractional part of m),
69 //                  and 0 is used instead of T_high[0], T_low[0] 
70 //                  (polynomial evaluation only, for m=1+r, 0<=r<2^{-9})
71 // If f=255, r is set to (m-2)/2  (T[255]=0, and only polynomial evaluation is used
72 //                                 for m=2(1-r'), 0<=r'<2^{-9})
74 // If 2^{-9}<=m<2-2^{-8} or (input not near 1), let C1r=(2^{16}+C1*r)-2^{16}
75 //                       and let E=((RN(m*y)-1)-r)+(m*y-RN(m*y))
76 // Else let C1r=C1*r (rounded to 64 significant bits)  and let  E=0
78 // Let D=C1*r-C1r
81 // log2l(x) is approximated as
82 //     (l+T_high[f]+C1r) + (D+r*(c1+c2*r+c3*r^2...+c8*r^7)+(T_low[f]+C_1*E))
83 // 
86 // Special values 
87 //==============================================================
88 //  log2l(0)=-inf, raises Divide by Zero
89 //  log2l(+inf)=inf
90 //  log2l(x)=NaN,  raises Invalid if x<0
94 // Registers used
95 //==============================================================
96 //   f6-f15, f32-f36
97 //   r2-r3, r23-r23
98 //   p6,p7,p8,p12
102 GR_SAVE_B0                    = r33
103 GR_SAVE_PFS                   = r34
104 GR_SAVE_GP                    = r35 // This reg. can safely be used 
105 GR_SAVE_SP                    = r36
107 GR_Parameter_X                = r37
108 GR_Parameter_Y                = r38
109 GR_Parameter_RESULT           = r39
110 GR_Parameter_TAG              = r40
112 FR_X             = f10
113 FR_Y             = f1
114 FR_RESULT        = f8
119 // Data tables
120 //==============================================================
122 RODATA
124 .align 16
126 LOCAL_OBJECT_START(poly_coeffs)
128 data8 0xb8aa3b295c17f0bc, 0x00003fff  // C_1
129 data8 0x3fca61762a7aded9, 0xbfc71547652b82fe // C_7, C_8
130 data8 0x3fd2776c50ef9bfe, 0xbfcec709dc3a03fd // C_5, C_6 
131 data8 0x3fdec709dc3a03fd, 0xbfd71547652b82fe  // C_3, C_4
132 //data8 0xd871319ff0342580, 0x0000bfbd  // C_1l (low part of C1)
133 data8 0x82f0025f2dc582ee, 0x0000bfbe   // C_1l (low part of C1)
134 data8 0xb8aa3b295c17f0bc, 0x0000bffe  // C_2
135 LOCAL_OBJECT_END(poly_coeffs)
140 LOCAL_OBJECT_START(T_table)
142 data4 0x3b38d875, 0x3c0ae7f4, 0x3c67f738, 0x3ca2b253
143 data4 0x3ccbb91d, 0x3cfac91e, 0x3d1504a5, 0x3d29c4a0
144 data4 0x3d419264, 0x3d567aa6, 0x3d6e76ca, 0x3d81c3f7
145 data4 0x3d8c5630, 0x3d9876e9, 0x3da31e0a, 0x3dadcf09
146 data4 0x3db889f9, 0x3dc34eec, 0x3dce1df5, 0x3dd8f726
147 data4 0x3de3da94, 0x3deec851, 0x3df82ea4, 0x3e0197dd
148 data4 0x3e071dad, 0x3e0ca8ca, 0x3e116d6e, 0x3e170281
149 data4 0x3e1bcfbc, 0x3e216ee9, 0x3e2644dc, 0x3e2b1ee1
150 data4 0x3e30cd12, 0x3e35affd, 0x3e3a970f, 0x3e3f824f
151 data4 0x3e4544c0, 0x3e4a3926, 0x3e4f31d1, 0x3e542ec7
152 data4 0x3e593012, 0x3e5e35b7, 0x3e633fbf, 0x3e677625
153 data4 0x3e6c884b, 0x3e719eea, 0x3e76ba0a, 0x3e7bd9b2
154 data4 0x3e80111d, 0x3e82a523, 0x3e84ccec, 0x3e876533
155 data4 0x3e89ffd1, 0x3e8c2d22, 0x3e8e5c18, 0x3e90fd0a
156 data4 0x3e932fa9, 0x3e95d506, 0x3e980b5a, 0x3e9a4361
157 data4 0x3e9c7d1f, 0x3e9f2b16, 0x3ea168a0, 0x3ea3a7ea
158 data4 0x3ea5e8f5, 0x3ea82bc4, 0x3eaa705b, 0x3eacb6bb
159 data4 0x3eaefee7, 0x3eb148e3, 0x3eb394b1, 0x3eb5e255
160 data4 0x3eb831d0, 0x3eba8327, 0x3ebcd65c, 0x3ebeb3e0
161 data4 0x3ec10a7a, 0x3ec362f9, 0x3ec5bd63, 0x3ec7a0b3
162 data4 0x3ec9fe96, 0x3ecc5e6c, 0x3ece4619, 0x3ed0a978
163 data4 0x3ed293fe, 0x3ed4faf1, 0x3ed6e859, 0x3ed952eb
164 data4 0x3edb433c, 0x3eddb178, 0x3edfa4bc, 0x3ee19953
165 data4 0x3ee40cee, 0x3ee60484, 0x3ee7fd73, 0x3ee9f7bb
166 data4 0x3eec7280, 0x3eee6fda, 0x3ef06e94, 0x3ef26eb1
167 data4 0x3ef47031, 0x3ef67317, 0x3ef8f8b2, 0x3efafec5
168 data4 0x3efd0644, 0x3eff0f32, 0x3f008cc8, 0x3f0192b0
169 data4 0x3f029952, 0x3f03a0b0, 0x3f0466b2, 0x3f056f5a
170 data4 0x3f0678c0, 0x3f0782e6, 0x3f088dcc, 0x3f099973
171 data4 0x3f0aa5dd, 0x3f0b6fac, 0x3f0c7d6d, 0x3f0d8bf4
172 data4 0x3f0e575b, 0x3f0f673e, 0x3f1077e9, 0x3f1144ef
173 data4 0x3f1256fc, 0x3f1369d6, 0x3f143880, 0x3f154cc1
174 data4 0x3f161c7a, 0x3f173227, 0x3f1802f2, 0x3f191a0f
175 data4 0x3f19ebee, 0x3f1b047e, 0x3f1bd775, 0x3f1cf17b
176 data4 0x3f1dc58e, 0x3f1ee10f, 0x3f1fb63f, 0x3f208bea
177 data4 0x3f21a98f, 0x3f22805c, 0x3f2357a7, 0x3f247778
178 data4 0x3f254fe9, 0x3f2628d9, 0x3f270249, 0x3f2824fb
179 data4 0x3f28ff97, 0x3f29dab4, 0x3f2ab654, 0x3f2b9277
180 data4 0x3f2cb8c8, 0x3f2d961e, 0x3f2e73fa, 0x3f2f525b
181 data4 0x3f303143, 0x3f3110b1, 0x3f31f0a7, 0x3f32d125
182 data4 0x3f33b22b, 0x3f3493bc, 0x3f3575d6, 0x3f36587b
183 data4 0x3f373bab, 0x3f381f68, 0x3f3903b1, 0x3f39e888
184 data4 0x3f3acdec, 0x3f3bb3e0, 0x3f3c9a63, 0x3f3d8177
185 data4 0x3f3e1bd4, 0x3f3f03d9, 0x3f3fec71, 0x3f40d59b
186 data4 0x3f41bf59, 0x3f42a9ab, 0x3f434635, 0x3f443180
187 data4 0x3f451d61, 0x3f4609d9, 0x3f46a7d3, 0x3f479549
188 data4 0x3f488357, 0x3f492261, 0x3f4a1171, 0x3f4b011c
189 data4 0x3f4ba139, 0x3f4c91e8, 0x3f4d8334, 0x3f4e246a
190 data4 0x3f4f16be, 0x3f5009b1, 0x3f50ac02, 0x3f51a001
191 data4 0x3f524305, 0x3f533812, 0x3f53dbca, 0x3f54d1e7
192 data4 0x3f55c8a8, 0x3f566d85, 0x3f57655b, 0x3f580af0
193 data4 0x3f58b0d0, 0x3f59aa2c, 0x3f5a50c7, 0x3f5b4b3c
194 data4 0x3f5bf294, 0x3f5cee26, 0x3f5d963c, 0x3f5e92ed
195 data4 0x3f5f3bc3, 0x3f5fe4e7, 0x3f60e32d, 0x3f618d13
196 data4 0x3f623748, 0x3f63372a, 0x3f63e223, 0x3f648d6b
197 data4 0x3f658eee, 0x3f663afe, 0x3f66e75e, 0x3f67ea86
198 data4 0x3f6897b0, 0x3f69452c, 0x3f69f2f9, 0x3f6af847
199 data4 0x3f6ba6e2, 0x3f6c55d0, 0x3f6d0510, 0x3f6e0c8d
200 data4 0x3f6ebc9f, 0x3f6f6d04, 0x3f701dbe, 0x3f70cecd
201 data4 0x3f718030, 0x3f728ae6, 0x3f733d20, 0x3f73efaf
202 data4 0x3f74a296, 0x3f7555d3, 0x3f760967, 0x3f76bd53
203 data4 0x3f777197, 0x3f7880a1, 0x3f7935c2, 0x3f79eb3c
204 data4 0x3f7aa10f, 0x3f7b573b, 0x3f7c0dc2, 0x3f7cc4a3
205 data4 0x3f7d7bdf, 0x3f7e3376, 0x3f7eeb68, 0x00000000
206 LOCAL_OBJECT_END(T_table)
210 LOCAL_OBJECT_START(T_low)
213 data8 0x3dc0b97f689876ef, 0x3dfd5d906028ac01
214 data8 0x3df8b9cbb8d7240b, 0x3de0c941a2f220cd
215 data8 0x3e09c6aecba15936, 0x3dfa6d528241827c
216 data8 0x3dd0bad25714903c, 0x3e2776b01dc036a2
217 data8 0x3e2b914bc77f158b, 0x3e1c0fafd29dc74a
218 data8 0x3e28dadc119cd3de, 0x3e3bca869da085be
219 data8 0x3e19d1e700f2200a, 0x3e3e13530cc37504
220 data8 0x3e3936464d9c41ee, 0x3e3c3fa21c9499d0
221 data8 0x3e3259e079b6c6e8, 0x3e2a364069c4f7f3
222 data8 0x3e1274c84f6c6364, 0x3e3796170159f454
223 data8 0x3e26e1e389f4364e, 0x3e28cedda8c7f658
224 data8 0x3e376c2028433268, 0x3e4aee6d650c82e1
225 data8 0x3e33e65094fbeeb4, 0x3e4c7d125aa92c5d
226 data8 0x3e1559a4b69691d8, 0x3e18efabeb7d7221
227 data8 0x3e4c2b255abaa8de, 0x3e37436952a4538b
228 data8 0x3e4e6807f4ba00b8, 0x3e33ff5964190e42
229 data8 0x3e4f5d798cead43c, 0x3e4f3676443bf453
230 data8 0x3e4660f8d5bc1bf5, 0x3e2d4f9f3ab04f36
231 data8 0x3e357f7a64ccd537, 0x3e394caf7c9b05af
232 data8 0x3e225c7d17ab29b0, 0x3e4eb202f6d55a12
233 data8 0x3e32faa68b19bcd2, 0x3e45ee1c9b566a8b
234 data8 0x3e4770a67de054ff, 0x3e42234fb9de6d6b
235 data8 0x3e4ad139825c6e19, 0x3e47f3d334814a93
236 data8 0x3e2af1ec402867b6, 0x3e2bfbda0c956e3d
237 data8 0x3e4287b831e77ff2, 0x3e54bf0eb77f7b89
238 data8 0x3e5b9259a1029607, 0x3e4a764b015e699d
239 data8 0x3e4d0b68ea883ab5, 0x3e33e829ecdadf46
240 data8 0x3e52f27efef3031b, 0x3e3073979e4af89e
241 data8 0x3e3b980f2cd6c253, 0x3e2a5f0f5f7f66a9
242 data8 0x3e37788738117b02, 0x3e58aa29a784d52f
243 data8 0x3e4f5504c4ff2466, 0x3e002d40340fa647
244 data8 0x3e5f53b64592f4c3, 0x3e543f222c526802
245 data8 0x3e5680e547a872fa, 0x3e5e234bd1154450
246 data8 0x3e3000edc18b6d21, 0x3e1c3c1f000942a8
247 data8 0x3e51eeae0e442d6e, 0x3e4fb265376623f2
248 data8 0x3e57b5941782d830, 0x3e3a4b83f24ae52c
249 data8 0x3e5a5fb4f23978de, 0x3e51ed071563fb02
250 data8 0x3e49e2071f51a7a8, 0x3e5e43ae5b924234
251 data8 0x3dfa2be9aedf374a, 0x3e56dea3dbba67d5
252 data8 0x3e3375fe732b3c3e, 0x3e5a0c6f91f2e77e
253 data8 0x3e55e1bf1c969e41, 0x3e30a5a5166b8eee
254 data8 0x3e53e6e9a539d46c, 0x3e542981b3d7b0e6
255 data8 0x3e595fd8ff36ad64, 0x3e5edeb9e65cbbb4
256 data8 0x3e46aeab4d3434c1, 0x3e4ea3ff0564b010
257 data8 0x3e59b00be2e3c25a, 0x3e5b887cd7b0821f
258 data8 0x3e5f666668547b4d, 0x3e4d0733a805273f
259 data8 0x3e26a2ff21c4aec5, 0x3e4c336f7a3a78f3
260 data8 0x3e11ad12b628e2d0, 0x3e56d43ff3f0ea64
261 data8 0x3e238809433cccd2, 0x3e40d9734147d40f
262 data8 0x3e54245fe3e24e06, 0x3e251441fce4d48c
263 data8 0x3e517114efc5d1f9, 0x3e5e9a99154b0d82
264 data8 0x3e442a71337970f8, 0x3e420c7c69211fdf
265 data8 0x3e537e7d5d43c6a7, 0x3e4376c66ad9ad8b
266 data8 0x3e49054d678a4f1c, 0x3e5d23cb3bc19f18
267 data8 0x3e6ebcd449dcab2b, 0x3e67f5fc2849c88a
268 data8 0x3e63f388395d3e84, 0x3e65c1103b0ad7e9
269 data8 0x3e6d5d1dd031f353, 0x3e5a159dae75c4d0
270 data8 0x3e4d5e22aa75f71d, 0x3e5e379ee62e1e35
271 data8 0x3e4df082213cb2dc, 0x3e6bfa06c156f521
272 data8 0x3e66e2d3c19b517b, 0x3e426b7098590071
273 data8 0x3e541bd027e9854e, 0x3e5061dd924b0ac0
274 data8 0x3e6dae01df373a03, 0x3e3baec80b207b0b
275 data8 0x3e6b6a6fe06bebac, 0x3e61aebcfc3ab5d1
276 data8 0x3e584ee3e7c79d83, 0x3e6b3c1b2840cb40
277 data8 0x3e6c842085d6befd, 0x3e6ac04fd7b141e0
278 data8 0x3e6c48250474141d, 0x3e2d889b86125f69
279 data8 0x3e6e74740225dad0, 0x3e45940d31d50a7c
280 data8 0x3e695476a6c39ddc, 0x3e6d9a6d857a060a
281 data8 0x3e4a3e9bb4b69337, 0x3e484f3ce4707ed6
282 data8 0x3e39dd125d25fc27, 0x3e563fb400de8732
283 data8 0x3e5fdd6d0ee28b48, 0x3e669d15b869bb07
284 data8 0x3e40687cfad7964d, 0x3e69317990d43957
285 data8 0x3e633d57e24ae1bd, 0x3e618bf03710eabb
286 data8 0x3e4b4df6fccd1160, 0x3e3fb26ddaa1ec45
287 data8 0x3e3810a5e1817fd4, 0x3e6857373642fa5c
288 data8 0x3e673db6193add31, 0x3e63200c8acbc9c3
289 data8 0x3e3d2dee448ebb62, 0x3e6a19723a80db6a
290 data8 0x3e5e7cdab8fd3e6a, 0x3e671855cd660672
291 data8 0x3e473c3c78a85ecd, 0x3e5f5e23056a7cf2
292 data8 0x3e52538519527367, 0x3e4b573bcf2580e9
293 data8 0x3e6d6f856fe90c60, 0x3e2d932a8487642e
294 data8 0x3e5236fc78b6174c, 0x3e50cb91d406db50
295 data8 0x3e650e8bd562aa57, 0x3e424ee3d9a82f2e
296 data8 0x3e59363960e1e3d9, 0x3e379604c1150a3e
297 data8 0x3e6d914f6c2ac258, 0x3e62967a451a7b48
298 data8 0x3e684b5f01139cb2, 0x3e448bbfbf6d292c
299 data8 0x3e6227e7fb487e73, 0x3e6d39d50290f458
300 data8 0x3e58368342b4b668, 0x3e65dc0c25bd1763
301 data8 0x3e61b7dc362e22b5, 0x3e671691f094bb80
302 data8 0x3e5011642d5123f2, 0x3e4c4eb7f11e41be
303 data8 0x3e5dcee36ca242cf, 0x3e6791cefff688f1
304 data8 0x3e60e23c8dda4ecd, 0x3e48e6a22fe78cfe
305 data8 0x3e6d703f244adc86, 0x3e6a281a85a5049d
306 data8 0x3e570f20e6403d9e, 0x3e2211518a12956f
307 data8 0x3e6737d1e54d71df, 0x3e66b1881476f5e9
308 data8 0x3e6e1bbeef085376, 0x3e47cad4944a32be
309 data8 0x3e527f2c738e7ee9, 0x3e699883a4b9fb29
310 data8 0x3e5c17d1108740d9, 0x3e5d4a9c79a43389
311 data8 0x3e49fdc24462ba3b, 0x3e24dbb3a60cceb2
312 data8 0x3e5c5bf618780748, 0x3e5c38005b0c778c
313 data8 0x3e6be168dd6dd3fe, 0x3e633ab9370693b0
314 data8 0x3dd290556b0ae339, 0x3e607c317927096a
315 data8 0x3e59651353b3d90e, 0x3e4d8751e5e0ae0d
316 data8 0x3e46c81023272a85, 0x3e6b23c988f391b2
317 data8 0x3e608741d215209c, 0x3e60b8ba506d758f
318 data8 0x3e62ddbe74803297, 0x3e5dbb8b5087587d
319 data8 0x3e642aa529048131, 0x3e3dcbda6835dcf4
320 data8 0x3e6db503ce854d2a, 0x3e6dd00b49bc6849
321 data8 0x3e4db2f11243bc84, 0x3e3b9848efc2ea97
322 data8 0x3e58f18e17c82609, 0x3e6ed8645e16c312
323 data8 0x3e4065bdb60a5dd4, 0x3e490453c6e6c30a
324 data8 0x3e62373994aa31ba, 0x3e56305f0e6b2a95
325 data8 0x3e68c1601a6614ee, 0x3e614e204f19d93f
326 data8 0x3e6e5037ca773299, 0x3e693f98892561a6
327 data8 0x3e639de4f4bf700d, 0x3e416c071e93fd97
328 data8 0x3e65466991b415ef, 0x3e6896a324afac9d
329 data8 0x3e44f64802e2f11c, 0x3e64d7d747e2191a
330 data8 0x3e6174b7581de84c, 0x3e44c7b946e1d43c
331 data8 0x3e6a3bcbe30512ec, 0x3e5d3ed411c95ce4
332 data8 0x3e3e5b5735cfaf8e, 0x3e6e538ab34efb51
333 data8 0x3e514e204f19d93f, 0x3e5a88e6550c89a4
334 data8 0x3e66b97a5d9dfd8b, 0x3e5f46b1e14ebaf3
335 data8 0x3e357665f6893f5d, 0x3e6bbf633078d1d5
336 data8 0x3e5e7337a212c417, 0x3e3570fde15fc8cc
337 data8 0x3e21119402da92b4, 0x3e6566e830d1ff3b
338 data8 0x3e558883e480e220, 0x3e589ca3a68da411
339 data8 0x3e44eb66df73d648, 0x3e1a0a629b1b7e68
340 data8 0x3e54cc207b8c1116, 0x0000000000000000
341 LOCAL_OBJECT_END(T_low)
344 .section .text
345 GLOBAL_IEEE754_ENTRY(log2l)
347 { .mfi
348   alloc r32=ar.pfs,1,4,4,0     
349   // normalize x 
350   // y=frcpa(x)  
351   frcpa.s1 f41,p0=f1,f8
352   // r26=bias-1
353   mov r26=0xfffe
355 {.mfi
356   // r23=bias+16
357   mov r23=0xffff+16
358   fma.s1 f7=f8,f1,f0
359   // r2 = pointer to C_1...C_6 followed by T_table
360   addl r2 = @ltoff(poly_coeffs), gp;;
362 {.mfi
363   // get significand
364   getf.sig r25=f8
365   // f8 denormal ?
366   fclass.m p8,p10=f8,0x9
367   // r24=bias-8
368   mov r24=0xffff-8;;
370 {.mfi
371   setf.exp f36=r26
372   nop.f 0
373   // r27=bias
374   mov r27=0xffff;;
377 {.mmf
378   getf.exp r29=f8
379   // load start address for C_1...C_7 followed by T_table
380   ld8 r2=[r2]
381   // will continue only for positive normal/unnormal numbers          
382   fclass.m.unc p0,p12 = f8, 0x19;; 
386 .pred.rel "mutex",p8,p10
387 {.mfi
388   // denormal input, repeat get significand (after normalization)
389   (p8) getf.sig r25=f7
390   // x=1 ?
391   fcmp.eq.s0 p6,p0=f8,f1
392   // get T_index
393   (p10) shr.u r28=r25,63-8
395 {.mfi
396   // f32=2^16
397   setf.exp f32=r23
398   nop.f 0
399   mov r26=0x804;;
402 {.mfi
403   // denormal input, repeat get exponent (after normalization)
404   (p8) getf.exp r29=f7
405   // f33=0
406   mov f33=f0
407   // r26=0x80400...0 (threshold for using polynomial approximation)
408   shl r26=r26,64-12;;
411 {.mfb
412   add r3=16,r2 
413   // r=x*y-1
414   fms.s1 f6=f41,f8,f1
415   (p12) br.cond.spnt SPECIAL_log2l
417 {.mfi
418   // load C_1
419   ldfe f14=[r2],48
420   // RN(x*y)
421   fma.s1 f43=f41,f8,f0
422   mov r23=0xff;;
425 {.mmi
426   // load C_7, C_8
427   ldfpd f10,f11=[r3],16
428   // load C_3,C_4
429   ldfpd f15,f42=[r2],16
430   (p8) shr.u r28=r25,63-8;;
434 {.mfi
435   // load C_5, C_6
436   ldfpd f12,f13=[r3]
437   // pseudo-zero ?
438   fcmp.eq.s0 p7,p0=f7,f0
439   // if first 9 bits after leading 1 are all zero, then p8=1
440   cmp.ltu p8,p12=r25,r26
442 {.mfi
443   // load C1l
444   ldfe f34=[r2],16
445   fmerge.se f7=f1,f7
446   // get T_index
447   and r28=r28,r23;;
449 {.mfi
450   // r29=exponent-bias
451   sub r29=r29,r27
452   // if first 8 bits after leading bit are 0, use polynomial approx. only
453   (p8) fms.s1 f6=f7,f1,f1
454   // start address of T_low
455   add r3=1024+16,r2
457 {.mfi
458   // load C_2
459   ldfe f35=[r2],16
460   // x=1, return 0
461   (p6) fma.s0 f8=f0,f0,f0
462   // first 8 bits after leading 1 are all ones ?
463   cmp.eq p10,p0=r23,r28;;
466 {.mfb
467   // if first 8 bits after leading 1 are all ones, use polynomial approx. only
468   // add 1 to the exponent additive term, and estimate log2(1-r)
469   (p10) add r29=1,r29
470   nop.f 0
471   (p7) br.cond.spnt LOG2_PSEUDO_ZERO 
473 {.mfi
474   // get T_low adress 
475   shladd r3=r28,3,r3
476   // if first 8 bits after leading 1 are all ones, use polynomial approx. only
477   (p10) fms.s1 f6=f7,f36,f1
478   // p10 --> p8=1, p12=0
479   (p10) cmp.eq p8,p12=r0,r0;;
482 {.mfi
483   // get T_high address
484   shladd r2=r28,2,r2
485   // L(x*y)=x*y-RN(x*y)
486   fms.s1 f41=f41,f8,f43
487   nop.i 0
489 {.mfi
490   // p13=p12
491   (p12) cmp.eq.unc p13,p0=r0,r0
492   // RtH=RN(x*y)-1  (will eliminate rounding errors in r)
493   fms.s1 f43=f43,f1,f1
494   nop.i 0;;
497 .pred.rel "mutex",p8,p12
498 {.mfb
499   // load T_high (unless first 9 bits after leading 1 are 0)
500   (p12) ldfs f7=[r2]
501   // set T_high=0 (if first 9 bits after leading 1 are 0)
502   (p8) fma.s1 f7=f0,f0,f0
503   // x=1, return
504   (p6) br.ret.spnt b0
506 .pred.rel "mutex",p8,p12
507 {.mfi
508   // p12: load T_low
509   (p12) ldfd f36=[r3]
510   // p8: set T_low=0
511   (p8) fma.s1 f36=f0,f0,f0
512   (p8) cmp.eq p8,p12=r29,r0;; //nop.i 0;;
515 .pred.rel "mutex",p8,p12
516 {.mfi
517   // f8=expon - bias 
518   setf.sig f8=r29
519   // general case: 2^{16}+C1*r
520   (p12) fma.s1 f33=f6,f14,f32
521   nop.i 0
523 {.mfi
524   // r26=1
525   mov r26=1
526   // p8 (mantissa is close to 1, or close to 2): 2^{-8}+C1*r
527   (p8) fma.s1 f32=f6,f14,f33
528   nop.i 0;;
531 {.mfi
532   nop.m 0
533   // P78=C_7+C_8*r
534   fma.s1 f10=f11,f6,f10
535   // r26=2^{63}
536   shl r26=r26,63
538 {.mfi
539   nop.m 0
540   // P34=C_3+r*C_4
541   fma.s1 f15=f42,f6,f15
542   nop.i 0;;
544 {.mfi
545   nop.m 0
546   // r2=r*r
547   fma.s1 f11=f6,f6,f0
548   nop.i 0
550 {.mfi
551   nop.m 0
552   // P56=C_5+C_6*r
553   fma.s1 f13=f13,f6,f12
554   nop.i 0;;
557 {.mfi
558   nop.m 0
559   // Rth-r
560   (p13) fms.s1 f43=f43,f1,f6
561   nop.i 0
563 {.mfi
564   // significand(x)=1 ?
565   cmp.eq p0,p6=r25,r26
566   // P12=C1l+C_2*r
567   fma.s1 f34=f35,f6,f34
568   nop.i 0;;
571 .pred.rel "mutex",p8,p12
572 {.mfi
573   nop.m 0
574   // p12: C1r=(2^{16}+C1*r)-2^{16}
575   (p12) fms.s1 f32=f33,f1,f32
576   nop.i 0
578 {.mfi
579   nop.m 0
580   // p8: C1r=C1*r (double extended)
581   (p8) fms.s1 f32=f32,f1,f33
582   nop.i 0;;
585 {.mfi
586   nop.m 0
587   // L(x*y)*C_1+T_low
588   (p13) fma.s1 f36=f41,f14,f36
589   nop.i 0
591 {.mfi
592   nop.m 0
593   // P58=P56+r2*P78
594   fma.s1 f13=f11,f10,f13
595   nop.i 0;;
597 {.mfi
598   nop.m 0
599   // P14=P12+r2*P34
600   fma.s1 f15=f15,f11,f34
601   nop.i 0
603 {.mfi
604   nop.m 0
605   // r4=r2*r2
606   fma.s1 f11=f11,f11,f0
607   nop.i 0;;
610 {.mfi
611   nop.m 0
612   // normalize additive term (l=exponent of x)
613   fcvt.xf f8=f8
614   nop.i 0;;
618 {.mfi
619   nop.m 0
620   // D=C1*r-C1r
621   (p6) fms.s1 f12=f14,f6,f32
622   nop.i 0;;
625 {.mfi
626   nop.m 0
627   // T_low'=(Rth-r)*C1+(L(x*y)*C1+T_low)
628   (p13) fma.s1 f36=f43,f14,f36
629   nop.i 0;;
631 {.mfi
632   nop.m 0
633   // P18=P14+r4*P58
634   (p6) fma.s1 f13=f11,f13,f15
635   nop.i 0;;
638 {.mfi
639   nop.m 0
640   // add T_high+l
641   (p6) fma.s1 f8=f8,f1,f7
642   nop.i 0;;
646 {.mfi
647   nop.m 0
648   // D+T_low
649   (p6) fma.s1 f12=f12,f1,f36
650   nop.i 0;;
654 {.mfi
655   nop.m 0
656   // (T_high+l)+C1r
657   (p6) fma.s1 f8=f8,f1,f32
658   nop.i 0
660 {.mfi
661   nop.m 0
662   // (D+T_low)+r*P18
663   (p6) fma.s1 f13=f13,f6,f12
664   nop.i 0;;
667 //{.mfb
668 //nop.m 0
669 //mov f8=f36
670 //fma.s0 f8=f13,f6,f0
671 //br.ret.sptk b0;;
675 {.mfb
676   nop.m 0
677   // result=((T_high+l)+C1r)+((D+T_low)+r*P18)
678   (p6) fma.s0 f8=f13,f1,f8
679   // return
680   br.ret.sptk b0;;
684 SPECIAL_log2l:
685 {.mfi
686   nop.m 0
687   mov FR_X=f8
688   nop.i 0
690 {.mfi 
691   nop.m 0
692   // x=+Infinity ?
693   fclass.m p7,p0=f8,0x21
694   nop.i 0;;
696 {.mfi
697   nop.m 0
698   // x=+/-Zero ?
699   fclass.m p8,p0=f7,0x7
700   nop.i 0;;
702 {.mfi
703   nop.m 0
704   // x=-Infinity, -normal, -denormal ?
705   fclass.m p6,p0=f8,0x3a
706   nop.i 0;;
708 {.mfb
709   nop.m 0
710   // log2l(+Infinity)=+Infinity
711   nop.f 0
712   (p7) br.ret.spnt b0;;
714 {.mfi
715   (p8) mov GR_Parameter_TAG = 168                          
716   // log2l(+/-0)=-infinity, raises Divide by Zero
717   // set f8=-0
718   (p8) fmerge.ns f8=f0,f8
719   nop.i 0;;
721 {.mfb
722   nop.m 0
723   (p8) frcpa.s0 f8,p0=f1,f8
724   (p8) br.cond.sptk __libm_error_region;;
726 {.mfb
727   (p6) mov GR_Parameter_TAG = 169 
728   // x<0: return NaN, raise Invalid
729   (p6) frcpa.s0 f8,p0=f0,f0
730   (p6) br.cond.sptk __libm_error_region;;
731 }                          
732   
734 {.mfb
735   nop.m 0
736   // Remaining cases: NaNs
737   fma.s0 f8=f8,f1,f0
738   br.ret.sptk b0;;
741 LOG2_PSEUDO_ZERO:
743 {.mfi
744   nop.m 0
745   mov FR_X=f8
746   nop.i 0
748 {.mfi
749   mov GR_Parameter_TAG = 168                          
750   // log2l(+/-0)=-infinity, raises Divide by Zero
751   // set f8=-0
752   fmerge.ns f8=f0,f8
753   nop.i 0;;
755 {.mfb
756   nop.m 0
757   frcpa.s0 f8,p0=f1,f8
758   br.cond.sptk __libm_error_region;;
762 GLOBAL_IEEE754_END(log2l)
765 LOCAL_LIBM_ENTRY(__libm_error_region)
766 .prologue
767 { .mfi
768         add   GR_Parameter_Y=-32,sp             // Parameter 2 value
769         nop.f 0
770 .save   ar.pfs,GR_SAVE_PFS
771         mov  GR_SAVE_PFS=ar.pfs                 // Save ar.pfs 
773 { .mfi
774 .fframe 64 
775         add sp=-64,sp                           // Create new stack
776         nop.f 0
777         mov GR_SAVE_GP=gp                       // Save gp
779 { .mmi
780         stfe [GR_Parameter_Y] = FR_Y,16         // STORE Parameter 2 on stack
781         add GR_Parameter_X = 16,sp              // Parameter 1 address
782 .save   b0, GR_SAVE_B0                      
783         mov GR_SAVE_B0=b0                       // Save b0 
785 .body
786 { .mib
787         stfe [GR_Parameter_X] = FR_X                  // STORE Parameter 1 on stack 
788         add   GR_Parameter_RESULT = 0,GR_Parameter_Y  // Parameter 3 address 
789         nop.b 0                                      
791 { .mib
792         stfe [GR_Parameter_Y] = FR_RESULT             // STORE Parameter 3 on stack
793         add   GR_Parameter_Y = -16,GR_Parameter_Y  
794         br.call.sptk b0=__libm_error_support#         // Call error handling function
796 { .mmi
797         nop.m 0
798         nop.m 0
799         add   GR_Parameter_RESULT = 48,sp
801 { .mmi
802         ldfe  f8 = [GR_Parameter_RESULT]       // Get return result off stack
803 .restore sp
804         add   sp = 64,sp                       // Restore stack pointer
805         mov   b0 = GR_SAVE_B0                  // Restore return address
807 { .mib
808         mov   gp = GR_SAVE_GP                  // Restore gp 
809         mov   ar.pfs = GR_SAVE_PFS             // Restore ar.pfs
810         br.ret.sptk     b0                     // Return
811 };; 
813 LOCAL_LIBM_END(__libm_error_region)
814 .type   __libm_error_support#,@function
815 .global __libm_error_support#