* lib/ubsan-dg.exp (check_effective_target_fsanitize_undefined):
[official-gcc.git] / gcc / real.c
blobbee42456bcade45bc8fb237b57f60b984c8267fe
1 /* real.c - software floating point emulation.
2 Copyright (C) 1993-2014 Free Software Foundation, Inc.
3 Contributed by Stephen L. Moshier (moshier@world.std.com).
4 Re-written by Richard Henderson <rth@redhat.com>
6 This file is part of GCC.
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.
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.
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/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "diagnostic-core.h"
28 #include "real.h"
29 #include "realmpfr.h"
30 #include "tm_p.h"
31 #include "dfp.h"
32 #include "wide-int.h"
33 #include "rtl.h"
34 #include "options.h"
36 /* The floating point model used internally is not exactly IEEE 754
37 compliant, and close to the description in the ISO C99 standard,
38 section 5.2.4.2.2 Characteristics of floating types.
40 Specifically
42 x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
44 where
45 s = sign (+- 1)
46 b = base or radix, here always 2
47 e = exponent
48 p = precision (the number of base-b digits in the significand)
49 f_k = the digits of the significand.
51 We differ from typical IEEE 754 encodings in that the entire
52 significand is fractional. Normalized significands are in the
53 range [0.5, 1.0).
55 A requirement of the model is that P be larger than the largest
56 supported target floating-point type by at least 2 bits. This gives
57 us proper rounding when we truncate to the target type. In addition,
58 E must be large enough to hold the smallest supported denormal number
59 in a normalized form.
61 Both of these requirements are easily satisfied. The largest target
62 significand is 113 bits; we store at least 160. The smallest
63 denormal number fits in 17 exponent bits; we store 26. */
66 /* Used to classify two numbers simultaneously. */
67 #define CLASS2(A, B) ((A) << 2 | (B))
69 #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
70 #error "Some constant folding done by hand to avoid shift count warnings"
71 #endif
73 static void get_zero (REAL_VALUE_TYPE *, int);
74 static void get_canonical_qnan (REAL_VALUE_TYPE *, int);
75 static void get_canonical_snan (REAL_VALUE_TYPE *, int);
76 static void get_inf (REAL_VALUE_TYPE *, int);
77 static bool sticky_rshift_significand (REAL_VALUE_TYPE *,
78 const REAL_VALUE_TYPE *, unsigned int);
79 static void rshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
80 unsigned int);
81 static void lshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
82 unsigned int);
83 static void lshift_significand_1 (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
84 static bool add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *,
85 const REAL_VALUE_TYPE *);
86 static bool sub_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
87 const REAL_VALUE_TYPE *, int);
88 static void neg_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
89 static int cmp_significands (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
90 static int cmp_significand_0 (const REAL_VALUE_TYPE *);
91 static void set_significand_bit (REAL_VALUE_TYPE *, unsigned int);
92 static void clear_significand_bit (REAL_VALUE_TYPE *, unsigned int);
93 static bool test_significand_bit (REAL_VALUE_TYPE *, unsigned int);
94 static void clear_significand_below (REAL_VALUE_TYPE *, unsigned int);
95 static bool div_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
96 const REAL_VALUE_TYPE *);
97 static void normalize (REAL_VALUE_TYPE *);
99 static bool do_add (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
100 const REAL_VALUE_TYPE *, int);
101 static bool do_multiply (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
102 const REAL_VALUE_TYPE *);
103 static bool do_divide (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
104 const REAL_VALUE_TYPE *);
105 static int do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
106 static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
108 static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *);
109 static void decimal_from_integer (REAL_VALUE_TYPE *);
110 static void decimal_integer_string (char *, const REAL_VALUE_TYPE *,
111 size_t);
113 static const REAL_VALUE_TYPE * ten_to_ptwo (int);
114 static const REAL_VALUE_TYPE * ten_to_mptwo (int);
115 static const REAL_VALUE_TYPE * real_digit (int);
116 static void times_pten (REAL_VALUE_TYPE *, int);
118 static void round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
120 /* Initialize R with a positive zero. */
122 static inline void
123 get_zero (REAL_VALUE_TYPE *r, int sign)
125 memset (r, 0, sizeof (*r));
126 r->sign = sign;
129 /* Initialize R with the canonical quiet NaN. */
131 static inline void
132 get_canonical_qnan (REAL_VALUE_TYPE *r, int sign)
134 memset (r, 0, sizeof (*r));
135 r->cl = rvc_nan;
136 r->sign = sign;
137 r->canonical = 1;
140 static inline void
141 get_canonical_snan (REAL_VALUE_TYPE *r, int sign)
143 memset (r, 0, sizeof (*r));
144 r->cl = rvc_nan;
145 r->sign = sign;
146 r->signalling = 1;
147 r->canonical = 1;
150 static inline void
151 get_inf (REAL_VALUE_TYPE *r, int sign)
153 memset (r, 0, sizeof (*r));
154 r->cl = rvc_inf;
155 r->sign = sign;
159 /* Right-shift the significand of A by N bits; put the result in the
160 significand of R. If any one bits are shifted out, return true. */
162 static bool
163 sticky_rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
164 unsigned int n)
166 unsigned long sticky = 0;
167 unsigned int i, ofs = 0;
169 if (n >= HOST_BITS_PER_LONG)
171 for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i)
172 sticky |= a->sig[i];
173 n &= HOST_BITS_PER_LONG - 1;
176 if (n != 0)
178 sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1);
179 for (i = 0; i < SIGSZ; ++i)
181 r->sig[i]
182 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
183 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
184 << (HOST_BITS_PER_LONG - n)));
187 else
189 for (i = 0; ofs + i < SIGSZ; ++i)
190 r->sig[i] = a->sig[ofs + i];
191 for (; i < SIGSZ; ++i)
192 r->sig[i] = 0;
195 return sticky != 0;
198 /* Right-shift the significand of A by N bits; put the result in the
199 significand of R. */
201 static void
202 rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
203 unsigned int n)
205 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
207 n &= HOST_BITS_PER_LONG - 1;
208 if (n != 0)
210 for (i = 0; i < SIGSZ; ++i)
212 r->sig[i]
213 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
214 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
215 << (HOST_BITS_PER_LONG - n)));
218 else
220 for (i = 0; ofs + i < SIGSZ; ++i)
221 r->sig[i] = a->sig[ofs + i];
222 for (; i < SIGSZ; ++i)
223 r->sig[i] = 0;
227 /* Left-shift the significand of A by N bits; put the result in the
228 significand of R. */
230 static void
231 lshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
232 unsigned int n)
234 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
236 n &= HOST_BITS_PER_LONG - 1;
237 if (n == 0)
239 for (i = 0; ofs + i < SIGSZ; ++i)
240 r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs];
241 for (; i < SIGSZ; ++i)
242 r->sig[SIGSZ-1-i] = 0;
244 else
245 for (i = 0; i < SIGSZ; ++i)
247 r->sig[SIGSZ-1-i]
248 = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n)
249 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1])
250 >> (HOST_BITS_PER_LONG - n)));
254 /* Likewise, but N is specialized to 1. */
256 static inline void
257 lshift_significand_1 (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
259 unsigned int i;
261 for (i = SIGSZ - 1; i > 0; --i)
262 r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1));
263 r->sig[0] = a->sig[0] << 1;
266 /* Add the significands of A and B, placing the result in R. Return
267 true if there was carry out of the most significant word. */
269 static inline bool
270 add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
271 const REAL_VALUE_TYPE *b)
273 bool carry = false;
274 int i;
276 for (i = 0; i < SIGSZ; ++i)
278 unsigned long ai = a->sig[i];
279 unsigned long ri = ai + b->sig[i];
281 if (carry)
283 carry = ri < ai;
284 carry |= ++ri == 0;
286 else
287 carry = ri < ai;
289 r->sig[i] = ri;
292 return carry;
295 /* Subtract the significands of A and B, placing the result in R. CARRY is
296 true if there's a borrow incoming to the least significant word.
297 Return true if there was borrow out of the most significant word. */
299 static inline bool
300 sub_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
301 const REAL_VALUE_TYPE *b, int carry)
303 int i;
305 for (i = 0; i < SIGSZ; ++i)
307 unsigned long ai = a->sig[i];
308 unsigned long ri = ai - b->sig[i];
310 if (carry)
312 carry = ri > ai;
313 carry |= ~--ri == 0;
315 else
316 carry = ri > ai;
318 r->sig[i] = ri;
321 return carry;
324 /* Negate the significand A, placing the result in R. */
326 static inline void
327 neg_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
329 bool carry = true;
330 int i;
332 for (i = 0; i < SIGSZ; ++i)
334 unsigned long ri, ai = a->sig[i];
336 if (carry)
338 if (ai)
340 ri = -ai;
341 carry = false;
343 else
344 ri = ai;
346 else
347 ri = ~ai;
349 r->sig[i] = ri;
353 /* Compare significands. Return tri-state vs zero. */
355 static inline int
356 cmp_significands (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
358 int i;
360 for (i = SIGSZ - 1; i >= 0; --i)
362 unsigned long ai = a->sig[i];
363 unsigned long bi = b->sig[i];
365 if (ai > bi)
366 return 1;
367 if (ai < bi)
368 return -1;
371 return 0;
374 /* Return true if A is nonzero. */
376 static inline int
377 cmp_significand_0 (const REAL_VALUE_TYPE *a)
379 int i;
381 for (i = SIGSZ - 1; i >= 0; --i)
382 if (a->sig[i])
383 return 1;
385 return 0;
388 /* Set bit N of the significand of R. */
390 static inline void
391 set_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
393 r->sig[n / HOST_BITS_PER_LONG]
394 |= (unsigned long)1 << (n % HOST_BITS_PER_LONG);
397 /* Clear bit N of the significand of R. */
399 static inline void
400 clear_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
402 r->sig[n / HOST_BITS_PER_LONG]
403 &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG));
406 /* Test bit N of the significand of R. */
408 static inline bool
409 test_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
411 /* ??? Compiler bug here if we return this expression directly.
412 The conversion to bool strips the "&1" and we wind up testing
413 e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */
414 int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1;
415 return t;
418 /* Clear bits 0..N-1 of the significand of R. */
420 static void
421 clear_significand_below (REAL_VALUE_TYPE *r, unsigned int n)
423 int i, w = n / HOST_BITS_PER_LONG;
425 for (i = 0; i < w; ++i)
426 r->sig[i] = 0;
428 r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1);
431 /* Divide the significands of A and B, placing the result in R. Return
432 true if the division was inexact. */
434 static inline bool
435 div_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
436 const REAL_VALUE_TYPE *b)
438 REAL_VALUE_TYPE u;
439 int i, bit = SIGNIFICAND_BITS - 1;
440 unsigned long msb, inexact;
442 u = *a;
443 memset (r->sig, 0, sizeof (r->sig));
445 msb = 0;
446 goto start;
449 msb = u.sig[SIGSZ-1] & SIG_MSB;
450 lshift_significand_1 (&u, &u);
451 start:
452 if (msb || cmp_significands (&u, b) >= 0)
454 sub_significands (&u, &u, b, 0);
455 set_significand_bit (r, bit);
458 while (--bit >= 0);
460 for (i = 0, inexact = 0; i < SIGSZ; i++)
461 inexact |= u.sig[i];
463 return inexact != 0;
466 /* Adjust the exponent and significand of R such that the most
467 significant bit is set. We underflow to zero and overflow to
468 infinity here, without denormals. (The intermediate representation
469 exponent is large enough to handle target denormals normalized.) */
471 static void
472 normalize (REAL_VALUE_TYPE *r)
474 int shift = 0, exp;
475 int i, j;
477 if (r->decimal)
478 return;
480 /* Find the first word that is nonzero. */
481 for (i = SIGSZ - 1; i >= 0; i--)
482 if (r->sig[i] == 0)
483 shift += HOST_BITS_PER_LONG;
484 else
485 break;
487 /* Zero significand flushes to zero. */
488 if (i < 0)
490 r->cl = rvc_zero;
491 SET_REAL_EXP (r, 0);
492 return;
495 /* Find the first bit that is nonzero. */
496 for (j = 0; ; j++)
497 if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j)))
498 break;
499 shift += j;
501 if (shift > 0)
503 exp = REAL_EXP (r) - shift;
504 if (exp > MAX_EXP)
505 get_inf (r, r->sign);
506 else if (exp < -MAX_EXP)
507 get_zero (r, r->sign);
508 else
510 SET_REAL_EXP (r, exp);
511 lshift_significand (r, r, shift);
516 /* Calculate R = A + (SUBTRACT_P ? -B : B). Return true if the
517 result may be inexact due to a loss of precision. */
519 static bool
520 do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
521 const REAL_VALUE_TYPE *b, int subtract_p)
523 int dexp, sign, exp;
524 REAL_VALUE_TYPE t;
525 bool inexact = false;
527 /* Determine if we need to add or subtract. */
528 sign = a->sign;
529 subtract_p = (sign ^ b->sign) ^ subtract_p;
531 switch (CLASS2 (a->cl, b->cl))
533 case CLASS2 (rvc_zero, rvc_zero):
534 /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0. */
535 get_zero (r, sign & !subtract_p);
536 return false;
538 case CLASS2 (rvc_zero, rvc_normal):
539 case CLASS2 (rvc_zero, rvc_inf):
540 case CLASS2 (rvc_zero, rvc_nan):
541 /* 0 + ANY = ANY. */
542 case CLASS2 (rvc_normal, rvc_nan):
543 case CLASS2 (rvc_inf, rvc_nan):
544 case CLASS2 (rvc_nan, rvc_nan):
545 /* ANY + NaN = NaN. */
546 case CLASS2 (rvc_normal, rvc_inf):
547 /* R + Inf = Inf. */
548 *r = *b;
549 r->sign = sign ^ subtract_p;
550 return false;
552 case CLASS2 (rvc_normal, rvc_zero):
553 case CLASS2 (rvc_inf, rvc_zero):
554 case CLASS2 (rvc_nan, rvc_zero):
555 /* ANY + 0 = ANY. */
556 case CLASS2 (rvc_nan, rvc_normal):
557 case CLASS2 (rvc_nan, rvc_inf):
558 /* NaN + ANY = NaN. */
559 case CLASS2 (rvc_inf, rvc_normal):
560 /* Inf + R = Inf. */
561 *r = *a;
562 return false;
564 case CLASS2 (rvc_inf, rvc_inf):
565 if (subtract_p)
566 /* Inf - Inf = NaN. */
567 get_canonical_qnan (r, 0);
568 else
569 /* Inf + Inf = Inf. */
570 *r = *a;
571 return false;
573 case CLASS2 (rvc_normal, rvc_normal):
574 break;
576 default:
577 gcc_unreachable ();
580 /* Swap the arguments such that A has the larger exponent. */
581 dexp = REAL_EXP (a) - REAL_EXP (b);
582 if (dexp < 0)
584 const REAL_VALUE_TYPE *t;
585 t = a, a = b, b = t;
586 dexp = -dexp;
587 sign ^= subtract_p;
589 exp = REAL_EXP (a);
591 /* If the exponents are not identical, we need to shift the
592 significand of B down. */
593 if (dexp > 0)
595 /* If the exponents are too far apart, the significands
596 do not overlap, which makes the subtraction a noop. */
597 if (dexp >= SIGNIFICAND_BITS)
599 *r = *a;
600 r->sign = sign;
601 return true;
604 inexact |= sticky_rshift_significand (&t, b, dexp);
605 b = &t;
608 if (subtract_p)
610 if (sub_significands (r, a, b, inexact))
612 /* We got a borrow out of the subtraction. That means that
613 A and B had the same exponent, and B had the larger
614 significand. We need to swap the sign and negate the
615 significand. */
616 sign ^= 1;
617 neg_significand (r, r);
620 else
622 if (add_significands (r, a, b))
624 /* We got carry out of the addition. This means we need to
625 shift the significand back down one bit and increase the
626 exponent. */
627 inexact |= sticky_rshift_significand (r, r, 1);
628 r->sig[SIGSZ-1] |= SIG_MSB;
629 if (++exp > MAX_EXP)
631 get_inf (r, sign);
632 return true;
637 r->cl = rvc_normal;
638 r->sign = sign;
639 SET_REAL_EXP (r, exp);
640 /* Zero out the remaining fields. */
641 r->signalling = 0;
642 r->canonical = 0;
643 r->decimal = 0;
645 /* Re-normalize the result. */
646 normalize (r);
648 /* Special case: if the subtraction results in zero, the result
649 is positive. */
650 if (r->cl == rvc_zero)
651 r->sign = 0;
652 else
653 r->sig[0] |= inexact;
655 return inexact;
658 /* Calculate R = A * B. Return true if the result may be inexact. */
660 static bool
661 do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
662 const REAL_VALUE_TYPE *b)
664 REAL_VALUE_TYPE u, t, *rr;
665 unsigned int i, j, k;
666 int sign = a->sign ^ b->sign;
667 bool inexact = false;
669 switch (CLASS2 (a->cl, b->cl))
671 case CLASS2 (rvc_zero, rvc_zero):
672 case CLASS2 (rvc_zero, rvc_normal):
673 case CLASS2 (rvc_normal, rvc_zero):
674 /* +-0 * ANY = 0 with appropriate sign. */
675 get_zero (r, sign);
676 return false;
678 case CLASS2 (rvc_zero, rvc_nan):
679 case CLASS2 (rvc_normal, rvc_nan):
680 case CLASS2 (rvc_inf, rvc_nan):
681 case CLASS2 (rvc_nan, rvc_nan):
682 /* ANY * NaN = NaN. */
683 *r = *b;
684 r->sign = sign;
685 return false;
687 case CLASS2 (rvc_nan, rvc_zero):
688 case CLASS2 (rvc_nan, rvc_normal):
689 case CLASS2 (rvc_nan, rvc_inf):
690 /* NaN * ANY = NaN. */
691 *r = *a;
692 r->sign = sign;
693 return false;
695 case CLASS2 (rvc_zero, rvc_inf):
696 case CLASS2 (rvc_inf, rvc_zero):
697 /* 0 * Inf = NaN */
698 get_canonical_qnan (r, sign);
699 return false;
701 case CLASS2 (rvc_inf, rvc_inf):
702 case CLASS2 (rvc_normal, rvc_inf):
703 case CLASS2 (rvc_inf, rvc_normal):
704 /* Inf * Inf = Inf, R * Inf = Inf */
705 get_inf (r, sign);
706 return false;
708 case CLASS2 (rvc_normal, rvc_normal):
709 break;
711 default:
712 gcc_unreachable ();
715 if (r == a || r == b)
716 rr = &t;
717 else
718 rr = r;
719 get_zero (rr, 0);
721 /* Collect all the partial products. Since we don't have sure access
722 to a widening multiply, we split each long into two half-words.
724 Consider the long-hand form of a four half-word multiplication:
726 A B C D
727 * E F G H
728 --------------
729 DE DF DG DH
730 CE CF CG CH
731 BE BF BG BH
732 AE AF AG AH
734 We construct partial products of the widened half-word products
735 that are known to not overlap, e.g. DF+DH. Each such partial
736 product is given its proper exponent, which allows us to sum them
737 and obtain the finished product. */
739 for (i = 0; i < SIGSZ * 2; ++i)
741 unsigned long ai = a->sig[i / 2];
742 if (i & 1)
743 ai >>= HOST_BITS_PER_LONG / 2;
744 else
745 ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
747 if (ai == 0)
748 continue;
750 for (j = 0; j < 2; ++j)
752 int exp = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
753 + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2)));
755 if (exp > MAX_EXP)
757 get_inf (r, sign);
758 return true;
760 if (exp < -MAX_EXP)
762 /* Would underflow to zero, which we shouldn't bother adding. */
763 inexact = true;
764 continue;
767 memset (&u, 0, sizeof (u));
768 u.cl = rvc_normal;
769 SET_REAL_EXP (&u, exp);
771 for (k = j; k < SIGSZ * 2; k += 2)
773 unsigned long bi = b->sig[k / 2];
774 if (k & 1)
775 bi >>= HOST_BITS_PER_LONG / 2;
776 else
777 bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
779 u.sig[k / 2] = ai * bi;
782 normalize (&u);
783 inexact |= do_add (rr, rr, &u, 0);
787 rr->sign = sign;
788 if (rr != r)
789 *r = t;
791 return inexact;
794 /* Calculate R = A / B. Return true if the result may be inexact. */
796 static bool
797 do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
798 const REAL_VALUE_TYPE *b)
800 int exp, sign = a->sign ^ b->sign;
801 REAL_VALUE_TYPE t, *rr;
802 bool inexact;
804 switch (CLASS2 (a->cl, b->cl))
806 case CLASS2 (rvc_zero, rvc_zero):
807 /* 0 / 0 = NaN. */
808 case CLASS2 (rvc_inf, rvc_inf):
809 /* Inf / Inf = NaN. */
810 get_canonical_qnan (r, sign);
811 return false;
813 case CLASS2 (rvc_zero, rvc_normal):
814 case CLASS2 (rvc_zero, rvc_inf):
815 /* 0 / ANY = 0. */
816 case CLASS2 (rvc_normal, rvc_inf):
817 /* R / Inf = 0. */
818 get_zero (r, sign);
819 return false;
821 case CLASS2 (rvc_normal, rvc_zero):
822 /* R / 0 = Inf. */
823 case CLASS2 (rvc_inf, rvc_zero):
824 /* Inf / 0 = Inf. */
825 get_inf (r, sign);
826 return false;
828 case CLASS2 (rvc_zero, rvc_nan):
829 case CLASS2 (rvc_normal, rvc_nan):
830 case CLASS2 (rvc_inf, rvc_nan):
831 case CLASS2 (rvc_nan, rvc_nan):
832 /* ANY / NaN = NaN. */
833 *r = *b;
834 r->sign = sign;
835 return false;
837 case CLASS2 (rvc_nan, rvc_zero):
838 case CLASS2 (rvc_nan, rvc_normal):
839 case CLASS2 (rvc_nan, rvc_inf):
840 /* NaN / ANY = NaN. */
841 *r = *a;
842 r->sign = sign;
843 return false;
845 case CLASS2 (rvc_inf, rvc_normal):
846 /* Inf / R = Inf. */
847 get_inf (r, sign);
848 return false;
850 case CLASS2 (rvc_normal, rvc_normal):
851 break;
853 default:
854 gcc_unreachable ();
857 if (r == a || r == b)
858 rr = &t;
859 else
860 rr = r;
862 /* Make sure all fields in the result are initialized. */
863 get_zero (rr, 0);
864 rr->cl = rvc_normal;
865 rr->sign = sign;
867 exp = REAL_EXP (a) - REAL_EXP (b) + 1;
868 if (exp > MAX_EXP)
870 get_inf (r, sign);
871 return true;
873 if (exp < -MAX_EXP)
875 get_zero (r, sign);
876 return true;
878 SET_REAL_EXP (rr, exp);
880 inexact = div_significands (rr, a, b);
882 /* Re-normalize the result. */
883 normalize (rr);
884 rr->sig[0] |= inexact;
886 if (rr != r)
887 *r = t;
889 return inexact;
892 /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
893 one of the two operands is a NaN. */
895 static int
896 do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
897 int nan_result)
899 int ret;
901 switch (CLASS2 (a->cl, b->cl))
903 case CLASS2 (rvc_zero, rvc_zero):
904 /* Sign of zero doesn't matter for compares. */
905 return 0;
907 case CLASS2 (rvc_normal, rvc_zero):
908 /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */
909 if (a->decimal)
910 return decimal_do_compare (a, b, nan_result);
911 /* Fall through. */
912 case CLASS2 (rvc_inf, rvc_zero):
913 case CLASS2 (rvc_inf, rvc_normal):
914 return (a->sign ? -1 : 1);
916 case CLASS2 (rvc_inf, rvc_inf):
917 return -a->sign - -b->sign;
919 case CLASS2 (rvc_zero, rvc_normal):
920 /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */
921 if (b->decimal)
922 return decimal_do_compare (a, b, nan_result);
923 /* Fall through. */
924 case CLASS2 (rvc_zero, rvc_inf):
925 case CLASS2 (rvc_normal, rvc_inf):
926 return (b->sign ? 1 : -1);
928 case CLASS2 (rvc_zero, rvc_nan):
929 case CLASS2 (rvc_normal, rvc_nan):
930 case CLASS2 (rvc_inf, rvc_nan):
931 case CLASS2 (rvc_nan, rvc_nan):
932 case CLASS2 (rvc_nan, rvc_zero):
933 case CLASS2 (rvc_nan, rvc_normal):
934 case CLASS2 (rvc_nan, rvc_inf):
935 return nan_result;
937 case CLASS2 (rvc_normal, rvc_normal):
938 break;
940 default:
941 gcc_unreachable ();
944 if (a->sign != b->sign)
945 return -a->sign - -b->sign;
947 if (a->decimal || b->decimal)
948 return decimal_do_compare (a, b, nan_result);
950 if (REAL_EXP (a) > REAL_EXP (b))
951 ret = 1;
952 else if (REAL_EXP (a) < REAL_EXP (b))
953 ret = -1;
954 else
955 ret = cmp_significands (a, b);
957 return (a->sign ? -ret : ret);
960 /* Return A truncated to an integral value toward zero. */
962 static void
963 do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
965 *r = *a;
967 switch (r->cl)
969 case rvc_zero:
970 case rvc_inf:
971 case rvc_nan:
972 break;
974 case rvc_normal:
975 if (r->decimal)
977 decimal_do_fix_trunc (r, a);
978 return;
980 if (REAL_EXP (r) <= 0)
981 get_zero (r, r->sign);
982 else if (REAL_EXP (r) < SIGNIFICAND_BITS)
983 clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r));
984 break;
986 default:
987 gcc_unreachable ();
991 /* Perform the binary or unary operation described by CODE.
992 For a unary operation, leave OP1 NULL. This function returns
993 true if the result may be inexact due to loss of precision. */
995 bool
996 real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
997 const REAL_VALUE_TYPE *op1)
999 enum tree_code code = (enum tree_code) icode;
1001 if (op0->decimal || (op1 && op1->decimal))
1002 return decimal_real_arithmetic (r, code, op0, op1);
1004 switch (code)
1006 case PLUS_EXPR:
1007 /* Clear any padding areas in *r if it isn't equal to one of the
1008 operands so that we can later do bitwise comparisons later on. */
1009 if (r != op0 && r != op1)
1010 memset (r, '\0', sizeof (*r));
1011 return do_add (r, op0, op1, 0);
1013 case MINUS_EXPR:
1014 if (r != op0 && r != op1)
1015 memset (r, '\0', sizeof (*r));
1016 return do_add (r, op0, op1, 1);
1018 case MULT_EXPR:
1019 if (r != op0 && r != op1)
1020 memset (r, '\0', sizeof (*r));
1021 return do_multiply (r, op0, op1);
1023 case RDIV_EXPR:
1024 if (r != op0 && r != op1)
1025 memset (r, '\0', sizeof (*r));
1026 return do_divide (r, op0, op1);
1028 case MIN_EXPR:
1029 if (op1->cl == rvc_nan)
1030 *r = *op1;
1031 else if (do_compare (op0, op1, -1) < 0)
1032 *r = *op0;
1033 else
1034 *r = *op1;
1035 break;
1037 case MAX_EXPR:
1038 if (op1->cl == rvc_nan)
1039 *r = *op1;
1040 else if (do_compare (op0, op1, 1) < 0)
1041 *r = *op1;
1042 else
1043 *r = *op0;
1044 break;
1046 case NEGATE_EXPR:
1047 *r = *op0;
1048 r->sign ^= 1;
1049 break;
1051 case ABS_EXPR:
1052 *r = *op0;
1053 r->sign = 0;
1054 break;
1056 case FIX_TRUNC_EXPR:
1057 do_fix_trunc (r, op0);
1058 break;
1060 default:
1061 gcc_unreachable ();
1063 return false;
1066 REAL_VALUE_TYPE
1067 real_value_negate (const REAL_VALUE_TYPE *op0)
1069 REAL_VALUE_TYPE r;
1070 real_arithmetic (&r, NEGATE_EXPR, op0, NULL);
1071 return r;
1074 REAL_VALUE_TYPE
1075 real_value_abs (const REAL_VALUE_TYPE *op0)
1077 REAL_VALUE_TYPE r;
1078 real_arithmetic (&r, ABS_EXPR, op0, NULL);
1079 return r;
1082 bool
1083 real_compare (int icode, const REAL_VALUE_TYPE *op0,
1084 const REAL_VALUE_TYPE *op1)
1086 enum tree_code code = (enum tree_code) icode;
1088 switch (code)
1090 case LT_EXPR:
1091 return do_compare (op0, op1, 1) < 0;
1092 case LE_EXPR:
1093 return do_compare (op0, op1, 1) <= 0;
1094 case GT_EXPR:
1095 return do_compare (op0, op1, -1) > 0;
1096 case GE_EXPR:
1097 return do_compare (op0, op1, -1) >= 0;
1098 case EQ_EXPR:
1099 return do_compare (op0, op1, -1) == 0;
1100 case NE_EXPR:
1101 return do_compare (op0, op1, -1) != 0;
1102 case UNORDERED_EXPR:
1103 return op0->cl == rvc_nan || op1->cl == rvc_nan;
1104 case ORDERED_EXPR:
1105 return op0->cl != rvc_nan && op1->cl != rvc_nan;
1106 case UNLT_EXPR:
1107 return do_compare (op0, op1, -1) < 0;
1108 case UNLE_EXPR:
1109 return do_compare (op0, op1, -1) <= 0;
1110 case UNGT_EXPR:
1111 return do_compare (op0, op1, 1) > 0;
1112 case UNGE_EXPR:
1113 return do_compare (op0, op1, 1) >= 0;
1114 case UNEQ_EXPR:
1115 return do_compare (op0, op1, 0) == 0;
1116 case LTGT_EXPR:
1117 return do_compare (op0, op1, 0) != 0;
1119 default:
1120 gcc_unreachable ();
1124 /* Return floor log2(R). */
1127 real_exponent (const REAL_VALUE_TYPE *r)
1129 switch (r->cl)
1131 case rvc_zero:
1132 return 0;
1133 case rvc_inf:
1134 case rvc_nan:
1135 return (unsigned int)-1 >> 1;
1136 case rvc_normal:
1137 return REAL_EXP (r);
1138 default:
1139 gcc_unreachable ();
1143 /* R = OP0 * 2**EXP. */
1145 void
1146 real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
1148 *r = *op0;
1149 switch (r->cl)
1151 case rvc_zero:
1152 case rvc_inf:
1153 case rvc_nan:
1154 break;
1156 case rvc_normal:
1157 exp += REAL_EXP (op0);
1158 if (exp > MAX_EXP)
1159 get_inf (r, r->sign);
1160 else if (exp < -MAX_EXP)
1161 get_zero (r, r->sign);
1162 else
1163 SET_REAL_EXP (r, exp);
1164 break;
1166 default:
1167 gcc_unreachable ();
1171 /* Determine whether a floating-point value X is infinite. */
1173 bool
1174 real_isinf (const REAL_VALUE_TYPE *r)
1176 return (r->cl == rvc_inf);
1179 /* Determine whether a floating-point value X is a NaN. */
1181 bool
1182 real_isnan (const REAL_VALUE_TYPE *r)
1184 return (r->cl == rvc_nan);
1187 /* Determine whether a floating-point value X is finite. */
1189 bool
1190 real_isfinite (const REAL_VALUE_TYPE *r)
1192 return (r->cl != rvc_nan) && (r->cl != rvc_inf);
1195 /* Determine whether a floating-point value X is negative. */
1197 bool
1198 real_isneg (const REAL_VALUE_TYPE *r)
1200 return r->sign;
1203 /* Determine whether a floating-point value X is minus zero. */
1205 bool
1206 real_isnegzero (const REAL_VALUE_TYPE *r)
1208 return r->sign && r->cl == rvc_zero;
1211 /* Compare two floating-point objects for bitwise identity. */
1213 bool
1214 real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
1216 int i;
1218 if (a->cl != b->cl)
1219 return false;
1220 if (a->sign != b->sign)
1221 return false;
1223 switch (a->cl)
1225 case rvc_zero:
1226 case rvc_inf:
1227 return true;
1229 case rvc_normal:
1230 if (a->decimal != b->decimal)
1231 return false;
1232 if (REAL_EXP (a) != REAL_EXP (b))
1233 return false;
1234 break;
1236 case rvc_nan:
1237 if (a->signalling != b->signalling)
1238 return false;
1239 /* The significand is ignored for canonical NaNs. */
1240 if (a->canonical || b->canonical)
1241 return a->canonical == b->canonical;
1242 break;
1244 default:
1245 gcc_unreachable ();
1248 for (i = 0; i < SIGSZ; ++i)
1249 if (a->sig[i] != b->sig[i])
1250 return false;
1252 return true;
1255 /* Try to change R into its exact multiplicative inverse in machine
1256 mode MODE. Return true if successful. */
1258 bool
1259 exact_real_inverse (machine_mode mode, REAL_VALUE_TYPE *r)
1261 const REAL_VALUE_TYPE *one = real_digit (1);
1262 REAL_VALUE_TYPE u;
1263 int i;
1265 if (r->cl != rvc_normal)
1266 return false;
1268 /* Check for a power of two: all significand bits zero except the MSB. */
1269 for (i = 0; i < SIGSZ-1; ++i)
1270 if (r->sig[i] != 0)
1271 return false;
1272 if (r->sig[SIGSZ-1] != SIG_MSB)
1273 return false;
1275 /* Find the inverse and truncate to the required mode. */
1276 do_divide (&u, one, r);
1277 real_convert (&u, mode, &u);
1279 /* The rounding may have overflowed. */
1280 if (u.cl != rvc_normal)
1281 return false;
1282 for (i = 0; i < SIGSZ-1; ++i)
1283 if (u.sig[i] != 0)
1284 return false;
1285 if (u.sig[SIGSZ-1] != SIG_MSB)
1286 return false;
1288 *r = u;
1289 return true;
1292 /* Return true if arithmetic on values in IMODE that were promoted
1293 from values in TMODE is equivalent to direct arithmetic on values
1294 in TMODE. */
1296 bool
1297 real_can_shorten_arithmetic (machine_mode imode, machine_mode tmode)
1299 const struct real_format *tfmt, *ifmt;
1300 tfmt = REAL_MODE_FORMAT (tmode);
1301 ifmt = REAL_MODE_FORMAT (imode);
1302 /* These conditions are conservative rather than trying to catch the
1303 exact boundary conditions; the main case to allow is IEEE float
1304 and double. */
1305 return (ifmt->b == tfmt->b
1306 && ifmt->p > 2 * tfmt->p
1307 && ifmt->emin < 2 * tfmt->emin - tfmt->p - 2
1308 && ifmt->emin < tfmt->emin - tfmt->emax - tfmt->p - 2
1309 && ifmt->emax > 2 * tfmt->emax + 2
1310 && ifmt->emax > tfmt->emax - tfmt->emin + tfmt->p + 2
1311 && ifmt->round_towards_zero == tfmt->round_towards_zero
1312 && (ifmt->has_sign_dependent_rounding
1313 == tfmt->has_sign_dependent_rounding)
1314 && ifmt->has_nans >= tfmt->has_nans
1315 && ifmt->has_inf >= tfmt->has_inf
1316 && ifmt->has_signed_zero >= tfmt->has_signed_zero
1317 && !MODE_COMPOSITE_P (tmode)
1318 && !MODE_COMPOSITE_P (imode));
1321 /* Render R as an integer. */
1323 HOST_WIDE_INT
1324 real_to_integer (const REAL_VALUE_TYPE *r)
1326 unsigned HOST_WIDE_INT i;
1328 switch (r->cl)
1330 case rvc_zero:
1331 underflow:
1332 return 0;
1334 case rvc_inf:
1335 case rvc_nan:
1336 overflow:
1337 i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1338 if (!r->sign)
1339 i--;
1340 return i;
1342 case rvc_normal:
1343 if (r->decimal)
1344 return decimal_real_to_integer (r);
1346 if (REAL_EXP (r) <= 0)
1347 goto underflow;
1348 /* Only force overflow for unsigned overflow. Signed overflow is
1349 undefined, so it doesn't matter what we return, and some callers
1350 expect to be able to use this routine for both signed and
1351 unsigned conversions. */
1352 if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT)
1353 goto overflow;
1355 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1356 i = r->sig[SIGSZ-1];
1357 else
1359 gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
1360 i = r->sig[SIGSZ-1];
1361 i = i << (HOST_BITS_PER_LONG - 1) << 1;
1362 i |= r->sig[SIGSZ-2];
1365 i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r);
1367 if (r->sign)
1368 i = -i;
1369 return i;
1371 default:
1372 gcc_unreachable ();
1376 /* Likewise, but producing a wide-int of PRECISION. If the value cannot
1377 be represented in precision, *FAIL is set to TRUE. */
1379 wide_int
1380 real_to_integer (const REAL_VALUE_TYPE *r, bool *fail, int precision)
1382 HOST_WIDE_INT val[2 * WIDE_INT_MAX_ELTS];
1383 int exp;
1384 int words, w;
1385 wide_int result;
1387 switch (r->cl)
1389 case rvc_zero:
1390 underflow:
1391 return wi::zero (precision);
1393 case rvc_inf:
1394 case rvc_nan:
1395 overflow:
1396 *fail = true;
1398 if (r->sign)
1399 return wi::set_bit_in_zero (precision - 1, precision);
1400 else
1401 return ~wi::set_bit_in_zero (precision - 1, precision);
1403 case rvc_normal:
1404 if (r->decimal)
1405 return decimal_real_to_integer (r, fail, precision);
1407 exp = REAL_EXP (r);
1408 if (exp <= 0)
1409 goto underflow;
1410 /* Only force overflow for unsigned overflow. Signed overflow is
1411 undefined, so it doesn't matter what we return, and some callers
1412 expect to be able to use this routine for both signed and
1413 unsigned conversions. */
1414 if (exp > precision)
1415 goto overflow;
1417 /* Put the significand into a wide_int that has precision W, which
1418 is the smallest HWI-multiple that has at least PRECISION bits.
1419 This ensures that the top bit of the significand is in the
1420 top bit of the wide_int. */
1421 words = (precision + HOST_BITS_PER_WIDE_INT - 1) / HOST_BITS_PER_WIDE_INT;
1422 w = words * HOST_BITS_PER_WIDE_INT;
1424 #if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1425 for (int i = 0; i < words; i++)
1427 int j = SIGSZ - words + i;
1428 val[i] = (j < 0) ? 0 : r->sig[j];
1430 #else
1431 gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
1432 for (int i = 0; i < words; i++)
1434 int j = SIGSZ - (words * 2) + (i * 2);
1435 if (j < 0)
1436 val[i] = 0;
1437 else
1438 val[i] = r->sig[j];
1439 j += 1;
1440 if (j >= 0)
1441 val[i] |= (unsigned HOST_WIDE_INT) r->sig[j] << HOST_BITS_PER_LONG;
1443 #endif
1444 /* Shift the value into place and truncate to the desired precision. */
1445 result = wide_int::from_array (val, words, w);
1446 result = wi::lrshift (result, w - exp);
1447 result = wide_int::from (result, precision, UNSIGNED);
1449 if (r->sign)
1450 return -result;
1451 else
1452 return result;
1454 default:
1455 gcc_unreachable ();
1459 /* A subroutine of real_to_decimal. Compute the quotient and remainder
1460 of NUM / DEN. Return the quotient and place the remainder in NUM.
1461 It is expected that NUM / DEN are close enough that the quotient is
1462 small. */
1464 static unsigned long
1465 rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den)
1467 unsigned long q, msb;
1468 int expn = REAL_EXP (num), expd = REAL_EXP (den);
1470 if (expn < expd)
1471 return 0;
1473 q = msb = 0;
1474 goto start;
1477 msb = num->sig[SIGSZ-1] & SIG_MSB;
1478 q <<= 1;
1479 lshift_significand_1 (num, num);
1480 start:
1481 if (msb || cmp_significands (num, den) >= 0)
1483 sub_significands (num, num, den, 0);
1484 q |= 1;
1487 while (--expn >= expd);
1489 SET_REAL_EXP (num, expd);
1490 normalize (num);
1492 return q;
1495 /* Render R as a decimal floating point constant. Emit DIGITS significant
1496 digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the
1497 maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing
1498 zeros. If MODE is VOIDmode, round to nearest value. Otherwise, round
1499 to a string that, when parsed back in mode MODE, yields the same value. */
1501 #define M_LOG10_2 0.30102999566398119521
1503 void
1504 real_to_decimal_for_mode (char *str, const REAL_VALUE_TYPE *r_orig,
1505 size_t buf_size, size_t digits,
1506 int crop_trailing_zeros, machine_mode mode)
1508 const struct real_format *fmt = NULL;
1509 const REAL_VALUE_TYPE *one, *ten;
1510 REAL_VALUE_TYPE r, pten, u, v;
1511 int dec_exp, cmp_one, digit;
1512 size_t max_digits;
1513 char *p, *first, *last;
1514 bool sign;
1515 bool round_up;
1517 if (mode != VOIDmode)
1519 fmt = REAL_MODE_FORMAT (mode);
1520 gcc_assert (fmt);
1523 r = *r_orig;
1524 switch (r.cl)
1526 case rvc_zero:
1527 strcpy (str, (r.sign ? "-0.0" : "0.0"));
1528 return;
1529 case rvc_normal:
1530 break;
1531 case rvc_inf:
1532 strcpy (str, (r.sign ? "-Inf" : "+Inf"));
1533 return;
1534 case rvc_nan:
1535 /* ??? Print the significand as well, if not canonical? */
1536 sprintf (str, "%c%cNaN", (r_orig->sign ? '-' : '+'),
1537 (r_orig->signalling ? 'S' : 'Q'));
1538 return;
1539 default:
1540 gcc_unreachable ();
1543 if (r.decimal)
1545 decimal_real_to_decimal (str, &r, buf_size, digits, crop_trailing_zeros);
1546 return;
1549 /* Bound the number of digits printed by the size of the representation. */
1550 max_digits = SIGNIFICAND_BITS * M_LOG10_2;
1551 if (digits == 0 || digits > max_digits)
1552 digits = max_digits;
1554 /* Estimate the decimal exponent, and compute the length of the string it
1555 will print as. Be conservative and add one to account for possible
1556 overflow or rounding error. */
1557 dec_exp = REAL_EXP (&r) * M_LOG10_2;
1558 for (max_digits = 1; dec_exp ; max_digits++)
1559 dec_exp /= 10;
1561 /* Bound the number of digits printed by the size of the output buffer. */
1562 max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
1563 gcc_assert (max_digits <= buf_size);
1564 if (digits > max_digits)
1565 digits = max_digits;
1567 one = real_digit (1);
1568 ten = ten_to_ptwo (0);
1570 sign = r.sign;
1571 r.sign = 0;
1573 dec_exp = 0;
1574 pten = *one;
1576 cmp_one = do_compare (&r, one, 0);
1577 if (cmp_one > 0)
1579 int m;
1581 /* Number is greater than one. Convert significand to an integer
1582 and strip trailing decimal zeros. */
1584 u = r;
1585 SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1);
1587 /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
1588 m = floor_log2 (max_digits);
1590 /* Iterate over the bits of the possible powers of 10 that might
1591 be present in U and eliminate them. That is, if we find that
1592 10**2**M divides U evenly, keep the division and increase
1593 DEC_EXP by 2**M. */
1596 REAL_VALUE_TYPE t;
1598 do_divide (&t, &u, ten_to_ptwo (m));
1599 do_fix_trunc (&v, &t);
1600 if (cmp_significands (&v, &t) == 0)
1602 u = t;
1603 dec_exp += 1 << m;
1606 while (--m >= 0);
1608 /* Revert the scaling to integer that we performed earlier. */
1609 SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r)
1610 - (SIGNIFICAND_BITS - 1));
1611 r = u;
1613 /* Find power of 10. Do this by dividing out 10**2**M when
1614 this is larger than the current remainder. Fill PTEN with
1615 the power of 10 that we compute. */
1616 if (REAL_EXP (&r) > 0)
1618 m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1;
1621 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1622 if (do_compare (&u, ptentwo, 0) >= 0)
1624 do_divide (&u, &u, ptentwo);
1625 do_multiply (&pten, &pten, ptentwo);
1626 dec_exp += 1 << m;
1629 while (--m >= 0);
1631 else
1632 /* We managed to divide off enough tens in the above reduction
1633 loop that we've now got a negative exponent. Fall into the
1634 less-than-one code to compute the proper value for PTEN. */
1635 cmp_one = -1;
1637 if (cmp_one < 0)
1639 int m;
1641 /* Number is less than one. Pad significand with leading
1642 decimal zeros. */
1644 v = r;
1645 while (1)
1647 /* Stop if we'd shift bits off the bottom. */
1648 if (v.sig[0] & 7)
1649 break;
1651 do_multiply (&u, &v, ten);
1653 /* Stop if we're now >= 1. */
1654 if (REAL_EXP (&u) > 0)
1655 break;
1657 v = u;
1658 dec_exp -= 1;
1660 r = v;
1662 /* Find power of 10. Do this by multiplying in P=10**2**M when
1663 the current remainder is smaller than 1/P. Fill PTEN with the
1664 power of 10 that we compute. */
1665 m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1;
1668 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1669 const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
1671 if (do_compare (&v, ptenmtwo, 0) <= 0)
1673 do_multiply (&v, &v, ptentwo);
1674 do_multiply (&pten, &pten, ptentwo);
1675 dec_exp -= 1 << m;
1678 while (--m >= 0);
1680 /* Invert the positive power of 10 that we've collected so far. */
1681 do_divide (&pten, one, &pten);
1684 p = str;
1685 if (sign)
1686 *p++ = '-';
1687 first = p++;
1689 /* At this point, PTEN should contain the nearest power of 10 smaller
1690 than R, such that this division produces the first digit.
1692 Using a divide-step primitive that returns the complete integral
1693 remainder avoids the rounding error that would be produced if
1694 we were to use do_divide here and then simply multiply by 10 for
1695 each subsequent digit. */
1697 digit = rtd_divmod (&r, &pten);
1699 /* Be prepared for error in that division via underflow ... */
1700 if (digit == 0 && cmp_significand_0 (&r))
1702 /* Multiply by 10 and try again. */
1703 do_multiply (&r, &r, ten);
1704 digit = rtd_divmod (&r, &pten);
1705 dec_exp -= 1;
1706 gcc_assert (digit != 0);
1709 /* ... or overflow. */
1710 if (digit == 10)
1712 *p++ = '1';
1713 if (--digits > 0)
1714 *p++ = '0';
1715 dec_exp += 1;
1717 else
1719 gcc_assert (digit <= 10);
1720 *p++ = digit + '0';
1723 /* Generate subsequent digits. */
1724 while (--digits > 0)
1726 do_multiply (&r, &r, ten);
1727 digit = rtd_divmod (&r, &pten);
1728 *p++ = digit + '0';
1730 last = p;
1732 /* Generate one more digit with which to do rounding. */
1733 do_multiply (&r, &r, ten);
1734 digit = rtd_divmod (&r, &pten);
1736 /* Round the result. */
1737 if (fmt && fmt->round_towards_zero)
1739 /* If the format uses round towards zero when parsing the string
1740 back in, we need to always round away from zero here. */
1741 if (cmp_significand_0 (&r))
1742 digit++;
1743 round_up = digit > 0;
1745 else
1747 if (digit == 5)
1749 /* Round to nearest. If R is nonzero there are additional
1750 nonzero digits to be extracted. */
1751 if (cmp_significand_0 (&r))
1752 digit++;
1753 /* Round to even. */
1754 else if ((p[-1] - '0') & 1)
1755 digit++;
1758 round_up = digit > 5;
1761 if (round_up)
1763 while (p > first)
1765 digit = *--p;
1766 if (digit == '9')
1767 *p = '0';
1768 else
1770 *p = digit + 1;
1771 break;
1775 /* Carry out of the first digit. This means we had all 9's and
1776 now have all 0's. "Prepend" a 1 by overwriting the first 0. */
1777 if (p == first)
1779 first[1] = '1';
1780 dec_exp++;
1784 /* Insert the decimal point. */
1785 first[0] = first[1];
1786 first[1] = '.';
1788 /* If requested, drop trailing zeros. Never crop past "1.0". */
1789 if (crop_trailing_zeros)
1790 while (last > first + 3 && last[-1] == '0')
1791 last--;
1793 /* Append the exponent. */
1794 sprintf (last, "e%+d", dec_exp);
1796 #ifdef ENABLE_CHECKING
1797 /* Verify that we can read the original value back in. */
1798 if (mode != VOIDmode)
1800 real_from_string (&r, str);
1801 real_convert (&r, mode, &r);
1802 gcc_assert (real_identical (&r, r_orig));
1804 #endif
1807 /* Likewise, except always uses round-to-nearest. */
1809 void
1810 real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
1811 size_t digits, int crop_trailing_zeros)
1813 real_to_decimal_for_mode (str, r_orig, buf_size,
1814 digits, crop_trailing_zeros, VOIDmode);
1817 /* Render R as a hexadecimal floating point constant. Emit DIGITS
1818 significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0,
1819 choose the maximum for the representation. If CROP_TRAILING_ZEROS,
1820 strip trailing zeros. */
1822 void
1823 real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
1824 size_t digits, int crop_trailing_zeros)
1826 int i, j, exp = REAL_EXP (r);
1827 char *p, *first;
1828 char exp_buf[16];
1829 size_t max_digits;
1831 switch (r->cl)
1833 case rvc_zero:
1834 exp = 0;
1835 break;
1836 case rvc_normal:
1837 break;
1838 case rvc_inf:
1839 strcpy (str, (r->sign ? "-Inf" : "+Inf"));
1840 return;
1841 case rvc_nan:
1842 /* ??? Print the significand as well, if not canonical? */
1843 sprintf (str, "%c%cNaN", (r->sign ? '-' : '+'),
1844 (r->signalling ? 'S' : 'Q'));
1845 return;
1846 default:
1847 gcc_unreachable ();
1850 if (r->decimal)
1852 /* Hexadecimal format for decimal floats is not interesting. */
1853 strcpy (str, "N/A");
1854 return;
1857 if (digits == 0)
1858 digits = SIGNIFICAND_BITS / 4;
1860 /* Bound the number of digits printed by the size of the output buffer. */
1862 sprintf (exp_buf, "p%+d", exp);
1863 max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
1864 gcc_assert (max_digits <= buf_size);
1865 if (digits > max_digits)
1866 digits = max_digits;
1868 p = str;
1869 if (r->sign)
1870 *p++ = '-';
1871 *p++ = '0';
1872 *p++ = 'x';
1873 *p++ = '0';
1874 *p++ = '.';
1875 first = p;
1877 for (i = SIGSZ - 1; i >= 0; --i)
1878 for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
1880 *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
1881 if (--digits == 0)
1882 goto out;
1885 out:
1886 if (crop_trailing_zeros)
1887 while (p > first + 1 && p[-1] == '0')
1888 p--;
1890 sprintf (p, "p%+d", exp);
1893 /* Initialize R from a decimal or hexadecimal string. The string is
1894 assumed to have been syntax checked already. Return -1 if the
1895 value underflows, +1 if overflows, and 0 otherwise. */
1898 real_from_string (REAL_VALUE_TYPE *r, const char *str)
1900 int exp = 0;
1901 bool sign = false;
1903 get_zero (r, 0);
1905 if (*str == '-')
1907 sign = true;
1908 str++;
1910 else if (*str == '+')
1911 str++;
1913 if (!strncmp (str, "QNaN", 4))
1915 get_canonical_qnan (r, sign);
1916 return 0;
1918 else if (!strncmp (str, "SNaN", 4))
1920 get_canonical_snan (r, sign);
1921 return 0;
1923 else if (!strncmp (str, "Inf", 3))
1925 get_inf (r, sign);
1926 return 0;
1929 if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1931 /* Hexadecimal floating point. */
1932 int pos = SIGNIFICAND_BITS - 4, d;
1934 str += 2;
1936 while (*str == '0')
1937 str++;
1938 while (1)
1940 d = hex_value (*str);
1941 if (d == _hex_bad)
1942 break;
1943 if (pos >= 0)
1945 r->sig[pos / HOST_BITS_PER_LONG]
1946 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1947 pos -= 4;
1949 else if (d)
1950 /* Ensure correct rounding by setting last bit if there is
1951 a subsequent nonzero digit. */
1952 r->sig[0] |= 1;
1953 exp += 4;
1954 str++;
1956 if (*str == '.')
1958 str++;
1959 if (pos == SIGNIFICAND_BITS - 4)
1961 while (*str == '0')
1962 str++, exp -= 4;
1964 while (1)
1966 d = hex_value (*str);
1967 if (d == _hex_bad)
1968 break;
1969 if (pos >= 0)
1971 r->sig[pos / HOST_BITS_PER_LONG]
1972 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1973 pos -= 4;
1975 else if (d)
1976 /* Ensure correct rounding by setting last bit if there is
1977 a subsequent nonzero digit. */
1978 r->sig[0] |= 1;
1979 str++;
1983 /* If the mantissa is zero, ignore the exponent. */
1984 if (!cmp_significand_0 (r))
1985 goto is_a_zero;
1987 if (*str == 'p' || *str == 'P')
1989 bool exp_neg = false;
1991 str++;
1992 if (*str == '-')
1994 exp_neg = true;
1995 str++;
1997 else if (*str == '+')
1998 str++;
2000 d = 0;
2001 while (ISDIGIT (*str))
2003 d *= 10;
2004 d += *str - '0';
2005 if (d > MAX_EXP)
2007 /* Overflowed the exponent. */
2008 if (exp_neg)
2009 goto underflow;
2010 else
2011 goto overflow;
2013 str++;
2015 if (exp_neg)
2016 d = -d;
2018 exp += d;
2021 r->cl = rvc_normal;
2022 SET_REAL_EXP (r, exp);
2024 normalize (r);
2026 else
2028 /* Decimal floating point. */
2029 const char *cstr = str;
2030 mpfr_t m;
2031 bool inexact;
2033 while (*cstr == '0')
2034 cstr++;
2035 if (*cstr == '.')
2037 cstr++;
2038 while (*cstr == '0')
2039 cstr++;
2042 /* If the mantissa is zero, ignore the exponent. */
2043 if (!ISDIGIT (*cstr))
2044 goto is_a_zero;
2046 /* Nonzero value, possibly overflowing or underflowing. */
2047 mpfr_init2 (m, SIGNIFICAND_BITS);
2048 inexact = mpfr_strtofr (m, str, NULL, 10, GMP_RNDZ);
2049 /* The result should never be a NaN, and because the rounding is
2050 toward zero should never be an infinity. */
2051 gcc_assert (!mpfr_nan_p (m) && !mpfr_inf_p (m));
2052 if (mpfr_zero_p (m) || mpfr_get_exp (m) < -MAX_EXP + 4)
2054 mpfr_clear (m);
2055 goto underflow;
2057 else if (mpfr_get_exp (m) > MAX_EXP - 4)
2059 mpfr_clear (m);
2060 goto overflow;
2062 else
2064 real_from_mpfr (r, m, NULL_TREE, GMP_RNDZ);
2065 /* 1 to 3 bits may have been shifted off (with a sticky bit)
2066 because the hex digits used in real_from_mpfr did not
2067 start with a digit 8 to f, but the exponent bounds above
2068 should have avoided underflow or overflow. */
2069 gcc_assert (r->cl = rvc_normal);
2070 /* Set a sticky bit if mpfr_strtofr was inexact. */
2071 r->sig[0] |= inexact;
2072 mpfr_clear (m);
2076 r->sign = sign;
2077 return 0;
2079 is_a_zero:
2080 get_zero (r, sign);
2081 return 0;
2083 underflow:
2084 get_zero (r, sign);
2085 return -1;
2087 overflow:
2088 get_inf (r, sign);
2089 return 1;
2092 /* Legacy. Similar, but return the result directly. */
2094 REAL_VALUE_TYPE
2095 real_from_string2 (const char *s, machine_mode mode)
2097 REAL_VALUE_TYPE r;
2099 real_from_string (&r, s);
2100 if (mode != VOIDmode)
2101 real_convert (&r, mode, &r);
2103 return r;
2106 /* Initialize R from string S and desired MODE. */
2108 void
2109 real_from_string3 (REAL_VALUE_TYPE *r, const char *s, machine_mode mode)
2111 if (DECIMAL_FLOAT_MODE_P (mode))
2112 decimal_real_from_string (r, s);
2113 else
2114 real_from_string (r, s);
2116 if (mode != VOIDmode)
2117 real_convert (r, mode, r);
2120 /* Initialize R from the wide_int VAL_IN. The MODE is not VOIDmode,*/
2122 void
2123 real_from_integer (REAL_VALUE_TYPE *r, machine_mode mode,
2124 const wide_int_ref &val_in, signop sgn)
2126 if (val_in == 0)
2127 get_zero (r, 0);
2128 else
2130 unsigned int len = val_in.get_precision ();
2131 int i, j, e = 0;
2132 int maxbitlen = MAX_BITSIZE_MODE_ANY_INT + HOST_BITS_PER_WIDE_INT;
2133 const unsigned int realmax = (SIGNIFICAND_BITS / HOST_BITS_PER_WIDE_INT
2134 * HOST_BITS_PER_WIDE_INT);
2136 memset (r, 0, sizeof (*r));
2137 r->cl = rvc_normal;
2138 r->sign = wi::neg_p (val_in, sgn);
2140 /* We have to ensure we can negate the largest negative number. */
2141 wide_int val = wide_int::from (val_in, maxbitlen, sgn);
2143 if (r->sign)
2144 val = -val;
2146 /* Ensure a multiple of HOST_BITS_PER_WIDE_INT, ceiling, as elt
2147 won't work with precisions that are not a multiple of
2148 HOST_BITS_PER_WIDE_INT. */
2149 len += HOST_BITS_PER_WIDE_INT - 1;
2151 /* Ensure we can represent the largest negative number. */
2152 len += 1;
2154 len = len/HOST_BITS_PER_WIDE_INT * HOST_BITS_PER_WIDE_INT;
2156 /* Cap the size to the size allowed by real.h. */
2157 if (len > realmax)
2159 HOST_WIDE_INT cnt_l_z;
2160 cnt_l_z = wi::clz (val);
2162 if (maxbitlen - cnt_l_z > realmax)
2164 e = maxbitlen - cnt_l_z - realmax;
2166 /* This value is too large, we must shift it right to
2167 preserve all the bits we can, and then bump the
2168 exponent up by that amount. */
2169 val = wi::lrshift (val, e);
2171 len = realmax;
2174 /* Clear out top bits so elt will work with precisions that aren't
2175 a multiple of HOST_BITS_PER_WIDE_INT. */
2176 val = wide_int::from (val, len, sgn);
2177 len = len / HOST_BITS_PER_WIDE_INT;
2179 SET_REAL_EXP (r, len * HOST_BITS_PER_WIDE_INT + e);
2181 j = SIGSZ - 1;
2182 if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
2183 for (i = len - 1; i >= 0; i--)
2185 r->sig[j--] = val.elt (i);
2186 if (j < 0)
2187 break;
2189 else
2191 gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
2192 for (i = len - 1; i >= 0; i--)
2194 HOST_WIDE_INT e = val.elt (i);
2195 r->sig[j--] = e >> (HOST_BITS_PER_LONG - 1) >> 1;
2196 if (j < 0)
2197 break;
2198 r->sig[j--] = e;
2199 if (j < 0)
2200 break;
2204 normalize (r);
2207 if (DECIMAL_FLOAT_MODE_P (mode))
2208 decimal_from_integer (r);
2209 else if (mode != VOIDmode)
2210 real_convert (r, mode, r);
2213 /* Render R, an integral value, as a floating point constant with no
2214 specified exponent. */
2216 static void
2217 decimal_integer_string (char *str, const REAL_VALUE_TYPE *r_orig,
2218 size_t buf_size)
2220 int dec_exp, digit, digits;
2221 REAL_VALUE_TYPE r, pten;
2222 char *p;
2223 bool sign;
2225 r = *r_orig;
2227 if (r.cl == rvc_zero)
2229 strcpy (str, "0.");
2230 return;
2233 sign = r.sign;
2234 r.sign = 0;
2236 dec_exp = REAL_EXP (&r) * M_LOG10_2;
2237 digits = dec_exp + 1;
2238 gcc_assert ((digits + 2) < (int)buf_size);
2240 pten = *real_digit (1);
2241 times_pten (&pten, dec_exp);
2243 p = str;
2244 if (sign)
2245 *p++ = '-';
2247 digit = rtd_divmod (&r, &pten);
2248 gcc_assert (digit >= 0 && digit <= 9);
2249 *p++ = digit + '0';
2250 while (--digits > 0)
2252 times_pten (&r, 1);
2253 digit = rtd_divmod (&r, &pten);
2254 *p++ = digit + '0';
2256 *p++ = '.';
2257 *p++ = '\0';
2260 /* Convert a real with an integral value to decimal float. */
2262 static void
2263 decimal_from_integer (REAL_VALUE_TYPE *r)
2265 char str[256];
2267 decimal_integer_string (str, r, sizeof (str) - 1);
2268 decimal_real_from_string (r, str);
2271 /* Returns 10**2**N. */
2273 static const REAL_VALUE_TYPE *
2274 ten_to_ptwo (int n)
2276 static REAL_VALUE_TYPE tens[EXP_BITS];
2278 gcc_assert (n >= 0);
2279 gcc_assert (n < EXP_BITS);
2281 if (tens[n].cl == rvc_zero)
2283 if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2285 HOST_WIDE_INT t = 10;
2286 int i;
2288 for (i = 0; i < n; ++i)
2289 t *= t;
2291 real_from_integer (&tens[n], VOIDmode, t, UNSIGNED);
2293 else
2295 const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2296 do_multiply (&tens[n], t, t);
2300 return &tens[n];
2303 /* Returns 10**(-2**N). */
2305 static const REAL_VALUE_TYPE *
2306 ten_to_mptwo (int n)
2308 static REAL_VALUE_TYPE tens[EXP_BITS];
2310 gcc_assert (n >= 0);
2311 gcc_assert (n < EXP_BITS);
2313 if (tens[n].cl == rvc_zero)
2314 do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2316 return &tens[n];
2319 /* Returns N. */
2321 static const REAL_VALUE_TYPE *
2322 real_digit (int n)
2324 static REAL_VALUE_TYPE num[10];
2326 gcc_assert (n >= 0);
2327 gcc_assert (n <= 9);
2329 if (n > 0 && num[n].cl == rvc_zero)
2330 real_from_integer (&num[n], VOIDmode, n, UNSIGNED);
2332 return &num[n];
2335 /* Multiply R by 10**EXP. */
2337 static void
2338 times_pten (REAL_VALUE_TYPE *r, int exp)
2340 REAL_VALUE_TYPE pten, *rr;
2341 bool negative = (exp < 0);
2342 int i;
2344 if (negative)
2346 exp = -exp;
2347 pten = *real_digit (1);
2348 rr = &pten;
2350 else
2351 rr = r;
2353 for (i = 0; exp > 0; ++i, exp >>= 1)
2354 if (exp & 1)
2355 do_multiply (rr, rr, ten_to_ptwo (i));
2357 if (negative)
2358 do_divide (r, r, &pten);
2361 /* Returns the special REAL_VALUE_TYPE corresponding to 'e'. */
2363 const REAL_VALUE_TYPE *
2364 dconst_e_ptr (void)
2366 static REAL_VALUE_TYPE value;
2368 /* Initialize mathematical constants for constant folding builtins.
2369 These constants need to be given to at least 160 bits precision. */
2370 if (value.cl == rvc_zero)
2372 mpfr_t m;
2373 mpfr_init2 (m, SIGNIFICAND_BITS);
2374 mpfr_set_ui (m, 1, GMP_RNDN);
2375 mpfr_exp (m, m, GMP_RNDN);
2376 real_from_mpfr (&value, m, NULL_TREE, GMP_RNDN);
2377 mpfr_clear (m);
2380 return &value;
2383 /* Returns the special REAL_VALUE_TYPE corresponding to 1/3. */
2385 const REAL_VALUE_TYPE *
2386 dconst_third_ptr (void)
2388 static REAL_VALUE_TYPE value;
2390 /* Initialize mathematical constants for constant folding builtins.
2391 These constants need to be given to at least 160 bits precision. */
2392 if (value.cl == rvc_zero)
2394 real_arithmetic (&value, RDIV_EXPR, &dconst1, real_digit (3));
2396 return &value;
2399 /* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2). */
2401 const REAL_VALUE_TYPE *
2402 dconst_sqrt2_ptr (void)
2404 static REAL_VALUE_TYPE value;
2406 /* Initialize mathematical constants for constant folding builtins.
2407 These constants need to be given to at least 160 bits precision. */
2408 if (value.cl == rvc_zero)
2410 mpfr_t m;
2411 mpfr_init2 (m, SIGNIFICAND_BITS);
2412 mpfr_sqrt_ui (m, 2, GMP_RNDN);
2413 real_from_mpfr (&value, m, NULL_TREE, GMP_RNDN);
2414 mpfr_clear (m);
2416 return &value;
2419 /* Fills R with +Inf. */
2421 void
2422 real_inf (REAL_VALUE_TYPE *r)
2424 get_inf (r, 0);
2427 /* Fills R with a NaN whose significand is described by STR. If QUIET,
2428 we force a QNaN, else we force an SNaN. The string, if not empty,
2429 is parsed as a number and placed in the significand. Return true
2430 if the string was successfully parsed. */
2432 bool
2433 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2434 machine_mode mode)
2436 const struct real_format *fmt;
2438 fmt = REAL_MODE_FORMAT (mode);
2439 gcc_assert (fmt);
2441 if (*str == 0)
2443 if (quiet)
2444 get_canonical_qnan (r, 0);
2445 else
2446 get_canonical_snan (r, 0);
2448 else
2450 int base = 10, d;
2452 memset (r, 0, sizeof (*r));
2453 r->cl = rvc_nan;
2455 /* Parse akin to strtol into the significand of R. */
2457 while (ISSPACE (*str))
2458 str++;
2459 if (*str == '-')
2460 str++;
2461 else if (*str == '+')
2462 str++;
2463 if (*str == '0')
2465 str++;
2466 if (*str == 'x' || *str == 'X')
2468 base = 16;
2469 str++;
2471 else
2472 base = 8;
2475 while ((d = hex_value (*str)) < base)
2477 REAL_VALUE_TYPE u;
2479 switch (base)
2481 case 8:
2482 lshift_significand (r, r, 3);
2483 break;
2484 case 16:
2485 lshift_significand (r, r, 4);
2486 break;
2487 case 10:
2488 lshift_significand_1 (&u, r);
2489 lshift_significand (r, r, 3);
2490 add_significands (r, r, &u);
2491 break;
2492 default:
2493 gcc_unreachable ();
2496 get_zero (&u, 0);
2497 u.sig[0] = d;
2498 add_significands (r, r, &u);
2500 str++;
2503 /* Must have consumed the entire string for success. */
2504 if (*str != 0)
2505 return false;
2507 /* Shift the significand into place such that the bits
2508 are in the most significant bits for the format. */
2509 lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
2511 /* Our MSB is always unset for NaNs. */
2512 r->sig[SIGSZ-1] &= ~SIG_MSB;
2514 /* Force quiet or signalling NaN. */
2515 r->signalling = !quiet;
2518 return true;
2521 /* Fills R with the largest finite value representable in mode MODE.
2522 If SIGN is nonzero, R is set to the most negative finite value. */
2524 void
2525 real_maxval (REAL_VALUE_TYPE *r, int sign, machine_mode mode)
2527 const struct real_format *fmt;
2528 int np2;
2530 fmt = REAL_MODE_FORMAT (mode);
2531 gcc_assert (fmt);
2532 memset (r, 0, sizeof (*r));
2534 if (fmt->b == 10)
2535 decimal_real_maxval (r, sign, mode);
2536 else
2538 r->cl = rvc_normal;
2539 r->sign = sign;
2540 SET_REAL_EXP (r, fmt->emax);
2542 np2 = SIGNIFICAND_BITS - fmt->p;
2543 memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
2544 clear_significand_below (r, np2);
2546 if (fmt->pnan < fmt->p)
2547 /* This is an IBM extended double format made up of two IEEE
2548 doubles. The value of the long double is the sum of the
2549 values of the two parts. The most significant part is
2550 required to be the value of the long double rounded to the
2551 nearest double. Rounding means we need a slightly smaller
2552 value for LDBL_MAX. */
2553 clear_significand_bit (r, SIGNIFICAND_BITS - fmt->pnan - 1);
2557 /* Fills R with 2**N. */
2559 void
2560 real_2expN (REAL_VALUE_TYPE *r, int n, machine_mode fmode)
2562 memset (r, 0, sizeof (*r));
2564 n++;
2565 if (n > MAX_EXP)
2566 r->cl = rvc_inf;
2567 else if (n < -MAX_EXP)
2569 else
2571 r->cl = rvc_normal;
2572 SET_REAL_EXP (r, n);
2573 r->sig[SIGSZ-1] = SIG_MSB;
2575 if (DECIMAL_FLOAT_MODE_P (fmode))
2576 decimal_real_convert (r, fmode, r);
2580 static void
2581 round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
2583 int p2, np2, i, w;
2584 int emin2m1, emax2;
2585 bool round_up = false;
2587 if (r->decimal)
2589 if (fmt->b == 10)
2591 decimal_round_for_format (fmt, r);
2592 return;
2594 /* FIXME. We can come here via fp_easy_constant
2595 (e.g. -O0 on '_Decimal32 x = 1.0 + 2.0dd'), but have not
2596 investigated whether this convert needs to be here, or
2597 something else is missing. */
2598 decimal_real_convert (r, DFmode, r);
2601 p2 = fmt->p;
2602 emin2m1 = fmt->emin - 1;
2603 emax2 = fmt->emax;
2605 np2 = SIGNIFICAND_BITS - p2;
2606 switch (r->cl)
2608 underflow:
2609 get_zero (r, r->sign);
2610 case rvc_zero:
2611 if (!fmt->has_signed_zero)
2612 r->sign = 0;
2613 return;
2615 overflow:
2616 get_inf (r, r->sign);
2617 case rvc_inf:
2618 return;
2620 case rvc_nan:
2621 clear_significand_below (r, np2);
2622 return;
2624 case rvc_normal:
2625 break;
2627 default:
2628 gcc_unreachable ();
2631 /* Check the range of the exponent. If we're out of range,
2632 either underflow or overflow. */
2633 if (REAL_EXP (r) > emax2)
2634 goto overflow;
2635 else if (REAL_EXP (r) <= emin2m1)
2637 int diff;
2639 if (!fmt->has_denorm)
2641 /* Don't underflow completely until we've had a chance to round. */
2642 if (REAL_EXP (r) < emin2m1)
2643 goto underflow;
2645 else
2647 diff = emin2m1 - REAL_EXP (r) + 1;
2648 if (diff > p2)
2649 goto underflow;
2651 /* De-normalize the significand. */
2652 r->sig[0] |= sticky_rshift_significand (r, r, diff);
2653 SET_REAL_EXP (r, REAL_EXP (r) + diff);
2657 if (!fmt->round_towards_zero)
2659 /* There are P2 true significand bits, followed by one guard bit,
2660 followed by one sticky bit, followed by stuff. Fold nonzero
2661 stuff into the sticky bit. */
2662 unsigned long sticky;
2663 bool guard, lsb;
2665 sticky = 0;
2666 for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2667 sticky |= r->sig[i];
2668 sticky |= r->sig[w]
2669 & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2671 guard = test_significand_bit (r, np2 - 1);
2672 lsb = test_significand_bit (r, np2);
2674 /* Round to even. */
2675 round_up = guard && (sticky || lsb);
2678 if (round_up)
2680 REAL_VALUE_TYPE u;
2681 get_zero (&u, 0);
2682 set_significand_bit (&u, np2);
2684 if (add_significands (r, r, &u))
2686 /* Overflow. Means the significand had been all ones, and
2687 is now all zeros. Need to increase the exponent, and
2688 possibly re-normalize it. */
2689 SET_REAL_EXP (r, REAL_EXP (r) + 1);
2690 if (REAL_EXP (r) > emax2)
2691 goto overflow;
2692 r->sig[SIGSZ-1] = SIG_MSB;
2696 /* Catch underflow that we deferred until after rounding. */
2697 if (REAL_EXP (r) <= emin2m1)
2698 goto underflow;
2700 /* Clear out trailing garbage. */
2701 clear_significand_below (r, np2);
2704 /* Extend or truncate to a new mode. */
2706 void
2707 real_convert (REAL_VALUE_TYPE *r, machine_mode mode,
2708 const REAL_VALUE_TYPE *a)
2710 const struct real_format *fmt;
2712 fmt = REAL_MODE_FORMAT (mode);
2713 gcc_assert (fmt);
2715 *r = *a;
2717 if (a->decimal || fmt->b == 10)
2718 decimal_real_convert (r, mode, a);
2720 round_for_format (fmt, r);
2722 /* round_for_format de-normalizes denormals. Undo just that part. */
2723 if (r->cl == rvc_normal)
2724 normalize (r);
2727 /* Legacy. Likewise, except return the struct directly. */
2729 REAL_VALUE_TYPE
2730 real_value_truncate (machine_mode mode, REAL_VALUE_TYPE a)
2732 REAL_VALUE_TYPE r;
2733 real_convert (&r, mode, &a);
2734 return r;
2737 /* Return true if truncating to MODE is exact. */
2739 bool
2740 exact_real_truncate (machine_mode mode, const REAL_VALUE_TYPE *a)
2742 const struct real_format *fmt;
2743 REAL_VALUE_TYPE t;
2744 int emin2m1;
2746 fmt = REAL_MODE_FORMAT (mode);
2747 gcc_assert (fmt);
2749 /* Don't allow conversion to denormals. */
2750 emin2m1 = fmt->emin - 1;
2751 if (REAL_EXP (a) <= emin2m1)
2752 return false;
2754 /* After conversion to the new mode, the value must be identical. */
2755 real_convert (&t, mode, a);
2756 return real_identical (&t, a);
2759 /* Write R to the given target format. Place the words of the result
2760 in target word order in BUF. There are always 32 bits in each
2761 long, no matter the size of the host long.
2763 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2765 long
2766 real_to_target_fmt (long *buf, const REAL_VALUE_TYPE *r_orig,
2767 const struct real_format *fmt)
2769 REAL_VALUE_TYPE r;
2770 long buf1;
2772 r = *r_orig;
2773 round_for_format (fmt, &r);
2775 if (!buf)
2776 buf = &buf1;
2777 (*fmt->encode) (fmt, buf, &r);
2779 return *buf;
2782 /* Similar, but look up the format from MODE. */
2784 long
2785 real_to_target (long *buf, const REAL_VALUE_TYPE *r, machine_mode mode)
2787 const struct real_format *fmt;
2789 fmt = REAL_MODE_FORMAT (mode);
2790 gcc_assert (fmt);
2792 return real_to_target_fmt (buf, r, fmt);
2795 /* Read R from the given target format. Read the words of the result
2796 in target word order in BUF. There are always 32 bits in each
2797 long, no matter the size of the host long. */
2799 void
2800 real_from_target_fmt (REAL_VALUE_TYPE *r, const long *buf,
2801 const struct real_format *fmt)
2803 (*fmt->decode) (fmt, r, buf);
2806 /* Similar, but look up the format from MODE. */
2808 void
2809 real_from_target (REAL_VALUE_TYPE *r, const long *buf, machine_mode mode)
2811 const struct real_format *fmt;
2813 fmt = REAL_MODE_FORMAT (mode);
2814 gcc_assert (fmt);
2816 (*fmt->decode) (fmt, r, buf);
2819 /* Return the number of bits of the largest binary value that the
2820 significand of MODE will hold. */
2821 /* ??? Legacy. Should get access to real_format directly. */
2824 significand_size (machine_mode mode)
2826 const struct real_format *fmt;
2828 fmt = REAL_MODE_FORMAT (mode);
2829 if (fmt == NULL)
2830 return 0;
2832 if (fmt->b == 10)
2834 /* Return the size in bits of the largest binary value that can be
2835 held by the decimal coefficient for this mode. This is one more
2836 than the number of bits required to hold the largest coefficient
2837 of this mode. */
2838 double log2_10 = 3.3219281;
2839 return fmt->p * log2_10;
2841 return fmt->p;
2844 /* Return a hash value for the given real value. */
2845 /* ??? The "unsigned int" return value is intended to be hashval_t,
2846 but I didn't want to pull hashtab.h into real.h. */
2848 unsigned int
2849 real_hash (const REAL_VALUE_TYPE *r)
2851 unsigned int h;
2852 size_t i;
2854 h = r->cl | (r->sign << 2);
2855 switch (r->cl)
2857 case rvc_zero:
2858 case rvc_inf:
2859 return h;
2861 case rvc_normal:
2862 h |= REAL_EXP (r) << 3;
2863 break;
2865 case rvc_nan:
2866 if (r->signalling)
2867 h ^= (unsigned int)-1;
2868 if (r->canonical)
2869 return h;
2870 break;
2872 default:
2873 gcc_unreachable ();
2876 if (sizeof (unsigned long) > sizeof (unsigned int))
2877 for (i = 0; i < SIGSZ; ++i)
2879 unsigned long s = r->sig[i];
2880 h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2882 else
2883 for (i = 0; i < SIGSZ; ++i)
2884 h ^= r->sig[i];
2886 return h;
2889 /* IEEE single-precision format. */
2891 static void encode_ieee_single (const struct real_format *fmt,
2892 long *, const REAL_VALUE_TYPE *);
2893 static void decode_ieee_single (const struct real_format *,
2894 REAL_VALUE_TYPE *, const long *);
2896 static void
2897 encode_ieee_single (const struct real_format *fmt, long *buf,
2898 const REAL_VALUE_TYPE *r)
2900 unsigned long image, sig, exp;
2901 unsigned long sign = r->sign;
2902 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2904 image = sign << 31;
2905 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2907 switch (r->cl)
2909 case rvc_zero:
2910 break;
2912 case rvc_inf:
2913 if (fmt->has_inf)
2914 image |= 255 << 23;
2915 else
2916 image |= 0x7fffffff;
2917 break;
2919 case rvc_nan:
2920 if (fmt->has_nans)
2922 if (r->canonical)
2923 sig = (fmt->canonical_nan_lsbs_set ? (1 << 22) - 1 : 0);
2924 if (r->signalling == fmt->qnan_msb_set)
2925 sig &= ~(1 << 22);
2926 else
2927 sig |= 1 << 22;
2928 if (sig == 0)
2929 sig = 1 << 21;
2931 image |= 255 << 23;
2932 image |= sig;
2934 else
2935 image |= 0x7fffffff;
2936 break;
2938 case rvc_normal:
2939 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2940 whereas the intermediate representation is 0.F x 2**exp.
2941 Which means we're off by one. */
2942 if (denormal)
2943 exp = 0;
2944 else
2945 exp = REAL_EXP (r) + 127 - 1;
2946 image |= exp << 23;
2947 image |= sig;
2948 break;
2950 default:
2951 gcc_unreachable ();
2954 buf[0] = image;
2957 static void
2958 decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2959 const long *buf)
2961 unsigned long image = buf[0] & 0xffffffff;
2962 bool sign = (image >> 31) & 1;
2963 int exp = (image >> 23) & 0xff;
2965 memset (r, 0, sizeof (*r));
2966 image <<= HOST_BITS_PER_LONG - 24;
2967 image &= ~SIG_MSB;
2969 if (exp == 0)
2971 if (image && fmt->has_denorm)
2973 r->cl = rvc_normal;
2974 r->sign = sign;
2975 SET_REAL_EXP (r, -126);
2976 r->sig[SIGSZ-1] = image << 1;
2977 normalize (r);
2979 else if (fmt->has_signed_zero)
2980 r->sign = sign;
2982 else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
2984 if (image)
2986 r->cl = rvc_nan;
2987 r->sign = sign;
2988 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
2989 ^ fmt->qnan_msb_set);
2990 r->sig[SIGSZ-1] = image;
2992 else
2994 r->cl = rvc_inf;
2995 r->sign = sign;
2998 else
3000 r->cl = rvc_normal;
3001 r->sign = sign;
3002 SET_REAL_EXP (r, exp - 127 + 1);
3003 r->sig[SIGSZ-1] = image | SIG_MSB;
3007 const struct real_format ieee_single_format =
3009 encode_ieee_single,
3010 decode_ieee_single,
3014 -125,
3015 128,
3018 false,
3019 true,
3020 true,
3021 true,
3022 true,
3023 true,
3024 true,
3025 false
3028 const struct real_format mips_single_format =
3030 encode_ieee_single,
3031 decode_ieee_single,
3035 -125,
3036 128,
3039 false,
3040 true,
3041 true,
3042 true,
3043 true,
3044 true,
3045 false,
3046 true
3049 const struct real_format motorola_single_format =
3051 encode_ieee_single,
3052 decode_ieee_single,
3056 -125,
3057 128,
3060 false,
3061 true,
3062 true,
3063 true,
3064 true,
3065 true,
3066 true,
3067 true
3070 /* SPU Single Precision (Extended-Range Mode) format is the same as IEEE
3071 single precision with the following differences:
3072 - Infinities are not supported. Instead MAX_FLOAT or MIN_FLOAT
3073 are generated.
3074 - NaNs are not supported.
3075 - The range of non-zero numbers in binary is
3076 (001)[1.]000...000 to (255)[1.]111...111.
3077 - Denormals can be represented, but are treated as +0.0 when
3078 used as an operand and are never generated as a result.
3079 - -0.0 can be represented, but a zero result is always +0.0.
3080 - the only supported rounding mode is trunction (towards zero). */
3081 const struct real_format spu_single_format =
3083 encode_ieee_single,
3084 decode_ieee_single,
3088 -125,
3089 129,
3092 true,
3093 false,
3094 false,
3095 false,
3096 true,
3097 true,
3098 false,
3099 false
3102 /* IEEE double-precision format. */
3104 static void encode_ieee_double (const struct real_format *fmt,
3105 long *, const REAL_VALUE_TYPE *);
3106 static void decode_ieee_double (const struct real_format *,
3107 REAL_VALUE_TYPE *, const long *);
3109 static void
3110 encode_ieee_double (const struct real_format *fmt, long *buf,
3111 const REAL_VALUE_TYPE *r)
3113 unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
3114 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3116 image_hi = r->sign << 31;
3117 image_lo = 0;
3119 if (HOST_BITS_PER_LONG == 64)
3121 sig_hi = r->sig[SIGSZ-1];
3122 sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
3123 sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
3125 else
3127 sig_hi = r->sig[SIGSZ-1];
3128 sig_lo = r->sig[SIGSZ-2];
3129 sig_lo = (sig_hi << 21) | (sig_lo >> 11);
3130 sig_hi = (sig_hi >> 11) & 0xfffff;
3133 switch (r->cl)
3135 case rvc_zero:
3136 break;
3138 case rvc_inf:
3139 if (fmt->has_inf)
3140 image_hi |= 2047 << 20;
3141 else
3143 image_hi |= 0x7fffffff;
3144 image_lo = 0xffffffff;
3146 break;
3148 case rvc_nan:
3149 if (fmt->has_nans)
3151 if (r->canonical)
3153 if (fmt->canonical_nan_lsbs_set)
3155 sig_hi = (1 << 19) - 1;
3156 sig_lo = 0xffffffff;
3158 else
3160 sig_hi = 0;
3161 sig_lo = 0;
3164 if (r->signalling == fmt->qnan_msb_set)
3165 sig_hi &= ~(1 << 19);
3166 else
3167 sig_hi |= 1 << 19;
3168 if (sig_hi == 0 && sig_lo == 0)
3169 sig_hi = 1 << 18;
3171 image_hi |= 2047 << 20;
3172 image_hi |= sig_hi;
3173 image_lo = sig_lo;
3175 else
3177 image_hi |= 0x7fffffff;
3178 image_lo = 0xffffffff;
3180 break;
3182 case rvc_normal:
3183 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3184 whereas the intermediate representation is 0.F x 2**exp.
3185 Which means we're off by one. */
3186 if (denormal)
3187 exp = 0;
3188 else
3189 exp = REAL_EXP (r) + 1023 - 1;
3190 image_hi |= exp << 20;
3191 image_hi |= sig_hi;
3192 image_lo = sig_lo;
3193 break;
3195 default:
3196 gcc_unreachable ();
3199 if (FLOAT_WORDS_BIG_ENDIAN)
3200 buf[0] = image_hi, buf[1] = image_lo;
3201 else
3202 buf[0] = image_lo, buf[1] = image_hi;
3205 static void
3206 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3207 const long *buf)
3209 unsigned long image_hi, image_lo;
3210 bool sign;
3211 int exp;
3213 if (FLOAT_WORDS_BIG_ENDIAN)
3214 image_hi = buf[0], image_lo = buf[1];
3215 else
3216 image_lo = buf[0], image_hi = buf[1];
3217 image_lo &= 0xffffffff;
3218 image_hi &= 0xffffffff;
3220 sign = (image_hi >> 31) & 1;
3221 exp = (image_hi >> 20) & 0x7ff;
3223 memset (r, 0, sizeof (*r));
3225 image_hi <<= 32 - 21;
3226 image_hi |= image_lo >> 21;
3227 image_hi &= 0x7fffffff;
3228 image_lo <<= 32 - 21;
3230 if (exp == 0)
3232 if ((image_hi || image_lo) && fmt->has_denorm)
3234 r->cl = rvc_normal;
3235 r->sign = sign;
3236 SET_REAL_EXP (r, -1022);
3237 if (HOST_BITS_PER_LONG == 32)
3239 image_hi = (image_hi << 1) | (image_lo >> 31);
3240 image_lo <<= 1;
3241 r->sig[SIGSZ-1] = image_hi;
3242 r->sig[SIGSZ-2] = image_lo;
3244 else
3246 image_hi = (image_hi << 31 << 2) | (image_lo << 1);
3247 r->sig[SIGSZ-1] = image_hi;
3249 normalize (r);
3251 else if (fmt->has_signed_zero)
3252 r->sign = sign;
3254 else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
3256 if (image_hi || image_lo)
3258 r->cl = rvc_nan;
3259 r->sign = sign;
3260 r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3261 if (HOST_BITS_PER_LONG == 32)
3263 r->sig[SIGSZ-1] = image_hi;
3264 r->sig[SIGSZ-2] = image_lo;
3266 else
3267 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
3269 else
3271 r->cl = rvc_inf;
3272 r->sign = sign;
3275 else
3277 r->cl = rvc_normal;
3278 r->sign = sign;
3279 SET_REAL_EXP (r, exp - 1023 + 1);
3280 if (HOST_BITS_PER_LONG == 32)
3282 r->sig[SIGSZ-1] = image_hi | SIG_MSB;
3283 r->sig[SIGSZ-2] = image_lo;
3285 else
3286 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
3290 const struct real_format ieee_double_format =
3292 encode_ieee_double,
3293 decode_ieee_double,
3297 -1021,
3298 1024,
3301 false,
3302 true,
3303 true,
3304 true,
3305 true,
3306 true,
3307 true,
3308 false
3311 const struct real_format mips_double_format =
3313 encode_ieee_double,
3314 decode_ieee_double,
3318 -1021,
3319 1024,
3322 false,
3323 true,
3324 true,
3325 true,
3326 true,
3327 true,
3328 false,
3329 true
3332 const struct real_format motorola_double_format =
3334 encode_ieee_double,
3335 decode_ieee_double,
3339 -1021,
3340 1024,
3343 false,
3344 true,
3345 true,
3346 true,
3347 true,
3348 true,
3349 true,
3350 true
3353 /* IEEE extended real format. This comes in three flavors: Intel's as
3354 a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
3355 12- and 16-byte images may be big- or little endian; Motorola's is
3356 always big endian. */
3358 /* Helper subroutine which converts from the internal format to the
3359 12-byte little-endian Intel format. Functions below adjust this
3360 for the other possible formats. */
3361 static void
3362 encode_ieee_extended (const struct real_format *fmt, long *buf,
3363 const REAL_VALUE_TYPE *r)
3365 unsigned long image_hi, sig_hi, sig_lo;
3366 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3368 image_hi = r->sign << 15;
3369 sig_hi = sig_lo = 0;
3371 switch (r->cl)
3373 case rvc_zero:
3374 break;
3376 case rvc_inf:
3377 if (fmt->has_inf)
3379 image_hi |= 32767;
3381 /* Intel requires the explicit integer bit to be set, otherwise
3382 it considers the value a "pseudo-infinity". Motorola docs
3383 say it doesn't care. */
3384 sig_hi = 0x80000000;
3386 else
3388 image_hi |= 32767;
3389 sig_lo = sig_hi = 0xffffffff;
3391 break;
3393 case rvc_nan:
3394 if (fmt->has_nans)
3396 image_hi |= 32767;
3397 if (r->canonical)
3399 if (fmt->canonical_nan_lsbs_set)
3401 sig_hi = (1 << 30) - 1;
3402 sig_lo = 0xffffffff;
3405 else if (HOST_BITS_PER_LONG == 32)
3407 sig_hi = r->sig[SIGSZ-1];
3408 sig_lo = r->sig[SIGSZ-2];
3410 else
3412 sig_lo = r->sig[SIGSZ-1];
3413 sig_hi = sig_lo >> 31 >> 1;
3414 sig_lo &= 0xffffffff;
3416 if (r->signalling == fmt->qnan_msb_set)
3417 sig_hi &= ~(1 << 30);
3418 else
3419 sig_hi |= 1 << 30;
3420 if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
3421 sig_hi = 1 << 29;
3423 /* Intel requires the explicit integer bit to be set, otherwise
3424 it considers the value a "pseudo-nan". Motorola docs say it
3425 doesn't care. */
3426 sig_hi |= 0x80000000;
3428 else
3430 image_hi |= 32767;
3431 sig_lo = sig_hi = 0xffffffff;
3433 break;
3435 case rvc_normal:
3437 int exp = REAL_EXP (r);
3439 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3440 whereas the intermediate representation is 0.F x 2**exp.
3441 Which means we're off by one.
3443 Except for Motorola, which consider exp=0 and explicit
3444 integer bit set to continue to be normalized. In theory
3445 this discrepancy has been taken care of by the difference
3446 in fmt->emin in round_for_format. */
3448 if (denormal)
3449 exp = 0;
3450 else
3452 exp += 16383 - 1;
3453 gcc_assert (exp >= 0);
3455 image_hi |= exp;
3457 if (HOST_BITS_PER_LONG == 32)
3459 sig_hi = r->sig[SIGSZ-1];
3460 sig_lo = r->sig[SIGSZ-2];
3462 else
3464 sig_lo = r->sig[SIGSZ-1];
3465 sig_hi = sig_lo >> 31 >> 1;
3466 sig_lo &= 0xffffffff;
3469 break;
3471 default:
3472 gcc_unreachable ();
3475 buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3478 /* Convert from the internal format to the 12-byte Motorola format
3479 for an IEEE extended real. */
3480 static void
3481 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3482 const REAL_VALUE_TYPE *r)
3484 long intermed[3];
3485 encode_ieee_extended (fmt, intermed, r);
3487 if (r->cl == rvc_inf)
3488 /* For infinity clear the explicit integer bit again, so that the
3489 format matches the canonical infinity generated by the FPU. */
3490 intermed[1] = 0;
3492 /* Motorola chips are assumed always to be big-endian. Also, the
3493 padding in a Motorola extended real goes between the exponent and
3494 the mantissa. At this point the mantissa is entirely within
3495 elements 0 and 1 of intermed, and the exponent entirely within
3496 element 2, so all we have to do is swap the order around, and
3497 shift element 2 left 16 bits. */
3498 buf[0] = intermed[2] << 16;
3499 buf[1] = intermed[1];
3500 buf[2] = intermed[0];
3503 /* Convert from the internal format to the 12-byte Intel format for
3504 an IEEE extended real. */
3505 static void
3506 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3507 const REAL_VALUE_TYPE *r)
3509 if (FLOAT_WORDS_BIG_ENDIAN)
3511 /* All the padding in an Intel-format extended real goes at the high
3512 end, which in this case is after the mantissa, not the exponent.
3513 Therefore we must shift everything down 16 bits. */
3514 long intermed[3];
3515 encode_ieee_extended (fmt, intermed, r);
3516 buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3517 buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3518 buf[2] = (intermed[0] << 16);
3520 else
3521 /* encode_ieee_extended produces what we want directly. */
3522 encode_ieee_extended (fmt, buf, r);
3525 /* Convert from the internal format to the 16-byte Intel format for
3526 an IEEE extended real. */
3527 static void
3528 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3529 const REAL_VALUE_TYPE *r)
3531 /* All the padding in an Intel-format extended real goes at the high end. */
3532 encode_ieee_extended_intel_96 (fmt, buf, r);
3533 buf[3] = 0;
3536 /* As above, we have a helper function which converts from 12-byte
3537 little-endian Intel format to internal format. Functions below
3538 adjust for the other possible formats. */
3539 static void
3540 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3541 const long *buf)
3543 unsigned long image_hi, sig_hi, sig_lo;
3544 bool sign;
3545 int exp;
3547 sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3548 sig_lo &= 0xffffffff;
3549 sig_hi &= 0xffffffff;
3550 image_hi &= 0xffffffff;
3552 sign = (image_hi >> 15) & 1;
3553 exp = image_hi & 0x7fff;
3555 memset (r, 0, sizeof (*r));
3557 if (exp == 0)
3559 if ((sig_hi || sig_lo) && fmt->has_denorm)
3561 r->cl = rvc_normal;
3562 r->sign = sign;
3564 /* When the IEEE format contains a hidden bit, we know that
3565 it's zero at this point, and so shift up the significand
3566 and decrease the exponent to match. In this case, Motorola
3567 defines the explicit integer bit to be valid, so we don't
3568 know whether the msb is set or not. */
3569 SET_REAL_EXP (r, fmt->emin);
3570 if (HOST_BITS_PER_LONG == 32)
3572 r->sig[SIGSZ-1] = sig_hi;
3573 r->sig[SIGSZ-2] = sig_lo;
3575 else
3576 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3578 normalize (r);
3580 else if (fmt->has_signed_zero)
3581 r->sign = sign;
3583 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3585 /* See above re "pseudo-infinities" and "pseudo-nans".
3586 Short summary is that the MSB will likely always be
3587 set, and that we don't care about it. */
3588 sig_hi &= 0x7fffffff;
3590 if (sig_hi || sig_lo)
3592 r->cl = rvc_nan;
3593 r->sign = sign;
3594 r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3595 if (HOST_BITS_PER_LONG == 32)
3597 r->sig[SIGSZ-1] = sig_hi;
3598 r->sig[SIGSZ-2] = sig_lo;
3600 else
3601 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3603 else
3605 r->cl = rvc_inf;
3606 r->sign = sign;
3609 else
3611 r->cl = rvc_normal;
3612 r->sign = sign;
3613 SET_REAL_EXP (r, exp - 16383 + 1);
3614 if (HOST_BITS_PER_LONG == 32)
3616 r->sig[SIGSZ-1] = sig_hi;
3617 r->sig[SIGSZ-2] = sig_lo;
3619 else
3620 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3624 /* Convert from the internal format to the 12-byte Motorola format
3625 for an IEEE extended real. */
3626 static void
3627 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3628 const long *buf)
3630 long intermed[3];
3632 /* Motorola chips are assumed always to be big-endian. Also, the
3633 padding in a Motorola extended real goes between the exponent and
3634 the mantissa; remove it. */
3635 intermed[0] = buf[2];
3636 intermed[1] = buf[1];
3637 intermed[2] = (unsigned long)buf[0] >> 16;
3639 decode_ieee_extended (fmt, r, intermed);
3642 /* Convert from the internal format to the 12-byte Intel format for
3643 an IEEE extended real. */
3644 static void
3645 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3646 const long *buf)
3648 if (FLOAT_WORDS_BIG_ENDIAN)
3650 /* All the padding in an Intel-format extended real goes at the high
3651 end, which in this case is after the mantissa, not the exponent.
3652 Therefore we must shift everything up 16 bits. */
3653 long intermed[3];
3655 intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3656 intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3657 intermed[2] = ((unsigned long)buf[0] >> 16);
3659 decode_ieee_extended (fmt, r, intermed);
3661 else
3662 /* decode_ieee_extended produces what we want directly. */
3663 decode_ieee_extended (fmt, r, buf);
3666 /* Convert from the internal format to the 16-byte Intel format for
3667 an IEEE extended real. */
3668 static void
3669 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3670 const long *buf)
3672 /* All the padding in an Intel-format extended real goes at the high end. */
3673 decode_ieee_extended_intel_96 (fmt, r, buf);
3676 const struct real_format ieee_extended_motorola_format =
3678 encode_ieee_extended_motorola,
3679 decode_ieee_extended_motorola,
3683 -16382,
3684 16384,
3687 false,
3688 true,
3689 true,
3690 true,
3691 true,
3692 true,
3693 true,
3694 true
3697 const struct real_format ieee_extended_intel_96_format =
3699 encode_ieee_extended_intel_96,
3700 decode_ieee_extended_intel_96,
3704 -16381,
3705 16384,
3708 false,
3709 true,
3710 true,
3711 true,
3712 true,
3713 true,
3714 true,
3715 false
3718 const struct real_format ieee_extended_intel_128_format =
3720 encode_ieee_extended_intel_128,
3721 decode_ieee_extended_intel_128,
3725 -16381,
3726 16384,
3729 false,
3730 true,
3731 true,
3732 true,
3733 true,
3734 true,
3735 true,
3736 false
3739 /* The following caters to i386 systems that set the rounding precision
3740 to 53 bits instead of 64, e.g. FreeBSD. */
3741 const struct real_format ieee_extended_intel_96_round_53_format =
3743 encode_ieee_extended_intel_96,
3744 decode_ieee_extended_intel_96,
3748 -16381,
3749 16384,
3752 false,
3753 true,
3754 true,
3755 true,
3756 true,
3757 true,
3758 true,
3759 false
3762 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3763 numbers whose sum is equal to the extended precision value. The number
3764 with greater magnitude is first. This format has the same magnitude
3765 range as an IEEE double precision value, but effectively 106 bits of
3766 significand precision. Infinity and NaN are represented by their IEEE
3767 double precision value stored in the first number, the second number is
3768 +0.0 or -0.0 for Infinity and don't-care for NaN. */
3770 static void encode_ibm_extended (const struct real_format *fmt,
3771 long *, const REAL_VALUE_TYPE *);
3772 static void decode_ibm_extended (const struct real_format *,
3773 REAL_VALUE_TYPE *, const long *);
3775 static void
3776 encode_ibm_extended (const struct real_format *fmt, long *buf,
3777 const REAL_VALUE_TYPE *r)
3779 REAL_VALUE_TYPE u, normr, v;
3780 const struct real_format *base_fmt;
3782 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3784 /* Renormalize R before doing any arithmetic on it. */
3785 normr = *r;
3786 if (normr.cl == rvc_normal)
3787 normalize (&normr);
3789 /* u = IEEE double precision portion of significand. */
3790 u = normr;
3791 round_for_format (base_fmt, &u);
3792 encode_ieee_double (base_fmt, &buf[0], &u);
3794 if (u.cl == rvc_normal)
3796 do_add (&v, &normr, &u, 1);
3797 /* Call round_for_format since we might need to denormalize. */
3798 round_for_format (base_fmt, &v);
3799 encode_ieee_double (base_fmt, &buf[2], &v);
3801 else
3803 /* Inf, NaN, 0 are all representable as doubles, so the
3804 least-significant part can be 0.0. */
3805 buf[2] = 0;
3806 buf[3] = 0;
3810 static void
3811 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3812 const long *buf)
3814 REAL_VALUE_TYPE u, v;
3815 const struct real_format *base_fmt;
3817 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3818 decode_ieee_double (base_fmt, &u, &buf[0]);
3820 if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3822 decode_ieee_double (base_fmt, &v, &buf[2]);
3823 do_add (r, &u, &v, 0);
3825 else
3826 *r = u;
3829 const struct real_format ibm_extended_format =
3831 encode_ibm_extended,
3832 decode_ibm_extended,
3834 53 + 53,
3836 -1021 + 53,
3837 1024,
3838 127,
3840 false,
3841 true,
3842 true,
3843 true,
3844 true,
3845 true,
3846 true,
3847 false
3850 const struct real_format mips_extended_format =
3852 encode_ibm_extended,
3853 decode_ibm_extended,
3855 53 + 53,
3857 -1021 + 53,
3858 1024,
3859 127,
3861 false,
3862 true,
3863 true,
3864 true,
3865 true,
3866 true,
3867 false,
3868 true
3872 /* IEEE quad precision format. */
3874 static void encode_ieee_quad (const struct real_format *fmt,
3875 long *, const REAL_VALUE_TYPE *);
3876 static void decode_ieee_quad (const struct real_format *,
3877 REAL_VALUE_TYPE *, const long *);
3879 static void
3880 encode_ieee_quad (const struct real_format *fmt, long *buf,
3881 const REAL_VALUE_TYPE *r)
3883 unsigned long image3, image2, image1, image0, exp;
3884 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3885 REAL_VALUE_TYPE u;
3887 image3 = r->sign << 31;
3888 image2 = 0;
3889 image1 = 0;
3890 image0 = 0;
3892 rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3894 switch (r->cl)
3896 case rvc_zero:
3897 break;
3899 case rvc_inf:
3900 if (fmt->has_inf)
3901 image3 |= 32767 << 16;
3902 else
3904 image3 |= 0x7fffffff;
3905 image2 = 0xffffffff;
3906 image1 = 0xffffffff;
3907 image0 = 0xffffffff;
3909 break;
3911 case rvc_nan:
3912 if (fmt->has_nans)
3914 image3 |= 32767 << 16;
3916 if (r->canonical)
3918 if (fmt->canonical_nan_lsbs_set)
3920 image3 |= 0x7fff;
3921 image2 = image1 = image0 = 0xffffffff;
3924 else if (HOST_BITS_PER_LONG == 32)
3926 image0 = u.sig[0];
3927 image1 = u.sig[1];
3928 image2 = u.sig[2];
3929 image3 |= u.sig[3] & 0xffff;
3931 else
3933 image0 = u.sig[0];
3934 image1 = image0 >> 31 >> 1;
3935 image2 = u.sig[1];
3936 image3 |= (image2 >> 31 >> 1) & 0xffff;
3937 image0 &= 0xffffffff;
3938 image2 &= 0xffffffff;
3940 if (r->signalling == fmt->qnan_msb_set)
3941 image3 &= ~0x8000;
3942 else
3943 image3 |= 0x8000;
3944 if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3945 image3 |= 0x4000;
3947 else
3949 image3 |= 0x7fffffff;
3950 image2 = 0xffffffff;
3951 image1 = 0xffffffff;
3952 image0 = 0xffffffff;
3954 break;
3956 case rvc_normal:
3957 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3958 whereas the intermediate representation is 0.F x 2**exp.
3959 Which means we're off by one. */
3960 if (denormal)
3961 exp = 0;
3962 else
3963 exp = REAL_EXP (r) + 16383 - 1;
3964 image3 |= exp << 16;
3966 if (HOST_BITS_PER_LONG == 32)
3968 image0 = u.sig[0];
3969 image1 = u.sig[1];
3970 image2 = u.sig[2];
3971 image3 |= u.sig[3] & 0xffff;
3973 else
3975 image0 = u.sig[0];
3976 image1 = image0 >> 31 >> 1;
3977 image2 = u.sig[1];
3978 image3 |= (image2 >> 31 >> 1) & 0xffff;
3979 image0 &= 0xffffffff;
3980 image2 &= 0xffffffff;
3982 break;
3984 default:
3985 gcc_unreachable ();
3988 if (FLOAT_WORDS_BIG_ENDIAN)
3990 buf[0] = image3;
3991 buf[1] = image2;
3992 buf[2] = image1;
3993 buf[3] = image0;
3995 else
3997 buf[0] = image0;
3998 buf[1] = image1;
3999 buf[2] = image2;
4000 buf[3] = image3;
4004 static void
4005 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
4006 const long *buf)
4008 unsigned long image3, image2, image1, image0;
4009 bool sign;
4010 int exp;
4012 if (FLOAT_WORDS_BIG_ENDIAN)
4014 image3 = buf[0];
4015 image2 = buf[1];
4016 image1 = buf[2];
4017 image0 = buf[3];
4019 else
4021 image0 = buf[0];
4022 image1 = buf[1];
4023 image2 = buf[2];
4024 image3 = buf[3];
4026 image0 &= 0xffffffff;
4027 image1 &= 0xffffffff;
4028 image2 &= 0xffffffff;
4030 sign = (image3 >> 31) & 1;
4031 exp = (image3 >> 16) & 0x7fff;
4032 image3 &= 0xffff;
4034 memset (r, 0, sizeof (*r));
4036 if (exp == 0)
4038 if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
4040 r->cl = rvc_normal;
4041 r->sign = sign;
4043 SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
4044 if (HOST_BITS_PER_LONG == 32)
4046 r->sig[0] = image0;
4047 r->sig[1] = image1;
4048 r->sig[2] = image2;
4049 r->sig[3] = image3;
4051 else
4053 r->sig[0] = (image1 << 31 << 1) | image0;
4054 r->sig[1] = (image3 << 31 << 1) | image2;
4057 normalize (r);
4059 else if (fmt->has_signed_zero)
4060 r->sign = sign;
4062 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
4064 if (image3 | image2 | image1 | image0)
4066 r->cl = rvc_nan;
4067 r->sign = sign;
4068 r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
4070 if (HOST_BITS_PER_LONG == 32)
4072 r->sig[0] = image0;
4073 r->sig[1] = image1;
4074 r->sig[2] = image2;
4075 r->sig[3] = image3;
4077 else
4079 r->sig[0] = (image1 << 31 << 1) | image0;
4080 r->sig[1] = (image3 << 31 << 1) | image2;
4082 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
4084 else
4086 r->cl = rvc_inf;
4087 r->sign = sign;
4090 else
4092 r->cl = rvc_normal;
4093 r->sign = sign;
4094 SET_REAL_EXP (r, exp - 16383 + 1);
4096 if (HOST_BITS_PER_LONG == 32)
4098 r->sig[0] = image0;
4099 r->sig[1] = image1;
4100 r->sig[2] = image2;
4101 r->sig[3] = image3;
4103 else
4105 r->sig[0] = (image1 << 31 << 1) | image0;
4106 r->sig[1] = (image3 << 31 << 1) | image2;
4108 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
4109 r->sig[SIGSZ-1] |= SIG_MSB;
4113 const struct real_format ieee_quad_format =
4115 encode_ieee_quad,
4116 decode_ieee_quad,
4118 113,
4119 113,
4120 -16381,
4121 16384,
4122 127,
4123 127,
4124 false,
4125 true,
4126 true,
4127 true,
4128 true,
4129 true,
4130 true,
4131 false
4134 const struct real_format mips_quad_format =
4136 encode_ieee_quad,
4137 decode_ieee_quad,
4139 113,
4140 113,
4141 -16381,
4142 16384,
4143 127,
4144 127,
4145 false,
4146 true,
4147 true,
4148 true,
4149 true,
4150 true,
4151 false,
4152 true
4155 /* Descriptions of VAX floating point formats can be found beginning at
4157 http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
4159 The thing to remember is that they're almost IEEE, except for word
4160 order, exponent bias, and the lack of infinities, nans, and denormals.
4162 We don't implement the H_floating format here, simply because neither
4163 the VAX or Alpha ports use it. */
4165 static void encode_vax_f (const struct real_format *fmt,
4166 long *, const REAL_VALUE_TYPE *);
4167 static void decode_vax_f (const struct real_format *,
4168 REAL_VALUE_TYPE *, const long *);
4169 static void encode_vax_d (const struct real_format *fmt,
4170 long *, const REAL_VALUE_TYPE *);
4171 static void decode_vax_d (const struct real_format *,
4172 REAL_VALUE_TYPE *, const long *);
4173 static void encode_vax_g (const struct real_format *fmt,
4174 long *, const REAL_VALUE_TYPE *);
4175 static void decode_vax_g (const struct real_format *,
4176 REAL_VALUE_TYPE *, const long *);
4178 static void
4179 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4180 const REAL_VALUE_TYPE *r)
4182 unsigned long sign, exp, sig, image;
4184 sign = r->sign << 15;
4186 switch (r->cl)
4188 case rvc_zero:
4189 image = 0;
4190 break;
4192 case rvc_inf:
4193 case rvc_nan:
4194 image = 0xffff7fff | sign;
4195 break;
4197 case rvc_normal:
4198 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4199 exp = REAL_EXP (r) + 128;
4201 image = (sig << 16) & 0xffff0000;
4202 image |= sign;
4203 image |= exp << 7;
4204 image |= sig >> 16;
4205 break;
4207 default:
4208 gcc_unreachable ();
4211 buf[0] = image;
4214 static void
4215 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
4216 REAL_VALUE_TYPE *r, const long *buf)
4218 unsigned long image = buf[0] & 0xffffffff;
4219 int exp = (image >> 7) & 0xff;
4221 memset (r, 0, sizeof (*r));
4223 if (exp != 0)
4225 r->cl = rvc_normal;
4226 r->sign = (image >> 15) & 1;
4227 SET_REAL_EXP (r, exp - 128);
4229 image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
4230 r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4234 static void
4235 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4236 const REAL_VALUE_TYPE *r)
4238 unsigned long image0, image1, sign = r->sign << 15;
4240 switch (r->cl)
4242 case rvc_zero:
4243 image0 = image1 = 0;
4244 break;
4246 case rvc_inf:
4247 case rvc_nan:
4248 image0 = 0xffff7fff | sign;
4249 image1 = 0xffffffff;
4250 break;
4252 case rvc_normal:
4253 /* Extract the significand into straight hi:lo. */
4254 if (HOST_BITS_PER_LONG == 64)
4256 image0 = r->sig[SIGSZ-1];
4257 image1 = (image0 >> (64 - 56)) & 0xffffffff;
4258 image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
4260 else
4262 image0 = r->sig[SIGSZ-1];
4263 image1 = r->sig[SIGSZ-2];
4264 image1 = (image0 << 24) | (image1 >> 8);
4265 image0 = (image0 >> 8) & 0xffffff;
4268 /* Rearrange the half-words of the significand to match the
4269 external format. */
4270 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
4271 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4273 /* Add the sign and exponent. */
4274 image0 |= sign;
4275 image0 |= (REAL_EXP (r) + 128) << 7;
4276 break;
4278 default:
4279 gcc_unreachable ();
4282 if (FLOAT_WORDS_BIG_ENDIAN)
4283 buf[0] = image1, buf[1] = image0;
4284 else
4285 buf[0] = image0, buf[1] = image1;
4288 static void
4289 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
4290 REAL_VALUE_TYPE *r, const long *buf)
4292 unsigned long image0, image1;
4293 int exp;
4295 if (FLOAT_WORDS_BIG_ENDIAN)
4296 image1 = buf[0], image0 = buf[1];
4297 else
4298 image0 = buf[0], image1 = buf[1];
4299 image0 &= 0xffffffff;
4300 image1 &= 0xffffffff;
4302 exp = (image0 >> 7) & 0xff;
4304 memset (r, 0, sizeof (*r));
4306 if (exp != 0)
4308 r->cl = rvc_normal;
4309 r->sign = (image0 >> 15) & 1;
4310 SET_REAL_EXP (r, exp - 128);
4312 /* Rearrange the half-words of the external format into
4313 proper ascending order. */
4314 image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
4315 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4317 if (HOST_BITS_PER_LONG == 64)
4319 image0 = (image0 << 31 << 1) | image1;
4320 image0 <<= 64 - 56;
4321 image0 |= SIG_MSB;
4322 r->sig[SIGSZ-1] = image0;
4324 else
4326 r->sig[SIGSZ-1] = image0;
4327 r->sig[SIGSZ-2] = image1;
4328 lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
4329 r->sig[SIGSZ-1] |= SIG_MSB;
4334 static void
4335 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4336 const REAL_VALUE_TYPE *r)
4338 unsigned long image0, image1, sign = r->sign << 15;
4340 switch (r->cl)
4342 case rvc_zero:
4343 image0 = image1 = 0;
4344 break;
4346 case rvc_inf:
4347 case rvc_nan:
4348 image0 = 0xffff7fff | sign;
4349 image1 = 0xffffffff;
4350 break;
4352 case rvc_normal:
4353 /* Extract the significand into straight hi:lo. */
4354 if (HOST_BITS_PER_LONG == 64)
4356 image0 = r->sig[SIGSZ-1];
4357 image1 = (image0 >> (64 - 53)) & 0xffffffff;
4358 image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
4360 else
4362 image0 = r->sig[SIGSZ-1];
4363 image1 = r->sig[SIGSZ-2];
4364 image1 = (image0 << 21) | (image1 >> 11);
4365 image0 = (image0 >> 11) & 0xfffff;
4368 /* Rearrange the half-words of the significand to match the
4369 external format. */
4370 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
4371 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4373 /* Add the sign and exponent. */
4374 image0 |= sign;
4375 image0 |= (REAL_EXP (r) + 1024) << 4;
4376 break;
4378 default:
4379 gcc_unreachable ();
4382 if (FLOAT_WORDS_BIG_ENDIAN)
4383 buf[0] = image1, buf[1] = image0;
4384 else
4385 buf[0] = image0, buf[1] = image1;
4388 static void
4389 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
4390 REAL_VALUE_TYPE *r, const long *buf)
4392 unsigned long image0, image1;
4393 int exp;
4395 if (FLOAT_WORDS_BIG_ENDIAN)
4396 image1 = buf[0], image0 = buf[1];
4397 else
4398 image0 = buf[0], image1 = buf[1];
4399 image0 &= 0xffffffff;
4400 image1 &= 0xffffffff;
4402 exp = (image0 >> 4) & 0x7ff;
4404 memset (r, 0, sizeof (*r));
4406 if (exp != 0)
4408 r->cl = rvc_normal;
4409 r->sign = (image0 >> 15) & 1;
4410 SET_REAL_EXP (r, exp - 1024);
4412 /* Rearrange the half-words of the external format into
4413 proper ascending order. */
4414 image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
4415 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4417 if (HOST_BITS_PER_LONG == 64)
4419 image0 = (image0 << 31 << 1) | image1;
4420 image0 <<= 64 - 53;
4421 image0 |= SIG_MSB;
4422 r->sig[SIGSZ-1] = image0;
4424 else
4426 r->sig[SIGSZ-1] = image0;
4427 r->sig[SIGSZ-2] = image1;
4428 lshift_significand (r, r, 64 - 53);
4429 r->sig[SIGSZ-1] |= SIG_MSB;
4434 const struct real_format vax_f_format =
4436 encode_vax_f,
4437 decode_vax_f,
4441 -127,
4442 127,
4445 false,
4446 false,
4447 false,
4448 false,
4449 false,
4450 false,
4451 false,
4452 false
4455 const struct real_format vax_d_format =
4457 encode_vax_d,
4458 decode_vax_d,
4462 -127,
4463 127,
4466 false,
4467 false,
4468 false,
4469 false,
4470 false,
4471 false,
4472 false,
4473 false
4476 const struct real_format vax_g_format =
4478 encode_vax_g,
4479 decode_vax_g,
4483 -1023,
4484 1023,
4487 false,
4488 false,
4489 false,
4490 false,
4491 false,
4492 false,
4493 false,
4494 false
4497 /* Encode real R into a single precision DFP value in BUF. */
4498 static void
4499 encode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4500 long *buf ATTRIBUTE_UNUSED,
4501 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4503 encode_decimal32 (fmt, buf, r);
4506 /* Decode a single precision DFP value in BUF into a real R. */
4507 static void
4508 decode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4509 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4510 const long *buf ATTRIBUTE_UNUSED)
4512 decode_decimal32 (fmt, r, buf);
4515 /* Encode real R into a double precision DFP value in BUF. */
4516 static void
4517 encode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4518 long *buf ATTRIBUTE_UNUSED,
4519 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4521 encode_decimal64 (fmt, buf, r);
4524 /* Decode a double precision DFP value in BUF into a real R. */
4525 static void
4526 decode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4527 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4528 const long *buf ATTRIBUTE_UNUSED)
4530 decode_decimal64 (fmt, r, buf);
4533 /* Encode real R into a quad precision DFP value in BUF. */
4534 static void
4535 encode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4536 long *buf ATTRIBUTE_UNUSED,
4537 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4539 encode_decimal128 (fmt, buf, r);
4542 /* Decode a quad precision DFP value in BUF into a real R. */
4543 static void
4544 decode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4545 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4546 const long *buf ATTRIBUTE_UNUSED)
4548 decode_decimal128 (fmt, r, buf);
4551 /* Single precision decimal floating point (IEEE 754). */
4552 const struct real_format decimal_single_format =
4554 encode_decimal_single,
4555 decode_decimal_single,
4559 -94,
4563 false,
4564 true,
4565 true,
4566 true,
4567 true,
4568 true,
4569 true,
4570 false
4573 /* Double precision decimal floating point (IEEE 754). */
4574 const struct real_format decimal_double_format =
4576 encode_decimal_double,
4577 decode_decimal_double,
4581 -382,
4582 385,
4585 false,
4586 true,
4587 true,
4588 true,
4589 true,
4590 true,
4591 true,
4592 false
4595 /* Quad precision decimal floating point (IEEE 754). */
4596 const struct real_format decimal_quad_format =
4598 encode_decimal_quad,
4599 decode_decimal_quad,
4603 -6142,
4604 6145,
4605 127,
4606 127,
4607 false,
4608 true,
4609 true,
4610 true,
4611 true,
4612 true,
4613 true,
4614 false
4617 /* Encode half-precision floats. This routine is used both for the IEEE
4618 ARM alternative encodings. */
4619 static void
4620 encode_ieee_half (const struct real_format *fmt, long *buf,
4621 const REAL_VALUE_TYPE *r)
4623 unsigned long image, sig, exp;
4624 unsigned long sign = r->sign;
4625 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
4627 image = sign << 15;
4628 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 11)) & 0x3ff;
4630 switch (r->cl)
4632 case rvc_zero:
4633 break;
4635 case rvc_inf:
4636 if (fmt->has_inf)
4637 image |= 31 << 10;
4638 else
4639 image |= 0x7fff;
4640 break;
4642 case rvc_nan:
4643 if (fmt->has_nans)
4645 if (r->canonical)
4646 sig = (fmt->canonical_nan_lsbs_set ? (1 << 9) - 1 : 0);
4647 if (r->signalling == fmt->qnan_msb_set)
4648 sig &= ~(1 << 9);
4649 else
4650 sig |= 1 << 9;
4651 if (sig == 0)
4652 sig = 1 << 8;
4654 image |= 31 << 10;
4655 image |= sig;
4657 else
4658 image |= 0x3ff;
4659 break;
4661 case rvc_normal:
4662 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
4663 whereas the intermediate representation is 0.F x 2**exp.
4664 Which means we're off by one. */
4665 if (denormal)
4666 exp = 0;
4667 else
4668 exp = REAL_EXP (r) + 15 - 1;
4669 image |= exp << 10;
4670 image |= sig;
4671 break;
4673 default:
4674 gcc_unreachable ();
4677 buf[0] = image;
4680 /* Decode half-precision floats. This routine is used both for the IEEE
4681 ARM alternative encodings. */
4682 static void
4683 decode_ieee_half (const struct real_format *fmt, REAL_VALUE_TYPE *r,
4684 const long *buf)
4686 unsigned long image = buf[0] & 0xffff;
4687 bool sign = (image >> 15) & 1;
4688 int exp = (image >> 10) & 0x1f;
4690 memset (r, 0, sizeof (*r));
4691 image <<= HOST_BITS_PER_LONG - 11;
4692 image &= ~SIG_MSB;
4694 if (exp == 0)
4696 if (image && fmt->has_denorm)
4698 r->cl = rvc_normal;
4699 r->sign = sign;
4700 SET_REAL_EXP (r, -14);
4701 r->sig[SIGSZ-1] = image << 1;
4702 normalize (r);
4704 else if (fmt->has_signed_zero)
4705 r->sign = sign;
4707 else if (exp == 31 && (fmt->has_nans || fmt->has_inf))
4709 if (image)
4711 r->cl = rvc_nan;
4712 r->sign = sign;
4713 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
4714 ^ fmt->qnan_msb_set);
4715 r->sig[SIGSZ-1] = image;
4717 else
4719 r->cl = rvc_inf;
4720 r->sign = sign;
4723 else
4725 r->cl = rvc_normal;
4726 r->sign = sign;
4727 SET_REAL_EXP (r, exp - 15 + 1);
4728 r->sig[SIGSZ-1] = image | SIG_MSB;
4732 /* Half-precision format, as specified in IEEE 754R. */
4733 const struct real_format ieee_half_format =
4735 encode_ieee_half,
4736 decode_ieee_half,
4740 -13,
4744 false,
4745 true,
4746 true,
4747 true,
4748 true,
4749 true,
4750 true,
4751 false
4754 /* ARM's alternative half-precision format, similar to IEEE but with
4755 no reserved exponent value for NaNs and infinities; rather, it just
4756 extends the range of exponents by one. */
4757 const struct real_format arm_half_format =
4759 encode_ieee_half,
4760 decode_ieee_half,
4764 -13,
4768 false,
4769 true,
4770 false,
4771 false,
4772 true,
4773 true,
4774 false,
4775 false
4778 /* A synthetic "format" for internal arithmetic. It's the size of the
4779 internal significand minus the two bits needed for proper rounding.
4780 The encode and decode routines exist only to satisfy our paranoia
4781 harness. */
4783 static void encode_internal (const struct real_format *fmt,
4784 long *, const REAL_VALUE_TYPE *);
4785 static void decode_internal (const struct real_format *,
4786 REAL_VALUE_TYPE *, const long *);
4788 static void
4789 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4790 const REAL_VALUE_TYPE *r)
4792 memcpy (buf, r, sizeof (*r));
4795 static void
4796 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4797 REAL_VALUE_TYPE *r, const long *buf)
4799 memcpy (r, buf, sizeof (*r));
4802 const struct real_format real_internal_format =
4804 encode_internal,
4805 decode_internal,
4807 SIGNIFICAND_BITS - 2,
4808 SIGNIFICAND_BITS - 2,
4809 -MAX_EXP,
4810 MAX_EXP,
4813 false,
4814 false,
4815 true,
4816 true,
4817 false,
4818 true,
4819 true,
4820 false
4823 /* Calculate X raised to the integer exponent N in mode MODE and store
4824 the result in R. Return true if the result may be inexact due to
4825 loss of precision. The algorithm is the classic "left-to-right binary
4826 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4827 Algorithms", "The Art of Computer Programming", Volume 2. */
4829 bool
4830 real_powi (REAL_VALUE_TYPE *r, machine_mode mode,
4831 const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4833 unsigned HOST_WIDE_INT bit;
4834 REAL_VALUE_TYPE t;
4835 bool inexact = false;
4836 bool init = false;
4837 bool neg;
4838 int i;
4840 if (n == 0)
4842 *r = dconst1;
4843 return false;
4845 else if (n < 0)
4847 /* Don't worry about overflow, from now on n is unsigned. */
4848 neg = true;
4849 n = -n;
4851 else
4852 neg = false;
4854 t = *x;
4855 bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4856 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4858 if (init)
4860 inexact |= do_multiply (&t, &t, &t);
4861 if (n & bit)
4862 inexact |= do_multiply (&t, &t, x);
4864 else if (n & bit)
4865 init = true;
4866 bit >>= 1;
4869 if (neg)
4870 inexact |= do_divide (&t, &dconst1, &t);
4872 real_convert (r, mode, &t);
4873 return inexact;
4876 /* Round X to the nearest integer not larger in absolute value, i.e.
4877 towards zero, placing the result in R in mode MODE. */
4879 void
4880 real_trunc (REAL_VALUE_TYPE *r, machine_mode mode,
4881 const REAL_VALUE_TYPE *x)
4883 do_fix_trunc (r, x);
4884 if (mode != VOIDmode)
4885 real_convert (r, mode, r);
4888 /* Round X to the largest integer not greater in value, i.e. round
4889 down, placing the result in R in mode MODE. */
4891 void
4892 real_floor (REAL_VALUE_TYPE *r, machine_mode mode,
4893 const REAL_VALUE_TYPE *x)
4895 REAL_VALUE_TYPE t;
4897 do_fix_trunc (&t, x);
4898 if (! real_identical (&t, x) && x->sign)
4899 do_add (&t, &t, &dconstm1, 0);
4900 if (mode != VOIDmode)
4901 real_convert (r, mode, &t);
4902 else
4903 *r = t;
4906 /* Round X to the smallest integer not less then argument, i.e. round
4907 up, placing the result in R in mode MODE. */
4909 void
4910 real_ceil (REAL_VALUE_TYPE *r, machine_mode mode,
4911 const REAL_VALUE_TYPE *x)
4913 REAL_VALUE_TYPE t;
4915 do_fix_trunc (&t, x);
4916 if (! real_identical (&t, x) && ! x->sign)
4917 do_add (&t, &t, &dconst1, 0);
4918 if (mode != VOIDmode)
4919 real_convert (r, mode, &t);
4920 else
4921 *r = t;
4924 /* Round X to the nearest integer, but round halfway cases away from
4925 zero. */
4927 void
4928 real_round (REAL_VALUE_TYPE *r, machine_mode mode,
4929 const REAL_VALUE_TYPE *x)
4931 do_add (r, x, &dconsthalf, x->sign);
4932 do_fix_trunc (r, r);
4933 if (mode != VOIDmode)
4934 real_convert (r, mode, r);
4937 /* Set the sign of R to the sign of X. */
4939 void
4940 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
4942 r->sign = x->sign;
4945 /* Check whether the real constant value given is an integer. */
4947 bool
4948 real_isinteger (const REAL_VALUE_TYPE *c, machine_mode mode)
4950 REAL_VALUE_TYPE cint;
4952 real_trunc (&cint, mode, c);
4953 return real_identical (c, &cint);
4956 /* Write into BUF the maximum representable finite floating-point
4957 number, (1 - b**-p) * b**emax for a given FP format FMT as a hex
4958 float string. LEN is the size of BUF, and the buffer must be large
4959 enough to contain the resulting string. */
4961 void
4962 get_max_float (const struct real_format *fmt, char *buf, size_t len)
4964 int i, n;
4965 char *p;
4967 strcpy (buf, "0x0.");
4968 n = fmt->p;
4969 for (i = 0, p = buf + 4; i + 3 < n; i += 4)
4970 *p++ = 'f';
4971 if (i < n)
4972 *p++ = "08ce"[n - i];
4973 sprintf (p, "p%d", fmt->emax);
4974 if (fmt->pnan < fmt->p)
4976 /* This is an IBM extended double format made up of two IEEE
4977 doubles. The value of the long double is the sum of the
4978 values of the two parts. The most significant part is
4979 required to be the value of the long double rounded to the
4980 nearest double. Rounding means we need a slightly smaller
4981 value for LDBL_MAX. */
4982 buf[4 + fmt->pnan / 4] = "7bde"[fmt->pnan % 4];
4985 gcc_assert (strlen (buf) < len);
4988 /* True if mode M has a NaN representation and
4989 the treatment of NaN operands is important. */
4991 bool
4992 HONOR_NANS (machine_mode m)
4994 return MODE_HAS_NANS (m) && !flag_finite_math_only;
4997 bool
4998 HONOR_NANS (const_tree t)
5000 return HONOR_NANS (element_mode (t));
5003 bool
5004 HONOR_NANS (const_rtx x)
5006 return HONOR_NANS (GET_MODE (x));
5009 /* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs). */
5011 bool
5012 HONOR_SNANS (machine_mode m)
5014 return flag_signaling_nans && HONOR_NANS (m);
5017 bool
5018 HONOR_SNANS (const_tree t)
5020 return HONOR_SNANS (element_mode (t));
5023 bool
5024 HONOR_SNANS (const_rtx x)
5026 return HONOR_SNANS (GET_MODE (x));
5029 /* As for HONOR_NANS, but true if the mode can represent infinity and
5030 the treatment of infinite values is important. */
5032 bool
5033 HONOR_INFINITIES (machine_mode m)
5035 return MODE_HAS_INFINITIES (m) && !flag_finite_math_only;
5038 bool
5039 HONOR_INFINITIES (const_tree t)
5041 return HONOR_INFINITIES (element_mode (t));
5044 bool
5045 HONOR_INFINITIES (const_rtx x)
5047 return HONOR_INFINITIES (GET_MODE (x));
5050 /* Like HONOR_NANS, but true if the given mode distinguishes between
5051 positive and negative zero, and the sign of zero is important. */
5053 bool
5054 HONOR_SIGNED_ZEROS (machine_mode m)
5056 return MODE_HAS_SIGNED_ZEROS (m) && flag_signed_zeros;
5059 bool
5060 HONOR_SIGNED_ZEROS (const_tree t)
5062 return HONOR_SIGNED_ZEROS (element_mode (t));
5065 bool
5066 HONOR_SIGNED_ZEROS (const_rtx x)
5068 return HONOR_SIGNED_ZEROS (GET_MODE (x));
5071 /* Like HONOR_NANS, but true if given mode supports sign-dependent rounding,
5072 and the rounding mode is important. */
5074 bool
5075 HONOR_SIGN_DEPENDENT_ROUNDING (machine_mode m)
5077 return MODE_HAS_SIGN_DEPENDENT_ROUNDING (m) && flag_rounding_math;
5080 bool
5081 HONOR_SIGN_DEPENDENT_ROUNDING (const_tree t)
5083 return HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (t));
5086 bool
5087 HONOR_SIGN_DEPENDENT_ROUNDING (const_rtx x)
5089 return HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (x));