real.cc revision 1.1 1 1.1 mrg /* real.cc - software floating point emulation.
2 1.1 mrg Copyright (C) 1993-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Stephen L. Moshier (moshier (at) world.std.com).
4 1.1 mrg Re-written by Richard Henderson <rth (at) redhat.com>
5 1.1 mrg
6 1.1 mrg This file is part of GCC.
7 1.1 mrg
8 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
9 1.1 mrg the terms of the GNU General Public License as published by the Free
10 1.1 mrg Software Foundation; either version 3, or (at your option) any later
11 1.1 mrg version.
12 1.1 mrg
13 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 1.1 mrg for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU General Public License
19 1.1 mrg along with GCC; see the file COPYING3. If not see
20 1.1 mrg <http://www.gnu.org/licenses/>. */
21 1.1 mrg
22 1.1 mrg #include "config.h"
23 1.1 mrg #include "system.h"
24 1.1 mrg #include "coretypes.h"
25 1.1 mrg #include "tm.h"
26 1.1 mrg #include "rtl.h"
27 1.1 mrg #include "tree.h"
28 1.1 mrg #include "realmpfr.h"
29 1.1 mrg #include "dfp.h"
30 1.1 mrg
31 1.1 mrg /* The floating point model used internally is not exactly IEEE 754
32 1.1 mrg compliant, and close to the description in the ISO C99 standard,
33 1.1 mrg section 5.2.4.2.2 Characteristics of floating types.
34 1.1 mrg
35 1.1 mrg Specifically
36 1.1 mrg
37 1.1 mrg x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
38 1.1 mrg
39 1.1 mrg where
40 1.1 mrg s = sign (+- 1)
41 1.1 mrg b = base or radix, here always 2
42 1.1 mrg e = exponent
43 1.1 mrg p = precision (the number of base-b digits in the significand)
44 1.1 mrg f_k = the digits of the significand.
45 1.1 mrg
46 1.1 mrg We differ from typical IEEE 754 encodings in that the entire
47 1.1 mrg significand is fractional. Normalized significands are in the
48 1.1 mrg range [0.5, 1.0).
49 1.1 mrg
50 1.1 mrg A requirement of the model is that P be larger than the largest
51 1.1 mrg supported target floating-point type by at least 2 bits. This gives
52 1.1 mrg us proper rounding when we truncate to the target type. In addition,
53 1.1 mrg E must be large enough to hold the smallest supported denormal number
54 1.1 mrg in a normalized form.
55 1.1 mrg
56 1.1 mrg Both of these requirements are easily satisfied. The largest target
57 1.1 mrg significand is 113 bits; we store at least 160. The smallest
58 1.1 mrg denormal number fits in 17 exponent bits; we store 26. */
59 1.1 mrg
60 1.1 mrg
61 1.1 mrg /* Used to classify two numbers simultaneously. */
62 1.1 mrg #define CLASS2(A, B) ((A) << 2 | (B))
63 1.1 mrg
64 1.1 mrg #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
65 1.1 mrg #error "Some constant folding done by hand to avoid shift count warnings"
66 1.1 mrg #endif
67 1.1 mrg
68 1.1 mrg static void get_zero (REAL_VALUE_TYPE *, int);
69 1.1 mrg static void get_canonical_qnan (REAL_VALUE_TYPE *, int);
70 1.1 mrg static void get_canonical_snan (REAL_VALUE_TYPE *, int);
71 1.1 mrg static void get_inf (REAL_VALUE_TYPE *, int);
72 1.1 mrg static bool sticky_rshift_significand (REAL_VALUE_TYPE *,
73 1.1 mrg const REAL_VALUE_TYPE *, unsigned int);
74 1.1 mrg static void rshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
75 1.1 mrg unsigned int);
76 1.1 mrg static void lshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
77 1.1 mrg unsigned int);
78 1.1 mrg static void lshift_significand_1 (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
79 1.1 mrg static bool add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *,
80 1.1 mrg const REAL_VALUE_TYPE *);
81 1.1 mrg static bool sub_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
82 1.1 mrg const REAL_VALUE_TYPE *, int);
83 1.1 mrg static void neg_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
84 1.1 mrg static int cmp_significands (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
85 1.1 mrg static int cmp_significand_0 (const REAL_VALUE_TYPE *);
86 1.1 mrg static void set_significand_bit (REAL_VALUE_TYPE *, unsigned int);
87 1.1 mrg static void clear_significand_bit (REAL_VALUE_TYPE *, unsigned int);
88 1.1 mrg static bool test_significand_bit (REAL_VALUE_TYPE *, unsigned int);
89 1.1 mrg static void clear_significand_below (REAL_VALUE_TYPE *, unsigned int);
90 1.1 mrg static bool div_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
91 1.1 mrg const REAL_VALUE_TYPE *);
92 1.1 mrg static void normalize (REAL_VALUE_TYPE *);
93 1.1 mrg
94 1.1 mrg static bool do_add (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
95 1.1 mrg const REAL_VALUE_TYPE *, int);
96 1.1 mrg static bool do_multiply (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
97 1.1 mrg const REAL_VALUE_TYPE *);
98 1.1 mrg static bool do_divide (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
99 1.1 mrg const REAL_VALUE_TYPE *);
100 1.1 mrg static int do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
101 1.1 mrg static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
102 1.1 mrg
103 1.1 mrg static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *);
104 1.1 mrg static void decimal_from_integer (REAL_VALUE_TYPE *);
105 1.1 mrg static void decimal_integer_string (char *, const REAL_VALUE_TYPE *,
106 1.1 mrg size_t);
107 1.1 mrg
108 1.1 mrg static const REAL_VALUE_TYPE * ten_to_ptwo (int);
109 1.1 mrg static const REAL_VALUE_TYPE * ten_to_mptwo (int);
110 1.1 mrg static const REAL_VALUE_TYPE * real_digit (int);
111 1.1 mrg static void times_pten (REAL_VALUE_TYPE *, int);
112 1.1 mrg
113 1.1 mrg static void round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
114 1.1 mrg
115 1.1 mrg /* Initialize R with a positive zero. */
117 1.1 mrg
118 1.1 mrg static inline void
119 1.1 mrg get_zero (REAL_VALUE_TYPE *r, int sign)
120 1.1 mrg {
121 1.1 mrg memset (r, 0, sizeof (*r));
122 1.1 mrg r->sign = sign;
123 1.1 mrg }
124 1.1 mrg
125 1.1 mrg /* Initialize R with the canonical quiet NaN. */
126 1.1 mrg
127 1.1 mrg static inline void
128 1.1 mrg get_canonical_qnan (REAL_VALUE_TYPE *r, int sign)
129 1.1 mrg {
130 1.1 mrg memset (r, 0, sizeof (*r));
131 1.1 mrg r->cl = rvc_nan;
132 1.1 mrg r->sign = sign;
133 1.1 mrg r->canonical = 1;
134 1.1 mrg }
135 1.1 mrg
136 1.1 mrg static inline void
137 1.1 mrg get_canonical_snan (REAL_VALUE_TYPE *r, int sign)
138 1.1 mrg {
139 1.1 mrg memset (r, 0, sizeof (*r));
140 1.1 mrg r->cl = rvc_nan;
141 1.1 mrg r->sign = sign;
142 1.1 mrg r->signalling = 1;
143 1.1 mrg r->canonical = 1;
144 1.1 mrg }
145 1.1 mrg
146 1.1 mrg static inline void
147 1.1 mrg get_inf (REAL_VALUE_TYPE *r, int sign)
148 1.1 mrg {
149 1.1 mrg memset (r, 0, sizeof (*r));
150 1.1 mrg r->cl = rvc_inf;
151 1.1 mrg r->sign = sign;
152 1.1 mrg }
153 1.1 mrg
154 1.1 mrg
155 1.1 mrg /* Right-shift the significand of A by N bits; put the result in the
157 1.1 mrg significand of R. If any one bits are shifted out, return true. */
158 1.1 mrg
159 1.1 mrg static bool
160 1.1 mrg sticky_rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
161 1.1 mrg unsigned int n)
162 1.1 mrg {
163 1.1 mrg unsigned long sticky = 0;
164 1.1 mrg unsigned int i, ofs = 0;
165 1.1 mrg
166 1.1 mrg if (n >= HOST_BITS_PER_LONG)
167 1.1 mrg {
168 1.1 mrg for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i)
169 1.1 mrg sticky |= a->sig[i];
170 1.1 mrg n &= HOST_BITS_PER_LONG - 1;
171 1.1 mrg }
172 1.1 mrg
173 1.1 mrg if (n != 0)
174 1.1 mrg {
175 1.1 mrg sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1);
176 1.1 mrg for (i = 0; i < SIGSZ; ++i)
177 1.1 mrg {
178 1.1 mrg r->sig[i]
179 1.1 mrg = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
180 1.1 mrg | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
181 1.1 mrg << (HOST_BITS_PER_LONG - n)));
182 1.1 mrg }
183 1.1 mrg }
184 1.1 mrg else
185 1.1 mrg {
186 1.1 mrg for (i = 0; ofs + i < SIGSZ; ++i)
187 1.1 mrg r->sig[i] = a->sig[ofs + i];
188 1.1 mrg for (; i < SIGSZ; ++i)
189 1.1 mrg r->sig[i] = 0;
190 1.1 mrg }
191 1.1 mrg
192 1.1 mrg return sticky != 0;
193 1.1 mrg }
194 1.1 mrg
195 1.1 mrg /* Right-shift the significand of A by N bits; put the result in the
196 1.1 mrg significand of R. */
197 1.1 mrg
198 1.1 mrg static void
199 1.1 mrg rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
200 1.1 mrg unsigned int n)
201 1.1 mrg {
202 1.1 mrg unsigned int i, ofs = n / HOST_BITS_PER_LONG;
203 1.1 mrg
204 1.1 mrg n &= HOST_BITS_PER_LONG - 1;
205 1.1 mrg if (n != 0)
206 1.1 mrg {
207 1.1 mrg for (i = 0; i < SIGSZ; ++i)
208 1.1 mrg {
209 1.1 mrg r->sig[i]
210 1.1 mrg = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
211 1.1 mrg | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
212 1.1 mrg << (HOST_BITS_PER_LONG - n)));
213 1.1 mrg }
214 1.1 mrg }
215 1.1 mrg else
216 1.1 mrg {
217 1.1 mrg for (i = 0; ofs + i < SIGSZ; ++i)
218 1.1 mrg r->sig[i] = a->sig[ofs + i];
219 1.1 mrg for (; i < SIGSZ; ++i)
220 1.1 mrg r->sig[i] = 0;
221 1.1 mrg }
222 1.1 mrg }
223 1.1 mrg
224 1.1 mrg /* Left-shift the significand of A by N bits; put the result in the
225 1.1 mrg significand of R. */
226 1.1 mrg
227 1.1 mrg static void
228 1.1 mrg lshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
229 1.1 mrg unsigned int n)
230 1.1 mrg {
231 1.1 mrg unsigned int i, ofs = n / HOST_BITS_PER_LONG;
232 1.1 mrg
233 1.1 mrg n &= HOST_BITS_PER_LONG - 1;
234 1.1 mrg if (n == 0)
235 1.1 mrg {
236 1.1 mrg for (i = 0; ofs + i < SIGSZ; ++i)
237 1.1 mrg r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs];
238 1.1 mrg for (; i < SIGSZ; ++i)
239 1.1 mrg r->sig[SIGSZ-1-i] = 0;
240 1.1 mrg }
241 1.1 mrg else
242 1.1 mrg for (i = 0; i < SIGSZ; ++i)
243 1.1 mrg {
244 1.1 mrg r->sig[SIGSZ-1-i]
245 1.1 mrg = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n)
246 1.1 mrg | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1])
247 1.1 mrg >> (HOST_BITS_PER_LONG - n)));
248 1.1 mrg }
249 1.1 mrg }
250 1.1 mrg
251 1.1 mrg /* Likewise, but N is specialized to 1. */
252 1.1 mrg
253 1.1 mrg static inline void
254 1.1 mrg lshift_significand_1 (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
255 1.1 mrg {
256 1.1 mrg unsigned int i;
257 1.1 mrg
258 1.1 mrg for (i = SIGSZ - 1; i > 0; --i)
259 1.1 mrg r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1));
260 1.1 mrg r->sig[0] = a->sig[0] << 1;
261 1.1 mrg }
262 1.1 mrg
263 1.1 mrg /* Add the significands of A and B, placing the result in R. Return
264 1.1 mrg true if there was carry out of the most significant word. */
265 1.1 mrg
266 1.1 mrg static inline bool
267 1.1 mrg add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
268 1.1 mrg const REAL_VALUE_TYPE *b)
269 1.1 mrg {
270 1.1 mrg bool carry = false;
271 1.1 mrg int i;
272 1.1 mrg
273 1.1 mrg for (i = 0; i < SIGSZ; ++i)
274 1.1 mrg {
275 1.1 mrg unsigned long ai = a->sig[i];
276 1.1 mrg unsigned long ri = ai + b->sig[i];
277 1.1 mrg
278 1.1 mrg if (carry)
279 1.1 mrg {
280 1.1 mrg carry = ri < ai;
281 1.1 mrg carry |= ++ri == 0;
282 1.1 mrg }
283 1.1 mrg else
284 1.1 mrg carry = ri < ai;
285 1.1 mrg
286 1.1 mrg r->sig[i] = ri;
287 1.1 mrg }
288 1.1 mrg
289 1.1 mrg return carry;
290 1.1 mrg }
291 1.1 mrg
292 1.1 mrg /* Subtract the significands of A and B, placing the result in R. CARRY is
293 1.1 mrg true if there's a borrow incoming to the least significant word.
294 1.1 mrg Return true if there was borrow out of the most significant word. */
295 1.1 mrg
296 1.1 mrg static inline bool
297 1.1 mrg sub_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
298 1.1 mrg const REAL_VALUE_TYPE *b, int carry)
299 1.1 mrg {
300 1.1 mrg int i;
301 1.1 mrg
302 1.1 mrg for (i = 0; i < SIGSZ; ++i)
303 1.1 mrg {
304 1.1 mrg unsigned long ai = a->sig[i];
305 1.1 mrg unsigned long ri = ai - b->sig[i];
306 1.1 mrg
307 1.1 mrg if (carry)
308 1.1 mrg {
309 1.1 mrg carry = ri > ai;
310 1.1 mrg carry |= ~--ri == 0;
311 1.1 mrg }
312 1.1 mrg else
313 1.1 mrg carry = ri > ai;
314 1.1 mrg
315 1.1 mrg r->sig[i] = ri;
316 1.1 mrg }
317 1.1 mrg
318 1.1 mrg return carry;
319 1.1 mrg }
320 1.1 mrg
321 1.1 mrg /* Negate the significand A, placing the result in R. */
322 1.1 mrg
323 1.1 mrg static inline void
324 1.1 mrg neg_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
325 1.1 mrg {
326 1.1 mrg bool carry = true;
327 1.1 mrg int i;
328 1.1 mrg
329 1.1 mrg for (i = 0; i < SIGSZ; ++i)
330 1.1 mrg {
331 1.1 mrg unsigned long ri, ai = a->sig[i];
332 1.1 mrg
333 1.1 mrg if (carry)
334 1.1 mrg {
335 1.1 mrg if (ai)
336 1.1 mrg {
337 1.1 mrg ri = -ai;
338 1.1 mrg carry = false;
339 1.1 mrg }
340 1.1 mrg else
341 1.1 mrg ri = ai;
342 1.1 mrg }
343 1.1 mrg else
344 1.1 mrg ri = ~ai;
345 1.1 mrg
346 1.1 mrg r->sig[i] = ri;
347 1.1 mrg }
348 1.1 mrg }
349 1.1 mrg
350 1.1 mrg /* Compare significands. Return tri-state vs zero. */
351 1.1 mrg
352 1.1 mrg static inline int
353 1.1 mrg cmp_significands (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
354 1.1 mrg {
355 1.1 mrg int i;
356 1.1 mrg
357 1.1 mrg for (i = SIGSZ - 1; i >= 0; --i)
358 1.1 mrg {
359 1.1 mrg unsigned long ai = a->sig[i];
360 1.1 mrg unsigned long bi = b->sig[i];
361 1.1 mrg
362 1.1 mrg if (ai > bi)
363 1.1 mrg return 1;
364 1.1 mrg if (ai < bi)
365 1.1 mrg return -1;
366 1.1 mrg }
367 1.1 mrg
368 1.1 mrg return 0;
369 1.1 mrg }
370 1.1 mrg
371 1.1 mrg /* Return true if A is nonzero. */
372 1.1 mrg
373 1.1 mrg static inline int
374 1.1 mrg cmp_significand_0 (const REAL_VALUE_TYPE *a)
375 1.1 mrg {
376 1.1 mrg int i;
377 1.1 mrg
378 1.1 mrg for (i = SIGSZ - 1; i >= 0; --i)
379 1.1 mrg if (a->sig[i])
380 1.1 mrg return 1;
381 1.1 mrg
382 1.1 mrg return 0;
383 1.1 mrg }
384 1.1 mrg
385 1.1 mrg /* Set bit N of the significand of R. */
386 1.1 mrg
387 1.1 mrg static inline void
388 1.1 mrg set_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
389 1.1 mrg {
390 1.1 mrg r->sig[n / HOST_BITS_PER_LONG]
391 1.1 mrg |= (unsigned long)1 << (n % HOST_BITS_PER_LONG);
392 1.1 mrg }
393 1.1 mrg
394 1.1 mrg /* Clear bit N of the significand of R. */
395 1.1 mrg
396 1.1 mrg static inline void
397 1.1 mrg clear_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
398 1.1 mrg {
399 1.1 mrg r->sig[n / HOST_BITS_PER_LONG]
400 1.1 mrg &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG));
401 1.1 mrg }
402 1.1 mrg
403 1.1 mrg /* Test bit N of the significand of R. */
404 1.1 mrg
405 1.1 mrg static inline bool
406 1.1 mrg test_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
407 1.1 mrg {
408 1.1 mrg /* ??? Compiler bug here if we return this expression directly.
409 1.1 mrg The conversion to bool strips the "&1" and we wind up testing
410 1.1 mrg e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */
411 1.1 mrg int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1;
412 1.1 mrg return t;
413 1.1 mrg }
414 1.1 mrg
415 1.1 mrg /* Clear bits 0..N-1 of the significand of R. */
416 1.1 mrg
417 1.1 mrg static void
418 1.1 mrg clear_significand_below (REAL_VALUE_TYPE *r, unsigned int n)
419 1.1 mrg {
420 1.1 mrg int i, w = n / HOST_BITS_PER_LONG;
421 1.1 mrg
422 1.1 mrg for (i = 0; i < w; ++i)
423 1.1 mrg r->sig[i] = 0;
424 1.1 mrg
425 1.1 mrg /* We are actually passing N == SIGNIFICAND_BITS which would result
426 1.1 mrg in an out-of-bound access below. */
427 1.1 mrg if (n % HOST_BITS_PER_LONG != 0)
428 1.1 mrg r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1);
429 1.1 mrg }
430 1.1 mrg
431 1.1 mrg /* Divide the significands of A and B, placing the result in R. Return
432 1.1 mrg true if the division was inexact. */
433 1.1 mrg
434 1.1 mrg static inline bool
435 1.1 mrg div_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
436 1.1 mrg const REAL_VALUE_TYPE *b)
437 1.1 mrg {
438 1.1 mrg REAL_VALUE_TYPE u;
439 1.1 mrg int i, bit = SIGNIFICAND_BITS - 1;
440 1.1 mrg unsigned long msb, inexact;
441 1.1 mrg
442 1.1 mrg u = *a;
443 1.1 mrg memset (r->sig, 0, sizeof (r->sig));
444 1.1 mrg
445 1.1 mrg msb = 0;
446 1.1 mrg goto start;
447 1.1 mrg do
448 1.1 mrg {
449 1.1 mrg msb = u.sig[SIGSZ-1] & SIG_MSB;
450 1.1 mrg lshift_significand_1 (&u, &u);
451 1.1 mrg start:
452 1.1 mrg if (msb || cmp_significands (&u, b) >= 0)
453 1.1 mrg {
454 1.1 mrg sub_significands (&u, &u, b, 0);
455 1.1 mrg set_significand_bit (r, bit);
456 1.1 mrg }
457 1.1 mrg }
458 1.1 mrg while (--bit >= 0);
459 1.1 mrg
460 1.1 mrg for (i = 0, inexact = 0; i < SIGSZ; i++)
461 1.1 mrg inexact |= u.sig[i];
462 1.1 mrg
463 1.1 mrg return inexact != 0;
464 1.1 mrg }
465 1.1 mrg
466 1.1 mrg /* Adjust the exponent and significand of R such that the most
467 1.1 mrg significant bit is set. We underflow to zero and overflow to
468 1.1 mrg infinity here, without denormals. (The intermediate representation
469 1.1 mrg exponent is large enough to handle target denormals normalized.) */
470 1.1 mrg
471 1.1 mrg static void
472 1.1 mrg normalize (REAL_VALUE_TYPE *r)
473 1.1 mrg {
474 1.1 mrg int shift = 0, exp;
475 1.1 mrg int i, j;
476 1.1 mrg
477 1.1 mrg if (r->decimal)
478 1.1 mrg return;
479 1.1 mrg
480 1.1 mrg /* Find the first word that is nonzero. */
481 1.1 mrg for (i = SIGSZ - 1; i >= 0; i--)
482 1.1 mrg if (r->sig[i] == 0)
483 1.1 mrg shift += HOST_BITS_PER_LONG;
484 1.1 mrg else
485 1.1 mrg break;
486 1.1 mrg
487 1.1 mrg /* Zero significand flushes to zero. */
488 1.1 mrg if (i < 0)
489 1.1 mrg {
490 1.1 mrg r->cl = rvc_zero;
491 1.1 mrg SET_REAL_EXP (r, 0);
492 1.1 mrg return;
493 1.1 mrg }
494 1.1 mrg
495 1.1 mrg /* Find the first bit that is nonzero. */
496 1.1 mrg for (j = 0; ; j++)
497 1.1 mrg if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j)))
498 1.1 mrg break;
499 1.1 mrg shift += j;
500 1.1 mrg
501 1.1 mrg if (shift > 0)
502 1.1 mrg {
503 1.1 mrg exp = REAL_EXP (r) - shift;
504 1.1 mrg if (exp > MAX_EXP)
505 1.1 mrg get_inf (r, r->sign);
506 1.1 mrg else if (exp < -MAX_EXP)
507 1.1 mrg get_zero (r, r->sign);
508 1.1 mrg else
509 1.1 mrg {
510 1.1 mrg SET_REAL_EXP (r, exp);
511 1.1 mrg lshift_significand (r, r, shift);
512 1.1 mrg }
513 1.1 mrg }
514 1.1 mrg }
515 1.1 mrg
516 1.1 mrg /* Calculate R = A + (SUBTRACT_P ? -B : B). Return true if the
518 1.1 mrg result may be inexact due to a loss of precision. */
519 1.1 mrg
520 1.1 mrg static bool
521 1.1 mrg do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
522 1.1 mrg const REAL_VALUE_TYPE *b, int subtract_p)
523 1.1 mrg {
524 1.1 mrg int dexp, sign, exp;
525 1.1 mrg REAL_VALUE_TYPE t;
526 1.1 mrg bool inexact = false;
527 1.1 mrg
528 1.1 mrg /* Determine if we need to add or subtract. */
529 1.1 mrg sign = a->sign;
530 1.1 mrg subtract_p = (sign ^ b->sign) ^ subtract_p;
531 1.1 mrg
532 1.1 mrg switch (CLASS2 (a->cl, b->cl))
533 1.1 mrg {
534 1.1 mrg case CLASS2 (rvc_zero, rvc_zero):
535 1.1 mrg /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0. */
536 1.1 mrg get_zero (r, sign & !subtract_p);
537 1.1 mrg return false;
538 1.1 mrg
539 1.1 mrg case CLASS2 (rvc_zero, rvc_normal):
540 1.1 mrg case CLASS2 (rvc_zero, rvc_inf):
541 1.1 mrg case CLASS2 (rvc_zero, rvc_nan):
542 1.1 mrg /* 0 + ANY = ANY. */
543 1.1 mrg case CLASS2 (rvc_normal, rvc_nan):
544 1.1 mrg case CLASS2 (rvc_inf, rvc_nan):
545 1.1 mrg case CLASS2 (rvc_nan, rvc_nan):
546 1.1 mrg /* ANY + NaN = NaN. */
547 1.1 mrg case CLASS2 (rvc_normal, rvc_inf):
548 1.1 mrg /* R + Inf = Inf. */
549 1.1 mrg *r = *b;
550 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the
551 1.1 mrg responsibility to avoid the operation if flag_signaling_nans
552 1.1 mrg is on. */
553 1.1 mrg r->signalling = 0;
554 1.1 mrg r->sign = sign ^ subtract_p;
555 1.1 mrg return false;
556 1.1 mrg
557 1.1 mrg case CLASS2 (rvc_normal, rvc_zero):
558 1.1 mrg case CLASS2 (rvc_inf, rvc_zero):
559 1.1 mrg case CLASS2 (rvc_nan, rvc_zero):
560 1.1 mrg /* ANY + 0 = ANY. */
561 1.1 mrg case CLASS2 (rvc_nan, rvc_normal):
562 1.1 mrg case CLASS2 (rvc_nan, rvc_inf):
563 1.1 mrg /* NaN + ANY = NaN. */
564 1.1 mrg case CLASS2 (rvc_inf, rvc_normal):
565 1.1 mrg /* Inf + R = Inf. */
566 1.1 mrg *r = *a;
567 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the
568 1.1 mrg responsibility to avoid the operation if flag_signaling_nans
569 1.1 mrg is on. */
570 1.1 mrg r->signalling = 0;
571 1.1 mrg return false;
572 1.1 mrg
573 1.1 mrg case CLASS2 (rvc_inf, rvc_inf):
574 1.1 mrg if (subtract_p)
575 1.1 mrg /* Inf - Inf = NaN. */
576 1.1 mrg get_canonical_qnan (r, 0);
577 1.1 mrg else
578 1.1 mrg /* Inf + Inf = Inf. */
579 1.1 mrg *r = *a;
580 1.1 mrg return false;
581 1.1 mrg
582 1.1 mrg case CLASS2 (rvc_normal, rvc_normal):
583 1.1 mrg break;
584 1.1 mrg
585 1.1 mrg default:
586 1.1 mrg gcc_unreachable ();
587 1.1 mrg }
588 1.1 mrg
589 1.1 mrg /* Swap the arguments such that A has the larger exponent. */
590 1.1 mrg dexp = REAL_EXP (a) - REAL_EXP (b);
591 1.1 mrg if (dexp < 0)
592 1.1 mrg {
593 1.1 mrg const REAL_VALUE_TYPE *t;
594 1.1 mrg t = a, a = b, b = t;
595 1.1 mrg dexp = -dexp;
596 1.1 mrg sign ^= subtract_p;
597 1.1 mrg }
598 1.1 mrg exp = REAL_EXP (a);
599 1.1 mrg
600 1.1 mrg /* If the exponents are not identical, we need to shift the
601 1.1 mrg significand of B down. */
602 1.1 mrg if (dexp > 0)
603 1.1 mrg {
604 1.1 mrg /* If the exponents are too far apart, the significands
605 1.1 mrg do not overlap, which makes the subtraction a noop. */
606 1.1 mrg if (dexp >= SIGNIFICAND_BITS)
607 1.1 mrg {
608 1.1 mrg *r = *a;
609 1.1 mrg r->sign = sign;
610 1.1 mrg return true;
611 1.1 mrg }
612 1.1 mrg
613 1.1 mrg inexact |= sticky_rshift_significand (&t, b, dexp);
614 1.1 mrg b = &t;
615 1.1 mrg }
616 1.1 mrg
617 1.1 mrg if (subtract_p)
618 1.1 mrg {
619 1.1 mrg if (sub_significands (r, a, b, inexact))
620 1.1 mrg {
621 1.1 mrg /* We got a borrow out of the subtraction. That means that
622 1.1 mrg A and B had the same exponent, and B had the larger
623 1.1 mrg significand. We need to swap the sign and negate the
624 1.1 mrg significand. */
625 1.1 mrg sign ^= 1;
626 1.1 mrg neg_significand (r, r);
627 1.1 mrg }
628 1.1 mrg }
629 1.1 mrg else
630 1.1 mrg {
631 1.1 mrg if (add_significands (r, a, b))
632 1.1 mrg {
633 1.1 mrg /* We got carry out of the addition. This means we need to
634 1.1 mrg shift the significand back down one bit and increase the
635 1.1 mrg exponent. */
636 1.1 mrg inexact |= sticky_rshift_significand (r, r, 1);
637 1.1 mrg r->sig[SIGSZ-1] |= SIG_MSB;
638 1.1 mrg if (++exp > MAX_EXP)
639 1.1 mrg {
640 1.1 mrg get_inf (r, sign);
641 1.1 mrg return true;
642 1.1 mrg }
643 1.1 mrg }
644 1.1 mrg }
645 1.1 mrg
646 1.1 mrg r->cl = rvc_normal;
647 1.1 mrg r->sign = sign;
648 1.1 mrg SET_REAL_EXP (r, exp);
649 1.1 mrg /* Zero out the remaining fields. */
650 1.1 mrg r->signalling = 0;
651 1.1 mrg r->canonical = 0;
652 1.1 mrg r->decimal = 0;
653 1.1 mrg
654 1.1 mrg /* Re-normalize the result. */
655 1.1 mrg normalize (r);
656 1.1 mrg
657 1.1 mrg /* Special case: if the subtraction results in zero, the result
658 1.1 mrg is positive. */
659 1.1 mrg if (r->cl == rvc_zero)
660 1.1 mrg r->sign = 0;
661 1.1 mrg else
662 1.1 mrg r->sig[0] |= inexact;
663 1.1 mrg
664 1.1 mrg return inexact;
665 1.1 mrg }
666 1.1 mrg
667 1.1 mrg /* Calculate R = A * B. Return true if the result may be inexact. */
668 1.1 mrg
669 1.1 mrg static bool
670 1.1 mrg do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
671 1.1 mrg const REAL_VALUE_TYPE *b)
672 1.1 mrg {
673 1.1 mrg REAL_VALUE_TYPE u, t, *rr;
674 1.1 mrg unsigned int i, j, k;
675 1.1 mrg int sign = a->sign ^ b->sign;
676 1.1 mrg bool inexact = false;
677 1.1 mrg
678 1.1 mrg switch (CLASS2 (a->cl, b->cl))
679 1.1 mrg {
680 1.1 mrg case CLASS2 (rvc_zero, rvc_zero):
681 1.1 mrg case CLASS2 (rvc_zero, rvc_normal):
682 1.1 mrg case CLASS2 (rvc_normal, rvc_zero):
683 1.1 mrg /* +-0 * ANY = 0 with appropriate sign. */
684 1.1 mrg get_zero (r, sign);
685 1.1 mrg return false;
686 1.1 mrg
687 1.1 mrg case CLASS2 (rvc_zero, rvc_nan):
688 1.1 mrg case CLASS2 (rvc_normal, rvc_nan):
689 1.1 mrg case CLASS2 (rvc_inf, rvc_nan):
690 1.1 mrg case CLASS2 (rvc_nan, rvc_nan):
691 1.1 mrg /* ANY * NaN = NaN. */
692 1.1 mrg *r = *b;
693 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the
694 1.1 mrg responsibility to avoid the operation if flag_signaling_nans
695 1.1 mrg is on. */
696 1.1 mrg r->signalling = 0;
697 1.1 mrg r->sign = sign;
698 1.1 mrg return false;
699 1.1 mrg
700 1.1 mrg case CLASS2 (rvc_nan, rvc_zero):
701 1.1 mrg case CLASS2 (rvc_nan, rvc_normal):
702 1.1 mrg case CLASS2 (rvc_nan, rvc_inf):
703 1.1 mrg /* NaN * ANY = NaN. */
704 1.1 mrg *r = *a;
705 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the
706 1.1 mrg responsibility to avoid the operation if flag_signaling_nans
707 1.1 mrg is on. */
708 1.1 mrg r->signalling = 0;
709 1.1 mrg r->sign = sign;
710 1.1 mrg return false;
711 1.1 mrg
712 1.1 mrg case CLASS2 (rvc_zero, rvc_inf):
713 1.1 mrg case CLASS2 (rvc_inf, rvc_zero):
714 1.1 mrg /* 0 * Inf = NaN */
715 1.1 mrg get_canonical_qnan (r, sign);
716 1.1 mrg return false;
717 1.1 mrg
718 1.1 mrg case CLASS2 (rvc_inf, rvc_inf):
719 1.1 mrg case CLASS2 (rvc_normal, rvc_inf):
720 1.1 mrg case CLASS2 (rvc_inf, rvc_normal):
721 1.1 mrg /* Inf * Inf = Inf, R * Inf = Inf */
722 1.1 mrg get_inf (r, sign);
723 1.1 mrg return false;
724 1.1 mrg
725 1.1 mrg case CLASS2 (rvc_normal, rvc_normal):
726 1.1 mrg break;
727 1.1 mrg
728 1.1 mrg default:
729 1.1 mrg gcc_unreachable ();
730 1.1 mrg }
731 1.1 mrg
732 1.1 mrg if (r == a || r == b)
733 1.1 mrg rr = &t;
734 1.1 mrg else
735 1.1 mrg rr = r;
736 1.1 mrg get_zero (rr, 0);
737 1.1 mrg
738 1.1 mrg /* Collect all the partial products. Since we don't have sure access
739 1.1 mrg to a widening multiply, we split each long into two half-words.
740 1.1 mrg
741 1.1 mrg Consider the long-hand form of a four half-word multiplication:
742 1.1 mrg
743 1.1 mrg A B C D
744 1.1 mrg * E F G H
745 1.1 mrg --------------
746 1.1 mrg DE DF DG DH
747 1.1 mrg CE CF CG CH
748 1.1 mrg BE BF BG BH
749 1.1 mrg AE AF AG AH
750 1.1 mrg
751 1.1 mrg We construct partial products of the widened half-word products
752 1.1 mrg that are known to not overlap, e.g. DF+DH. Each such partial
753 1.1 mrg product is given its proper exponent, which allows us to sum them
754 1.1 mrg and obtain the finished product. */
755 1.1 mrg
756 1.1 mrg for (i = 0; i < SIGSZ * 2; ++i)
757 1.1 mrg {
758 1.1 mrg unsigned long ai = a->sig[i / 2];
759 1.1 mrg if (i & 1)
760 1.1 mrg ai >>= HOST_BITS_PER_LONG / 2;
761 1.1 mrg else
762 1.1 mrg ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
763 1.1 mrg
764 1.1 mrg if (ai == 0)
765 1.1 mrg continue;
766 1.1 mrg
767 1.1 mrg for (j = 0; j < 2; ++j)
768 1.1 mrg {
769 1.1 mrg int exp = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
770 1.1 mrg + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2)));
771 1.1 mrg
772 1.1 mrg if (exp > MAX_EXP)
773 1.1 mrg {
774 1.1 mrg get_inf (r, sign);
775 1.1 mrg return true;
776 1.1 mrg }
777 1.1 mrg if (exp < -MAX_EXP)
778 1.1 mrg {
779 1.1 mrg /* Would underflow to zero, which we shouldn't bother adding. */
780 1.1 mrg inexact = true;
781 1.1 mrg continue;
782 1.1 mrg }
783 1.1 mrg
784 1.1 mrg memset (&u, 0, sizeof (u));
785 1.1 mrg u.cl = rvc_normal;
786 1.1 mrg SET_REAL_EXP (&u, exp);
787 1.1 mrg
788 1.1 mrg for (k = j; k < SIGSZ * 2; k += 2)
789 1.1 mrg {
790 1.1 mrg unsigned long bi = b->sig[k / 2];
791 1.1 mrg if (k & 1)
792 1.1 mrg bi >>= HOST_BITS_PER_LONG / 2;
793 1.1 mrg else
794 1.1 mrg bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
795 1.1 mrg
796 1.1 mrg u.sig[k / 2] = ai * bi;
797 1.1 mrg }
798 1.1 mrg
799 1.1 mrg normalize (&u);
800 1.1 mrg inexact |= do_add (rr, rr, &u, 0);
801 1.1 mrg }
802 1.1 mrg }
803 1.1 mrg
804 1.1 mrg rr->sign = sign;
805 1.1 mrg if (rr != r)
806 1.1 mrg *r = t;
807 1.1 mrg
808 1.1 mrg return inexact;
809 1.1 mrg }
810 1.1 mrg
811 1.1 mrg /* Calculate R = A / B. Return true if the result may be inexact. */
812 1.1 mrg
813 1.1 mrg static bool
814 1.1 mrg do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
815 1.1 mrg const REAL_VALUE_TYPE *b)
816 1.1 mrg {
817 1.1 mrg int exp, sign = a->sign ^ b->sign;
818 1.1 mrg REAL_VALUE_TYPE t, *rr;
819 1.1 mrg bool inexact;
820 1.1 mrg
821 1.1 mrg switch (CLASS2 (a->cl, b->cl))
822 1.1 mrg {
823 1.1 mrg case CLASS2 (rvc_zero, rvc_zero):
824 1.1 mrg /* 0 / 0 = NaN. */
825 1.1 mrg case CLASS2 (rvc_inf, rvc_inf):
826 1.1 mrg /* Inf / Inf = NaN. */
827 1.1 mrg get_canonical_qnan (r, sign);
828 1.1 mrg return false;
829 1.1 mrg
830 1.1 mrg case CLASS2 (rvc_zero, rvc_normal):
831 1.1 mrg case CLASS2 (rvc_zero, rvc_inf):
832 1.1 mrg /* 0 / ANY = 0. */
833 1.1 mrg case CLASS2 (rvc_normal, rvc_inf):
834 1.1 mrg /* R / Inf = 0. */
835 1.1 mrg get_zero (r, sign);
836 1.1 mrg return false;
837 1.1 mrg
838 1.1 mrg case CLASS2 (rvc_normal, rvc_zero):
839 1.1 mrg /* R / 0 = Inf. */
840 1.1 mrg case CLASS2 (rvc_inf, rvc_zero):
841 1.1 mrg /* Inf / 0 = Inf. */
842 1.1 mrg get_inf (r, sign);
843 1.1 mrg return false;
844 1.1 mrg
845 1.1 mrg case CLASS2 (rvc_zero, rvc_nan):
846 1.1 mrg case CLASS2 (rvc_normal, rvc_nan):
847 1.1 mrg case CLASS2 (rvc_inf, rvc_nan):
848 1.1 mrg case CLASS2 (rvc_nan, rvc_nan):
849 1.1 mrg /* ANY / NaN = NaN. */
850 1.1 mrg *r = *b;
851 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the
852 1.1 mrg responsibility to avoid the operation if flag_signaling_nans
853 1.1 mrg is on. */
854 1.1 mrg r->signalling = 0;
855 1.1 mrg r->sign = sign;
856 1.1 mrg return false;
857 1.1 mrg
858 1.1 mrg case CLASS2 (rvc_nan, rvc_zero):
859 1.1 mrg case CLASS2 (rvc_nan, rvc_normal):
860 1.1 mrg case CLASS2 (rvc_nan, rvc_inf):
861 1.1 mrg /* NaN / ANY = NaN. */
862 1.1 mrg *r = *a;
863 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the
864 1.1 mrg responsibility to avoid the operation if flag_signaling_nans
865 1.1 mrg is on. */
866 1.1 mrg r->signalling = 0;
867 1.1 mrg r->sign = sign;
868 1.1 mrg return false;
869 1.1 mrg
870 1.1 mrg case CLASS2 (rvc_inf, rvc_normal):
871 1.1 mrg /* Inf / R = Inf. */
872 1.1 mrg get_inf (r, sign);
873 1.1 mrg return false;
874 1.1 mrg
875 1.1 mrg case CLASS2 (rvc_normal, rvc_normal):
876 1.1 mrg break;
877 1.1 mrg
878 1.1 mrg default:
879 1.1 mrg gcc_unreachable ();
880 1.1 mrg }
881 1.1 mrg
882 1.1 mrg if (r == a || r == b)
883 1.1 mrg rr = &t;
884 1.1 mrg else
885 1.1 mrg rr = r;
886 1.1 mrg
887 1.1 mrg /* Make sure all fields in the result are initialized. */
888 1.1 mrg get_zero (rr, 0);
889 1.1 mrg rr->cl = rvc_normal;
890 1.1 mrg rr->sign = sign;
891 1.1 mrg
892 1.1 mrg exp = REAL_EXP (a) - REAL_EXP (b) + 1;
893 1.1 mrg if (exp > MAX_EXP)
894 1.1 mrg {
895 1.1 mrg get_inf (r, sign);
896 1.1 mrg return true;
897 1.1 mrg }
898 1.1 mrg if (exp < -MAX_EXP)
899 1.1 mrg {
900 1.1 mrg get_zero (r, sign);
901 1.1 mrg return true;
902 1.1 mrg }
903 1.1 mrg SET_REAL_EXP (rr, exp);
904 1.1 mrg
905 1.1 mrg inexact = div_significands (rr, a, b);
906 1.1 mrg
907 1.1 mrg /* Re-normalize the result. */
908 1.1 mrg normalize (rr);
909 1.1 mrg rr->sig[0] |= inexact;
910 1.1 mrg
911 1.1 mrg if (rr != r)
912 1.1 mrg *r = t;
913 1.1 mrg
914 1.1 mrg return inexact;
915 1.1 mrg }
916 1.1 mrg
917 1.1 mrg /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
918 1.1 mrg one of the two operands is a NaN. */
919 1.1 mrg
920 1.1 mrg static int
921 1.1 mrg do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
922 1.1 mrg int nan_result)
923 1.1 mrg {
924 1.1 mrg int ret;
925 1.1 mrg
926 1.1 mrg switch (CLASS2 (a->cl, b->cl))
927 1.1 mrg {
928 1.1 mrg case CLASS2 (rvc_zero, rvc_zero):
929 1.1 mrg /* Sign of zero doesn't matter for compares. */
930 1.1 mrg return 0;
931 1.1 mrg
932 1.1 mrg case CLASS2 (rvc_normal, rvc_zero):
933 1.1 mrg /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */
934 1.1 mrg if (a->decimal)
935 1.1 mrg return decimal_do_compare (a, b, nan_result);
936 1.1 mrg /* Fall through. */
937 1.1 mrg case CLASS2 (rvc_inf, rvc_zero):
938 1.1 mrg case CLASS2 (rvc_inf, rvc_normal):
939 1.1 mrg return (a->sign ? -1 : 1);
940 1.1 mrg
941 1.1 mrg case CLASS2 (rvc_inf, rvc_inf):
942 1.1 mrg return -a->sign - -b->sign;
943 1.1 mrg
944 1.1 mrg case CLASS2 (rvc_zero, rvc_normal):
945 1.1 mrg /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */
946 1.1 mrg if (b->decimal)
947 1.1 mrg return decimal_do_compare (a, b, nan_result);
948 1.1 mrg /* Fall through. */
949 1.1 mrg case CLASS2 (rvc_zero, rvc_inf):
950 1.1 mrg case CLASS2 (rvc_normal, rvc_inf):
951 1.1 mrg return (b->sign ? 1 : -1);
952 1.1 mrg
953 1.1 mrg case CLASS2 (rvc_zero, rvc_nan):
954 1.1 mrg case CLASS2 (rvc_normal, rvc_nan):
955 1.1 mrg case CLASS2 (rvc_inf, rvc_nan):
956 1.1 mrg case CLASS2 (rvc_nan, rvc_nan):
957 1.1 mrg case CLASS2 (rvc_nan, rvc_zero):
958 1.1 mrg case CLASS2 (rvc_nan, rvc_normal):
959 1.1 mrg case CLASS2 (rvc_nan, rvc_inf):
960 1.1 mrg return nan_result;
961 1.1 mrg
962 1.1 mrg case CLASS2 (rvc_normal, rvc_normal):
963 1.1 mrg break;
964 1.1 mrg
965 1.1 mrg default:
966 1.1 mrg gcc_unreachable ();
967 1.1 mrg }
968 1.1 mrg
969 1.1 mrg if (a->decimal || b->decimal)
970 1.1 mrg return decimal_do_compare (a, b, nan_result);
971 1.1 mrg
972 1.1 mrg if (a->sign != b->sign)
973 1.1 mrg return -a->sign - -b->sign;
974 1.1 mrg
975 1.1 mrg if (REAL_EXP (a) > REAL_EXP (b))
976 1.1 mrg ret = 1;
977 1.1 mrg else if (REAL_EXP (a) < REAL_EXP (b))
978 1.1 mrg ret = -1;
979 1.1 mrg else
980 1.1 mrg ret = cmp_significands (a, b);
981 1.1 mrg
982 1.1 mrg return (a->sign ? -ret : ret);
983 1.1 mrg }
984 1.1 mrg
985 1.1 mrg /* Return A truncated to an integral value toward zero. */
986 1.1 mrg
987 1.1 mrg static void
988 1.1 mrg do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
989 1.1 mrg {
990 1.1 mrg *r = *a;
991 1.1 mrg
992 1.1 mrg switch (r->cl)
993 1.1 mrg {
994 1.1 mrg case rvc_zero:
995 1.1 mrg case rvc_inf:
996 1.1 mrg case rvc_nan:
997 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the
998 1.1 mrg responsibility to avoid the operation if flag_signaling_nans
999 1.1 mrg is on. */
1000 1.1 mrg r->signalling = 0;
1001 1.1 mrg break;
1002 1.1 mrg
1003 1.1 mrg case rvc_normal:
1004 1.1 mrg if (r->decimal)
1005 1.1 mrg {
1006 1.1 mrg decimal_do_fix_trunc (r, a);
1007 1.1 mrg return;
1008 1.1 mrg }
1009 1.1 mrg if (REAL_EXP (r) <= 0)
1010 1.1 mrg get_zero (r, r->sign);
1011 1.1 mrg else if (REAL_EXP (r) < SIGNIFICAND_BITS)
1012 1.1 mrg clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r));
1013 1.1 mrg break;
1014 1.1 mrg
1015 1.1 mrg default:
1016 1.1 mrg gcc_unreachable ();
1017 1.1 mrg }
1018 1.1 mrg }
1019 1.1 mrg
1020 1.1 mrg /* Perform the binary or unary operation described by CODE.
1021 1.1 mrg For a unary operation, leave OP1 NULL. This function returns
1022 1.1 mrg true if the result may be inexact due to loss of precision. */
1023 1.1 mrg
1024 1.1 mrg bool
1025 1.1 mrg real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
1026 1.1 mrg const REAL_VALUE_TYPE *op1)
1027 1.1 mrg {
1028 1.1 mrg enum tree_code code = (enum tree_code) icode;
1029 1.1 mrg
1030 1.1 mrg if (op0->decimal || (op1 && op1->decimal))
1031 1.1 mrg return decimal_real_arithmetic (r, code, op0, op1);
1032 1.1 mrg
1033 1.1 mrg switch (code)
1034 1.1 mrg {
1035 1.1 mrg case PLUS_EXPR:
1036 1.1 mrg /* Clear any padding areas in *r if it isn't equal to one of the
1037 1.1 mrg operands so that we can later do bitwise comparisons later on. */
1038 1.1 mrg if (r != op0 && r != op1)
1039 1.1 mrg memset (r, '\0', sizeof (*r));
1040 1.1 mrg return do_add (r, op0, op1, 0);
1041 1.1 mrg
1042 1.1 mrg case MINUS_EXPR:
1043 1.1 mrg if (r != op0 && r != op1)
1044 1.1 mrg memset (r, '\0', sizeof (*r));
1045 1.1 mrg return do_add (r, op0, op1, 1);
1046 1.1 mrg
1047 1.1 mrg case MULT_EXPR:
1048 1.1 mrg if (r != op0 && r != op1)
1049 1.1 mrg memset (r, '\0', sizeof (*r));
1050 1.1 mrg return do_multiply (r, op0, op1);
1051 1.1 mrg
1052 1.1 mrg case RDIV_EXPR:
1053 1.1 mrg if (r != op0 && r != op1)
1054 1.1 mrg memset (r, '\0', sizeof (*r));
1055 1.1 mrg return do_divide (r, op0, op1);
1056 1.1 mrg
1057 1.1 mrg case MIN_EXPR:
1058 1.1 mrg if (op1->cl == rvc_nan)
1059 1.1 mrg {
1060 1.1 mrg *r = *op1;
1061 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the
1062 1.1 mrg responsibility to avoid the operation if flag_signaling_nans
1063 1.1 mrg is on. */
1064 1.1 mrg r->signalling = 0;
1065 1.1 mrg }
1066 1.1 mrg else if (do_compare (op0, op1, -1) < 0)
1067 1.1 mrg *r = *op0;
1068 1.1 mrg else
1069 1.1 mrg *r = *op1;
1070 1.1 mrg break;
1071 1.1 mrg
1072 1.1 mrg case MAX_EXPR:
1073 1.1 mrg if (op1->cl == rvc_nan)
1074 1.1 mrg {
1075 1.1 mrg *r = *op1;
1076 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the
1077 1.1 mrg responsibility to avoid the operation if flag_signaling_nans
1078 1.1 mrg is on. */
1079 1.1 mrg r->signalling = 0;
1080 1.1 mrg }
1081 1.1 mrg else if (do_compare (op0, op1, 1) < 0)
1082 1.1 mrg *r = *op1;
1083 1.1 mrg else
1084 1.1 mrg *r = *op0;
1085 1.1 mrg break;
1086 1.1 mrg
1087 1.1 mrg case NEGATE_EXPR:
1088 1.1 mrg *r = *op0;
1089 1.1 mrg r->sign ^= 1;
1090 1.1 mrg break;
1091 1.1 mrg
1092 1.1 mrg case ABS_EXPR:
1093 1.1 mrg *r = *op0;
1094 1.1 mrg r->sign = 0;
1095 1.1 mrg break;
1096 1.1 mrg
1097 1.1 mrg case FIX_TRUNC_EXPR:
1098 1.1 mrg do_fix_trunc (r, op0);
1099 1.1 mrg break;
1100 1.1 mrg
1101 1.1 mrg default:
1102 1.1 mrg gcc_unreachable ();
1103 1.1 mrg }
1104 1.1 mrg return false;
1105 1.1 mrg }
1106 1.1 mrg
1107 1.1 mrg REAL_VALUE_TYPE
1108 1.1 mrg real_value_negate (const REAL_VALUE_TYPE *op0)
1109 1.1 mrg {
1110 1.1 mrg REAL_VALUE_TYPE r;
1111 1.1 mrg real_arithmetic (&r, NEGATE_EXPR, op0, NULL);
1112 1.1 mrg return r;
1113 1.1 mrg }
1114 1.1 mrg
1115 1.1 mrg REAL_VALUE_TYPE
1116 1.1 mrg real_value_abs (const REAL_VALUE_TYPE *op0)
1117 1.1 mrg {
1118 1.1 mrg REAL_VALUE_TYPE r;
1119 1.1 mrg real_arithmetic (&r, ABS_EXPR, op0, NULL);
1120 1.1 mrg return r;
1121 1.1 mrg }
1122 1.1 mrg
1123 1.1 mrg /* Return whether OP0 == OP1. */
1124 1.1 mrg
1125 1.1 mrg bool
1126 1.1 mrg real_equal (const REAL_VALUE_TYPE *op0, const REAL_VALUE_TYPE *op1)
1127 1.1 mrg {
1128 1.1 mrg return do_compare (op0, op1, -1) == 0;
1129 1.1 mrg }
1130 1.1 mrg
1131 1.1 mrg /* Return whether OP0 < OP1. */
1132 1.1 mrg
1133 1.1 mrg bool
1134 1.1 mrg real_less (const REAL_VALUE_TYPE *op0, const REAL_VALUE_TYPE *op1)
1135 1.1 mrg {
1136 1.1 mrg return do_compare (op0, op1, 1) < 0;
1137 1.1 mrg }
1138 1.1 mrg
1139 1.1 mrg bool
1140 1.1 mrg real_compare (int icode, const REAL_VALUE_TYPE *op0,
1141 1.1 mrg const REAL_VALUE_TYPE *op1)
1142 1.1 mrg {
1143 1.1 mrg enum tree_code code = (enum tree_code) icode;
1144 1.1 mrg
1145 1.1 mrg switch (code)
1146 1.1 mrg {
1147 1.1 mrg case LT_EXPR:
1148 1.1 mrg return real_less (op0, op1);
1149 1.1 mrg case LE_EXPR:
1150 1.1 mrg return do_compare (op0, op1, 1) <= 0;
1151 1.1 mrg case GT_EXPR:
1152 1.1 mrg return do_compare (op0, op1, -1) > 0;
1153 1.1 mrg case GE_EXPR:
1154 1.1 mrg return do_compare (op0, op1, -1) >= 0;
1155 1.1 mrg case EQ_EXPR:
1156 1.1 mrg return real_equal (op0, op1);
1157 1.1 mrg case NE_EXPR:
1158 1.1 mrg return do_compare (op0, op1, -1) != 0;
1159 1.1 mrg case UNORDERED_EXPR:
1160 1.1 mrg return op0->cl == rvc_nan || op1->cl == rvc_nan;
1161 1.1 mrg case ORDERED_EXPR:
1162 1.1 mrg return op0->cl != rvc_nan && op1->cl != rvc_nan;
1163 1.1 mrg case UNLT_EXPR:
1164 1.1 mrg return do_compare (op0, op1, -1) < 0;
1165 1.1 mrg case UNLE_EXPR:
1166 1.1 mrg return do_compare (op0, op1, -1) <= 0;
1167 1.1 mrg case UNGT_EXPR:
1168 1.1 mrg return do_compare (op0, op1, 1) > 0;
1169 1.1 mrg case UNGE_EXPR:
1170 1.1 mrg return do_compare (op0, op1, 1) >= 0;
1171 1.1 mrg case UNEQ_EXPR:
1172 1.1 mrg return do_compare (op0, op1, 0) == 0;
1173 1.1 mrg case LTGT_EXPR:
1174 1.1 mrg return do_compare (op0, op1, 0) != 0;
1175 1.1 mrg
1176 1.1 mrg default:
1177 1.1 mrg gcc_unreachable ();
1178 1.1 mrg }
1179 1.1 mrg }
1180 1.1 mrg
1181 1.1 mrg /* Return floor log2(R). */
1182 1.1 mrg
1183 1.1 mrg int
1184 1.1 mrg real_exponent (const REAL_VALUE_TYPE *r)
1185 1.1 mrg {
1186 1.1 mrg switch (r->cl)
1187 1.1 mrg {
1188 1.1 mrg case rvc_zero:
1189 1.1 mrg return 0;
1190 1.1 mrg case rvc_inf:
1191 1.1 mrg case rvc_nan:
1192 1.1 mrg return (unsigned int)-1 >> 1;
1193 1.1 mrg case rvc_normal:
1194 1.1 mrg return REAL_EXP (r);
1195 1.1 mrg default:
1196 1.1 mrg gcc_unreachable ();
1197 1.1 mrg }
1198 1.1 mrg }
1199 1.1 mrg
1200 1.1 mrg /* R = OP0 * 2**EXP. */
1201 1.1 mrg
1202 1.1 mrg void
1203 1.1 mrg real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
1204 1.1 mrg {
1205 1.1 mrg *r = *op0;
1206 1.1 mrg switch (r->cl)
1207 1.1 mrg {
1208 1.1 mrg case rvc_zero:
1209 1.1 mrg case rvc_inf:
1210 1.1 mrg case rvc_nan:
1211 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the
1212 1.1 mrg responsibility to avoid the operation if flag_signaling_nans
1213 1.1 mrg is on. */
1214 1.1 mrg r->signalling = 0;
1215 1.1 mrg break;
1216 1.1 mrg
1217 1.1 mrg case rvc_normal:
1218 1.1 mrg exp += REAL_EXP (op0);
1219 1.1 mrg if (exp > MAX_EXP)
1220 1.1 mrg get_inf (r, r->sign);
1221 1.1 mrg else if (exp < -MAX_EXP)
1222 1.1 mrg get_zero (r, r->sign);
1223 1.1 mrg else
1224 1.1 mrg SET_REAL_EXP (r, exp);
1225 1.1 mrg break;
1226 1.1 mrg
1227 1.1 mrg default:
1228 1.1 mrg gcc_unreachable ();
1229 1.1 mrg }
1230 1.1 mrg }
1231 1.1 mrg
1232 1.1 mrg /* Determine whether a floating-point value X is infinite. */
1233 1.1 mrg
1234 1.1 mrg bool
1235 1.1 mrg real_isinf (const REAL_VALUE_TYPE *r)
1236 1.1 mrg {
1237 1.1 mrg return (r->cl == rvc_inf);
1238 1.1 mrg }
1239 1.1 mrg
1240 1.1 mrg /* Determine whether a floating-point value X is a NaN. */
1241 1.1 mrg
1242 1.1 mrg bool
1243 1.1 mrg real_isnan (const REAL_VALUE_TYPE *r)
1244 1.1 mrg {
1245 1.1 mrg return (r->cl == rvc_nan);
1246 1.1 mrg }
1247 1.1 mrg
1248 1.1 mrg /* Determine whether a floating-point value X is a signaling NaN. */
1249 1.1 mrg bool real_issignaling_nan (const REAL_VALUE_TYPE *r)
1250 1.1 mrg {
1251 1.1 mrg return real_isnan (r) && r->signalling;
1252 1.1 mrg }
1253 1.1 mrg
1254 1.1 mrg /* Determine whether a floating-point value X is finite. */
1255 1.1 mrg
1256 1.1 mrg bool
1257 1.1 mrg real_isfinite (const REAL_VALUE_TYPE *r)
1258 1.1 mrg {
1259 1.1 mrg return (r->cl != rvc_nan) && (r->cl != rvc_inf);
1260 1.1 mrg }
1261 1.1 mrg
1262 1.1 mrg /* Determine whether a floating-point value X is negative. */
1263 1.1 mrg
1264 1.1 mrg bool
1265 1.1 mrg real_isneg (const REAL_VALUE_TYPE *r)
1266 1.1 mrg {
1267 1.1 mrg return r->sign;
1268 1.1 mrg }
1269 1.1 mrg
1270 1.1 mrg /* Determine whether a floating-point value X is minus zero. */
1271 1.1 mrg
1272 1.1 mrg bool
1273 1.1 mrg real_isnegzero (const REAL_VALUE_TYPE *r)
1274 1.1 mrg {
1275 1.1 mrg return r->sign && r->cl == rvc_zero;
1276 1.1 mrg }
1277 1.1 mrg
1278 1.1 mrg /* Compare two floating-point objects for bitwise identity. */
1279 1.1 mrg
1280 1.1 mrg bool
1281 1.1 mrg real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
1282 1.1 mrg {
1283 1.1 mrg int i;
1284 1.1 mrg
1285 1.1 mrg if (a->cl != b->cl)
1286 1.1 mrg return false;
1287 1.1 mrg if (a->sign != b->sign)
1288 1.1 mrg return false;
1289 1.1 mrg
1290 1.1 mrg switch (a->cl)
1291 1.1 mrg {
1292 1.1 mrg case rvc_zero:
1293 1.1 mrg case rvc_inf:
1294 1.1 mrg return true;
1295 1.1 mrg
1296 1.1 mrg case rvc_normal:
1297 1.1 mrg if (a->decimal != b->decimal)
1298 1.1 mrg return false;
1299 1.1 mrg if (REAL_EXP (a) != REAL_EXP (b))
1300 1.1 mrg return false;
1301 1.1 mrg break;
1302 1.1 mrg
1303 1.1 mrg case rvc_nan:
1304 1.1 mrg if (a->signalling != b->signalling)
1305 1.1 mrg return false;
1306 1.1 mrg /* The significand is ignored for canonical NaNs. */
1307 1.1 mrg if (a->canonical || b->canonical)
1308 1.1 mrg return a->canonical == b->canonical;
1309 1.1 mrg break;
1310 1.1 mrg
1311 1.1 mrg default:
1312 1.1 mrg gcc_unreachable ();
1313 1.1 mrg }
1314 1.1 mrg
1315 1.1 mrg for (i = 0; i < SIGSZ; ++i)
1316 1.1 mrg if (a->sig[i] != b->sig[i])
1317 1.1 mrg return false;
1318 1.1 mrg
1319 1.1 mrg return true;
1320 1.1 mrg }
1321 1.1 mrg
1322 1.1 mrg /* Try to change R into its exact multiplicative inverse in format FMT.
1323 1.1 mrg Return true if successful. */
1324 1.1 mrg
1325 1.1 mrg bool
1326 1.1 mrg exact_real_inverse (format_helper fmt, REAL_VALUE_TYPE *r)
1327 1.1 mrg {
1328 1.1 mrg const REAL_VALUE_TYPE *one = real_digit (1);
1329 1.1 mrg REAL_VALUE_TYPE u;
1330 1.1 mrg int i;
1331 1.1 mrg
1332 1.1 mrg if (r->cl != rvc_normal)
1333 1.1 mrg return false;
1334 1.1 mrg
1335 1.1 mrg /* Check for a power of two: all significand bits zero except the MSB. */
1336 1.1 mrg for (i = 0; i < SIGSZ-1; ++i)
1337 1.1 mrg if (r->sig[i] != 0)
1338 1.1 mrg return false;
1339 1.1 mrg if (r->sig[SIGSZ-1] != SIG_MSB)
1340 1.1 mrg return false;
1341 1.1 mrg
1342 1.1 mrg /* Find the inverse and truncate to the required format. */
1343 1.1 mrg do_divide (&u, one, r);
1344 1.1 mrg real_convert (&u, fmt, &u);
1345 1.1 mrg
1346 1.1 mrg /* The rounding may have overflowed. */
1347 1.1 mrg if (u.cl != rvc_normal)
1348 1.1 mrg return false;
1349 1.1 mrg for (i = 0; i < SIGSZ-1; ++i)
1350 1.1 mrg if (u.sig[i] != 0)
1351 1.1 mrg return false;
1352 1.1 mrg if (u.sig[SIGSZ-1] != SIG_MSB)
1353 1.1 mrg return false;
1354 1.1 mrg
1355 1.1 mrg *r = u;
1356 1.1 mrg return true;
1357 1.1 mrg }
1358 1.1 mrg
1359 1.1 mrg /* Return true if arithmetic on values in IMODE that were promoted
1360 1.1 mrg from values in TMODE is equivalent to direct arithmetic on values
1361 1.1 mrg in TMODE. */
1362 1.1 mrg
1363 1.1 mrg bool
1364 1.1 mrg real_can_shorten_arithmetic (machine_mode imode, machine_mode tmode)
1365 1.1 mrg {
1366 1.1 mrg const struct real_format *tfmt, *ifmt;
1367 1.1 mrg tfmt = REAL_MODE_FORMAT (tmode);
1368 1.1 mrg ifmt = REAL_MODE_FORMAT (imode);
1369 1.1 mrg /* These conditions are conservative rather than trying to catch the
1370 1.1 mrg exact boundary conditions; the main case to allow is IEEE float
1371 1.1 mrg and double. */
1372 1.1 mrg return (ifmt->b == tfmt->b
1373 1.1 mrg && ifmt->p > 2 * tfmt->p
1374 1.1 mrg && ifmt->emin < 2 * tfmt->emin - tfmt->p - 2
1375 1.1 mrg && ifmt->emin < tfmt->emin - tfmt->emax - tfmt->p - 2
1376 1.1 mrg && ifmt->emax > 2 * tfmt->emax + 2
1377 1.1 mrg && ifmt->emax > tfmt->emax - tfmt->emin + tfmt->p + 2
1378 1.1 mrg && ifmt->round_towards_zero == tfmt->round_towards_zero
1379 1.1 mrg && (ifmt->has_sign_dependent_rounding
1380 1.1 mrg == tfmt->has_sign_dependent_rounding)
1381 1.1 mrg && ifmt->has_nans >= tfmt->has_nans
1382 1.1 mrg && ifmt->has_inf >= tfmt->has_inf
1383 1.1 mrg && ifmt->has_signed_zero >= tfmt->has_signed_zero
1384 1.1 mrg && !MODE_COMPOSITE_P (tmode)
1385 1.1 mrg && !MODE_COMPOSITE_P (imode));
1386 1.1 mrg }
1387 1.1 mrg
1388 1.1 mrg /* Render R as an integer. */
1390 1.1 mrg
1391 1.1 mrg HOST_WIDE_INT
1392 1.1 mrg real_to_integer (const REAL_VALUE_TYPE *r)
1393 1.1 mrg {
1394 1.1 mrg unsigned HOST_WIDE_INT i;
1395 1.1 mrg
1396 1.1 mrg switch (r->cl)
1397 1.1 mrg {
1398 1.1 mrg case rvc_zero:
1399 1.1 mrg underflow:
1400 1.1 mrg return 0;
1401 1.1 mrg
1402 1.1 mrg case rvc_inf:
1403 1.1 mrg case rvc_nan:
1404 1.1 mrg overflow:
1405 1.1 mrg i = HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1);
1406 1.1 mrg if (!r->sign)
1407 1.1 mrg i--;
1408 1.1 mrg return i;
1409 1.1 mrg
1410 1.1 mrg case rvc_normal:
1411 1.1 mrg if (r->decimal)
1412 1.1 mrg return decimal_real_to_integer (r);
1413 1.1 mrg
1414 1.1 mrg if (REAL_EXP (r) <= 0)
1415 1.1 mrg goto underflow;
1416 1.1 mrg /* Only force overflow for unsigned overflow. Signed overflow is
1417 1.1 mrg undefined, so it doesn't matter what we return, and some callers
1418 1.1 mrg expect to be able to use this routine for both signed and
1419 1.1 mrg unsigned conversions. */
1420 1.1 mrg if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT)
1421 1.1 mrg goto overflow;
1422 1.1 mrg
1423 1.1 mrg if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1424 1.1 mrg i = r->sig[SIGSZ-1];
1425 1.1 mrg else
1426 1.1 mrg {
1427 1.1 mrg gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
1428 1.1 mrg i = r->sig[SIGSZ-1];
1429 1.1 mrg i = i << (HOST_BITS_PER_LONG - 1) << 1;
1430 1.1 mrg i |= r->sig[SIGSZ-2];
1431 1.1 mrg }
1432 1.1 mrg
1433 1.1 mrg i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r);
1434 1.1 mrg
1435 1.1 mrg if (r->sign)
1436 1.1 mrg i = -i;
1437 1.1 mrg return i;
1438 1.1 mrg
1439 1.1 mrg default:
1440 1.1 mrg gcc_unreachable ();
1441 1.1 mrg }
1442 1.1 mrg }
1443 1.1 mrg
1444 1.1 mrg /* Likewise, but producing a wide-int of PRECISION. If the value cannot
1445 1.1 mrg be represented in precision, *FAIL is set to TRUE. */
1446 1.1 mrg
1447 1.1 mrg wide_int
1448 1.1 mrg real_to_integer (const REAL_VALUE_TYPE *r, bool *fail, int precision)
1449 1.1 mrg {
1450 1.1 mrg HOST_WIDE_INT val[2 * WIDE_INT_MAX_ELTS];
1451 1.1 mrg int exp;
1452 1.1 mrg int words, w;
1453 1.1 mrg wide_int result;
1454 1.1 mrg
1455 1.1 mrg switch (r->cl)
1456 1.1 mrg {
1457 1.1 mrg case rvc_zero:
1458 1.1 mrg underflow:
1459 1.1 mrg return wi::zero (precision);
1460 1.1 mrg
1461 1.1 mrg case rvc_inf:
1462 1.1 mrg case rvc_nan:
1463 1.1 mrg overflow:
1464 1.1 mrg *fail = true;
1465 1.1 mrg
1466 1.1 mrg if (r->sign)
1467 1.1 mrg return wi::set_bit_in_zero (precision - 1, precision);
1468 1.1 mrg else
1469 1.1 mrg return ~wi::set_bit_in_zero (precision - 1, precision);
1470 1.1 mrg
1471 1.1 mrg case rvc_normal:
1472 1.1 mrg if (r->decimal)
1473 1.1 mrg return decimal_real_to_integer (r, fail, precision);
1474 1.1 mrg
1475 1.1 mrg exp = REAL_EXP (r);
1476 1.1 mrg if (exp <= 0)
1477 1.1 mrg goto underflow;
1478 1.1 mrg /* Only force overflow for unsigned overflow. Signed overflow is
1479 1.1 mrg undefined, so it doesn't matter what we return, and some callers
1480 1.1 mrg expect to be able to use this routine for both signed and
1481 1.1 mrg unsigned conversions. */
1482 1.1 mrg if (exp > precision)
1483 1.1 mrg goto overflow;
1484 1.1 mrg
1485 1.1 mrg /* Put the significand into a wide_int that has precision W, which
1486 1.1 mrg is the smallest HWI-multiple that has at least PRECISION bits.
1487 1.1 mrg This ensures that the top bit of the significand is in the
1488 1.1 mrg top bit of the wide_int. */
1489 1.1 mrg words = (precision + HOST_BITS_PER_WIDE_INT - 1) / HOST_BITS_PER_WIDE_INT;
1490 1.1 mrg w = words * HOST_BITS_PER_WIDE_INT;
1491 1.1 mrg
1492 1.1 mrg #if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1493 1.1 mrg for (int i = 0; i < words; i++)
1494 1.1 mrg {
1495 1.1 mrg int j = SIGSZ - words + i;
1496 1.1 mrg val[i] = (j < 0) ? 0 : r->sig[j];
1497 1.1 mrg }
1498 1.1 mrg #else
1499 1.1 mrg gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
1500 1.1 mrg for (int i = 0; i < words; i++)
1501 1.1 mrg {
1502 1.1 mrg int j = SIGSZ - (words * 2) + (i * 2);
1503 1.1 mrg if (j < 0)
1504 1.1 mrg val[i] = 0;
1505 1.1 mrg else
1506 1.1 mrg val[i] = r->sig[j];
1507 1.1 mrg j += 1;
1508 1.1 mrg if (j >= 0)
1509 1.1 mrg val[i] |= (unsigned HOST_WIDE_INT) r->sig[j] << HOST_BITS_PER_LONG;
1510 1.1 mrg }
1511 1.1 mrg #endif
1512 1.1 mrg /* Shift the value into place and truncate to the desired precision. */
1513 1.1 mrg result = wide_int::from_array (val, words, w);
1514 1.1 mrg result = wi::lrshift (result, w - exp);
1515 1.1 mrg result = wide_int::from (result, precision, UNSIGNED);
1516 1.1 mrg
1517 1.1 mrg if (r->sign)
1518 1.1 mrg return -result;
1519 1.1 mrg else
1520 1.1 mrg return result;
1521 1.1 mrg
1522 1.1 mrg default:
1523 1.1 mrg gcc_unreachable ();
1524 1.1 mrg }
1525 1.1 mrg }
1526 1.1 mrg
1527 1.1 mrg /* A subroutine of real_to_decimal. Compute the quotient and remainder
1528 1.1 mrg of NUM / DEN. Return the quotient and place the remainder in NUM.
1529 1.1 mrg It is expected that NUM / DEN are close enough that the quotient is
1530 1.1 mrg small. */
1531 1.1 mrg
1532 1.1 mrg static unsigned long
1533 1.1 mrg rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den)
1534 1.1 mrg {
1535 1.1 mrg unsigned long q, msb;
1536 1.1 mrg int expn = REAL_EXP (num), expd = REAL_EXP (den);
1537 1.1 mrg
1538 1.1 mrg if (expn < expd)
1539 1.1 mrg return 0;
1540 1.1 mrg
1541 1.1 mrg q = msb = 0;
1542 1.1 mrg goto start;
1543 1.1 mrg do
1544 1.1 mrg {
1545 1.1 mrg msb = num->sig[SIGSZ-1] & SIG_MSB;
1546 1.1 mrg q <<= 1;
1547 1.1 mrg lshift_significand_1 (num, num);
1548 1.1 mrg start:
1549 1.1 mrg if (msb || cmp_significands (num, den) >= 0)
1550 1.1 mrg {
1551 1.1 mrg sub_significands (num, num, den, 0);
1552 1.1 mrg q |= 1;
1553 1.1 mrg }
1554 1.1 mrg }
1555 1.1 mrg while (--expn >= expd);
1556 1.1 mrg
1557 1.1 mrg SET_REAL_EXP (num, expd);
1558 1.1 mrg normalize (num);
1559 1.1 mrg
1560 1.1 mrg return q;
1561 1.1 mrg }
1562 1.1 mrg
1563 1.1 mrg /* Render R as a decimal floating point constant. Emit DIGITS significant
1564 1.1 mrg digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the
1565 1.1 mrg maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing
1566 1.1 mrg zeros. If MODE is VOIDmode, round to nearest value. Otherwise, round
1567 1.1 mrg to a string that, when parsed back in mode MODE, yields the same value. */
1568 1.1 mrg
1569 1.1 mrg #define M_LOG10_2 0.30102999566398119521
1570 1.1 mrg
1571 1.1 mrg void
1572 1.1 mrg real_to_decimal_for_mode (char *str, const REAL_VALUE_TYPE *r_orig,
1573 1.1 mrg size_t buf_size, size_t digits,
1574 1.1 mrg int crop_trailing_zeros, machine_mode mode)
1575 1.1 mrg {
1576 1.1 mrg const struct real_format *fmt = NULL;
1577 1.1 mrg const REAL_VALUE_TYPE *one, *ten;
1578 1.1 mrg REAL_VALUE_TYPE r, pten, u, v;
1579 1.1 mrg int dec_exp, cmp_one, digit;
1580 1.1 mrg size_t max_digits;
1581 1.1 mrg char *p, *first, *last;
1582 1.1 mrg bool sign;
1583 1.1 mrg bool round_up;
1584 1.1 mrg
1585 1.1 mrg if (mode != VOIDmode)
1586 1.1 mrg {
1587 1.1 mrg fmt = REAL_MODE_FORMAT (mode);
1588 1.1 mrg gcc_assert (fmt);
1589 1.1 mrg }
1590 1.1 mrg
1591 1.1 mrg r = *r_orig;
1592 1.1 mrg switch (r.cl)
1593 1.1 mrg {
1594 1.1 mrg case rvc_zero:
1595 1.1 mrg strcpy (str, (r.sign ? "-0.0" : "0.0"));
1596 1.1 mrg return;
1597 1.1 mrg case rvc_normal:
1598 1.1 mrg break;
1599 1.1 mrg case rvc_inf:
1600 1.1 mrg strcpy (str, (r.sign ? "-Inf" : "+Inf"));
1601 1.1 mrg return;
1602 1.1 mrg case rvc_nan:
1603 1.1 mrg /* ??? Print the significand as well, if not canonical? */
1604 1.1 mrg sprintf (str, "%c%cNaN", (r_orig->sign ? '-' : '+'),
1605 1.1 mrg (r_orig->signalling ? 'S' : 'Q'));
1606 1.1 mrg return;
1607 1.1 mrg default:
1608 1.1 mrg gcc_unreachable ();
1609 1.1 mrg }
1610 1.1 mrg
1611 1.1 mrg if (r.decimal)
1612 1.1 mrg {
1613 1.1 mrg decimal_real_to_decimal (str, &r, buf_size, digits, crop_trailing_zeros);
1614 1.1 mrg return;
1615 1.1 mrg }
1616 1.1 mrg
1617 1.1 mrg /* Bound the number of digits printed by the size of the representation. */
1618 1.1 mrg max_digits = SIGNIFICAND_BITS * M_LOG10_2;
1619 1.1 mrg if (digits == 0 || digits > max_digits)
1620 1.1 mrg digits = max_digits;
1621 1.1 mrg
1622 1.1 mrg /* Estimate the decimal exponent, and compute the length of the string it
1623 1.1 mrg will print as. Be conservative and add one to account for possible
1624 1.1 mrg overflow or rounding error. */
1625 1.1 mrg dec_exp = REAL_EXP (&r) * M_LOG10_2;
1626 1.1 mrg for (max_digits = 1; dec_exp ; max_digits++)
1627 1.1 mrg dec_exp /= 10;
1628 1.1 mrg
1629 1.1 mrg /* Bound the number of digits printed by the size of the output buffer. */
1630 1.1 mrg max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
1631 1.1 mrg gcc_assert (max_digits <= buf_size);
1632 1.1 mrg if (digits > max_digits)
1633 1.1 mrg digits = max_digits;
1634 1.1 mrg
1635 1.1 mrg one = real_digit (1);
1636 1.1 mrg ten = ten_to_ptwo (0);
1637 1.1 mrg
1638 1.1 mrg sign = r.sign;
1639 1.1 mrg r.sign = 0;
1640 1.1 mrg
1641 1.1 mrg dec_exp = 0;
1642 1.1 mrg pten = *one;
1643 1.1 mrg
1644 1.1 mrg cmp_one = do_compare (&r, one, 0);
1645 1.1 mrg if (cmp_one > 0)
1646 1.1 mrg {
1647 1.1 mrg int m;
1648 1.1 mrg
1649 1.1 mrg /* Number is greater than one. Convert significand to an integer
1650 1.1 mrg and strip trailing decimal zeros. */
1651 1.1 mrg
1652 1.1 mrg u = r;
1653 1.1 mrg SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1);
1654 1.1 mrg
1655 1.1 mrg /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
1656 1.1 mrg m = floor_log2 (max_digits);
1657 1.1 mrg
1658 1.1 mrg /* Iterate over the bits of the possible powers of 10 that might
1659 1.1 mrg be present in U and eliminate them. That is, if we find that
1660 1.1 mrg 10**2**M divides U evenly, keep the division and increase
1661 1.1 mrg DEC_EXP by 2**M. */
1662 1.1 mrg do
1663 1.1 mrg {
1664 1.1 mrg REAL_VALUE_TYPE t;
1665 1.1 mrg
1666 1.1 mrg do_divide (&t, &u, ten_to_ptwo (m));
1667 1.1 mrg do_fix_trunc (&v, &t);
1668 1.1 mrg if (cmp_significands (&v, &t) == 0)
1669 1.1 mrg {
1670 1.1 mrg u = t;
1671 1.1 mrg dec_exp += 1 << m;
1672 1.1 mrg }
1673 1.1 mrg }
1674 1.1 mrg while (--m >= 0);
1675 1.1 mrg
1676 1.1 mrg /* Revert the scaling to integer that we performed earlier. */
1677 1.1 mrg SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r)
1678 1.1 mrg - (SIGNIFICAND_BITS - 1));
1679 1.1 mrg r = u;
1680 1.1 mrg
1681 1.1 mrg /* Find power of 10. Do this by dividing out 10**2**M when
1682 1.1 mrg this is larger than the current remainder. Fill PTEN with
1683 1.1 mrg the power of 10 that we compute. */
1684 1.1 mrg if (REAL_EXP (&r) > 0)
1685 1.1 mrg {
1686 1.1 mrg m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1;
1687 1.1 mrg do
1688 1.1 mrg {
1689 1.1 mrg const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1690 1.1 mrg if (do_compare (&u, ptentwo, 0) >= 0)
1691 1.1 mrg {
1692 1.1 mrg do_divide (&u, &u, ptentwo);
1693 1.1 mrg do_multiply (&pten, &pten, ptentwo);
1694 1.1 mrg dec_exp += 1 << m;
1695 1.1 mrg }
1696 1.1 mrg }
1697 1.1 mrg while (--m >= 0);
1698 1.1 mrg }
1699 1.1 mrg else
1700 1.1 mrg /* We managed to divide off enough tens in the above reduction
1701 1.1 mrg loop that we've now got a negative exponent. Fall into the
1702 1.1 mrg less-than-one code to compute the proper value for PTEN. */
1703 1.1 mrg cmp_one = -1;
1704 1.1 mrg }
1705 1.1 mrg if (cmp_one < 0)
1706 1.1 mrg {
1707 1.1 mrg int m;
1708 1.1 mrg
1709 1.1 mrg /* Number is less than one. Pad significand with leading
1710 1.1 mrg decimal zeros. */
1711 1.1 mrg
1712 1.1 mrg v = r;
1713 1.1 mrg while (1)
1714 1.1 mrg {
1715 1.1 mrg /* Stop if we'd shift bits off the bottom. */
1716 1.1 mrg if (v.sig[0] & 7)
1717 1.1 mrg break;
1718 1.1 mrg
1719 1.1 mrg do_multiply (&u, &v, ten);
1720 1.1 mrg
1721 1.1 mrg /* Stop if we're now >= 1 or zero. */
1722 1.1 mrg if (REAL_EXP (&u) > 0 || u.cl == rvc_zero)
1723 1.1 mrg break;
1724 1.1 mrg
1725 1.1 mrg v = u;
1726 1.1 mrg dec_exp -= 1;
1727 1.1 mrg }
1728 1.1 mrg r = v;
1729 1.1 mrg
1730 1.1 mrg /* Find power of 10. Do this by multiplying in P=10**2**M when
1731 1.1 mrg the current remainder is smaller than 1/P. Fill PTEN with the
1732 1.1 mrg power of 10 that we compute. */
1733 1.1 mrg m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1;
1734 1.1 mrg do
1735 1.1 mrg {
1736 1.1 mrg const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1737 1.1 mrg const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
1738 1.1 mrg
1739 1.1 mrg if (do_compare (&v, ptenmtwo, 0) <= 0)
1740 1.1 mrg {
1741 1.1 mrg do_multiply (&v, &v, ptentwo);
1742 1.1 mrg do_multiply (&pten, &pten, ptentwo);
1743 1.1 mrg dec_exp -= 1 << m;
1744 1.1 mrg }
1745 1.1 mrg }
1746 1.1 mrg while (--m >= 0);
1747 1.1 mrg
1748 1.1 mrg /* Invert the positive power of 10 that we've collected so far. */
1749 1.1 mrg do_divide (&pten, one, &pten);
1750 1.1 mrg }
1751 1.1 mrg
1752 1.1 mrg p = str;
1753 1.1 mrg if (sign)
1754 1.1 mrg *p++ = '-';
1755 1.1 mrg first = p++;
1756 1.1 mrg
1757 1.1 mrg /* At this point, PTEN should contain the nearest power of 10 smaller
1758 1.1 mrg than R, such that this division produces the first digit.
1759 1.1 mrg
1760 1.1 mrg Using a divide-step primitive that returns the complete integral
1761 1.1 mrg remainder avoids the rounding error that would be produced if
1762 1.1 mrg we were to use do_divide here and then simply multiply by 10 for
1763 1.1 mrg each subsequent digit. */
1764 1.1 mrg
1765 1.1 mrg digit = rtd_divmod (&r, &pten);
1766 1.1 mrg
1767 1.1 mrg /* Be prepared for error in that division via underflow ... */
1768 1.1 mrg if (digit == 0 && cmp_significand_0 (&r))
1769 1.1 mrg {
1770 1.1 mrg /* Multiply by 10 and try again. */
1771 1.1 mrg do_multiply (&r, &r, ten);
1772 1.1 mrg digit = rtd_divmod (&r, &pten);
1773 1.1 mrg dec_exp -= 1;
1774 1.1 mrg gcc_assert (digit != 0);
1775 1.1 mrg }
1776 1.1 mrg
1777 1.1 mrg /* ... or overflow. */
1778 1.1 mrg if (digit == 10)
1779 1.1 mrg {
1780 1.1 mrg *p++ = '1';
1781 1.1 mrg if (--digits > 0)
1782 1.1 mrg *p++ = '0';
1783 1.1 mrg dec_exp += 1;
1784 1.1 mrg }
1785 1.1 mrg else
1786 1.1 mrg {
1787 1.1 mrg gcc_assert (digit <= 10);
1788 1.1 mrg *p++ = digit + '0';
1789 1.1 mrg }
1790 1.1 mrg
1791 1.1 mrg /* Generate subsequent digits. */
1792 1.1 mrg while (--digits > 0)
1793 1.1 mrg {
1794 1.1 mrg do_multiply (&r, &r, ten);
1795 1.1 mrg digit = rtd_divmod (&r, &pten);
1796 1.1 mrg *p++ = digit + '0';
1797 1.1 mrg }
1798 1.1 mrg last = p;
1799 1.1 mrg
1800 1.1 mrg /* Generate one more digit with which to do rounding. */
1801 1.1 mrg do_multiply (&r, &r, ten);
1802 1.1 mrg digit = rtd_divmod (&r, &pten);
1803 1.1 mrg
1804 1.1 mrg /* Round the result. */
1805 1.1 mrg if (fmt && fmt->round_towards_zero)
1806 1.1 mrg {
1807 1.1 mrg /* If the format uses round towards zero when parsing the string
1808 1.1 mrg back in, we need to always round away from zero here. */
1809 1.1 mrg if (cmp_significand_0 (&r))
1810 1.1 mrg digit++;
1811 1.1 mrg round_up = digit > 0;
1812 1.1 mrg }
1813 1.1 mrg else
1814 1.1 mrg {
1815 1.1 mrg if (digit == 5)
1816 1.1 mrg {
1817 1.1 mrg /* Round to nearest. If R is nonzero there are additional
1818 1.1 mrg nonzero digits to be extracted. */
1819 1.1 mrg if (cmp_significand_0 (&r))
1820 1.1 mrg digit++;
1821 1.1 mrg /* Round to even. */
1822 1.1 mrg else if ((p[-1] - '0') & 1)
1823 1.1 mrg digit++;
1824 1.1 mrg }
1825 1.1 mrg
1826 1.1 mrg round_up = digit > 5;
1827 1.1 mrg }
1828 1.1 mrg
1829 1.1 mrg if (round_up)
1830 1.1 mrg {
1831 1.1 mrg while (p > first)
1832 1.1 mrg {
1833 1.1 mrg digit = *--p;
1834 1.1 mrg if (digit == '9')
1835 1.1 mrg *p = '0';
1836 1.1 mrg else
1837 1.1 mrg {
1838 1.1 mrg *p = digit + 1;
1839 1.1 mrg break;
1840 1.1 mrg }
1841 1.1 mrg }
1842 1.1 mrg
1843 1.1 mrg /* Carry out of the first digit. This means we had all 9's and
1844 1.1 mrg now have all 0's. "Prepend" a 1 by overwriting the first 0. */
1845 1.1 mrg if (p == first)
1846 1.1 mrg {
1847 1.1 mrg first[1] = '1';
1848 1.1 mrg dec_exp++;
1849 1.1 mrg }
1850 1.1 mrg }
1851 1.1 mrg
1852 1.1 mrg /* Insert the decimal point. */
1853 1.1 mrg first[0] = first[1];
1854 1.1 mrg first[1] = '.';
1855 1.1 mrg
1856 1.1 mrg /* If requested, drop trailing zeros. Never crop past "1.0". */
1857 1.1 mrg if (crop_trailing_zeros)
1858 1.1 mrg while (last > first + 3 && last[-1] == '0')
1859 1.1 mrg last--;
1860 1.1 mrg
1861 1.1 mrg /* Append the exponent. */
1862 1.1 mrg sprintf (last, "e%+d", dec_exp);
1863 1.1 mrg
1864 1.1 mrg /* Verify that we can read the original value back in. */
1865 1.1 mrg if (flag_checking && mode != VOIDmode)
1866 1.1 mrg {
1867 1.1 mrg real_from_string (&r, str);
1868 1.1 mrg real_convert (&r, mode, &r);
1869 1.1 mrg gcc_assert (real_identical (&r, r_orig));
1870 1.1 mrg }
1871 1.1 mrg }
1872 1.1 mrg
1873 1.1 mrg /* Likewise, except always uses round-to-nearest. */
1874 1.1 mrg
1875 1.1 mrg void
1876 1.1 mrg real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
1877 1.1 mrg size_t digits, int crop_trailing_zeros)
1878 1.1 mrg {
1879 1.1 mrg real_to_decimal_for_mode (str, r_orig, buf_size,
1880 1.1 mrg digits, crop_trailing_zeros, VOIDmode);
1881 1.1 mrg }
1882 1.1 mrg
1883 1.1 mrg /* Render R as a hexadecimal floating point constant. Emit DIGITS
1884 1.1 mrg significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0,
1885 1.1 mrg choose the maximum for the representation. If CROP_TRAILING_ZEROS,
1886 1.1 mrg strip trailing zeros. */
1887 1.1 mrg
1888 1.1 mrg void
1889 1.1 mrg real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
1890 1.1 mrg size_t digits, int crop_trailing_zeros)
1891 1.1 mrg {
1892 1.1 mrg int i, j, exp = REAL_EXP (r);
1893 1.1 mrg char *p, *first;
1894 1.1 mrg char exp_buf[16];
1895 1.1 mrg size_t max_digits;
1896 1.1 mrg
1897 1.1 mrg switch (r->cl)
1898 1.1 mrg {
1899 1.1 mrg case rvc_zero:
1900 1.1 mrg exp = 0;
1901 1.1 mrg break;
1902 1.1 mrg case rvc_normal:
1903 1.1 mrg break;
1904 1.1 mrg case rvc_inf:
1905 1.1 mrg strcpy (str, (r->sign ? "-Inf" : "+Inf"));
1906 1.1 mrg return;
1907 1.1 mrg case rvc_nan:
1908 1.1 mrg /* ??? Print the significand as well, if not canonical? */
1909 1.1 mrg sprintf (str, "%c%cNaN", (r->sign ? '-' : '+'),
1910 1.1 mrg (r->signalling ? 'S' : 'Q'));
1911 1.1 mrg return;
1912 1.1 mrg default:
1913 1.1 mrg gcc_unreachable ();
1914 1.1 mrg }
1915 1.1 mrg
1916 1.1 mrg if (r->decimal)
1917 1.1 mrg {
1918 1.1 mrg /* Hexadecimal format for decimal floats is not interesting. */
1919 1.1 mrg strcpy (str, "N/A");
1920 1.1 mrg return;
1921 1.1 mrg }
1922 1.1 mrg
1923 1.1 mrg if (digits == 0)
1924 1.1 mrg digits = SIGNIFICAND_BITS / 4;
1925 1.1 mrg
1926 1.1 mrg /* Bound the number of digits printed by the size of the output buffer. */
1927 1.1 mrg
1928 1.1 mrg sprintf (exp_buf, "p%+d", exp);
1929 1.1 mrg max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
1930 1.1 mrg gcc_assert (max_digits <= buf_size);
1931 1.1 mrg if (digits > max_digits)
1932 1.1 mrg digits = max_digits;
1933 1.1 mrg
1934 1.1 mrg p = str;
1935 1.1 mrg if (r->sign)
1936 1.1 mrg *p++ = '-';
1937 1.1 mrg *p++ = '0';
1938 1.1 mrg *p++ = 'x';
1939 1.1 mrg *p++ = '0';
1940 1.1 mrg *p++ = '.';
1941 1.1 mrg first = p;
1942 1.1 mrg
1943 1.1 mrg for (i = SIGSZ - 1; i >= 0; --i)
1944 1.1 mrg for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
1945 1.1 mrg {
1946 1.1 mrg *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
1947 1.1 mrg if (--digits == 0)
1948 1.1 mrg goto out;
1949 1.1 mrg }
1950 1.1 mrg
1951 1.1 mrg out:
1952 1.1 mrg if (crop_trailing_zeros)
1953 1.1 mrg while (p > first + 1 && p[-1] == '0')
1954 1.1 mrg p--;
1955 1.1 mrg
1956 1.1 mrg sprintf (p, "p%+d", exp);
1957 1.1 mrg }
1958 1.1 mrg
1959 1.1 mrg /* Initialize R from a decimal or hexadecimal string. The string is
1960 1.1 mrg assumed to have been syntax checked already. Return -1 if the
1961 1.1 mrg value underflows, +1 if overflows, and 0 otherwise. */
1962 1.1 mrg
1963 1.1 mrg int
1964 1.1 mrg real_from_string (REAL_VALUE_TYPE *r, const char *str)
1965 1.1 mrg {
1966 1.1 mrg int exp = 0;
1967 1.1 mrg bool sign = false;
1968 1.1 mrg
1969 1.1 mrg get_zero (r, 0);
1970 1.1 mrg
1971 1.1 mrg if (*str == '-')
1972 1.1 mrg {
1973 1.1 mrg sign = true;
1974 1.1 mrg str++;
1975 1.1 mrg }
1976 1.1 mrg else if (*str == '+')
1977 1.1 mrg str++;
1978 1.1 mrg
1979 1.1 mrg if (startswith (str, "QNaN"))
1980 1.1 mrg {
1981 1.1 mrg get_canonical_qnan (r, sign);
1982 1.1 mrg return 0;
1983 1.1 mrg }
1984 1.1 mrg else if (startswith (str, "SNaN"))
1985 1.1 mrg {
1986 1.1 mrg get_canonical_snan (r, sign);
1987 1.1 mrg return 0;
1988 1.1 mrg }
1989 1.1 mrg else if (startswith (str, "Inf"))
1990 1.1 mrg {
1991 1.1 mrg get_inf (r, sign);
1992 1.1 mrg return 0;
1993 1.1 mrg }
1994 1.1 mrg
1995 1.1 mrg if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1996 1.1 mrg {
1997 1.1 mrg /* Hexadecimal floating point. */
1998 1.1 mrg int pos = SIGNIFICAND_BITS - 4, d;
1999 1.1 mrg
2000 1.1 mrg str += 2;
2001 1.1 mrg
2002 1.1 mrg while (*str == '0')
2003 1.1 mrg str++;
2004 1.1 mrg while (1)
2005 1.1 mrg {
2006 1.1 mrg d = hex_value (*str);
2007 1.1 mrg if (d == _hex_bad)
2008 1.1 mrg break;
2009 1.1 mrg if (pos >= 0)
2010 1.1 mrg {
2011 1.1 mrg r->sig[pos / HOST_BITS_PER_LONG]
2012 1.1 mrg |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
2013 1.1 mrg pos -= 4;
2014 1.1 mrg }
2015 1.1 mrg else if (d)
2016 1.1 mrg /* Ensure correct rounding by setting last bit if there is
2017 1.1 mrg a subsequent nonzero digit. */
2018 1.1 mrg r->sig[0] |= 1;
2019 1.1 mrg exp += 4;
2020 1.1 mrg str++;
2021 1.1 mrg }
2022 1.1 mrg if (*str == '.')
2023 1.1 mrg {
2024 1.1 mrg str++;
2025 1.1 mrg if (pos == SIGNIFICAND_BITS - 4)
2026 1.1 mrg {
2027 1.1 mrg while (*str == '0')
2028 1.1 mrg str++, exp -= 4;
2029 1.1 mrg }
2030 1.1 mrg while (1)
2031 1.1 mrg {
2032 1.1 mrg d = hex_value (*str);
2033 1.1 mrg if (d == _hex_bad)
2034 1.1 mrg break;
2035 1.1 mrg if (pos >= 0)
2036 1.1 mrg {
2037 1.1 mrg r->sig[pos / HOST_BITS_PER_LONG]
2038 1.1 mrg |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
2039 1.1 mrg pos -= 4;
2040 1.1 mrg }
2041 1.1 mrg else if (d)
2042 1.1 mrg /* Ensure correct rounding by setting last bit if there is
2043 1.1 mrg a subsequent nonzero digit. */
2044 1.1 mrg r->sig[0] |= 1;
2045 1.1 mrg str++;
2046 1.1 mrg }
2047 1.1 mrg }
2048 1.1 mrg
2049 1.1 mrg /* If the mantissa is zero, ignore the exponent. */
2050 1.1 mrg if (!cmp_significand_0 (r))
2051 1.1 mrg goto is_a_zero;
2052 1.1 mrg
2053 1.1 mrg if (*str == 'p' || *str == 'P')
2054 1.1 mrg {
2055 1.1 mrg bool exp_neg = false;
2056 1.1 mrg
2057 1.1 mrg str++;
2058 1.1 mrg if (*str == '-')
2059 1.1 mrg {
2060 1.1 mrg exp_neg = true;
2061 1.1 mrg str++;
2062 1.1 mrg }
2063 1.1 mrg else if (*str == '+')
2064 1.1 mrg str++;
2065 1.1 mrg
2066 1.1 mrg d = 0;
2067 1.1 mrg while (ISDIGIT (*str))
2068 1.1 mrg {
2069 1.1 mrg d *= 10;
2070 1.1 mrg d += *str - '0';
2071 1.1 mrg if (d > MAX_EXP)
2072 1.1 mrg {
2073 1.1 mrg /* Overflowed the exponent. */
2074 1.1 mrg if (exp_neg)
2075 1.1 mrg goto underflow;
2076 1.1 mrg else
2077 1.1 mrg goto overflow;
2078 1.1 mrg }
2079 1.1 mrg str++;
2080 1.1 mrg }
2081 1.1 mrg if (exp_neg)
2082 1.1 mrg d = -d;
2083 1.1 mrg
2084 1.1 mrg exp += d;
2085 1.1 mrg }
2086 1.1 mrg
2087 1.1 mrg r->cl = rvc_normal;
2088 1.1 mrg SET_REAL_EXP (r, exp);
2089 1.1 mrg
2090 1.1 mrg normalize (r);
2091 1.1 mrg }
2092 1.1 mrg else
2093 1.1 mrg {
2094 1.1 mrg /* Decimal floating point. */
2095 1.1 mrg const char *cstr = str;
2096 1.1 mrg mpfr_t m;
2097 1.1 mrg bool inexact;
2098 1.1 mrg
2099 1.1 mrg while (*cstr == '0')
2100 1.1 mrg cstr++;
2101 1.1 mrg if (*cstr == '.')
2102 1.1 mrg {
2103 1.1 mrg cstr++;
2104 1.1 mrg while (*cstr == '0')
2105 1.1 mrg cstr++;
2106 1.1 mrg }
2107 1.1 mrg
2108 1.1 mrg /* If the mantissa is zero, ignore the exponent. */
2109 1.1 mrg if (!ISDIGIT (*cstr))
2110 1.1 mrg goto is_a_zero;
2111 1.1 mrg
2112 1.1 mrg /* Nonzero value, possibly overflowing or underflowing. */
2113 1.1 mrg mpfr_init2 (m, SIGNIFICAND_BITS);
2114 1.1 mrg inexact = mpfr_strtofr (m, str, NULL, 10, MPFR_RNDZ);
2115 1.1 mrg /* The result should never be a NaN, and because the rounding is
2116 1.1 mrg toward zero should never be an infinity. */
2117 1.1 mrg gcc_assert (!mpfr_nan_p (m) && !mpfr_inf_p (m));
2118 1.1 mrg if (mpfr_zero_p (m) || mpfr_get_exp (m) < -MAX_EXP + 4)
2119 1.1 mrg {
2120 1.1 mrg mpfr_clear (m);
2121 1.1 mrg goto underflow;
2122 1.1 mrg }
2123 1.1 mrg else if (mpfr_get_exp (m) > MAX_EXP - 4)
2124 1.1 mrg {
2125 1.1 mrg mpfr_clear (m);
2126 1.1 mrg goto overflow;
2127 1.1 mrg }
2128 1.1 mrg else
2129 1.1 mrg {
2130 1.1 mrg real_from_mpfr (r, m, NULL_TREE, MPFR_RNDZ);
2131 1.1 mrg /* 1 to 3 bits may have been shifted off (with a sticky bit)
2132 1.1 mrg because the hex digits used in real_from_mpfr did not
2133 1.1 mrg start with a digit 8 to f, but the exponent bounds above
2134 1.1 mrg should have avoided underflow or overflow. */
2135 1.1 mrg gcc_assert (r->cl == rvc_normal);
2136 1.1 mrg /* Set a sticky bit if mpfr_strtofr was inexact. */
2137 1.1 mrg r->sig[0] |= inexact;
2138 1.1 mrg mpfr_clear (m);
2139 1.1 mrg }
2140 1.1 mrg }
2141 1.1 mrg
2142 1.1 mrg r->sign = sign;
2143 1.1 mrg return 0;
2144 1.1 mrg
2145 1.1 mrg is_a_zero:
2146 1.1 mrg get_zero (r, sign);
2147 1.1 mrg return 0;
2148 1.1 mrg
2149 1.1 mrg underflow:
2150 1.1 mrg get_zero (r, sign);
2151 1.1 mrg return -1;
2152 1.1 mrg
2153 1.1 mrg overflow:
2154 1.1 mrg get_inf (r, sign);
2155 1.1 mrg return 1;
2156 1.1 mrg }
2157 1.1 mrg
2158 1.1 mrg /* Legacy. Similar, but return the result directly. */
2159 1.1 mrg
2160 1.1 mrg REAL_VALUE_TYPE
2161 1.1 mrg real_from_string2 (const char *s, format_helper fmt)
2162 1.1 mrg {
2163 1.1 mrg REAL_VALUE_TYPE r;
2164 1.1 mrg
2165 1.1 mrg real_from_string (&r, s);
2166 1.1 mrg if (fmt)
2167 1.1 mrg real_convert (&r, fmt, &r);
2168 1.1 mrg
2169 1.1 mrg return r;
2170 1.1 mrg }
2171 1.1 mrg
2172 1.1 mrg /* Initialize R from string S and desired format FMT. */
2173 1.1 mrg
2174 1.1 mrg void
2175 1.1 mrg real_from_string3 (REAL_VALUE_TYPE *r, const char *s, format_helper fmt)
2176 1.1 mrg {
2177 1.1 mrg if (fmt.decimal_p ())
2178 1.1 mrg decimal_real_from_string (r, s);
2179 1.1 mrg else
2180 1.1 mrg real_from_string (r, s);
2181 1.1 mrg
2182 1.1 mrg if (fmt)
2183 1.1 mrg real_convert (r, fmt, r);
2184 1.1 mrg }
2185 1.1 mrg
2186 1.1 mrg /* Initialize R from the wide_int VAL_IN. Round it to format FMT if
2187 1.1 mrg FMT is nonnull. */
2188 1.1 mrg
2189 1.1 mrg void
2190 1.1 mrg real_from_integer (REAL_VALUE_TYPE *r, format_helper fmt,
2191 1.1 mrg const wide_int_ref &val_in, signop sgn)
2192 1.1 mrg {
2193 1.1 mrg if (val_in == 0)
2194 1.1 mrg get_zero (r, 0);
2195 1.1 mrg else
2196 1.1 mrg {
2197 1.1 mrg unsigned int len = val_in.get_precision ();
2198 1.1 mrg int i, j, e = 0;
2199 1.1 mrg int maxbitlen = MAX_BITSIZE_MODE_ANY_INT + HOST_BITS_PER_WIDE_INT;
2200 1.1 mrg const unsigned int realmax = (SIGNIFICAND_BITS / HOST_BITS_PER_WIDE_INT
2201 1.1 mrg * HOST_BITS_PER_WIDE_INT);
2202 1.1 mrg
2203 1.1 mrg memset (r, 0, sizeof (*r));
2204 1.1 mrg r->cl = rvc_normal;
2205 1.1 mrg r->sign = wi::neg_p (val_in, sgn);
2206 1.1 mrg
2207 1.1 mrg /* We have to ensure we can negate the largest negative number. */
2208 1.1 mrg wide_int val = wide_int::from (val_in, maxbitlen, sgn);
2209 1.1 mrg
2210 1.1 mrg if (r->sign)
2211 1.1 mrg val = -val;
2212 1.1 mrg
2213 1.1 mrg /* Ensure a multiple of HOST_BITS_PER_WIDE_INT, ceiling, as elt
2214 1.1 mrg won't work with precisions that are not a multiple of
2215 1.1 mrg HOST_BITS_PER_WIDE_INT. */
2216 1.1 mrg len += HOST_BITS_PER_WIDE_INT - 1;
2217 1.1 mrg
2218 1.1 mrg /* Ensure we can represent the largest negative number. */
2219 1.1 mrg len += 1;
2220 1.1 mrg
2221 1.1 mrg len = len/HOST_BITS_PER_WIDE_INT * HOST_BITS_PER_WIDE_INT;
2222 1.1 mrg
2223 1.1 mrg /* Cap the size to the size allowed by real.h. */
2224 1.1 mrg if (len > realmax)
2225 1.1 mrg {
2226 1.1 mrg HOST_WIDE_INT cnt_l_z;
2227 1.1 mrg cnt_l_z = wi::clz (val);
2228 1.1 mrg
2229 1.1 mrg if (maxbitlen - cnt_l_z > realmax)
2230 1.1 mrg {
2231 1.1 mrg e = maxbitlen - cnt_l_z - realmax;
2232 1.1 mrg
2233 1.1 mrg /* This value is too large, we must shift it right to
2234 1.1 mrg preserve all the bits we can, and then bump the
2235 1.1 mrg exponent up by that amount. */
2236 1.1 mrg val = wi::lrshift (val, e);
2237 1.1 mrg }
2238 1.1 mrg len = realmax;
2239 1.1 mrg }
2240 1.1 mrg
2241 1.1 mrg /* Clear out top bits so elt will work with precisions that aren't
2242 1.1 mrg a multiple of HOST_BITS_PER_WIDE_INT. */
2243 1.1 mrg val = wide_int::from (val, len, sgn);
2244 1.1 mrg len = len / HOST_BITS_PER_WIDE_INT;
2245 1.1 mrg
2246 1.1 mrg SET_REAL_EXP (r, len * HOST_BITS_PER_WIDE_INT + e);
2247 1.1 mrg
2248 1.1 mrg j = SIGSZ - 1;
2249 1.1 mrg if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
2250 1.1 mrg for (i = len - 1; i >= 0; i--)
2251 1.1 mrg {
2252 1.1 mrg r->sig[j--] = val.elt (i);
2253 1.1 mrg if (j < 0)
2254 1.1 mrg break;
2255 1.1 mrg }
2256 1.1 mrg else
2257 1.1 mrg {
2258 1.1 mrg gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
2259 1.1 mrg for (i = len - 1; i >= 0; i--)
2260 1.1 mrg {
2261 1.1 mrg HOST_WIDE_INT e = val.elt (i);
2262 1.1 mrg r->sig[j--] = e >> (HOST_BITS_PER_LONG - 1) >> 1;
2263 1.1 mrg if (j < 0)
2264 1.1 mrg break;
2265 1.1 mrg r->sig[j--] = e;
2266 1.1 mrg if (j < 0)
2267 1.1 mrg break;
2268 1.1 mrg }
2269 1.1 mrg }
2270 1.1 mrg
2271 1.1 mrg normalize (r);
2272 1.1 mrg }
2273 1.1 mrg
2274 1.1 mrg if (fmt.decimal_p ())
2275 1.1 mrg decimal_from_integer (r);
2276 1.1 mrg if (fmt)
2277 1.1 mrg real_convert (r, fmt, r);
2278 1.1 mrg }
2279 1.1 mrg
2280 1.1 mrg /* Render R, an integral value, as a floating point constant with no
2281 1.1 mrg specified exponent. */
2282 1.1 mrg
2283 1.1 mrg static void
2284 1.1 mrg decimal_integer_string (char *str, const REAL_VALUE_TYPE *r_orig,
2285 1.1 mrg size_t buf_size)
2286 1.1 mrg {
2287 1.1 mrg int dec_exp, digit, digits;
2288 1.1 mrg REAL_VALUE_TYPE r, pten;
2289 1.1 mrg char *p;
2290 1.1 mrg bool sign;
2291 1.1 mrg
2292 1.1 mrg r = *r_orig;
2293 1.1 mrg
2294 1.1 mrg if (r.cl == rvc_zero)
2295 1.1 mrg {
2296 1.1 mrg strcpy (str, "0.");
2297 1.1 mrg return;
2298 1.1 mrg }
2299 1.1 mrg
2300 1.1 mrg sign = r.sign;
2301 1.1 mrg r.sign = 0;
2302 1.1 mrg
2303 1.1 mrg dec_exp = REAL_EXP (&r) * M_LOG10_2;
2304 1.1 mrg digits = dec_exp + 1;
2305 1.1 mrg gcc_assert ((digits + 2) < (int)buf_size);
2306 1.1 mrg
2307 1.1 mrg pten = *real_digit (1);
2308 1.1 mrg times_pten (&pten, dec_exp);
2309 1.1 mrg
2310 1.1 mrg p = str;
2311 1.1 mrg if (sign)
2312 1.1 mrg *p++ = '-';
2313 1.1 mrg
2314 1.1 mrg digit = rtd_divmod (&r, &pten);
2315 1.1 mrg gcc_assert (digit >= 0 && digit <= 9);
2316 1.1 mrg *p++ = digit + '0';
2317 1.1 mrg while (--digits > 0)
2318 1.1 mrg {
2319 1.1 mrg times_pten (&r, 1);
2320 1.1 mrg digit = rtd_divmod (&r, &pten);
2321 1.1 mrg *p++ = digit + '0';
2322 1.1 mrg }
2323 1.1 mrg *p++ = '.';
2324 1.1 mrg *p++ = '\0';
2325 1.1 mrg }
2326 1.1 mrg
2327 1.1 mrg /* Convert a real with an integral value to decimal float. */
2328 1.1 mrg
2329 1.1 mrg static void
2330 1.1 mrg decimal_from_integer (REAL_VALUE_TYPE *r)
2331 1.1 mrg {
2332 1.1 mrg char str[256];
2333 1.1 mrg
2334 1.1 mrg decimal_integer_string (str, r, sizeof (str) - 1);
2335 1.1 mrg decimal_real_from_string (r, str);
2336 1.1 mrg }
2337 1.1 mrg
2338 1.1 mrg /* Returns 10**2**N. */
2339 1.1 mrg
2340 1.1 mrg static const REAL_VALUE_TYPE *
2341 1.1 mrg ten_to_ptwo (int n)
2342 1.1 mrg {
2343 1.1 mrg static REAL_VALUE_TYPE tens[EXP_BITS];
2344 1.1 mrg
2345 1.1 mrg gcc_assert (n >= 0);
2346 1.1 mrg gcc_assert (n < EXP_BITS);
2347 1.1 mrg
2348 1.1 mrg if (tens[n].cl == rvc_zero)
2349 1.1 mrg {
2350 1.1 mrg if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2351 1.1 mrg {
2352 1.1 mrg HOST_WIDE_INT t = 10;
2353 1.1 mrg int i;
2354 1.1 mrg
2355 1.1 mrg for (i = 0; i < n; ++i)
2356 1.1 mrg t *= t;
2357 1.1 mrg
2358 1.1 mrg real_from_integer (&tens[n], VOIDmode, t, UNSIGNED);
2359 1.1 mrg }
2360 1.1 mrg else
2361 1.1 mrg {
2362 1.1 mrg const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2363 1.1 mrg do_multiply (&tens[n], t, t);
2364 1.1 mrg }
2365 1.1 mrg }
2366 1.1 mrg
2367 1.1 mrg return &tens[n];
2368 1.1 mrg }
2369 1.1 mrg
2370 1.1 mrg /* Returns 10**(-2**N). */
2371 1.1 mrg
2372 1.1 mrg static const REAL_VALUE_TYPE *
2373 1.1 mrg ten_to_mptwo (int n)
2374 1.1 mrg {
2375 1.1 mrg static REAL_VALUE_TYPE tens[EXP_BITS];
2376 1.1 mrg
2377 1.1 mrg gcc_assert (n >= 0);
2378 1.1 mrg gcc_assert (n < EXP_BITS);
2379 1.1 mrg
2380 1.1 mrg if (tens[n].cl == rvc_zero)
2381 1.1 mrg do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2382 1.1 mrg
2383 1.1 mrg return &tens[n];
2384 1.1 mrg }
2385 1.1 mrg
2386 1.1 mrg /* Returns N. */
2387 1.1 mrg
2388 1.1 mrg static const REAL_VALUE_TYPE *
2389 1.1 mrg real_digit (int n)
2390 1.1 mrg {
2391 1.1 mrg static REAL_VALUE_TYPE num[10];
2392 1.1 mrg
2393 1.1 mrg gcc_assert (n >= 0);
2394 1.1 mrg gcc_assert (n <= 9);
2395 1.1 mrg
2396 1.1 mrg if (n > 0 && num[n].cl == rvc_zero)
2397 1.1 mrg real_from_integer (&num[n], VOIDmode, n, UNSIGNED);
2398 1.1 mrg
2399 1.1 mrg return &num[n];
2400 1.1 mrg }
2401 1.1 mrg
2402 1.1 mrg /* Multiply R by 10**EXP. */
2403 1.1 mrg
2404 1.1 mrg static void
2405 1.1 mrg times_pten (REAL_VALUE_TYPE *r, int exp)
2406 1.1 mrg {
2407 1.1 mrg REAL_VALUE_TYPE pten, *rr;
2408 1.1 mrg bool negative = (exp < 0);
2409 1.1 mrg int i;
2410 1.1 mrg
2411 1.1 mrg if (negative)
2412 1.1 mrg {
2413 1.1 mrg exp = -exp;
2414 1.1 mrg pten = *real_digit (1);
2415 1.1 mrg rr = &pten;
2416 1.1 mrg }
2417 1.1 mrg else
2418 1.1 mrg rr = r;
2419 1.1 mrg
2420 1.1 mrg for (i = 0; exp > 0; ++i, exp >>= 1)
2421 1.1 mrg if (exp & 1)
2422 1.1 mrg do_multiply (rr, rr, ten_to_ptwo (i));
2423 1.1 mrg
2424 1.1 mrg if (negative)
2425 1.1 mrg do_divide (r, r, &pten);
2426 1.1 mrg }
2427 1.1 mrg
2428 1.1 mrg /* Returns the special REAL_VALUE_TYPE corresponding to 'e'. */
2429 1.1 mrg
2430 1.1 mrg const REAL_VALUE_TYPE *
2431 1.1 mrg dconst_e_ptr (void)
2432 1.1 mrg {
2433 1.1 mrg static REAL_VALUE_TYPE value;
2434 1.1 mrg
2435 1.1 mrg /* Initialize mathematical constants for constant folding builtins.
2436 1.1 mrg These constants need to be given to at least 160 bits precision. */
2437 1.1 mrg if (value.cl == rvc_zero)
2438 1.1 mrg {
2439 1.1 mrg mpfr_t m;
2440 1.1 mrg mpfr_init2 (m, SIGNIFICAND_BITS);
2441 1.1 mrg mpfr_set_ui (m, 1, MPFR_RNDN);
2442 1.1 mrg mpfr_exp (m, m, MPFR_RNDN);
2443 1.1 mrg real_from_mpfr (&value, m, NULL_TREE, MPFR_RNDN);
2444 1.1 mrg mpfr_clear (m);
2445 1.1 mrg
2446 1.1 mrg }
2447 1.1 mrg return &value;
2448 1.1 mrg }
2449 1.1 mrg
2450 1.1 mrg /* Returns a cached REAL_VALUE_TYPE corresponding to 1/n, for various n. */
2451 1.1 mrg
2452 1.1 mrg #define CACHED_FRACTION(NAME, N) \
2453 1.1 mrg const REAL_VALUE_TYPE * \
2454 1.1 mrg NAME (void) \
2455 1.1 mrg { \
2456 1.1 mrg static REAL_VALUE_TYPE value; \
2457 1.1 mrg \
2458 1.1 mrg /* Initialize mathematical constants for constant folding builtins. \
2459 1.1 mrg These constants need to be given to at least 160 bits \
2460 1.1 mrg precision. */ \
2461 1.1 mrg if (value.cl == rvc_zero) \
2462 1.1 mrg real_arithmetic (&value, RDIV_EXPR, &dconst1, real_digit (N)); \
2463 1.1 mrg return &value; \
2464 1.1 mrg }
2465 1.1 mrg
2466 1.1 mrg CACHED_FRACTION (dconst_third_ptr, 3)
2467 1.1 mrg CACHED_FRACTION (dconst_quarter_ptr, 4)
2468 1.1 mrg CACHED_FRACTION (dconst_sixth_ptr, 6)
2469 1.1 mrg CACHED_FRACTION (dconst_ninth_ptr, 9)
2470 1.1 mrg
2471 1.1 mrg /* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2). */
2472 1.1 mrg
2473 1.1 mrg const REAL_VALUE_TYPE *
2474 1.1 mrg dconst_sqrt2_ptr (void)
2475 1.1 mrg {
2476 1.1 mrg static REAL_VALUE_TYPE value;
2477 1.1 mrg
2478 1.1 mrg /* Initialize mathematical constants for constant folding builtins.
2479 1.1 mrg These constants need to be given to at least 160 bits precision. */
2480 1.1 mrg if (value.cl == rvc_zero)
2481 1.1 mrg {
2482 1.1 mrg mpfr_t m;
2483 1.1 mrg mpfr_init2 (m, SIGNIFICAND_BITS);
2484 1.1 mrg mpfr_sqrt_ui (m, 2, MPFR_RNDN);
2485 1.1 mrg real_from_mpfr (&value, m, NULL_TREE, MPFR_RNDN);
2486 1.1 mrg mpfr_clear (m);
2487 1.1 mrg }
2488 1.1 mrg return &value;
2489 1.1 mrg }
2490 1.1 mrg
2491 1.1 mrg /* Fills R with +Inf. */
2492 1.1 mrg
2493 1.1 mrg void
2494 1.1 mrg real_inf (REAL_VALUE_TYPE *r)
2495 1.1 mrg {
2496 1.1 mrg get_inf (r, 0);
2497 1.1 mrg }
2498 1.1 mrg
2499 1.1 mrg /* Fills R with a NaN whose significand is described by STR. If QUIET,
2500 1.1 mrg we force a QNaN, else we force an SNaN. The string, if not empty,
2501 1.1 mrg is parsed as a number and placed in the significand. Return true
2502 1.1 mrg if the string was successfully parsed. */
2503 1.1 mrg
2504 1.1 mrg bool
2505 1.1 mrg real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2506 1.1 mrg format_helper fmt)
2507 1.1 mrg {
2508 1.1 mrg if (*str == 0)
2509 1.1 mrg {
2510 1.1 mrg if (quiet)
2511 1.1 mrg get_canonical_qnan (r, 0);
2512 1.1 mrg else
2513 1.1 mrg get_canonical_snan (r, 0);
2514 1.1 mrg }
2515 1.1 mrg else
2516 1.1 mrg {
2517 1.1 mrg int base = 10, d;
2518 1.1 mrg
2519 1.1 mrg memset (r, 0, sizeof (*r));
2520 1.1 mrg r->cl = rvc_nan;
2521 1.1 mrg
2522 1.1 mrg /* Parse akin to strtol into the significand of R. */
2523 1.1 mrg
2524 1.1 mrg while (ISSPACE (*str))
2525 1.1 mrg str++;
2526 1.1 mrg if (*str == '-')
2527 1.1 mrg str++;
2528 1.1 mrg else if (*str == '+')
2529 1.1 mrg str++;
2530 1.1 mrg if (*str == '0')
2531 1.1 mrg {
2532 1.1 mrg str++;
2533 1.1 mrg if (*str == 'x' || *str == 'X')
2534 1.1 mrg {
2535 1.1 mrg base = 16;
2536 1.1 mrg str++;
2537 1.1 mrg }
2538 1.1 mrg else
2539 1.1 mrg base = 8;
2540 1.1 mrg }
2541 1.1 mrg
2542 1.1 mrg while ((d = hex_value (*str)) < base)
2543 1.1 mrg {
2544 1.1 mrg REAL_VALUE_TYPE u;
2545 1.1 mrg
2546 1.1 mrg switch (base)
2547 1.1 mrg {
2548 1.1 mrg case 8:
2549 1.1 mrg lshift_significand (r, r, 3);
2550 1.1 mrg break;
2551 1.1 mrg case 16:
2552 1.1 mrg lshift_significand (r, r, 4);
2553 1.1 mrg break;
2554 1.1 mrg case 10:
2555 1.1 mrg lshift_significand_1 (&u, r);
2556 1.1 mrg lshift_significand (r, r, 3);
2557 1.1 mrg add_significands (r, r, &u);
2558 1.1 mrg break;
2559 1.1 mrg default:
2560 1.1 mrg gcc_unreachable ();
2561 1.1 mrg }
2562 1.1 mrg
2563 1.1 mrg get_zero (&u, 0);
2564 1.1 mrg u.sig[0] = d;
2565 1.1 mrg add_significands (r, r, &u);
2566 1.1 mrg
2567 1.1 mrg str++;
2568 1.1 mrg }
2569 1.1 mrg
2570 1.1 mrg /* Must have consumed the entire string for success. */
2571 1.1 mrg if (*str != 0)
2572 1.1 mrg return false;
2573 1.1 mrg
2574 1.1 mrg /* Shift the significand into place such that the bits
2575 1.1 mrg are in the most significant bits for the format. */
2576 1.1 mrg lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
2577 1.1 mrg
2578 1.1 mrg /* Our MSB is always unset for NaNs. */
2579 1.1 mrg r->sig[SIGSZ-1] &= ~SIG_MSB;
2580 1.1 mrg
2581 1.1 mrg /* Force quiet or signaling NaN. */
2582 1.1 mrg r->signalling = !quiet;
2583 1.1 mrg }
2584 1.1 mrg
2585 1.1 mrg return true;
2586 1.1 mrg }
2587 1.1 mrg
2588 1.1 mrg /* Fills R with the largest finite value representable in mode MODE.
2589 1.1 mrg If SIGN is nonzero, R is set to the most negative finite value. */
2590 1.1 mrg
2591 1.1 mrg void
2592 1.1 mrg real_maxval (REAL_VALUE_TYPE *r, int sign, machine_mode mode)
2593 1.1 mrg {
2594 1.1 mrg const struct real_format *fmt;
2595 1.1 mrg int np2;
2596 1.1 mrg
2597 1.1 mrg fmt = REAL_MODE_FORMAT (mode);
2598 1.1 mrg gcc_assert (fmt);
2599 1.1 mrg memset (r, 0, sizeof (*r));
2600 1.1 mrg
2601 1.1 mrg if (fmt->b == 10)
2602 1.1 mrg decimal_real_maxval (r, sign, mode);
2603 1.1 mrg else
2604 1.1 mrg {
2605 1.1 mrg r->cl = rvc_normal;
2606 1.1 mrg r->sign = sign;
2607 1.1 mrg SET_REAL_EXP (r, fmt->emax);
2608 1.1 mrg
2609 1.1 mrg np2 = SIGNIFICAND_BITS - fmt->p;
2610 1.1 mrg memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
2611 1.1 mrg clear_significand_below (r, np2);
2612 1.1 mrg
2613 1.1 mrg if (fmt->pnan < fmt->p)
2614 1.1 mrg /* This is an IBM extended double format made up of two IEEE
2615 1.1 mrg doubles. The value of the long double is the sum of the
2616 1.1 mrg values of the two parts. The most significant part is
2617 1.1 mrg required to be the value of the long double rounded to the
2618 1.1 mrg nearest double. Rounding means we need a slightly smaller
2619 1.1 mrg value for LDBL_MAX. */
2620 1.1 mrg clear_significand_bit (r, SIGNIFICAND_BITS - fmt->pnan - 1);
2621 1.1 mrg }
2622 1.1 mrg }
2623 1.1 mrg
2624 1.1 mrg /* Fills R with 2**N. */
2625 1.1 mrg
2626 1.1 mrg void
2627 1.1 mrg real_2expN (REAL_VALUE_TYPE *r, int n, format_helper fmt)
2628 1.1 mrg {
2629 1.1 mrg memset (r, 0, sizeof (*r));
2630 1.1 mrg
2631 1.1 mrg n++;
2632 1.1 mrg if (n > MAX_EXP)
2633 1.1 mrg r->cl = rvc_inf;
2634 1.1 mrg else if (n < -MAX_EXP)
2635 1.1 mrg ;
2636 1.1 mrg else
2637 1.1 mrg {
2638 1.1 mrg r->cl = rvc_normal;
2639 1.1 mrg SET_REAL_EXP (r, n);
2640 1.1 mrg r->sig[SIGSZ-1] = SIG_MSB;
2641 1.1 mrg }
2642 1.1 mrg if (fmt.decimal_p ())
2643 1.1 mrg decimal_real_convert (r, fmt, r);
2644 1.1 mrg }
2645 1.1 mrg
2646 1.1 mrg
2647 1.1 mrg static void
2649 1.1 mrg round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
2650 1.1 mrg {
2651 1.1 mrg int p2, np2, i, w;
2652 1.1 mrg int emin2m1, emax2;
2653 1.1 mrg bool round_up = false;
2654 1.1 mrg
2655 1.1 mrg if (r->decimal)
2656 1.1 mrg {
2657 1.1 mrg if (fmt->b == 10)
2658 1.1 mrg {
2659 1.1 mrg decimal_round_for_format (fmt, r);
2660 1.1 mrg return;
2661 1.1 mrg }
2662 1.1 mrg /* FIXME. We can come here via fp_easy_constant
2663 1.1 mrg (e.g. -O0 on '_Decimal32 x = 1.0 + 2.0dd'), but have not
2664 1.1 mrg investigated whether this convert needs to be here, or
2665 1.1 mrg something else is missing. */
2666 1.1 mrg decimal_real_convert (r, REAL_MODE_FORMAT (DFmode), r);
2667 1.1 mrg }
2668 1.1 mrg
2669 1.1 mrg p2 = fmt->p;
2670 1.1 mrg emin2m1 = fmt->emin - 1;
2671 1.1 mrg emax2 = fmt->emax;
2672 1.1 mrg
2673 1.1 mrg np2 = SIGNIFICAND_BITS - p2;
2674 1.1 mrg switch (r->cl)
2675 1.1 mrg {
2676 1.1 mrg underflow:
2677 1.1 mrg get_zero (r, r->sign);
2678 1.1 mrg /* FALLTHRU */
2679 1.1 mrg case rvc_zero:
2680 1.1 mrg if (!fmt->has_signed_zero)
2681 1.1 mrg r->sign = 0;
2682 1.1 mrg return;
2683 1.1 mrg
2684 1.1 mrg overflow:
2685 1.1 mrg get_inf (r, r->sign);
2686 1.1 mrg case rvc_inf:
2687 1.1 mrg return;
2688 1.1 mrg
2689 1.1 mrg case rvc_nan:
2690 1.1 mrg clear_significand_below (r, np2);
2691 1.1 mrg return;
2692 1.1 mrg
2693 1.1 mrg case rvc_normal:
2694 1.1 mrg break;
2695 1.1 mrg
2696 1.1 mrg default:
2697 1.1 mrg gcc_unreachable ();
2698 1.1 mrg }
2699 1.1 mrg
2700 1.1 mrg /* Check the range of the exponent. If we're out of range,
2701 1.1 mrg either underflow or overflow. */
2702 1.1 mrg if (REAL_EXP (r) > emax2)
2703 1.1 mrg goto overflow;
2704 1.1 mrg else if (REAL_EXP (r) <= emin2m1)
2705 1.1 mrg {
2706 1.1 mrg int diff;
2707 1.1 mrg
2708 1.1 mrg if (!fmt->has_denorm)
2709 1.1 mrg {
2710 1.1 mrg /* Don't underflow completely until we've had a chance to round. */
2711 1.1 mrg if (REAL_EXP (r) < emin2m1)
2712 1.1 mrg goto underflow;
2713 1.1 mrg }
2714 1.1 mrg else
2715 1.1 mrg {
2716 1.1 mrg diff = emin2m1 - REAL_EXP (r) + 1;
2717 1.1 mrg if (diff > p2)
2718 1.1 mrg goto underflow;
2719 1.1 mrg
2720 1.1 mrg /* De-normalize the significand. */
2721 1.1 mrg r->sig[0] |= sticky_rshift_significand (r, r, diff);
2722 1.1 mrg SET_REAL_EXP (r, REAL_EXP (r) + diff);
2723 1.1 mrg }
2724 1.1 mrg }
2725 1.1 mrg
2726 1.1 mrg if (!fmt->round_towards_zero)
2727 1.1 mrg {
2728 1.1 mrg /* There are P2 true significand bits, followed by one guard bit,
2729 1.1 mrg followed by one sticky bit, followed by stuff. Fold nonzero
2730 1.1 mrg stuff into the sticky bit. */
2731 1.1 mrg unsigned long sticky;
2732 1.1 mrg bool guard, lsb;
2733 1.1 mrg
2734 1.1 mrg sticky = 0;
2735 1.1 mrg for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2736 1.1 mrg sticky |= r->sig[i];
2737 1.1 mrg sticky |= r->sig[w]
2738 1.1 mrg & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2739 1.1 mrg
2740 1.1 mrg guard = test_significand_bit (r, np2 - 1);
2741 1.1 mrg lsb = test_significand_bit (r, np2);
2742 1.1 mrg
2743 1.1 mrg /* Round to even. */
2744 1.1 mrg round_up = guard && (sticky || lsb);
2745 1.1 mrg }
2746 1.1 mrg
2747 1.1 mrg if (round_up)
2748 1.1 mrg {
2749 1.1 mrg REAL_VALUE_TYPE u;
2750 1.1 mrg get_zero (&u, 0);
2751 1.1 mrg set_significand_bit (&u, np2);
2752 1.1 mrg
2753 1.1 mrg if (add_significands (r, r, &u))
2754 1.1 mrg {
2755 1.1 mrg /* Overflow. Means the significand had been all ones, and
2756 1.1 mrg is now all zeros. Need to increase the exponent, and
2757 1.1 mrg possibly re-normalize it. */
2758 1.1 mrg SET_REAL_EXP (r, REAL_EXP (r) + 1);
2759 1.1 mrg if (REAL_EXP (r) > emax2)
2760 1.1 mrg goto overflow;
2761 1.1 mrg r->sig[SIGSZ-1] = SIG_MSB;
2762 1.1 mrg }
2763 1.1 mrg }
2764 1.1 mrg
2765 1.1 mrg /* Catch underflow that we deferred until after rounding. */
2766 1.1 mrg if (REAL_EXP (r) <= emin2m1)
2767 1.1 mrg goto underflow;
2768 1.1 mrg
2769 1.1 mrg /* Clear out trailing garbage. */
2770 1.1 mrg clear_significand_below (r, np2);
2771 1.1 mrg }
2772 1.1 mrg
2773 1.1 mrg /* Extend or truncate to a new format. */
2774 1.1 mrg
2775 1.1 mrg void
2776 1.1 mrg real_convert (REAL_VALUE_TYPE *r, format_helper fmt,
2777 1.1 mrg const REAL_VALUE_TYPE *a)
2778 1.1 mrg {
2779 1.1 mrg *r = *a;
2780 1.1 mrg
2781 1.1 mrg if (a->decimal || fmt->b == 10)
2782 1.1 mrg decimal_real_convert (r, fmt, a);
2783 1.1 mrg
2784 1.1 mrg round_for_format (fmt, r);
2785 1.1 mrg
2786 1.1 mrg /* Make resulting NaN value to be qNaN. The caller has the
2787 1.1 mrg responsibility to avoid the operation if flag_signaling_nans
2788 1.1 mrg is on. */
2789 1.1 mrg if (r->cl == rvc_nan)
2790 1.1 mrg r->signalling = 0;
2791 1.1 mrg
2792 1.1 mrg /* round_for_format de-normalizes denormals. Undo just that part. */
2793 1.1 mrg if (r->cl == rvc_normal)
2794 1.1 mrg normalize (r);
2795 1.1 mrg }
2796 1.1 mrg
2797 1.1 mrg /* Legacy. Likewise, except return the struct directly. */
2798 1.1 mrg
2799 1.1 mrg REAL_VALUE_TYPE
2800 1.1 mrg real_value_truncate (format_helper fmt, REAL_VALUE_TYPE a)
2801 1.1 mrg {
2802 1.1 mrg REAL_VALUE_TYPE r;
2803 1.1 mrg real_convert (&r, fmt, &a);
2804 1.1 mrg return r;
2805 1.1 mrg }
2806 1.1 mrg
2807 1.1 mrg /* Return true if truncating to FMT is exact. */
2808 1.1 mrg
2809 1.1 mrg bool
2810 1.1 mrg exact_real_truncate (format_helper fmt, const REAL_VALUE_TYPE *a)
2811 1.1 mrg {
2812 1.1 mrg REAL_VALUE_TYPE t;
2813 1.1 mrg int emin2m1;
2814 1.1 mrg
2815 1.1 mrg /* Don't allow conversion to denormals. */
2816 1.1 mrg emin2m1 = fmt->emin - 1;
2817 1.1 mrg if (REAL_EXP (a) <= emin2m1)
2818 1.1 mrg return false;
2819 1.1 mrg
2820 1.1 mrg /* After conversion to the new format, the value must be identical. */
2821 1.1 mrg real_convert (&t, fmt, a);
2822 1.1 mrg return real_identical (&t, a);
2823 1.1 mrg }
2824 1.1 mrg
2825 1.1 mrg /* Write R to the given target format. Place the words of the result
2826 1.1 mrg in target word order in BUF. There are always 32 bits in each
2827 1.1 mrg long, no matter the size of the host long.
2828 1.1 mrg
2829 1.1 mrg Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2830 1.1 mrg
2831 1.1 mrg long
2832 1.1 mrg real_to_target (long *buf, const REAL_VALUE_TYPE *r_orig,
2833 1.1 mrg format_helper fmt)
2834 1.1 mrg {
2835 1.1 mrg REAL_VALUE_TYPE r;
2836 1.1 mrg long buf1;
2837 1.1 mrg
2838 1.1 mrg r = *r_orig;
2839 1.1 mrg round_for_format (fmt, &r);
2840 1.1 mrg
2841 1.1 mrg if (!buf)
2842 1.1 mrg buf = &buf1;
2843 1.1 mrg (*fmt->encode) (fmt, buf, &r);
2844 1.1 mrg
2845 1.1 mrg return *buf;
2846 1.1 mrg }
2847 1.1 mrg
2848 1.1 mrg /* Read R from the given target format. Read the words of the result
2849 1.1 mrg in target word order in BUF. There are always 32 bits in each
2850 1.1 mrg long, no matter the size of the host long. */
2851 1.1 mrg
2852 1.1 mrg void
2853 1.1 mrg real_from_target (REAL_VALUE_TYPE *r, const long *buf, format_helper fmt)
2854 1.1 mrg {
2855 1.1 mrg (*fmt->decode) (fmt, r, buf);
2856 1.1 mrg }
2857 1.1 mrg
2858 1.1 mrg /* Return the number of bits of the largest binary value that the
2859 1.1 mrg significand of FMT will hold. */
2860 1.1 mrg /* ??? Legacy. Should get access to real_format directly. */
2861 1.1 mrg
2862 1.1 mrg int
2863 1.1 mrg significand_size (format_helper fmt)
2864 1.1 mrg {
2865 1.1 mrg if (fmt == NULL)
2866 1.1 mrg return 0;
2867 1.1 mrg
2868 1.1 mrg if (fmt->b == 10)
2869 1.1 mrg {
2870 1.1 mrg /* Return the size in bits of the largest binary value that can be
2871 1.1 mrg held by the decimal coefficient for this format. This is one more
2872 1.1 mrg than the number of bits required to hold the largest coefficient
2873 1.1 mrg of this format. */
2874 1.1 mrg double log2_10 = 3.3219281;
2875 1.1 mrg return fmt->p * log2_10;
2876 1.1 mrg }
2877 1.1 mrg return fmt->p;
2878 1.1 mrg }
2879 1.1 mrg
2880 1.1 mrg /* Return a hash value for the given real value. */
2881 1.1 mrg /* ??? The "unsigned int" return value is intended to be hashval_t,
2882 1.1 mrg but I didn't want to pull hashtab.h into real.h. */
2883 1.1 mrg
2884 1.1 mrg unsigned int
2885 1.1 mrg real_hash (const REAL_VALUE_TYPE *r)
2886 1.1 mrg {
2887 1.1 mrg unsigned int h;
2888 1.1 mrg size_t i;
2889 1.1 mrg
2890 1.1 mrg h = r->cl | (r->sign << 2);
2891 1.1 mrg switch (r->cl)
2892 1.1 mrg {
2893 1.1 mrg case rvc_zero:
2894 1.1 mrg case rvc_inf:
2895 1.1 mrg return h;
2896 1.1 mrg
2897 1.1 mrg case rvc_normal:
2898 1.1 mrg h |= (unsigned int)REAL_EXP (r) << 3;
2899 1.1 mrg break;
2900 1.1 mrg
2901 1.1 mrg case rvc_nan:
2902 1.1 mrg if (r->signalling)
2903 1.1 mrg h ^= (unsigned int)-1;
2904 1.1 mrg if (r->canonical)
2905 1.1 mrg return h;
2906 1.1 mrg break;
2907 1.1 mrg
2908 1.1 mrg default:
2909 1.1 mrg gcc_unreachable ();
2910 1.1 mrg }
2911 1.1 mrg
2912 1.1 mrg if (sizeof (unsigned long) > sizeof (unsigned int))
2913 1.1 mrg for (i = 0; i < SIGSZ; ++i)
2914 1.1 mrg {
2915 1.1 mrg unsigned long s = r->sig[i];
2916 1.1 mrg h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2917 1.1 mrg }
2918 1.1 mrg else
2919 1.1 mrg for (i = 0; i < SIGSZ; ++i)
2920 1.1 mrg h ^= r->sig[i];
2921 1.1 mrg
2922 1.1 mrg return h;
2923 1.1 mrg }
2924 1.1 mrg
2925 1.1 mrg /* IEEE single-precision format. */
2927 1.1 mrg
2928 1.1 mrg static void encode_ieee_single (const struct real_format *fmt,
2929 1.1 mrg long *, const REAL_VALUE_TYPE *);
2930 1.1 mrg static void decode_ieee_single (const struct real_format *,
2931 1.1 mrg REAL_VALUE_TYPE *, const long *);
2932 1.1 mrg
2933 1.1 mrg static void
2934 1.1 mrg encode_ieee_single (const struct real_format *fmt, long *buf,
2935 1.1 mrg const REAL_VALUE_TYPE *r)
2936 1.1 mrg {
2937 1.1 mrg unsigned long image, sig, exp;
2938 1.1 mrg unsigned long sign = r->sign;
2939 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2940 1.1 mrg
2941 1.1 mrg image = sign << 31;
2942 1.1 mrg sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2943 1.1 mrg
2944 1.1 mrg switch (r->cl)
2945 1.1 mrg {
2946 1.1 mrg case rvc_zero:
2947 1.1 mrg break;
2948 1.1 mrg
2949 1.1 mrg case rvc_inf:
2950 1.1 mrg if (fmt->has_inf)
2951 1.1 mrg image |= 255 << 23;
2952 1.1 mrg else
2953 1.1 mrg image |= 0x7fffffff;
2954 1.1 mrg break;
2955 1.1 mrg
2956 1.1 mrg case rvc_nan:
2957 1.1 mrg if (fmt->has_nans)
2958 1.1 mrg {
2959 1.1 mrg if (r->canonical)
2960 1.1 mrg sig = (fmt->canonical_nan_lsbs_set ? (1 << 22) - 1 : 0);
2961 1.1 mrg if (r->signalling == fmt->qnan_msb_set)
2962 1.1 mrg sig &= ~(1 << 22);
2963 1.1 mrg else
2964 1.1 mrg sig |= 1 << 22;
2965 1.1 mrg if (sig == 0)
2966 1.1 mrg sig = 1 << 21;
2967 1.1 mrg
2968 1.1 mrg image |= 255 << 23;
2969 1.1 mrg image |= sig;
2970 1.1 mrg }
2971 1.1 mrg else
2972 1.1 mrg image |= 0x7fffffff;
2973 1.1 mrg break;
2974 1.1 mrg
2975 1.1 mrg case rvc_normal:
2976 1.1 mrg /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2977 1.1 mrg whereas the intermediate representation is 0.F x 2**exp.
2978 1.1 mrg Which means we're off by one. */
2979 1.1 mrg if (denormal)
2980 1.1 mrg exp = 0;
2981 1.1 mrg else
2982 1.1 mrg exp = REAL_EXP (r) + 127 - 1;
2983 1.1 mrg image |= exp << 23;
2984 1.1 mrg image |= sig;
2985 1.1 mrg break;
2986 1.1 mrg
2987 1.1 mrg default:
2988 1.1 mrg gcc_unreachable ();
2989 1.1 mrg }
2990 1.1 mrg
2991 1.1 mrg buf[0] = image;
2992 1.1 mrg }
2993 1.1 mrg
2994 1.1 mrg static void
2995 1.1 mrg decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2996 1.1 mrg const long *buf)
2997 1.1 mrg {
2998 1.1 mrg unsigned long image = buf[0] & 0xffffffff;
2999 1.1 mrg bool sign = (image >> 31) & 1;
3000 1.1 mrg int exp = (image >> 23) & 0xff;
3001 1.1 mrg
3002 1.1 mrg memset (r, 0, sizeof (*r));
3003 1.1 mrg image <<= HOST_BITS_PER_LONG - 24;
3004 1.1 mrg image &= ~SIG_MSB;
3005 1.1 mrg
3006 1.1 mrg if (exp == 0)
3007 1.1 mrg {
3008 1.1 mrg if (image && fmt->has_denorm)
3009 1.1 mrg {
3010 1.1 mrg r->cl = rvc_normal;
3011 1.1 mrg r->sign = sign;
3012 1.1 mrg SET_REAL_EXP (r, -126);
3013 1.1 mrg r->sig[SIGSZ-1] = image << 1;
3014 1.1 mrg normalize (r);
3015 1.1 mrg }
3016 1.1 mrg else if (fmt->has_signed_zero)
3017 1.1 mrg r->sign = sign;
3018 1.1 mrg }
3019 1.1 mrg else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
3020 1.1 mrg {
3021 1.1 mrg if (image)
3022 1.1 mrg {
3023 1.1 mrg r->cl = rvc_nan;
3024 1.1 mrg r->sign = sign;
3025 1.1 mrg r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
3026 1.1 mrg ^ fmt->qnan_msb_set);
3027 1.1 mrg r->sig[SIGSZ-1] = image;
3028 1.1 mrg }
3029 1.1 mrg else
3030 1.1 mrg {
3031 1.1 mrg r->cl = rvc_inf;
3032 1.1 mrg r->sign = sign;
3033 1.1 mrg }
3034 1.1 mrg }
3035 1.1 mrg else
3036 1.1 mrg {
3037 1.1 mrg r->cl = rvc_normal;
3038 1.1 mrg r->sign = sign;
3039 1.1 mrg SET_REAL_EXP (r, exp - 127 + 1);
3040 1.1 mrg r->sig[SIGSZ-1] = image | SIG_MSB;
3041 1.1 mrg }
3042 1.1 mrg }
3043 1.1 mrg
3044 1.1 mrg const struct real_format ieee_single_format =
3045 1.1 mrg {
3046 1.1 mrg encode_ieee_single,
3047 1.1 mrg decode_ieee_single,
3048 1.1 mrg 2,
3049 1.1 mrg 24,
3050 1.1 mrg 24,
3051 1.1 mrg -125,
3052 1.1 mrg 128,
3053 1.1 mrg 31,
3054 1.1 mrg 31,
3055 1.1 mrg 32,
3056 1.1 mrg false,
3057 1.1 mrg true,
3058 1.1 mrg true,
3059 1.1 mrg true,
3060 1.1 mrg true,
3061 1.1 mrg true,
3062 1.1 mrg true,
3063 1.1 mrg false,
3064 1.1 mrg "ieee_single"
3065 1.1 mrg };
3066 1.1 mrg
3067 1.1 mrg const struct real_format mips_single_format =
3068 1.1 mrg {
3069 1.1 mrg encode_ieee_single,
3070 1.1 mrg decode_ieee_single,
3071 1.1 mrg 2,
3072 1.1 mrg 24,
3073 1.1 mrg 24,
3074 1.1 mrg -125,
3075 1.1 mrg 128,
3076 1.1 mrg 31,
3077 1.1 mrg 31,
3078 1.1 mrg 32,
3079 1.1 mrg false,
3080 1.1 mrg true,
3081 1.1 mrg true,
3082 1.1 mrg true,
3083 1.1 mrg true,
3084 1.1 mrg true,
3085 1.1 mrg false,
3086 1.1 mrg true,
3087 1.1 mrg "mips_single"
3088 1.1 mrg };
3089 1.1 mrg
3090 1.1 mrg const struct real_format motorola_single_format =
3091 1.1 mrg {
3092 1.1 mrg encode_ieee_single,
3093 1.1 mrg decode_ieee_single,
3094 1.1 mrg 2,
3095 1.1 mrg 24,
3096 1.1 mrg 24,
3097 1.1 mrg -125,
3098 1.1 mrg 128,
3099 1.1 mrg 31,
3100 1.1 mrg 31,
3101 1.1 mrg 32,
3102 1.1 mrg false,
3103 1.1 mrg true,
3104 1.1 mrg true,
3105 1.1 mrg true,
3106 1.1 mrg true,
3107 1.1 mrg true,
3108 1.1 mrg true,
3109 1.1 mrg true,
3110 1.1 mrg "motorola_single"
3111 1.1 mrg };
3112 1.1 mrg
3113 1.1 mrg /* SPU Single Precision (Extended-Range Mode) format is the same as IEEE
3114 1.1 mrg single precision with the following differences:
3115 1.1 mrg - Infinities are not supported. Instead MAX_FLOAT or MIN_FLOAT
3116 1.1 mrg are generated.
3117 1.1 mrg - NaNs are not supported.
3118 1.1 mrg - The range of non-zero numbers in binary is
3119 1.1 mrg (001)[1.]000...000 to (255)[1.]111...111.
3120 1.1 mrg - Denormals can be represented, but are treated as +0.0 when
3121 1.1 mrg used as an operand and are never generated as a result.
3122 1.1 mrg - -0.0 can be represented, but a zero result is always +0.0.
3123 1.1 mrg - the only supported rounding mode is trunction (towards zero). */
3124 1.1 mrg const struct real_format spu_single_format =
3125 1.1 mrg {
3126 1.1 mrg encode_ieee_single,
3127 1.1 mrg decode_ieee_single,
3128 1.1 mrg 2,
3129 1.1 mrg 24,
3130 1.1 mrg 24,
3131 1.1 mrg -125,
3132 1.1 mrg 129,
3133 1.1 mrg 31,
3134 1.1 mrg 31,
3135 1.1 mrg 0,
3136 1.1 mrg true,
3137 1.1 mrg false,
3138 1.1 mrg false,
3139 1.1 mrg false,
3140 1.1 mrg true,
3141 1.1 mrg true,
3142 1.1 mrg false,
3143 1.1 mrg false,
3144 1.1 mrg "spu_single"
3145 1.1 mrg };
3146 1.1 mrg
3147 1.1 mrg /* IEEE double-precision format. */
3149 1.1 mrg
3150 1.1 mrg static void encode_ieee_double (const struct real_format *fmt,
3151 1.1 mrg long *, const REAL_VALUE_TYPE *);
3152 1.1 mrg static void decode_ieee_double (const struct real_format *,
3153 1.1 mrg REAL_VALUE_TYPE *, const long *);
3154 1.1 mrg
3155 1.1 mrg static void
3156 1.1 mrg encode_ieee_double (const struct real_format *fmt, long *buf,
3157 1.1 mrg const REAL_VALUE_TYPE *r)
3158 1.1 mrg {
3159 1.1 mrg unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
3160 1.1 mrg unsigned long sign = r->sign;
3161 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3162 1.1 mrg
3163 1.1 mrg image_hi = sign << 31;
3164 1.1 mrg image_lo = 0;
3165 1.1 mrg
3166 1.1 mrg if (HOST_BITS_PER_LONG == 64)
3167 1.1 mrg {
3168 1.1 mrg sig_hi = r->sig[SIGSZ-1];
3169 1.1 mrg sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
3170 1.1 mrg sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
3171 1.1 mrg }
3172 1.1 mrg else
3173 1.1 mrg {
3174 1.1 mrg sig_hi = r->sig[SIGSZ-1];
3175 1.1 mrg sig_lo = r->sig[SIGSZ-2];
3176 1.1 mrg sig_lo = (sig_hi << 21) | (sig_lo >> 11);
3177 1.1 mrg sig_hi = (sig_hi >> 11) & 0xfffff;
3178 1.1 mrg }
3179 1.1 mrg
3180 1.1 mrg switch (r->cl)
3181 1.1 mrg {
3182 1.1 mrg case rvc_zero:
3183 1.1 mrg break;
3184 1.1 mrg
3185 1.1 mrg case rvc_inf:
3186 1.1 mrg if (fmt->has_inf)
3187 1.1 mrg image_hi |= 2047 << 20;
3188 1.1 mrg else
3189 1.1 mrg {
3190 1.1 mrg image_hi |= 0x7fffffff;
3191 1.1 mrg image_lo = 0xffffffff;
3192 1.1 mrg }
3193 1.1 mrg break;
3194 1.1 mrg
3195 1.1 mrg case rvc_nan:
3196 1.1 mrg if (fmt->has_nans)
3197 1.1 mrg {
3198 1.1 mrg if (r->canonical)
3199 1.1 mrg {
3200 1.1 mrg if (fmt->canonical_nan_lsbs_set)
3201 1.1 mrg {
3202 1.1 mrg sig_hi = (1 << 19) - 1;
3203 1.1 mrg sig_lo = 0xffffffff;
3204 1.1 mrg }
3205 1.1 mrg else
3206 1.1 mrg {
3207 1.1 mrg sig_hi = 0;
3208 1.1 mrg sig_lo = 0;
3209 1.1 mrg }
3210 1.1 mrg }
3211 1.1 mrg if (r->signalling == fmt->qnan_msb_set)
3212 1.1 mrg sig_hi &= ~(1 << 19);
3213 1.1 mrg else
3214 1.1 mrg sig_hi |= 1 << 19;
3215 1.1 mrg if (sig_hi == 0 && sig_lo == 0)
3216 1.1 mrg sig_hi = 1 << 18;
3217 1.1 mrg
3218 1.1 mrg image_hi |= 2047 << 20;
3219 1.1 mrg image_hi |= sig_hi;
3220 1.1 mrg image_lo = sig_lo;
3221 1.1 mrg }
3222 1.1 mrg else
3223 1.1 mrg {
3224 1.1 mrg image_hi |= 0x7fffffff;
3225 1.1 mrg image_lo = 0xffffffff;
3226 1.1 mrg }
3227 1.1 mrg break;
3228 1.1 mrg
3229 1.1 mrg case rvc_normal:
3230 1.1 mrg /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3231 1.1 mrg whereas the intermediate representation is 0.F x 2**exp.
3232 1.1 mrg Which means we're off by one. */
3233 1.1 mrg if (denormal)
3234 1.1 mrg exp = 0;
3235 1.1 mrg else
3236 1.1 mrg exp = REAL_EXP (r) + 1023 - 1;
3237 1.1 mrg image_hi |= exp << 20;
3238 1.1 mrg image_hi |= sig_hi;
3239 1.1 mrg image_lo = sig_lo;
3240 1.1 mrg break;
3241 1.1 mrg
3242 1.1 mrg default:
3243 1.1 mrg gcc_unreachable ();
3244 1.1 mrg }
3245 1.1 mrg
3246 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN)
3247 1.1 mrg buf[0] = image_hi, buf[1] = image_lo;
3248 1.1 mrg else
3249 1.1 mrg buf[0] = image_lo, buf[1] = image_hi;
3250 1.1 mrg }
3251 1.1 mrg
3252 1.1 mrg static void
3253 1.1 mrg decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3254 1.1 mrg const long *buf)
3255 1.1 mrg {
3256 1.1 mrg unsigned long image_hi, image_lo;
3257 1.1 mrg bool sign;
3258 1.1 mrg int exp;
3259 1.1 mrg
3260 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN)
3261 1.1 mrg image_hi = buf[0], image_lo = buf[1];
3262 1.1 mrg else
3263 1.1 mrg image_lo = buf[0], image_hi = buf[1];
3264 1.1 mrg image_lo &= 0xffffffff;
3265 1.1 mrg image_hi &= 0xffffffff;
3266 1.1 mrg
3267 1.1 mrg sign = (image_hi >> 31) & 1;
3268 1.1 mrg exp = (image_hi >> 20) & 0x7ff;
3269 1.1 mrg
3270 1.1 mrg memset (r, 0, sizeof (*r));
3271 1.1 mrg
3272 1.1 mrg image_hi <<= 32 - 21;
3273 1.1 mrg image_hi |= image_lo >> 21;
3274 1.1 mrg image_hi &= 0x7fffffff;
3275 1.1 mrg image_lo <<= 32 - 21;
3276 1.1 mrg
3277 1.1 mrg if (exp == 0)
3278 1.1 mrg {
3279 1.1 mrg if ((image_hi || image_lo) && fmt->has_denorm)
3280 1.1 mrg {
3281 1.1 mrg r->cl = rvc_normal;
3282 1.1 mrg r->sign = sign;
3283 1.1 mrg SET_REAL_EXP (r, -1022);
3284 1.1 mrg if (HOST_BITS_PER_LONG == 32)
3285 1.1 mrg {
3286 1.1 mrg image_hi = (image_hi << 1) | (image_lo >> 31);
3287 1.1 mrg image_lo <<= 1;
3288 1.1 mrg r->sig[SIGSZ-1] = image_hi;
3289 1.1 mrg r->sig[SIGSZ-2] = image_lo;
3290 1.1 mrg }
3291 1.1 mrg else
3292 1.1 mrg {
3293 1.1 mrg image_hi = (image_hi << 31 << 2) | (image_lo << 1);
3294 1.1 mrg r->sig[SIGSZ-1] = image_hi;
3295 1.1 mrg }
3296 1.1 mrg normalize (r);
3297 1.1 mrg }
3298 1.1 mrg else if (fmt->has_signed_zero)
3299 1.1 mrg r->sign = sign;
3300 1.1 mrg }
3301 1.1 mrg else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
3302 1.1 mrg {
3303 1.1 mrg if (image_hi || image_lo)
3304 1.1 mrg {
3305 1.1 mrg r->cl = rvc_nan;
3306 1.1 mrg r->sign = sign;
3307 1.1 mrg r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3308 1.1 mrg if (HOST_BITS_PER_LONG == 32)
3309 1.1 mrg {
3310 1.1 mrg r->sig[SIGSZ-1] = image_hi;
3311 1.1 mrg r->sig[SIGSZ-2] = image_lo;
3312 1.1 mrg }
3313 1.1 mrg else
3314 1.1 mrg r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
3315 1.1 mrg }
3316 1.1 mrg else
3317 1.1 mrg {
3318 1.1 mrg r->cl = rvc_inf;
3319 1.1 mrg r->sign = sign;
3320 1.1 mrg }
3321 1.1 mrg }
3322 1.1 mrg else
3323 1.1 mrg {
3324 1.1 mrg r->cl = rvc_normal;
3325 1.1 mrg r->sign = sign;
3326 1.1 mrg SET_REAL_EXP (r, exp - 1023 + 1);
3327 1.1 mrg if (HOST_BITS_PER_LONG == 32)
3328 1.1 mrg {
3329 1.1 mrg r->sig[SIGSZ-1] = image_hi | SIG_MSB;
3330 1.1 mrg r->sig[SIGSZ-2] = image_lo;
3331 1.1 mrg }
3332 1.1 mrg else
3333 1.1 mrg r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
3334 1.1 mrg }
3335 1.1 mrg }
3336 1.1 mrg
3337 1.1 mrg const struct real_format ieee_double_format =
3338 1.1 mrg {
3339 1.1 mrg encode_ieee_double,
3340 1.1 mrg decode_ieee_double,
3341 1.1 mrg 2,
3342 1.1 mrg 53,
3343 1.1 mrg 53,
3344 1.1 mrg -1021,
3345 1.1 mrg 1024,
3346 1.1 mrg 63,
3347 1.1 mrg 63,
3348 1.1 mrg 64,
3349 1.1 mrg false,
3350 1.1 mrg true,
3351 1.1 mrg true,
3352 1.1 mrg true,
3353 1.1 mrg true,
3354 1.1 mrg true,
3355 1.1 mrg true,
3356 1.1 mrg false,
3357 1.1 mrg "ieee_double"
3358 1.1 mrg };
3359 1.1 mrg
3360 1.1 mrg const struct real_format mips_double_format =
3361 1.1 mrg {
3362 1.1 mrg encode_ieee_double,
3363 1.1 mrg decode_ieee_double,
3364 1.1 mrg 2,
3365 1.1 mrg 53,
3366 1.1 mrg 53,
3367 1.1 mrg -1021,
3368 1.1 mrg 1024,
3369 1.1 mrg 63,
3370 1.1 mrg 63,
3371 1.1 mrg 64,
3372 1.1 mrg false,
3373 1.1 mrg true,
3374 1.1 mrg true,
3375 1.1 mrg true,
3376 1.1 mrg true,
3377 1.1 mrg true,
3378 1.1 mrg false,
3379 1.1 mrg true,
3380 1.1 mrg "mips_double"
3381 1.1 mrg };
3382 1.1 mrg
3383 1.1 mrg const struct real_format motorola_double_format =
3384 1.1 mrg {
3385 1.1 mrg encode_ieee_double,
3386 1.1 mrg decode_ieee_double,
3387 1.1 mrg 2,
3388 1.1 mrg 53,
3389 1.1 mrg 53,
3390 1.1 mrg -1021,
3391 1.1 mrg 1024,
3392 1.1 mrg 63,
3393 1.1 mrg 63,
3394 1.1 mrg 64,
3395 1.1 mrg false,
3396 1.1 mrg true,
3397 1.1 mrg true,
3398 1.1 mrg true,
3399 1.1 mrg true,
3400 1.1 mrg true,
3401 1.1 mrg true,
3402 1.1 mrg true,
3403 1.1 mrg "motorola_double"
3404 1.1 mrg };
3405 1.1 mrg
3406 1.1 mrg /* IEEE extended real format. This comes in three flavors: Intel's as
3408 1.1 mrg a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
3409 1.1 mrg 12- and 16-byte images may be big- or little endian; Motorola's is
3410 1.1 mrg always big endian. */
3411 1.1 mrg
3412 1.1 mrg /* Helper subroutine which converts from the internal format to the
3413 1.1 mrg 12-byte little-endian Intel format. Functions below adjust this
3414 1.1 mrg for the other possible formats. */
3415 1.1 mrg static void
3416 1.1 mrg encode_ieee_extended (const struct real_format *fmt, long *buf,
3417 1.1 mrg const REAL_VALUE_TYPE *r)
3418 1.1 mrg {
3419 1.1 mrg unsigned long image_hi, sig_hi, sig_lo;
3420 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3421 1.1 mrg
3422 1.1 mrg image_hi = r->sign << 15;
3423 1.1 mrg sig_hi = sig_lo = 0;
3424 1.1 mrg
3425 1.1 mrg switch (r->cl)
3426 1.1 mrg {
3427 1.1 mrg case rvc_zero:
3428 1.1 mrg break;
3429 1.1 mrg
3430 1.1 mrg case rvc_inf:
3431 1.1 mrg if (fmt->has_inf)
3432 1.1 mrg {
3433 1.1 mrg image_hi |= 32767;
3434 1.1 mrg
3435 1.1 mrg /* Intel requires the explicit integer bit to be set, otherwise
3436 1.1 mrg it considers the value a "pseudo-infinity". Motorola docs
3437 1.1 mrg say it doesn't care. */
3438 1.1 mrg sig_hi = 0x80000000;
3439 1.1 mrg }
3440 1.1 mrg else
3441 1.1 mrg {
3442 1.1 mrg image_hi |= 32767;
3443 1.1 mrg sig_lo = sig_hi = 0xffffffff;
3444 1.1 mrg }
3445 1.1 mrg break;
3446 1.1 mrg
3447 1.1 mrg case rvc_nan:
3448 1.1 mrg if (fmt->has_nans)
3449 1.1 mrg {
3450 1.1 mrg image_hi |= 32767;
3451 1.1 mrg if (r->canonical)
3452 1.1 mrg {
3453 1.1 mrg if (fmt->canonical_nan_lsbs_set)
3454 1.1 mrg {
3455 1.1 mrg sig_hi = (1 << 30) - 1;
3456 1.1 mrg sig_lo = 0xffffffff;
3457 1.1 mrg }
3458 1.1 mrg }
3459 1.1 mrg else if (HOST_BITS_PER_LONG == 32)
3460 1.1 mrg {
3461 1.1 mrg sig_hi = r->sig[SIGSZ-1];
3462 1.1 mrg sig_lo = r->sig[SIGSZ-2];
3463 1.1 mrg }
3464 1.1 mrg else
3465 1.1 mrg {
3466 1.1 mrg sig_lo = r->sig[SIGSZ-1];
3467 1.1 mrg sig_hi = sig_lo >> 31 >> 1;
3468 1.1 mrg sig_lo &= 0xffffffff;
3469 1.1 mrg }
3470 1.1 mrg if (r->signalling == fmt->qnan_msb_set)
3471 1.1 mrg sig_hi &= ~(1 << 30);
3472 1.1 mrg else
3473 1.1 mrg sig_hi |= 1 << 30;
3474 1.1 mrg if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
3475 1.1 mrg sig_hi = 1 << 29;
3476 1.1 mrg
3477 1.1 mrg /* Intel requires the explicit integer bit to be set, otherwise
3478 1.1 mrg it considers the value a "pseudo-nan". Motorola docs say it
3479 1.1 mrg doesn't care. */
3480 1.1 mrg sig_hi |= 0x80000000;
3481 1.1 mrg }
3482 1.1 mrg else
3483 1.1 mrg {
3484 1.1 mrg image_hi |= 32767;
3485 1.1 mrg sig_lo = sig_hi = 0xffffffff;
3486 1.1 mrg }
3487 1.1 mrg break;
3488 1.1 mrg
3489 1.1 mrg case rvc_normal:
3490 1.1 mrg {
3491 1.1 mrg int exp = REAL_EXP (r);
3492 1.1 mrg
3493 1.1 mrg /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3494 1.1 mrg whereas the intermediate representation is 0.F x 2**exp.
3495 1.1 mrg Which means we're off by one.
3496 1.1 mrg
3497 1.1 mrg Except for Motorola, which consider exp=0 and explicit
3498 1.1 mrg integer bit set to continue to be normalized. In theory
3499 1.1 mrg this discrepancy has been taken care of by the difference
3500 1.1 mrg in fmt->emin in round_for_format. */
3501 1.1 mrg
3502 1.1 mrg if (denormal)
3503 1.1 mrg exp = 0;
3504 1.1 mrg else
3505 1.1 mrg {
3506 1.1 mrg exp += 16383 - 1;
3507 1.1 mrg gcc_assert (exp >= 0);
3508 1.1 mrg }
3509 1.1 mrg image_hi |= exp;
3510 1.1 mrg
3511 1.1 mrg if (HOST_BITS_PER_LONG == 32)
3512 1.1 mrg {
3513 1.1 mrg sig_hi = r->sig[SIGSZ-1];
3514 1.1 mrg sig_lo = r->sig[SIGSZ-2];
3515 1.1 mrg }
3516 1.1 mrg else
3517 1.1 mrg {
3518 1.1 mrg sig_lo = r->sig[SIGSZ-1];
3519 1.1 mrg sig_hi = sig_lo >> 31 >> 1;
3520 1.1 mrg sig_lo &= 0xffffffff;
3521 1.1 mrg }
3522 1.1 mrg }
3523 1.1 mrg break;
3524 1.1 mrg
3525 1.1 mrg default:
3526 1.1 mrg gcc_unreachable ();
3527 1.1 mrg }
3528 1.1 mrg
3529 1.1 mrg buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3530 1.1 mrg }
3531 1.1 mrg
3532 1.1 mrg /* Convert from the internal format to the 12-byte Motorola format
3533 1.1 mrg for an IEEE extended real. */
3534 1.1 mrg static void
3535 1.1 mrg encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3536 1.1 mrg const REAL_VALUE_TYPE *r)
3537 1.1 mrg {
3538 1.1 mrg long intermed[3];
3539 1.1 mrg encode_ieee_extended (fmt, intermed, r);
3540 1.1 mrg
3541 1.1 mrg if (r->cl == rvc_inf)
3542 1.1 mrg /* For infinity clear the explicit integer bit again, so that the
3543 1.1 mrg format matches the canonical infinity generated by the FPU. */
3544 1.1 mrg intermed[1] = 0;
3545 1.1 mrg
3546 1.1 mrg /* Motorola chips are assumed always to be big-endian. Also, the
3547 1.1 mrg padding in a Motorola extended real goes between the exponent and
3548 1.1 mrg the mantissa. At this point the mantissa is entirely within
3549 1.1 mrg elements 0 and 1 of intermed, and the exponent entirely within
3550 1.1 mrg element 2, so all we have to do is swap the order around, and
3551 1.1 mrg shift element 2 left 16 bits. */
3552 1.1 mrg buf[0] = intermed[2] << 16;
3553 1.1 mrg buf[1] = intermed[1];
3554 1.1 mrg buf[2] = intermed[0];
3555 1.1 mrg }
3556 1.1 mrg
3557 1.1 mrg /* Convert from the internal format to the 12-byte Intel format for
3558 1.1 mrg an IEEE extended real. */
3559 1.1 mrg static void
3560 1.1 mrg encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3561 1.1 mrg const REAL_VALUE_TYPE *r)
3562 1.1 mrg {
3563 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN)
3564 1.1 mrg {
3565 1.1 mrg /* All the padding in an Intel-format extended real goes at the high
3566 1.1 mrg end, which in this case is after the mantissa, not the exponent.
3567 1.1 mrg Therefore we must shift everything down 16 bits. */
3568 1.1 mrg long intermed[3];
3569 1.1 mrg encode_ieee_extended (fmt, intermed, r);
3570 1.1 mrg buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3571 1.1 mrg buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3572 1.1 mrg buf[2] = (intermed[0] << 16);
3573 1.1 mrg }
3574 1.1 mrg else
3575 1.1 mrg /* encode_ieee_extended produces what we want directly. */
3576 1.1 mrg encode_ieee_extended (fmt, buf, r);
3577 1.1 mrg }
3578 1.1 mrg
3579 1.1 mrg /* Convert from the internal format to the 16-byte Intel format for
3580 1.1 mrg an IEEE extended real. */
3581 1.1 mrg static void
3582 1.1 mrg encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3583 1.1 mrg const REAL_VALUE_TYPE *r)
3584 1.1 mrg {
3585 1.1 mrg /* All the padding in an Intel-format extended real goes at the high end. */
3586 1.1 mrg encode_ieee_extended_intel_96 (fmt, buf, r);
3587 1.1 mrg buf[3] = 0;
3588 1.1 mrg }
3589 1.1 mrg
3590 1.1 mrg /* As above, we have a helper function which converts from 12-byte
3591 1.1 mrg little-endian Intel format to internal format. Functions below
3592 1.1 mrg adjust for the other possible formats. */
3593 1.1 mrg static void
3594 1.1 mrg decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3595 1.1 mrg const long *buf)
3596 1.1 mrg {
3597 1.1 mrg unsigned long image_hi, sig_hi, sig_lo;
3598 1.1 mrg bool sign;
3599 1.1 mrg int exp;
3600 1.1 mrg
3601 1.1 mrg sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3602 1.1 mrg sig_lo &= 0xffffffff;
3603 1.1 mrg sig_hi &= 0xffffffff;
3604 1.1 mrg image_hi &= 0xffffffff;
3605 1.1 mrg
3606 1.1 mrg sign = (image_hi >> 15) & 1;
3607 1.1 mrg exp = image_hi & 0x7fff;
3608 1.1 mrg
3609 1.1 mrg memset (r, 0, sizeof (*r));
3610 1.1 mrg
3611 1.1 mrg if (exp == 0)
3612 1.1 mrg {
3613 1.1 mrg if ((sig_hi || sig_lo) && fmt->has_denorm)
3614 1.1 mrg {
3615 1.1 mrg r->cl = rvc_normal;
3616 1.1 mrg r->sign = sign;
3617 1.1 mrg
3618 1.1 mrg /* When the IEEE format contains a hidden bit, we know that
3619 1.1 mrg it's zero at this point, and so shift up the significand
3620 1.1 mrg and decrease the exponent to match. In this case, Motorola
3621 1.1 mrg defines the explicit integer bit to be valid, so we don't
3622 1.1 mrg know whether the msb is set or not. */
3623 1.1 mrg SET_REAL_EXP (r, fmt->emin);
3624 1.1 mrg if (HOST_BITS_PER_LONG == 32)
3625 1.1 mrg {
3626 1.1 mrg r->sig[SIGSZ-1] = sig_hi;
3627 1.1 mrg r->sig[SIGSZ-2] = sig_lo;
3628 1.1 mrg }
3629 1.1 mrg else
3630 1.1 mrg r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3631 1.1 mrg
3632 1.1 mrg normalize (r);
3633 1.1 mrg }
3634 1.1 mrg else if (fmt->has_signed_zero)
3635 1.1 mrg r->sign = sign;
3636 1.1 mrg }
3637 1.1 mrg else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3638 1.1 mrg {
3639 1.1 mrg /* See above re "pseudo-infinities" and "pseudo-nans".
3640 1.1 mrg Short summary is that the MSB will likely always be
3641 1.1 mrg set, and that we don't care about it. */
3642 1.1 mrg sig_hi &= 0x7fffffff;
3643 1.1 mrg
3644 1.1 mrg if (sig_hi || sig_lo)
3645 1.1 mrg {
3646 1.1 mrg r->cl = rvc_nan;
3647 1.1 mrg r->sign = sign;
3648 1.1 mrg r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3649 1.1 mrg if (HOST_BITS_PER_LONG == 32)
3650 1.1 mrg {
3651 1.1 mrg r->sig[SIGSZ-1] = sig_hi;
3652 1.1 mrg r->sig[SIGSZ-2] = sig_lo;
3653 1.1 mrg }
3654 1.1 mrg else
3655 1.1 mrg r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3656 1.1 mrg }
3657 1.1 mrg else
3658 1.1 mrg {
3659 1.1 mrg r->cl = rvc_inf;
3660 1.1 mrg r->sign = sign;
3661 1.1 mrg }
3662 1.1 mrg }
3663 1.1 mrg else
3664 1.1 mrg {
3665 1.1 mrg r->cl = rvc_normal;
3666 1.1 mrg r->sign = sign;
3667 1.1 mrg SET_REAL_EXP (r, exp - 16383 + 1);
3668 1.1 mrg if (HOST_BITS_PER_LONG == 32)
3669 1.1 mrg {
3670 1.1 mrg r->sig[SIGSZ-1] = sig_hi;
3671 1.1 mrg r->sig[SIGSZ-2] = sig_lo;
3672 1.1 mrg }
3673 1.1 mrg else
3674 1.1 mrg r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3675 1.1 mrg }
3676 1.1 mrg }
3677 1.1 mrg
3678 1.1 mrg /* Convert from the internal format to the 12-byte Motorola format
3679 1.1 mrg for an IEEE extended real. */
3680 1.1 mrg static void
3681 1.1 mrg decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3682 1.1 mrg const long *buf)
3683 1.1 mrg {
3684 1.1 mrg long intermed[3];
3685 1.1 mrg
3686 1.1 mrg /* Motorola chips are assumed always to be big-endian. Also, the
3687 1.1 mrg padding in a Motorola extended real goes between the exponent and
3688 1.1 mrg the mantissa; remove it. */
3689 1.1 mrg intermed[0] = buf[2];
3690 1.1 mrg intermed[1] = buf[1];
3691 1.1 mrg intermed[2] = (unsigned long)buf[0] >> 16;
3692 1.1 mrg
3693 1.1 mrg decode_ieee_extended (fmt, r, intermed);
3694 1.1 mrg }
3695 1.1 mrg
3696 1.1 mrg /* Convert from the internal format to the 12-byte Intel format for
3697 1.1 mrg an IEEE extended real. */
3698 1.1 mrg static void
3699 1.1 mrg decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3700 1.1 mrg const long *buf)
3701 1.1 mrg {
3702 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN)
3703 1.1 mrg {
3704 1.1 mrg /* All the padding in an Intel-format extended real goes at the high
3705 1.1 mrg end, which in this case is after the mantissa, not the exponent.
3706 1.1 mrg Therefore we must shift everything up 16 bits. */
3707 1.1 mrg long intermed[3];
3708 1.1 mrg
3709 1.1 mrg intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3710 1.1 mrg intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3711 1.1 mrg intermed[2] = ((unsigned long)buf[0] >> 16);
3712 1.1 mrg
3713 1.1 mrg decode_ieee_extended (fmt, r, intermed);
3714 1.1 mrg }
3715 1.1 mrg else
3716 1.1 mrg /* decode_ieee_extended produces what we want directly. */
3717 1.1 mrg decode_ieee_extended (fmt, r, buf);
3718 1.1 mrg }
3719 1.1 mrg
3720 1.1 mrg /* Convert from the internal format to the 16-byte Intel format for
3721 1.1 mrg an IEEE extended real. */
3722 1.1 mrg static void
3723 1.1 mrg decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3724 1.1 mrg const long *buf)
3725 1.1 mrg {
3726 1.1 mrg /* All the padding in an Intel-format extended real goes at the high end. */
3727 1.1 mrg decode_ieee_extended_intel_96 (fmt, r, buf);
3728 1.1 mrg }
3729 1.1 mrg
3730 1.1 mrg const struct real_format ieee_extended_motorola_format =
3731 1.1 mrg {
3732 1.1 mrg encode_ieee_extended_motorola,
3733 1.1 mrg decode_ieee_extended_motorola,
3734 1.1 mrg 2,
3735 1.1 mrg 64,
3736 1.1 mrg 64,
3737 1.1 mrg -16382,
3738 1.1 mrg 16384,
3739 1.1 mrg 95,
3740 1.1 mrg 95,
3741 1.1 mrg 0,
3742 1.1 mrg false,
3743 1.1 mrg true,
3744 1.1 mrg true,
3745 1.1 mrg true,
3746 1.1 mrg true,
3747 1.1 mrg true,
3748 1.1 mrg true,
3749 1.1 mrg true,
3750 1.1 mrg "ieee_extended_motorola"
3751 1.1 mrg };
3752 1.1 mrg
3753 1.1 mrg const struct real_format ieee_extended_intel_96_format =
3754 1.1 mrg {
3755 1.1 mrg encode_ieee_extended_intel_96,
3756 1.1 mrg decode_ieee_extended_intel_96,
3757 1.1 mrg 2,
3758 1.1 mrg 64,
3759 1.1 mrg 64,
3760 1.1 mrg -16381,
3761 1.1 mrg 16384,
3762 1.1 mrg 79,
3763 1.1 mrg 79,
3764 1.1 mrg 65,
3765 1.1 mrg false,
3766 1.1 mrg true,
3767 1.1 mrg true,
3768 1.1 mrg true,
3769 1.1 mrg true,
3770 1.1 mrg true,
3771 1.1 mrg true,
3772 1.1 mrg false,
3773 1.1 mrg "ieee_extended_intel_96"
3774 1.1 mrg };
3775 1.1 mrg
3776 1.1 mrg const struct real_format ieee_extended_intel_128_format =
3777 1.1 mrg {
3778 1.1 mrg encode_ieee_extended_intel_128,
3779 1.1 mrg decode_ieee_extended_intel_128,
3780 1.1 mrg 2,
3781 1.1 mrg 64,
3782 1.1 mrg 64,
3783 1.1 mrg -16381,
3784 1.1 mrg 16384,
3785 1.1 mrg 79,
3786 1.1 mrg 79,
3787 1.1 mrg 65,
3788 1.1 mrg false,
3789 1.1 mrg true,
3790 1.1 mrg true,
3791 1.1 mrg true,
3792 1.1 mrg true,
3793 1.1 mrg true,
3794 1.1 mrg true,
3795 1.1 mrg false,
3796 1.1 mrg "ieee_extended_intel_128"
3797 1.1 mrg };
3798 1.1 mrg
3799 1.1 mrg /* The following caters to i386 systems that set the rounding precision
3800 1.1 mrg to 53 bits instead of 64, e.g. FreeBSD. */
3801 1.1 mrg const struct real_format ieee_extended_intel_96_round_53_format =
3802 1.1 mrg {
3803 1.1 mrg encode_ieee_extended_intel_96,
3804 1.1 mrg decode_ieee_extended_intel_96,
3805 1.1 mrg 2,
3806 1.1 mrg 53,
3807 1.1 mrg 53,
3808 1.1 mrg -16381,
3809 1.1 mrg 16384,
3810 1.1 mrg 79,
3811 1.1 mrg 79,
3812 1.1 mrg 33,
3813 1.1 mrg false,
3814 1.1 mrg true,
3815 1.1 mrg true,
3816 1.1 mrg true,
3817 1.1 mrg true,
3818 1.1 mrg true,
3819 1.1 mrg true,
3820 1.1 mrg false,
3821 1.1 mrg "ieee_extended_intel_96_round_53"
3822 1.1 mrg };
3823 1.1 mrg
3824 1.1 mrg /* IBM 128-bit extended precision format: a pair of IEEE double precision
3826 1.1 mrg numbers whose sum is equal to the extended precision value. The number
3827 1.1 mrg with greater magnitude is first. This format has the same magnitude
3828 1.1 mrg range as an IEEE double precision value, but effectively 106 bits of
3829 1.1 mrg significand precision. Infinity and NaN are represented by their IEEE
3830 1.1 mrg double precision value stored in the first number, the second number is
3831 1.1 mrg +0.0 or -0.0 for Infinity and don't-care for NaN. */
3832 1.1 mrg
3833 1.1 mrg static void encode_ibm_extended (const struct real_format *fmt,
3834 1.1 mrg long *, const REAL_VALUE_TYPE *);
3835 1.1 mrg static void decode_ibm_extended (const struct real_format *,
3836 1.1 mrg REAL_VALUE_TYPE *, const long *);
3837 1.1 mrg
3838 1.1 mrg static void
3839 1.1 mrg encode_ibm_extended (const struct real_format *fmt, long *buf,
3840 1.1 mrg const REAL_VALUE_TYPE *r)
3841 1.1 mrg {
3842 1.1 mrg REAL_VALUE_TYPE u, normr, v;
3843 1.1 mrg const struct real_format *base_fmt;
3844 1.1 mrg
3845 1.1 mrg base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3846 1.1 mrg
3847 1.1 mrg /* Renormalize R before doing any arithmetic on it. */
3848 1.1 mrg normr = *r;
3849 1.1 mrg if (normr.cl == rvc_normal)
3850 1.1 mrg normalize (&normr);
3851 1.1 mrg
3852 1.1 mrg /* u = IEEE double precision portion of significand. */
3853 1.1 mrg u = normr;
3854 1.1 mrg round_for_format (base_fmt, &u);
3855 1.1 mrg encode_ieee_double (base_fmt, &buf[0], &u);
3856 1.1 mrg
3857 1.1 mrg if (u.cl == rvc_normal)
3858 1.1 mrg {
3859 1.1 mrg do_add (&v, &normr, &u, 1);
3860 1.1 mrg /* Call round_for_format since we might need to denormalize. */
3861 1.1 mrg round_for_format (base_fmt, &v);
3862 1.1 mrg encode_ieee_double (base_fmt, &buf[2], &v);
3863 1.1 mrg }
3864 1.1 mrg else
3865 1.1 mrg {
3866 1.1 mrg /* Inf, NaN, 0 are all representable as doubles, so the
3867 1.1 mrg least-significant part can be 0.0. */
3868 1.1 mrg buf[2] = 0;
3869 1.1 mrg buf[3] = 0;
3870 1.1 mrg }
3871 1.1 mrg }
3872 1.1 mrg
3873 1.1 mrg static void
3874 1.1 mrg decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3875 1.1 mrg const long *buf)
3876 1.1 mrg {
3877 1.1 mrg REAL_VALUE_TYPE u, v;
3878 1.1 mrg const struct real_format *base_fmt;
3879 1.1 mrg
3880 1.1 mrg base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3881 1.1 mrg decode_ieee_double (base_fmt, &u, &buf[0]);
3882 1.1 mrg
3883 1.1 mrg if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3884 1.1 mrg {
3885 1.1 mrg decode_ieee_double (base_fmt, &v, &buf[2]);
3886 1.1 mrg do_add (r, &u, &v, 0);
3887 1.1 mrg }
3888 1.1 mrg else
3889 1.1 mrg *r = u;
3890 1.1 mrg }
3891 1.1 mrg
3892 1.1 mrg const struct real_format ibm_extended_format =
3893 1.1 mrg {
3894 1.1 mrg encode_ibm_extended,
3895 1.1 mrg decode_ibm_extended,
3896 1.1 mrg 2,
3897 1.1 mrg 53 + 53,
3898 1.1 mrg 53,
3899 1.1 mrg -1021 + 53,
3900 1.1 mrg 1024,
3901 1.1 mrg 127,
3902 1.1 mrg -1,
3903 1.1 mrg 0,
3904 1.1 mrg false,
3905 1.1 mrg true,
3906 1.1 mrg true,
3907 1.1 mrg true,
3908 1.1 mrg true,
3909 1.1 mrg true,
3910 1.1 mrg true,
3911 1.1 mrg false,
3912 1.1 mrg "ibm_extended"
3913 1.1 mrg };
3914 1.1 mrg
3915 1.1 mrg const struct real_format mips_extended_format =
3916 1.1 mrg {
3917 1.1 mrg encode_ibm_extended,
3918 1.1 mrg decode_ibm_extended,
3919 1.1 mrg 2,
3920 1.1 mrg 53 + 53,
3921 1.1 mrg 53,
3922 1.1 mrg -1021 + 53,
3923 1.1 mrg 1024,
3924 1.1 mrg 127,
3925 1.1 mrg -1,
3926 1.1 mrg 0,
3927 1.1 mrg false,
3928 1.1 mrg true,
3929 1.1 mrg true,
3930 1.1 mrg true,
3931 1.1 mrg true,
3932 1.1 mrg true,
3933 1.1 mrg false,
3934 1.1 mrg true,
3935 1.1 mrg "mips_extended"
3936 1.1 mrg };
3937 1.1 mrg
3938 1.1 mrg
3939 1.1 mrg /* IEEE quad precision format. */
3941 1.1 mrg
3942 1.1 mrg static void encode_ieee_quad (const struct real_format *fmt,
3943 1.1 mrg long *, const REAL_VALUE_TYPE *);
3944 1.1 mrg static void decode_ieee_quad (const struct real_format *,
3945 1.1 mrg REAL_VALUE_TYPE *, const long *);
3946 1.1 mrg
3947 1.1 mrg static void
3948 1.1 mrg encode_ieee_quad (const struct real_format *fmt, long *buf,
3949 1.1 mrg const REAL_VALUE_TYPE *r)
3950 1.1 mrg {
3951 1.1 mrg unsigned long image3, image2, image1, image0, exp;
3952 1.1 mrg unsigned long sign = r->sign;
3953 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3954 1.1 mrg REAL_VALUE_TYPE u;
3955 1.1 mrg
3956 1.1 mrg image3 = sign << 31;
3957 1.1 mrg image2 = 0;
3958 1.1 mrg image1 = 0;
3959 1.1 mrg image0 = 0;
3960 1.1 mrg
3961 1.1 mrg rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3962 1.1 mrg
3963 1.1 mrg switch (r->cl)
3964 1.1 mrg {
3965 1.1 mrg case rvc_zero:
3966 1.1 mrg break;
3967 1.1 mrg
3968 1.1 mrg case rvc_inf:
3969 1.1 mrg if (fmt->has_inf)
3970 1.1 mrg image3 |= 32767 << 16;
3971 1.1 mrg else
3972 1.1 mrg {
3973 1.1 mrg image3 |= 0x7fffffff;
3974 1.1 mrg image2 = 0xffffffff;
3975 1.1 mrg image1 = 0xffffffff;
3976 1.1 mrg image0 = 0xffffffff;
3977 1.1 mrg }
3978 1.1 mrg break;
3979 1.1 mrg
3980 1.1 mrg case rvc_nan:
3981 1.1 mrg if (fmt->has_nans)
3982 1.1 mrg {
3983 1.1 mrg image3 |= 32767 << 16;
3984 1.1 mrg
3985 1.1 mrg if (r->canonical)
3986 1.1 mrg {
3987 1.1 mrg if (fmt->canonical_nan_lsbs_set)
3988 1.1 mrg {
3989 1.1 mrg image3 |= 0x7fff;
3990 1.1 mrg image2 = image1 = image0 = 0xffffffff;
3991 1.1 mrg }
3992 1.1 mrg }
3993 1.1 mrg else if (HOST_BITS_PER_LONG == 32)
3994 1.1 mrg {
3995 1.1 mrg image0 = u.sig[0];
3996 1.1 mrg image1 = u.sig[1];
3997 1.1 mrg image2 = u.sig[2];
3998 1.1 mrg image3 |= u.sig[3] & 0xffff;
3999 1.1 mrg }
4000 1.1 mrg else
4001 1.1 mrg {
4002 1.1 mrg image0 = u.sig[0];
4003 1.1 mrg image1 = image0 >> 31 >> 1;
4004 1.1 mrg image2 = u.sig[1];
4005 1.1 mrg image3 |= (image2 >> 31 >> 1) & 0xffff;
4006 1.1 mrg image0 &= 0xffffffff;
4007 1.1 mrg image2 &= 0xffffffff;
4008 1.1 mrg }
4009 1.1 mrg if (r->signalling == fmt->qnan_msb_set)
4010 1.1 mrg image3 &= ~0x8000;
4011 1.1 mrg else
4012 1.1 mrg image3 |= 0x8000;
4013 1.1 mrg if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
4014 1.1 mrg image3 |= 0x4000;
4015 1.1 mrg }
4016 1.1 mrg else
4017 1.1 mrg {
4018 1.1 mrg image3 |= 0x7fffffff;
4019 1.1 mrg image2 = 0xffffffff;
4020 1.1 mrg image1 = 0xffffffff;
4021 1.1 mrg image0 = 0xffffffff;
4022 1.1 mrg }
4023 1.1 mrg break;
4024 1.1 mrg
4025 1.1 mrg case rvc_normal:
4026 1.1 mrg /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
4027 1.1 mrg whereas the intermediate representation is 0.F x 2**exp.
4028 1.1 mrg Which means we're off by one. */
4029 1.1 mrg if (denormal)
4030 1.1 mrg exp = 0;
4031 1.1 mrg else
4032 1.1 mrg exp = REAL_EXP (r) + 16383 - 1;
4033 1.1 mrg image3 |= exp << 16;
4034 1.1 mrg
4035 1.1 mrg if (HOST_BITS_PER_LONG == 32)
4036 1.1 mrg {
4037 1.1 mrg image0 = u.sig[0];
4038 1.1 mrg image1 = u.sig[1];
4039 1.1 mrg image2 = u.sig[2];
4040 1.1 mrg image3 |= u.sig[3] & 0xffff;
4041 1.1 mrg }
4042 1.1 mrg else
4043 1.1 mrg {
4044 1.1 mrg image0 = u.sig[0];
4045 1.1 mrg image1 = image0 >> 31 >> 1;
4046 1.1 mrg image2 = u.sig[1];
4047 1.1 mrg image3 |= (image2 >> 31 >> 1) & 0xffff;
4048 1.1 mrg image0 &= 0xffffffff;
4049 1.1 mrg image2 &= 0xffffffff;
4050 1.1 mrg }
4051 1.1 mrg break;
4052 1.1 mrg
4053 1.1 mrg default:
4054 1.1 mrg gcc_unreachable ();
4055 1.1 mrg }
4056 1.1 mrg
4057 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN)
4058 1.1 mrg {
4059 1.1 mrg buf[0] = image3;
4060 1.1 mrg buf[1] = image2;
4061 1.1 mrg buf[2] = image1;
4062 1.1 mrg buf[3] = image0;
4063 1.1 mrg }
4064 1.1 mrg else
4065 1.1 mrg {
4066 1.1 mrg buf[0] = image0;
4067 1.1 mrg buf[1] = image1;
4068 1.1 mrg buf[2] = image2;
4069 1.1 mrg buf[3] = image3;
4070 1.1 mrg }
4071 1.1 mrg }
4072 1.1 mrg
4073 1.1 mrg static void
4074 1.1 mrg decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
4075 1.1 mrg const long *buf)
4076 1.1 mrg {
4077 1.1 mrg unsigned long image3, image2, image1, image0;
4078 1.1 mrg bool sign;
4079 1.1 mrg int exp;
4080 1.1 mrg
4081 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN)
4082 1.1 mrg {
4083 1.1 mrg image3 = buf[0];
4084 1.1 mrg image2 = buf[1];
4085 1.1 mrg image1 = buf[2];
4086 1.1 mrg image0 = buf[3];
4087 1.1 mrg }
4088 1.1 mrg else
4089 1.1 mrg {
4090 1.1 mrg image0 = buf[0];
4091 1.1 mrg image1 = buf[1];
4092 1.1 mrg image2 = buf[2];
4093 1.1 mrg image3 = buf[3];
4094 1.1 mrg }
4095 1.1 mrg image0 &= 0xffffffff;
4096 1.1 mrg image1 &= 0xffffffff;
4097 1.1 mrg image2 &= 0xffffffff;
4098 1.1 mrg
4099 1.1 mrg sign = (image3 >> 31) & 1;
4100 1.1 mrg exp = (image3 >> 16) & 0x7fff;
4101 1.1 mrg image3 &= 0xffff;
4102 1.1 mrg
4103 1.1 mrg memset (r, 0, sizeof (*r));
4104 1.1 mrg
4105 1.1 mrg if (exp == 0)
4106 1.1 mrg {
4107 1.1 mrg if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
4108 1.1 mrg {
4109 1.1 mrg r->cl = rvc_normal;
4110 1.1 mrg r->sign = sign;
4111 1.1 mrg
4112 1.1 mrg SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
4113 1.1 mrg if (HOST_BITS_PER_LONG == 32)
4114 1.1 mrg {
4115 1.1 mrg r->sig[0] = image0;
4116 1.1 mrg r->sig[1] = image1;
4117 1.1 mrg r->sig[2] = image2;
4118 1.1 mrg r->sig[3] = image3;
4119 1.1 mrg }
4120 1.1 mrg else
4121 1.1 mrg {
4122 1.1 mrg r->sig[0] = (image1 << 31 << 1) | image0;
4123 1.1 mrg r->sig[1] = (image3 << 31 << 1) | image2;
4124 1.1 mrg }
4125 1.1 mrg
4126 1.1 mrg normalize (r);
4127 1.1 mrg }
4128 1.1 mrg else if (fmt->has_signed_zero)
4129 1.1 mrg r->sign = sign;
4130 1.1 mrg }
4131 1.1 mrg else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
4132 1.1 mrg {
4133 1.1 mrg if (image3 | image2 | image1 | image0)
4134 1.1 mrg {
4135 1.1 mrg r->cl = rvc_nan;
4136 1.1 mrg r->sign = sign;
4137 1.1 mrg r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
4138 1.1 mrg
4139 1.1 mrg if (HOST_BITS_PER_LONG == 32)
4140 1.1 mrg {
4141 1.1 mrg r->sig[0] = image0;
4142 1.1 mrg r->sig[1] = image1;
4143 1.1 mrg r->sig[2] = image2;
4144 1.1 mrg r->sig[3] = image3;
4145 1.1 mrg }
4146 1.1 mrg else
4147 1.1 mrg {
4148 1.1 mrg r->sig[0] = (image1 << 31 << 1) | image0;
4149 1.1 mrg r->sig[1] = (image3 << 31 << 1) | image2;
4150 1.1 mrg }
4151 1.1 mrg lshift_significand (r, r, SIGNIFICAND_BITS - 113);
4152 1.1 mrg }
4153 1.1 mrg else
4154 1.1 mrg {
4155 1.1 mrg r->cl = rvc_inf;
4156 1.1 mrg r->sign = sign;
4157 1.1 mrg }
4158 1.1 mrg }
4159 1.1 mrg else
4160 1.1 mrg {
4161 1.1 mrg r->cl = rvc_normal;
4162 1.1 mrg r->sign = sign;
4163 1.1 mrg SET_REAL_EXP (r, exp - 16383 + 1);
4164 1.1 mrg
4165 1.1 mrg if (HOST_BITS_PER_LONG == 32)
4166 1.1 mrg {
4167 1.1 mrg r->sig[0] = image0;
4168 1.1 mrg r->sig[1] = image1;
4169 1.1 mrg r->sig[2] = image2;
4170 1.1 mrg r->sig[3] = image3;
4171 1.1 mrg }
4172 1.1 mrg else
4173 1.1 mrg {
4174 1.1 mrg r->sig[0] = (image1 << 31 << 1) | image0;
4175 1.1 mrg r->sig[1] = (image3 << 31 << 1) | image2;
4176 1.1 mrg }
4177 1.1 mrg lshift_significand (r, r, SIGNIFICAND_BITS - 113);
4178 1.1 mrg r->sig[SIGSZ-1] |= SIG_MSB;
4179 1.1 mrg }
4180 1.1 mrg }
4181 1.1 mrg
4182 1.1 mrg const struct real_format ieee_quad_format =
4183 1.1 mrg {
4184 1.1 mrg encode_ieee_quad,
4185 1.1 mrg decode_ieee_quad,
4186 1.1 mrg 2,
4187 1.1 mrg 113,
4188 1.1 mrg 113,
4189 1.1 mrg -16381,
4190 1.1 mrg 16384,
4191 1.1 mrg 127,
4192 1.1 mrg 127,
4193 1.1 mrg 128,
4194 1.1 mrg false,
4195 1.1 mrg true,
4196 1.1 mrg true,
4197 1.1 mrg true,
4198 1.1 mrg true,
4199 1.1 mrg true,
4200 1.1 mrg true,
4201 1.1 mrg false,
4202 1.1 mrg "ieee_quad"
4203 1.1 mrg };
4204 1.1 mrg
4205 1.1 mrg const struct real_format mips_quad_format =
4206 1.1 mrg {
4207 1.1 mrg encode_ieee_quad,
4208 1.1 mrg decode_ieee_quad,
4209 1.1 mrg 2,
4210 1.1 mrg 113,
4211 1.1 mrg 113,
4212 1.1 mrg -16381,
4213 1.1 mrg 16384,
4214 1.1 mrg 127,
4215 1.1 mrg 127,
4216 1.1 mrg 128,
4217 1.1 mrg false,
4218 1.1 mrg true,
4219 1.1 mrg true,
4220 1.1 mrg true,
4221 1.1 mrg true,
4222 1.1 mrg true,
4223 1.1 mrg false,
4224 1.1 mrg true,
4225 1.1 mrg "mips_quad"
4226 1.1 mrg };
4227 1.1 mrg
4228 1.1 mrg /* Descriptions of VAX floating point formats can be found beginning at
4230 1.1 mrg
4231 1.1 mrg http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
4232 1.1 mrg
4233 1.1 mrg The thing to remember is that they're almost IEEE, except for word
4234 1.1 mrg order, exponent bias, and the lack of infinities, nans, and denormals.
4235 1.1 mrg
4236 1.1 mrg We don't implement the H_floating format here, simply because neither
4237 1.1 mrg the VAX or Alpha ports use it. */
4238 1.1 mrg
4239 1.1 mrg static void encode_vax_f (const struct real_format *fmt,
4240 1.1 mrg long *, const REAL_VALUE_TYPE *);
4241 1.1 mrg static void decode_vax_f (const struct real_format *,
4242 1.1 mrg REAL_VALUE_TYPE *, const long *);
4243 1.1 mrg static void encode_vax_d (const struct real_format *fmt,
4244 1.1 mrg long *, const REAL_VALUE_TYPE *);
4245 1.1 mrg static void decode_vax_d (const struct real_format *,
4246 1.1 mrg REAL_VALUE_TYPE *, const long *);
4247 1.1 mrg static void encode_vax_g (const struct real_format *fmt,
4248 1.1 mrg long *, const REAL_VALUE_TYPE *);
4249 1.1 mrg static void decode_vax_g (const struct real_format *,
4250 1.1 mrg REAL_VALUE_TYPE *, const long *);
4251 1.1 mrg
4252 1.1 mrg static void
4253 1.1 mrg encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4254 1.1 mrg const REAL_VALUE_TYPE *r)
4255 1.1 mrg {
4256 1.1 mrg unsigned long sign, exp, sig, image;
4257 1.1 mrg
4258 1.1 mrg sign = r->sign << 15;
4259 1.1 mrg
4260 1.1 mrg switch (r->cl)
4261 1.1 mrg {
4262 1.1 mrg case rvc_zero:
4263 1.1 mrg image = 0;
4264 1.1 mrg break;
4265 1.1 mrg
4266 1.1 mrg case rvc_inf:
4267 1.1 mrg case rvc_nan:
4268 1.1 mrg image = 0xffff7fff | sign;
4269 1.1 mrg break;
4270 1.1 mrg
4271 1.1 mrg case rvc_normal:
4272 1.1 mrg sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4273 1.1 mrg exp = REAL_EXP (r) + 128;
4274 1.1 mrg
4275 1.1 mrg image = (sig << 16) & 0xffff0000;
4276 1.1 mrg image |= sign;
4277 1.1 mrg image |= exp << 7;
4278 1.1 mrg image |= sig >> 16;
4279 1.1 mrg break;
4280 1.1 mrg
4281 1.1 mrg default:
4282 1.1 mrg gcc_unreachable ();
4283 1.1 mrg }
4284 1.1 mrg
4285 1.1 mrg buf[0] = image;
4286 1.1 mrg }
4287 1.1 mrg
4288 1.1 mrg static void
4289 1.1 mrg decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
4290 1.1 mrg REAL_VALUE_TYPE *r, const long *buf)
4291 1.1 mrg {
4292 1.1 mrg unsigned long image = buf[0] & 0xffffffff;
4293 1.1 mrg int exp = (image >> 7) & 0xff;
4294 1.1 mrg
4295 1.1 mrg memset (r, 0, sizeof (*r));
4296 1.1 mrg
4297 1.1 mrg if (exp != 0)
4298 1.1 mrg {
4299 1.1 mrg r->cl = rvc_normal;
4300 1.1 mrg r->sign = (image >> 15) & 1;
4301 1.1 mrg SET_REAL_EXP (r, exp - 128);
4302 1.1 mrg
4303 1.1 mrg image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
4304 1.1 mrg r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4305 1.1 mrg }
4306 1.1 mrg }
4307 1.1 mrg
4308 1.1 mrg static void
4309 1.1 mrg encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4310 1.1 mrg const REAL_VALUE_TYPE *r)
4311 1.1 mrg {
4312 1.1 mrg unsigned long image0, image1, sign = r->sign << 15;
4313 1.1 mrg
4314 1.1 mrg switch (r->cl)
4315 1.1 mrg {
4316 1.1 mrg case rvc_zero:
4317 1.1 mrg image0 = image1 = 0;
4318 1.1 mrg break;
4319 1.1 mrg
4320 1.1 mrg case rvc_inf:
4321 1.1 mrg case rvc_nan:
4322 1.1 mrg image0 = 0xffff7fff | sign;
4323 1.1 mrg image1 = 0xffffffff;
4324 1.1 mrg break;
4325 1.1 mrg
4326 1.1 mrg case rvc_normal:
4327 1.1 mrg /* Extract the significand into straight hi:lo. */
4328 1.1 mrg if (HOST_BITS_PER_LONG == 64)
4329 1.1 mrg {
4330 1.1 mrg image0 = r->sig[SIGSZ-1];
4331 1.1 mrg image1 = (image0 >> (64 - 56)) & 0xffffffff;
4332 1.1 mrg image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
4333 1.1 mrg }
4334 1.1 mrg else
4335 1.1 mrg {
4336 1.1 mrg image0 = r->sig[SIGSZ-1];
4337 1.1 mrg image1 = r->sig[SIGSZ-2];
4338 1.1 mrg image1 = (image0 << 24) | (image1 >> 8);
4339 1.1 mrg image0 = (image0 >> 8) & 0xffffff;
4340 1.1 mrg }
4341 1.1 mrg
4342 1.1 mrg /* Rearrange the half-words of the significand to match the
4343 1.1 mrg external format. */
4344 1.1 mrg image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
4345 1.1 mrg image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4346 1.1 mrg
4347 1.1 mrg /* Add the sign and exponent. */
4348 1.1 mrg image0 |= sign;
4349 1.1 mrg image0 |= (REAL_EXP (r) + 128) << 7;
4350 1.1 mrg break;
4351 1.1 mrg
4352 1.1 mrg default:
4353 1.1 mrg gcc_unreachable ();
4354 1.1 mrg }
4355 1.1 mrg
4356 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN)
4357 1.1 mrg buf[0] = image1, buf[1] = image0;
4358 1.1 mrg else
4359 1.1 mrg buf[0] = image0, buf[1] = image1;
4360 1.1 mrg }
4361 1.1 mrg
4362 1.1 mrg static void
4363 1.1 mrg decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
4364 1.1 mrg REAL_VALUE_TYPE *r, const long *buf)
4365 1.1 mrg {
4366 1.1 mrg unsigned long image0, image1;
4367 1.1 mrg int exp;
4368 1.1 mrg
4369 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN)
4370 1.1 mrg image1 = buf[0], image0 = buf[1];
4371 1.1 mrg else
4372 1.1 mrg image0 = buf[0], image1 = buf[1];
4373 1.1 mrg image0 &= 0xffffffff;
4374 1.1 mrg image1 &= 0xffffffff;
4375 1.1 mrg
4376 1.1 mrg exp = (image0 >> 7) & 0xff;
4377 1.1 mrg
4378 1.1 mrg memset (r, 0, sizeof (*r));
4379 1.1 mrg
4380 1.1 mrg if (exp != 0)
4381 1.1 mrg {
4382 1.1 mrg r->cl = rvc_normal;
4383 1.1 mrg r->sign = (image0 >> 15) & 1;
4384 1.1 mrg SET_REAL_EXP (r, exp - 128);
4385 1.1 mrg
4386 1.1 mrg /* Rearrange the half-words of the external format into
4387 1.1 mrg proper ascending order. */
4388 1.1 mrg image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
4389 1.1 mrg image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4390 1.1 mrg
4391 1.1 mrg if (HOST_BITS_PER_LONG == 64)
4392 1.1 mrg {
4393 1.1 mrg image0 = (image0 << 31 << 1) | image1;
4394 1.1 mrg image0 <<= 64 - 56;
4395 1.1 mrg image0 |= SIG_MSB;
4396 1.1 mrg r->sig[SIGSZ-1] = image0;
4397 1.1 mrg }
4398 1.1 mrg else
4399 1.1 mrg {
4400 1.1 mrg r->sig[SIGSZ-1] = image0;
4401 1.1 mrg r->sig[SIGSZ-2] = image1;
4402 1.1 mrg lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
4403 1.1 mrg r->sig[SIGSZ-1] |= SIG_MSB;
4404 1.1 mrg }
4405 1.1 mrg }
4406 1.1 mrg }
4407 1.1 mrg
4408 1.1 mrg static void
4409 1.1 mrg encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4410 1.1 mrg const REAL_VALUE_TYPE *r)
4411 1.1 mrg {
4412 1.1 mrg unsigned long image0, image1, sign = r->sign << 15;
4413 1.1 mrg
4414 1.1 mrg switch (r->cl)
4415 1.1 mrg {
4416 1.1 mrg case rvc_zero:
4417 1.1 mrg image0 = image1 = 0;
4418 1.1 mrg break;
4419 1.1 mrg
4420 1.1 mrg case rvc_inf:
4421 1.1 mrg case rvc_nan:
4422 1.1 mrg image0 = 0xffff7fff | sign;
4423 1.1 mrg image1 = 0xffffffff;
4424 1.1 mrg break;
4425 1.1 mrg
4426 1.1 mrg case rvc_normal:
4427 1.1 mrg /* Extract the significand into straight hi:lo. */
4428 1.1 mrg if (HOST_BITS_PER_LONG == 64)
4429 1.1 mrg {
4430 1.1 mrg image0 = r->sig[SIGSZ-1];
4431 1.1 mrg image1 = (image0 >> (64 - 53)) & 0xffffffff;
4432 1.1 mrg image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
4433 1.1 mrg }
4434 1.1 mrg else
4435 1.1 mrg {
4436 1.1 mrg image0 = r->sig[SIGSZ-1];
4437 1.1 mrg image1 = r->sig[SIGSZ-2];
4438 1.1 mrg image1 = (image0 << 21) | (image1 >> 11);
4439 1.1 mrg image0 = (image0 >> 11) & 0xfffff;
4440 1.1 mrg }
4441 1.1 mrg
4442 1.1 mrg /* Rearrange the half-words of the significand to match the
4443 1.1 mrg external format. */
4444 1.1 mrg image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
4445 1.1 mrg image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4446 1.1 mrg
4447 1.1 mrg /* Add the sign and exponent. */
4448 1.1 mrg image0 |= sign;
4449 1.1 mrg image0 |= (REAL_EXP (r) + 1024) << 4;
4450 1.1 mrg break;
4451 1.1 mrg
4452 1.1 mrg default:
4453 1.1 mrg gcc_unreachable ();
4454 1.1 mrg }
4455 1.1 mrg
4456 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN)
4457 1.1 mrg buf[0] = image1, buf[1] = image0;
4458 1.1 mrg else
4459 1.1 mrg buf[0] = image0, buf[1] = image1;
4460 1.1 mrg }
4461 1.1 mrg
4462 1.1 mrg static void
4463 1.1 mrg decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
4464 1.1 mrg REAL_VALUE_TYPE *r, const long *buf)
4465 1.1 mrg {
4466 1.1 mrg unsigned long image0, image1;
4467 1.1 mrg int exp;
4468 1.1 mrg
4469 1.1 mrg if (FLOAT_WORDS_BIG_ENDIAN)
4470 1.1 mrg image1 = buf[0], image0 = buf[1];
4471 1.1 mrg else
4472 1.1 mrg image0 = buf[0], image1 = buf[1];
4473 1.1 mrg image0 &= 0xffffffff;
4474 1.1 mrg image1 &= 0xffffffff;
4475 1.1 mrg
4476 1.1 mrg exp = (image0 >> 4) & 0x7ff;
4477 1.1 mrg
4478 1.1 mrg memset (r, 0, sizeof (*r));
4479 1.1 mrg
4480 1.1 mrg if (exp != 0)
4481 1.1 mrg {
4482 1.1 mrg r->cl = rvc_normal;
4483 1.1 mrg r->sign = (image0 >> 15) & 1;
4484 1.1 mrg SET_REAL_EXP (r, exp - 1024);
4485 1.1 mrg
4486 1.1 mrg /* Rearrange the half-words of the external format into
4487 1.1 mrg proper ascending order. */
4488 1.1 mrg image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
4489 1.1 mrg image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4490 1.1 mrg
4491 1.1 mrg if (HOST_BITS_PER_LONG == 64)
4492 1.1 mrg {
4493 1.1 mrg image0 = (image0 << 31 << 1) | image1;
4494 1.1 mrg image0 <<= 64 - 53;
4495 1.1 mrg image0 |= SIG_MSB;
4496 1.1 mrg r->sig[SIGSZ-1] = image0;
4497 1.1 mrg }
4498 1.1 mrg else
4499 1.1 mrg {
4500 1.1 mrg r->sig[SIGSZ-1] = image0;
4501 1.1 mrg r->sig[SIGSZ-2] = image1;
4502 1.1 mrg lshift_significand (r, r, 64 - 53);
4503 1.1 mrg r->sig[SIGSZ-1] |= SIG_MSB;
4504 1.1 mrg }
4505 1.1 mrg }
4506 1.1 mrg }
4507 1.1 mrg
4508 1.1 mrg const struct real_format vax_f_format =
4509 1.1 mrg {
4510 1.1 mrg encode_vax_f,
4511 1.1 mrg decode_vax_f,
4512 1.1 mrg 2,
4513 1.1 mrg 24,
4514 1.1 mrg 24,
4515 1.1 mrg -127,
4516 1.1 mrg 127,
4517 1.1 mrg 15,
4518 1.1 mrg 15,
4519 1.1 mrg 0,
4520 1.1 mrg false,
4521 1.1 mrg false,
4522 1.1 mrg false,
4523 1.1 mrg false,
4524 1.1 mrg false,
4525 1.1 mrg false,
4526 1.1 mrg false,
4527 1.1 mrg false,
4528 1.1 mrg "vax_f"
4529 1.1 mrg };
4530 1.1 mrg
4531 1.1 mrg const struct real_format vax_d_format =
4532 1.1 mrg {
4533 1.1 mrg encode_vax_d,
4534 1.1 mrg decode_vax_d,
4535 1.1 mrg 2,
4536 1.1 mrg 56,
4537 1.1 mrg 56,
4538 1.1 mrg -127,
4539 1.1 mrg 127,
4540 1.1 mrg 15,
4541 1.1 mrg 15,
4542 1.1 mrg 0,
4543 1.1 mrg false,
4544 1.1 mrg false,
4545 1.1 mrg false,
4546 1.1 mrg false,
4547 1.1 mrg false,
4548 1.1 mrg false,
4549 1.1 mrg false,
4550 1.1 mrg false,
4551 1.1 mrg "vax_d"
4552 1.1 mrg };
4553 1.1 mrg
4554 1.1 mrg const struct real_format vax_g_format =
4555 1.1 mrg {
4556 1.1 mrg encode_vax_g,
4557 1.1 mrg decode_vax_g,
4558 1.1 mrg 2,
4559 1.1 mrg 53,
4560 1.1 mrg 53,
4561 1.1 mrg -1023,
4562 1.1 mrg 1023,
4563 1.1 mrg 15,
4564 1.1 mrg 15,
4565 1.1 mrg 0,
4566 1.1 mrg false,
4567 1.1 mrg false,
4568 1.1 mrg false,
4569 1.1 mrg false,
4570 1.1 mrg false,
4571 1.1 mrg false,
4572 1.1 mrg false,
4573 1.1 mrg false,
4574 1.1 mrg "vax_g"
4575 1.1 mrg };
4576 1.1 mrg
4577 1.1 mrg /* Encode real R into a single precision DFP value in BUF. */
4579 1.1 mrg static void
4580 1.1 mrg encode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4581 1.1 mrg long *buf ATTRIBUTE_UNUSED,
4582 1.1 mrg const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4583 1.1 mrg {
4584 1.1 mrg encode_decimal32 (fmt, buf, r);
4585 1.1 mrg }
4586 1.1 mrg
4587 1.1 mrg /* Decode a single precision DFP value in BUF into a real R. */
4588 1.1 mrg static void
4589 1.1 mrg decode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4590 1.1 mrg REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4591 1.1 mrg const long *buf ATTRIBUTE_UNUSED)
4592 1.1 mrg {
4593 1.1 mrg decode_decimal32 (fmt, r, buf);
4594 1.1 mrg }
4595 1.1 mrg
4596 1.1 mrg /* Encode real R into a double precision DFP value in BUF. */
4597 1.1 mrg static void
4598 1.1 mrg encode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4599 1.1 mrg long *buf ATTRIBUTE_UNUSED,
4600 1.1 mrg const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4601 1.1 mrg {
4602 1.1 mrg encode_decimal64 (fmt, buf, r);
4603 1.1 mrg }
4604 1.1 mrg
4605 1.1 mrg /* Decode a double precision DFP value in BUF into a real R. */
4606 1.1 mrg static void
4607 1.1 mrg decode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4608 1.1 mrg REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4609 1.1 mrg const long *buf ATTRIBUTE_UNUSED)
4610 1.1 mrg {
4611 1.1 mrg decode_decimal64 (fmt, r, buf);
4612 1.1 mrg }
4613 1.1 mrg
4614 1.1 mrg /* Encode real R into a quad precision DFP value in BUF. */
4615 1.1 mrg static void
4616 1.1 mrg encode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4617 1.1 mrg long *buf ATTRIBUTE_UNUSED,
4618 1.1 mrg const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4619 1.1 mrg {
4620 1.1 mrg encode_decimal128 (fmt, buf, r);
4621 1.1 mrg }
4622 1.1 mrg
4623 1.1 mrg /* Decode a quad precision DFP value in BUF into a real R. */
4624 1.1 mrg static void
4625 1.1 mrg decode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4626 1.1 mrg REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4627 1.1 mrg const long *buf ATTRIBUTE_UNUSED)
4628 1.1 mrg {
4629 1.1 mrg decode_decimal128 (fmt, r, buf);
4630 1.1 mrg }
4631 1.1 mrg
4632 1.1 mrg /* Single precision decimal floating point (IEEE 754). */
4633 1.1 mrg const struct real_format decimal_single_format =
4634 1.1 mrg {
4635 1.1 mrg encode_decimal_single,
4636 1.1 mrg decode_decimal_single,
4637 1.1 mrg 10,
4638 1.1 mrg 7,
4639 1.1 mrg 7,
4640 1.1 mrg -94,
4641 1.1 mrg 97,
4642 1.1 mrg 31,
4643 1.1 mrg 31,
4644 1.1 mrg 32,
4645 1.1 mrg false,
4646 1.1 mrg true,
4647 1.1 mrg true,
4648 1.1 mrg true,
4649 1.1 mrg true,
4650 1.1 mrg true,
4651 1.1 mrg true,
4652 1.1 mrg false,
4653 1.1 mrg "decimal_single"
4654 1.1 mrg };
4655 1.1 mrg
4656 1.1 mrg /* Double precision decimal floating point (IEEE 754). */
4657 1.1 mrg const struct real_format decimal_double_format =
4658 1.1 mrg {
4659 1.1 mrg encode_decimal_double,
4660 1.1 mrg decode_decimal_double,
4661 1.1 mrg 10,
4662 1.1 mrg 16,
4663 1.1 mrg 16,
4664 1.1 mrg -382,
4665 1.1 mrg 385,
4666 1.1 mrg 63,
4667 1.1 mrg 63,
4668 1.1 mrg 64,
4669 1.1 mrg false,
4670 1.1 mrg true,
4671 1.1 mrg true,
4672 1.1 mrg true,
4673 1.1 mrg true,
4674 1.1 mrg true,
4675 1.1 mrg true,
4676 1.1 mrg false,
4677 1.1 mrg "decimal_double"
4678 1.1 mrg };
4679 1.1 mrg
4680 1.1 mrg /* Quad precision decimal floating point (IEEE 754). */
4681 1.1 mrg const struct real_format decimal_quad_format =
4682 1.1 mrg {
4683 1.1 mrg encode_decimal_quad,
4684 1.1 mrg decode_decimal_quad,
4685 1.1 mrg 10,
4686 1.1 mrg 34,
4687 1.1 mrg 34,
4688 1.1 mrg -6142,
4689 1.1 mrg 6145,
4690 1.1 mrg 127,
4691 1.1 mrg 127,
4692 1.1 mrg 128,
4693 1.1 mrg false,
4694 1.1 mrg true,
4695 1.1 mrg true,
4696 1.1 mrg true,
4697 1.1 mrg true,
4698 1.1 mrg true,
4699 1.1 mrg true,
4700 1.1 mrg false,
4701 1.1 mrg "decimal_quad"
4702 1.1 mrg };
4703 1.1 mrg
4704 1.1 mrg /* Encode half-precision floats. This routine is used both for the IEEE
4706 1.1 mrg ARM alternative encodings. */
4707 1.1 mrg static void
4708 1.1 mrg encode_ieee_half (const struct real_format *fmt, long *buf,
4709 1.1 mrg const REAL_VALUE_TYPE *r)
4710 1.1 mrg {
4711 1.1 mrg unsigned long image, sig, exp;
4712 1.1 mrg unsigned long sign = r->sign;
4713 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
4714 1.1 mrg
4715 1.1 mrg image = sign << 15;
4716 1.1 mrg sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 11)) & 0x3ff;
4717 1.1 mrg
4718 1.1 mrg switch (r->cl)
4719 1.1 mrg {
4720 1.1 mrg case rvc_zero:
4721 1.1 mrg break;
4722 1.1 mrg
4723 1.1 mrg case rvc_inf:
4724 1.1 mrg if (fmt->has_inf)
4725 1.1 mrg image |= 31 << 10;
4726 1.1 mrg else
4727 1.1 mrg image |= 0x7fff;
4728 1.1 mrg break;
4729 1.1 mrg
4730 1.1 mrg case rvc_nan:
4731 1.1 mrg if (fmt->has_nans)
4732 1.1 mrg {
4733 1.1 mrg if (r->canonical)
4734 1.1 mrg sig = (fmt->canonical_nan_lsbs_set ? (1 << 9) - 1 : 0);
4735 1.1 mrg if (r->signalling == fmt->qnan_msb_set)
4736 1.1 mrg sig &= ~(1 << 9);
4737 1.1 mrg else
4738 1.1 mrg sig |= 1 << 9;
4739 1.1 mrg if (sig == 0)
4740 1.1 mrg sig = 1 << 8;
4741 1.1 mrg
4742 1.1 mrg image |= 31 << 10;
4743 1.1 mrg image |= sig;
4744 1.1 mrg }
4745 1.1 mrg else
4746 1.1 mrg image |= 0x3ff;
4747 1.1 mrg break;
4748 1.1 mrg
4749 1.1 mrg case rvc_normal:
4750 1.1 mrg /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
4751 1.1 mrg whereas the intermediate representation is 0.F x 2**exp.
4752 1.1 mrg Which means we're off by one. */
4753 1.1 mrg if (denormal)
4754 1.1 mrg exp = 0;
4755 1.1 mrg else
4756 1.1 mrg exp = REAL_EXP (r) + 15 - 1;
4757 1.1 mrg image |= exp << 10;
4758 1.1 mrg image |= sig;
4759 1.1 mrg break;
4760 1.1 mrg
4761 1.1 mrg default:
4762 1.1 mrg gcc_unreachable ();
4763 1.1 mrg }
4764 1.1 mrg
4765 1.1 mrg buf[0] = image;
4766 1.1 mrg }
4767 1.1 mrg
4768 1.1 mrg /* Decode half-precision floats. This routine is used both for the IEEE
4769 1.1 mrg ARM alternative encodings. */
4770 1.1 mrg static void
4771 1.1 mrg decode_ieee_half (const struct real_format *fmt, REAL_VALUE_TYPE *r,
4772 1.1 mrg const long *buf)
4773 1.1 mrg {
4774 1.1 mrg unsigned long image = buf[0] & 0xffff;
4775 1.1 mrg bool sign = (image >> 15) & 1;
4776 1.1 mrg int exp = (image >> 10) & 0x1f;
4777 1.1 mrg
4778 1.1 mrg memset (r, 0, sizeof (*r));
4779 1.1 mrg image <<= HOST_BITS_PER_LONG - 11;
4780 1.1 mrg image &= ~SIG_MSB;
4781 1.1 mrg
4782 1.1 mrg if (exp == 0)
4783 1.1 mrg {
4784 1.1 mrg if (image && fmt->has_denorm)
4785 1.1 mrg {
4786 1.1 mrg r->cl = rvc_normal;
4787 1.1 mrg r->sign = sign;
4788 1.1 mrg SET_REAL_EXP (r, -14);
4789 1.1 mrg r->sig[SIGSZ-1] = image << 1;
4790 1.1 mrg normalize (r);
4791 1.1 mrg }
4792 1.1 mrg else if (fmt->has_signed_zero)
4793 1.1 mrg r->sign = sign;
4794 1.1 mrg }
4795 1.1 mrg else if (exp == 31 && (fmt->has_nans || fmt->has_inf))
4796 1.1 mrg {
4797 1.1 mrg if (image)
4798 1.1 mrg {
4799 1.1 mrg r->cl = rvc_nan;
4800 1.1 mrg r->sign = sign;
4801 1.1 mrg r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
4802 1.1 mrg ^ fmt->qnan_msb_set);
4803 1.1 mrg r->sig[SIGSZ-1] = image;
4804 1.1 mrg }
4805 1.1 mrg else
4806 1.1 mrg {
4807 1.1 mrg r->cl = rvc_inf;
4808 1.1 mrg r->sign = sign;
4809 1.1 mrg }
4810 1.1 mrg }
4811 1.1 mrg else
4812 1.1 mrg {
4813 1.1 mrg r->cl = rvc_normal;
4814 1.1 mrg r->sign = sign;
4815 1.1 mrg SET_REAL_EXP (r, exp - 15 + 1);
4816 1.1 mrg r->sig[SIGSZ-1] = image | SIG_MSB;
4817 1.1 mrg }
4818 1.1 mrg }
4819 1.1 mrg
4820 1.1 mrg /* Encode arm_bfloat types. */
4821 1.1 mrg static void
4822 1.1 mrg encode_arm_bfloat_half (const struct real_format *fmt, long *buf,
4823 1.1 mrg const REAL_VALUE_TYPE *r)
4824 1.1 mrg {
4825 1.1 mrg unsigned long image, sig, exp;
4826 1.1 mrg unsigned long sign = r->sign;
4827 1.1 mrg bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
4828 1.1 mrg
4829 1.1 mrg image = sign << 15;
4830 1.1 mrg sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 8)) & 0x7f;
4831 1.1 mrg
4832 1.1 mrg switch (r->cl)
4833 1.1 mrg {
4834 1.1 mrg case rvc_zero:
4835 1.1 mrg break;
4836 1.1 mrg
4837 1.1 mrg case rvc_inf:
4838 1.1 mrg if (fmt->has_inf)
4839 1.1 mrg image |= 255 << 7;
4840 1.1 mrg else
4841 1.1 mrg image |= 0x7fff;
4842 1.1 mrg break;
4843 1.1 mrg
4844 1.1 mrg case rvc_nan:
4845 1.1 mrg if (fmt->has_nans)
4846 1.1 mrg {
4847 1.1 mrg if (r->canonical)
4848 1.1 mrg sig = (fmt->canonical_nan_lsbs_set ? (1 << 6) - 1 : 0);
4849 1.1 mrg if (r->signalling == fmt->qnan_msb_set)
4850 1.1 mrg sig &= ~(1 << 6);
4851 1.1 mrg else
4852 1.1 mrg sig |= 1 << 6;
4853 1.1 mrg if (sig == 0)
4854 1.1 mrg sig = 1 << 5;
4855 1.1 mrg
4856 1.1 mrg image |= 255 << 7;
4857 1.1 mrg image |= sig;
4858 1.1 mrg }
4859 1.1 mrg else
4860 1.1 mrg image |= 0x7fff;
4861 1.1 mrg break;
4862 1.1 mrg
4863 1.1 mrg case rvc_normal:
4864 1.1 mrg if (denormal)
4865 1.1 mrg exp = 0;
4866 1.1 mrg else
4867 1.1 mrg exp = REAL_EXP (r) + 127 - 1;
4868 1.1 mrg image |= exp << 7;
4869 1.1 mrg image |= sig;
4870 1.1 mrg break;
4871 1.1 mrg
4872 1.1 mrg default:
4873 1.1 mrg gcc_unreachable ();
4874 1.1 mrg }
4875 1.1 mrg
4876 1.1 mrg buf[0] = image;
4877 1.1 mrg }
4878 1.1 mrg
4879 1.1 mrg /* Decode arm_bfloat types. */
4880 1.1 mrg static void
4881 1.1 mrg decode_arm_bfloat_half (const struct real_format *fmt, REAL_VALUE_TYPE *r,
4882 1.1 mrg const long *buf)
4883 1.1 mrg {
4884 1.1 mrg unsigned long image = buf[0] & 0xffff;
4885 1.1 mrg bool sign = (image >> 15) & 1;
4886 1.1 mrg int exp = (image >> 7) & 0xff;
4887 1.1 mrg
4888 1.1 mrg memset (r, 0, sizeof (*r));
4889 1.1 mrg image <<= HOST_BITS_PER_LONG - 8;
4890 1.1 mrg image &= ~SIG_MSB;
4891 1.1 mrg
4892 1.1 mrg if (exp == 0)
4893 1.1 mrg {
4894 1.1 mrg if (image && fmt->has_denorm)
4895 1.1 mrg {
4896 1.1 mrg r->cl = rvc_normal;
4897 1.1 mrg r->sign = sign;
4898 1.1 mrg SET_REAL_EXP (r, -126);
4899 1.1 mrg r->sig[SIGSZ-1] = image << 1;
4900 1.1 mrg normalize (r);
4901 1.1 mrg }
4902 1.1 mrg else if (fmt->has_signed_zero)
4903 1.1 mrg r->sign = sign;
4904 1.1 mrg }
4905 1.1 mrg else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
4906 1.1 mrg {
4907 1.1 mrg if (image)
4908 1.1 mrg {
4909 1.1 mrg r->cl = rvc_nan;
4910 1.1 mrg r->sign = sign;
4911 1.1 mrg r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
4912 1.1 mrg ^ fmt->qnan_msb_set);
4913 1.1 mrg r->sig[SIGSZ-1] = image;
4914 1.1 mrg }
4915 1.1 mrg else
4916 1.1 mrg {
4917 1.1 mrg r->cl = rvc_inf;
4918 1.1 mrg r->sign = sign;
4919 1.1 mrg }
4920 1.1 mrg }
4921 1.1 mrg else
4922 1.1 mrg {
4923 1.1 mrg r->cl = rvc_normal;
4924 1.1 mrg r->sign = sign;
4925 1.1 mrg SET_REAL_EXP (r, exp - 127 + 1);
4926 1.1 mrg r->sig[SIGSZ-1] = image | SIG_MSB;
4927 1.1 mrg }
4928 1.1 mrg }
4929 1.1 mrg
4930 1.1 mrg /* Half-precision format, as specified in IEEE 754R. */
4931 1.1 mrg const struct real_format ieee_half_format =
4932 1.1 mrg {
4933 1.1 mrg encode_ieee_half,
4934 1.1 mrg decode_ieee_half,
4935 1.1 mrg 2,
4936 1.1 mrg 11,
4937 1.1 mrg 11,
4938 1.1 mrg -13,
4939 1.1 mrg 16,
4940 1.1 mrg 15,
4941 1.1 mrg 15,
4942 1.1 mrg 16,
4943 1.1 mrg false,
4944 1.1 mrg true,
4945 1.1 mrg true,
4946 1.1 mrg true,
4947 1.1 mrg true,
4948 1.1 mrg true,
4949 1.1 mrg true,
4950 1.1 mrg false,
4951 1.1 mrg "ieee_half"
4952 1.1 mrg };
4953 1.1 mrg
4954 1.1 mrg /* ARM's alternative half-precision format, similar to IEEE but with
4955 1.1 mrg no reserved exponent value for NaNs and infinities; rather, it just
4956 1.1 mrg extends the range of exponents by one. */
4957 1.1 mrg const struct real_format arm_half_format =
4958 1.1 mrg {
4959 1.1 mrg encode_ieee_half,
4960 1.1 mrg decode_ieee_half,
4961 1.1 mrg 2,
4962 1.1 mrg 11,
4963 1.1 mrg 11,
4964 1.1 mrg -13,
4965 1.1 mrg 17,
4966 1.1 mrg 15,
4967 1.1 mrg 15,
4968 1.1 mrg 0,
4969 1.1 mrg false,
4970 1.1 mrg true,
4971 1.1 mrg false,
4972 1.1 mrg false,
4973 1.1 mrg true,
4974 1.1 mrg true,
4975 1.1 mrg false,
4976 1.1 mrg false,
4977 1.1 mrg "arm_half"
4978 1.1 mrg };
4979 1.1 mrg
4980 1.1 mrg /* ARM Bfloat half-precision format. This format resembles a truncated
4981 1.1 mrg (16-bit) version of the 32-bit IEEE 754 single-precision floating-point
4982 1.1 mrg format. */
4983 1.1 mrg const struct real_format arm_bfloat_half_format =
4984 1.1 mrg {
4985 1.1 mrg encode_arm_bfloat_half,
4986 1.1 mrg decode_arm_bfloat_half,
4987 1.1 mrg 2,
4988 1.1 mrg 8,
4989 1.1 mrg 8,
4990 1.1 mrg -125,
4991 1.1 mrg 128,
4992 1.1 mrg 15,
4993 1.1 mrg 15,
4994 1.1 mrg 0,
4995 1.1 mrg false,
4996 1.1 mrg true,
4997 1.1 mrg true,
4998 1.1 mrg true,
4999 1.1 mrg true,
5000 1.1 mrg true,
5001 1.1 mrg true,
5002 1.1 mrg false,
5003 1.1 mrg "arm_bfloat_half"
5004 1.1 mrg };
5005 1.1 mrg
5006 1.1 mrg
5007 1.1 mrg /* A synthetic "format" for internal arithmetic. It's the size of the
5009 1.1 mrg internal significand minus the two bits needed for proper rounding.
5010 1.1 mrg The encode and decode routines exist only to satisfy our paranoia
5011 1.1 mrg harness. */
5012 1.1 mrg
5013 1.1 mrg static void encode_internal (const struct real_format *fmt,
5014 1.1 mrg long *, const REAL_VALUE_TYPE *);
5015 1.1 mrg static void decode_internal (const struct real_format *,
5016 1.1 mrg REAL_VALUE_TYPE *, const long *);
5017 1.1 mrg
5018 1.1 mrg static void
5019 1.1 mrg encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
5020 1.1 mrg const REAL_VALUE_TYPE *r)
5021 1.1 mrg {
5022 1.1 mrg memcpy (buf, r, sizeof (*r));
5023 1.1 mrg }
5024 1.1 mrg
5025 1.1 mrg static void
5026 1.1 mrg decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
5027 1.1 mrg REAL_VALUE_TYPE *r, const long *buf)
5028 1.1 mrg {
5029 1.1 mrg memcpy (r, buf, sizeof (*r));
5030 1.1 mrg }
5031 1.1 mrg
5032 1.1 mrg const struct real_format real_internal_format =
5033 1.1 mrg {
5034 1.1 mrg encode_internal,
5035 1.1 mrg decode_internal,
5036 1.1 mrg 2,
5037 1.1 mrg SIGNIFICAND_BITS - 2,
5038 1.1 mrg SIGNIFICAND_BITS - 2,
5039 1.1 mrg -MAX_EXP,
5040 1.1 mrg MAX_EXP,
5041 1.1 mrg -1,
5042 1.1 mrg -1,
5043 1.1 mrg 0,
5044 1.1 mrg false,
5045 1.1 mrg false,
5046 1.1 mrg true,
5047 1.1 mrg true,
5048 1.1 mrg false,
5049 1.1 mrg true,
5050 1.1 mrg true,
5051 1.1 mrg false,
5052 1.1 mrg "real_internal"
5053 1.1 mrg };
5054 1.1 mrg
5055 1.1 mrg /* Calculate X raised to the integer exponent N in format FMT and store
5057 1.1 mrg the result in R. Return true if the result may be inexact due to
5058 1.1 mrg loss of precision. The algorithm is the classic "left-to-right binary
5059 1.1 mrg method" described in section 4.6.3 of Donald Knuth's "Seminumerical
5060 1.1 mrg Algorithms", "The Art of Computer Programming", Volume 2. */
5061 1.1 mrg
5062 1.1 mrg bool
5063 1.1 mrg real_powi (REAL_VALUE_TYPE *r, format_helper fmt,
5064 1.1 mrg const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
5065 1.1 mrg {
5066 1.1 mrg unsigned HOST_WIDE_INT bit;
5067 1.1 mrg REAL_VALUE_TYPE t;
5068 1.1 mrg bool inexact = false;
5069 1.1 mrg bool init = false;
5070 1.1 mrg bool neg;
5071 1.1 mrg int i;
5072 1.1 mrg
5073 1.1 mrg if (n == 0)
5074 1.1 mrg {
5075 1.1 mrg *r = dconst1;
5076 1.1 mrg return false;
5077 1.1 mrg }
5078 1.1 mrg else if (n < 0)
5079 1.1 mrg {
5080 1.1 mrg /* Don't worry about overflow, from now on n is unsigned. */
5081 1.1 mrg neg = true;
5082 1.1 mrg n = -n;
5083 1.1 mrg }
5084 1.1 mrg else
5085 1.1 mrg neg = false;
5086 1.1 mrg
5087 1.1 mrg t = *x;
5088 1.1 mrg bit = HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1);
5089 1.1 mrg for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
5090 1.1 mrg {
5091 1.1 mrg if (init)
5092 1.1 mrg {
5093 1.1 mrg inexact |= do_multiply (&t, &t, &t);
5094 1.1 mrg if (n & bit)
5095 1.1 mrg inexact |= do_multiply (&t, &t, x);
5096 1.1 mrg }
5097 1.1 mrg else if (n & bit)
5098 1.1 mrg init = true;
5099 1.1 mrg bit >>= 1;
5100 1.1 mrg }
5101 1.1 mrg
5102 1.1 mrg if (neg)
5103 1.1 mrg inexact |= do_divide (&t, &dconst1, &t);
5104 1.1 mrg
5105 1.1 mrg real_convert (r, fmt, &t);
5106 1.1 mrg return inexact;
5107 1.1 mrg }
5108 1.1 mrg
5109 1.1 mrg /* Round X to the nearest integer not larger in absolute value, i.e.
5110 1.1 mrg towards zero, placing the result in R in format FMT. */
5111 1.1 mrg
5112 1.1 mrg void
5113 1.1 mrg real_trunc (REAL_VALUE_TYPE *r, format_helper fmt,
5114 1.1 mrg const REAL_VALUE_TYPE *x)
5115 1.1 mrg {
5116 1.1 mrg do_fix_trunc (r, x);
5117 1.1 mrg if (fmt)
5118 1.1 mrg real_convert (r, fmt, r);
5119 1.1 mrg }
5120 1.1 mrg
5121 1.1 mrg /* Round X to the largest integer not greater in value, i.e. round
5122 1.1 mrg down, placing the result in R in format FMT. */
5123 1.1 mrg
5124 1.1 mrg void
5125 1.1 mrg real_floor (REAL_VALUE_TYPE *r, format_helper fmt,
5126 1.1 mrg const REAL_VALUE_TYPE *x)
5127 1.1 mrg {
5128 1.1 mrg REAL_VALUE_TYPE t;
5129 1.1 mrg
5130 1.1 mrg do_fix_trunc (&t, x);
5131 1.1 mrg if (! real_identical (&t, x) && x->sign)
5132 1.1 mrg do_add (&t, &t, &dconstm1, 0);
5133 1.1 mrg if (fmt)
5134 1.1 mrg real_convert (r, fmt, &t);
5135 1.1 mrg else
5136 1.1 mrg *r = t;
5137 1.1 mrg }
5138 1.1 mrg
5139 1.1 mrg /* Round X to the smallest integer not less then argument, i.e. round
5140 1.1 mrg up, placing the result in R in format FMT. */
5141 1.1 mrg
5142 1.1 mrg void
5143 1.1 mrg real_ceil (REAL_VALUE_TYPE *r, format_helper fmt,
5144 1.1 mrg const REAL_VALUE_TYPE *x)
5145 1.1 mrg {
5146 1.1 mrg REAL_VALUE_TYPE t;
5147 1.1 mrg
5148 1.1 mrg do_fix_trunc (&t, x);
5149 1.1 mrg if (! real_identical (&t, x) && ! x->sign)
5150 1.1 mrg do_add (&t, &t, &dconst1, 0);
5151 1.1 mrg if (fmt)
5152 1.1 mrg real_convert (r, fmt, &t);
5153 1.1 mrg else
5154 1.1 mrg *r = t;
5155 1.1 mrg }
5156 1.1 mrg
5157 1.1 mrg /* Round X to the nearest integer, but round halfway cases away from
5158 1.1 mrg zero. */
5159 1.1 mrg
5160 1.1 mrg void
5161 1.1 mrg real_round (REAL_VALUE_TYPE *r, format_helper fmt,
5162 1.1 mrg const REAL_VALUE_TYPE *x)
5163 1.1 mrg {
5164 1.1 mrg do_add (r, x, &dconsthalf, x->sign);
5165 1.1 mrg do_fix_trunc (r, r);
5166 1.1 mrg if (fmt)
5167 1.1 mrg real_convert (r, fmt, r);
5168 1.1 mrg }
5169 1.1 mrg
5170 1.1 mrg /* Return true (including 0) if integer part of R is even, else return
5171 1.1 mrg false. The function is not valid for rvc_inf and rvc_nan classes. */
5172 1.1 mrg
5173 1.1 mrg static bool
5174 1.1 mrg is_even (REAL_VALUE_TYPE *r)
5175 1.1 mrg {
5176 1.1 mrg gcc_assert (r->cl != rvc_inf);
5177 1.1 mrg gcc_assert (r->cl != rvc_nan);
5178 1.1 mrg
5179 1.1 mrg if (r->cl == rvc_zero)
5180 1.1 mrg return true;
5181 1.1 mrg
5182 1.1 mrg /* For (-1,1), number is even. */
5183 1.1 mrg if (REAL_EXP (r) <= 0)
5184 1.1 mrg return true;
5185 1.1 mrg
5186 1.1 mrg /* Check lowest bit, if not set, return true. */
5187 1.1 mrg else if (REAL_EXP (r) <= SIGNIFICAND_BITS)
5188 1.1 mrg {
5189 1.1 mrg unsigned int n = SIGNIFICAND_BITS - REAL_EXP (r);
5190 1.1 mrg int w = n / HOST_BITS_PER_LONG;
5191 1.1 mrg
5192 1.1 mrg unsigned long num = ((unsigned long)1 << (n % HOST_BITS_PER_LONG));
5193 1.1 mrg
5194 1.1 mrg if ((r->sig[w] & num) == 0)
5195 1.1 mrg return true;
5196 1.1 mrg }
5197 1.1 mrg else
5198 1.1 mrg return true;
5199 1.1 mrg
5200 1.1 mrg return false;
5201 1.1 mrg }
5202 1.1 mrg
5203 1.1 mrg /* Return true if R is halfway between two integers, else return
5204 1.1 mrg false. */
5205 1.1 mrg
5206 1.1 mrg static bool
5207 1.1 mrg is_halfway_below (const REAL_VALUE_TYPE *r)
5208 1.1 mrg {
5209 1.1 mrg if (r->cl != rvc_normal)
5210 1.1 mrg return false;
5211 1.1 mrg
5212 1.1 mrg /* For numbers (-0.5,0) and (0,0.5). */
5213 1.1 mrg if (REAL_EXP (r) < 0)
5214 1.1 mrg return false;
5215 1.1 mrg
5216 1.1 mrg else if (REAL_EXP (r) < SIGNIFICAND_BITS)
5217 1.1 mrg {
5218 1.1 mrg unsigned int n = SIGNIFICAND_BITS - REAL_EXP (r) - 1;
5219 1.1 mrg int w = n / HOST_BITS_PER_LONG;
5220 1.1 mrg
5221 1.1 mrg for (int i = 0; i < w; ++i)
5222 1.1 mrg if (r->sig[i] != 0)
5223 1.1 mrg return false;
5224 1.1 mrg
5225 1.1 mrg unsigned long num = 1UL << (n % HOST_BITS_PER_LONG);
5226 1.1 mrg
5227 1.1 mrg if ((r->sig[w] & num) != 0 && (r->sig[w] & (num - 1)) == 0)
5228 1.1 mrg return true;
5229 1.1 mrg }
5230 1.1 mrg return false;
5231 1.1 mrg }
5232 1.1 mrg
5233 1.1 mrg /* Round X to nearest integer, rounding halfway cases towards even. */
5234 1.1 mrg
5235 1.1 mrg void
5236 1.1 mrg real_roundeven (REAL_VALUE_TYPE *r, format_helper fmt,
5237 1.1 mrg const REAL_VALUE_TYPE *x)
5238 1.1 mrg {
5239 1.1 mrg if (is_halfway_below (x))
5240 1.1 mrg {
5241 1.1 mrg /* Special case as -0.5 rounds to -0.0 and
5242 1.1 mrg similarly +0.5 rounds to +0.0. */
5243 1.1 mrg if (REAL_EXP (x) == 0)
5244 1.1 mrg {
5245 1.1 mrg *r = *x;
5246 1.1 mrg clear_significand_below (r, SIGNIFICAND_BITS);
5247 1.1 mrg }
5248 1.1 mrg else
5249 1.1 mrg {
5250 1.1 mrg do_add (r, x, &dconsthalf, x->sign);
5251 1.1 mrg if (!is_even (r))
5252 1.1 mrg do_add (r, r, &dconstm1, x->sign);
5253 1.1 mrg }
5254 1.1 mrg if (fmt)
5255 1.1 mrg real_convert (r, fmt, r);
5256 1.1 mrg }
5257 1.1 mrg else
5258 1.1 mrg real_round (r, fmt, x);
5259 1.1 mrg }
5260 1.1 mrg
5261 1.1 mrg /* Set the sign of R to the sign of X. */
5262 1.1 mrg
5263 1.1 mrg void
5264 1.1 mrg real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
5265 1.1 mrg {
5266 1.1 mrg r->sign = x->sign;
5267 1.1 mrg }
5268 1.1 mrg
5269 1.1 mrg /* Check whether the real constant value given is an integer.
5270 1.1 mrg Returns false for signaling NaN. */
5271 1.1 mrg
5272 1.1 mrg bool
5273 1.1 mrg real_isinteger (const REAL_VALUE_TYPE *c, format_helper fmt)
5274 1.1 mrg {
5275 1.1 mrg REAL_VALUE_TYPE cint;
5276 1.1 mrg
5277 1.1 mrg real_trunc (&cint, fmt, c);
5278 1.1 mrg return real_identical (c, &cint);
5279 1.1 mrg }
5280 1.1 mrg
5281 1.1 mrg /* Check whether C is an integer that fits in a HOST_WIDE_INT,
5282 1.1 mrg storing it in *INT_OUT if so. */
5283 1.1 mrg
5284 1.1 mrg bool
5285 1.1 mrg real_isinteger (const REAL_VALUE_TYPE *c, HOST_WIDE_INT *int_out)
5286 1.1 mrg {
5287 1.1 mrg REAL_VALUE_TYPE cint;
5288 1.1 mrg
5289 1.1 mrg HOST_WIDE_INT n = real_to_integer (c);
5290 1.1 mrg real_from_integer (&cint, VOIDmode, n, SIGNED);
5291 1.1 mrg if (real_identical (c, &cint))
5292 1.1 mrg {
5293 1.1 mrg *int_out = n;
5294 1.1 mrg return true;
5295 1.1 mrg }
5296 1.1 mrg return false;
5297 1.1 mrg }
5298 1.1 mrg
5299 1.1 mrg /* Calculate nextafter (X, Y) or nexttoward (X, Y). Return true if
5300 1.1 mrg underflow or overflow needs to be raised. */
5301 1.1 mrg
5302 1.1 mrg bool
5303 1.1 mrg real_nextafter (REAL_VALUE_TYPE *r, format_helper fmt,
5304 1.1 mrg const REAL_VALUE_TYPE *x, const REAL_VALUE_TYPE *y)
5305 1.1 mrg {
5306 1.1 mrg int cmp = do_compare (x, y, 2);
5307 1.1 mrg /* If either operand is NaN, return qNaN. */
5308 1.1 mrg if (cmp == 2)
5309 1.1 mrg {
5310 1.1 mrg get_canonical_qnan (r, 0);
5311 1.1 mrg return false;
5312 1.1 mrg }
5313 1.1 mrg /* If x == y, return y cast to target type. */
5314 1.1 mrg if (cmp == 0)
5315 1.1 mrg {
5316 1.1 mrg real_convert (r, fmt, y);
5317 1.1 mrg return false;
5318 1.1 mrg }
5319 1.1 mrg
5320 1.1 mrg if (x->cl == rvc_zero)
5321 1.1 mrg {
5322 1.1 mrg get_zero (r, y->sign);
5323 1.1 mrg r->cl = rvc_normal;
5324 1.1 mrg SET_REAL_EXP (r, fmt->emin - fmt->p + 1);
5325 1.1 mrg r->sig[SIGSZ - 1] = SIG_MSB;
5326 1.1 mrg return false;
5327 1.1 mrg }
5328 1.1 mrg
5329 1.1 mrg int np2 = SIGNIFICAND_BITS - fmt->p;
5330 1.1 mrg /* For denormals adjust np2 correspondingly. */
5331 1.1 mrg if (x->cl == rvc_normal && REAL_EXP (x) < fmt->emin)
5332 1.1 mrg np2 += fmt->emin - REAL_EXP (x);
5333 1.1 mrg
5334 1.1 mrg REAL_VALUE_TYPE u;
5335 1.1 mrg get_zero (r, x->sign);
5336 1.1 mrg get_zero (&u, 0);
5337 1.1 mrg set_significand_bit (&u, np2);
5338 1.1 mrg r->cl = rvc_normal;
5339 1.1 mrg SET_REAL_EXP (r, REAL_EXP (x));
5340 1.1 mrg
5341 1.1 mrg if (x->cl == rvc_inf)
5342 1.1 mrg {
5343 1.1 mrg bool borrow = sub_significands (r, r, &u, 0);
5344 1.1 mrg gcc_assert (borrow);
5345 1.1 mrg SET_REAL_EXP (r, fmt->emax);
5346 1.1 mrg }
5347 1.1 mrg else if (cmp == (x->sign ? 1 : -1))
5348 1.1 mrg {
5349 1.1 mrg if (add_significands (r, x, &u))
5350 1.1 mrg {
5351 1.1 mrg /* Overflow. Means the significand had been all ones, and
5352 1.1 mrg is now all zeros. Need to increase the exponent, and
5353 1.1 mrg possibly re-normalize it. */
5354 1.1 mrg SET_REAL_EXP (r, REAL_EXP (r) + 1);
5355 1.1 mrg if (REAL_EXP (r) > fmt->emax)
5356 1.1 mrg {
5357 1.1 mrg get_inf (r, x->sign);
5358 1.1 mrg return true;
5359 1.1 mrg }
5360 1.1 mrg r->sig[SIGSZ - 1] = SIG_MSB;
5361 1.1 mrg }
5362 1.1 mrg }
5363 1.1 mrg else
5364 1.1 mrg {
5365 1.1 mrg if (REAL_EXP (x) > fmt->emin && x->sig[SIGSZ - 1] == SIG_MSB)
5366 1.1 mrg {
5367 1.1 mrg int i;
5368 1.1 mrg for (i = SIGSZ - 2; i >= 0; i--)
5369 1.1 mrg if (x->sig[i])
5370 1.1 mrg break;
5371 1.1 mrg if (i < 0)
5372 1.1 mrg {
5373 1.1 mrg /* When mantissa is 1.0, we need to subtract only
5374 1.1 mrg half of u: nextafter (1.0, 0.0) is 1.0 - __DBL_EPSILON__ / 2
5375 1.1 mrg rather than 1.0 - __DBL_EPSILON__. */
5376 1.1 mrg clear_significand_bit (&u, np2);
5377 1.1 mrg np2--;
5378 1.1 mrg set_significand_bit (&u, np2);
5379 1.1 mrg }
5380 1.1 mrg }
5381 1.1 mrg sub_significands (r, x, &u, 0);
5382 1.1 mrg }
5383 1.1 mrg
5384 1.1 mrg /* Clear out trailing garbage. */
5385 1.1 mrg clear_significand_below (r, np2);
5386 1.1 mrg normalize (r);
5387 1.1 mrg if (REAL_EXP (r) <= fmt->emin - fmt->p)
5388 1.1 mrg {
5389 1.1 mrg get_zero (r, x->sign);
5390 1.1 mrg return true;
5391 1.1 mrg }
5392 1.1 mrg return r->cl == rvc_zero || REAL_EXP (r) < fmt->emin;
5393 1.1 mrg }
5394 1.1 mrg
5395 1.1 mrg /* Write into BUF the maximum representable finite floating-point
5396 1.1 mrg number, (1 - b**-p) * b**emax for a given FP format FMT as a hex
5397 1.1 mrg float string. LEN is the size of BUF, and the buffer must be large
5398 1.1 mrg enough to contain the resulting string. If NORM_MAX, instead write
5399 1.1 mrg the maximum representable finite normalized floating-point number,
5400 1.1 mrg defined to be such that all choices of digits for that exponent are
5401 1.1 mrg representable in the format (this only makes a difference for IBM
5402 1.1 mrg long double). */
5403 1.1 mrg
5404 1.1 mrg void
5405 1.1 mrg get_max_float (const struct real_format *fmt, char *buf, size_t len,
5406 1.1 mrg bool norm_max)
5407 1.1 mrg {
5408 1.1 mrg if (fmt->b == 10)
5409 1.1 mrg {
5410 1.1 mrg char *p = buf;
5411 1.1 mrg for (int i = fmt->p; i; i--)
5412 1.1 mrg {
5413 1.1 mrg *p++ = '9';
5414 1.1 mrg if (i == fmt->p)
5415 1.1 mrg *p++ = '.';
5416 1.1 mrg }
5417 1.1 mrg /* fmt->p plus 1, to account for the decimal point and fmt->emax
5418 1.1 mrg minus 1 because the digits are nines, not 1.0. */
5419 1.1 mrg sprintf (buf + fmt->p + 1, "E%d", fmt->emax - 1);
5420 1.1 mrg gcc_assert (strlen (buf) < len);
5421 1.1 mrg return;
5422 1.1 mrg }
5423 1.1 mrg
5424 1.1 mrg int i, n;
5425 1.1 mrg char *p;
5426 1.1 mrg bool is_ibm_extended = fmt->pnan < fmt->p;
5427 1.1 mrg
5428 1.1 mrg strcpy (buf, "0x0.");
5429 1.1 mrg n = fmt->p;
5430 1.1 mrg for (i = 0, p = buf + 4; i + 3 < n; i += 4)
5431 1.1 mrg *p++ = 'f';
5432 1.1 mrg if (i < n)
5433 1.1 mrg *p++ = "08ce"[n - i];
5434 1.1 mrg sprintf (p, "p%d",
5435 1.1 mrg (is_ibm_extended && norm_max) ? fmt->emax - 1 : fmt->emax);
5436 1.1 mrg if (is_ibm_extended && !norm_max)
5437 1.1 mrg {
5438 1.1 mrg /* This is an IBM extended double format made up of two IEEE
5439 1.1 mrg doubles. The value of the long double is the sum of the
5440 1.1 mrg values of the two parts. The most significant part is
5441 1.1 mrg required to be the value of the long double rounded to the
5442 1.1 mrg nearest double. Rounding means we need a slightly smaller
5443 1.1 mrg value for LDBL_MAX. */
5444 1.1 mrg buf[4 + fmt->pnan / 4] = "7bde"[fmt->pnan % 4];
5445 1.1 mrg }
5446 1.1 mrg
5447 1.1 mrg gcc_assert (strlen (buf) < len);
5448 1.1 mrg }
5449 1.1 mrg
5450 1.1 mrg /* True if all values of integral type can be represented
5451 1.1 mrg by this floating-point type exactly. */
5452 1.1 mrg
5453 1.1 mrg bool format_helper::can_represent_integral_type_p (tree type) const
5454 1.1 mrg {
5455 1.1 mrg gcc_assert (! decimal_p () && INTEGRAL_TYPE_P (type));
5456 1.1 mrg
5457 1.1 mrg /* INT?_MIN is power-of-two so it takes
5458 1.1 mrg only one mantissa bit. */
5459 1.1 mrg bool signed_p = TYPE_SIGN (type) == SIGNED;
5460 1.1 mrg return TYPE_PRECISION (type) - signed_p <= significand_size (*this);
5461 1.1 mrg }
5462 1.1 mrg
5463 1.1 mrg /* True if mode M has a NaN representation and
5464 1.1 mrg the treatment of NaN operands is important. */
5465 1.1 mrg
5466 1.1 mrg bool
5467 1.1 mrg HONOR_NANS (machine_mode m)
5468 1.1 mrg {
5469 1.1 mrg return MODE_HAS_NANS (m) && !flag_finite_math_only;
5470 1.1 mrg }
5471 1.1 mrg
5472 1.1 mrg bool
5473 1.1 mrg HONOR_NANS (const_tree t)
5474 1.1 mrg {
5475 1.1 mrg return HONOR_NANS (element_mode (t));
5476 1.1 mrg }
5477 1.1 mrg
5478 1.1 mrg bool
5479 1.1 mrg HONOR_NANS (const_rtx x)
5480 1.1 mrg {
5481 1.1 mrg return HONOR_NANS (GET_MODE (x));
5482 1.1 mrg }
5483 1.1 mrg
5484 1.1 mrg /* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs). */
5485 1.1 mrg
5486 1.1 mrg bool
5487 1.1 mrg HONOR_SNANS (machine_mode m)
5488 1.1 mrg {
5489 1.1 mrg return flag_signaling_nans && HONOR_NANS (m);
5490 1.1 mrg }
5491 1.1 mrg
5492 1.1 mrg bool
5493 1.1 mrg HONOR_SNANS (const_tree t)
5494 1.1 mrg {
5495 1.1 mrg return HONOR_SNANS (element_mode (t));
5496 1.1 mrg }
5497 1.1 mrg
5498 1.1 mrg bool
5499 1.1 mrg HONOR_SNANS (const_rtx x)
5500 1.1 mrg {
5501 1.1 mrg return HONOR_SNANS (GET_MODE (x));
5502 1.1 mrg }
5503 1.1 mrg
5504 1.1 mrg /* As for HONOR_NANS, but true if the mode can represent infinity and
5505 1.1 mrg the treatment of infinite values is important. */
5506 1.1 mrg
5507 1.1 mrg bool
5508 1.1 mrg HONOR_INFINITIES (machine_mode m)
5509 1.1 mrg {
5510 1.1 mrg return MODE_HAS_INFINITIES (m) && !flag_finite_math_only;
5511 1.1 mrg }
5512 1.1 mrg
5513 1.1 mrg bool
5514 1.1 mrg HONOR_INFINITIES (const_tree t)
5515 1.1 mrg {
5516 1.1 mrg return HONOR_INFINITIES (element_mode (t));
5517 1.1 mrg }
5518 1.1 mrg
5519 1.1 mrg bool
5520 1.1 mrg HONOR_INFINITIES (const_rtx x)
5521 1.1 mrg {
5522 1.1 mrg return HONOR_INFINITIES (GET_MODE (x));
5523 1.1 mrg }
5524 1.1 mrg
5525 1.1 mrg /* Like HONOR_NANS, but true if the given mode distinguishes between
5526 1.1 mrg positive and negative zero, and the sign of zero is important. */
5527 1.1 mrg
5528 1.1 mrg bool
5529 1.1 mrg HONOR_SIGNED_ZEROS (machine_mode m)
5530 1.1 mrg {
5531 1.1 mrg return MODE_HAS_SIGNED_ZEROS (m) && flag_signed_zeros;
5532 1.1 mrg }
5533 1.1 mrg
5534 1.1 mrg bool
5535 1.1 mrg HONOR_SIGNED_ZEROS (const_tree t)
5536 1.1 mrg {
5537 1.1 mrg return HONOR_SIGNED_ZEROS (element_mode (t));
5538 1.1 mrg }
5539 1.1 mrg
5540 1.1 mrg bool
5541 1.1 mrg HONOR_SIGNED_ZEROS (const_rtx x)
5542 1.1 mrg {
5543 1.1 mrg return HONOR_SIGNED_ZEROS (GET_MODE (x));
5544 1.1 mrg }
5545 1.1 mrg
5546 1.1 mrg /* Like HONOR_NANS, but true if given mode supports sign-dependent rounding,
5547 1.1 mrg and the rounding mode is important. */
5548 1.1 mrg
5549 1.1 mrg bool
5550 1.1 mrg HONOR_SIGN_DEPENDENT_ROUNDING (machine_mode m)
5551 1.1 mrg {
5552 1.1 mrg return MODE_HAS_SIGN_DEPENDENT_ROUNDING (m) && flag_rounding_math;
5553 1.1 mrg }
5554 1.1 mrg
5555 1.1 mrg bool
5556 1.1 mrg HONOR_SIGN_DEPENDENT_ROUNDING (const_tree t)
5557 1.1 mrg {
5558 1.1 mrg return HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (t));
5559 1.1 mrg }
5560 1.1 mrg
5561 1.1 mrg bool
5562 1.1 mrg HONOR_SIGN_DEPENDENT_ROUNDING (const_rtx x)
5563 1.1 mrg {
5564 1.1 mrg return HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (x));
5565 1.1 mrg }
5566 1.1 mrg
5567 1.1 mrg /* Fills r with the largest value such that 1 + r*r won't overflow.
5568 1.1 mrg This is used in both sin (atan (x)) and cos (atan(x)) optimizations. */
5569 1.1 mrg
5570 1.1 mrg void
5571 1.1 mrg build_sinatan_real (REAL_VALUE_TYPE * r, tree type)
5572 1.1 mrg {
5573 1.1 mrg REAL_VALUE_TYPE maxval;
5574 1.1 mrg mpfr_t mpfr_const1, mpfr_c, mpfr_maxval;
5575 1.1 mrg machine_mode mode = TYPE_MODE (type);
5576 1.1 mrg const struct real_format * fmt = REAL_MODE_FORMAT (mode);
5577
5578 real_maxval (&maxval, 0, mode);
5579
5580 mpfr_inits (mpfr_const1, mpfr_c, mpfr_maxval, NULL);
5581
5582 mpfr_from_real (mpfr_const1, &dconst1, MPFR_RNDN);
5583 mpfr_from_real (mpfr_maxval, &maxval, MPFR_RNDN);
5584
5585 mpfr_sub (mpfr_c, mpfr_maxval, mpfr_const1, MPFR_RNDN);
5586 mpfr_sqrt (mpfr_c, mpfr_c, MPFR_RNDZ);
5587
5588 real_from_mpfr (r, mpfr_c, fmt, MPFR_RNDZ);
5589
5590 mpfr_clears (mpfr_const1, mpfr_c, mpfr_maxval, NULL);
5591 }
5592