2015-05-05 Yvan Roux <yvan.roux@linaro.org>
[official-gcc.git] / gcc / real.c
blob43f124e05f7097256281456efcdacd12d574b7cd
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,
3035 "ieee_single"
3038 const struct real_format mips_single_format =
3040 encode_ieee_single,
3041 decode_ieee_single,
3045 -125,
3046 128,
3049 false,
3050 true,
3051 true,
3052 true,
3053 true,
3054 true,
3055 false,
3056 true,
3057 "mips_single"
3060 const struct real_format motorola_single_format =
3062 encode_ieee_single,
3063 decode_ieee_single,
3067 -125,
3068 128,
3071 false,
3072 true,
3073 true,
3074 true,
3075 true,
3076 true,
3077 true,
3078 true,
3079 "motorola_single"
3082 /* SPU Single Precision (Extended-Range Mode) format is the same as IEEE
3083 single precision with the following differences:
3084 - Infinities are not supported. Instead MAX_FLOAT or MIN_FLOAT
3085 are generated.
3086 - NaNs are not supported.
3087 - The range of non-zero numbers in binary is
3088 (001)[1.]000...000 to (255)[1.]111...111.
3089 - Denormals can be represented, but are treated as +0.0 when
3090 used as an operand and are never generated as a result.
3091 - -0.0 can be represented, but a zero result is always +0.0.
3092 - the only supported rounding mode is trunction (towards zero). */
3093 const struct real_format spu_single_format =
3095 encode_ieee_single,
3096 decode_ieee_single,
3100 -125,
3101 129,
3104 true,
3105 false,
3106 false,
3107 false,
3108 true,
3109 true,
3110 false,
3111 false,
3112 "spu_single"
3115 /* IEEE double-precision format. */
3117 static void encode_ieee_double (const struct real_format *fmt,
3118 long *, const REAL_VALUE_TYPE *);
3119 static void decode_ieee_double (const struct real_format *,
3120 REAL_VALUE_TYPE *, const long *);
3122 static void
3123 encode_ieee_double (const struct real_format *fmt, long *buf,
3124 const REAL_VALUE_TYPE *r)
3126 unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
3127 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3129 image_hi = r->sign << 31;
3130 image_lo = 0;
3132 if (HOST_BITS_PER_LONG == 64)
3134 sig_hi = r->sig[SIGSZ-1];
3135 sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
3136 sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
3138 else
3140 sig_hi = r->sig[SIGSZ-1];
3141 sig_lo = r->sig[SIGSZ-2];
3142 sig_lo = (sig_hi << 21) | (sig_lo >> 11);
3143 sig_hi = (sig_hi >> 11) & 0xfffff;
3146 switch (r->cl)
3148 case rvc_zero:
3149 break;
3151 case rvc_inf:
3152 if (fmt->has_inf)
3153 image_hi |= 2047 << 20;
3154 else
3156 image_hi |= 0x7fffffff;
3157 image_lo = 0xffffffff;
3159 break;
3161 case rvc_nan:
3162 if (fmt->has_nans)
3164 if (r->canonical)
3166 if (fmt->canonical_nan_lsbs_set)
3168 sig_hi = (1 << 19) - 1;
3169 sig_lo = 0xffffffff;
3171 else
3173 sig_hi = 0;
3174 sig_lo = 0;
3177 if (r->signalling == fmt->qnan_msb_set)
3178 sig_hi &= ~(1 << 19);
3179 else
3180 sig_hi |= 1 << 19;
3181 if (sig_hi == 0 && sig_lo == 0)
3182 sig_hi = 1 << 18;
3184 image_hi |= 2047 << 20;
3185 image_hi |= sig_hi;
3186 image_lo = sig_lo;
3188 else
3190 image_hi |= 0x7fffffff;
3191 image_lo = 0xffffffff;
3193 break;
3195 case rvc_normal:
3196 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3197 whereas the intermediate representation is 0.F x 2**exp.
3198 Which means we're off by one. */
3199 if (denormal)
3200 exp = 0;
3201 else
3202 exp = REAL_EXP (r) + 1023 - 1;
3203 image_hi |= exp << 20;
3204 image_hi |= sig_hi;
3205 image_lo = sig_lo;
3206 break;
3208 default:
3209 gcc_unreachable ();
3212 if (FLOAT_WORDS_BIG_ENDIAN)
3213 buf[0] = image_hi, buf[1] = image_lo;
3214 else
3215 buf[0] = image_lo, buf[1] = image_hi;
3218 static void
3219 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3220 const long *buf)
3222 unsigned long image_hi, image_lo;
3223 bool sign;
3224 int exp;
3226 if (FLOAT_WORDS_BIG_ENDIAN)
3227 image_hi = buf[0], image_lo = buf[1];
3228 else
3229 image_lo = buf[0], image_hi = buf[1];
3230 image_lo &= 0xffffffff;
3231 image_hi &= 0xffffffff;
3233 sign = (image_hi >> 31) & 1;
3234 exp = (image_hi >> 20) & 0x7ff;
3236 memset (r, 0, sizeof (*r));
3238 image_hi <<= 32 - 21;
3239 image_hi |= image_lo >> 21;
3240 image_hi &= 0x7fffffff;
3241 image_lo <<= 32 - 21;
3243 if (exp == 0)
3245 if ((image_hi || image_lo) && fmt->has_denorm)
3247 r->cl = rvc_normal;
3248 r->sign = sign;
3249 SET_REAL_EXP (r, -1022);
3250 if (HOST_BITS_PER_LONG == 32)
3252 image_hi = (image_hi << 1) | (image_lo >> 31);
3253 image_lo <<= 1;
3254 r->sig[SIGSZ-1] = image_hi;
3255 r->sig[SIGSZ-2] = image_lo;
3257 else
3259 image_hi = (image_hi << 31 << 2) | (image_lo << 1);
3260 r->sig[SIGSZ-1] = image_hi;
3262 normalize (r);
3264 else if (fmt->has_signed_zero)
3265 r->sign = sign;
3267 else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
3269 if (image_hi || image_lo)
3271 r->cl = rvc_nan;
3272 r->sign = sign;
3273 r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3274 if (HOST_BITS_PER_LONG == 32)
3276 r->sig[SIGSZ-1] = image_hi;
3277 r->sig[SIGSZ-2] = image_lo;
3279 else
3280 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
3282 else
3284 r->cl = rvc_inf;
3285 r->sign = sign;
3288 else
3290 r->cl = rvc_normal;
3291 r->sign = sign;
3292 SET_REAL_EXP (r, exp - 1023 + 1);
3293 if (HOST_BITS_PER_LONG == 32)
3295 r->sig[SIGSZ-1] = image_hi | SIG_MSB;
3296 r->sig[SIGSZ-2] = image_lo;
3298 else
3299 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
3303 const struct real_format ieee_double_format =
3305 encode_ieee_double,
3306 decode_ieee_double,
3310 -1021,
3311 1024,
3314 false,
3315 true,
3316 true,
3317 true,
3318 true,
3319 true,
3320 true,
3321 false,
3322 "ieee_double"
3325 const struct real_format mips_double_format =
3327 encode_ieee_double,
3328 decode_ieee_double,
3332 -1021,
3333 1024,
3336 false,
3337 true,
3338 true,
3339 true,
3340 true,
3341 true,
3342 false,
3343 true,
3344 "mips_double"
3347 const struct real_format motorola_double_format =
3349 encode_ieee_double,
3350 decode_ieee_double,
3354 -1021,
3355 1024,
3358 false,
3359 true,
3360 true,
3361 true,
3362 true,
3363 true,
3364 true,
3365 true,
3366 "motorola_double"
3369 /* IEEE extended real format. This comes in three flavors: Intel's as
3370 a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
3371 12- and 16-byte images may be big- or little endian; Motorola's is
3372 always big endian. */
3374 /* Helper subroutine which converts from the internal format to the
3375 12-byte little-endian Intel format. Functions below adjust this
3376 for the other possible formats. */
3377 static void
3378 encode_ieee_extended (const struct real_format *fmt, long *buf,
3379 const REAL_VALUE_TYPE *r)
3381 unsigned long image_hi, sig_hi, sig_lo;
3382 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3384 image_hi = r->sign << 15;
3385 sig_hi = sig_lo = 0;
3387 switch (r->cl)
3389 case rvc_zero:
3390 break;
3392 case rvc_inf:
3393 if (fmt->has_inf)
3395 image_hi |= 32767;
3397 /* Intel requires the explicit integer bit to be set, otherwise
3398 it considers the value a "pseudo-infinity". Motorola docs
3399 say it doesn't care. */
3400 sig_hi = 0x80000000;
3402 else
3404 image_hi |= 32767;
3405 sig_lo = sig_hi = 0xffffffff;
3407 break;
3409 case rvc_nan:
3410 if (fmt->has_nans)
3412 image_hi |= 32767;
3413 if (r->canonical)
3415 if (fmt->canonical_nan_lsbs_set)
3417 sig_hi = (1 << 30) - 1;
3418 sig_lo = 0xffffffff;
3421 else if (HOST_BITS_PER_LONG == 32)
3423 sig_hi = r->sig[SIGSZ-1];
3424 sig_lo = r->sig[SIGSZ-2];
3426 else
3428 sig_lo = r->sig[SIGSZ-1];
3429 sig_hi = sig_lo >> 31 >> 1;
3430 sig_lo &= 0xffffffff;
3432 if (r->signalling == fmt->qnan_msb_set)
3433 sig_hi &= ~(1 << 30);
3434 else
3435 sig_hi |= 1 << 30;
3436 if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
3437 sig_hi = 1 << 29;
3439 /* Intel requires the explicit integer bit to be set, otherwise
3440 it considers the value a "pseudo-nan". Motorola docs say it
3441 doesn't care. */
3442 sig_hi |= 0x80000000;
3444 else
3446 image_hi |= 32767;
3447 sig_lo = sig_hi = 0xffffffff;
3449 break;
3451 case rvc_normal:
3453 int exp = REAL_EXP (r);
3455 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3456 whereas the intermediate representation is 0.F x 2**exp.
3457 Which means we're off by one.
3459 Except for Motorola, which consider exp=0 and explicit
3460 integer bit set to continue to be normalized. In theory
3461 this discrepancy has been taken care of by the difference
3462 in fmt->emin in round_for_format. */
3464 if (denormal)
3465 exp = 0;
3466 else
3468 exp += 16383 - 1;
3469 gcc_assert (exp >= 0);
3471 image_hi |= exp;
3473 if (HOST_BITS_PER_LONG == 32)
3475 sig_hi = r->sig[SIGSZ-1];
3476 sig_lo = r->sig[SIGSZ-2];
3478 else
3480 sig_lo = r->sig[SIGSZ-1];
3481 sig_hi = sig_lo >> 31 >> 1;
3482 sig_lo &= 0xffffffff;
3485 break;
3487 default:
3488 gcc_unreachable ();
3491 buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3494 /* Convert from the internal format to the 12-byte Motorola format
3495 for an IEEE extended real. */
3496 static void
3497 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3498 const REAL_VALUE_TYPE *r)
3500 long intermed[3];
3501 encode_ieee_extended (fmt, intermed, r);
3503 if (r->cl == rvc_inf)
3504 /* For infinity clear the explicit integer bit again, so that the
3505 format matches the canonical infinity generated by the FPU. */
3506 intermed[1] = 0;
3508 /* Motorola chips are assumed always to be big-endian. Also, the
3509 padding in a Motorola extended real goes between the exponent and
3510 the mantissa. At this point the mantissa is entirely within
3511 elements 0 and 1 of intermed, and the exponent entirely within
3512 element 2, so all we have to do is swap the order around, and
3513 shift element 2 left 16 bits. */
3514 buf[0] = intermed[2] << 16;
3515 buf[1] = intermed[1];
3516 buf[2] = intermed[0];
3519 /* Convert from the internal format to the 12-byte Intel format for
3520 an IEEE extended real. */
3521 static void
3522 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3523 const REAL_VALUE_TYPE *r)
3525 if (FLOAT_WORDS_BIG_ENDIAN)
3527 /* All the padding in an Intel-format extended real goes at the high
3528 end, which in this case is after the mantissa, not the exponent.
3529 Therefore we must shift everything down 16 bits. */
3530 long intermed[3];
3531 encode_ieee_extended (fmt, intermed, r);
3532 buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3533 buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3534 buf[2] = (intermed[0] << 16);
3536 else
3537 /* encode_ieee_extended produces what we want directly. */
3538 encode_ieee_extended (fmt, buf, r);
3541 /* Convert from the internal format to the 16-byte Intel format for
3542 an IEEE extended real. */
3543 static void
3544 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3545 const REAL_VALUE_TYPE *r)
3547 /* All the padding in an Intel-format extended real goes at the high end. */
3548 encode_ieee_extended_intel_96 (fmt, buf, r);
3549 buf[3] = 0;
3552 /* As above, we have a helper function which converts from 12-byte
3553 little-endian Intel format to internal format. Functions below
3554 adjust for the other possible formats. */
3555 static void
3556 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3557 const long *buf)
3559 unsigned long image_hi, sig_hi, sig_lo;
3560 bool sign;
3561 int exp;
3563 sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3564 sig_lo &= 0xffffffff;
3565 sig_hi &= 0xffffffff;
3566 image_hi &= 0xffffffff;
3568 sign = (image_hi >> 15) & 1;
3569 exp = image_hi & 0x7fff;
3571 memset (r, 0, sizeof (*r));
3573 if (exp == 0)
3575 if ((sig_hi || sig_lo) && fmt->has_denorm)
3577 r->cl = rvc_normal;
3578 r->sign = sign;
3580 /* When the IEEE format contains a hidden bit, we know that
3581 it's zero at this point, and so shift up the significand
3582 and decrease the exponent to match. In this case, Motorola
3583 defines the explicit integer bit to be valid, so we don't
3584 know whether the msb is set or not. */
3585 SET_REAL_EXP (r, fmt->emin);
3586 if (HOST_BITS_PER_LONG == 32)
3588 r->sig[SIGSZ-1] = sig_hi;
3589 r->sig[SIGSZ-2] = sig_lo;
3591 else
3592 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3594 normalize (r);
3596 else if (fmt->has_signed_zero)
3597 r->sign = sign;
3599 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3601 /* See above re "pseudo-infinities" and "pseudo-nans".
3602 Short summary is that the MSB will likely always be
3603 set, and that we don't care about it. */
3604 sig_hi &= 0x7fffffff;
3606 if (sig_hi || sig_lo)
3608 r->cl = rvc_nan;
3609 r->sign = sign;
3610 r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3611 if (HOST_BITS_PER_LONG == 32)
3613 r->sig[SIGSZ-1] = sig_hi;
3614 r->sig[SIGSZ-2] = sig_lo;
3616 else
3617 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3619 else
3621 r->cl = rvc_inf;
3622 r->sign = sign;
3625 else
3627 r->cl = rvc_normal;
3628 r->sign = sign;
3629 SET_REAL_EXP (r, exp - 16383 + 1);
3630 if (HOST_BITS_PER_LONG == 32)
3632 r->sig[SIGSZ-1] = sig_hi;
3633 r->sig[SIGSZ-2] = sig_lo;
3635 else
3636 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3640 /* Convert from the internal format to the 12-byte Motorola format
3641 for an IEEE extended real. */
3642 static void
3643 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3644 const long *buf)
3646 long intermed[3];
3648 /* Motorola chips are assumed always to be big-endian. Also, the
3649 padding in a Motorola extended real goes between the exponent and
3650 the mantissa; remove it. */
3651 intermed[0] = buf[2];
3652 intermed[1] = buf[1];
3653 intermed[2] = (unsigned long)buf[0] >> 16;
3655 decode_ieee_extended (fmt, r, intermed);
3658 /* Convert from the internal format to the 12-byte Intel format for
3659 an IEEE extended real. */
3660 static void
3661 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3662 const long *buf)
3664 if (FLOAT_WORDS_BIG_ENDIAN)
3666 /* All the padding in an Intel-format extended real goes at the high
3667 end, which in this case is after the mantissa, not the exponent.
3668 Therefore we must shift everything up 16 bits. */
3669 long intermed[3];
3671 intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3672 intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3673 intermed[2] = ((unsigned long)buf[0] >> 16);
3675 decode_ieee_extended (fmt, r, intermed);
3677 else
3678 /* decode_ieee_extended produces what we want directly. */
3679 decode_ieee_extended (fmt, r, buf);
3682 /* Convert from the internal format to the 16-byte Intel format for
3683 an IEEE extended real. */
3684 static void
3685 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3686 const long *buf)
3688 /* All the padding in an Intel-format extended real goes at the high end. */
3689 decode_ieee_extended_intel_96 (fmt, r, buf);
3692 const struct real_format ieee_extended_motorola_format =
3694 encode_ieee_extended_motorola,
3695 decode_ieee_extended_motorola,
3699 -16382,
3700 16384,
3703 false,
3704 true,
3705 true,
3706 true,
3707 true,
3708 true,
3709 true,
3710 true,
3711 "ieee_extended_motorola"
3714 const struct real_format ieee_extended_intel_96_format =
3716 encode_ieee_extended_intel_96,
3717 decode_ieee_extended_intel_96,
3721 -16381,
3722 16384,
3725 false,
3726 true,
3727 true,
3728 true,
3729 true,
3730 true,
3731 true,
3732 false,
3733 "ieee_extended_intel_96"
3736 const struct real_format ieee_extended_intel_128_format =
3738 encode_ieee_extended_intel_128,
3739 decode_ieee_extended_intel_128,
3743 -16381,
3744 16384,
3747 false,
3748 true,
3749 true,
3750 true,
3751 true,
3752 true,
3753 true,
3754 false,
3755 "ieee_extended_intel_128"
3758 /* The following caters to i386 systems that set the rounding precision
3759 to 53 bits instead of 64, e.g. FreeBSD. */
3760 const struct real_format ieee_extended_intel_96_round_53_format =
3762 encode_ieee_extended_intel_96,
3763 decode_ieee_extended_intel_96,
3767 -16381,
3768 16384,
3771 false,
3772 true,
3773 true,
3774 true,
3775 true,
3776 true,
3777 true,
3778 false,
3779 "ieee_extended_intel_96_round_53"
3782 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3783 numbers whose sum is equal to the extended precision value. The number
3784 with greater magnitude is first. This format has the same magnitude
3785 range as an IEEE double precision value, but effectively 106 bits of
3786 significand precision. Infinity and NaN are represented by their IEEE
3787 double precision value stored in the first number, the second number is
3788 +0.0 or -0.0 for Infinity and don't-care for NaN. */
3790 static void encode_ibm_extended (const struct real_format *fmt,
3791 long *, const REAL_VALUE_TYPE *);
3792 static void decode_ibm_extended (const struct real_format *,
3793 REAL_VALUE_TYPE *, const long *);
3795 static void
3796 encode_ibm_extended (const struct real_format *fmt, long *buf,
3797 const REAL_VALUE_TYPE *r)
3799 REAL_VALUE_TYPE u, normr, v;
3800 const struct real_format *base_fmt;
3802 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3804 /* Renormalize R before doing any arithmetic on it. */
3805 normr = *r;
3806 if (normr.cl == rvc_normal)
3807 normalize (&normr);
3809 /* u = IEEE double precision portion of significand. */
3810 u = normr;
3811 round_for_format (base_fmt, &u);
3812 encode_ieee_double (base_fmt, &buf[0], &u);
3814 if (u.cl == rvc_normal)
3816 do_add (&v, &normr, &u, 1);
3817 /* Call round_for_format since we might need to denormalize. */
3818 round_for_format (base_fmt, &v);
3819 encode_ieee_double (base_fmt, &buf[2], &v);
3821 else
3823 /* Inf, NaN, 0 are all representable as doubles, so the
3824 least-significant part can be 0.0. */
3825 buf[2] = 0;
3826 buf[3] = 0;
3830 static void
3831 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3832 const long *buf)
3834 REAL_VALUE_TYPE u, v;
3835 const struct real_format *base_fmt;
3837 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3838 decode_ieee_double (base_fmt, &u, &buf[0]);
3840 if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3842 decode_ieee_double (base_fmt, &v, &buf[2]);
3843 do_add (r, &u, &v, 0);
3845 else
3846 *r = u;
3849 const struct real_format ibm_extended_format =
3851 encode_ibm_extended,
3852 decode_ibm_extended,
3854 53 + 53,
3856 -1021 + 53,
3857 1024,
3858 127,
3860 false,
3861 true,
3862 true,
3863 true,
3864 true,
3865 true,
3866 true,
3867 false,
3868 "ibm_extended"
3871 const struct real_format mips_extended_format =
3873 encode_ibm_extended,
3874 decode_ibm_extended,
3876 53 + 53,
3878 -1021 + 53,
3879 1024,
3880 127,
3882 false,
3883 true,
3884 true,
3885 true,
3886 true,
3887 true,
3888 false,
3889 true,
3890 "mips_extended"
3894 /* IEEE quad precision format. */
3896 static void encode_ieee_quad (const struct real_format *fmt,
3897 long *, const REAL_VALUE_TYPE *);
3898 static void decode_ieee_quad (const struct real_format *,
3899 REAL_VALUE_TYPE *, const long *);
3901 static void
3902 encode_ieee_quad (const struct real_format *fmt, long *buf,
3903 const REAL_VALUE_TYPE *r)
3905 unsigned long image3, image2, image1, image0, exp;
3906 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3907 REAL_VALUE_TYPE u;
3909 image3 = r->sign << 31;
3910 image2 = 0;
3911 image1 = 0;
3912 image0 = 0;
3914 rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3916 switch (r->cl)
3918 case rvc_zero:
3919 break;
3921 case rvc_inf:
3922 if (fmt->has_inf)
3923 image3 |= 32767 << 16;
3924 else
3926 image3 |= 0x7fffffff;
3927 image2 = 0xffffffff;
3928 image1 = 0xffffffff;
3929 image0 = 0xffffffff;
3931 break;
3933 case rvc_nan:
3934 if (fmt->has_nans)
3936 image3 |= 32767 << 16;
3938 if (r->canonical)
3940 if (fmt->canonical_nan_lsbs_set)
3942 image3 |= 0x7fff;
3943 image2 = image1 = image0 = 0xffffffff;
3946 else if (HOST_BITS_PER_LONG == 32)
3948 image0 = u.sig[0];
3949 image1 = u.sig[1];
3950 image2 = u.sig[2];
3951 image3 |= u.sig[3] & 0xffff;
3953 else
3955 image0 = u.sig[0];
3956 image1 = image0 >> 31 >> 1;
3957 image2 = u.sig[1];
3958 image3 |= (image2 >> 31 >> 1) & 0xffff;
3959 image0 &= 0xffffffff;
3960 image2 &= 0xffffffff;
3962 if (r->signalling == fmt->qnan_msb_set)
3963 image3 &= ~0x8000;
3964 else
3965 image3 |= 0x8000;
3966 if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3967 image3 |= 0x4000;
3969 else
3971 image3 |= 0x7fffffff;
3972 image2 = 0xffffffff;
3973 image1 = 0xffffffff;
3974 image0 = 0xffffffff;
3976 break;
3978 case rvc_normal:
3979 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3980 whereas the intermediate representation is 0.F x 2**exp.
3981 Which means we're off by one. */
3982 if (denormal)
3983 exp = 0;
3984 else
3985 exp = REAL_EXP (r) + 16383 - 1;
3986 image3 |= exp << 16;
3988 if (HOST_BITS_PER_LONG == 32)
3990 image0 = u.sig[0];
3991 image1 = u.sig[1];
3992 image2 = u.sig[2];
3993 image3 |= u.sig[3] & 0xffff;
3995 else
3997 image0 = u.sig[0];
3998 image1 = image0 >> 31 >> 1;
3999 image2 = u.sig[1];
4000 image3 |= (image2 >> 31 >> 1) & 0xffff;
4001 image0 &= 0xffffffff;
4002 image2 &= 0xffffffff;
4004 break;
4006 default:
4007 gcc_unreachable ();
4010 if (FLOAT_WORDS_BIG_ENDIAN)
4012 buf[0] = image3;
4013 buf[1] = image2;
4014 buf[2] = image1;
4015 buf[3] = image0;
4017 else
4019 buf[0] = image0;
4020 buf[1] = image1;
4021 buf[2] = image2;
4022 buf[3] = image3;
4026 static void
4027 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
4028 const long *buf)
4030 unsigned long image3, image2, image1, image0;
4031 bool sign;
4032 int exp;
4034 if (FLOAT_WORDS_BIG_ENDIAN)
4036 image3 = buf[0];
4037 image2 = buf[1];
4038 image1 = buf[2];
4039 image0 = buf[3];
4041 else
4043 image0 = buf[0];
4044 image1 = buf[1];
4045 image2 = buf[2];
4046 image3 = buf[3];
4048 image0 &= 0xffffffff;
4049 image1 &= 0xffffffff;
4050 image2 &= 0xffffffff;
4052 sign = (image3 >> 31) & 1;
4053 exp = (image3 >> 16) & 0x7fff;
4054 image3 &= 0xffff;
4056 memset (r, 0, sizeof (*r));
4058 if (exp == 0)
4060 if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
4062 r->cl = rvc_normal;
4063 r->sign = sign;
4065 SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
4066 if (HOST_BITS_PER_LONG == 32)
4068 r->sig[0] = image0;
4069 r->sig[1] = image1;
4070 r->sig[2] = image2;
4071 r->sig[3] = image3;
4073 else
4075 r->sig[0] = (image1 << 31 << 1) | image0;
4076 r->sig[1] = (image3 << 31 << 1) | image2;
4079 normalize (r);
4081 else if (fmt->has_signed_zero)
4082 r->sign = sign;
4084 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
4086 if (image3 | image2 | image1 | image0)
4088 r->cl = rvc_nan;
4089 r->sign = sign;
4090 r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
4092 if (HOST_BITS_PER_LONG == 32)
4094 r->sig[0] = image0;
4095 r->sig[1] = image1;
4096 r->sig[2] = image2;
4097 r->sig[3] = image3;
4099 else
4101 r->sig[0] = (image1 << 31 << 1) | image0;
4102 r->sig[1] = (image3 << 31 << 1) | image2;
4104 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
4106 else
4108 r->cl = rvc_inf;
4109 r->sign = sign;
4112 else
4114 r->cl = rvc_normal;
4115 r->sign = sign;
4116 SET_REAL_EXP (r, exp - 16383 + 1);
4118 if (HOST_BITS_PER_LONG == 32)
4120 r->sig[0] = image0;
4121 r->sig[1] = image1;
4122 r->sig[2] = image2;
4123 r->sig[3] = image3;
4125 else
4127 r->sig[0] = (image1 << 31 << 1) | image0;
4128 r->sig[1] = (image3 << 31 << 1) | image2;
4130 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
4131 r->sig[SIGSZ-1] |= SIG_MSB;
4135 const struct real_format ieee_quad_format =
4137 encode_ieee_quad,
4138 decode_ieee_quad,
4140 113,
4141 113,
4142 -16381,
4143 16384,
4144 127,
4145 127,
4146 false,
4147 true,
4148 true,
4149 true,
4150 true,
4151 true,
4152 true,
4153 false,
4154 "ieee_quad"
4157 const struct real_format mips_quad_format =
4159 encode_ieee_quad,
4160 decode_ieee_quad,
4162 113,
4163 113,
4164 -16381,
4165 16384,
4166 127,
4167 127,
4168 false,
4169 true,
4170 true,
4171 true,
4172 true,
4173 true,
4174 false,
4175 true,
4176 "mips_quad"
4179 /* Descriptions of VAX floating point formats can be found beginning at
4181 http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
4183 The thing to remember is that they're almost IEEE, except for word
4184 order, exponent bias, and the lack of infinities, nans, and denormals.
4186 We don't implement the H_floating format here, simply because neither
4187 the VAX or Alpha ports use it. */
4189 static void encode_vax_f (const struct real_format *fmt,
4190 long *, const REAL_VALUE_TYPE *);
4191 static void decode_vax_f (const struct real_format *,
4192 REAL_VALUE_TYPE *, const long *);
4193 static void encode_vax_d (const struct real_format *fmt,
4194 long *, const REAL_VALUE_TYPE *);
4195 static void decode_vax_d (const struct real_format *,
4196 REAL_VALUE_TYPE *, const long *);
4197 static void encode_vax_g (const struct real_format *fmt,
4198 long *, const REAL_VALUE_TYPE *);
4199 static void decode_vax_g (const struct real_format *,
4200 REAL_VALUE_TYPE *, const long *);
4202 static void
4203 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4204 const REAL_VALUE_TYPE *r)
4206 unsigned long sign, exp, sig, image;
4208 sign = r->sign << 15;
4210 switch (r->cl)
4212 case rvc_zero:
4213 image = 0;
4214 break;
4216 case rvc_inf:
4217 case rvc_nan:
4218 image = 0xffff7fff | sign;
4219 break;
4221 case rvc_normal:
4222 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4223 exp = REAL_EXP (r) + 128;
4225 image = (sig << 16) & 0xffff0000;
4226 image |= sign;
4227 image |= exp << 7;
4228 image |= sig >> 16;
4229 break;
4231 default:
4232 gcc_unreachable ();
4235 buf[0] = image;
4238 static void
4239 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
4240 REAL_VALUE_TYPE *r, const long *buf)
4242 unsigned long image = buf[0] & 0xffffffff;
4243 int exp = (image >> 7) & 0xff;
4245 memset (r, 0, sizeof (*r));
4247 if (exp != 0)
4249 r->cl = rvc_normal;
4250 r->sign = (image >> 15) & 1;
4251 SET_REAL_EXP (r, exp - 128);
4253 image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
4254 r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4258 static void
4259 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4260 const REAL_VALUE_TYPE *r)
4262 unsigned long image0, image1, sign = r->sign << 15;
4264 switch (r->cl)
4266 case rvc_zero:
4267 image0 = image1 = 0;
4268 break;
4270 case rvc_inf:
4271 case rvc_nan:
4272 image0 = 0xffff7fff | sign;
4273 image1 = 0xffffffff;
4274 break;
4276 case rvc_normal:
4277 /* Extract the significand into straight hi:lo. */
4278 if (HOST_BITS_PER_LONG == 64)
4280 image0 = r->sig[SIGSZ-1];
4281 image1 = (image0 >> (64 - 56)) & 0xffffffff;
4282 image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
4284 else
4286 image0 = r->sig[SIGSZ-1];
4287 image1 = r->sig[SIGSZ-2];
4288 image1 = (image0 << 24) | (image1 >> 8);
4289 image0 = (image0 >> 8) & 0xffffff;
4292 /* Rearrange the half-words of the significand to match the
4293 external format. */
4294 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
4295 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4297 /* Add the sign and exponent. */
4298 image0 |= sign;
4299 image0 |= (REAL_EXP (r) + 128) << 7;
4300 break;
4302 default:
4303 gcc_unreachable ();
4306 if (FLOAT_WORDS_BIG_ENDIAN)
4307 buf[0] = image1, buf[1] = image0;
4308 else
4309 buf[0] = image0, buf[1] = image1;
4312 static void
4313 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
4314 REAL_VALUE_TYPE *r, const long *buf)
4316 unsigned long image0, image1;
4317 int exp;
4319 if (FLOAT_WORDS_BIG_ENDIAN)
4320 image1 = buf[0], image0 = buf[1];
4321 else
4322 image0 = buf[0], image1 = buf[1];
4323 image0 &= 0xffffffff;
4324 image1 &= 0xffffffff;
4326 exp = (image0 >> 7) & 0xff;
4328 memset (r, 0, sizeof (*r));
4330 if (exp != 0)
4332 r->cl = rvc_normal;
4333 r->sign = (image0 >> 15) & 1;
4334 SET_REAL_EXP (r, exp - 128);
4336 /* Rearrange the half-words of the external format into
4337 proper ascending order. */
4338 image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
4339 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4341 if (HOST_BITS_PER_LONG == 64)
4343 image0 = (image0 << 31 << 1) | image1;
4344 image0 <<= 64 - 56;
4345 image0 |= SIG_MSB;
4346 r->sig[SIGSZ-1] = image0;
4348 else
4350 r->sig[SIGSZ-1] = image0;
4351 r->sig[SIGSZ-2] = image1;
4352 lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
4353 r->sig[SIGSZ-1] |= SIG_MSB;
4358 static void
4359 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4360 const REAL_VALUE_TYPE *r)
4362 unsigned long image0, image1, sign = r->sign << 15;
4364 switch (r->cl)
4366 case rvc_zero:
4367 image0 = image1 = 0;
4368 break;
4370 case rvc_inf:
4371 case rvc_nan:
4372 image0 = 0xffff7fff | sign;
4373 image1 = 0xffffffff;
4374 break;
4376 case rvc_normal:
4377 /* Extract the significand into straight hi:lo. */
4378 if (HOST_BITS_PER_LONG == 64)
4380 image0 = r->sig[SIGSZ-1];
4381 image1 = (image0 >> (64 - 53)) & 0xffffffff;
4382 image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
4384 else
4386 image0 = r->sig[SIGSZ-1];
4387 image1 = r->sig[SIGSZ-2];
4388 image1 = (image0 << 21) | (image1 >> 11);
4389 image0 = (image0 >> 11) & 0xfffff;
4392 /* Rearrange the half-words of the significand to match the
4393 external format. */
4394 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
4395 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4397 /* Add the sign and exponent. */
4398 image0 |= sign;
4399 image0 |= (REAL_EXP (r) + 1024) << 4;
4400 break;
4402 default:
4403 gcc_unreachable ();
4406 if (FLOAT_WORDS_BIG_ENDIAN)
4407 buf[0] = image1, buf[1] = image0;
4408 else
4409 buf[0] = image0, buf[1] = image1;
4412 static void
4413 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
4414 REAL_VALUE_TYPE *r, const long *buf)
4416 unsigned long image0, image1;
4417 int exp;
4419 if (FLOAT_WORDS_BIG_ENDIAN)
4420 image1 = buf[0], image0 = buf[1];
4421 else
4422 image0 = buf[0], image1 = buf[1];
4423 image0 &= 0xffffffff;
4424 image1 &= 0xffffffff;
4426 exp = (image0 >> 4) & 0x7ff;
4428 memset (r, 0, sizeof (*r));
4430 if (exp != 0)
4432 r->cl = rvc_normal;
4433 r->sign = (image0 >> 15) & 1;
4434 SET_REAL_EXP (r, exp - 1024);
4436 /* Rearrange the half-words of the external format into
4437 proper ascending order. */
4438 image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
4439 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4441 if (HOST_BITS_PER_LONG == 64)
4443 image0 = (image0 << 31 << 1) | image1;
4444 image0 <<= 64 - 53;
4445 image0 |= SIG_MSB;
4446 r->sig[SIGSZ-1] = image0;
4448 else
4450 r->sig[SIGSZ-1] = image0;
4451 r->sig[SIGSZ-2] = image1;
4452 lshift_significand (r, r, 64 - 53);
4453 r->sig[SIGSZ-1] |= SIG_MSB;
4458 const struct real_format vax_f_format =
4460 encode_vax_f,
4461 decode_vax_f,
4465 -127,
4466 127,
4469 false,
4470 false,
4471 false,
4472 false,
4473 false,
4474 false,
4475 false,
4476 false,
4477 "vax_f"
4480 const struct real_format vax_d_format =
4482 encode_vax_d,
4483 decode_vax_d,
4487 -127,
4488 127,
4491 false,
4492 false,
4493 false,
4494 false,
4495 false,
4496 false,
4497 false,
4498 false,
4499 "vax_d"
4502 const struct real_format vax_g_format =
4504 encode_vax_g,
4505 decode_vax_g,
4509 -1023,
4510 1023,
4513 false,
4514 false,
4515 false,
4516 false,
4517 false,
4518 false,
4519 false,
4520 false,
4521 "vax_g"
4524 /* Encode real R into a single precision DFP value in BUF. */
4525 static void
4526 encode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4527 long *buf ATTRIBUTE_UNUSED,
4528 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4530 encode_decimal32 (fmt, buf, r);
4533 /* Decode a single precision DFP value in BUF into a real R. */
4534 static void
4535 decode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4536 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4537 const long *buf ATTRIBUTE_UNUSED)
4539 decode_decimal32 (fmt, r, buf);
4542 /* Encode real R into a double precision DFP value in BUF. */
4543 static void
4544 encode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4545 long *buf ATTRIBUTE_UNUSED,
4546 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4548 encode_decimal64 (fmt, buf, r);
4551 /* Decode a double precision DFP value in BUF into a real R. */
4552 static void
4553 decode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4554 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4555 const long *buf ATTRIBUTE_UNUSED)
4557 decode_decimal64 (fmt, r, buf);
4560 /* Encode real R into a quad precision DFP value in BUF. */
4561 static void
4562 encode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4563 long *buf ATTRIBUTE_UNUSED,
4564 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4566 encode_decimal128 (fmt, buf, r);
4569 /* Decode a quad precision DFP value in BUF into a real R. */
4570 static void
4571 decode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4572 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4573 const long *buf ATTRIBUTE_UNUSED)
4575 decode_decimal128 (fmt, r, buf);
4578 /* Single precision decimal floating point (IEEE 754). */
4579 const struct real_format decimal_single_format =
4581 encode_decimal_single,
4582 decode_decimal_single,
4586 -94,
4590 false,
4591 true,
4592 true,
4593 true,
4594 true,
4595 true,
4596 true,
4597 false,
4598 "decimal_single"
4601 /* Double precision decimal floating point (IEEE 754). */
4602 const struct real_format decimal_double_format =
4604 encode_decimal_double,
4605 decode_decimal_double,
4609 -382,
4610 385,
4613 false,
4614 true,
4615 true,
4616 true,
4617 true,
4618 true,
4619 true,
4620 false,
4621 "decimal_double"
4624 /* Quad precision decimal floating point (IEEE 754). */
4625 const struct real_format decimal_quad_format =
4627 encode_decimal_quad,
4628 decode_decimal_quad,
4632 -6142,
4633 6145,
4634 127,
4635 127,
4636 false,
4637 true,
4638 true,
4639 true,
4640 true,
4641 true,
4642 true,
4643 false,
4644 "decimal_quad"
4647 /* Encode half-precision floats. This routine is used both for the IEEE
4648 ARM alternative encodings. */
4649 static void
4650 encode_ieee_half (const struct real_format *fmt, long *buf,
4651 const REAL_VALUE_TYPE *r)
4653 unsigned long image, sig, exp;
4654 unsigned long sign = r->sign;
4655 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
4657 image = sign << 15;
4658 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 11)) & 0x3ff;
4660 switch (r->cl)
4662 case rvc_zero:
4663 break;
4665 case rvc_inf:
4666 if (fmt->has_inf)
4667 image |= 31 << 10;
4668 else
4669 image |= 0x7fff;
4670 break;
4672 case rvc_nan:
4673 if (fmt->has_nans)
4675 if (r->canonical)
4676 sig = (fmt->canonical_nan_lsbs_set ? (1 << 9) - 1 : 0);
4677 if (r->signalling == fmt->qnan_msb_set)
4678 sig &= ~(1 << 9);
4679 else
4680 sig |= 1 << 9;
4681 if (sig == 0)
4682 sig = 1 << 8;
4684 image |= 31 << 10;
4685 image |= sig;
4687 else
4688 image |= 0x3ff;
4689 break;
4691 case rvc_normal:
4692 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
4693 whereas the intermediate representation is 0.F x 2**exp.
4694 Which means we're off by one. */
4695 if (denormal)
4696 exp = 0;
4697 else
4698 exp = REAL_EXP (r) + 15 - 1;
4699 image |= exp << 10;
4700 image |= sig;
4701 break;
4703 default:
4704 gcc_unreachable ();
4707 buf[0] = image;
4710 /* Decode half-precision floats. This routine is used both for the IEEE
4711 ARM alternative encodings. */
4712 static void
4713 decode_ieee_half (const struct real_format *fmt, REAL_VALUE_TYPE *r,
4714 const long *buf)
4716 unsigned long image = buf[0] & 0xffff;
4717 bool sign = (image >> 15) & 1;
4718 int exp = (image >> 10) & 0x1f;
4720 memset (r, 0, sizeof (*r));
4721 image <<= HOST_BITS_PER_LONG - 11;
4722 image &= ~SIG_MSB;
4724 if (exp == 0)
4726 if (image && fmt->has_denorm)
4728 r->cl = rvc_normal;
4729 r->sign = sign;
4730 SET_REAL_EXP (r, -14);
4731 r->sig[SIGSZ-1] = image << 1;
4732 normalize (r);
4734 else if (fmt->has_signed_zero)
4735 r->sign = sign;
4737 else if (exp == 31 && (fmt->has_nans || fmt->has_inf))
4739 if (image)
4741 r->cl = rvc_nan;
4742 r->sign = sign;
4743 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
4744 ^ fmt->qnan_msb_set);
4745 r->sig[SIGSZ-1] = image;
4747 else
4749 r->cl = rvc_inf;
4750 r->sign = sign;
4753 else
4755 r->cl = rvc_normal;
4756 r->sign = sign;
4757 SET_REAL_EXP (r, exp - 15 + 1);
4758 r->sig[SIGSZ-1] = image | SIG_MSB;
4762 /* Half-precision format, as specified in IEEE 754R. */
4763 const struct real_format ieee_half_format =
4765 encode_ieee_half,
4766 decode_ieee_half,
4770 -13,
4774 false,
4775 true,
4776 true,
4777 true,
4778 true,
4779 true,
4780 true,
4781 false,
4782 "ieee_half"
4785 /* ARM's alternative half-precision format, similar to IEEE but with
4786 no reserved exponent value for NaNs and infinities; rather, it just
4787 extends the range of exponents by one. */
4788 const struct real_format arm_half_format =
4790 encode_ieee_half,
4791 decode_ieee_half,
4795 -13,
4799 false,
4800 true,
4801 false,
4802 false,
4803 true,
4804 true,
4805 false,
4806 false,
4807 "arm_half"
4810 /* A synthetic "format" for internal arithmetic. It's the size of the
4811 internal significand minus the two bits needed for proper rounding.
4812 The encode and decode routines exist only to satisfy our paranoia
4813 harness. */
4815 static void encode_internal (const struct real_format *fmt,
4816 long *, const REAL_VALUE_TYPE *);
4817 static void decode_internal (const struct real_format *,
4818 REAL_VALUE_TYPE *, const long *);
4820 static void
4821 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4822 const REAL_VALUE_TYPE *r)
4824 memcpy (buf, r, sizeof (*r));
4827 static void
4828 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4829 REAL_VALUE_TYPE *r, const long *buf)
4831 memcpy (r, buf, sizeof (*r));
4834 const struct real_format real_internal_format =
4836 encode_internal,
4837 decode_internal,
4839 SIGNIFICAND_BITS - 2,
4840 SIGNIFICAND_BITS - 2,
4841 -MAX_EXP,
4842 MAX_EXP,
4845 false,
4846 false,
4847 true,
4848 true,
4849 false,
4850 true,
4851 true,
4852 false,
4853 "real_internal"
4856 /* Calculate X raised to the integer exponent N in mode MODE and store
4857 the result in R. Return true if the result may be inexact due to
4858 loss of precision. The algorithm is the classic "left-to-right binary
4859 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4860 Algorithms", "The Art of Computer Programming", Volume 2. */
4862 bool
4863 real_powi (REAL_VALUE_TYPE *r, machine_mode mode,
4864 const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4866 unsigned HOST_WIDE_INT bit;
4867 REAL_VALUE_TYPE t;
4868 bool inexact = false;
4869 bool init = false;
4870 bool neg;
4871 int i;
4873 if (n == 0)
4875 *r = dconst1;
4876 return false;
4878 else if (n < 0)
4880 /* Don't worry about overflow, from now on n is unsigned. */
4881 neg = true;
4882 n = -n;
4884 else
4885 neg = false;
4887 t = *x;
4888 bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4889 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4891 if (init)
4893 inexact |= do_multiply (&t, &t, &t);
4894 if (n & bit)
4895 inexact |= do_multiply (&t, &t, x);
4897 else if (n & bit)
4898 init = true;
4899 bit >>= 1;
4902 if (neg)
4903 inexact |= do_divide (&t, &dconst1, &t);
4905 real_convert (r, mode, &t);
4906 return inexact;
4909 /* Round X to the nearest integer not larger in absolute value, i.e.
4910 towards zero, placing the result in R in mode MODE. */
4912 void
4913 real_trunc (REAL_VALUE_TYPE *r, machine_mode mode,
4914 const REAL_VALUE_TYPE *x)
4916 do_fix_trunc (r, x);
4917 if (mode != VOIDmode)
4918 real_convert (r, mode, r);
4921 /* Round X to the largest integer not greater in value, i.e. round
4922 down, placing the result in R in mode MODE. */
4924 void
4925 real_floor (REAL_VALUE_TYPE *r, machine_mode mode,
4926 const REAL_VALUE_TYPE *x)
4928 REAL_VALUE_TYPE t;
4930 do_fix_trunc (&t, x);
4931 if (! real_identical (&t, x) && x->sign)
4932 do_add (&t, &t, &dconstm1, 0);
4933 if (mode != VOIDmode)
4934 real_convert (r, mode, &t);
4935 else
4936 *r = t;
4939 /* Round X to the smallest integer not less then argument, i.e. round
4940 up, placing the result in R in mode MODE. */
4942 void
4943 real_ceil (REAL_VALUE_TYPE *r, machine_mode mode,
4944 const REAL_VALUE_TYPE *x)
4946 REAL_VALUE_TYPE t;
4948 do_fix_trunc (&t, x);
4949 if (! real_identical (&t, x) && ! x->sign)
4950 do_add (&t, &t, &dconst1, 0);
4951 if (mode != VOIDmode)
4952 real_convert (r, mode, &t);
4953 else
4954 *r = t;
4957 /* Round X to the nearest integer, but round halfway cases away from
4958 zero. */
4960 void
4961 real_round (REAL_VALUE_TYPE *r, machine_mode mode,
4962 const REAL_VALUE_TYPE *x)
4964 do_add (r, x, &dconsthalf, x->sign);
4965 do_fix_trunc (r, r);
4966 if (mode != VOIDmode)
4967 real_convert (r, mode, r);
4970 /* Set the sign of R to the sign of X. */
4972 void
4973 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
4975 r->sign = x->sign;
4978 /* Check whether the real constant value given is an integer. */
4980 bool
4981 real_isinteger (const REAL_VALUE_TYPE *c, machine_mode mode)
4983 REAL_VALUE_TYPE cint;
4985 real_trunc (&cint, mode, c);
4986 return real_identical (c, &cint);
4989 /* Write into BUF the maximum representable finite floating-point
4990 number, (1 - b**-p) * b**emax for a given FP format FMT as a hex
4991 float string. LEN is the size of BUF, and the buffer must be large
4992 enough to contain the resulting string. */
4994 void
4995 get_max_float (const struct real_format *fmt, char *buf, size_t len)
4997 int i, n;
4998 char *p;
5000 strcpy (buf, "0x0.");
5001 n = fmt->p;
5002 for (i = 0, p = buf + 4; i + 3 < n; i += 4)
5003 *p++ = 'f';
5004 if (i < n)
5005 *p++ = "08ce"[n - i];
5006 sprintf (p, "p%d", fmt->emax);
5007 if (fmt->pnan < fmt->p)
5009 /* This is an IBM extended double format made up of two IEEE
5010 doubles. The value of the long double is the sum of the
5011 values of the two parts. The most significant part is
5012 required to be the value of the long double rounded to the
5013 nearest double. Rounding means we need a slightly smaller
5014 value for LDBL_MAX. */
5015 buf[4 + fmt->pnan / 4] = "7bde"[fmt->pnan % 4];
5018 gcc_assert (strlen (buf) < len);
5021 /* True if mode M has a NaN representation and
5022 the treatment of NaN operands is important. */
5024 bool
5025 HONOR_NANS (machine_mode m)
5027 return MODE_HAS_NANS (m) && !flag_finite_math_only;
5030 bool
5031 HONOR_NANS (const_tree t)
5033 return HONOR_NANS (element_mode (t));
5036 bool
5037 HONOR_NANS (const_rtx x)
5039 return HONOR_NANS (GET_MODE (x));
5042 /* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs). */
5044 bool
5045 HONOR_SNANS (machine_mode m)
5047 return flag_signaling_nans && HONOR_NANS (m);
5050 bool
5051 HONOR_SNANS (const_tree t)
5053 return HONOR_SNANS (element_mode (t));
5056 bool
5057 HONOR_SNANS (const_rtx x)
5059 return HONOR_SNANS (GET_MODE (x));
5062 /* As for HONOR_NANS, but true if the mode can represent infinity and
5063 the treatment of infinite values is important. */
5065 bool
5066 HONOR_INFINITIES (machine_mode m)
5068 return MODE_HAS_INFINITIES (m) && !flag_finite_math_only;
5071 bool
5072 HONOR_INFINITIES (const_tree t)
5074 return HONOR_INFINITIES (element_mode (t));
5077 bool
5078 HONOR_INFINITIES (const_rtx x)
5080 return HONOR_INFINITIES (GET_MODE (x));
5083 /* Like HONOR_NANS, but true if the given mode distinguishes between
5084 positive and negative zero, and the sign of zero is important. */
5086 bool
5087 HONOR_SIGNED_ZEROS (machine_mode m)
5089 return MODE_HAS_SIGNED_ZEROS (m) && flag_signed_zeros;
5092 bool
5093 HONOR_SIGNED_ZEROS (const_tree t)
5095 return HONOR_SIGNED_ZEROS (element_mode (t));
5098 bool
5099 HONOR_SIGNED_ZEROS (const_rtx x)
5101 return HONOR_SIGNED_ZEROS (GET_MODE (x));
5104 /* Like HONOR_NANS, but true if given mode supports sign-dependent rounding,
5105 and the rounding mode is important. */
5107 bool
5108 HONOR_SIGN_DEPENDENT_ROUNDING (machine_mode m)
5110 return MODE_HAS_SIGN_DEPENDENT_ROUNDING (m) && flag_rounding_math;
5113 bool
5114 HONOR_SIGN_DEPENDENT_ROUNDING (const_tree t)
5116 return HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (t));
5119 bool
5120 HONOR_SIGN_DEPENDENT_ROUNDING (const_rtx x)
5122 return HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (x));