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