commit changelogs for previous change
[official-gcc.git] / gcc / real.c
blob5d5b12ff7e82baf54ef2edf8591c5dffb45614dc
1 /* real.c - software floating point emulation.
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4 Contributed by Stephen L. Moshier (moshier@world.std.com).
5 Re-written by Richard Henderson <rth@redhat.com>
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
22 02110-1301, USA. */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "toplev.h"
30 #include "real.h"
31 #include "tm_p.h"
32 #include "dfp.h"
34 /* The floating point model used internally is not exactly IEEE 754
35 compliant, and close to the description in the ISO C99 standard,
36 section 5.2.4.2.2 Characteristics of floating types.
38 Specifically
40 x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
42 where
43 s = sign (+- 1)
44 b = base or radix, here always 2
45 e = exponent
46 p = precision (the number of base-b digits in the significand)
47 f_k = the digits of the significand.
49 We differ from typical IEEE 754 encodings in that the entire
50 significand is fractional. Normalized significands are in the
51 range [0.5, 1.0).
53 A requirement of the model is that P be larger than the largest
54 supported target floating-point type by at least 2 bits. This gives
55 us proper rounding when we truncate to the target type. In addition,
56 E must be large enough to hold the smallest supported denormal number
57 in a normalized form.
59 Both of these requirements are easily satisfied. The largest target
60 significand is 113 bits; we store at least 160. The smallest
61 denormal number fits in 17 exponent bits; we store 27.
63 Note that the decimal string conversion routines are sensitive to
64 rounding errors. Since the raw arithmetic routines do not themselves
65 have guard digits or rounding, the computation of 10**exp can
66 accumulate more than a few digits of error. The previous incarnation
67 of real.c successfully used a 144-bit fraction; given the current
68 layout of REAL_VALUE_TYPE we're forced to expand to at least 160 bits.
70 Target floating point models that use base 16 instead of base 2
71 (i.e. IBM 370), are handled during round_for_format, in which we
72 canonicalize the exponent to be a multiple of 4 (log2(16)), and
73 adjust the significand to match. */
76 /* Used to classify two numbers simultaneously. */
77 #define CLASS2(A, B) ((A) << 2 | (B))
79 #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
80 #error "Some constant folding done by hand to avoid shift count warnings"
81 #endif
83 static void get_zero (REAL_VALUE_TYPE *, int);
84 static void get_canonical_qnan (REAL_VALUE_TYPE *, int);
85 static void get_canonical_snan (REAL_VALUE_TYPE *, int);
86 static void get_inf (REAL_VALUE_TYPE *, int);
87 static bool sticky_rshift_significand (REAL_VALUE_TYPE *,
88 const REAL_VALUE_TYPE *, unsigned int);
89 static void rshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
90 unsigned int);
91 static void lshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
92 unsigned int);
93 static void lshift_significand_1 (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
94 static bool add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *,
95 const REAL_VALUE_TYPE *);
96 static bool sub_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
97 const REAL_VALUE_TYPE *, int);
98 static void neg_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
99 static int cmp_significands (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
100 static int cmp_significand_0 (const REAL_VALUE_TYPE *);
101 static void set_significand_bit (REAL_VALUE_TYPE *, unsigned int);
102 static void clear_significand_bit (REAL_VALUE_TYPE *, unsigned int);
103 static bool test_significand_bit (REAL_VALUE_TYPE *, unsigned int);
104 static void clear_significand_below (REAL_VALUE_TYPE *, unsigned int);
105 static bool div_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
106 const REAL_VALUE_TYPE *);
107 static void normalize (REAL_VALUE_TYPE *);
109 static bool do_add (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
110 const REAL_VALUE_TYPE *, int);
111 static bool do_multiply (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
112 const REAL_VALUE_TYPE *);
113 static bool do_divide (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
114 const REAL_VALUE_TYPE *);
115 static int do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
116 static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
118 static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *);
120 static const REAL_VALUE_TYPE * ten_to_ptwo (int);
121 static const REAL_VALUE_TYPE * ten_to_mptwo (int);
122 static const REAL_VALUE_TYPE * real_digit (int);
123 static void times_pten (REAL_VALUE_TYPE *, int);
125 static void round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
127 /* Initialize R with a positive zero. */
129 static inline void
130 get_zero (REAL_VALUE_TYPE *r, int sign)
132 memset (r, 0, sizeof (*r));
133 r->sign = sign;
136 /* Initialize R with the canonical quiet NaN. */
138 static inline void
139 get_canonical_qnan (REAL_VALUE_TYPE *r, int sign)
141 memset (r, 0, sizeof (*r));
142 r->cl = rvc_nan;
143 r->sign = sign;
144 r->canonical = 1;
147 static inline void
148 get_canonical_snan (REAL_VALUE_TYPE *r, int sign)
150 memset (r, 0, sizeof (*r));
151 r->cl = rvc_nan;
152 r->sign = sign;
153 r->signalling = 1;
154 r->canonical = 1;
157 static inline void
158 get_inf (REAL_VALUE_TYPE *r, int sign)
160 memset (r, 0, sizeof (*r));
161 r->cl = rvc_inf;
162 r->sign = sign;
166 /* Right-shift the significand of A by N bits; put the result in the
167 significand of R. If any one bits are shifted out, return true. */
169 static bool
170 sticky_rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
171 unsigned int n)
173 unsigned long sticky = 0;
174 unsigned int i, ofs = 0;
176 if (n >= HOST_BITS_PER_LONG)
178 for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i)
179 sticky |= a->sig[i];
180 n &= HOST_BITS_PER_LONG - 1;
183 if (n != 0)
185 sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1);
186 for (i = 0; i < SIGSZ; ++i)
188 r->sig[i]
189 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
190 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
191 << (HOST_BITS_PER_LONG - n)));
194 else
196 for (i = 0; ofs + i < SIGSZ; ++i)
197 r->sig[i] = a->sig[ofs + i];
198 for (; i < SIGSZ; ++i)
199 r->sig[i] = 0;
202 return sticky != 0;
205 /* Right-shift the significand of A by N bits; put the result in the
206 significand of R. */
208 static void
209 rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
210 unsigned int n)
212 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
214 n &= HOST_BITS_PER_LONG - 1;
215 if (n != 0)
217 for (i = 0; i < SIGSZ; ++i)
219 r->sig[i]
220 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
221 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
222 << (HOST_BITS_PER_LONG - n)));
225 else
227 for (i = 0; ofs + i < SIGSZ; ++i)
228 r->sig[i] = a->sig[ofs + i];
229 for (; i < SIGSZ; ++i)
230 r->sig[i] = 0;
234 /* Left-shift the significand of A by N bits; put the result in the
235 significand of R. */
237 static void
238 lshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
239 unsigned int n)
241 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
243 n &= HOST_BITS_PER_LONG - 1;
244 if (n == 0)
246 for (i = 0; ofs + i < SIGSZ; ++i)
247 r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs];
248 for (; i < SIGSZ; ++i)
249 r->sig[SIGSZ-1-i] = 0;
251 else
252 for (i = 0; i < SIGSZ; ++i)
254 r->sig[SIGSZ-1-i]
255 = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n)
256 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1])
257 >> (HOST_BITS_PER_LONG - n)));
261 /* Likewise, but N is specialized to 1. */
263 static inline void
264 lshift_significand_1 (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
266 unsigned int i;
268 for (i = SIGSZ - 1; i > 0; --i)
269 r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1));
270 r->sig[0] = a->sig[0] << 1;
273 /* Add the significands of A and B, placing the result in R. Return
274 true if there was carry out of the most significant word. */
276 static inline bool
277 add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
278 const REAL_VALUE_TYPE *b)
280 bool carry = false;
281 int i;
283 for (i = 0; i < SIGSZ; ++i)
285 unsigned long ai = a->sig[i];
286 unsigned long ri = ai + b->sig[i];
288 if (carry)
290 carry = ri < ai;
291 carry |= ++ri == 0;
293 else
294 carry = ri < ai;
296 r->sig[i] = ri;
299 return carry;
302 /* Subtract the significands of A and B, placing the result in R. CARRY is
303 true if there's a borrow incoming to the least significant word.
304 Return true if there was borrow out of the most significant word. */
306 static inline bool
307 sub_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
308 const REAL_VALUE_TYPE *b, int carry)
310 int i;
312 for (i = 0; i < SIGSZ; ++i)
314 unsigned long ai = a->sig[i];
315 unsigned long ri = ai - b->sig[i];
317 if (carry)
319 carry = ri > ai;
320 carry |= ~--ri == 0;
322 else
323 carry = ri > ai;
325 r->sig[i] = ri;
328 return carry;
331 /* Negate the significand A, placing the result in R. */
333 static inline void
334 neg_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
336 bool carry = true;
337 int i;
339 for (i = 0; i < SIGSZ; ++i)
341 unsigned long ri, ai = a->sig[i];
343 if (carry)
345 if (ai)
347 ri = -ai;
348 carry = false;
350 else
351 ri = ai;
353 else
354 ri = ~ai;
356 r->sig[i] = ri;
360 /* Compare significands. Return tri-state vs zero. */
362 static inline int
363 cmp_significands (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
365 int i;
367 for (i = SIGSZ - 1; i >= 0; --i)
369 unsigned long ai = a->sig[i];
370 unsigned long bi = b->sig[i];
372 if (ai > bi)
373 return 1;
374 if (ai < bi)
375 return -1;
378 return 0;
381 /* Return true if A is nonzero. */
383 static inline int
384 cmp_significand_0 (const REAL_VALUE_TYPE *a)
386 int i;
388 for (i = SIGSZ - 1; i >= 0; --i)
389 if (a->sig[i])
390 return 1;
392 return 0;
395 /* Set bit N of the significand of R. */
397 static inline void
398 set_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
400 r->sig[n / HOST_BITS_PER_LONG]
401 |= (unsigned long)1 << (n % HOST_BITS_PER_LONG);
404 /* Clear bit N of the significand of R. */
406 static inline void
407 clear_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
409 r->sig[n / HOST_BITS_PER_LONG]
410 &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG));
413 /* Test bit N of the significand of R. */
415 static inline bool
416 test_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
418 /* ??? Compiler bug here if we return this expression directly.
419 The conversion to bool strips the "&1" and we wind up testing
420 e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */
421 int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1;
422 return t;
425 /* Clear bits 0..N-1 of the significand of R. */
427 static void
428 clear_significand_below (REAL_VALUE_TYPE *r, unsigned int n)
430 int i, w = n / HOST_BITS_PER_LONG;
432 for (i = 0; i < w; ++i)
433 r->sig[i] = 0;
435 r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1);
438 /* Divide the significands of A and B, placing the result in R. Return
439 true if the division was inexact. */
441 static inline bool
442 div_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
443 const REAL_VALUE_TYPE *b)
445 REAL_VALUE_TYPE u;
446 int i, bit = SIGNIFICAND_BITS - 1;
447 unsigned long msb, inexact;
449 u = *a;
450 memset (r->sig, 0, sizeof (r->sig));
452 msb = 0;
453 goto start;
456 msb = u.sig[SIGSZ-1] & SIG_MSB;
457 lshift_significand_1 (&u, &u);
458 start:
459 if (msb || cmp_significands (&u, b) >= 0)
461 sub_significands (&u, &u, b, 0);
462 set_significand_bit (r, bit);
465 while (--bit >= 0);
467 for (i = 0, inexact = 0; i < SIGSZ; i++)
468 inexact |= u.sig[i];
470 return inexact != 0;
473 /* Adjust the exponent and significand of R such that the most
474 significant bit is set. We underflow to zero and overflow to
475 infinity here, without denormals. (The intermediate representation
476 exponent is large enough to handle target denormals normalized.) */
478 static void
479 normalize (REAL_VALUE_TYPE *r)
481 int shift = 0, exp;
482 int i, j;
484 if (r->decimal)
485 return;
487 /* Find the first word that is nonzero. */
488 for (i = SIGSZ - 1; i >= 0; i--)
489 if (r->sig[i] == 0)
490 shift += HOST_BITS_PER_LONG;
491 else
492 break;
494 /* Zero significand flushes to zero. */
495 if (i < 0)
497 r->cl = rvc_zero;
498 SET_REAL_EXP (r, 0);
499 return;
502 /* Find the first bit that is nonzero. */
503 for (j = 0; ; j++)
504 if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j)))
505 break;
506 shift += j;
508 if (shift > 0)
510 exp = REAL_EXP (r) - shift;
511 if (exp > MAX_EXP)
512 get_inf (r, r->sign);
513 else if (exp < -MAX_EXP)
514 get_zero (r, r->sign);
515 else
517 SET_REAL_EXP (r, exp);
518 lshift_significand (r, r, shift);
523 /* Calculate R = A + (SUBTRACT_P ? -B : B). Return true if the
524 result may be inexact due to a loss of precision. */
526 static bool
527 do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
528 const REAL_VALUE_TYPE *b, int subtract_p)
530 int dexp, sign, exp;
531 REAL_VALUE_TYPE t;
532 bool inexact = false;
534 /* Determine if we need to add or subtract. */
535 sign = a->sign;
536 subtract_p = (sign ^ b->sign) ^ subtract_p;
538 switch (CLASS2 (a->cl, b->cl))
540 case CLASS2 (rvc_zero, rvc_zero):
541 /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0. */
542 get_zero (r, sign & !subtract_p);
543 return false;
545 case CLASS2 (rvc_zero, rvc_normal):
546 case CLASS2 (rvc_zero, rvc_inf):
547 case CLASS2 (rvc_zero, rvc_nan):
548 /* 0 + ANY = ANY. */
549 case CLASS2 (rvc_normal, rvc_nan):
550 case CLASS2 (rvc_inf, rvc_nan):
551 case CLASS2 (rvc_nan, rvc_nan):
552 /* ANY + NaN = NaN. */
553 case CLASS2 (rvc_normal, rvc_inf):
554 /* R + Inf = Inf. */
555 *r = *b;
556 r->sign = sign ^ subtract_p;
557 return false;
559 case CLASS2 (rvc_normal, rvc_zero):
560 case CLASS2 (rvc_inf, rvc_zero):
561 case CLASS2 (rvc_nan, rvc_zero):
562 /* ANY + 0 = ANY. */
563 case CLASS2 (rvc_nan, rvc_normal):
564 case CLASS2 (rvc_nan, rvc_inf):
565 /* NaN + ANY = NaN. */
566 case CLASS2 (rvc_inf, rvc_normal):
567 /* Inf + R = Inf. */
568 *r = *a;
569 return false;
571 case CLASS2 (rvc_inf, rvc_inf):
572 if (subtract_p)
573 /* Inf - Inf = NaN. */
574 get_canonical_qnan (r, 0);
575 else
576 /* Inf + Inf = Inf. */
577 *r = *a;
578 return false;
580 case CLASS2 (rvc_normal, rvc_normal):
581 break;
583 default:
584 gcc_unreachable ();
587 /* Swap the arguments such that A has the larger exponent. */
588 dexp = REAL_EXP (a) - REAL_EXP (b);
589 if (dexp < 0)
591 const REAL_VALUE_TYPE *t;
592 t = a, a = b, b = t;
593 dexp = -dexp;
594 sign ^= subtract_p;
596 exp = REAL_EXP (a);
598 /* If the exponents are not identical, we need to shift the
599 significand of B down. */
600 if (dexp > 0)
602 /* If the exponents are too far apart, the significands
603 do not overlap, which makes the subtraction a noop. */
604 if (dexp >= SIGNIFICAND_BITS)
606 *r = *a;
607 r->sign = sign;
608 return true;
611 inexact |= sticky_rshift_significand (&t, b, dexp);
612 b = &t;
615 if (subtract_p)
617 if (sub_significands (r, a, b, inexact))
619 /* We got a borrow out of the subtraction. That means that
620 A and B had the same exponent, and B had the larger
621 significand. We need to swap the sign and negate the
622 significand. */
623 sign ^= 1;
624 neg_significand (r, r);
627 else
629 if (add_significands (r, a, b))
631 /* We got carry out of the addition. This means we need to
632 shift the significand back down one bit and increase the
633 exponent. */
634 inexact |= sticky_rshift_significand (r, r, 1);
635 r->sig[SIGSZ-1] |= SIG_MSB;
636 if (++exp > MAX_EXP)
638 get_inf (r, sign);
639 return true;
644 r->cl = rvc_normal;
645 r->sign = sign;
646 SET_REAL_EXP (r, exp);
647 /* Zero out the remaining fields. */
648 r->signalling = 0;
649 r->canonical = 0;
650 r->decimal = 0;
652 /* Re-normalize the result. */
653 normalize (r);
655 /* Special case: if the subtraction results in zero, the result
656 is positive. */
657 if (r->cl == rvc_zero)
658 r->sign = 0;
659 else
660 r->sig[0] |= inexact;
662 return inexact;
665 /* Calculate R = A * B. Return true if the result may be inexact. */
667 static bool
668 do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
669 const REAL_VALUE_TYPE *b)
671 REAL_VALUE_TYPE u, t, *rr;
672 unsigned int i, j, k;
673 int sign = a->sign ^ b->sign;
674 bool inexact = false;
676 switch (CLASS2 (a->cl, b->cl))
678 case CLASS2 (rvc_zero, rvc_zero):
679 case CLASS2 (rvc_zero, rvc_normal):
680 case CLASS2 (rvc_normal, rvc_zero):
681 /* +-0 * ANY = 0 with appropriate sign. */
682 get_zero (r, sign);
683 return false;
685 case CLASS2 (rvc_zero, rvc_nan):
686 case CLASS2 (rvc_normal, rvc_nan):
687 case CLASS2 (rvc_inf, rvc_nan):
688 case CLASS2 (rvc_nan, rvc_nan):
689 /* ANY * NaN = NaN. */
690 *r = *b;
691 r->sign = sign;
692 return false;
694 case CLASS2 (rvc_nan, rvc_zero):
695 case CLASS2 (rvc_nan, rvc_normal):
696 case CLASS2 (rvc_nan, rvc_inf):
697 /* NaN * ANY = NaN. */
698 *r = *a;
699 r->sign = sign;
700 return false;
702 case CLASS2 (rvc_zero, rvc_inf):
703 case CLASS2 (rvc_inf, rvc_zero):
704 /* 0 * Inf = NaN */
705 get_canonical_qnan (r, sign);
706 return false;
708 case CLASS2 (rvc_inf, rvc_inf):
709 case CLASS2 (rvc_normal, rvc_inf):
710 case CLASS2 (rvc_inf, rvc_normal):
711 /* Inf * Inf = Inf, R * Inf = Inf */
712 get_inf (r, sign);
713 return false;
715 case CLASS2 (rvc_normal, rvc_normal):
716 break;
718 default:
719 gcc_unreachable ();
722 if (r == a || r == b)
723 rr = &t;
724 else
725 rr = r;
726 get_zero (rr, 0);
728 /* Collect all the partial products. Since we don't have sure access
729 to a widening multiply, we split each long into two half-words.
731 Consider the long-hand form of a four half-word multiplication:
733 A B C D
734 * E F G H
735 --------------
736 DE DF DG DH
737 CE CF CG CH
738 BE BF BG BH
739 AE AF AG AH
741 We construct partial products of the widened half-word products
742 that are known to not overlap, e.g. DF+DH. Each such partial
743 product is given its proper exponent, which allows us to sum them
744 and obtain the finished product. */
746 for (i = 0; i < SIGSZ * 2; ++i)
748 unsigned long ai = a->sig[i / 2];
749 if (i & 1)
750 ai >>= HOST_BITS_PER_LONG / 2;
751 else
752 ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
754 if (ai == 0)
755 continue;
757 for (j = 0; j < 2; ++j)
759 int exp = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
760 + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2)));
762 if (exp > MAX_EXP)
764 get_inf (r, sign);
765 return true;
767 if (exp < -MAX_EXP)
769 /* Would underflow to zero, which we shouldn't bother adding. */
770 inexact = true;
771 continue;
774 memset (&u, 0, sizeof (u));
775 u.cl = rvc_normal;
776 SET_REAL_EXP (&u, exp);
778 for (k = j; k < SIGSZ * 2; k += 2)
780 unsigned long bi = b->sig[k / 2];
781 if (k & 1)
782 bi >>= HOST_BITS_PER_LONG / 2;
783 else
784 bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
786 u.sig[k / 2] = ai * bi;
789 normalize (&u);
790 inexact |= do_add (rr, rr, &u, 0);
794 rr->sign = sign;
795 if (rr != r)
796 *r = t;
798 return inexact;
801 /* Calculate R = A / B. Return true if the result may be inexact. */
803 static bool
804 do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
805 const REAL_VALUE_TYPE *b)
807 int exp, sign = a->sign ^ b->sign;
808 REAL_VALUE_TYPE t, *rr;
809 bool inexact;
811 switch (CLASS2 (a->cl, b->cl))
813 case CLASS2 (rvc_zero, rvc_zero):
814 /* 0 / 0 = NaN. */
815 case CLASS2 (rvc_inf, rvc_inf):
816 /* Inf / Inf = NaN. */
817 get_canonical_qnan (r, sign);
818 return false;
820 case CLASS2 (rvc_zero, rvc_normal):
821 case CLASS2 (rvc_zero, rvc_inf):
822 /* 0 / ANY = 0. */
823 case CLASS2 (rvc_normal, rvc_inf):
824 /* R / Inf = 0. */
825 get_zero (r, sign);
826 return false;
828 case CLASS2 (rvc_normal, rvc_zero):
829 /* R / 0 = Inf. */
830 case CLASS2 (rvc_inf, rvc_zero):
831 /* Inf / 0 = Inf. */
832 get_inf (r, sign);
833 return false;
835 case CLASS2 (rvc_zero, rvc_nan):
836 case CLASS2 (rvc_normal, rvc_nan):
837 case CLASS2 (rvc_inf, rvc_nan):
838 case CLASS2 (rvc_nan, rvc_nan):
839 /* ANY / NaN = NaN. */
840 *r = *b;
841 r->sign = sign;
842 return false;
844 case CLASS2 (rvc_nan, rvc_zero):
845 case CLASS2 (rvc_nan, rvc_normal):
846 case CLASS2 (rvc_nan, rvc_inf):
847 /* NaN / ANY = NaN. */
848 *r = *a;
849 r->sign = sign;
850 return false;
852 case CLASS2 (rvc_inf, rvc_normal):
853 /* Inf / R = Inf. */
854 get_inf (r, sign);
855 return false;
857 case CLASS2 (rvc_normal, rvc_normal):
858 break;
860 default:
861 gcc_unreachable ();
864 if (r == a || r == b)
865 rr = &t;
866 else
867 rr = r;
869 /* Make sure all fields in the result are initialized. */
870 get_zero (rr, 0);
871 rr->cl = rvc_normal;
872 rr->sign = sign;
874 exp = REAL_EXP (a) - REAL_EXP (b) + 1;
875 if (exp > MAX_EXP)
877 get_inf (r, sign);
878 return true;
880 if (exp < -MAX_EXP)
882 get_zero (r, sign);
883 return true;
885 SET_REAL_EXP (rr, exp);
887 inexact = div_significands (rr, a, b);
889 /* Re-normalize the result. */
890 normalize (rr);
891 rr->sig[0] |= inexact;
893 if (rr != r)
894 *r = t;
896 return inexact;
899 /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
900 one of the two operands is a NaN. */
902 static int
903 do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
904 int nan_result)
906 int ret;
908 switch (CLASS2 (a->cl, b->cl))
910 case CLASS2 (rvc_zero, rvc_zero):
911 /* Sign of zero doesn't matter for compares. */
912 return 0;
914 case CLASS2 (rvc_inf, rvc_zero):
915 case CLASS2 (rvc_inf, rvc_normal):
916 case CLASS2 (rvc_normal, rvc_zero):
917 return (a->sign ? -1 : 1);
919 case CLASS2 (rvc_inf, rvc_inf):
920 return -a->sign - -b->sign;
922 case CLASS2 (rvc_zero, rvc_normal):
923 case CLASS2 (rvc_zero, rvc_inf):
924 case CLASS2 (rvc_normal, rvc_inf):
925 return (b->sign ? 1 : -1);
927 case CLASS2 (rvc_zero, rvc_nan):
928 case CLASS2 (rvc_normal, rvc_nan):
929 case CLASS2 (rvc_inf, rvc_nan):
930 case CLASS2 (rvc_nan, rvc_nan):
931 case CLASS2 (rvc_nan, rvc_zero):
932 case CLASS2 (rvc_nan, rvc_normal):
933 case CLASS2 (rvc_nan, rvc_inf):
934 return nan_result;
936 case CLASS2 (rvc_normal, rvc_normal):
937 break;
939 default:
940 gcc_unreachable ();
943 if (a->sign != b->sign)
944 return -a->sign - -b->sign;
946 if (a->decimal || b->decimal)
947 return decimal_do_compare (a, b, nan_result);
949 if (REAL_EXP (a) > REAL_EXP (b))
950 ret = 1;
951 else if (REAL_EXP (a) < REAL_EXP (b))
952 ret = -1;
953 else
954 ret = cmp_significands (a, b);
956 return (a->sign ? -ret : ret);
959 /* Return A truncated to an integral value toward zero. */
961 static void
962 do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
964 *r = *a;
966 switch (r->cl)
968 case rvc_zero:
969 case rvc_inf:
970 case rvc_nan:
971 break;
973 case rvc_normal:
974 if (r->decimal)
976 decimal_do_fix_trunc (r, a);
977 return;
979 if (REAL_EXP (r) <= 0)
980 get_zero (r, r->sign);
981 else if (REAL_EXP (r) < SIGNIFICAND_BITS)
982 clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r));
983 break;
985 default:
986 gcc_unreachable ();
990 /* Perform the binary or unary operation described by CODE.
991 For a unary operation, leave OP1 NULL. This function returns
992 true if the result may be inexact due to loss of precision. */
994 bool
995 real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
996 const REAL_VALUE_TYPE *op1)
998 enum tree_code code = icode;
1000 if (op0->decimal || (op1 && op1->decimal))
1001 return decimal_real_arithmetic (r, icode, op0, op1);
1003 switch (code)
1005 case PLUS_EXPR:
1006 return do_add (r, op0, op1, 0);
1008 case MINUS_EXPR:
1009 return do_add (r, op0, op1, 1);
1011 case MULT_EXPR:
1012 return do_multiply (r, op0, op1);
1014 case RDIV_EXPR:
1015 return do_divide (r, op0, op1);
1017 case MIN_EXPR:
1018 if (op1->cl == rvc_nan)
1019 *r = *op1;
1020 else if (do_compare (op0, op1, -1) < 0)
1021 *r = *op0;
1022 else
1023 *r = *op1;
1024 break;
1026 case MAX_EXPR:
1027 if (op1->cl == rvc_nan)
1028 *r = *op1;
1029 else if (do_compare (op0, op1, 1) < 0)
1030 *r = *op1;
1031 else
1032 *r = *op0;
1033 break;
1035 case NEGATE_EXPR:
1036 *r = *op0;
1037 r->sign ^= 1;
1038 break;
1040 case ABS_EXPR:
1041 *r = *op0;
1042 r->sign = 0;
1043 break;
1045 case FIX_TRUNC_EXPR:
1046 do_fix_trunc (r, op0);
1047 break;
1049 default:
1050 gcc_unreachable ();
1052 return false;
1055 /* Legacy. Similar, but return the result directly. */
1057 REAL_VALUE_TYPE
1058 real_arithmetic2 (int icode, const REAL_VALUE_TYPE *op0,
1059 const REAL_VALUE_TYPE *op1)
1061 REAL_VALUE_TYPE r;
1062 real_arithmetic (&r, icode, op0, op1);
1063 return r;
1066 bool
1067 real_compare (int icode, const REAL_VALUE_TYPE *op0,
1068 const REAL_VALUE_TYPE *op1)
1070 enum tree_code code = icode;
1072 switch (code)
1074 case LT_EXPR:
1075 return do_compare (op0, op1, 1) < 0;
1076 case LE_EXPR:
1077 return do_compare (op0, op1, 1) <= 0;
1078 case GT_EXPR:
1079 return do_compare (op0, op1, -1) > 0;
1080 case GE_EXPR:
1081 return do_compare (op0, op1, -1) >= 0;
1082 case EQ_EXPR:
1083 return do_compare (op0, op1, -1) == 0;
1084 case NE_EXPR:
1085 return do_compare (op0, op1, -1) != 0;
1086 case UNORDERED_EXPR:
1087 return op0->cl == rvc_nan || op1->cl == rvc_nan;
1088 case ORDERED_EXPR:
1089 return op0->cl != rvc_nan && op1->cl != rvc_nan;
1090 case UNLT_EXPR:
1091 return do_compare (op0, op1, -1) < 0;
1092 case UNLE_EXPR:
1093 return do_compare (op0, op1, -1) <= 0;
1094 case UNGT_EXPR:
1095 return do_compare (op0, op1, 1) > 0;
1096 case UNGE_EXPR:
1097 return do_compare (op0, op1, 1) >= 0;
1098 case UNEQ_EXPR:
1099 return do_compare (op0, op1, 0) == 0;
1100 case LTGT_EXPR:
1101 return do_compare (op0, op1, 0) != 0;
1103 default:
1104 gcc_unreachable ();
1108 /* Return floor log2(R). */
1111 real_exponent (const REAL_VALUE_TYPE *r)
1113 switch (r->cl)
1115 case rvc_zero:
1116 return 0;
1117 case rvc_inf:
1118 case rvc_nan:
1119 return (unsigned int)-1 >> 1;
1120 case rvc_normal:
1121 return REAL_EXP (r);
1122 default:
1123 gcc_unreachable ();
1127 /* R = OP0 * 2**EXP. */
1129 void
1130 real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
1132 *r = *op0;
1133 switch (r->cl)
1135 case rvc_zero:
1136 case rvc_inf:
1137 case rvc_nan:
1138 break;
1140 case rvc_normal:
1141 exp += REAL_EXP (op0);
1142 if (exp > MAX_EXP)
1143 get_inf (r, r->sign);
1144 else if (exp < -MAX_EXP)
1145 get_zero (r, r->sign);
1146 else
1147 SET_REAL_EXP (r, exp);
1148 break;
1150 default:
1151 gcc_unreachable ();
1155 /* Determine whether a floating-point value X is infinite. */
1157 bool
1158 real_isinf (const REAL_VALUE_TYPE *r)
1160 return (r->cl == rvc_inf);
1163 /* Determine whether a floating-point value X is a NaN. */
1165 bool
1166 real_isnan (const REAL_VALUE_TYPE *r)
1168 return (r->cl == rvc_nan);
1171 /* Determine whether a floating-point value X is negative. */
1173 bool
1174 real_isneg (const REAL_VALUE_TYPE *r)
1176 return r->sign;
1179 /* Determine whether a floating-point value X is minus zero. */
1181 bool
1182 real_isnegzero (const REAL_VALUE_TYPE *r)
1184 return r->sign && r->cl == rvc_zero;
1187 /* Compare two floating-point objects for bitwise identity. */
1189 bool
1190 real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
1192 int i;
1194 if (a->cl != b->cl)
1195 return false;
1196 if (a->sign != b->sign)
1197 return false;
1199 switch (a->cl)
1201 case rvc_zero:
1202 case rvc_inf:
1203 return true;
1205 case rvc_normal:
1206 if (a->decimal != b->decimal)
1207 return false;
1208 if (REAL_EXP (a) != REAL_EXP (b))
1209 return false;
1210 break;
1212 case rvc_nan:
1213 if (a->signalling != b->signalling)
1214 return false;
1215 /* The significand is ignored for canonical NaNs. */
1216 if (a->canonical || b->canonical)
1217 return a->canonical == b->canonical;
1218 break;
1220 default:
1221 gcc_unreachable ();
1224 for (i = 0; i < SIGSZ; ++i)
1225 if (a->sig[i] != b->sig[i])
1226 return false;
1228 return true;
1231 /* Try to change R into its exact multiplicative inverse in machine
1232 mode MODE. Return true if successful. */
1234 bool
1235 exact_real_inverse (enum machine_mode mode, REAL_VALUE_TYPE *r)
1237 const REAL_VALUE_TYPE *one = real_digit (1);
1238 REAL_VALUE_TYPE u;
1239 int i;
1241 if (r->cl != rvc_normal)
1242 return false;
1244 /* Check for a power of two: all significand bits zero except the MSB. */
1245 for (i = 0; i < SIGSZ-1; ++i)
1246 if (r->sig[i] != 0)
1247 return false;
1248 if (r->sig[SIGSZ-1] != SIG_MSB)
1249 return false;
1251 /* Find the inverse and truncate to the required mode. */
1252 do_divide (&u, one, r);
1253 real_convert (&u, mode, &u);
1255 /* The rounding may have overflowed. */
1256 if (u.cl != rvc_normal)
1257 return false;
1258 for (i = 0; i < SIGSZ-1; ++i)
1259 if (u.sig[i] != 0)
1260 return false;
1261 if (u.sig[SIGSZ-1] != SIG_MSB)
1262 return false;
1264 *r = u;
1265 return true;
1268 /* Render R as an integer. */
1270 HOST_WIDE_INT
1271 real_to_integer (const REAL_VALUE_TYPE *r)
1273 unsigned HOST_WIDE_INT i;
1275 switch (r->cl)
1277 case rvc_zero:
1278 underflow:
1279 return 0;
1281 case rvc_inf:
1282 case rvc_nan:
1283 overflow:
1284 i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1285 if (!r->sign)
1286 i--;
1287 return i;
1289 case rvc_normal:
1290 if (r->decimal)
1291 return decimal_real_to_integer (r);
1293 if (REAL_EXP (r) <= 0)
1294 goto underflow;
1295 /* Only force overflow for unsigned overflow. Signed overflow is
1296 undefined, so it doesn't matter what we return, and some callers
1297 expect to be able to use this routine for both signed and
1298 unsigned conversions. */
1299 if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT)
1300 goto overflow;
1302 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1303 i = r->sig[SIGSZ-1];
1304 else
1306 gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
1307 i = r->sig[SIGSZ-1];
1308 i = i << (HOST_BITS_PER_LONG - 1) << 1;
1309 i |= r->sig[SIGSZ-2];
1312 i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r);
1314 if (r->sign)
1315 i = -i;
1316 return i;
1318 default:
1319 gcc_unreachable ();
1323 /* Likewise, but to an integer pair, HI+LOW. */
1325 void
1326 real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
1327 const REAL_VALUE_TYPE *r)
1329 REAL_VALUE_TYPE t;
1330 HOST_WIDE_INT low, high;
1331 int exp;
1333 switch (r->cl)
1335 case rvc_zero:
1336 underflow:
1337 low = high = 0;
1338 break;
1340 case rvc_inf:
1341 case rvc_nan:
1342 overflow:
1343 high = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1344 if (r->sign)
1345 low = 0;
1346 else
1348 high--;
1349 low = -1;
1351 break;
1353 case rvc_normal:
1354 if (r->decimal)
1356 decimal_real_to_integer2 (plow, phigh, r);
1357 return;
1360 exp = REAL_EXP (r);
1361 if (exp <= 0)
1362 goto underflow;
1363 /* Only force overflow for unsigned overflow. Signed overflow is
1364 undefined, so it doesn't matter what we return, and some callers
1365 expect to be able to use this routine for both signed and
1366 unsigned conversions. */
1367 if (exp > 2*HOST_BITS_PER_WIDE_INT)
1368 goto overflow;
1370 rshift_significand (&t, r, 2*HOST_BITS_PER_WIDE_INT - exp);
1371 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1373 high = t.sig[SIGSZ-1];
1374 low = t.sig[SIGSZ-2];
1376 else
1378 gcc_assert (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG);
1379 high = t.sig[SIGSZ-1];
1380 high = high << (HOST_BITS_PER_LONG - 1) << 1;
1381 high |= t.sig[SIGSZ-2];
1383 low = t.sig[SIGSZ-3];
1384 low = low << (HOST_BITS_PER_LONG - 1) << 1;
1385 low |= t.sig[SIGSZ-4];
1388 if (r->sign)
1390 if (low == 0)
1391 high = -high;
1392 else
1393 low = -low, high = ~high;
1395 break;
1397 default:
1398 gcc_unreachable ();
1401 *plow = low;
1402 *phigh = high;
1405 /* A subroutine of real_to_decimal. Compute the quotient and remainder
1406 of NUM / DEN. Return the quotient and place the remainder in NUM.
1407 It is expected that NUM / DEN are close enough that the quotient is
1408 small. */
1410 static unsigned long
1411 rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den)
1413 unsigned long q, msb;
1414 int expn = REAL_EXP (num), expd = REAL_EXP (den);
1416 if (expn < expd)
1417 return 0;
1419 q = msb = 0;
1420 goto start;
1423 msb = num->sig[SIGSZ-1] & SIG_MSB;
1424 q <<= 1;
1425 lshift_significand_1 (num, num);
1426 start:
1427 if (msb || cmp_significands (num, den) >= 0)
1429 sub_significands (num, num, den, 0);
1430 q |= 1;
1433 while (--expn >= expd);
1435 SET_REAL_EXP (num, expd);
1436 normalize (num);
1438 return q;
1441 /* Render R as a decimal floating point constant. Emit DIGITS significant
1442 digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the
1443 maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing
1444 zeros. */
1446 #define M_LOG10_2 0.30102999566398119521
1448 void
1449 real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
1450 size_t digits, int crop_trailing_zeros)
1452 const REAL_VALUE_TYPE *one, *ten;
1453 REAL_VALUE_TYPE r, pten, u, v;
1454 int dec_exp, cmp_one, digit;
1455 size_t max_digits;
1456 char *p, *first, *last;
1457 bool sign;
1459 r = *r_orig;
1460 switch (r.cl)
1462 case rvc_zero:
1463 strcpy (str, (r.sign ? "-0.0" : "0.0"));
1464 return;
1465 case rvc_normal:
1466 break;
1467 case rvc_inf:
1468 strcpy (str, (r.sign ? "-Inf" : "+Inf"));
1469 return;
1470 case rvc_nan:
1471 /* ??? Print the significand as well, if not canonical? */
1472 strcpy (str, (r.sign ? "-NaN" : "+NaN"));
1473 return;
1474 default:
1475 gcc_unreachable ();
1478 if (r.decimal)
1480 decimal_real_to_decimal (str, &r, buf_size, digits, crop_trailing_zeros);
1481 return;
1484 /* Bound the number of digits printed by the size of the representation. */
1485 max_digits = SIGNIFICAND_BITS * M_LOG10_2;
1486 if (digits == 0 || digits > max_digits)
1487 digits = max_digits;
1489 /* Estimate the decimal exponent, and compute the length of the string it
1490 will print as. Be conservative and add one to account for possible
1491 overflow or rounding error. */
1492 dec_exp = REAL_EXP (&r) * M_LOG10_2;
1493 for (max_digits = 1; dec_exp ; max_digits++)
1494 dec_exp /= 10;
1496 /* Bound the number of digits printed by the size of the output buffer. */
1497 max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
1498 gcc_assert (max_digits <= buf_size);
1499 if (digits > max_digits)
1500 digits = max_digits;
1502 one = real_digit (1);
1503 ten = ten_to_ptwo (0);
1505 sign = r.sign;
1506 r.sign = 0;
1508 dec_exp = 0;
1509 pten = *one;
1511 cmp_one = do_compare (&r, one, 0);
1512 if (cmp_one > 0)
1514 int m;
1516 /* Number is greater than one. Convert significand to an integer
1517 and strip trailing decimal zeros. */
1519 u = r;
1520 SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1);
1522 /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
1523 m = floor_log2 (max_digits);
1525 /* Iterate over the bits of the possible powers of 10 that might
1526 be present in U and eliminate them. That is, if we find that
1527 10**2**M divides U evenly, keep the division and increase
1528 DEC_EXP by 2**M. */
1531 REAL_VALUE_TYPE t;
1533 do_divide (&t, &u, ten_to_ptwo (m));
1534 do_fix_trunc (&v, &t);
1535 if (cmp_significands (&v, &t) == 0)
1537 u = t;
1538 dec_exp += 1 << m;
1541 while (--m >= 0);
1543 /* Revert the scaling to integer that we performed earlier. */
1544 SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r)
1545 - (SIGNIFICAND_BITS - 1));
1546 r = u;
1548 /* Find power of 10. Do this by dividing out 10**2**M when
1549 this is larger than the current remainder. Fill PTEN with
1550 the power of 10 that we compute. */
1551 if (REAL_EXP (&r) > 0)
1553 m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1;
1556 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1557 if (do_compare (&u, ptentwo, 0) >= 0)
1559 do_divide (&u, &u, ptentwo);
1560 do_multiply (&pten, &pten, ptentwo);
1561 dec_exp += 1 << m;
1564 while (--m >= 0);
1566 else
1567 /* We managed to divide off enough tens in the above reduction
1568 loop that we've now got a negative exponent. Fall into the
1569 less-than-one code to compute the proper value for PTEN. */
1570 cmp_one = -1;
1572 if (cmp_one < 0)
1574 int m;
1576 /* Number is less than one. Pad significand with leading
1577 decimal zeros. */
1579 v = r;
1580 while (1)
1582 /* Stop if we'd shift bits off the bottom. */
1583 if (v.sig[0] & 7)
1584 break;
1586 do_multiply (&u, &v, ten);
1588 /* Stop if we're now >= 1. */
1589 if (REAL_EXP (&u) > 0)
1590 break;
1592 v = u;
1593 dec_exp -= 1;
1595 r = v;
1597 /* Find power of 10. Do this by multiplying in P=10**2**M when
1598 the current remainder is smaller than 1/P. Fill PTEN with the
1599 power of 10 that we compute. */
1600 m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1;
1603 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1604 const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
1606 if (do_compare (&v, ptenmtwo, 0) <= 0)
1608 do_multiply (&v, &v, ptentwo);
1609 do_multiply (&pten, &pten, ptentwo);
1610 dec_exp -= 1 << m;
1613 while (--m >= 0);
1615 /* Invert the positive power of 10 that we've collected so far. */
1616 do_divide (&pten, one, &pten);
1619 p = str;
1620 if (sign)
1621 *p++ = '-';
1622 first = p++;
1624 /* At this point, PTEN should contain the nearest power of 10 smaller
1625 than R, such that this division produces the first digit.
1627 Using a divide-step primitive that returns the complete integral
1628 remainder avoids the rounding error that would be produced if
1629 we were to use do_divide here and then simply multiply by 10 for
1630 each subsequent digit. */
1632 digit = rtd_divmod (&r, &pten);
1634 /* Be prepared for error in that division via underflow ... */
1635 if (digit == 0 && cmp_significand_0 (&r))
1637 /* Multiply by 10 and try again. */
1638 do_multiply (&r, &r, ten);
1639 digit = rtd_divmod (&r, &pten);
1640 dec_exp -= 1;
1641 gcc_assert (digit != 0);
1644 /* ... or overflow. */
1645 if (digit == 10)
1647 *p++ = '1';
1648 if (--digits > 0)
1649 *p++ = '0';
1650 dec_exp += 1;
1652 else
1654 gcc_assert (digit <= 10);
1655 *p++ = digit + '0';
1658 /* Generate subsequent digits. */
1659 while (--digits > 0)
1661 do_multiply (&r, &r, ten);
1662 digit = rtd_divmod (&r, &pten);
1663 *p++ = digit + '0';
1665 last = p;
1667 /* Generate one more digit with which to do rounding. */
1668 do_multiply (&r, &r, ten);
1669 digit = rtd_divmod (&r, &pten);
1671 /* Round the result. */
1672 if (digit == 5)
1674 /* Round to nearest. If R is nonzero there are additional
1675 nonzero digits to be extracted. */
1676 if (cmp_significand_0 (&r))
1677 digit++;
1678 /* Round to even. */
1679 else if ((p[-1] - '0') & 1)
1680 digit++;
1682 if (digit > 5)
1684 while (p > first)
1686 digit = *--p;
1687 if (digit == '9')
1688 *p = '0';
1689 else
1691 *p = digit + 1;
1692 break;
1696 /* Carry out of the first digit. This means we had all 9's and
1697 now have all 0's. "Prepend" a 1 by overwriting the first 0. */
1698 if (p == first)
1700 first[1] = '1';
1701 dec_exp++;
1705 /* Insert the decimal point. */
1706 first[0] = first[1];
1707 first[1] = '.';
1709 /* If requested, drop trailing zeros. Never crop past "1.0". */
1710 if (crop_trailing_zeros)
1711 while (last > first + 3 && last[-1] == '0')
1712 last--;
1714 /* Append the exponent. */
1715 sprintf (last, "e%+d", dec_exp);
1718 /* Render R as a hexadecimal floating point constant. Emit DIGITS
1719 significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0,
1720 choose the maximum for the representation. If CROP_TRAILING_ZEROS,
1721 strip trailing zeros. */
1723 void
1724 real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
1725 size_t digits, int crop_trailing_zeros)
1727 int i, j, exp = REAL_EXP (r);
1728 char *p, *first;
1729 char exp_buf[16];
1730 size_t max_digits;
1732 switch (r->cl)
1734 case rvc_zero:
1735 exp = 0;
1736 break;
1737 case rvc_normal:
1738 break;
1739 case rvc_inf:
1740 strcpy (str, (r->sign ? "-Inf" : "+Inf"));
1741 return;
1742 case rvc_nan:
1743 /* ??? Print the significand as well, if not canonical? */
1744 strcpy (str, (r->sign ? "-NaN" : "+NaN"));
1745 return;
1746 default:
1747 gcc_unreachable ();
1750 if (r->decimal)
1752 /* Hexadecimal format for decimal floats is not interesting. */
1753 strcpy (str, "N/A");
1754 return;
1757 if (digits == 0)
1758 digits = SIGNIFICAND_BITS / 4;
1760 /* Bound the number of digits printed by the size of the output buffer. */
1762 sprintf (exp_buf, "p%+d", exp);
1763 max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
1764 gcc_assert (max_digits <= buf_size);
1765 if (digits > max_digits)
1766 digits = max_digits;
1768 p = str;
1769 if (r->sign)
1770 *p++ = '-';
1771 *p++ = '0';
1772 *p++ = 'x';
1773 *p++ = '0';
1774 *p++ = '.';
1775 first = p;
1777 for (i = SIGSZ - 1; i >= 0; --i)
1778 for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
1780 *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
1781 if (--digits == 0)
1782 goto out;
1785 out:
1786 if (crop_trailing_zeros)
1787 while (p > first + 1 && p[-1] == '0')
1788 p--;
1790 sprintf (p, "p%+d", exp);
1793 /* Initialize R from a decimal or hexadecimal string. The string is
1794 assumed to have been syntax checked already. */
1796 void
1797 real_from_string (REAL_VALUE_TYPE *r, const char *str)
1799 int exp = 0;
1800 bool sign = false;
1802 get_zero (r, 0);
1804 if (*str == '-')
1806 sign = true;
1807 str++;
1809 else if (*str == '+')
1810 str++;
1812 if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1814 /* Hexadecimal floating point. */
1815 int pos = SIGNIFICAND_BITS - 4, d;
1817 str += 2;
1819 while (*str == '0')
1820 str++;
1821 while (1)
1823 d = hex_value (*str);
1824 if (d == _hex_bad)
1825 break;
1826 if (pos >= 0)
1828 r->sig[pos / HOST_BITS_PER_LONG]
1829 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1830 pos -= 4;
1832 else if (d)
1833 /* Ensure correct rounding by setting last bit if there is
1834 a subsequent nonzero digit. */
1835 r->sig[0] |= 1;
1836 exp += 4;
1837 str++;
1839 if (*str == '.')
1841 str++;
1842 if (pos == SIGNIFICAND_BITS - 4)
1844 while (*str == '0')
1845 str++, exp -= 4;
1847 while (1)
1849 d = hex_value (*str);
1850 if (d == _hex_bad)
1851 break;
1852 if (pos >= 0)
1854 r->sig[pos / HOST_BITS_PER_LONG]
1855 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1856 pos -= 4;
1858 else if (d)
1859 /* Ensure correct rounding by setting last bit if there is
1860 a subsequent nonzero digit. */
1861 r->sig[0] |= 1;
1862 str++;
1865 if (*str == 'p' || *str == 'P')
1867 bool exp_neg = false;
1869 str++;
1870 if (*str == '-')
1872 exp_neg = true;
1873 str++;
1875 else if (*str == '+')
1876 str++;
1878 d = 0;
1879 while (ISDIGIT (*str))
1881 d *= 10;
1882 d += *str - '0';
1883 if (d > MAX_EXP)
1885 /* Overflowed the exponent. */
1886 if (exp_neg)
1887 goto underflow;
1888 else
1889 goto overflow;
1891 str++;
1893 if (exp_neg)
1894 d = -d;
1896 exp += d;
1899 r->cl = rvc_normal;
1900 SET_REAL_EXP (r, exp);
1902 normalize (r);
1904 else
1906 /* Decimal floating point. */
1907 const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
1908 int d;
1910 while (*str == '0')
1911 str++;
1912 while (ISDIGIT (*str))
1914 d = *str++ - '0';
1915 do_multiply (r, r, ten);
1916 if (d)
1917 do_add (r, r, real_digit (d), 0);
1919 if (*str == '.')
1921 str++;
1922 if (r->cl == rvc_zero)
1924 while (*str == '0')
1925 str++, exp--;
1927 while (ISDIGIT (*str))
1929 d = *str++ - '0';
1930 do_multiply (r, r, ten);
1931 if (d)
1932 do_add (r, r, real_digit (d), 0);
1933 exp--;
1937 if (*str == 'e' || *str == 'E')
1939 bool exp_neg = false;
1941 str++;
1942 if (*str == '-')
1944 exp_neg = true;
1945 str++;
1947 else if (*str == '+')
1948 str++;
1950 d = 0;
1951 while (ISDIGIT (*str))
1953 d *= 10;
1954 d += *str - '0';
1955 if (d > MAX_EXP)
1957 /* Overflowed the exponent. */
1958 if (exp_neg)
1959 goto underflow;
1960 else
1961 goto overflow;
1963 str++;
1965 if (exp_neg)
1966 d = -d;
1967 exp += d;
1970 if (exp)
1971 times_pten (r, exp);
1974 r->sign = sign;
1975 return;
1977 underflow:
1978 get_zero (r, sign);
1979 return;
1981 overflow:
1982 get_inf (r, sign);
1983 return;
1986 /* Legacy. Similar, but return the result directly. */
1988 REAL_VALUE_TYPE
1989 real_from_string2 (const char *s, enum machine_mode mode)
1991 REAL_VALUE_TYPE r;
1993 real_from_string (&r, s);
1994 if (mode != VOIDmode)
1995 real_convert (&r, mode, &r);
1997 return r;
2000 /* Initialize R from string S and desired MODE. */
2002 void
2003 real_from_string3 (REAL_VALUE_TYPE *r, const char *s, enum machine_mode mode)
2005 if (DECIMAL_FLOAT_MODE_P (mode))
2006 decimal_real_from_string (r, s);
2007 else
2008 real_from_string (r, s);
2010 if (mode != VOIDmode)
2011 real_convert (r, mode, r);
2014 /* Initialize R from the integer pair HIGH+LOW. */
2016 void
2017 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
2018 unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
2019 int unsigned_p)
2021 if (low == 0 && high == 0)
2022 get_zero (r, 0);
2023 else
2025 memset (r, 0, sizeof (*r));
2026 r->cl = rvc_normal;
2027 r->sign = high < 0 && !unsigned_p;
2028 SET_REAL_EXP (r, 2 * HOST_BITS_PER_WIDE_INT);
2030 if (r->sign)
2032 high = ~high;
2033 if (low == 0)
2034 high += 1;
2035 else
2036 low = -low;
2039 if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
2041 r->sig[SIGSZ-1] = high;
2042 r->sig[SIGSZ-2] = low;
2044 else
2046 gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
2047 r->sig[SIGSZ-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
2048 r->sig[SIGSZ-2] = high;
2049 r->sig[SIGSZ-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
2050 r->sig[SIGSZ-4] = low;
2053 normalize (r);
2056 if (mode != VOIDmode)
2057 real_convert (r, mode, r);
2060 /* Returns 10**2**N. */
2062 static const REAL_VALUE_TYPE *
2063 ten_to_ptwo (int n)
2065 static REAL_VALUE_TYPE tens[EXP_BITS];
2067 gcc_assert (n >= 0);
2068 gcc_assert (n < EXP_BITS);
2070 if (tens[n].cl == rvc_zero)
2072 if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2074 HOST_WIDE_INT t = 10;
2075 int i;
2077 for (i = 0; i < n; ++i)
2078 t *= t;
2080 real_from_integer (&tens[n], VOIDmode, t, 0, 1);
2082 else
2084 const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2085 do_multiply (&tens[n], t, t);
2089 return &tens[n];
2092 /* Returns 10**(-2**N). */
2094 static const REAL_VALUE_TYPE *
2095 ten_to_mptwo (int n)
2097 static REAL_VALUE_TYPE tens[EXP_BITS];
2099 gcc_assert (n >= 0);
2100 gcc_assert (n < EXP_BITS);
2102 if (tens[n].cl == rvc_zero)
2103 do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2105 return &tens[n];
2108 /* Returns N. */
2110 static const REAL_VALUE_TYPE *
2111 real_digit (int n)
2113 static REAL_VALUE_TYPE num[10];
2115 gcc_assert (n >= 0);
2116 gcc_assert (n <= 9);
2118 if (n > 0 && num[n].cl == rvc_zero)
2119 real_from_integer (&num[n], VOIDmode, n, 0, 1);
2121 return &num[n];
2124 /* Multiply R by 10**EXP. */
2126 static void
2127 times_pten (REAL_VALUE_TYPE *r, int exp)
2129 REAL_VALUE_TYPE pten, *rr;
2130 bool negative = (exp < 0);
2131 int i;
2133 if (negative)
2135 exp = -exp;
2136 pten = *real_digit (1);
2137 rr = &pten;
2139 else
2140 rr = r;
2142 for (i = 0; exp > 0; ++i, exp >>= 1)
2143 if (exp & 1)
2144 do_multiply (rr, rr, ten_to_ptwo (i));
2146 if (negative)
2147 do_divide (r, r, &pten);
2150 /* Fills R with +Inf. */
2152 void
2153 real_inf (REAL_VALUE_TYPE *r)
2155 get_inf (r, 0);
2158 /* Fills R with a NaN whose significand is described by STR. If QUIET,
2159 we force a QNaN, else we force an SNaN. The string, if not empty,
2160 is parsed as a number and placed in the significand. Return true
2161 if the string was successfully parsed. */
2163 bool
2164 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2165 enum machine_mode mode)
2167 const struct real_format *fmt;
2169 fmt = REAL_MODE_FORMAT (mode);
2170 gcc_assert (fmt);
2172 if (*str == 0)
2174 if (quiet)
2175 get_canonical_qnan (r, 0);
2176 else
2177 get_canonical_snan (r, 0);
2179 else
2181 int base = 10, d;
2183 memset (r, 0, sizeof (*r));
2184 r->cl = rvc_nan;
2186 /* Parse akin to strtol into the significand of R. */
2188 while (ISSPACE (*str))
2189 str++;
2190 if (*str == '-')
2191 str++;
2192 else if (*str == '+')
2193 str++;
2194 if (*str == '0')
2196 if (*++str == 'x')
2197 str++, base = 16;
2198 else
2199 base = 8;
2202 while ((d = hex_value (*str)) < base)
2204 REAL_VALUE_TYPE u;
2206 switch (base)
2208 case 8:
2209 lshift_significand (r, r, 3);
2210 break;
2211 case 16:
2212 lshift_significand (r, r, 4);
2213 break;
2214 case 10:
2215 lshift_significand_1 (&u, r);
2216 lshift_significand (r, r, 3);
2217 add_significands (r, r, &u);
2218 break;
2219 default:
2220 gcc_unreachable ();
2223 get_zero (&u, 0);
2224 u.sig[0] = d;
2225 add_significands (r, r, &u);
2227 str++;
2230 /* Must have consumed the entire string for success. */
2231 if (*str != 0)
2232 return false;
2234 /* Shift the significand into place such that the bits
2235 are in the most significant bits for the format. */
2236 lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
2238 /* Our MSB is always unset for NaNs. */
2239 r->sig[SIGSZ-1] &= ~SIG_MSB;
2241 /* Force quiet or signalling NaN. */
2242 r->signalling = !quiet;
2245 return true;
2248 /* Fills R with the largest finite value representable in mode MODE.
2249 If SIGN is nonzero, R is set to the most negative finite value. */
2251 void
2252 real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
2254 const struct real_format *fmt;
2255 int np2;
2257 fmt = REAL_MODE_FORMAT (mode);
2258 gcc_assert (fmt);
2259 memset (r, 0, sizeof (*r));
2261 if (fmt->b == 10)
2262 decimal_real_maxval (r, sign, mode);
2263 else
2265 r->cl = rvc_normal;
2266 r->sign = sign;
2267 SET_REAL_EXP (r, fmt->emax * fmt->log2_b);
2269 np2 = SIGNIFICAND_BITS - fmt->p * fmt->log2_b;
2270 memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
2271 clear_significand_below (r, np2);
2275 /* Fills R with 2**N. */
2277 void
2278 real_2expN (REAL_VALUE_TYPE *r, int n)
2280 memset (r, 0, sizeof (*r));
2282 n++;
2283 if (n > MAX_EXP)
2284 r->cl = rvc_inf;
2285 else if (n < -MAX_EXP)
2287 else
2289 r->cl = rvc_normal;
2290 SET_REAL_EXP (r, n);
2291 r->sig[SIGSZ-1] = SIG_MSB;
2296 static void
2297 round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
2299 int p2, np2, i, w;
2300 unsigned long sticky;
2301 bool guard, lsb;
2302 int emin2m1, emax2;
2304 if (r->decimal)
2306 if (fmt->b == 10)
2308 decimal_round_for_format (fmt, r);
2309 return;
2311 /* FIXME. We can come here via fp_easy_constant
2312 (e.g. -O0 on '_Decimal32 x = 1.0 + 2.0dd'), but have not
2313 investigated whether this convert needs to be here, or
2314 something else is missing. */
2315 decimal_real_convert (r, DFmode, r);
2318 p2 = fmt->p * fmt->log2_b;
2319 emin2m1 = (fmt->emin - 1) * fmt->log2_b;
2320 emax2 = fmt->emax * fmt->log2_b;
2322 np2 = SIGNIFICAND_BITS - p2;
2323 switch (r->cl)
2325 underflow:
2326 get_zero (r, r->sign);
2327 case rvc_zero:
2328 if (!fmt->has_signed_zero)
2329 r->sign = 0;
2330 return;
2332 overflow:
2333 get_inf (r, r->sign);
2334 case rvc_inf:
2335 return;
2337 case rvc_nan:
2338 clear_significand_below (r, np2);
2339 return;
2341 case rvc_normal:
2342 break;
2344 default:
2345 gcc_unreachable ();
2348 /* If we're not base2, normalize the exponent to a multiple of
2349 the true base. */
2350 if (fmt->log2_b != 1)
2352 int shift;
2354 gcc_assert (fmt->b != 10);
2355 shift = REAL_EXP (r) & (fmt->log2_b - 1);
2356 if (shift)
2358 shift = fmt->log2_b - shift;
2359 r->sig[0] |= sticky_rshift_significand (r, r, shift);
2360 SET_REAL_EXP (r, REAL_EXP (r) + shift);
2364 /* Check the range of the exponent. If we're out of range,
2365 either underflow or overflow. */
2366 if (REAL_EXP (r) > emax2)
2367 goto overflow;
2368 else if (REAL_EXP (r) <= emin2m1)
2370 int diff;
2372 if (!fmt->has_denorm)
2374 /* Don't underflow completely until we've had a chance to round. */
2375 if (REAL_EXP (r) < emin2m1)
2376 goto underflow;
2378 else
2380 diff = emin2m1 - REAL_EXP (r) + 1;
2381 if (diff > p2)
2382 goto underflow;
2384 /* De-normalize the significand. */
2385 r->sig[0] |= sticky_rshift_significand (r, r, diff);
2386 SET_REAL_EXP (r, REAL_EXP (r) + diff);
2390 /* There are P2 true significand bits, followed by one guard bit,
2391 followed by one sticky bit, followed by stuff. Fold nonzero
2392 stuff into the sticky bit. */
2394 sticky = 0;
2395 for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2396 sticky |= r->sig[i];
2397 sticky |=
2398 r->sig[w] & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2400 guard = test_significand_bit (r, np2 - 1);
2401 lsb = test_significand_bit (r, np2);
2403 /* Round to even. */
2404 if (guard && (sticky || lsb))
2406 REAL_VALUE_TYPE u;
2407 get_zero (&u, 0);
2408 set_significand_bit (&u, np2);
2410 if (add_significands (r, r, &u))
2412 /* Overflow. Means the significand had been all ones, and
2413 is now all zeros. Need to increase the exponent, and
2414 possibly re-normalize it. */
2415 SET_REAL_EXP (r, REAL_EXP (r) + 1);
2416 if (REAL_EXP (r) > emax2)
2417 goto overflow;
2418 r->sig[SIGSZ-1] = SIG_MSB;
2420 if (fmt->log2_b != 1)
2422 int shift = REAL_EXP (r) & (fmt->log2_b - 1);
2423 if (shift)
2425 shift = fmt->log2_b - shift;
2426 rshift_significand (r, r, shift);
2427 SET_REAL_EXP (r, REAL_EXP (r) + shift);
2428 if (REAL_EXP (r) > emax2)
2429 goto overflow;
2435 /* Catch underflow that we deferred until after rounding. */
2436 if (REAL_EXP (r) <= emin2m1)
2437 goto underflow;
2439 /* Clear out trailing garbage. */
2440 clear_significand_below (r, np2);
2443 /* Extend or truncate to a new mode. */
2445 void
2446 real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
2447 const REAL_VALUE_TYPE *a)
2449 const struct real_format *fmt;
2451 fmt = REAL_MODE_FORMAT (mode);
2452 gcc_assert (fmt);
2454 *r = *a;
2456 if (a->decimal || fmt->b == 10)
2457 decimal_real_convert (r, mode, a);
2459 round_for_format (fmt, r);
2461 /* round_for_format de-normalizes denormals. Undo just that part. */
2462 if (r->cl == rvc_normal)
2463 normalize (r);
2466 /* Legacy. Likewise, except return the struct directly. */
2468 REAL_VALUE_TYPE
2469 real_value_truncate (enum machine_mode mode, REAL_VALUE_TYPE a)
2471 REAL_VALUE_TYPE r;
2472 real_convert (&r, mode, &a);
2473 return r;
2476 /* Return true if truncating to MODE is exact. */
2478 bool
2479 exact_real_truncate (enum machine_mode mode, const REAL_VALUE_TYPE *a)
2481 const struct real_format *fmt;
2482 REAL_VALUE_TYPE t;
2483 int emin2m1;
2485 fmt = REAL_MODE_FORMAT (mode);
2486 gcc_assert (fmt);
2488 /* Don't allow conversion to denormals. */
2489 emin2m1 = (fmt->emin - 1) * fmt->log2_b;
2490 if (REAL_EXP (a) <= emin2m1)
2491 return false;
2493 /* After conversion to the new mode, the value must be identical. */
2494 real_convert (&t, mode, a);
2495 return real_identical (&t, a);
2498 /* Write R to the given target format. Place the words of the result
2499 in target word order in BUF. There are always 32 bits in each
2500 long, no matter the size of the host long.
2502 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2504 long
2505 real_to_target_fmt (long *buf, const REAL_VALUE_TYPE *r_orig,
2506 const struct real_format *fmt)
2508 REAL_VALUE_TYPE r;
2509 long buf1;
2511 r = *r_orig;
2512 round_for_format (fmt, &r);
2514 if (!buf)
2515 buf = &buf1;
2516 (*fmt->encode) (fmt, buf, &r);
2518 return *buf;
2521 /* Similar, but look up the format from MODE. */
2523 long
2524 real_to_target (long *buf, const REAL_VALUE_TYPE *r, enum machine_mode mode)
2526 const struct real_format *fmt;
2528 fmt = REAL_MODE_FORMAT (mode);
2529 gcc_assert (fmt);
2531 return real_to_target_fmt (buf, r, fmt);
2534 /* Read R from the given target format. Read the words of the result
2535 in target word order in BUF. There are always 32 bits in each
2536 long, no matter the size of the host long. */
2538 void
2539 real_from_target_fmt (REAL_VALUE_TYPE *r, const long *buf,
2540 const struct real_format *fmt)
2542 (*fmt->decode) (fmt, r, buf);
2545 /* Similar, but look up the format from MODE. */
2547 void
2548 real_from_target (REAL_VALUE_TYPE *r, const long *buf, enum machine_mode mode)
2550 const struct real_format *fmt;
2552 fmt = REAL_MODE_FORMAT (mode);
2553 gcc_assert (fmt);
2555 (*fmt->decode) (fmt, r, buf);
2558 /* Return the number of bits of the largest binary value that the
2559 significand of MODE will hold. */
2560 /* ??? Legacy. Should get access to real_format directly. */
2563 significand_size (enum machine_mode mode)
2565 const struct real_format *fmt;
2567 fmt = REAL_MODE_FORMAT (mode);
2568 if (fmt == NULL)
2569 return 0;
2571 if (fmt->b == 10)
2573 /* Return the size in bits of the largest binary value that can be
2574 held by the decimal coefficient for this mode. This is one more
2575 than the number of bits required to hold the largest coefficient
2576 of this mode. */
2577 double log2_10 = 3.3219281;
2578 return fmt->p * log2_10;
2580 return fmt->p * fmt->log2_b;
2583 /* Return a hash value for the given real value. */
2584 /* ??? The "unsigned int" return value is intended to be hashval_t,
2585 but I didn't want to pull hashtab.h into real.h. */
2587 unsigned int
2588 real_hash (const REAL_VALUE_TYPE *r)
2590 unsigned int h;
2591 size_t i;
2593 h = r->cl | (r->sign << 2);
2594 switch (r->cl)
2596 case rvc_zero:
2597 case rvc_inf:
2598 return h;
2600 case rvc_normal:
2601 h |= REAL_EXP (r) << 3;
2602 break;
2604 case rvc_nan:
2605 if (r->signalling)
2606 h ^= (unsigned int)-1;
2607 if (r->canonical)
2608 return h;
2609 break;
2611 default:
2612 gcc_unreachable ();
2615 if (sizeof(unsigned long) > sizeof(unsigned int))
2616 for (i = 0; i < SIGSZ; ++i)
2618 unsigned long s = r->sig[i];
2619 h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2621 else
2622 for (i = 0; i < SIGSZ; ++i)
2623 h ^= r->sig[i];
2625 return h;
2628 /* IEEE single-precision format. */
2630 static void encode_ieee_single (const struct real_format *fmt,
2631 long *, const REAL_VALUE_TYPE *);
2632 static void decode_ieee_single (const struct real_format *,
2633 REAL_VALUE_TYPE *, const long *);
2635 static void
2636 encode_ieee_single (const struct real_format *fmt, long *buf,
2637 const REAL_VALUE_TYPE *r)
2639 unsigned long image, sig, exp;
2640 unsigned long sign = r->sign;
2641 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2643 image = sign << 31;
2644 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2646 switch (r->cl)
2648 case rvc_zero:
2649 break;
2651 case rvc_inf:
2652 if (fmt->has_inf)
2653 image |= 255 << 23;
2654 else
2655 image |= 0x7fffffff;
2656 break;
2658 case rvc_nan:
2659 if (fmt->has_nans)
2661 if (r->canonical)
2662 sig = 0;
2663 if (r->signalling == fmt->qnan_msb_set)
2664 sig &= ~(1 << 22);
2665 else
2666 sig |= 1 << 22;
2667 /* We overload qnan_msb_set here: it's only clear for
2668 mips_ieee_single, which wants all mantissa bits but the
2669 quiet/signalling one set in canonical NaNs (at least
2670 Quiet ones). */
2671 if (r->canonical && !fmt->qnan_msb_set)
2672 sig |= (1 << 22) - 1;
2673 else if (sig == 0)
2674 sig = 1 << 21;
2676 image |= 255 << 23;
2677 image |= sig;
2679 else
2680 image |= 0x7fffffff;
2681 break;
2683 case rvc_normal:
2684 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2685 whereas the intermediate representation is 0.F x 2**exp.
2686 Which means we're off by one. */
2687 if (denormal)
2688 exp = 0;
2689 else
2690 exp = REAL_EXP (r) + 127 - 1;
2691 image |= exp << 23;
2692 image |= sig;
2693 break;
2695 default:
2696 gcc_unreachable ();
2699 buf[0] = image;
2702 static void
2703 decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2704 const long *buf)
2706 unsigned long image = buf[0] & 0xffffffff;
2707 bool sign = (image >> 31) & 1;
2708 int exp = (image >> 23) & 0xff;
2710 memset (r, 0, sizeof (*r));
2711 image <<= HOST_BITS_PER_LONG - 24;
2712 image &= ~SIG_MSB;
2714 if (exp == 0)
2716 if (image && fmt->has_denorm)
2718 r->cl = rvc_normal;
2719 r->sign = sign;
2720 SET_REAL_EXP (r, -126);
2721 r->sig[SIGSZ-1] = image << 1;
2722 normalize (r);
2724 else if (fmt->has_signed_zero)
2725 r->sign = sign;
2727 else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
2729 if (image)
2731 r->cl = rvc_nan;
2732 r->sign = sign;
2733 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
2734 ^ fmt->qnan_msb_set);
2735 r->sig[SIGSZ-1] = image;
2737 else
2739 r->cl = rvc_inf;
2740 r->sign = sign;
2743 else
2745 r->cl = rvc_normal;
2746 r->sign = sign;
2747 SET_REAL_EXP (r, exp - 127 + 1);
2748 r->sig[SIGSZ-1] = image | SIG_MSB;
2752 const struct real_format ieee_single_format =
2754 encode_ieee_single,
2755 decode_ieee_single,
2760 -125,
2761 128,
2764 true,
2765 true,
2766 true,
2767 true,
2768 true
2771 const struct real_format mips_single_format =
2773 encode_ieee_single,
2774 decode_ieee_single,
2779 -125,
2780 128,
2783 true,
2784 true,
2785 true,
2786 true,
2787 false
2791 /* IEEE double-precision format. */
2793 static void encode_ieee_double (const struct real_format *fmt,
2794 long *, const REAL_VALUE_TYPE *);
2795 static void decode_ieee_double (const struct real_format *,
2796 REAL_VALUE_TYPE *, const long *);
2798 static void
2799 encode_ieee_double (const struct real_format *fmt, long *buf,
2800 const REAL_VALUE_TYPE *r)
2802 unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
2803 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2805 image_hi = r->sign << 31;
2806 image_lo = 0;
2808 if (HOST_BITS_PER_LONG == 64)
2810 sig_hi = r->sig[SIGSZ-1];
2811 sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
2812 sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
2814 else
2816 sig_hi = r->sig[SIGSZ-1];
2817 sig_lo = r->sig[SIGSZ-2];
2818 sig_lo = (sig_hi << 21) | (sig_lo >> 11);
2819 sig_hi = (sig_hi >> 11) & 0xfffff;
2822 switch (r->cl)
2824 case rvc_zero:
2825 break;
2827 case rvc_inf:
2828 if (fmt->has_inf)
2829 image_hi |= 2047 << 20;
2830 else
2832 image_hi |= 0x7fffffff;
2833 image_lo = 0xffffffff;
2835 break;
2837 case rvc_nan:
2838 if (fmt->has_nans)
2840 if (r->canonical)
2841 sig_hi = sig_lo = 0;
2842 if (r->signalling == fmt->qnan_msb_set)
2843 sig_hi &= ~(1 << 19);
2844 else
2845 sig_hi |= 1 << 19;
2846 /* We overload qnan_msb_set here: it's only clear for
2847 mips_ieee_single, which wants all mantissa bits but the
2848 quiet/signalling one set in canonical NaNs (at least
2849 Quiet ones). */
2850 if (r->canonical && !fmt->qnan_msb_set)
2852 sig_hi |= (1 << 19) - 1;
2853 sig_lo = 0xffffffff;
2855 else if (sig_hi == 0 && sig_lo == 0)
2856 sig_hi = 1 << 18;
2858 image_hi |= 2047 << 20;
2859 image_hi |= sig_hi;
2860 image_lo = sig_lo;
2862 else
2864 image_hi |= 0x7fffffff;
2865 image_lo = 0xffffffff;
2867 break;
2869 case rvc_normal:
2870 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2871 whereas the intermediate representation is 0.F x 2**exp.
2872 Which means we're off by one. */
2873 if (denormal)
2874 exp = 0;
2875 else
2876 exp = REAL_EXP (r) + 1023 - 1;
2877 image_hi |= exp << 20;
2878 image_hi |= sig_hi;
2879 image_lo = sig_lo;
2880 break;
2882 default:
2883 gcc_unreachable ();
2886 if (FLOAT_WORDS_BIG_ENDIAN)
2887 buf[0] = image_hi, buf[1] = image_lo;
2888 else
2889 buf[0] = image_lo, buf[1] = image_hi;
2892 static void
2893 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2894 const long *buf)
2896 unsigned long image_hi, image_lo;
2897 bool sign;
2898 int exp;
2900 if (FLOAT_WORDS_BIG_ENDIAN)
2901 image_hi = buf[0], image_lo = buf[1];
2902 else
2903 image_lo = buf[0], image_hi = buf[1];
2904 image_lo &= 0xffffffff;
2905 image_hi &= 0xffffffff;
2907 sign = (image_hi >> 31) & 1;
2908 exp = (image_hi >> 20) & 0x7ff;
2910 memset (r, 0, sizeof (*r));
2912 image_hi <<= 32 - 21;
2913 image_hi |= image_lo >> 21;
2914 image_hi &= 0x7fffffff;
2915 image_lo <<= 32 - 21;
2917 if (exp == 0)
2919 if ((image_hi || image_lo) && fmt->has_denorm)
2921 r->cl = rvc_normal;
2922 r->sign = sign;
2923 SET_REAL_EXP (r, -1022);
2924 if (HOST_BITS_PER_LONG == 32)
2926 image_hi = (image_hi << 1) | (image_lo >> 31);
2927 image_lo <<= 1;
2928 r->sig[SIGSZ-1] = image_hi;
2929 r->sig[SIGSZ-2] = image_lo;
2931 else
2933 image_hi = (image_hi << 31 << 2) | (image_lo << 1);
2934 r->sig[SIGSZ-1] = image_hi;
2936 normalize (r);
2938 else if (fmt->has_signed_zero)
2939 r->sign = sign;
2941 else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
2943 if (image_hi || image_lo)
2945 r->cl = rvc_nan;
2946 r->sign = sign;
2947 r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
2948 if (HOST_BITS_PER_LONG == 32)
2950 r->sig[SIGSZ-1] = image_hi;
2951 r->sig[SIGSZ-2] = image_lo;
2953 else
2954 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
2956 else
2958 r->cl = rvc_inf;
2959 r->sign = sign;
2962 else
2964 r->cl = rvc_normal;
2965 r->sign = sign;
2966 SET_REAL_EXP (r, exp - 1023 + 1);
2967 if (HOST_BITS_PER_LONG == 32)
2969 r->sig[SIGSZ-1] = image_hi | SIG_MSB;
2970 r->sig[SIGSZ-2] = image_lo;
2972 else
2973 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
2977 const struct real_format ieee_double_format =
2979 encode_ieee_double,
2980 decode_ieee_double,
2985 -1021,
2986 1024,
2989 true,
2990 true,
2991 true,
2992 true,
2993 true
2996 const struct real_format mips_double_format =
2998 encode_ieee_double,
2999 decode_ieee_double,
3004 -1021,
3005 1024,
3008 true,
3009 true,
3010 true,
3011 true,
3012 false
3016 /* IEEE extended real format. This comes in three flavors: Intel's as
3017 a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
3018 12- and 16-byte images may be big- or little endian; Motorola's is
3019 always big endian. */
3021 /* Helper subroutine which converts from the internal format to the
3022 12-byte little-endian Intel format. Functions below adjust this
3023 for the other possible formats. */
3024 static void
3025 encode_ieee_extended (const struct real_format *fmt, long *buf,
3026 const REAL_VALUE_TYPE *r)
3028 unsigned long image_hi, sig_hi, sig_lo;
3029 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3031 image_hi = r->sign << 15;
3032 sig_hi = sig_lo = 0;
3034 switch (r->cl)
3036 case rvc_zero:
3037 break;
3039 case rvc_inf:
3040 if (fmt->has_inf)
3042 image_hi |= 32767;
3044 /* Intel requires the explicit integer bit to be set, otherwise
3045 it considers the value a "pseudo-infinity". Motorola docs
3046 say it doesn't care. */
3047 sig_hi = 0x80000000;
3049 else
3051 image_hi |= 32767;
3052 sig_lo = sig_hi = 0xffffffff;
3054 break;
3056 case rvc_nan:
3057 if (fmt->has_nans)
3059 image_hi |= 32767;
3060 if (HOST_BITS_PER_LONG == 32)
3062 sig_hi = r->sig[SIGSZ-1];
3063 sig_lo = r->sig[SIGSZ-2];
3065 else
3067 sig_lo = r->sig[SIGSZ-1];
3068 sig_hi = sig_lo >> 31 >> 1;
3069 sig_lo &= 0xffffffff;
3071 if (r->signalling == fmt->qnan_msb_set)
3072 sig_hi &= ~(1 << 30);
3073 else
3074 sig_hi |= 1 << 30;
3075 if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
3076 sig_hi = 1 << 29;
3078 /* Intel requires the explicit integer bit to be set, otherwise
3079 it considers the value a "pseudo-nan". Motorola docs say it
3080 doesn't care. */
3081 sig_hi |= 0x80000000;
3083 else
3085 image_hi |= 32767;
3086 sig_lo = sig_hi = 0xffffffff;
3088 break;
3090 case rvc_normal:
3092 int exp = REAL_EXP (r);
3094 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3095 whereas the intermediate representation is 0.F x 2**exp.
3096 Which means we're off by one.
3098 Except for Motorola, which consider exp=0 and explicit
3099 integer bit set to continue to be normalized. In theory
3100 this discrepancy has been taken care of by the difference
3101 in fmt->emin in round_for_format. */
3103 if (denormal)
3104 exp = 0;
3105 else
3107 exp += 16383 - 1;
3108 gcc_assert (exp >= 0);
3110 image_hi |= exp;
3112 if (HOST_BITS_PER_LONG == 32)
3114 sig_hi = r->sig[SIGSZ-1];
3115 sig_lo = r->sig[SIGSZ-2];
3117 else
3119 sig_lo = r->sig[SIGSZ-1];
3120 sig_hi = sig_lo >> 31 >> 1;
3121 sig_lo &= 0xffffffff;
3124 break;
3126 default:
3127 gcc_unreachable ();
3130 buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3133 /* Convert from the internal format to the 12-byte Motorola format
3134 for an IEEE extended real. */
3135 static void
3136 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3137 const REAL_VALUE_TYPE *r)
3139 long intermed[3];
3140 encode_ieee_extended (fmt, intermed, r);
3142 /* Motorola chips are assumed always to be big-endian. Also, the
3143 padding in a Motorola extended real goes between the exponent and
3144 the mantissa. At this point the mantissa is entirely within
3145 elements 0 and 1 of intermed, and the exponent entirely within
3146 element 2, so all we have to do is swap the order around, and
3147 shift element 2 left 16 bits. */
3148 buf[0] = intermed[2] << 16;
3149 buf[1] = intermed[1];
3150 buf[2] = intermed[0];
3153 /* Convert from the internal format to the 12-byte Intel format for
3154 an IEEE extended real. */
3155 static void
3156 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3157 const REAL_VALUE_TYPE *r)
3159 if (FLOAT_WORDS_BIG_ENDIAN)
3161 /* All the padding in an Intel-format extended real goes at the high
3162 end, which in this case is after the mantissa, not the exponent.
3163 Therefore we must shift everything down 16 bits. */
3164 long intermed[3];
3165 encode_ieee_extended (fmt, intermed, r);
3166 buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3167 buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3168 buf[2] = (intermed[0] << 16);
3170 else
3171 /* encode_ieee_extended produces what we want directly. */
3172 encode_ieee_extended (fmt, buf, r);
3175 /* Convert from the internal format to the 16-byte Intel format for
3176 an IEEE extended real. */
3177 static void
3178 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3179 const REAL_VALUE_TYPE *r)
3181 /* All the padding in an Intel-format extended real goes at the high end. */
3182 encode_ieee_extended_intel_96 (fmt, buf, r);
3183 buf[3] = 0;
3186 /* As above, we have a helper function which converts from 12-byte
3187 little-endian Intel format to internal format. Functions below
3188 adjust for the other possible formats. */
3189 static void
3190 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3191 const long *buf)
3193 unsigned long image_hi, sig_hi, sig_lo;
3194 bool sign;
3195 int exp;
3197 sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3198 sig_lo &= 0xffffffff;
3199 sig_hi &= 0xffffffff;
3200 image_hi &= 0xffffffff;
3202 sign = (image_hi >> 15) & 1;
3203 exp = image_hi & 0x7fff;
3205 memset (r, 0, sizeof (*r));
3207 if (exp == 0)
3209 if ((sig_hi || sig_lo) && fmt->has_denorm)
3211 r->cl = rvc_normal;
3212 r->sign = sign;
3214 /* When the IEEE format contains a hidden bit, we know that
3215 it's zero at this point, and so shift up the significand
3216 and decrease the exponent to match. In this case, Motorola
3217 defines the explicit integer bit to be valid, so we don't
3218 know whether the msb is set or not. */
3219 SET_REAL_EXP (r, fmt->emin);
3220 if (HOST_BITS_PER_LONG == 32)
3222 r->sig[SIGSZ-1] = sig_hi;
3223 r->sig[SIGSZ-2] = sig_lo;
3225 else
3226 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3228 normalize (r);
3230 else if (fmt->has_signed_zero)
3231 r->sign = sign;
3233 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3235 /* See above re "pseudo-infinities" and "pseudo-nans".
3236 Short summary is that the MSB will likely always be
3237 set, and that we don't care about it. */
3238 sig_hi &= 0x7fffffff;
3240 if (sig_hi || sig_lo)
3242 r->cl = rvc_nan;
3243 r->sign = sign;
3244 r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3245 if (HOST_BITS_PER_LONG == 32)
3247 r->sig[SIGSZ-1] = sig_hi;
3248 r->sig[SIGSZ-2] = sig_lo;
3250 else
3251 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3253 else
3255 r->cl = rvc_inf;
3256 r->sign = sign;
3259 else
3261 r->cl = rvc_normal;
3262 r->sign = sign;
3263 SET_REAL_EXP (r, exp - 16383 + 1);
3264 if (HOST_BITS_PER_LONG == 32)
3266 r->sig[SIGSZ-1] = sig_hi;
3267 r->sig[SIGSZ-2] = sig_lo;
3269 else
3270 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3274 /* Convert from the internal format to the 12-byte Motorola format
3275 for an IEEE extended real. */
3276 static void
3277 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3278 const long *buf)
3280 long intermed[3];
3282 /* Motorola chips are assumed always to be big-endian. Also, the
3283 padding in a Motorola extended real goes between the exponent and
3284 the mantissa; remove it. */
3285 intermed[0] = buf[2];
3286 intermed[1] = buf[1];
3287 intermed[2] = (unsigned long)buf[0] >> 16;
3289 decode_ieee_extended (fmt, r, intermed);
3292 /* Convert from the internal format to the 12-byte Intel format for
3293 an IEEE extended real. */
3294 static void
3295 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3296 const long *buf)
3298 if (FLOAT_WORDS_BIG_ENDIAN)
3300 /* All the padding in an Intel-format extended real goes at the high
3301 end, which in this case is after the mantissa, not the exponent.
3302 Therefore we must shift everything up 16 bits. */
3303 long intermed[3];
3305 intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3306 intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3307 intermed[2] = ((unsigned long)buf[0] >> 16);
3309 decode_ieee_extended (fmt, r, intermed);
3311 else
3312 /* decode_ieee_extended produces what we want directly. */
3313 decode_ieee_extended (fmt, r, buf);
3316 /* Convert from the internal format to the 16-byte Intel format for
3317 an IEEE extended real. */
3318 static void
3319 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3320 const long *buf)
3322 /* All the padding in an Intel-format extended real goes at the high end. */
3323 decode_ieee_extended_intel_96 (fmt, r, buf);
3326 const struct real_format ieee_extended_motorola_format =
3328 encode_ieee_extended_motorola,
3329 decode_ieee_extended_motorola,
3334 -16382,
3335 16384,
3338 true,
3339 true,
3340 true,
3341 true,
3342 true
3345 const struct real_format ieee_extended_intel_96_format =
3347 encode_ieee_extended_intel_96,
3348 decode_ieee_extended_intel_96,
3353 -16381,
3354 16384,
3357 true,
3358 true,
3359 true,
3360 true,
3361 true
3364 const struct real_format ieee_extended_intel_128_format =
3366 encode_ieee_extended_intel_128,
3367 decode_ieee_extended_intel_128,
3372 -16381,
3373 16384,
3376 true,
3377 true,
3378 true,
3379 true,
3380 true
3383 /* The following caters to i386 systems that set the rounding precision
3384 to 53 bits instead of 64, e.g. FreeBSD. */
3385 const struct real_format ieee_extended_intel_96_round_53_format =
3387 encode_ieee_extended_intel_96,
3388 decode_ieee_extended_intel_96,
3393 -16381,
3394 16384,
3397 true,
3398 true,
3399 true,
3400 true,
3401 true
3404 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3405 numbers whose sum is equal to the extended precision value. The number
3406 with greater magnitude is first. This format has the same magnitude
3407 range as an IEEE double precision value, but effectively 106 bits of
3408 significand precision. Infinity and NaN are represented by their IEEE
3409 double precision value stored in the first number, the second number is
3410 +0.0 or -0.0 for Infinity and don't-care for NaN. */
3412 static void encode_ibm_extended (const struct real_format *fmt,
3413 long *, const REAL_VALUE_TYPE *);
3414 static void decode_ibm_extended (const struct real_format *,
3415 REAL_VALUE_TYPE *, const long *);
3417 static void
3418 encode_ibm_extended (const struct real_format *fmt, long *buf,
3419 const REAL_VALUE_TYPE *r)
3421 REAL_VALUE_TYPE u, normr, v;
3422 const struct real_format *base_fmt;
3424 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3426 /* Renormlize R before doing any arithmetic on it. */
3427 normr = *r;
3428 if (normr.cl == rvc_normal)
3429 normalize (&normr);
3431 /* u = IEEE double precision portion of significand. */
3432 u = normr;
3433 round_for_format (base_fmt, &u);
3434 encode_ieee_double (base_fmt, &buf[0], &u);
3436 if (u.cl == rvc_normal)
3438 do_add (&v, &normr, &u, 1);
3439 /* Call round_for_format since we might need to denormalize. */
3440 round_for_format (base_fmt, &v);
3441 encode_ieee_double (base_fmt, &buf[2], &v);
3443 else
3445 /* Inf, NaN, 0 are all representable as doubles, so the
3446 least-significant part can be 0.0. */
3447 buf[2] = 0;
3448 buf[3] = 0;
3452 static void
3453 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3454 const long *buf)
3456 REAL_VALUE_TYPE u, v;
3457 const struct real_format *base_fmt;
3459 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3460 decode_ieee_double (base_fmt, &u, &buf[0]);
3462 if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3464 decode_ieee_double (base_fmt, &v, &buf[2]);
3465 do_add (r, &u, &v, 0);
3467 else
3468 *r = u;
3471 const struct real_format ibm_extended_format =
3473 encode_ibm_extended,
3474 decode_ibm_extended,
3477 53 + 53,
3479 -1021 + 53,
3480 1024,
3481 127,
3483 true,
3484 true,
3485 true,
3486 true,
3487 true
3490 const struct real_format mips_extended_format =
3492 encode_ibm_extended,
3493 decode_ibm_extended,
3496 53 + 53,
3498 -1021 + 53,
3499 1024,
3500 127,
3502 true,
3503 true,
3504 true,
3505 true,
3506 false
3510 /* IEEE quad precision format. */
3512 static void encode_ieee_quad (const struct real_format *fmt,
3513 long *, const REAL_VALUE_TYPE *);
3514 static void decode_ieee_quad (const struct real_format *,
3515 REAL_VALUE_TYPE *, const long *);
3517 static void
3518 encode_ieee_quad (const struct real_format *fmt, long *buf,
3519 const REAL_VALUE_TYPE *r)
3521 unsigned long image3, image2, image1, image0, exp;
3522 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3523 REAL_VALUE_TYPE u;
3525 image3 = r->sign << 31;
3526 image2 = 0;
3527 image1 = 0;
3528 image0 = 0;
3530 rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3532 switch (r->cl)
3534 case rvc_zero:
3535 break;
3537 case rvc_inf:
3538 if (fmt->has_inf)
3539 image3 |= 32767 << 16;
3540 else
3542 image3 |= 0x7fffffff;
3543 image2 = 0xffffffff;
3544 image1 = 0xffffffff;
3545 image0 = 0xffffffff;
3547 break;
3549 case rvc_nan:
3550 if (fmt->has_nans)
3552 image3 |= 32767 << 16;
3554 if (r->canonical)
3556 /* Don't use bits from the significand. The
3557 initialization above is right. */
3559 else if (HOST_BITS_PER_LONG == 32)
3561 image0 = u.sig[0];
3562 image1 = u.sig[1];
3563 image2 = u.sig[2];
3564 image3 |= u.sig[3] & 0xffff;
3566 else
3568 image0 = u.sig[0];
3569 image1 = image0 >> 31 >> 1;
3570 image2 = u.sig[1];
3571 image3 |= (image2 >> 31 >> 1) & 0xffff;
3572 image0 &= 0xffffffff;
3573 image2 &= 0xffffffff;
3575 if (r->signalling == fmt->qnan_msb_set)
3576 image3 &= ~0x8000;
3577 else
3578 image3 |= 0x8000;
3579 /* We overload qnan_msb_set here: it's only clear for
3580 mips_ieee_single, which wants all mantissa bits but the
3581 quiet/signalling one set in canonical NaNs (at least
3582 Quiet ones). */
3583 if (r->canonical && !fmt->qnan_msb_set)
3585 image3 |= 0x7fff;
3586 image2 = image1 = image0 = 0xffffffff;
3588 else if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3589 image3 |= 0x4000;
3591 else
3593 image3 |= 0x7fffffff;
3594 image2 = 0xffffffff;
3595 image1 = 0xffffffff;
3596 image0 = 0xffffffff;
3598 break;
3600 case rvc_normal:
3601 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3602 whereas the intermediate representation is 0.F x 2**exp.
3603 Which means we're off by one. */
3604 if (denormal)
3605 exp = 0;
3606 else
3607 exp = REAL_EXP (r) + 16383 - 1;
3608 image3 |= exp << 16;
3610 if (HOST_BITS_PER_LONG == 32)
3612 image0 = u.sig[0];
3613 image1 = u.sig[1];
3614 image2 = u.sig[2];
3615 image3 |= u.sig[3] & 0xffff;
3617 else
3619 image0 = u.sig[0];
3620 image1 = image0 >> 31 >> 1;
3621 image2 = u.sig[1];
3622 image3 |= (image2 >> 31 >> 1) & 0xffff;
3623 image0 &= 0xffffffff;
3624 image2 &= 0xffffffff;
3626 break;
3628 default:
3629 gcc_unreachable ();
3632 if (FLOAT_WORDS_BIG_ENDIAN)
3634 buf[0] = image3;
3635 buf[1] = image2;
3636 buf[2] = image1;
3637 buf[3] = image0;
3639 else
3641 buf[0] = image0;
3642 buf[1] = image1;
3643 buf[2] = image2;
3644 buf[3] = image3;
3648 static void
3649 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3650 const long *buf)
3652 unsigned long image3, image2, image1, image0;
3653 bool sign;
3654 int exp;
3656 if (FLOAT_WORDS_BIG_ENDIAN)
3658 image3 = buf[0];
3659 image2 = buf[1];
3660 image1 = buf[2];
3661 image0 = buf[3];
3663 else
3665 image0 = buf[0];
3666 image1 = buf[1];
3667 image2 = buf[2];
3668 image3 = buf[3];
3670 image0 &= 0xffffffff;
3671 image1 &= 0xffffffff;
3672 image2 &= 0xffffffff;
3674 sign = (image3 >> 31) & 1;
3675 exp = (image3 >> 16) & 0x7fff;
3676 image3 &= 0xffff;
3678 memset (r, 0, sizeof (*r));
3680 if (exp == 0)
3682 if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
3684 r->cl = rvc_normal;
3685 r->sign = sign;
3687 SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
3688 if (HOST_BITS_PER_LONG == 32)
3690 r->sig[0] = image0;
3691 r->sig[1] = image1;
3692 r->sig[2] = image2;
3693 r->sig[3] = image3;
3695 else
3697 r->sig[0] = (image1 << 31 << 1) | image0;
3698 r->sig[1] = (image3 << 31 << 1) | image2;
3701 normalize (r);
3703 else if (fmt->has_signed_zero)
3704 r->sign = sign;
3706 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3708 if (image3 | image2 | image1 | image0)
3710 r->cl = rvc_nan;
3711 r->sign = sign;
3712 r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
3714 if (HOST_BITS_PER_LONG == 32)
3716 r->sig[0] = image0;
3717 r->sig[1] = image1;
3718 r->sig[2] = image2;
3719 r->sig[3] = image3;
3721 else
3723 r->sig[0] = (image1 << 31 << 1) | image0;
3724 r->sig[1] = (image3 << 31 << 1) | image2;
3726 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3728 else
3730 r->cl = rvc_inf;
3731 r->sign = sign;
3734 else
3736 r->cl = rvc_normal;
3737 r->sign = sign;
3738 SET_REAL_EXP (r, exp - 16383 + 1);
3740 if (HOST_BITS_PER_LONG == 32)
3742 r->sig[0] = image0;
3743 r->sig[1] = image1;
3744 r->sig[2] = image2;
3745 r->sig[3] = image3;
3747 else
3749 r->sig[0] = (image1 << 31 << 1) | image0;
3750 r->sig[1] = (image3 << 31 << 1) | image2;
3752 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3753 r->sig[SIGSZ-1] |= SIG_MSB;
3757 const struct real_format ieee_quad_format =
3759 encode_ieee_quad,
3760 decode_ieee_quad,
3763 113,
3764 113,
3765 -16381,
3766 16384,
3767 127,
3768 127,
3769 true,
3770 true,
3771 true,
3772 true,
3773 true
3776 const struct real_format mips_quad_format =
3778 encode_ieee_quad,
3779 decode_ieee_quad,
3782 113,
3783 113,
3784 -16381,
3785 16384,
3786 127,
3787 127,
3788 true,
3789 true,
3790 true,
3791 true,
3792 false
3795 /* Descriptions of VAX floating point formats can be found beginning at
3797 http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
3799 The thing to remember is that they're almost IEEE, except for word
3800 order, exponent bias, and the lack of infinities, nans, and denormals.
3802 We don't implement the H_floating format here, simply because neither
3803 the VAX or Alpha ports use it. */
3805 static void encode_vax_f (const struct real_format *fmt,
3806 long *, const REAL_VALUE_TYPE *);
3807 static void decode_vax_f (const struct real_format *,
3808 REAL_VALUE_TYPE *, const long *);
3809 static void encode_vax_d (const struct real_format *fmt,
3810 long *, const REAL_VALUE_TYPE *);
3811 static void decode_vax_d (const struct real_format *,
3812 REAL_VALUE_TYPE *, const long *);
3813 static void encode_vax_g (const struct real_format *fmt,
3814 long *, const REAL_VALUE_TYPE *);
3815 static void decode_vax_g (const struct real_format *,
3816 REAL_VALUE_TYPE *, const long *);
3818 static void
3819 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3820 const REAL_VALUE_TYPE *r)
3822 unsigned long sign, exp, sig, image;
3824 sign = r->sign << 15;
3826 switch (r->cl)
3828 case rvc_zero:
3829 image = 0;
3830 break;
3832 case rvc_inf:
3833 case rvc_nan:
3834 image = 0xffff7fff | sign;
3835 break;
3837 case rvc_normal:
3838 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
3839 exp = REAL_EXP (r) + 128;
3841 image = (sig << 16) & 0xffff0000;
3842 image |= sign;
3843 image |= exp << 7;
3844 image |= sig >> 16;
3845 break;
3847 default:
3848 gcc_unreachable ();
3851 buf[0] = image;
3854 static void
3855 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
3856 REAL_VALUE_TYPE *r, const long *buf)
3858 unsigned long image = buf[0] & 0xffffffff;
3859 int exp = (image >> 7) & 0xff;
3861 memset (r, 0, sizeof (*r));
3863 if (exp != 0)
3865 r->cl = rvc_normal;
3866 r->sign = (image >> 15) & 1;
3867 SET_REAL_EXP (r, exp - 128);
3869 image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
3870 r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
3874 static void
3875 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3876 const REAL_VALUE_TYPE *r)
3878 unsigned long image0, image1, sign = r->sign << 15;
3880 switch (r->cl)
3882 case rvc_zero:
3883 image0 = image1 = 0;
3884 break;
3886 case rvc_inf:
3887 case rvc_nan:
3888 image0 = 0xffff7fff | sign;
3889 image1 = 0xffffffff;
3890 break;
3892 case rvc_normal:
3893 /* Extract the significand into straight hi:lo. */
3894 if (HOST_BITS_PER_LONG == 64)
3896 image0 = r->sig[SIGSZ-1];
3897 image1 = (image0 >> (64 - 56)) & 0xffffffff;
3898 image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
3900 else
3902 image0 = r->sig[SIGSZ-1];
3903 image1 = r->sig[SIGSZ-2];
3904 image1 = (image0 << 24) | (image1 >> 8);
3905 image0 = (image0 >> 8) & 0xffffff;
3908 /* Rearrange the half-words of the significand to match the
3909 external format. */
3910 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
3911 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3913 /* Add the sign and exponent. */
3914 image0 |= sign;
3915 image0 |= (REAL_EXP (r) + 128) << 7;
3916 break;
3918 default:
3919 gcc_unreachable ();
3922 if (FLOAT_WORDS_BIG_ENDIAN)
3923 buf[0] = image1, buf[1] = image0;
3924 else
3925 buf[0] = image0, buf[1] = image1;
3928 static void
3929 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
3930 REAL_VALUE_TYPE *r, const long *buf)
3932 unsigned long image0, image1;
3933 int exp;
3935 if (FLOAT_WORDS_BIG_ENDIAN)
3936 image1 = buf[0], image0 = buf[1];
3937 else
3938 image0 = buf[0], image1 = buf[1];
3939 image0 &= 0xffffffff;
3940 image1 &= 0xffffffff;
3942 exp = (image0 >> 7) & 0xff;
3944 memset (r, 0, sizeof (*r));
3946 if (exp != 0)
3948 r->cl = rvc_normal;
3949 r->sign = (image0 >> 15) & 1;
3950 SET_REAL_EXP (r, exp - 128);
3952 /* Rearrange the half-words of the external format into
3953 proper ascending order. */
3954 image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
3955 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3957 if (HOST_BITS_PER_LONG == 64)
3959 image0 = (image0 << 31 << 1) | image1;
3960 image0 <<= 64 - 56;
3961 image0 |= SIG_MSB;
3962 r->sig[SIGSZ-1] = image0;
3964 else
3966 r->sig[SIGSZ-1] = image0;
3967 r->sig[SIGSZ-2] = image1;
3968 lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
3969 r->sig[SIGSZ-1] |= SIG_MSB;
3974 static void
3975 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3976 const REAL_VALUE_TYPE *r)
3978 unsigned long image0, image1, sign = r->sign << 15;
3980 switch (r->cl)
3982 case rvc_zero:
3983 image0 = image1 = 0;
3984 break;
3986 case rvc_inf:
3987 case rvc_nan:
3988 image0 = 0xffff7fff | sign;
3989 image1 = 0xffffffff;
3990 break;
3992 case rvc_normal:
3993 /* Extract the significand into straight hi:lo. */
3994 if (HOST_BITS_PER_LONG == 64)
3996 image0 = r->sig[SIGSZ-1];
3997 image1 = (image0 >> (64 - 53)) & 0xffffffff;
3998 image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
4000 else
4002 image0 = r->sig[SIGSZ-1];
4003 image1 = r->sig[SIGSZ-2];
4004 image1 = (image0 << 21) | (image1 >> 11);
4005 image0 = (image0 >> 11) & 0xfffff;
4008 /* Rearrange the half-words of the significand to match the
4009 external format. */
4010 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
4011 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4013 /* Add the sign and exponent. */
4014 image0 |= sign;
4015 image0 |= (REAL_EXP (r) + 1024) << 4;
4016 break;
4018 default:
4019 gcc_unreachable ();
4022 if (FLOAT_WORDS_BIG_ENDIAN)
4023 buf[0] = image1, buf[1] = image0;
4024 else
4025 buf[0] = image0, buf[1] = image1;
4028 static void
4029 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
4030 REAL_VALUE_TYPE *r, const long *buf)
4032 unsigned long image0, image1;
4033 int exp;
4035 if (FLOAT_WORDS_BIG_ENDIAN)
4036 image1 = buf[0], image0 = buf[1];
4037 else
4038 image0 = buf[0], image1 = buf[1];
4039 image0 &= 0xffffffff;
4040 image1 &= 0xffffffff;
4042 exp = (image0 >> 4) & 0x7ff;
4044 memset (r, 0, sizeof (*r));
4046 if (exp != 0)
4048 r->cl = rvc_normal;
4049 r->sign = (image0 >> 15) & 1;
4050 SET_REAL_EXP (r, exp - 1024);
4052 /* Rearrange the half-words of the external format into
4053 proper ascending order. */
4054 image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
4055 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4057 if (HOST_BITS_PER_LONG == 64)
4059 image0 = (image0 << 31 << 1) | image1;
4060 image0 <<= 64 - 53;
4061 image0 |= SIG_MSB;
4062 r->sig[SIGSZ-1] = image0;
4064 else
4066 r->sig[SIGSZ-1] = image0;
4067 r->sig[SIGSZ-2] = image1;
4068 lshift_significand (r, r, 64 - 53);
4069 r->sig[SIGSZ-1] |= SIG_MSB;
4074 const struct real_format vax_f_format =
4076 encode_vax_f,
4077 decode_vax_f,
4082 -127,
4083 127,
4086 false,
4087 false,
4088 false,
4089 false,
4090 false
4093 const struct real_format vax_d_format =
4095 encode_vax_d,
4096 decode_vax_d,
4101 -127,
4102 127,
4105 false,
4106 false,
4107 false,
4108 false,
4109 false
4112 const struct real_format vax_g_format =
4114 encode_vax_g,
4115 decode_vax_g,
4120 -1023,
4121 1023,
4124 false,
4125 false,
4126 false,
4127 false,
4128 false
4131 /* A good reference for these can be found in chapter 9 of
4132 "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
4133 An on-line version can be found here:
4135 http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
4138 static void encode_i370_single (const struct real_format *fmt,
4139 long *, const REAL_VALUE_TYPE *);
4140 static void decode_i370_single (const struct real_format *,
4141 REAL_VALUE_TYPE *, const long *);
4142 static void encode_i370_double (const struct real_format *fmt,
4143 long *, const REAL_VALUE_TYPE *);
4144 static void decode_i370_double (const struct real_format *,
4145 REAL_VALUE_TYPE *, const long *);
4147 static void
4148 encode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4149 long *buf, const REAL_VALUE_TYPE *r)
4151 unsigned long sign, exp, sig, image;
4153 sign = r->sign << 31;
4155 switch (r->cl)
4157 case rvc_zero:
4158 image = 0;
4159 break;
4161 case rvc_inf:
4162 case rvc_nan:
4163 image = 0x7fffffff | sign;
4164 break;
4166 case rvc_normal:
4167 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
4168 exp = ((REAL_EXP (r) / 4) + 64) << 24;
4169 image = sign | exp | sig;
4170 break;
4172 default:
4173 gcc_unreachable ();
4176 buf[0] = image;
4179 static void
4180 decode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4181 REAL_VALUE_TYPE *r, const long *buf)
4183 unsigned long sign, sig, image = buf[0];
4184 int exp;
4186 sign = (image >> 31) & 1;
4187 exp = (image >> 24) & 0x7f;
4188 sig = image & 0xffffff;
4190 memset (r, 0, sizeof (*r));
4192 if (exp || sig)
4194 r->cl = rvc_normal;
4195 r->sign = sign;
4196 SET_REAL_EXP (r, (exp - 64) * 4);
4197 r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
4198 normalize (r);
4202 static void
4203 encode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4204 long *buf, const REAL_VALUE_TYPE *r)
4206 unsigned long sign, exp, image_hi, image_lo;
4208 sign = r->sign << 31;
4210 switch (r->cl)
4212 case rvc_zero:
4213 image_hi = image_lo = 0;
4214 break;
4216 case rvc_inf:
4217 case rvc_nan:
4218 image_hi = 0x7fffffff | sign;
4219 image_lo = 0xffffffff;
4220 break;
4222 case rvc_normal:
4223 if (HOST_BITS_PER_LONG == 64)
4225 image_hi = r->sig[SIGSZ-1];
4226 image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
4227 image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
4229 else
4231 image_hi = r->sig[SIGSZ-1];
4232 image_lo = r->sig[SIGSZ-2];
4233 image_lo = (image_lo >> 8) | (image_hi << 24);
4234 image_hi >>= 8;
4237 exp = ((REAL_EXP (r) / 4) + 64) << 24;
4238 image_hi |= sign | exp;
4239 break;
4241 default:
4242 gcc_unreachable ();
4245 if (FLOAT_WORDS_BIG_ENDIAN)
4246 buf[0] = image_hi, buf[1] = image_lo;
4247 else
4248 buf[0] = image_lo, buf[1] = image_hi;
4251 static void
4252 decode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4253 REAL_VALUE_TYPE *r, const long *buf)
4255 unsigned long sign, image_hi, image_lo;
4256 int exp;
4258 if (FLOAT_WORDS_BIG_ENDIAN)
4259 image_hi = buf[0], image_lo = buf[1];
4260 else
4261 image_lo = buf[0], image_hi = buf[1];
4263 sign = (image_hi >> 31) & 1;
4264 exp = (image_hi >> 24) & 0x7f;
4265 image_hi &= 0xffffff;
4266 image_lo &= 0xffffffff;
4268 memset (r, 0, sizeof (*r));
4270 if (exp || image_hi || image_lo)
4272 r->cl = rvc_normal;
4273 r->sign = sign;
4274 SET_REAL_EXP (r, (exp - 64) * 4 + (SIGNIFICAND_BITS - 56));
4276 if (HOST_BITS_PER_LONG == 32)
4278 r->sig[0] = image_lo;
4279 r->sig[1] = image_hi;
4281 else
4282 r->sig[0] = image_lo | (image_hi << 31 << 1);
4284 normalize (r);
4288 const struct real_format i370_single_format =
4290 encode_i370_single,
4291 decode_i370_single,
4296 -64,
4300 false,
4301 false,
4302 false, /* ??? The encoding does allow for "unnormals". */
4303 false, /* ??? The encoding does allow for "unnormals". */
4304 false
4307 const struct real_format i370_double_format =
4309 encode_i370_double,
4310 decode_i370_double,
4315 -64,
4319 false,
4320 false,
4321 false, /* ??? The encoding does allow for "unnormals". */
4322 false, /* ??? The encoding does allow for "unnormals". */
4323 false
4326 /* Encode real R into a single precision DFP value in BUF. */
4327 static void
4328 encode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4329 long *buf ATTRIBUTE_UNUSED,
4330 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4332 encode_decimal32 (fmt, buf, r);
4335 /* Decode a single precision DFP value in BUF into a real R. */
4336 static void
4337 decode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4338 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4339 const long *buf ATTRIBUTE_UNUSED)
4341 decode_decimal32 (fmt, r, buf);
4344 /* Encode real R into a double precision DFP value in BUF. */
4345 static void
4346 encode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4347 long *buf ATTRIBUTE_UNUSED,
4348 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4350 encode_decimal64 (fmt, buf, r);
4353 /* Decode a double precision DFP value in BUF into a real R. */
4354 static void
4355 decode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4356 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4357 const long *buf ATTRIBUTE_UNUSED)
4359 decode_decimal64 (fmt, r, buf);
4362 /* Encode real R into a quad precision DFP value in BUF. */
4363 static void
4364 encode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4365 long *buf ATTRIBUTE_UNUSED,
4366 const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4368 encode_decimal128 (fmt, buf, r);
4371 /* Decode a quad precision DFP value in BUF into a real R. */
4372 static void
4373 decode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4374 REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4375 const long *buf ATTRIBUTE_UNUSED)
4377 decode_decimal128 (fmt, r, buf);
4380 /* Single precision decimal floating point (IEEE 754R). */
4381 const struct real_format decimal_single_format =
4383 encode_decimal_single,
4384 decode_decimal_single,
4385 10,
4386 1, /* log10 */
4389 -95,
4393 true,
4394 true,
4395 true,
4396 true,
4397 true
4400 /* Double precision decimal floating point (IEEE 754R). */
4401 const struct real_format decimal_double_format =
4403 encode_decimal_double,
4404 decode_decimal_double,
4406 1, /* log10 */
4409 -383,
4410 384,
4413 true,
4414 true,
4415 true,
4416 true,
4417 true
4420 /* Quad precision decimal floating point (IEEE 754R). */
4421 const struct real_format decimal_quad_format =
4423 encode_decimal_quad,
4424 decode_decimal_quad,
4426 1, /* log10 */
4429 -6143,
4430 6144,
4431 127,
4432 127,
4433 true,
4434 true,
4435 true,
4436 true,
4437 true
4440 /* The "twos-complement" c4x format is officially defined as
4442 x = s(~s).f * 2**e
4444 This is rather misleading. One must remember that F is signed.
4445 A better description would be
4447 x = -1**s * ((s + 1 + .f) * 2**e
4449 So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
4450 that's -1 * (1+1+(-.5)) == -1.5. I think.
4452 The constructions here are taken from Tables 5-1 and 5-2 of the
4453 TMS320C4x User's Guide wherein step-by-step instructions for
4454 conversion from IEEE are presented. That's close enough to our
4455 internal representation so as to make things easy.
4457 See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf */
4459 static void encode_c4x_single (const struct real_format *fmt,
4460 long *, const REAL_VALUE_TYPE *);
4461 static void decode_c4x_single (const struct real_format *,
4462 REAL_VALUE_TYPE *, const long *);
4463 static void encode_c4x_extended (const struct real_format *fmt,
4464 long *, const REAL_VALUE_TYPE *);
4465 static void decode_c4x_extended (const struct real_format *,
4466 REAL_VALUE_TYPE *, const long *);
4468 static void
4469 encode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4470 long *buf, const REAL_VALUE_TYPE *r)
4472 unsigned long image, exp, sig;
4474 switch (r->cl)
4476 case rvc_zero:
4477 exp = -128;
4478 sig = 0;
4479 break;
4481 case rvc_inf:
4482 case rvc_nan:
4483 exp = 127;
4484 sig = 0x800000 - r->sign;
4485 break;
4487 case rvc_normal:
4488 exp = REAL_EXP (r) - 1;
4489 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4490 if (r->sign)
4492 if (sig)
4493 sig = -sig;
4494 else
4495 exp--;
4496 sig |= 0x800000;
4498 break;
4500 default:
4501 gcc_unreachable ();
4504 image = ((exp & 0xff) << 24) | (sig & 0xffffff);
4505 buf[0] = image;
4508 static void
4509 decode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4510 REAL_VALUE_TYPE *r, const long *buf)
4512 unsigned long image = buf[0];
4513 unsigned long sig;
4514 int exp, sf;
4516 exp = (((image >> 24) & 0xff) ^ 0x80) - 0x80;
4517 sf = ((image & 0xffffff) ^ 0x800000) - 0x800000;
4519 memset (r, 0, sizeof (*r));
4521 if (exp != -128)
4523 r->cl = rvc_normal;
4525 sig = sf & 0x7fffff;
4526 if (sf < 0)
4528 r->sign = 1;
4529 if (sig)
4530 sig = -sig;
4531 else
4532 exp++;
4534 sig = (sig << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4536 SET_REAL_EXP (r, exp + 1);
4537 r->sig[SIGSZ-1] = sig;
4541 static void
4542 encode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4543 long *buf, const REAL_VALUE_TYPE *r)
4545 unsigned long exp, sig;
4547 switch (r->cl)
4549 case rvc_zero:
4550 exp = -128;
4551 sig = 0;
4552 break;
4554 case rvc_inf:
4555 case rvc_nan:
4556 exp = 127;
4557 sig = 0x80000000 - r->sign;
4558 break;
4560 case rvc_normal:
4561 exp = REAL_EXP (r) - 1;
4563 sig = r->sig[SIGSZ-1];
4564 if (HOST_BITS_PER_LONG == 64)
4565 sig = sig >> 1 >> 31;
4566 sig &= 0x7fffffff;
4568 if (r->sign)
4570 if (sig)
4571 sig = -sig;
4572 else
4573 exp--;
4574 sig |= 0x80000000;
4576 break;
4578 default:
4579 gcc_unreachable ();
4582 exp = (exp & 0xff) << 24;
4583 sig &= 0xffffffff;
4585 if (FLOAT_WORDS_BIG_ENDIAN)
4586 buf[0] = exp, buf[1] = sig;
4587 else
4588 buf[0] = sig, buf[0] = exp;
4591 static void
4592 decode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4593 REAL_VALUE_TYPE *r, const long *buf)
4595 unsigned long sig;
4596 int exp, sf;
4598 if (FLOAT_WORDS_BIG_ENDIAN)
4599 exp = buf[0], sf = buf[1];
4600 else
4601 sf = buf[0], exp = buf[1];
4603 exp = (((exp >> 24) & 0xff) & 0x80) - 0x80;
4604 sf = ((sf & 0xffffffff) ^ 0x80000000) - 0x80000000;
4606 memset (r, 0, sizeof (*r));
4608 if (exp != -128)
4610 r->cl = rvc_normal;
4612 sig = sf & 0x7fffffff;
4613 if (sf < 0)
4615 r->sign = 1;
4616 if (sig)
4617 sig = -sig;
4618 else
4619 exp++;
4621 if (HOST_BITS_PER_LONG == 64)
4622 sig = sig << 1 << 31;
4623 sig |= SIG_MSB;
4625 SET_REAL_EXP (r, exp + 1);
4626 r->sig[SIGSZ-1] = sig;
4630 const struct real_format c4x_single_format =
4632 encode_c4x_single,
4633 decode_c4x_single,
4638 -126,
4639 128,
4642 false,
4643 false,
4644 false,
4645 false,
4646 false
4649 const struct real_format c4x_extended_format =
4651 encode_c4x_extended,
4652 decode_c4x_extended,
4657 -126,
4658 128,
4661 false,
4662 false,
4663 false,
4664 false,
4665 false
4669 /* A synthetic "format" for internal arithmetic. It's the size of the
4670 internal significand minus the two bits needed for proper rounding.
4671 The encode and decode routines exist only to satisfy our paranoia
4672 harness. */
4674 static void encode_internal (const struct real_format *fmt,
4675 long *, const REAL_VALUE_TYPE *);
4676 static void decode_internal (const struct real_format *,
4677 REAL_VALUE_TYPE *, const long *);
4679 static void
4680 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4681 const REAL_VALUE_TYPE *r)
4683 memcpy (buf, r, sizeof (*r));
4686 static void
4687 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4688 REAL_VALUE_TYPE *r, const long *buf)
4690 memcpy (r, buf, sizeof (*r));
4693 const struct real_format real_internal_format =
4695 encode_internal,
4696 decode_internal,
4699 SIGNIFICAND_BITS - 2,
4700 SIGNIFICAND_BITS - 2,
4701 -MAX_EXP,
4702 MAX_EXP,
4705 true,
4706 true,
4707 false,
4708 true,
4709 true
4712 /* Calculate the square root of X in mode MODE, and store the result
4713 in R. Return TRUE if the operation does not raise an exception.
4714 For details see "High Precision Division and Square Root",
4715 Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June
4716 1993. http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf. */
4718 bool
4719 real_sqrt (REAL_VALUE_TYPE *r, enum machine_mode mode,
4720 const REAL_VALUE_TYPE *x)
4722 static REAL_VALUE_TYPE halfthree;
4723 static bool init = false;
4724 REAL_VALUE_TYPE h, t, i;
4725 int iter, exp;
4727 /* sqrt(-0.0) is -0.0. */
4728 if (real_isnegzero (x))
4730 *r = *x;
4731 return false;
4734 /* Negative arguments return NaN. */
4735 if (real_isneg (x))
4737 get_canonical_qnan (r, 0);
4738 return false;
4741 /* Infinity and NaN return themselves. */
4742 if (real_isinf (x) || real_isnan (x))
4744 *r = *x;
4745 return false;
4748 if (!init)
4750 do_add (&halfthree, &dconst1, &dconsthalf, 0);
4751 init = true;
4754 /* Initial guess for reciprocal sqrt, i. */
4755 exp = real_exponent (x);
4756 real_ldexp (&i, &dconst1, -exp/2);
4758 /* Newton's iteration for reciprocal sqrt, i. */
4759 for (iter = 0; iter < 16; iter++)
4761 /* i(n+1) = i(n) * (1.5 - 0.5*i(n)*i(n)*x). */
4762 do_multiply (&t, x, &i);
4763 do_multiply (&h, &t, &i);
4764 do_multiply (&t, &h, &dconsthalf);
4765 do_add (&h, &halfthree, &t, 1);
4766 do_multiply (&t, &i, &h);
4768 /* Check for early convergence. */
4769 if (iter >= 6 && real_identical (&i, &t))
4770 break;
4772 /* ??? Unroll loop to avoid copying. */
4773 i = t;
4776 /* Final iteration: r = i*x + 0.5*i*x*(1.0 - i*(i*x)). */
4777 do_multiply (&t, x, &i);
4778 do_multiply (&h, &t, &i);
4779 do_add (&i, &dconst1, &h, 1);
4780 do_multiply (&h, &t, &i);
4781 do_multiply (&i, &dconsthalf, &h);
4782 do_add (&h, &t, &i, 0);
4784 /* ??? We need a Tuckerman test to get the last bit. */
4786 real_convert (r, mode, &h);
4787 return true;
4790 /* Calculate X raised to the integer exponent N in mode MODE and store
4791 the result in R. Return true if the result may be inexact due to
4792 loss of precision. The algorithm is the classic "left-to-right binary
4793 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4794 Algorithms", "The Art of Computer Programming", Volume 2. */
4796 bool
4797 real_powi (REAL_VALUE_TYPE *r, enum machine_mode mode,
4798 const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4800 unsigned HOST_WIDE_INT bit;
4801 REAL_VALUE_TYPE t;
4802 bool inexact = false;
4803 bool init = false;
4804 bool neg;
4805 int i;
4807 if (n == 0)
4809 *r = dconst1;
4810 return false;
4812 else if (n < 0)
4814 /* Don't worry about overflow, from now on n is unsigned. */
4815 neg = true;
4816 n = -n;
4818 else
4819 neg = false;
4821 t = *x;
4822 bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4823 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4825 if (init)
4827 inexact |= do_multiply (&t, &t, &t);
4828 if (n & bit)
4829 inexact |= do_multiply (&t, &t, x);
4831 else if (n & bit)
4832 init = true;
4833 bit >>= 1;
4836 if (neg)
4837 inexact |= do_divide (&t, &dconst1, &t);
4839 real_convert (r, mode, &t);
4840 return inexact;
4843 /* Round X to the nearest integer not larger in absolute value, i.e.
4844 towards zero, placing the result in R in mode MODE. */
4846 void
4847 real_trunc (REAL_VALUE_TYPE *r, enum machine_mode mode,
4848 const REAL_VALUE_TYPE *x)
4850 do_fix_trunc (r, x);
4851 if (mode != VOIDmode)
4852 real_convert (r, mode, r);
4855 /* Round X to the largest integer not greater in value, i.e. round
4856 down, placing the result in R in mode MODE. */
4858 void
4859 real_floor (REAL_VALUE_TYPE *r, enum machine_mode mode,
4860 const REAL_VALUE_TYPE *x)
4862 REAL_VALUE_TYPE t;
4864 do_fix_trunc (&t, x);
4865 if (! real_identical (&t, x) && x->sign)
4866 do_add (&t, &t, &dconstm1, 0);
4867 if (mode != VOIDmode)
4868 real_convert (r, mode, &t);
4869 else
4870 *r = t;
4873 /* Round X to the smallest integer not less then argument, i.e. round
4874 up, placing the result in R in mode MODE. */
4876 void
4877 real_ceil (REAL_VALUE_TYPE *r, enum machine_mode mode,
4878 const REAL_VALUE_TYPE *x)
4880 REAL_VALUE_TYPE t;
4882 do_fix_trunc (&t, x);
4883 if (! real_identical (&t, x) && ! x->sign)
4884 do_add (&t, &t, &dconst1, 0);
4885 if (mode != VOIDmode)
4886 real_convert (r, mode, &t);
4887 else
4888 *r = t;
4891 /* Round X to the nearest integer, but round halfway cases away from
4892 zero. */
4894 void
4895 real_round (REAL_VALUE_TYPE *r, enum machine_mode mode,
4896 const REAL_VALUE_TYPE *x)
4898 do_add (r, x, &dconsthalf, x->sign);
4899 do_fix_trunc (r, r);
4900 if (mode != VOIDmode)
4901 real_convert (r, mode, r);
4904 /* Set the sign of R to the sign of X. */
4906 void
4907 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
4909 r->sign = x->sign;