2015-01-30 Gary Dismukes <dismukes@adacore.com>
[official-gcc.git] / gcc / real.c
blob01b169ed323d4c3ef595d2c82c25810bd3610006
1 /* real.c - software floating point emulation.
2 Copyright (C) 1993-2015 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 "hash-set.h"
27 #include "machmode.h"
28 #include "vec.h"
29 #include "double-int.h"
30 #include "input.h"
31 #include "alias.h"
32 #include "symtab.h"
33 #include "wide-int.h"
34 #include "inchash.h"
35 #include "tree.h"
36 #include "diagnostic-core.h"
37 #include "real.h"
38 #include "realmpfr.h"
39 #include "tm_p.h"
40 #include "dfp.h"
41 #include "wide-int.h"
42 #include "rtl.h"
43 #include "options.h"
45 /* The floating point model used internally is not exactly IEEE 754
46 compliant, and close to the description in the ISO C99 standard,
47 section 5.2.4.2.2 Characteristics of floating types.
49 Specifically
51 x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
53 where
54 s = sign (+- 1)
55 b = base or radix, here always 2
56 e = exponent
57 p = precision (the number of base-b digits in the significand)
58 f_k = the digits of the significand.
60 We differ from typical IEEE 754 encodings in that the entire
61 significand is fractional. Normalized significands are in the
62 range [0.5, 1.0).
64 A requirement of the model is that P be larger than the largest
65 supported target floating-point type by at least 2 bits. This gives
66 us proper rounding when we truncate to the target type. In addition,
67 E must be large enough to hold the smallest supported denormal number
68 in a normalized form.
70 Both of these requirements are easily satisfied. The largest target
71 significand is 113 bits; we store at least 160. The smallest
72 denormal number fits in 17 exponent bits; we store 26. */
75 /* Used to classify two numbers simultaneously. */
76 #define CLASS2(A, B) ((A) << 2 | (B))
78 #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
79 #error "Some constant folding done by hand to avoid shift count warnings"
80 #endif
82 static void get_zero (REAL_VALUE_TYPE *, int);
83 static void get_canonical_qnan (REAL_VALUE_TYPE *, int);
84 static void get_canonical_snan (REAL_VALUE_TYPE *, int);
85 static void get_inf (REAL_VALUE_TYPE *, int);
86 static bool sticky_rshift_significand (REAL_VALUE_TYPE *,
87 const REAL_VALUE_TYPE *, unsigned int);
88 static void rshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
89 unsigned int);
90 static void lshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
91 unsigned int);
92 static void lshift_significand_1 (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
93 static bool add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *,
94 const REAL_VALUE_TYPE *);
95 static bool sub_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
96 const REAL_VALUE_TYPE *, int);
97 static void neg_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
98 static int cmp_significands (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
99 static int cmp_significand_0 (const REAL_VALUE_TYPE *);
100 static void set_significand_bit (REAL_VALUE_TYPE *, unsigned int);
101 static void clear_significand_bit (REAL_VALUE_TYPE *, unsigned int);
102 static bool test_significand_bit (REAL_VALUE_TYPE *, unsigned int);
103 static void clear_significand_below (REAL_VALUE_TYPE *, unsigned int);
104 static bool div_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
105 const REAL_VALUE_TYPE *);
106 static void normalize (REAL_VALUE_TYPE *);
108 static bool do_add (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
109 const REAL_VALUE_TYPE *, int);
110 static bool do_multiply (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
111 const REAL_VALUE_TYPE *);
112 static bool do_divide (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
113 const REAL_VALUE_TYPE *);
114 static int do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
115 static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
117 static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *);
118 static void decimal_from_integer (REAL_VALUE_TYPE *);
119 static void decimal_integer_string (char *, const REAL_VALUE_TYPE *,
120 size_t);
122 static const REAL_VALUE_TYPE * ten_to_ptwo (int);
123 static const REAL_VALUE_TYPE * ten_to_mptwo (int);
124 static const REAL_VALUE_TYPE * real_digit (int);
125 static void times_pten (REAL_VALUE_TYPE *, int);
127 static void round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
129 /* Initialize R with a positive zero. */
131 static inline void
132 get_zero (REAL_VALUE_TYPE *r, int sign)
134 memset (r, 0, sizeof (*r));
135 r->sign = sign;
138 /* Initialize R with the canonical quiet NaN. */
140 static inline void
141 get_canonical_qnan (REAL_VALUE_TYPE *r, int sign)
143 memset (r, 0, sizeof (*r));
144 r->cl = rvc_nan;
145 r->sign = sign;
146 r->canonical = 1;
149 static inline void
150 get_canonical_snan (REAL_VALUE_TYPE *r, int sign)
152 memset (r, 0, sizeof (*r));
153 r->cl = rvc_nan;
154 r->sign = sign;
155 r->signalling = 1;
156 r->canonical = 1;
159 static inline void
160 get_inf (REAL_VALUE_TYPE *r, int sign)
162 memset (r, 0, sizeof (*r));
163 r->cl = rvc_inf;
164 r->sign = sign;
168 /* Right-shift the significand of A by N bits; put the result in the
169 significand of R. If any one bits are shifted out, return true. */
171 static bool
172 sticky_rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
173 unsigned int n)
175 unsigned long sticky = 0;
176 unsigned int i, ofs = 0;
178 if (n >= HOST_BITS_PER_LONG)
180 for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i)
181 sticky |= a->sig[i];
182 n &= HOST_BITS_PER_LONG - 1;
185 if (n != 0)
187 sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1);
188 for (i = 0; i < SIGSZ; ++i)
190 r->sig[i]
191 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
192 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
193 << (HOST_BITS_PER_LONG - n)));
196 else
198 for (i = 0; ofs + i < SIGSZ; ++i)
199 r->sig[i] = a->sig[ofs + i];
200 for (; i < SIGSZ; ++i)
201 r->sig[i] = 0;
204 return sticky != 0;
207 /* Right-shift the significand of A by N bits; put the result in the
208 significand of R. */
210 static void
211 rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
212 unsigned int n)
214 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
216 n &= HOST_BITS_PER_LONG - 1;
217 if (n != 0)
219 for (i = 0; i < SIGSZ; ++i)
221 r->sig[i]
222 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
223 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
224 << (HOST_BITS_PER_LONG - n)));
227 else
229 for (i = 0; ofs + i < SIGSZ; ++i)
230 r->sig[i] = a->sig[ofs + i];
231 for (; i < SIGSZ; ++i)
232 r->sig[i] = 0;
236 /* Left-shift the significand of A by N bits; put the result in the
237 significand of R. */
239 static void
240 lshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
241 unsigned int n)
243 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
245 n &= HOST_BITS_PER_LONG - 1;
246 if (n == 0)
248 for (i = 0; ofs + i < SIGSZ; ++i)
249 r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs];
250 for (; i < SIGSZ; ++i)
251 r->sig[SIGSZ-1-i] = 0;
253 else
254 for (i = 0; i < SIGSZ; ++i)
256 r->sig[SIGSZ-1-i]
257 = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n)
258 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1])
259 >> (HOST_BITS_PER_LONG - n)));
263 /* Likewise, but N is specialized to 1. */
265 static inline void
266 lshift_significand_1 (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
268 unsigned int i;
270 for (i = SIGSZ - 1; i > 0; --i)
271 r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1));
272 r->sig[0] = a->sig[0] << 1;
275 /* Add the significands of A and B, placing the result in R. Return
276 true if there was carry out of the most significant word. */
278 static inline bool
279 add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
280 const REAL_VALUE_TYPE *b)
282 bool carry = false;
283 int i;
285 for (i = 0; i < SIGSZ; ++i)
287 unsigned long ai = a->sig[i];
288 unsigned long ri = ai + b->sig[i];
290 if (carry)
292 carry = ri < ai;
293 carry |= ++ri == 0;
295 else
296 carry = ri < ai;
298 r->sig[i] = ri;
301 return carry;
304 /* Subtract the significands of A and B, placing the result in R. CARRY is
305 true if there's a borrow incoming to the least significant word.
306 Return true if there was borrow out of the most significant word. */
308 static inline bool
309 sub_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
310 const REAL_VALUE_TYPE *b, int carry)
312 int i;
314 for (i = 0; i < SIGSZ; ++i)
316 unsigned long ai = a->sig[i];
317 unsigned long ri = ai - b->sig[i];
319 if (carry)
321 carry = ri > ai;
322 carry |= ~--ri == 0;
324 else
325 carry = ri > ai;
327 r->sig[i] = ri;
330 return carry;
333 /* Negate the significand A, placing the result in R. */
335 static inline void
336 neg_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
338 bool carry = true;
339 int i;
341 for (i = 0; i < SIGSZ; ++i)
343 unsigned long ri, ai = a->sig[i];
345 if (carry)
347 if (ai)
349 ri = -ai;
350 carry = false;
352 else
353 ri = ai;
355 else
356 ri = ~ai;
358 r->sig[i] = ri;
362 /* Compare significands. Return tri-state vs zero. */
364 static inline int
365 cmp_significands (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
367 int i;
369 for (i = SIGSZ - 1; i >= 0; --i)
371 unsigned long ai = a->sig[i];
372 unsigned long bi = b->sig[i];
374 if (ai > bi)
375 return 1;
376 if (ai < bi)
377 return -1;
380 return 0;
383 /* Return true if A is nonzero. */
385 static inline int
386 cmp_significand_0 (const REAL_VALUE_TYPE *a)
388 int i;
390 for (i = SIGSZ - 1; i >= 0; --i)
391 if (a->sig[i])
392 return 1;
394 return 0;
397 /* Set bit N of the significand of R. */
399 static inline void
400 set_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 /* Clear bit N of the significand of R. */
408 static inline void
409 clear_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
411 r->sig[n / HOST_BITS_PER_LONG]
412 &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG));
415 /* Test bit N of the significand of R. */
417 static inline bool
418 test_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
420 /* ??? Compiler bug here if we return this expression directly.
421 The conversion to bool strips the "&1" and we wind up testing
422 e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */
423 int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1;
424 return t;
427 /* Clear bits 0..N-1 of the significand of R. */
429 static void
430 clear_significand_below (REAL_VALUE_TYPE *r, unsigned int n)
432 int i, w = n / HOST_BITS_PER_LONG;
434 for (i = 0; i < w; ++i)
435 r->sig[i] = 0;
437 r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1);
440 /* Divide the significands of A and B, placing the result in R. Return
441 true if the division was inexact. */
443 static inline bool
444 div_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
445 const REAL_VALUE_TYPE *b)
447 REAL_VALUE_TYPE u;
448 int i, bit = SIGNIFICAND_BITS - 1;
449 unsigned long msb, inexact;
451 u = *a;
452 memset (r->sig, 0, sizeof (r->sig));
454 msb = 0;
455 goto start;
458 msb = u.sig[SIGSZ-1] & SIG_MSB;
459 lshift_significand_1 (&u, &u);
460 start:
461 if (msb || cmp_significands (&u, b) >= 0)
463 sub_significands (&u, &u, b, 0);
464 set_significand_bit (r, bit);
467 while (--bit >= 0);
469 for (i = 0, inexact = 0; i < SIGSZ; i++)
470 inexact |= u.sig[i];
472 return inexact != 0;
475 /* Adjust the exponent and significand of R such that the most
476 significant bit is set. We underflow to zero and overflow to
477 infinity here, without denormals. (The intermediate representation
478 exponent is large enough to handle target denormals normalized.) */
480 static void
481 normalize (REAL_VALUE_TYPE *r)
483 int shift = 0, exp;
484 int i, j;
486 if (r->decimal)
487 return;
489 /* Find the first word that is nonzero. */
490 for (i = SIGSZ - 1; i >= 0; i--)
491 if (r->sig[i] == 0)
492 shift += HOST_BITS_PER_LONG;
493 else
494 break;
496 /* Zero significand flushes to zero. */
497 if (i < 0)
499 r->cl = rvc_zero;
500 SET_REAL_EXP (r, 0);
501 return;
504 /* Find the first bit that is nonzero. */
505 for (j = 0; ; j++)
506 if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j)))
507 break;
508 shift += j;
510 if (shift > 0)
512 exp = REAL_EXP (r) - shift;
513 if (exp > MAX_EXP)
514 get_inf (r, r->sign);
515 else if (exp < -MAX_EXP)
516 get_zero (r, r->sign);
517 else
519 SET_REAL_EXP (r, exp);
520 lshift_significand (r, r, shift);
525 /* Calculate R = A + (SUBTRACT_P ? -B : B). Return true if the
526 result may be inexact due to a loss of precision. */
528 static bool
529 do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
530 const REAL_VALUE_TYPE *b, int subtract_p)
532 int dexp, sign, exp;
533 REAL_VALUE_TYPE t;
534 bool inexact = false;
536 /* Determine if we need to add or subtract. */
537 sign = a->sign;
538 subtract_p = (sign ^ b->sign) ^ subtract_p;
540 switch (CLASS2 (a->cl, b->cl))
542 case CLASS2 (rvc_zero, rvc_zero):
543 /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0. */
544 get_zero (r, sign & !subtract_p);
545 return false;
547 case CLASS2 (rvc_zero, rvc_normal):
548 case CLASS2 (rvc_zero, rvc_inf):
549 case CLASS2 (rvc_zero, rvc_nan):
550 /* 0 + ANY = ANY. */
551 case CLASS2 (rvc_normal, rvc_nan):
552 case CLASS2 (rvc_inf, rvc_nan):
553 case CLASS2 (rvc_nan, rvc_nan):
554 /* ANY + NaN = NaN. */
555 case CLASS2 (rvc_normal, rvc_inf):
556 /* R + Inf = Inf. */
557 *r = *b;
558 r->sign = sign ^ subtract_p;
559 return false;
561 case CLASS2 (rvc_normal, rvc_zero):
562 case CLASS2 (rvc_inf, rvc_zero):
563 case CLASS2 (rvc_nan, rvc_zero):
564 /* ANY + 0 = ANY. */
565 case CLASS2 (rvc_nan, rvc_normal):
566 case CLASS2 (rvc_nan, rvc_inf):
567 /* NaN + ANY = NaN. */
568 case CLASS2 (rvc_inf, rvc_normal):
569 /* Inf + R = Inf. */
570 *r = *a;
571 return false;
573 case CLASS2 (rvc_inf, rvc_inf):
574 if (subtract_p)
575 /* Inf - Inf = NaN. */
576 get_canonical_qnan (r, 0);
577 else
578 /* Inf + Inf = Inf. */
579 *r = *a;
580 return false;
582 case CLASS2 (rvc_normal, rvc_normal):
583 break;
585 default:
586 gcc_unreachable ();
589 /* Swap the arguments such that A has the larger exponent. */
590 dexp = REAL_EXP (a) - REAL_EXP (b);
591 if (dexp < 0)
593 const REAL_VALUE_TYPE *t;
594 t = a, a = b, b = t;
595 dexp = -dexp;
596 sign ^= subtract_p;
598 exp = REAL_EXP (a);
600 /* If the exponents are not identical, we need to shift the
601 significand of B down. */
602 if (dexp > 0)
604 /* If the exponents are too far apart, the significands
605 do not overlap, which makes the subtraction a noop. */
606 if (dexp >= SIGNIFICAND_BITS)
608 *r = *a;
609 r->sign = sign;
610 return true;
613 inexact |= sticky_rshift_significand (&t, b, dexp);
614 b = &t;
617 if (subtract_p)
619 if (sub_significands (r, a, b, inexact))
621 /* We got a borrow out of the subtraction. That means that
622 A and B had the same exponent, and B had the larger
623 significand. We need to swap the sign and negate the
624 significand. */
625 sign ^= 1;
626 neg_significand (r, r);
629 else
631 if (add_significands (r, a, b))
633 /* We got carry out of the addition. This means we need to
634 shift the significand back down one bit and increase the
635 exponent. */
636 inexact |= sticky_rshift_significand (r, r, 1);
637 r->sig[SIGSZ-1] |= SIG_MSB;
638 if (++exp > MAX_EXP)
640 get_inf (r, sign);
641 return true;
646 r->cl = rvc_normal;
647 r->sign = sign;
648 SET_REAL_EXP (r, exp);
649 /* Zero out the remaining fields. */
650 r->signalling = 0;
651 r->canonical = 0;
652 r->decimal = 0;
654 /* Re-normalize the result. */
655 normalize (r);
657 /* Special case: if the subtraction results in zero, the result
658 is positive. */
659 if (r->cl == rvc_zero)
660 r->sign = 0;
661 else
662 r->sig[0] |= inexact;
664 return inexact;
667 /* Calculate R = A * B. Return true if the result may be inexact. */
669 static bool
670 do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
671 const REAL_VALUE_TYPE *b)
673 REAL_VALUE_TYPE u, t, *rr;
674 unsigned int i, j, k;
675 int sign = a->sign ^ b->sign;
676 bool inexact = false;
678 switch (CLASS2 (a->cl, b->cl))
680 case CLASS2 (rvc_zero, rvc_zero):
681 case CLASS2 (rvc_zero, rvc_normal):
682 case CLASS2 (rvc_normal, rvc_zero):
683 /* +-0 * ANY = 0 with appropriate sign. */
684 get_zero (r, sign);
685 return false;
687 case CLASS2 (rvc_zero, rvc_nan):
688 case CLASS2 (rvc_normal, rvc_nan):
689 case CLASS2 (rvc_inf, rvc_nan):
690 case CLASS2 (rvc_nan, rvc_nan):
691 /* ANY * NaN = NaN. */
692 *r = *b;
693 r->sign = sign;
694 return false;
696 case CLASS2 (rvc_nan, rvc_zero):
697 case CLASS2 (rvc_nan, rvc_normal):
698 case CLASS2 (rvc_nan, rvc_inf):
699 /* NaN * ANY = NaN. */
700 *r = *a;
701 r->sign = sign;
702 return false;
704 case CLASS2 (rvc_zero, rvc_inf):
705 case CLASS2 (rvc_inf, rvc_zero):
706 /* 0 * Inf = NaN */
707 get_canonical_qnan (r, sign);
708 return false;
710 case CLASS2 (rvc_inf, rvc_inf):
711 case CLASS2 (rvc_normal, rvc_inf):
712 case CLASS2 (rvc_inf, rvc_normal):
713 /* Inf * Inf = Inf, R * Inf = Inf */
714 get_inf (r, sign);
715 return false;
717 case CLASS2 (rvc_normal, rvc_normal):
718 break;
720 default:
721 gcc_unreachable ();
724 if (r == a || r == b)
725 rr = &t;
726 else
727 rr = r;
728 get_zero (rr, 0);
730 /* Collect all the partial products. Since we don't have sure access
731 to a widening multiply, we split each long into two half-words.
733 Consider the long-hand form of a four half-word multiplication:
735 A B C D
736 * E F G H
737 --------------
738 DE DF DG DH
739 CE CF CG CH
740 BE BF BG BH
741 AE AF AG AH
743 We construct partial products of the widened half-word products
744 that are known to not overlap, e.g. DF+DH. Each such partial
745 product is given its proper exponent, which allows us to sum them
746 and obtain the finished product. */
748 for (i = 0; i < SIGSZ * 2; ++i)
750 unsigned long ai = a->sig[i / 2];
751 if (i & 1)
752 ai >>= HOST_BITS_PER_LONG / 2;
753 else
754 ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
756 if (ai == 0)
757 continue;
759 for (j = 0; j < 2; ++j)
761 int exp = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
762 + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2)));
764 if (exp > MAX_EXP)
766 get_inf (r, sign);
767 return true;
769 if (exp < -MAX_EXP)
771 /* Would underflow to zero, which we shouldn't bother adding. */
772 inexact = true;
773 continue;
776 memset (&u, 0, sizeof (u));
777 u.cl = rvc_normal;
778 SET_REAL_EXP (&u, exp);
780 for (k = j; k < SIGSZ * 2; k += 2)
782 unsigned long bi = b->sig[k / 2];
783 if (k & 1)
784 bi >>= HOST_BITS_PER_LONG / 2;
785 else
786 bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
788 u.sig[k / 2] = ai * bi;
791 normalize (&u);
792 inexact |= do_add (rr, rr, &u, 0);
796 rr->sign = sign;
797 if (rr != r)
798 *r = t;
800 return inexact;
803 /* Calculate R = A / B. Return true if the result may be inexact. */
805 static bool
806 do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
807 const REAL_VALUE_TYPE *b)
809 int exp, sign = a->sign ^ b->sign;
810 REAL_VALUE_TYPE t, *rr;
811 bool inexact;
813 switch (CLASS2 (a->cl, b->cl))
815 case CLASS2 (rvc_zero, rvc_zero):
816 /* 0 / 0 = NaN. */
817 case CLASS2 (rvc_inf, rvc_inf):
818 /* Inf / Inf = NaN. */
819 get_canonical_qnan (r, sign);
820 return false;
822 case CLASS2 (rvc_zero, rvc_normal):
823 case CLASS2 (rvc_zero, rvc_inf):
824 /* 0 / ANY = 0. */
825 case CLASS2 (rvc_normal, rvc_inf):
826 /* R / Inf = 0. */
827 get_zero (r, sign);
828 return false;
830 case CLASS2 (rvc_normal, rvc_zero):
831 /* R / 0 = Inf. */
832 case CLASS2 (rvc_inf, rvc_zero):
833 /* Inf / 0 = Inf. */
834 get_inf (r, sign);
835 return false;
837 case CLASS2 (rvc_zero, rvc_nan):
838 case CLASS2 (rvc_normal, rvc_nan):
839 case CLASS2 (rvc_inf, rvc_nan):
840 case CLASS2 (rvc_nan, rvc_nan):
841 /* ANY / NaN = NaN. */
842 *r = *b;
843 r->sign = sign;
844 return false;
846 case CLASS2 (rvc_nan, rvc_zero):
847 case CLASS2 (rvc_nan, rvc_normal):
848 case CLASS2 (rvc_nan, rvc_inf):
849 /* NaN / ANY = NaN. */
850 *r = *a;
851 r->sign = sign;
852 return false;
854 case CLASS2 (rvc_inf, rvc_normal):
855 /* Inf / R = Inf. */
856 get_inf (r, sign);
857 return false;
859 case CLASS2 (rvc_normal, rvc_normal):
860 break;
862 default:
863 gcc_unreachable ();
866 if (r == a || r == b)
867 rr = &t;
868 else
869 rr = r;
871 /* Make sure all fields in the result are initialized. */
872 get_zero (rr, 0);
873 rr->cl = rvc_normal;
874 rr->sign = sign;
876 exp = REAL_EXP (a) - REAL_EXP (b) + 1;
877 if (exp > MAX_EXP)
879 get_inf (r, sign);
880 return true;
882 if (exp < -MAX_EXP)
884 get_zero (r, sign);
885 return true;
887 SET_REAL_EXP (rr, exp);
889 inexact = div_significands (rr, a, b);
891 /* Re-normalize the result. */
892 normalize (rr);
893 rr->sig[0] |= inexact;
895 if (rr != r)
896 *r = t;
898 return inexact;
901 /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
902 one of the two operands is a NaN. */
904 static int
905 do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
906 int nan_result)
908 int ret;
910 switch (CLASS2 (a->cl, b->cl))
912 case CLASS2 (rvc_zero, rvc_zero):
913 /* Sign of zero doesn't matter for compares. */
914 return 0;
916 case CLASS2 (rvc_normal, rvc_zero):
917 /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */
918 if (a->decimal)
919 return decimal_do_compare (a, b, nan_result);
920 /* Fall through. */
921 case CLASS2 (rvc_inf, rvc_zero):
922 case CLASS2 (rvc_inf, rvc_normal):
923 return (a->sign ? -1 : 1);
925 case CLASS2 (rvc_inf, rvc_inf):
926 return -a->sign - -b->sign;
928 case CLASS2 (rvc_zero, rvc_normal):
929 /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */
930 if (b->decimal)
931 return decimal_do_compare (a, b, nan_result);
932 /* Fall through. */
933 case CLASS2 (rvc_zero, rvc_inf):
934 case CLASS2 (rvc_normal, rvc_inf):
935 return (b->sign ? 1 : -1);
937 case CLASS2 (rvc_zero, rvc_nan):
938 case CLASS2 (rvc_normal, rvc_nan):
939 case CLASS2 (rvc_inf, rvc_nan):
940 case CLASS2 (rvc_nan, rvc_nan):
941 case CLASS2 (rvc_nan, rvc_zero):
942 case CLASS2 (rvc_nan, rvc_normal):
943 case CLASS2 (rvc_nan, rvc_inf):
944 return nan_result;
946 case CLASS2 (rvc_normal, rvc_normal):
947 break;
949 default:
950 gcc_unreachable ();
953 if (a->sign != b->sign)
954 return -a->sign - -b->sign;
956 if (a->decimal || b->decimal)
957 return decimal_do_compare (a, b, nan_result);
959 if (REAL_EXP (a) > REAL_EXP (b))
960 ret = 1;
961 else if (REAL_EXP (a) < REAL_EXP (b))
962 ret = -1;
963 else
964 ret = cmp_significands (a, b);
966 return (a->sign ? -ret : ret);
969 /* Return A truncated to an integral value toward zero. */
971 static void
972 do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
974 *r = *a;
976 switch (r->cl)
978 case rvc_zero:
979 case rvc_inf:
980 case rvc_nan:
981 break;
983 case rvc_normal:
984 if (r->decimal)
986 decimal_do_fix_trunc (r, a);
987 return;
989 if (REAL_EXP (r) <= 0)
990 get_zero (r, r->sign);
991 else if (REAL_EXP (r) < SIGNIFICAND_BITS)
992 clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r));
993 break;
995 default:
996 gcc_unreachable ();
1000 /* Perform the binary or unary operation described by CODE.
1001 For a unary operation, leave OP1 NULL. This function returns
1002 true if the result may be inexact due to loss of precision. */
1004 bool
1005 real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
1006 const REAL_VALUE_TYPE *op1)
1008 enum tree_code code = (enum tree_code) icode;
1010 if (op0->decimal || (op1 && op1->decimal))
1011 return decimal_real_arithmetic (r, code, op0, op1);
1013 switch (code)
1015 case PLUS_EXPR:
1016 /* Clear any padding areas in *r if it isn't equal to one of the
1017 operands so that we can later do bitwise comparisons later on. */
1018 if (r != op0 && r != op1)
1019 memset (r, '\0', sizeof (*r));
1020 return do_add (r, op0, op1, 0);
1022 case MINUS_EXPR:
1023 if (r != op0 && r != op1)
1024 memset (r, '\0', sizeof (*r));
1025 return do_add (r, op0, op1, 1);
1027 case MULT_EXPR:
1028 if (r != op0 && r != op1)
1029 memset (r, '\0', sizeof (*r));
1030 return do_multiply (r, op0, op1);
1032 case RDIV_EXPR:
1033 if (r != op0 && r != op1)
1034 memset (r, '\0', sizeof (*r));
1035 return do_divide (r, op0, op1);
1037 case MIN_EXPR:
1038 if (op1->cl == rvc_nan)
1039 *r = *op1;
1040 else if (do_compare (op0, op1, -1) < 0)
1041 *r = *op0;
1042 else
1043 *r = *op1;
1044 break;
1046 case MAX_EXPR:
1047 if (op1->cl == rvc_nan)
1048 *r = *op1;
1049 else if (do_compare (op0, op1, 1) < 0)
1050 *r = *op1;
1051 else
1052 *r = *op0;
1053 break;
1055 case NEGATE_EXPR:
1056 *r = *op0;
1057 r->sign ^= 1;
1058 break;
1060 case ABS_EXPR:
1061 *r = *op0;
1062 r->sign = 0;
1063 break;
1065 case FIX_TRUNC_EXPR:
1066 do_fix_trunc (r, op0);
1067 break;
1069 default:
1070 gcc_unreachable ();
1072 return false;
1075 REAL_VALUE_TYPE
1076 real_value_negate (const REAL_VALUE_TYPE *op0)
1078 REAL_VALUE_TYPE r;
1079 real_arithmetic (&r, NEGATE_EXPR, op0, NULL);
1080 return r;
1083 REAL_VALUE_TYPE
1084 real_value_abs (const REAL_VALUE_TYPE *op0)
1086 REAL_VALUE_TYPE r;
1087 real_arithmetic (&r, ABS_EXPR, op0, NULL);
1088 return r;
1091 bool
1092 real_compare (int icode, const REAL_VALUE_TYPE *op0,
1093 const REAL_VALUE_TYPE *op1)
1095 enum tree_code code = (enum tree_code) icode;
1097 switch (code)
1099 case LT_EXPR:
1100 return do_compare (op0, op1, 1) < 0;
1101 case LE_EXPR:
1102 return do_compare (op0, op1, 1) <= 0;
1103 case GT_EXPR:
1104 return do_compare (op0, op1, -1) > 0;
1105 case GE_EXPR:
1106 return do_compare (op0, op1, -1) >= 0;
1107 case EQ_EXPR:
1108 return do_compare (op0, op1, -1) == 0;
1109 case NE_EXPR:
1110 return do_compare (op0, op1, -1) != 0;
1111 case UNORDERED_EXPR:
1112 return op0->cl == rvc_nan || op1->cl == rvc_nan;
1113 case ORDERED_EXPR:
1114 return op0->cl != rvc_nan && op1->cl != rvc_nan;
1115 case UNLT_EXPR:
1116 return do_compare (op0, op1, -1) < 0;
1117 case UNLE_EXPR:
1118 return do_compare (op0, op1, -1) <= 0;
1119 case UNGT_EXPR:
1120 return do_compare (op0, op1, 1) > 0;
1121 case UNGE_EXPR:
1122 return do_compare (op0, op1, 1) >= 0;
1123 case UNEQ_EXPR:
1124 return do_compare (op0, op1, 0) == 0;
1125 case LTGT_EXPR:
1126 return do_compare (op0, op1, 0) != 0;
1128 default:
1129 gcc_unreachable ();
1133 /* Return floor log2(R). */
1136 real_exponent (const REAL_VALUE_TYPE *r)
1138 switch (r->cl)
1140 case rvc_zero:
1141 return 0;
1142 case rvc_inf:
1143 case rvc_nan:
1144 return (unsigned int)-1 >> 1;
1145 case rvc_normal:
1146 return REAL_EXP (r);
1147 default:
1148 gcc_unreachable ();
1152 /* R = OP0 * 2**EXP. */
1154 void
1155 real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
1157 *r = *op0;
1158 switch (r->cl)
1160 case rvc_zero:
1161 case rvc_inf:
1162 case rvc_nan:
1163 break;
1165 case rvc_normal:
1166 exp += REAL_EXP (op0);
1167 if (exp > MAX_EXP)
1168 get_inf (r, r->sign);
1169 else if (exp < -MAX_EXP)
1170 get_zero (r, r->sign);
1171 else
1172 SET_REAL_EXP (r, exp);
1173 break;
1175 default:
1176 gcc_unreachable ();
1180 /* Determine whether a floating-point value X is infinite. */
1182 bool
1183 real_isinf (const REAL_VALUE_TYPE *r)
1185 return (r->cl == rvc_inf);
1188 /* Determine whether a floating-point value X is a NaN. */
1190 bool
1191 real_isnan (const REAL_VALUE_TYPE *r)
1193 return (r->cl == rvc_nan);
1196 /* Determine whether a floating-point value X is finite. */
1198 bool
1199 real_isfinite (const REAL_VALUE_TYPE *r)
1201 return (r->cl != rvc_nan) && (r->cl != rvc_inf);
1204 /* Determine whether a floating-point value X is negative. */
1206 bool
1207 real_isneg (const REAL_VALUE_TYPE *r)
1209 return r->sign;
1212 /* Determine whether a floating-point value X is minus zero. */
1214 bool
1215 real_isnegzero (const REAL_VALUE_TYPE *r)
1217 return r->sign && r->cl == rvc_zero;
1220 /* Compare two floating-point objects for bitwise identity. */
1222 bool
1223 real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
1225 int i;
1227 if (a->cl != b->cl)
1228 return false;
1229 if (a->sign != b->sign)
1230 return false;
1232 switch (a->cl)
1234 case rvc_zero:
1235 case rvc_inf:
1236 return true;
1238 case rvc_normal:
1239 if (a->decimal != b->decimal)
1240 return false;
1241 if (REAL_EXP (a) != REAL_EXP (b))
1242 return false;
1243 break;
1245 case rvc_nan:
1246 if (a->signalling != b->signalling)
1247 return false;
1248 /* The significand is ignored for canonical NaNs. */
1249 if (a->canonical || b->canonical)
1250 return a->canonical == b->canonical;
1251 break;
1253 default:
1254 gcc_unreachable ();
1257 for (i = 0; i < SIGSZ; ++i)
1258 if (a->sig[i] != b->sig[i])
1259 return false;
1261 return true;
1264 /* Try to change R into its exact multiplicative inverse in machine
1265 mode MODE. Return true if successful. */
1267 bool
1268 exact_real_inverse (machine_mode mode, REAL_VALUE_TYPE *r)
1270 const REAL_VALUE_TYPE *one = real_digit (1);
1271 REAL_VALUE_TYPE u;
1272 int i;
1274 if (r->cl != rvc_normal)
1275 return false;
1277 /* Check for a power of two: all significand bits zero except the MSB. */
1278 for (i = 0; i < SIGSZ-1; ++i)
1279 if (r->sig[i] != 0)
1280 return false;
1281 if (r->sig[SIGSZ-1] != SIG_MSB)
1282 return false;
1284 /* Find the inverse and truncate to the required mode. */
1285 do_divide (&u, one, r);
1286 real_convert (&u, mode, &u);
1288 /* The rounding may have overflowed. */
1289 if (u.cl != rvc_normal)
1290 return false;
1291 for (i = 0; i < SIGSZ-1; ++i)
1292 if (u.sig[i] != 0)
1293 return false;
1294 if (u.sig[SIGSZ-1] != SIG_MSB)
1295 return false;
1297 *r = u;
1298 return true;
1301 /* Return true if arithmetic on values in IMODE that were promoted
1302 from values in TMODE is equivalent to direct arithmetic on values
1303 in TMODE. */
1305 bool
1306 real_can_shorten_arithmetic (machine_mode imode, machine_mode tmode)
1308 const struct real_format *tfmt, *ifmt;
1309 tfmt = REAL_MODE_FORMAT (tmode);
1310 ifmt = REAL_MODE_FORMAT (imode);
1311 /* These conditions are conservative rather than trying to catch the
1312 exact boundary conditions; the main case to allow is IEEE float
1313 and double. */
1314 return (ifmt->b == tfmt->b
1315 && ifmt->p > 2 * tfmt->p
1316 && ifmt->emin < 2 * tfmt->emin - tfmt->p - 2
1317 && ifmt->emin < tfmt->emin - tfmt->emax - tfmt->p - 2
1318 && ifmt->emax > 2 * tfmt->emax + 2
1319 && ifmt->emax > tfmt->emax - tfmt->emin + tfmt->p + 2
1320 && ifmt->round_towards_zero == tfmt->round_towards_zero
1321 && (ifmt->has_sign_dependent_rounding
1322 == tfmt->has_sign_dependent_rounding)
1323 && ifmt->has_nans >= tfmt->has_nans
1324 && ifmt->has_inf >= tfmt->has_inf
1325 && ifmt->has_signed_zero >= tfmt->has_signed_zero
1326 && !MODE_COMPOSITE_P (tmode)
1327 && !MODE_COMPOSITE_P (imode));
1330 /* Render R as an integer. */
1332 HOST_WIDE_INT
1333 real_to_integer (const REAL_VALUE_TYPE *r)
1335 unsigned HOST_WIDE_INT i;
1337 switch (r->cl)
1339 case rvc_zero:
1340 underflow:
1341 return 0;
1343 case rvc_inf:
1344 case rvc_nan:
1345 overflow:
1346 i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1347 if (!r->sign)
1348 i--;
1349 return i;
1351 case rvc_normal:
1352 if (r->decimal)
1353 return decimal_real_to_integer (r);
1355 if (REAL_EXP (r) <= 0)
1356 goto underflow;
1357 /* Only force overflow for unsigned overflow. Signed overflow is
1358 undefined, so it doesn't matter what we return, and some callers
1359 expect to be able to use this routine for both signed and
1360 unsigned conversions. */
1361 if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT)
1362 goto overflow;
1364 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1365 i = r->sig[SIGSZ-1];
1366 else
1368 gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
1369 i = r->sig[SIGSZ-1];
1370 i = i << (HOST_BITS_PER_LONG - 1) << 1;
1371 i |= r->sig[SIGSZ-2];
1374 i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r);
1376 if (r->sign)
1377 i = -i;
1378 return i;
1380 default:
1381 gcc_unreachable ();
1385 /* Likewise, but producing a wide-int of PRECISION. If the value cannot
1386 be represented in precision, *FAIL is set to TRUE. */
1388 wide_int
1389 real_to_integer (const REAL_VALUE_TYPE *r, bool *fail, int precision)
1391 HOST_WIDE_INT val[2 * WIDE_INT_MAX_ELTS];
1392 int exp;
1393 int words, w;
1394 wide_int result;
1396 switch (r->cl)
1398 case rvc_zero:
1399 underflow:
1400 return wi::zero (precision);
1402 case rvc_inf:
1403 case rvc_nan:
1404 overflow:
1405 *fail = true;
1407 if (r->sign)
1408 return wi::set_bit_in_zero (precision - 1, precision);
1409 else
1410 return ~wi::set_bit_in_zero (precision - 1, precision);
1412 case rvc_normal:
1413 if (r->decimal)
1414 return decimal_real_to_integer (r, fail, precision);
1416 exp = REAL_EXP (r);
1417 if (exp <= 0)
1418 goto underflow;
1419 /* Only force overflow for unsigned overflow. Signed overflow is
1420 undefined, so it doesn't matter what we return, and some callers
1421 expect to be able to use this routine for both signed and
1422 unsigned conversions. */
1423 if (exp > precision)
1424 goto overflow;
1426 /* Put the significand into a wide_int that has precision W, which
1427 is the smallest HWI-multiple that has at least PRECISION bits.
1428 This ensures that the top bit of the significand is in the
1429 top bit of the wide_int. */
1430 words = (precision + HOST_BITS_PER_WIDE_INT - 1) / HOST_BITS_PER_WIDE_INT;
1431 w = words * HOST_BITS_PER_WIDE_INT;
1433 #if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1434 for (int i = 0; i < words; i++)
1436 int j = SIGSZ - words + i;
1437 val[i] = (j < 0) ? 0 : r->sig[j];
1439 #else
1440 gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
1441 for (int i = 0; i < words; i++)
1443 int j = SIGSZ - (words * 2) + (i * 2);
1444 if (j < 0)
1445 val[i] = 0;
1446 else
1447 val[i] = r->sig[j];
1448 j += 1;
1449 if (j >= 0)
1450 val[i] |= (unsigned HOST_WIDE_INT) r->sig[j] << HOST_BITS_PER_LONG;
1452 #endif
1453 /* Shift the value into place and truncate to the desired precision. */
1454 result = wide_int::from_array (val, words, w);
1455 result = wi::lrshift (result, w - exp);
1456 result = wide_int::from (result, precision, UNSIGNED);
1458 if (r->sign)
1459 return -result;
1460 else
1461 return result;
1463 default:
1464 gcc_unreachable ();
1468 /* A subroutine of real_to_decimal. Compute the quotient and remainder
1469 of NUM / DEN. Return the quotient and place the remainder in NUM.
1470 It is expected that NUM / DEN are close enough that the quotient is
1471 small. */
1473 static unsigned long
1474 rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den)
1476 unsigned long q, msb;
1477 int expn = REAL_EXP (num), expd = REAL_EXP (den);
1479 if (expn < expd)
1480 return 0;
1482 q = msb = 0;
1483 goto start;
1486 msb = num->sig[SIGSZ-1] & SIG_MSB;
1487 q <<= 1;
1488 lshift_significand_1 (num, num);
1489 start:
1490 if (msb || cmp_significands (num, den) >= 0)
1492 sub_significands (num, num, den, 0);
1493 q |= 1;
1496 while (--expn >= expd);
1498 SET_REAL_EXP (num, expd);
1499 normalize (num);
1501 return q;
1504 /* Render R as a decimal floating point constant. Emit DIGITS significant
1505 digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the
1506 maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing
1507 zeros. If MODE is VOIDmode, round to nearest value. Otherwise, round
1508 to a string that, when parsed back in mode MODE, yields the same value. */
1510 #define M_LOG10_2 0.30102999566398119521
1512 void
1513 real_to_decimal_for_mode (char *str, const REAL_VALUE_TYPE *r_orig,
1514 size_t buf_size, size_t digits,
1515 int crop_trailing_zeros, machine_mode mode)
1517 const struct real_format *fmt = NULL;
1518 const REAL_VALUE_TYPE *one, *ten;
1519 REAL_VALUE_TYPE r, pten, u, v;
1520 int dec_exp, cmp_one, digit;
1521 size_t max_digits;
1522 char *p, *first, *last;
1523 bool sign;
1524 bool round_up;
1526 if (mode != VOIDmode)
1528 fmt = REAL_MODE_FORMAT (mode);
1529 gcc_assert (fmt);
1532 r = *r_orig;
1533 switch (r.cl)
1535 case rvc_zero:
1536 strcpy (str, (r.sign ? "-0.0" : "0.0"));
1537 return;
1538 case rvc_normal:
1539 break;
1540 case rvc_inf:
1541 strcpy (str, (r.sign ? "-Inf" : "+Inf"));
1542 return;
1543 case rvc_nan:
1544 /* ??? Print the significand as well, if not canonical? */
1545 sprintf (str, "%c%cNaN", (r_orig->sign ? '-' : '+'),
1546 (r_orig->signalling ? 'S' : 'Q'));
1547 return;
1548 default:
1549 gcc_unreachable ();
1552 if (r.decimal)
1554 decimal_real_to_decimal (str, &r, buf_size, digits, crop_trailing_zeros);
1555 return;
1558 /* Bound the number of digits printed by the size of the representation. */
1559 max_digits = SIGNIFICAND_BITS * M_LOG10_2;
1560 if (digits == 0 || digits > max_digits)
1561 digits = max_digits;
1563 /* Estimate the decimal exponent, and compute the length of the string it
1564 will print as. Be conservative and add one to account for possible
1565 overflow or rounding error. */
1566 dec_exp = REAL_EXP (&r) * M_LOG10_2;
1567 for (max_digits = 1; dec_exp ; max_digits++)
1568 dec_exp /= 10;
1570 /* Bound the number of digits printed by the size of the output buffer. */
1571 max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
1572 gcc_assert (max_digits <= buf_size);
1573 if (digits > max_digits)
1574 digits = max_digits;
1576 one = real_digit (1);
1577 ten = ten_to_ptwo (0);
1579 sign = r.sign;
1580 r.sign = 0;
1582 dec_exp = 0;
1583 pten = *one;
1585 cmp_one = do_compare (&r, one, 0);
1586 if (cmp_one > 0)
1588 int m;
1590 /* Number is greater than one. Convert significand to an integer
1591 and strip trailing decimal zeros. */
1593 u = r;
1594 SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1);
1596 /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
1597 m = floor_log2 (max_digits);
1599 /* Iterate over the bits of the possible powers of 10 that might
1600 be present in U and eliminate them. That is, if we find that
1601 10**2**M divides U evenly, keep the division and increase
1602 DEC_EXP by 2**M. */
1605 REAL_VALUE_TYPE t;
1607 do_divide (&t, &u, ten_to_ptwo (m));
1608 do_fix_trunc (&v, &t);
1609 if (cmp_significands (&v, &t) == 0)
1611 u = t;
1612 dec_exp += 1 << m;
1615 while (--m >= 0);
1617 /* Revert the scaling to integer that we performed earlier. */
1618 SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r)
1619 - (SIGNIFICAND_BITS - 1));
1620 r = u;
1622 /* Find power of 10. Do this by dividing out 10**2**M when
1623 this is larger than the current remainder. Fill PTEN with
1624 the power of 10 that we compute. */
1625 if (REAL_EXP (&r) > 0)
1627 m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1;
1630 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1631 if (do_compare (&u, ptentwo, 0) >= 0)
1633 do_divide (&u, &u, ptentwo);
1634 do_multiply (&pten, &pten, ptentwo);
1635 dec_exp += 1 << m;
1638 while (--m >= 0);
1640 else
1641 /* We managed to divide off enough tens in the above reduction
1642 loop that we've now got a negative exponent. Fall into the
1643 less-than-one code to compute the proper value for PTEN. */
1644 cmp_one = -1;
1646 if (cmp_one < 0)
1648 int m;
1650 /* Number is less than one. Pad significand with leading
1651 decimal zeros. */
1653 v = r;
1654 while (1)
1656 /* Stop if we'd shift bits off the bottom. */
1657 if (v.sig[0] & 7)
1658 break;
1660 do_multiply (&u, &v, ten);
1662 /* Stop if we're now >= 1. */
1663 if (REAL_EXP (&u) > 0)
1664 break;
1666 v = u;
1667 dec_exp -= 1;
1669 r = v;
1671 /* Find power of 10. Do this by multiplying in P=10**2**M when
1672 the current remainder is smaller than 1/P. Fill PTEN with the
1673 power of 10 that we compute. */
1674 m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1;
1677 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1678 const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
1680 if (do_compare (&v, ptenmtwo, 0) <= 0)
1682 do_multiply (&v, &v, ptentwo);
1683 do_multiply (&pten, &pten, ptentwo);
1684 dec_exp -= 1 << m;
1687 while (--m >= 0);
1689 /* Invert the positive power of 10 that we've collected so far. */
1690 do_divide (&pten, one, &pten);
1693 p = str;
1694 if (sign)
1695 *p++ = '-';
1696 first = p++;
1698 /* At this point, PTEN should contain the nearest power of 10 smaller
1699 than R, such that this division produces the first digit.
1701 Using a divide-step primitive that returns the complete integral
1702 remainder avoids the rounding error that would be produced if
1703 we were to use do_divide here and then simply multiply by 10 for
1704 each subsequent digit. */
1706 digit = rtd_divmod (&r, &pten);
1708 /* Be prepared for error in that division via underflow ... */
1709 if (digit == 0 && cmp_significand_0 (&r))
1711 /* Multiply by 10 and try again. */
1712 do_multiply (&r, &r, ten);
1713 digit = rtd_divmod (&r, &pten);
1714 dec_exp -= 1;
1715 gcc_assert (digit != 0);
1718 /* ... or overflow. */
1719 if (digit == 10)
1721 *p++ = '1';
1722 if (--digits > 0)
1723 *p++ = '0';
1724 dec_exp += 1;
1726 else
1728 gcc_assert (digit <= 10);
1729 *p++ = digit + '0';
1732 /* Generate subsequent digits. */
1733 while (--digits > 0)
1735 do_multiply (&r, &r, ten);
1736 digit = rtd_divmod (&r, &pten);
1737 *p++ = digit + '0';
1739 last = p;
1741 /* Generate one more digit with which to do rounding. */
1742 do_multiply (&r, &r, ten);
1743 digit = rtd_divmod (&r, &pten);
1745 /* Round the result. */
1746 if (fmt && fmt->round_towards_zero)
1748 /* If the format uses round towards zero when parsing the string
1749 back in, we need to always round away from zero here. */
1750 if (cmp_significand_0 (&r))
1751 digit++;
1752 round_up = digit > 0;
1754 else
1756 if (digit == 5)
1758 /* Round to nearest. If R is nonzero there are additional
1759 nonzero digits to be extracted. */
1760 if (cmp_significand_0 (&r))
1761 digit++;
1762 /* Round to even. */
1763 else if ((p[-1] - '0') & 1)
1764 digit++;
1767 round_up = digit > 5;
1770 if (round_up)
1772 while (p > first)
1774 digit = *--p;
1775 if (digit == '9')
1776 *p = '0';
1777 else
1779 *p = digit + 1;
1780 break;
1784 /* Carry out of the first digit. This means we had all 9's and
1785 now have all 0's. "Prepend" a 1 by overwriting the first 0. */
1786 if (p == first)
1788 first[1] = '1';
1789 dec_exp++;
1793 /* Insert the decimal point. */
1794 first[0] = first[1];
1795 first[1] = '.';
1797 /* If requested, drop trailing zeros. Never crop past "1.0". */
1798 if (crop_trailing_zeros)
1799 while (last > first + 3 && last[-1] == '0')
1800 last--;
1802 /* Append the exponent. */
1803 sprintf (last, "e%+d", dec_exp);
1805 #ifdef ENABLE_CHECKING
1806 /* Verify that we can read the original value back in. */
1807 if (mode != VOIDmode)
1809 real_from_string (&r, str);
1810 real_convert (&r, mode, &r);
1811 gcc_assert (real_identical (&r, r_orig));
1813 #endif
1816 /* Likewise, except always uses round-to-nearest. */
1818 void
1819 real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
1820 size_t digits, int crop_trailing_zeros)
1822 real_to_decimal_for_mode (str, r_orig, buf_size,
1823 digits, crop_trailing_zeros, VOIDmode);
1826 /* Render R as a hexadecimal floating point constant. Emit DIGITS
1827 significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0,
1828 choose the maximum for the representation. If CROP_TRAILING_ZEROS,
1829 strip trailing zeros. */
1831 void
1832 real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
1833 size_t digits, int crop_trailing_zeros)
1835 int i, j, exp = REAL_EXP (r);
1836 char *p, *first;
1837 char exp_buf[16];
1838 size_t max_digits;
1840 switch (r->cl)
1842 case rvc_zero:
1843 exp = 0;
1844 break;
1845 case rvc_normal:
1846 break;
1847 case rvc_inf:
1848 strcpy (str, (r->sign ? "-Inf" : "+Inf"));
1849 return;
1850 case rvc_nan:
1851 /* ??? Print the significand as well, if not canonical? */
1852 sprintf (str, "%c%cNaN", (r->sign ? '-' : '+'),
1853 (r->signalling ? 'S' : 'Q'));
1854 return;
1855 default:
1856 gcc_unreachable ();
1859 if (r->decimal)
1861 /* Hexadecimal format for decimal floats is not interesting. */
1862 strcpy (str, "N/A");
1863 return;
1866 if (digits == 0)
1867 digits = SIGNIFICAND_BITS / 4;
1869 /* Bound the number of digits printed by the size of the output buffer. */
1871 sprintf (exp_buf, "p%+d", exp);
1872 max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
1873 gcc_assert (max_digits <= buf_size);
1874 if (digits > max_digits)
1875 digits = max_digits;
1877 p = str;
1878 if (r->sign)
1879 *p++ = '-';
1880 *p++ = '0';
1881 *p++ = 'x';
1882 *p++ = '0';
1883 *p++ = '.';
1884 first = p;
1886 for (i = SIGSZ - 1; i >= 0; --i)
1887 for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
1889 *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
1890 if (--digits == 0)
1891 goto out;
1894 out:
1895 if (crop_trailing_zeros)
1896 while (p > first + 1 && p[-1] == '0')
1897 p--;
1899 sprintf (p, "p%+d", exp);
1902 /* Initialize R from a decimal or hexadecimal string. The string is
1903 assumed to have been syntax checked already. Return -1 if the
1904 value underflows, +1 if overflows, and 0 otherwise. */
1907 real_from_string (REAL_VALUE_TYPE *r, const char *str)
1909 int exp = 0;
1910 bool sign = false;
1912 get_zero (r, 0);
1914 if (*str == '-')
1916 sign = true;
1917 str++;
1919 else if (*str == '+')
1920 str++;
1922 if (!strncmp (str, "QNaN", 4))
1924 get_canonical_qnan (r, sign);
1925 return 0;
1927 else if (!strncmp (str, "SNaN", 4))
1929 get_canonical_snan (r, sign);
1930 return 0;
1932 else if (!strncmp (str, "Inf", 3))
1934 get_inf (r, sign);
1935 return 0;
1938 if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1940 /* Hexadecimal floating point. */
1941 int pos = SIGNIFICAND_BITS - 4, d;
1943 str += 2;
1945 while (*str == '0')
1946 str++;
1947 while (1)
1949 d = hex_value (*str);
1950 if (d == _hex_bad)
1951 break;
1952 if (pos >= 0)
1954 r->sig[pos / HOST_BITS_PER_LONG]
1955 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1956 pos -= 4;
1958 else if (d)
1959 /* Ensure correct rounding by setting last bit if there is
1960 a subsequent nonzero digit. */
1961 r->sig[0] |= 1;
1962 exp += 4;
1963 str++;
1965 if (*str == '.')
1967 str++;
1968 if (pos == SIGNIFICAND_BITS - 4)
1970 while (*str == '0')
1971 str++, exp -= 4;
1973 while (1)
1975 d = hex_value (*str);
1976 if (d == _hex_bad)
1977 break;
1978 if (pos >= 0)
1980 r->sig[pos / HOST_BITS_PER_LONG]
1981 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1982 pos -= 4;
1984 else if (d)
1985 /* Ensure correct rounding by setting last bit if there is
1986 a subsequent nonzero digit. */
1987 r->sig[0] |= 1;
1988 str++;
1992 /* If the mantissa is zero, ignore the exponent. */
1993 if (!cmp_significand_0 (r))
1994 goto is_a_zero;
1996 if (*str == 'p' || *str == 'P')
1998 bool exp_neg = false;
2000 str++;
2001 if (*str == '-')
2003 exp_neg = true;
2004 str++;
2006 else if (*str == '+')
2007 str++;
2009 d = 0;
2010 while (ISDIGIT (*str))
2012 d *= 10;
2013 d += *str - '0';
2014 if (d > MAX_EXP)
2016 /* Overflowed the exponent. */
2017 if (exp_neg)
2018 goto underflow;
2019 else
2020 goto overflow;
2022 str++;
2024 if (exp_neg)
2025 d = -d;
2027 exp += d;
2030 r->cl = rvc_normal;
2031 SET_REAL_EXP (r, exp);
2033 normalize (r);
2035 else
2037 /* Decimal floating point. */
2038 const char *cstr = str;
2039 mpfr_t m;
2040 bool inexact;
2042 while (*cstr == '0')
2043 cstr++;
2044 if (*cstr == '.')
2046 cstr++;
2047 while (*cstr == '0')
2048 cstr++;
2051 /* If the mantissa is zero, ignore the exponent. */
2052 if (!ISDIGIT (*cstr))
2053 goto is_a_zero;
2055 /* Nonzero value, possibly overflowing or underflowing. */
2056 mpfr_init2 (m, SIGNIFICAND_BITS);
2057 inexact = mpfr_strtofr (m, str, NULL, 10, GMP_RNDZ);
2058 /* The result should never be a NaN, and because the rounding is
2059 toward zero should never be an infinity. */
2060 gcc_assert (!mpfr_nan_p (m) && !mpfr_inf_p (m));
2061 if (mpfr_zero_p (m) || mpfr_get_exp (m) < -MAX_EXP + 4)
2063 mpfr_clear (m);
2064 goto underflow;
2066 else if (mpfr_get_exp (m) > MAX_EXP - 4)
2068 mpfr_clear (m);
2069 goto overflow;
2071 else
2073 real_from_mpfr (r, m, NULL_TREE, GMP_RNDZ);
2074 /* 1 to 3 bits may have been shifted off (with a sticky bit)
2075 because the hex digits used in real_from_mpfr did not
2076 start with a digit 8 to f, but the exponent bounds above
2077 should have avoided underflow or overflow. */
2078 gcc_assert (r->cl = rvc_normal);
2079 /* Set a sticky bit if mpfr_strtofr was inexact. */
2080 r->sig[0] |= inexact;
2081 mpfr_clear (m);
2085 r->sign = sign;
2086 return 0;
2088 is_a_zero:
2089 get_zero (r, sign);
2090 return 0;
2092 underflow:
2093 get_zero (r, sign);
2094 return -1;
2096 overflow:
2097 get_inf (r, sign);
2098 return 1;
2101 /* Legacy. Similar, but return the result directly. */
2103 REAL_VALUE_TYPE
2104 real_from_string2 (const char *s, machine_mode mode)
2106 REAL_VALUE_TYPE r;
2108 real_from_string (&r, s);
2109 if (mode != VOIDmode)
2110 real_convert (&r, mode, &r);
2112 return r;
2115 /* Initialize R from string S and desired MODE. */
2117 void
2118 real_from_string3 (REAL_VALUE_TYPE *r, const char *s, machine_mode mode)
2120 if (DECIMAL_FLOAT_MODE_P (mode))
2121 decimal_real_from_string (r, s);
2122 else
2123 real_from_string (r, s);
2125 if (mode != VOIDmode)
2126 real_convert (r, mode, r);
2129 /* Initialize R from the wide_int VAL_IN. The MODE is not VOIDmode,*/
2131 void
2132 real_from_integer (REAL_VALUE_TYPE *r, machine_mode mode,
2133 const wide_int_ref &val_in, signop sgn)
2135 if (val_in == 0)
2136 get_zero (r, 0);
2137 else
2139 unsigned int len = val_in.get_precision ();
2140 int i, j, e = 0;
2141 int maxbitlen = MAX_BITSIZE_MODE_ANY_INT + HOST_BITS_PER_WIDE_INT;
2142 const unsigned int realmax = (SIGNIFICAND_BITS / HOST_BITS_PER_WIDE_INT
2143 * HOST_BITS_PER_WIDE_INT);
2145 memset (r, 0, sizeof (*r));
2146 r->cl = rvc_normal;
2147 r->sign = wi::neg_p (val_in, sgn);
2149 /* We have to ensure we can negate the largest negative number. */
2150 wide_int val = wide_int::from (val_in, maxbitlen, sgn);
2152 if (r->sign)
2153 val = -val;
2155 /* Ensure a multiple of HOST_BITS_PER_WIDE_INT, ceiling, as elt
2156 won't work with precisions that are not a multiple of
2157 HOST_BITS_PER_WIDE_INT. */
2158 len += HOST_BITS_PER_WIDE_INT - 1;
2160 /* Ensure we can represent the largest negative number. */
2161 len += 1;
2163 len = len/HOST_BITS_PER_WIDE_INT * HOST_BITS_PER_WIDE_INT;
2165 /* Cap the size to the size allowed by real.h. */
2166 if (len > realmax)
2168 HOST_WIDE_INT cnt_l_z;
2169 cnt_l_z = wi::clz (val);
2171 if (maxbitlen - cnt_l_z > realmax)
2173 e = maxbitlen - cnt_l_z - realmax;
2175 /* This value is too large, we must shift it right to
2176 preserve all the bits we can, and then bump the
2177 exponent up by that amount. */
2178 val = wi::lrshift (val, e);
2180 len = realmax;
2183 /* Clear out top bits so elt will work with precisions that aren't
2184 a multiple of HOST_BITS_PER_WIDE_INT. */
2185 val = wide_int::from (val, len, sgn);
2186 len = len / HOST_BITS_PER_WIDE_INT;
2188 SET_REAL_EXP (r, len * HOST_BITS_PER_WIDE_INT + e);
2190 j = SIGSZ - 1;
2191 if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
2192 for (i = len - 1; i >= 0; i--)
2194 r->sig[j--] = val.elt (i);
2195 if (j < 0)
2196 break;
2198 else
2200 gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
2201 for (i = len - 1; i >= 0; i--)
2203 HOST_WIDE_INT e = val.elt (i);
2204 r->sig[j--] = e >> (HOST_BITS_PER_LONG - 1) >> 1;
2205 if (j < 0)
2206 break;
2207 r->sig[j--] = e;
2208 if (j < 0)
2209 break;
2213 normalize (r);
2216 if (DECIMAL_FLOAT_MODE_P (mode))
2217 decimal_from_integer (r);
2218 else if (mode != VOIDmode)
2219 real_convert (r, mode, r);
2222 /* Render R, an integral value, as a floating point constant with no
2223 specified exponent. */
2225 static void
2226 decimal_integer_string (char *str, const REAL_VALUE_TYPE *r_orig,
2227 size_t buf_size)
2229 int dec_exp, digit, digits;
2230 REAL_VALUE_TYPE r, pten;
2231 char *p;
2232 bool sign;
2234 r = *r_orig;
2236 if (r.cl == rvc_zero)
2238 strcpy (str, "0.");
2239 return;
2242 sign = r.sign;
2243 r.sign = 0;
2245 dec_exp = REAL_EXP (&r) * M_LOG10_2;
2246 digits = dec_exp + 1;
2247 gcc_assert ((digits + 2) < (int)buf_size);
2249 pten = *real_digit (1);
2250 times_pten (&pten, dec_exp);
2252 p = str;
2253 if (sign)
2254 *p++ = '-';
2256 digit = rtd_divmod (&r, &pten);
2257 gcc_assert (digit >= 0 && digit <= 9);
2258 *p++ = digit + '0';
2259 while (--digits > 0)
2261 times_pten (&r, 1);
2262 digit = rtd_divmod (&r, &pten);
2263 *p++ = digit + '0';
2265 *p++ = '.';
2266 *p++ = '\0';
2269 /* Convert a real with an integral value to decimal float. */
2271 static void
2272 decimal_from_integer (REAL_VALUE_TYPE *r)
2274 char str[256];
2276 decimal_integer_string (str, r, sizeof (str) - 1);
2277 decimal_real_from_string (r, str);
2280 /* Returns 10**2**N. */
2282 static const REAL_VALUE_TYPE *
2283 ten_to_ptwo (int n)
2285 static REAL_VALUE_TYPE tens[EXP_BITS];
2287 gcc_assert (n >= 0);
2288 gcc_assert (n < EXP_BITS);
2290 if (tens[n].cl == rvc_zero)
2292 if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2294 HOST_WIDE_INT t = 10;
2295 int i;
2297 for (i = 0; i < n; ++i)
2298 t *= t;
2300 real_from_integer (&tens[n], VOIDmode, t, UNSIGNED);
2302 else
2304 const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2305 do_multiply (&tens[n], t, t);
2309 return &tens[n];
2312 /* Returns 10**(-2**N). */
2314 static const REAL_VALUE_TYPE *
2315 ten_to_mptwo (int n)
2317 static REAL_VALUE_TYPE tens[EXP_BITS];
2319 gcc_assert (n >= 0);
2320 gcc_assert (n < EXP_BITS);
2322 if (tens[n].cl == rvc_zero)
2323 do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2325 return &tens[n];
2328 /* Returns N. */
2330 static const REAL_VALUE_TYPE *
2331 real_digit (int n)
2333 static REAL_VALUE_TYPE num[10];
2335 gcc_assert (n >= 0);
2336 gcc_assert (n <= 9);
2338 if (n > 0 && num[n].cl == rvc_zero)
2339 real_from_integer (&num[n], VOIDmode, n, UNSIGNED);
2341 return &num[n];
2344 /* Multiply R by 10**EXP. */
2346 static void
2347 times_pten (REAL_VALUE_TYPE *r, int exp)
2349 REAL_VALUE_TYPE pten, *rr;
2350 bool negative = (exp < 0);
2351 int i;
2353 if (negative)
2355 exp = -exp;
2356 pten = *real_digit (1);
2357 rr = &pten;
2359 else
2360 rr = r;
2362 for (i = 0; exp > 0; ++i, exp >>= 1)
2363 if (exp & 1)
2364 do_multiply (rr, rr, ten_to_ptwo (i));
2366 if (negative)
2367 do_divide (r, r, &pten);
2370 /* Returns the special REAL_VALUE_TYPE corresponding to 'e'. */
2372 const REAL_VALUE_TYPE *
2373 dconst_e_ptr (void)
2375 static REAL_VALUE_TYPE value;
2377 /* Initialize mathematical constants for constant folding builtins.
2378 These constants need to be given to at least 160 bits precision. */
2379 if (value.cl == rvc_zero)
2381 mpfr_t m;
2382 mpfr_init2 (m, SIGNIFICAND_BITS);
2383 mpfr_set_ui (m, 1, GMP_RNDN);
2384 mpfr_exp (m, m, GMP_RNDN);
2385 real_from_mpfr (&value, m, NULL_TREE, GMP_RNDN);
2386 mpfr_clear (m);
2389 return &value;
2392 /* Returns the special REAL_VALUE_TYPE corresponding to 1/3. */
2394 const REAL_VALUE_TYPE *
2395 dconst_third_ptr (void)
2397 static REAL_VALUE_TYPE value;
2399 /* Initialize mathematical constants for constant folding builtins.
2400 These constants need to be given to at least 160 bits precision. */
2401 if (value.cl == rvc_zero)
2403 real_arithmetic (&value, RDIV_EXPR, &dconst1, real_digit (3));
2405 return &value;
2408 /* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2). */
2410 const REAL_VALUE_TYPE *
2411 dconst_sqrt2_ptr (void)
2413 static REAL_VALUE_TYPE value;
2415 /* Initialize mathematical constants for constant folding builtins.
2416 These constants need to be given to at least 160 bits precision. */
2417 if (value.cl == rvc_zero)
2419 mpfr_t m;
2420 mpfr_init2 (m, SIGNIFICAND_BITS);
2421 mpfr_sqrt_ui (m, 2, GMP_RNDN);
2422 real_from_mpfr (&value, m, NULL_TREE, GMP_RNDN);
2423 mpfr_clear (m);
2425 return &value;
2428 /* Fills R with +Inf. */
2430 void
2431 real_inf (REAL_VALUE_TYPE *r)
2433 get_inf (r, 0);
2436 /* Fills R with a NaN whose significand is described by STR. If QUIET,
2437 we force a QNaN, else we force an SNaN. The string, if not empty,
2438 is parsed as a number and placed in the significand. Return true
2439 if the string was successfully parsed. */
2441 bool
2442 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2443 machine_mode mode)
2445 const struct real_format *fmt;
2447 fmt = REAL_MODE_FORMAT (mode);
2448 gcc_assert (fmt);
2450 if (*str == 0)
2452 if (quiet)
2453 get_canonical_qnan (r, 0);
2454 else
2455 get_canonical_snan (r, 0);
2457 else
2459 int base = 10, d;
2461 memset (r, 0, sizeof (*r));
2462 r->cl = rvc_nan;
2464 /* Parse akin to strtol into the significand of R. */
2466 while (ISSPACE (*str))
2467 str++;
2468 if (*str == '-')
2469 str++;
2470 else if (*str == '+')
2471 str++;
2472 if (*str == '0')
2474 str++;
2475 if (*str == 'x' || *str == 'X')
2477 base = 16;
2478 str++;
2480 else
2481 base = 8;
2484 while ((d = hex_value (*str)) < base)
2486 REAL_VALUE_TYPE u;
2488 switch (base)
2490 case 8:
2491 lshift_significand (r, r, 3);
2492 break;
2493 case 16:
2494 lshift_significand (r, r, 4);
2495 break;
2496 case 10:
2497 lshift_significand_1 (&u, r);
2498 lshift_significand (r, r, 3);
2499 add_significands (r, r, &u);
2500 break;
2501 default:
2502 gcc_unreachable ();
2505 get_zero (&u, 0);
2506 u.sig[0] = d;
2507 add_significands (r, r, &u);
2509 str++;
2512 /* Must have consumed the entire string for success. */
2513 if (*str != 0)
2514 return false;
2516 /* Shift the significand into place such that the bits
2517 are in the most significant bits for the format. */
2518 lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
2520 /* Our MSB is always unset for NaNs. */
2521 r->sig[SIGSZ-1] &= ~SIG_MSB;
2523 /* Force quiet or signalling NaN. */
2524 r->signalling = !quiet;
2527 return true;
2530 /* Fills R with the largest finite value representable in mode MODE.
2531 If SIGN is nonzero, R is set to the most negative finite value. */
2533 void
2534 real_maxval (REAL_VALUE_TYPE *r, int sign, machine_mode mode)
2536 const struct real_format *fmt;
2537 int np2;
2539 fmt = REAL_MODE_FORMAT (mode);
2540 gcc_assert (fmt);
2541 memset (r, 0, sizeof (*r));
2543 if (fmt->b == 10)
2544 decimal_real_maxval (r, sign, mode);
2545 else
2547 r->cl = rvc_normal;
2548 r->sign = sign;
2549 SET_REAL_EXP (r, fmt->emax);
2551 np2 = SIGNIFICAND_BITS - fmt->p;
2552 memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
2553 clear_significand_below (r, np2);
2555 if (fmt->pnan < fmt->p)
2556 /* This is an IBM extended double format made up of two IEEE
2557 doubles. The value of the long double is the sum of the
2558 values of the two parts. The most significant part is
2559 required to be the value of the long double rounded to the
2560 nearest double. Rounding means we need a slightly smaller
2561 value for LDBL_MAX. */
2562 clear_significand_bit (r, SIGNIFICAND_BITS - fmt->pnan - 1);
2566 /* Fills R with 2**N. */
2568 void
2569 real_2expN (REAL_VALUE_TYPE *r, int n, machine_mode fmode)
2571 memset (r, 0, sizeof (*r));
2573 n++;
2574 if (n > MAX_EXP)
2575 r->cl = rvc_inf;
2576 else if (n < -MAX_EXP)
2578 else
2580 r->cl = rvc_normal;
2581 SET_REAL_EXP (r, n);
2582 r->sig[SIGSZ-1] = SIG_MSB;
2584 if (DECIMAL_FLOAT_MODE_P (fmode))
2585 decimal_real_convert (r, fmode, r);
2589 static void
2590 round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
2592 int p2, np2, i, w;
2593 int emin2m1, emax2;
2594 bool round_up = false;
2596 if (r->decimal)
2598 if (fmt->b == 10)
2600 decimal_round_for_format (fmt, r);
2601 return;
2603 /* FIXME. We can come here via fp_easy_constant
2604 (e.g. -O0 on '_Decimal32 x = 1.0 + 2.0dd'), but have not
2605 investigated whether this convert needs to be here, or
2606 something else is missing. */
2607 decimal_real_convert (r, DFmode, r);
2610 p2 = fmt->p;
2611 emin2m1 = fmt->emin - 1;
2612 emax2 = fmt->emax;
2614 np2 = SIGNIFICAND_BITS - p2;
2615 switch (r->cl)
2617 underflow:
2618 get_zero (r, r->sign);
2619 case rvc_zero:
2620 if (!fmt->has_signed_zero)
2621 r->sign = 0;
2622 return;
2624 overflow:
2625 get_inf (r, r->sign);
2626 case rvc_inf:
2627 return;
2629 case rvc_nan:
2630 clear_significand_below (r, np2);
2631 return;
2633 case rvc_normal:
2634 break;
2636 default:
2637 gcc_unreachable ();
2640 /* Check the range of the exponent. If we're out of range,
2641 either underflow or overflow. */
2642 if (REAL_EXP (r) > emax2)
2643 goto overflow;
2644 else if (REAL_EXP (r) <= emin2m1)
2646 int diff;
2648 if (!fmt->has_denorm)
2650 /* Don't underflow completely until we've had a chance to round. */
2651 if (REAL_EXP (r) < emin2m1)
2652 goto underflow;
2654 else
2656 diff = emin2m1 - REAL_EXP (r) + 1;
2657 if (diff > p2)
2658 goto underflow;
2660 /* De-normalize the significand. */
2661 r->sig[0] |= sticky_rshift_significand (r, r, diff);
2662 SET_REAL_EXP (r, REAL_EXP (r) + diff);
2666 if (!fmt->round_towards_zero)
2668 /* There are P2 true significand bits, followed by one guard bit,
2669 followed by one sticky bit, followed by stuff. Fold nonzero
2670 stuff into the sticky bit. */
2671 unsigned long sticky;
2672 bool guard, lsb;
2674 sticky = 0;
2675 for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2676 sticky |= r->sig[i];
2677 sticky |= r->sig[w]
2678 & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2680 guard = test_significand_bit (r, np2 - 1);
2681 lsb = test_significand_bit (r, np2);
2683 /* Round to even. */
2684 round_up = guard && (sticky || lsb);
2687 if (round_up)
2689 REAL_VALUE_TYPE u;
2690 get_zero (&u, 0);
2691 set_significand_bit (&u, np2);
2693 if (add_significands (r, r, &u))
2695 /* Overflow. Means the significand had been all ones, and
2696 is now all zeros. Need to increase the exponent, and
2697 possibly re-normalize it. */
2698 SET_REAL_EXP (r, REAL_EXP (r) + 1);
2699 if (REAL_EXP (r) > emax2)
2700 goto overflow;
2701 r->sig[SIGSZ-1] = SIG_MSB;
2705 /* Catch underflow that we deferred until after rounding. */
2706 if (REAL_EXP (r) <= emin2m1)
2707 goto underflow;
2709 /* Clear out trailing garbage. */
2710 clear_significand_below (r, np2);
2713 /* Extend or truncate to a new mode. */
2715 void
2716 real_convert (REAL_VALUE_TYPE *r, machine_mode mode,
2717 const REAL_VALUE_TYPE *a)
2719 const struct real_format *fmt;
2721 fmt = REAL_MODE_FORMAT (mode);
2722 gcc_assert (fmt);
2724 *r = *a;
2726 if (a->decimal || fmt->b == 10)
2727 decimal_real_convert (r, mode, a);
2729 round_for_format (fmt, r);
2731 /* round_for_format de-normalizes denormals. Undo just that part. */
2732 if (r->cl == rvc_normal)
2733 normalize (r);
2736 /* Legacy. Likewise, except return the struct directly. */
2738 REAL_VALUE_TYPE
2739 real_value_truncate (machine_mode mode, REAL_VALUE_TYPE a)
2741 REAL_VALUE_TYPE r;
2742 real_convert (&r, mode, &a);
2743 return r;
2746 /* Return true if truncating to MODE is exact. */
2748 bool
2749 exact_real_truncate (machine_mode mode, const REAL_VALUE_TYPE *a)
2751 const struct real_format *fmt;
2752 REAL_VALUE_TYPE t;
2753 int emin2m1;
2755 fmt = REAL_MODE_FORMAT (mode);
2756 gcc_assert (fmt);
2758 /* Don't allow conversion to denormals. */
2759 emin2m1 = fmt->emin - 1;
2760 if (REAL_EXP (a) <= emin2m1)
2761 return false;
2763 /* After conversion to the new mode, the value must be identical. */
2764 real_convert (&t, mode, a);
2765 return real_identical (&t, a);
2768 /* Write R to the given target format. Place the words of the result
2769 in target word order in BUF. There are always 32 bits in each
2770 long, no matter the size of the host long.
2772 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2774 long
2775 real_to_target_fmt (long *buf, const REAL_VALUE_TYPE *r_orig,
2776 const struct real_format *fmt)
2778 REAL_VALUE_TYPE r;
2779 long buf1;
2781 r = *r_orig;
2782 round_for_format (fmt, &r);
2784 if (!buf)
2785 buf = &buf1;
2786 (*fmt->encode) (fmt, buf, &r);
2788 return *buf;
2791 /* Similar, but look up the format from MODE. */
2793 long
2794 real_to_target (long *buf, const REAL_VALUE_TYPE *r, machine_mode mode)
2796 const struct real_format *fmt;
2798 fmt = REAL_MODE_FORMAT (mode);
2799 gcc_assert (fmt);
2801 return real_to_target_fmt (buf, r, fmt);
2804 /* Read R from the given target format. Read the words of the result
2805 in target word order in BUF. There are always 32 bits in each
2806 long, no matter the size of the host long. */
2808 void
2809 real_from_target_fmt (REAL_VALUE_TYPE *r, const long *buf,
2810 const struct real_format *fmt)
2812 (*fmt->decode) (fmt, r, buf);
2815 /* Similar, but look up the format from MODE. */
2817 void
2818 real_from_target (REAL_VALUE_TYPE *r, const long *buf, machine_mode mode)
2820 const struct real_format *fmt;
2822 fmt = REAL_MODE_FORMAT (mode);
2823 gcc_assert (fmt);
2825 (*fmt->decode) (fmt, r, buf);
2828 /* Return the number of bits of the largest binary value that the
2829 significand of MODE will hold. */
2830 /* ??? Legacy. Should get access to real_format directly. */
2833 significand_size (machine_mode mode)
2835 const struct real_format *fmt;
2837 fmt = REAL_MODE_FORMAT (mode);
2838 if (fmt == NULL)
2839 return 0;
2841 if (fmt->b == 10)
2843 /* Return the size in bits of the largest binary value that can be
2844 held by the decimal coefficient for this mode. This is one more
2845 than the number of bits required to hold the largest coefficient
2846 of this mode. */
2847 double log2_10 = 3.3219281;
2848 return fmt->p * log2_10;
2850 return fmt->p;
2853 /* Return a hash value for the given real value. */
2854 /* ??? The "unsigned int" return value is intended to be hashval_t,
2855 but I didn't want to pull hashtab.h into real.h. */
2857 unsigned int
2858 real_hash (const REAL_VALUE_TYPE *r)
2860 unsigned int h;
2861 size_t i;
2863 h = r->cl | (r->sign << 2);
2864 switch (r->cl)
2866 case rvc_zero:
2867 case rvc_inf:
2868 return h;
2870 case rvc_normal:
2871 h |= REAL_EXP (r) << 3;
2872 break;
2874 case rvc_nan:
2875 if (r->signalling)
2876 h ^= (unsigned int)-1;
2877 if (r->canonical)
2878 return h;
2879 break;
2881 default:
2882 gcc_unreachable ();
2885 if (sizeof (unsigned long) > sizeof (unsigned int))
2886 for (i = 0; i < SIGSZ; ++i)
2888 unsigned long s = r->sig[i];
2889 h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2891 else
2892 for (i = 0; i < SIGSZ; ++i)
2893 h ^= r->sig[i];
2895 return h;
2898 /* IEEE single-precision format. */
2900 static void encode_ieee_single (const struct real_format *fmt,
2901 long *, const REAL_VALUE_TYPE *);
2902 static void decode_ieee_single (const struct real_format *,
2903 REAL_VALUE_TYPE *, const long *);
2905 static void
2906 encode_ieee_single (const struct real_format *fmt, long *buf,
2907 const REAL_VALUE_TYPE *r)
2909 unsigned long image, sig, exp;
2910 unsigned long sign = r->sign;
2911 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2913 image = sign << 31;
2914 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2916 switch (r->cl)
2918 case rvc_zero:
2919 break;
2921 case rvc_inf:
2922 if (fmt->has_inf)
2923 image |= 255 << 23;
2924 else
2925 image |= 0x7fffffff;
2926 break;
2928 case rvc_nan:
2929 if (fmt->has_nans)
2931 if (r->canonical)
2932 sig = (fmt->canonical_nan_lsbs_set ? (1 << 22) - 1 : 0);
2933 if (r->signalling == fmt->qnan_msb_set)
2934 sig &= ~(1 << 22);
2935 else
2936 sig |= 1 << 22;
2937 if (sig == 0)
2938 sig = 1 << 21;
2940 image |= 255 << 23;
2941 image |= sig;
2943 else
2944 image |= 0x7fffffff;
2945 break;
2947 case rvc_normal:
2948 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2949 whereas the intermediate representation is 0.F x 2**exp.
2950 Which means we're off by one. */
2951 if (denormal)
2952 exp = 0;
2953 else
2954 exp = REAL_EXP (r) + 127 - 1;
2955 image |= exp << 23;
2956 image |= sig;
2957 break;
2959 default:
2960 gcc_unreachable ();
2963 buf[0] = image;
2966 static void
2967 decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2968 const long *buf)
2970 unsigned long image = buf[0] & 0xffffffff;
2971 bool sign = (image >> 31) & 1;
2972 int exp = (image >> 23) & 0xff;
2974 memset (r, 0, sizeof (*r));
2975 image <<= HOST_BITS_PER_LONG - 24;
2976 image &= ~SIG_MSB;
2978 if (exp == 0)
2980 if (image && fmt->has_denorm)
2982 r->cl = rvc_normal;
2983 r->sign = sign;
2984 SET_REAL_EXP (r, -126);
2985 r->sig[SIGSZ-1] = image << 1;
2986 normalize (r);
2988 else if (fmt->has_signed_zero)
2989 r->sign = sign;
2991 else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
2993 if (image)
2995 r->cl = rvc_nan;
2996 r->sign = sign;
2997 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
2998 ^ fmt->qnan_msb_set);
2999 r->sig[SIGSZ-1] = image;
3001 else
3003 r->cl = rvc_inf;
3004 r->sign = sign;
3007 else
3009 r->cl = rvc_normal;
3010 r->sign = sign;
3011 SET_REAL_EXP (r, exp - 127 + 1);
3012 r->sig[SIGSZ-1] = image | SIG_MSB;
3016 const struct real_format ieee_single_format =
3018 encode_ieee_single,
3019 decode_ieee_single,
3023 -125,
3024 128,
3027 false,
3028 true,
3029 true,
3030 true,
3031 true,
3032 true,
3033 true,
3034 false
3037 const struct real_format mips_single_format =
3039 encode_ieee_single,
3040 decode_ieee_single,
3044 -125,
3045 128,
3048 false,
3049 true,
3050 true,
3051 true,
3052 true,
3053 true,
3054 false,
3055 true
3058 const struct real_format motorola_single_format =
3060 encode_ieee_single,
3061 decode_ieee_single,
3065 -125,
3066 128,
3069 false,
3070 true,
3071 true,
3072 true,
3073 true,
3074 true,
3075 true,
3076 true
3079 /* SPU Single Precision (Extended-Range Mode) format is the same as IEEE
3080 single precision with the following differences:
3081 - Infinities are not supported. Instead MAX_FLOAT or MIN_FLOAT
3082 are generated.
3083 - NaNs are not supported.
3084 - The range of non-zero numbers in binary is
3085 (001)[1.]000...000 to (255)[1.]111...111.
3086 - Denormals can be represented, but are treated as +0.0 when
3087 used as an operand and are never generated as a result.
3088 - -0.0 can be represented, but a zero result is always +0.0.
3089 - the only supported rounding mode is trunction (towards zero). */
3090 const struct real_format spu_single_format =
3092 encode_ieee_single,
3093 decode_ieee_single,
3097 -125,
3098 129,
3101 true,
3102 false,
3103 false,
3104 false,
3105 true,
3106 true,
3107 false,
3108 false
3111 /* IEEE double-precision format. */
3113 static void encode_ieee_double (const struct real_format *fmt,
3114 long *, const REAL_VALUE_TYPE *);
3115 static void decode_ieee_double (const struct real_format *,
3116 REAL_VALUE_TYPE *, const long *);
3118 static void
3119 encode_ieee_double (const struct real_format *fmt, long *buf,
3120 const REAL_VALUE_TYPE *r)
3122 unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
3123 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3125 image_hi = r->sign << 31;
3126 image_lo = 0;
3128 if (HOST_BITS_PER_LONG == 64)
3130 sig_hi = r->sig[SIGSZ-1];
3131 sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
3132 sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
3134 else
3136 sig_hi = r->sig[SIGSZ-1];
3137 sig_lo = r->sig[SIGSZ-2];
3138 sig_lo = (sig_hi << 21) | (sig_lo >> 11);
3139 sig_hi = (sig_hi >> 11) & 0xfffff;
3142 switch (r->cl)
3144 case rvc_zero:
3145 break;
3147 case rvc_inf:
3148 if (fmt->has_inf)
3149 image_hi |= 2047 << 20;
3150 else
3152 image_hi |= 0x7fffffff;
3153 image_lo = 0xffffffff;
3155 break;
3157 case rvc_nan:
3158 if (fmt->has_nans)
3160 if (r->canonical)
3162 if (fmt->canonical_nan_lsbs_set)
3164 sig_hi = (1 << 19) - 1;
3165 sig_lo = 0xffffffff;
3167 else
3169 sig_hi = 0;
3170 sig_lo = 0;
3173 if (r->signalling == fmt->qnan_msb_set)
3174 sig_hi &= ~(1 << 19);
3175 else
3176 sig_hi |= 1 << 19;
3177 if (sig_hi == 0 && sig_lo == 0)
3178 sig_hi = 1 << 18;
3180 image_hi |= 2047 << 20;
3181 image_hi |= sig_hi;
3182 image_lo = sig_lo;
3184 else
3186 image_hi |= 0x7fffffff;
3187 image_lo = 0xffffffff;
3189 break;
3191 case rvc_normal:
3192 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3193 whereas the intermediate representation is 0.F x 2**exp.
3194 Which means we're off by one. */
3195 if (denormal)
3196 exp = 0;
3197 else
3198 exp = REAL_EXP (r) + 1023 - 1;
3199 image_hi |= exp << 20;
3200 image_hi |= sig_hi;
3201 image_lo = sig_lo;
3202 break;
3204 default:
3205 gcc_unreachable ();
3208 if (FLOAT_WORDS_BIG_ENDIAN)
3209 buf[0] = image_hi, buf[1] = image_lo;
3210 else
3211 buf[0] = image_lo, buf[1] = image_hi;
3214 static void
3215 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3216 const long *buf)
3218 unsigned long image_hi, image_lo;
3219 bool sign;
3220 int exp;
3222 if (FLOAT_WORDS_BIG_ENDIAN)
3223 image_hi = buf[0], image_lo = buf[1];
3224 else
3225 image_lo = buf[0], image_hi = buf[1];
3226 image_lo &= 0xffffffff;
3227 image_hi &= 0xffffffff;
3229 sign = (image_hi >> 31) & 1;
3230 exp = (image_hi >> 20) & 0x7ff;
3232 memset (r, 0, sizeof (*r));
3234 image_hi <<= 32 - 21;
3235 image_hi |= image_lo >> 21;
3236 image_hi &= 0x7fffffff;
3237 image_lo <<= 32 - 21;
3239 if (exp == 0)
3241 if ((image_hi || image_lo) && fmt->has_denorm)
3243 r->cl = rvc_normal;
3244 r->sign = sign;
3245 SET_REAL_EXP (r, -1022);
3246 if (HOST_BITS_PER_LONG == 32)
3248 image_hi = (image_hi << 1) | (image_lo >> 31);
3249 image_lo <<= 1;
3250 r->sig[SIGSZ-1] = image_hi;
3251 r->sig[SIGSZ-2] = image_lo;
3253 else
3255 image_hi = (image_hi << 31 << 2) | (image_lo << 1);
3256 r->sig[SIGSZ-1] = image_hi;
3258 normalize (r);
3260 else if (fmt->has_signed_zero)
3261 r->sign = sign;
3263 else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
3265 if (image_hi || image_lo)
3267 r->cl = rvc_nan;
3268 r->sign = sign;
3269 r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3270 if (HOST_BITS_PER_LONG == 32)
3272 r->sig[SIGSZ-1] = image_hi;
3273 r->sig[SIGSZ-2] = image_lo;
3275 else
3276 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
3278 else
3280 r->cl = rvc_inf;
3281 r->sign = sign;
3284 else
3286 r->cl = rvc_normal;
3287 r->sign = sign;
3288 SET_REAL_EXP (r, exp - 1023 + 1);
3289 if (HOST_BITS_PER_LONG == 32)
3291 r->sig[SIGSZ-1] = image_hi | SIG_MSB;
3292 r->sig[SIGSZ-2] = image_lo;
3294 else
3295 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
3299 const struct real_format ieee_double_format =
3301 encode_ieee_double,
3302 decode_ieee_double,
3306 -1021,
3307 1024,
3310 false,
3311 true,
3312 true,
3313 true,
3314 true,
3315 true,
3316 true,
3317 false
3320 const struct real_format mips_double_format =
3322 encode_ieee_double,
3323 decode_ieee_double,
3327 -1021,
3328 1024,
3331 false,
3332 true,
3333 true,
3334 true,
3335 true,
3336 true,
3337 false,
3338 true
3341 const struct real_format motorola_double_format =
3343 encode_ieee_double,
3344 decode_ieee_double,
3348 -1021,
3349 1024,
3352 false,
3353 true,
3354 true,
3355 true,
3356 true,
3357 true,
3358 true,
3359 true
3362 /* IEEE extended real format. This comes in three flavors: Intel's as
3363 a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
3364 12- and 16-byte images may be big- or little endian; Motorola's is
3365 always big endian. */
3367 /* Helper subroutine which converts from the internal format to the
3368 12-byte little-endian Intel format. Functions below adjust this
3369 for the other possible formats. */
3370 static void
3371 encode_ieee_extended (const struct real_format *fmt, long *buf,
3372 const REAL_VALUE_TYPE *r)
3374 unsigned long image_hi, sig_hi, sig_lo;
3375 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3377 image_hi = r->sign << 15;
3378 sig_hi = sig_lo = 0;
3380 switch (r->cl)
3382 case rvc_zero:
3383 break;
3385 case rvc_inf:
3386 if (fmt->has_inf)
3388 image_hi |= 32767;
3390 /* Intel requires the explicit integer bit to be set, otherwise
3391 it considers the value a "pseudo-infinity". Motorola docs
3392 say it doesn't care. */
3393 sig_hi = 0x80000000;
3395 else
3397 image_hi |= 32767;
3398 sig_lo = sig_hi = 0xffffffff;
3400 break;
3402 case rvc_nan:
3403 if (fmt->has_nans)
3405 image_hi |= 32767;
3406 if (r->canonical)
3408 if (fmt->canonical_nan_lsbs_set)
3410 sig_hi = (1 << 30) - 1;
3411 sig_lo = 0xffffffff;
3414 else if (HOST_BITS_PER_LONG == 32)
3416 sig_hi = r->sig[SIGSZ-1];
3417 sig_lo = r->sig[SIGSZ-2];
3419 else
3421 sig_lo = r->sig[SIGSZ-1];
3422 sig_hi = sig_lo >> 31 >> 1;
3423 sig_lo &= 0xffffffff;
3425 if (r->signalling == fmt->qnan_msb_set)
3426 sig_hi &= ~(1 << 30);
3427 else
3428 sig_hi |= 1 << 30;
3429 if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
3430 sig_hi = 1 << 29;
3432 /* Intel requires the explicit integer bit to be set, otherwise
3433 it considers the value a "pseudo-nan". Motorola docs say it
3434 doesn't care. */
3435 sig_hi |= 0x80000000;
3437 else
3439 image_hi |= 32767;
3440 sig_lo = sig_hi = 0xffffffff;
3442 break;
3444 case rvc_normal:
3446 int exp = REAL_EXP (r);
3448 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3449 whereas the intermediate representation is 0.F x 2**exp.
3450 Which means we're off by one.
3452 Except for Motorola, which consider exp=0 and explicit
3453 integer bit set to continue to be normalized. In theory
3454 this discrepancy has been taken care of by the difference
3455 in fmt->emin in round_for_format. */
3457 if (denormal)
3458 exp = 0;
3459 else
3461 exp += 16383 - 1;
3462 gcc_assert (exp >= 0);
3464 image_hi |= exp;
3466 if (HOST_BITS_PER_LONG == 32)
3468 sig_hi = r->sig[SIGSZ-1];
3469 sig_lo = r->sig[SIGSZ-2];
3471 else
3473 sig_lo = r->sig[SIGSZ-1];
3474 sig_hi = sig_lo >> 31 >> 1;
3475 sig_lo &= 0xffffffff;
3478 break;
3480 default:
3481 gcc_unreachable ();
3484 buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3487 /* Convert from the internal format to the 12-byte Motorola format
3488 for an IEEE extended real. */
3489 static void
3490 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3491 const REAL_VALUE_TYPE *r)
3493 long intermed[3];
3494 encode_ieee_extended (fmt, intermed, r);
3496 if (r->cl == rvc_inf)
3497 /* For infinity clear the explicit integer bit again, so that the
3498 format matches the canonical infinity generated by the FPU. */
3499 intermed[1] = 0;
3501 /* Motorola chips are assumed always to be big-endian. Also, the
3502 padding in a Motorola extended real goes between the exponent and
3503 the mantissa. At this point the mantissa is entirely within
3504 elements 0 and 1 of intermed, and the exponent entirely within
3505 element 2, so all we have to do is swap the order around, and
3506 shift element 2 left 16 bits. */
3507 buf[0] = intermed[2] << 16;
3508 buf[1] = intermed[1];
3509 buf[2] = intermed[0];
3512 /* Convert from the internal format to the 12-byte Intel format for
3513 an IEEE extended real. */
3514 static void
3515 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3516 const REAL_VALUE_TYPE *r)
3518 if (FLOAT_WORDS_BIG_ENDIAN)
3520 /* All the padding in an Intel-format extended real goes at the high
3521 end, which in this case is after the mantissa, not the exponent.
3522 Therefore we must shift everything down 16 bits. */
3523 long intermed[3];
3524 encode_ieee_extended (fmt, intermed, r);
3525 buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3526 buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3527 buf[2] = (intermed[0] << 16);
3529 else
3530 /* encode_ieee_extended produces what we want directly. */
3531 encode_ieee_extended (fmt, buf, r);
3534 /* Convert from the internal format to the 16-byte Intel format for
3535 an IEEE extended real. */
3536 static void
3537 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3538 const REAL_VALUE_TYPE *r)
3540 /* All the padding in an Intel-format extended real goes at the high end. */
3541 encode_ieee_extended_intel_96 (fmt, buf, r);
3542 buf[3] = 0;
3545 /* As above, we have a helper function which converts from 12-byte
3546 little-endian Intel format to internal format. Functions below
3547 adjust for the other possible formats. */
3548 static void
3549 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3550 const long *buf)
3552 unsigned long image_hi, sig_hi, sig_lo;
3553 bool sign;
3554 int exp;
3556 sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3557 sig_lo &= 0xffffffff;
3558 sig_hi &= 0xffffffff;
3559 image_hi &= 0xffffffff;
3561 sign = (image_hi >> 15) & 1;
3562 exp = image_hi & 0x7fff;
3564 memset (r, 0, sizeof (*r));
3566 if (exp == 0)
3568 if ((sig_hi || sig_lo) && fmt->has_denorm)
3570 r->cl = rvc_normal;
3571 r->sign = sign;
3573 /* When the IEEE format contains a hidden bit, we know that
3574 it's zero at this point, and so shift up the significand
3575 and decrease the exponent to match. In this case, Motorola
3576 defines the explicit integer bit to be valid, so we don't
3577 know whether the msb is set or not. */
3578 SET_REAL_EXP (r, fmt->emin);
3579 if (HOST_BITS_PER_LONG == 32)
3581 r->sig[SIGSZ-1] = sig_hi;
3582 r->sig[SIGSZ-2] = sig_lo;
3584 else
3585 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3587 normalize (r);
3589 else if (fmt->has_signed_zero)
3590 r->sign = sign;
3592 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3594 /* See above re "pseudo-infinities" and "pseudo-nans".
3595 Short summary is that the MSB will likely always be
3596 set, and that we don't care about it. */
3597 sig_hi &= 0x7fffffff;
3599 if (sig_hi || sig_lo)
3601 r->cl = rvc_nan;
3602 r->sign = sign;
3603 r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3604 if (HOST_BITS_PER_LONG == 32)
3606 r->sig[SIGSZ-1] = sig_hi;
3607 r->sig[SIGSZ-2] = sig_lo;
3609 else
3610 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3612 else
3614 r->cl = rvc_inf;
3615 r->sign = sign;
3618 else
3620 r->cl = rvc_normal;
3621 r->sign = sign;
3622 SET_REAL_EXP (r, exp - 16383 + 1);
3623 if (HOST_BITS_PER_LONG == 32)
3625 r->sig[SIGSZ-1] = sig_hi;
3626 r->sig[SIGSZ-2] = sig_lo;
3628 else
3629 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3633 /* Convert from the internal format to the 12-byte Motorola format
3634 for an IEEE extended real. */
3635 static void
3636 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3637 const long *buf)
3639 long intermed[3];
3641 /* Motorola chips are assumed always to be big-endian. Also, the
3642 padding in a Motorola extended real goes between the exponent and
3643 the mantissa; remove it. */
3644 intermed[0] = buf[2];
3645 intermed[1] = buf[1];
3646 intermed[2] = (unsigned long)buf[0] >> 16;
3648 decode_ieee_extended (fmt, r, intermed);
3651 /* Convert from the internal format to the 12-byte Intel format for
3652 an IEEE extended real. */
3653 static void
3654 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3655 const long *buf)
3657 if (FLOAT_WORDS_BIG_ENDIAN)
3659 /* All the padding in an Intel-format extended real goes at the high
3660 end, which in this case is after the mantissa, not the exponent.
3661 Therefore we must shift everything up 16 bits. */
3662 long intermed[3];
3664 intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3665 intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3666 intermed[2] = ((unsigned long)buf[0] >> 16);
3668 decode_ieee_extended (fmt, r, intermed);
3670 else
3671 /* decode_ieee_extended produces what we want directly. */
3672 decode_ieee_extended (fmt, r, buf);
3675 /* Convert from the internal format to the 16-byte Intel format for
3676 an IEEE extended real. */
3677 static void
3678 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3679 const long *buf)
3681 /* All the padding in an Intel-format extended real goes at the high end. */
3682 decode_ieee_extended_intel_96 (fmt, r, buf);
3685 const struct real_format ieee_extended_motorola_format =
3687 encode_ieee_extended_motorola,
3688 decode_ieee_extended_motorola,
3692 -16382,
3693 16384,
3696 false,
3697 true,
3698 true,
3699 true,
3700 true,
3701 true,
3702 true,
3703 true
3706 const struct real_format ieee_extended_intel_96_format =
3708 encode_ieee_extended_intel_96,
3709 decode_ieee_extended_intel_96,
3713 -16381,
3714 16384,
3717 false,
3718 true,
3719 true,
3720 true,
3721 true,
3722 true,
3723 true,
3724 false
3727 const struct real_format ieee_extended_intel_128_format =
3729 encode_ieee_extended_intel_128,
3730 decode_ieee_extended_intel_128,
3734 -16381,
3735 16384,
3738 false,
3739 true,
3740 true,
3741 true,
3742 true,
3743 true,
3744 true,
3745 false
3748 /* The following caters to i386 systems that set the rounding precision
3749 to 53 bits instead of 64, e.g. FreeBSD. */
3750 const struct real_format ieee_extended_intel_96_round_53_format =
3752 encode_ieee_extended_intel_96,
3753 decode_ieee_extended_intel_96,
3757 -16381,
3758 16384,
3761 false,
3762 true,
3763 true,
3764 true,
3765 true,
3766 true,
3767 true,
3768 false
3771 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3772 numbers whose sum is equal to the extended precision value. The number
3773 with greater magnitude is first. This format has the same magnitude
3774 range as an IEEE double precision value, but effectively 106 bits of
3775 significand precision. Infinity and NaN are represented by their IEEE
3776 double precision value stored in the first number, the second number is
3777 +0.0 or -0.0 for Infinity and don't-care for NaN. */
3779 static void encode_ibm_extended (const struct real_format *fmt,
3780 long *, const REAL_VALUE_TYPE *);
3781 static void decode_ibm_extended (const struct real_format *,
3782 REAL_VALUE_TYPE *, const long *);
3784 static void
3785 encode_ibm_extended (const struct real_format *fmt, long *buf,
3786 const REAL_VALUE_TYPE *r)
3788 REAL_VALUE_TYPE u, normr, v;
3789 const struct real_format *base_fmt;
3791 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3793 /* Renormalize R before doing any arithmetic on it. */
3794 normr = *r;
3795 if (normr.cl == rvc_normal)
3796 normalize (&normr);
3798 /* u = IEEE double precision portion of significand. */
3799 u = normr;
3800 round_for_format (base_fmt, &u);
3801 encode_ieee_double (base_fmt, &buf[0], &u);
3803 if (u.cl == rvc_normal)
3805 do_add (&v, &normr, &u, 1);
3806 /* Call round_for_format since we might need to denormalize. */
3807 round_for_format (base_fmt, &v);
3808 encode_ieee_double (base_fmt, &buf[2], &v);
3810 else
3812 /* Inf, NaN, 0 are all representable as doubles, so the
3813 least-significant part can be 0.0. */
3814 buf[2] = 0;
3815 buf[3] = 0;
3819 static void
3820 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3821 const long *buf)
3823 REAL_VALUE_TYPE u, v;
3824 const struct real_format *base_fmt;
3826 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3827 decode_ieee_double (base_fmt, &u, &buf[0]);
3829 if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3831 decode_ieee_double (base_fmt, &v, &buf[2]);
3832 do_add (r, &u, &v, 0);
3834 else
3835 *r = u;
3838 const struct real_format ibm_extended_format =
3840 encode_ibm_extended,
3841 decode_ibm_extended,
3843 53 + 53,
3845 -1021 + 53,
3846 1024,
3847 127,
3849 false,
3850 true,
3851 true,
3852 true,
3853 true,
3854 true,
3855 true,
3856 false
3859 const struct real_format mips_extended_format =
3861 encode_ibm_extended,
3862 decode_ibm_extended,
3864 53 + 53,
3866 -1021 + 53,
3867 1024,
3868 127,
3870 false,
3871 true,
3872 true,
3873 true,
3874 true,
3875 true,
3876 false,
3877 true
3881 /* IEEE quad precision format. */
3883 static void encode_ieee_quad (const struct real_format *fmt,
3884 long *, const REAL_VALUE_TYPE *);
3885 static void decode_ieee_quad (const struct real_format *,
3886 REAL_VALUE_TYPE *, const long *);
3888 static void
3889 encode_ieee_quad (const struct real_format *fmt, long *buf,
3890 const REAL_VALUE_TYPE *r)
3892 unsigned long image3, image2, image1, image0, exp;
3893 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3894 REAL_VALUE_TYPE u;
3896 image3 = r->sign << 31;
3897 image2 = 0;
3898 image1 = 0;
3899 image0 = 0;
3901 rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3903 switch (r->cl)
3905 case rvc_zero:
3906 break;
3908 case rvc_inf:
3909 if (fmt->has_inf)
3910 image3 |= 32767 << 16;
3911 else
3913 image3 |= 0x7fffffff;
3914 image2 = 0xffffffff;
3915 image1 = 0xffffffff;
3916 image0 = 0xffffffff;
3918 break;
3920 case rvc_nan:
3921 if (fmt->has_nans)
3923 image3 |= 32767 << 16;
3925 if (r->canonical)
3927 if (fmt->canonical_nan_lsbs_set)
3929 image3 |= 0x7fff;
3930 image2 = image1 = image0 = 0xffffffff;
3933 else if (HOST_BITS_PER_LONG == 32)
3935 image0 = u.sig[0];
3936 image1 = u.sig[1];
3937 image2 = u.sig[2];
3938 image3 |= u.sig[3] & 0xffff;
3940 else
3942 image0 = u.sig[0];
3943 image1 = image0 >> 31 >> 1;
3944 image2 = u.sig[1];
3945 image3 |= (image2 >> 31 >> 1) & 0xffff;
3946 image0 &= 0xffffffff;
3947 image2 &= 0xffffffff;
3949 if (r->signalling == fmt->qnan_msb_set)
3950 image3 &= ~0x8000;
3951 else
3952 image3 |= 0x8000;
3953 if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3954 image3 |= 0x4000;
3956 else
3958 image3 |= 0x7fffffff;
3959 image2 = 0xffffffff;
3960 image1 = 0xffffffff;
3961 image0 = 0xffffffff;
3963 break;
3965 case rvc_normal:
3966 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3967 whereas the intermediate representation is 0.F x 2**exp.
3968 Which means we're off by one. */
3969 if (denormal)
3970 exp = 0;
3971 else
3972 exp = REAL_EXP (r) + 16383 - 1;
3973 image3 |= exp << 16;
3975 if (HOST_BITS_PER_LONG == 32)
3977 image0 = u.sig[0];
3978 image1 = u.sig[1];
3979 image2 = u.sig[2];
3980 image3 |= u.sig[3] & 0xffff;
3982 else
3984 image0 = u.sig[0];
3985 image1 = image0 >> 31 >> 1;
3986 image2 = u.sig[1];
3987 image3 |= (image2 >> 31 >> 1) & 0xffff;
3988 image0 &= 0xffffffff;
3989 image2 &= 0xffffffff;
3991 break;
3993 default:
3994 gcc_unreachable ();
3997 if (FLOAT_WORDS_BIG_ENDIAN)
3999 buf[0] = image3;
4000 buf[1] = image2;
4001 buf[2] = image1;
4002 buf[3] = image0;
4004 else
4006 buf[0] = image0;
4007 buf[1] = image1;
4008 buf[2] = image2;
4009 buf[3] = image3;
4013 static void
4014 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
4015 const long *buf)
4017 unsigned long image3, image2, image1, image0;
4018 bool sign;
4019 int exp;
4021 if (FLOAT_WORDS_BIG_ENDIAN)
4023 image3 = buf[0];
4024 image2 = buf[1];
4025 image1 = buf[2];
4026 image0 = buf[3];
4028 else
4030 image0 = buf[0];
4031 image1 = buf[1];
4032 image2 = buf[2];
4033 image3 = buf[3];
4035 image0 &= 0xffffffff;
4036 image1 &= 0xffffffff;
4037 image2 &= 0xffffffff;
4039 sign = (image3 >> 31) & 1;
4040 exp = (image3 >> 16) & 0x7fff;
4041 image3 &= 0xffff;
4043 memset (r, 0, sizeof (*r));
4045 if (exp == 0)
4047 if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
4049 r->cl = rvc_normal;
4050 r->sign = sign;
4052 SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
4053 if (HOST_BITS_PER_LONG == 32)
4055 r->sig[0] = image0;
4056 r->sig[1] = image1;
4057 r->sig[2] = image2;
4058 r->sig[3] = image3;
4060 else
4062 r->sig[0] = (image1 << 31 << 1) | image0;
4063 r->sig[1] = (image3 << 31 << 1) | image2;
4066 normalize (r);
4068 else if (fmt->has_signed_zero)
4069 r->sign = sign;
4071 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
4073 if (image3 | image2 | image1 | image0)
4075 r->cl = rvc_nan;
4076 r->sign = sign;
4077 r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
4079 if (HOST_BITS_PER_LONG == 32)
4081 r->sig[0] = image0;
4082 r->sig[1] = image1;
4083 r->sig[2] = image2;
4084 r->sig[3] = image3;
4086 else
4088 r->sig[0] = (image1 << 31 << 1) | image0;
4089 r->sig[1] = (image3 << 31 << 1) | image2;
4091 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
4093 else
4095 r->cl = rvc_inf;
4096 r->sign = sign;
4099 else
4101 r->cl = rvc_normal;
4102 r->sign = sign;
4103 SET_REAL_EXP (r, exp - 16383 + 1);
4105 if (HOST_BITS_PER_LONG == 32)
4107 r->sig[0] = image0;
4108 r->sig[1] = image1;
4109 r->sig[2] = image2;
4110 r->sig[3] = image3;
4112 else
4114 r->sig[0] = (image1 << 31 << 1) | image0;
4115 r->sig[1] = (image3 << 31 << 1) | image2;
4117 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
4118 r->sig[SIGSZ-1] |= SIG_MSB;
4122 const struct real_format ieee_quad_format =
4124 encode_ieee_quad,
4125 decode_ieee_quad,
4127 113,
4128 113,
4129 -16381,
4130 16384,
4131 127,
4132 127,
4133 false,
4134 true,
4135 true,
4136 true,
4137 true,
4138 true,
4139 true,
4140 false
4143 const struct real_format mips_quad_format =
4145 encode_ieee_quad,
4146 decode_ieee_quad,
4148 113,
4149 113,
4150 -16381,
4151 16384,
4152 127,
4153 127,
4154 false,
4155 true,
4156 true,
4157 true,
4158 true,
4159 true,
4160 false,
4161 true
4164 /* Descriptions of VAX floating point formats can be found beginning at
4166 http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
4168 The thing to remember is that they're almost IEEE, except for word
4169 order, exponent bias, and the lack of infinities, nans, and denormals.
4171 We don't implement the H_floating format here, simply because neither
4172 the VAX or Alpha ports use it. */
4174 static void encode_vax_f (const struct real_format *fmt,
4175 long *, const REAL_VALUE_TYPE *);
4176 static void decode_vax_f (const struct real_format *,
4177 REAL_VALUE_TYPE *, const long *);
4178 static void encode_vax_d (const struct real_format *fmt,
4179 long *, const REAL_VALUE_TYPE *);
4180 static void decode_vax_d (const struct real_format *,
4181 REAL_VALUE_TYPE *, const long *);
4182 static void encode_vax_g (const struct real_format *fmt,
4183 long *, const REAL_VALUE_TYPE *);
4184 static void decode_vax_g (const struct real_format *,
4185 REAL_VALUE_TYPE *, const long *);
4187 static void
4188 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4189 const REAL_VALUE_TYPE *r)
4191 unsigned long sign, exp, sig, image;
4193 sign = r->sign << 15;
4195 switch (r->cl)
4197 case rvc_zero:
4198 image = 0;
4199 break;
4201 case rvc_inf:
4202 case rvc_nan:
4203 image = 0xffff7fff | sign;
4204 break;
4206 case rvc_normal:
4207 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4208 exp = REAL_EXP (r) + 128;
4210 image = (sig << 16) & 0xffff0000;
4211 image |= sign;
4212 image |= exp << 7;
4213 image |= sig >> 16;
4214 break;
4216 default:
4217 gcc_unreachable ();
4220 buf[0] = image;
4223 static void
4224 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
4225 REAL_VALUE_TYPE *r, const long *buf)
4227 unsigned long image = buf[0] & 0xffffffff;
4228 int exp = (image >> 7) & 0xff;
4230 memset (r, 0, sizeof (*r));
4232 if (exp != 0)
4234 r->cl = rvc_normal;
4235 r->sign = (image >> 15) & 1;
4236 SET_REAL_EXP (r, exp - 128);
4238 image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
4239 r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4243 static void
4244 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4245 const REAL_VALUE_TYPE *r)
4247 unsigned long image0, image1, sign = r->sign << 15;
4249 switch (r->cl)
4251 case rvc_zero:
4252 image0 = image1 = 0;
4253 break;
4255 case rvc_inf:
4256 case rvc_nan:
4257 image0 = 0xffff7fff | sign;
4258 image1 = 0xffffffff;
4259 break;
4261 case rvc_normal:
4262 /* Extract the significand into straight hi:lo. */
4263 if (HOST_BITS_PER_LONG == 64)
4265 image0 = r->sig[SIGSZ-1];
4266 image1 = (image0 >> (64 - 56)) & 0xffffffff;
4267 image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
4269 else
4271 image0 = r->sig[SIGSZ-1];
4272 image1 = r->sig[SIGSZ-2];
4273 image1 = (image0 << 24) | (image1 >> 8);
4274 image0 = (image0 >> 8) & 0xffffff;
4277 /* Rearrange the half-words of the significand to match the
4278 external format. */
4279 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
4280 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4282 /* Add the sign and exponent. */
4283 image0 |= sign;
4284 image0 |= (REAL_EXP (r) + 128) << 7;
4285 break;
4287 default:
4288 gcc_unreachable ();
4291 if (FLOAT_WORDS_BIG_ENDIAN)
4292 buf[0] = image1, buf[1] = image0;
4293 else
4294 buf[0] = image0, buf[1] = image1;
4297 static void
4298 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
4299 REAL_VALUE_TYPE *r, const long *buf)
4301 unsigned long image0, image1;
4302 int exp;
4304 if (FLOAT_WORDS_BIG_ENDIAN)
4305 image1 = buf[0], image0 = buf[1];
4306 else
4307 image0 = buf[0], image1 = buf[1];
4308 image0 &= 0xffffffff;
4309 image1 &= 0xffffffff;
4311 exp = (image0 >> 7) & 0xff;
4313 memset (r, 0, sizeof (*r));
4315 if (exp != 0)
4317 r->cl = rvc_normal;
4318 r->sign = (image0 >> 15) & 1;
4319 SET_REAL_EXP (r, exp - 128);
4321 /* Rearrange the half-words of the external format into
4322 proper ascending order. */
4323 image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
4324 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4326 if (HOST_BITS_PER_LONG == 64)
4328 image0 = (image0 << 31 << 1) | image1;
4329 image0 <<= 64 - 56;
4330 image0 |= SIG_MSB;
4331 r->sig[SIGSZ-1] = image0;
4333 else
4335 r->sig[SIGSZ-1] = image0;
4336 r->sig[SIGSZ-2] = image1;
4337 lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
4338 r->sig[SIGSZ-1] |= SIG_MSB;
4343 static void
4344 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4345 const REAL_VALUE_TYPE *r)
4347 unsigned long image0, image1, sign = r->sign << 15;
4349 switch (r->cl)
4351 case rvc_zero:
4352 image0 = image1 = 0;
4353 break;
4355 case rvc_inf:
4356 case rvc_nan:
4357 image0 = 0xffff7fff | sign;
4358 image1 = 0xffffffff;
4359 break;
4361 case rvc_normal:
4362 /* Extract the significand into straight hi:lo. */
4363 if (HOST_BITS_PER_LONG == 64)
4365 image0 = r->sig[SIGSZ-1];
4366 image1 = (image0 >> (64 - 53)) & 0xffffffff;
4367 image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
4369 else
4371 image0 = r->sig[SIGSZ-1];
4372 image1 = r->sig[SIGSZ-2];
4373 image1 = (image0 << 21) | (image1 >> 11);
4374 image0 = (image0 >> 11) & 0xfffff;
4377 /* Rearrange the half-words of the significand to match the
4378 external format. */
4379 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
4380 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4382 /* Add the sign and exponent. */
4383 image0 |= sign;
4384 image0 |= (REAL_EXP (r) + 1024) << 4;
4385 break;
4387 default:
4388 gcc_unreachable ();
4391 if (FLOAT_WORDS_BIG_ENDIAN)
4392 buf[0] = image1, buf[1] = image0;
4393 else
4394 buf[0] = image0, buf[1] = image1;
4397 static void
4398 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
4399 REAL_VALUE_TYPE *r, const long *buf)
4401 unsigned long image0, image1;
4402 int exp;
4404 if (FLOAT_WORDS_BIG_ENDIAN)
4405 image1 = buf[0], image0 = buf[1];
4406 else
4407 image0 = buf[0], image1 = buf[1];
4408 image0 &= 0xffffffff;
4409 image1 &= 0xffffffff;
4411 exp = (image0 >> 4) & 0x7ff;
4413 memset (r, 0, sizeof (*r));
4415 if (exp != 0)
4417 r->cl = rvc_normal;
4418 r->sign = (image0 >> 15) & 1;
4419 SET_REAL_EXP (r, exp - 1024);
4421 /* Rearrange the half-words of the external format into
4422 proper ascending order. */
4423 image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
4424 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4426 if (HOST_BITS_PER_LONG == 64)
4428 image0 = (image0 << 31 << 1) | image1;
4429 image0 <<= 64 - 53;
4430 image0 |= SIG_MSB;
4431 r->sig[SIGSZ-1] = image0;
4433 else
4435 r->sig[SIGSZ-1] = image0;
4436 r->sig[SIGSZ-2] = image1;
4437 lshift_significand (r, r, 64 - 53);
4438 r->sig[SIGSZ-1] |= SIG_MSB;
4443 const struct real_format vax_f_format =
4445 encode_vax_f,
4446 decode_vax_f,
4450 -127,
4451 127,
4454 false,
4455 false,
4456 false,
4457 false,
4458 false,
4459 false,
4460 false,
4461 false
4464 const struct real_format vax_d_format =
4466 encode_vax_d,
4467 decode_vax_d,
4471 -127,
4472 127,
4475 false,
4476 false,
4477 false,
4478 false,
4479 false,
4480 false,
4481 false,
4482 false
4485 const struct real_format vax_g_format =
4487 encode_vax_g,
4488 decode_vax_g,
4492 -1023,
4493 1023,
4496 false,
4497 false,
4498 false,
4499 false,
4500 false,
4501 false,
4502 false,
4503 false
4506 /* Encode real R into a single precision DFP value in BUF. */
4507 static void
4508 encode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4509 long *buf ATTRIBUTE_UNUSED,
4510 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4512 encode_decimal32 (fmt, buf, r);
4515 /* Decode a single precision DFP value in BUF into a real R. */
4516 static void
4517 decode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4518 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4519 const long *buf ATTRIBUTE_UNUSED)
4521 decode_decimal32 (fmt, r, buf);
4524 /* Encode real R into a double precision DFP value in BUF. */
4525 static void
4526 encode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4527 long *buf ATTRIBUTE_UNUSED,
4528 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4530 encode_decimal64 (fmt, buf, r);
4533 /* Decode a double precision DFP value in BUF into a real R. */
4534 static void
4535 decode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4536 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4537 const long *buf ATTRIBUTE_UNUSED)
4539 decode_decimal64 (fmt, r, buf);
4542 /* Encode real R into a quad precision DFP value in BUF. */
4543 static void
4544 encode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4545 long *buf ATTRIBUTE_UNUSED,
4546 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4548 encode_decimal128 (fmt, buf, r);
4551 /* Decode a quad precision DFP value in BUF into a real R. */
4552 static void
4553 decode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4554 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4555 const long *buf ATTRIBUTE_UNUSED)
4557 decode_decimal128 (fmt, r, buf);
4560 /* Single precision decimal floating point (IEEE 754). */
4561 const struct real_format decimal_single_format =
4563 encode_decimal_single,
4564 decode_decimal_single,
4568 -94,
4572 false,
4573 true,
4574 true,
4575 true,
4576 true,
4577 true,
4578 true,
4579 false
4582 /* Double precision decimal floating point (IEEE 754). */
4583 const struct real_format decimal_double_format =
4585 encode_decimal_double,
4586 decode_decimal_double,
4590 -382,
4591 385,
4594 false,
4595 true,
4596 true,
4597 true,
4598 true,
4599 true,
4600 true,
4601 false
4604 /* Quad precision decimal floating point (IEEE 754). */
4605 const struct real_format decimal_quad_format =
4607 encode_decimal_quad,
4608 decode_decimal_quad,
4612 -6142,
4613 6145,
4614 127,
4615 127,
4616 false,
4617 true,
4618 true,
4619 true,
4620 true,
4621 true,
4622 true,
4623 false
4626 /* Encode half-precision floats. This routine is used both for the IEEE
4627 ARM alternative encodings. */
4628 static void
4629 encode_ieee_half (const struct real_format *fmt, long *buf,
4630 const REAL_VALUE_TYPE *r)
4632 unsigned long image, sig, exp;
4633 unsigned long sign = r->sign;
4634 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
4636 image = sign << 15;
4637 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 11)) & 0x3ff;
4639 switch (r->cl)
4641 case rvc_zero:
4642 break;
4644 case rvc_inf:
4645 if (fmt->has_inf)
4646 image |= 31 << 10;
4647 else
4648 image |= 0x7fff;
4649 break;
4651 case rvc_nan:
4652 if (fmt->has_nans)
4654 if (r->canonical)
4655 sig = (fmt->canonical_nan_lsbs_set ? (1 << 9) - 1 : 0);
4656 if (r->signalling == fmt->qnan_msb_set)
4657 sig &= ~(1 << 9);
4658 else
4659 sig |= 1 << 9;
4660 if (sig == 0)
4661 sig = 1 << 8;
4663 image |= 31 << 10;
4664 image |= sig;
4666 else
4667 image |= 0x3ff;
4668 break;
4670 case rvc_normal:
4671 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
4672 whereas the intermediate representation is 0.F x 2**exp.
4673 Which means we're off by one. */
4674 if (denormal)
4675 exp = 0;
4676 else
4677 exp = REAL_EXP (r) + 15 - 1;
4678 image |= exp << 10;
4679 image |= sig;
4680 break;
4682 default:
4683 gcc_unreachable ();
4686 buf[0] = image;
4689 /* Decode half-precision floats. This routine is used both for the IEEE
4690 ARM alternative encodings. */
4691 static void
4692 decode_ieee_half (const struct real_format *fmt, REAL_VALUE_TYPE *r,
4693 const long *buf)
4695 unsigned long image = buf[0] & 0xffff;
4696 bool sign = (image >> 15) & 1;
4697 int exp = (image >> 10) & 0x1f;
4699 memset (r, 0, sizeof (*r));
4700 image <<= HOST_BITS_PER_LONG - 11;
4701 image &= ~SIG_MSB;
4703 if (exp == 0)
4705 if (image && fmt->has_denorm)
4707 r->cl = rvc_normal;
4708 r->sign = sign;
4709 SET_REAL_EXP (r, -14);
4710 r->sig[SIGSZ-1] = image << 1;
4711 normalize (r);
4713 else if (fmt->has_signed_zero)
4714 r->sign = sign;
4716 else if (exp == 31 && (fmt->has_nans || fmt->has_inf))
4718 if (image)
4720 r->cl = rvc_nan;
4721 r->sign = sign;
4722 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
4723 ^ fmt->qnan_msb_set);
4724 r->sig[SIGSZ-1] = image;
4726 else
4728 r->cl = rvc_inf;
4729 r->sign = sign;
4732 else
4734 r->cl = rvc_normal;
4735 r->sign = sign;
4736 SET_REAL_EXP (r, exp - 15 + 1);
4737 r->sig[SIGSZ-1] = image | SIG_MSB;
4741 /* Half-precision format, as specified in IEEE 754R. */
4742 const struct real_format ieee_half_format =
4744 encode_ieee_half,
4745 decode_ieee_half,
4749 -13,
4753 false,
4754 true,
4755 true,
4756 true,
4757 true,
4758 true,
4759 true,
4760 false
4763 /* ARM's alternative half-precision format, similar to IEEE but with
4764 no reserved exponent value for NaNs and infinities; rather, it just
4765 extends the range of exponents by one. */
4766 const struct real_format arm_half_format =
4768 encode_ieee_half,
4769 decode_ieee_half,
4773 -13,
4777 false,
4778 true,
4779 false,
4780 false,
4781 true,
4782 true,
4783 false,
4784 false
4787 /* A synthetic "format" for internal arithmetic. It's the size of the
4788 internal significand minus the two bits needed for proper rounding.
4789 The encode and decode routines exist only to satisfy our paranoia
4790 harness. */
4792 static void encode_internal (const struct real_format *fmt,
4793 long *, const REAL_VALUE_TYPE *);
4794 static void decode_internal (const struct real_format *,
4795 REAL_VALUE_TYPE *, const long *);
4797 static void
4798 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4799 const REAL_VALUE_TYPE *r)
4801 memcpy (buf, r, sizeof (*r));
4804 static void
4805 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4806 REAL_VALUE_TYPE *r, const long *buf)
4808 memcpy (r, buf, sizeof (*r));
4811 const struct real_format real_internal_format =
4813 encode_internal,
4814 decode_internal,
4816 SIGNIFICAND_BITS - 2,
4817 SIGNIFICAND_BITS - 2,
4818 -MAX_EXP,
4819 MAX_EXP,
4822 false,
4823 false,
4824 true,
4825 true,
4826 false,
4827 true,
4828 true,
4829 false
4832 /* Calculate X raised to the integer exponent N in mode MODE and store
4833 the result in R. Return true if the result may be inexact due to
4834 loss of precision. The algorithm is the classic "left-to-right binary
4835 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4836 Algorithms", "The Art of Computer Programming", Volume 2. */
4838 bool
4839 real_powi (REAL_VALUE_TYPE *r, machine_mode mode,
4840 const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4842 unsigned HOST_WIDE_INT bit;
4843 REAL_VALUE_TYPE t;
4844 bool inexact = false;
4845 bool init = false;
4846 bool neg;
4847 int i;
4849 if (n == 0)
4851 *r = dconst1;
4852 return false;
4854 else if (n < 0)
4856 /* Don't worry about overflow, from now on n is unsigned. */
4857 neg = true;
4858 n = -n;
4860 else
4861 neg = false;
4863 t = *x;
4864 bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4865 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4867 if (init)
4869 inexact |= do_multiply (&t, &t, &t);
4870 if (n & bit)
4871 inexact |= do_multiply (&t, &t, x);
4873 else if (n & bit)
4874 init = true;
4875 bit >>= 1;
4878 if (neg)
4879 inexact |= do_divide (&t, &dconst1, &t);
4881 real_convert (r, mode, &t);
4882 return inexact;
4885 /* Round X to the nearest integer not larger in absolute value, i.e.
4886 towards zero, placing the result in R in mode MODE. */
4888 void
4889 real_trunc (REAL_VALUE_TYPE *r, machine_mode mode,
4890 const REAL_VALUE_TYPE *x)
4892 do_fix_trunc (r, x);
4893 if (mode != VOIDmode)
4894 real_convert (r, mode, r);
4897 /* Round X to the largest integer not greater in value, i.e. round
4898 down, placing the result in R in mode MODE. */
4900 void
4901 real_floor (REAL_VALUE_TYPE *r, machine_mode mode,
4902 const REAL_VALUE_TYPE *x)
4904 REAL_VALUE_TYPE t;
4906 do_fix_trunc (&t, x);
4907 if (! real_identical (&t, x) && x->sign)
4908 do_add (&t, &t, &dconstm1, 0);
4909 if (mode != VOIDmode)
4910 real_convert (r, mode, &t);
4911 else
4912 *r = t;
4915 /* Round X to the smallest integer not less then argument, i.e. round
4916 up, placing the result in R in mode MODE. */
4918 void
4919 real_ceil (REAL_VALUE_TYPE *r, machine_mode mode,
4920 const REAL_VALUE_TYPE *x)
4922 REAL_VALUE_TYPE t;
4924 do_fix_trunc (&t, x);
4925 if (! real_identical (&t, x) && ! x->sign)
4926 do_add (&t, &t, &dconst1, 0);
4927 if (mode != VOIDmode)
4928 real_convert (r, mode, &t);
4929 else
4930 *r = t;
4933 /* Round X to the nearest integer, but round halfway cases away from
4934 zero. */
4936 void
4937 real_round (REAL_VALUE_TYPE *r, machine_mode mode,
4938 const REAL_VALUE_TYPE *x)
4940 do_add (r, x, &dconsthalf, x->sign);
4941 do_fix_trunc (r, r);
4942 if (mode != VOIDmode)
4943 real_convert (r, mode, r);
4946 /* Set the sign of R to the sign of X. */
4948 void
4949 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
4951 r->sign = x->sign;
4954 /* Check whether the real constant value given is an integer. */
4956 bool
4957 real_isinteger (const REAL_VALUE_TYPE *c, machine_mode mode)
4959 REAL_VALUE_TYPE cint;
4961 real_trunc (&cint, mode, c);
4962 return real_identical (c, &cint);
4965 /* Write into BUF the maximum representable finite floating-point
4966 number, (1 - b**-p) * b**emax for a given FP format FMT as a hex
4967 float string. LEN is the size of BUF, and the buffer must be large
4968 enough to contain the resulting string. */
4970 void
4971 get_max_float (const struct real_format *fmt, char *buf, size_t len)
4973 int i, n;
4974 char *p;
4976 strcpy (buf, "0x0.");
4977 n = fmt->p;
4978 for (i = 0, p = buf + 4; i + 3 < n; i += 4)
4979 *p++ = 'f';
4980 if (i < n)
4981 *p++ = "08ce"[n - i];
4982 sprintf (p, "p%d", fmt->emax);
4983 if (fmt->pnan < fmt->p)
4985 /* This is an IBM extended double format made up of two IEEE
4986 doubles. The value of the long double is the sum of the
4987 values of the two parts. The most significant part is
4988 required to be the value of the long double rounded to the
4989 nearest double. Rounding means we need a slightly smaller
4990 value for LDBL_MAX. */
4991 buf[4 + fmt->pnan / 4] = "7bde"[fmt->pnan % 4];
4994 gcc_assert (strlen (buf) < len);
4997 /* True if mode M has a NaN representation and
4998 the treatment of NaN operands is important. */
5000 bool
5001 HONOR_NANS (machine_mode m)
5003 return MODE_HAS_NANS (m) && !flag_finite_math_only;
5006 bool
5007 HONOR_NANS (const_tree t)
5009 return HONOR_NANS (element_mode (t));
5012 bool
5013 HONOR_NANS (const_rtx x)
5015 return HONOR_NANS (GET_MODE (x));
5018 /* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs). */
5020 bool
5021 HONOR_SNANS (machine_mode m)
5023 return flag_signaling_nans && HONOR_NANS (m);
5026 bool
5027 HONOR_SNANS (const_tree t)
5029 return HONOR_SNANS (element_mode (t));
5032 bool
5033 HONOR_SNANS (const_rtx x)
5035 return HONOR_SNANS (GET_MODE (x));
5038 /* As for HONOR_NANS, but true if the mode can represent infinity and
5039 the treatment of infinite values is important. */
5041 bool
5042 HONOR_INFINITIES (machine_mode m)
5044 return MODE_HAS_INFINITIES (m) && !flag_finite_math_only;
5047 bool
5048 HONOR_INFINITIES (const_tree t)
5050 return HONOR_INFINITIES (element_mode (t));
5053 bool
5054 HONOR_INFINITIES (const_rtx x)
5056 return HONOR_INFINITIES (GET_MODE (x));
5059 /* Like HONOR_NANS, but true if the given mode distinguishes between
5060 positive and negative zero, and the sign of zero is important. */
5062 bool
5063 HONOR_SIGNED_ZEROS (machine_mode m)
5065 return MODE_HAS_SIGNED_ZEROS (m) && flag_signed_zeros;
5068 bool
5069 HONOR_SIGNED_ZEROS (const_tree t)
5071 return HONOR_SIGNED_ZEROS (element_mode (t));
5074 bool
5075 HONOR_SIGNED_ZEROS (const_rtx x)
5077 return HONOR_SIGNED_ZEROS (GET_MODE (x));
5080 /* Like HONOR_NANS, but true if given mode supports sign-dependent rounding,
5081 and the rounding mode is important. */
5083 bool
5084 HONOR_SIGN_DEPENDENT_ROUNDING (machine_mode m)
5086 return MODE_HAS_SIGN_DEPENDENT_ROUNDING (m) && flag_rounding_math;
5089 bool
5090 HONOR_SIGN_DEPENDENT_ROUNDING (const_tree t)
5092 return HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (t));
5095 bool
5096 HONOR_SIGN_DEPENDENT_ROUNDING (const_rtx x)
5098 return HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (x));