* check-init.c, decl.c, expr.c, gcj.texi, java-tree.h,
[official-gcc.git] / gcc / real.c
blob2d2618521066428f68000dcf57f6a588d8d1a103
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"
33 /* The floating point model used internally is not exactly IEEE 754
34 compliant, and close to the description in the ISO C99 standard,
35 section 5.2.4.2.2 Characteristics of floating types.
37 Specifically
39 x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
41 where
42 s = sign (+- 1)
43 b = base or radix, here always 2
44 e = exponent
45 p = precision (the number of base-b digits in the significand)
46 f_k = the digits of the significand.
48 We differ from typical IEEE 754 encodings in that the entire
49 significand is fractional. Normalized significands are in the
50 range [0.5, 1.0).
52 A requirement of the model is that P be larger than the largest
53 supported target floating-point type by at least 2 bits. This gives
54 us proper rounding when we truncate to the target type. In addition,
55 E must be large enough to hold the smallest supported denormal number
56 in a normalized form.
58 Both of these requirements are easily satisfied. The largest target
59 significand is 113 bits; we store at least 160. The smallest
60 denormal number fits in 17 exponent bits; we store 27.
62 Note that the decimal string conversion routines are sensitive to
63 rounding errors. Since the raw arithmetic routines do not themselves
64 have guard digits or rounding, the computation of 10**exp can
65 accumulate more than a few digits of error. The previous incarnation
66 of real.c successfully used a 144-bit fraction; given the current
67 layout of REAL_VALUE_TYPE we're forced to expand to at least 160 bits.
69 Target floating point models that use base 16 instead of base 2
70 (i.e. IBM 370), are handled during round_for_format, in which we
71 canonicalize the exponent to be a multiple of 4 (log2(16)), and
72 adjust the significand to match. */
75 /* Used to classify two numbers simultaneously. */
76 #define CLASS2(A, B) ((A) << 2 | (B))
78 #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
79 #error "Some constant folding done by hand to avoid shift count warnings"
80 #endif
82 static void get_zero (REAL_VALUE_TYPE *, int);
83 static void get_canonical_qnan (REAL_VALUE_TYPE *, int);
84 static void get_canonical_snan (REAL_VALUE_TYPE *, int);
85 static void get_inf (REAL_VALUE_TYPE *, int);
86 static bool sticky_rshift_significand (REAL_VALUE_TYPE *,
87 const REAL_VALUE_TYPE *, unsigned int);
88 static void rshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
89 unsigned int);
90 static void lshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
91 unsigned int);
92 static void lshift_significand_1 (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
93 static bool add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *,
94 const REAL_VALUE_TYPE *);
95 static bool sub_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
96 const REAL_VALUE_TYPE *, int);
97 static void neg_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
98 static int cmp_significands (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
99 static int cmp_significand_0 (const REAL_VALUE_TYPE *);
100 static void set_significand_bit (REAL_VALUE_TYPE *, unsigned int);
101 static void clear_significand_bit (REAL_VALUE_TYPE *, unsigned int);
102 static bool test_significand_bit (REAL_VALUE_TYPE *, unsigned int);
103 static void clear_significand_below (REAL_VALUE_TYPE *, unsigned int);
104 static bool div_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
105 const REAL_VALUE_TYPE *);
106 static void normalize (REAL_VALUE_TYPE *);
108 static bool do_add (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
109 const REAL_VALUE_TYPE *, int);
110 static bool do_multiply (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
111 const REAL_VALUE_TYPE *);
112 static bool do_divide (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
113 const REAL_VALUE_TYPE *);
114 static int do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
115 static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
117 static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *);
119 static const REAL_VALUE_TYPE * ten_to_ptwo (int);
120 static const REAL_VALUE_TYPE * ten_to_mptwo (int);
121 static const REAL_VALUE_TYPE * real_digit (int);
122 static void times_pten (REAL_VALUE_TYPE *, int);
124 static void round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
126 /* Initialize R with a positive zero. */
128 static inline void
129 get_zero (REAL_VALUE_TYPE *r, int sign)
131 memset (r, 0, sizeof (*r));
132 r->sign = sign;
135 /* Initialize R with the canonical quiet NaN. */
137 static inline void
138 get_canonical_qnan (REAL_VALUE_TYPE *r, int sign)
140 memset (r, 0, sizeof (*r));
141 r->cl = rvc_nan;
142 r->sign = sign;
143 r->canonical = 1;
146 static inline void
147 get_canonical_snan (REAL_VALUE_TYPE *r, int sign)
149 memset (r, 0, sizeof (*r));
150 r->cl = rvc_nan;
151 r->sign = sign;
152 r->signalling = 1;
153 r->canonical = 1;
156 static inline void
157 get_inf (REAL_VALUE_TYPE *r, int sign)
159 memset (r, 0, sizeof (*r));
160 r->cl = rvc_inf;
161 r->sign = sign;
165 /* Right-shift the significand of A by N bits; put the result in the
166 significand of R. If any one bits are shifted out, return true. */
168 static bool
169 sticky_rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
170 unsigned int n)
172 unsigned long sticky = 0;
173 unsigned int i, ofs = 0;
175 if (n >= HOST_BITS_PER_LONG)
177 for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i)
178 sticky |= a->sig[i];
179 n &= HOST_BITS_PER_LONG - 1;
182 if (n != 0)
184 sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1);
185 for (i = 0; i < SIGSZ; ++i)
187 r->sig[i]
188 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
189 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
190 << (HOST_BITS_PER_LONG - n)));
193 else
195 for (i = 0; ofs + i < SIGSZ; ++i)
196 r->sig[i] = a->sig[ofs + i];
197 for (; i < SIGSZ; ++i)
198 r->sig[i] = 0;
201 return sticky != 0;
204 /* Right-shift the significand of A by N bits; put the result in the
205 significand of R. */
207 static void
208 rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
209 unsigned int n)
211 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
213 n &= HOST_BITS_PER_LONG - 1;
214 if (n != 0)
216 for (i = 0; i < SIGSZ; ++i)
218 r->sig[i]
219 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
220 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
221 << (HOST_BITS_PER_LONG - n)));
224 else
226 for (i = 0; ofs + i < SIGSZ; ++i)
227 r->sig[i] = a->sig[ofs + i];
228 for (; i < SIGSZ; ++i)
229 r->sig[i] = 0;
233 /* Left-shift the significand of A by N bits; put the result in the
234 significand of R. */
236 static void
237 lshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
238 unsigned int n)
240 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
242 n &= HOST_BITS_PER_LONG - 1;
243 if (n == 0)
245 for (i = 0; ofs + i < SIGSZ; ++i)
246 r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs];
247 for (; i < SIGSZ; ++i)
248 r->sig[SIGSZ-1-i] = 0;
250 else
251 for (i = 0; i < SIGSZ; ++i)
253 r->sig[SIGSZ-1-i]
254 = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n)
255 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1])
256 >> (HOST_BITS_PER_LONG - n)));
260 /* Likewise, but N is specialized to 1. */
262 static inline void
263 lshift_significand_1 (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
265 unsigned int i;
267 for (i = SIGSZ - 1; i > 0; --i)
268 r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1));
269 r->sig[0] = a->sig[0] << 1;
272 /* Add the significands of A and B, placing the result in R. Return
273 true if there was carry out of the most significant word. */
275 static inline bool
276 add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
277 const REAL_VALUE_TYPE *b)
279 bool carry = false;
280 int i;
282 for (i = 0; i < SIGSZ; ++i)
284 unsigned long ai = a->sig[i];
285 unsigned long ri = ai + b->sig[i];
287 if (carry)
289 carry = ri < ai;
290 carry |= ++ri == 0;
292 else
293 carry = ri < ai;
295 r->sig[i] = ri;
298 return carry;
301 /* Subtract the significands of A and B, placing the result in R. CARRY is
302 true if there's a borrow incoming to the least significant word.
303 Return true if there was borrow out of the most significant word. */
305 static inline bool
306 sub_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
307 const REAL_VALUE_TYPE *b, int carry)
309 int i;
311 for (i = 0; i < SIGSZ; ++i)
313 unsigned long ai = a->sig[i];
314 unsigned long ri = ai - b->sig[i];
316 if (carry)
318 carry = ri > ai;
319 carry |= ~--ri == 0;
321 else
322 carry = ri > ai;
324 r->sig[i] = ri;
327 return carry;
330 /* Negate the significand A, placing the result in R. */
332 static inline void
333 neg_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
335 bool carry = true;
336 int i;
338 for (i = 0; i < SIGSZ; ++i)
340 unsigned long ri, ai = a->sig[i];
342 if (carry)
344 if (ai)
346 ri = -ai;
347 carry = false;
349 else
350 ri = ai;
352 else
353 ri = ~ai;
355 r->sig[i] = ri;
359 /* Compare significands. Return tri-state vs zero. */
361 static inline int
362 cmp_significands (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
364 int i;
366 for (i = SIGSZ - 1; i >= 0; --i)
368 unsigned long ai = a->sig[i];
369 unsigned long bi = b->sig[i];
371 if (ai > bi)
372 return 1;
373 if (ai < bi)
374 return -1;
377 return 0;
380 /* Return true if A is nonzero. */
382 static inline int
383 cmp_significand_0 (const REAL_VALUE_TYPE *a)
385 int i;
387 for (i = SIGSZ - 1; i >= 0; --i)
388 if (a->sig[i])
389 return 1;
391 return 0;
394 /* Set bit N of the significand of R. */
396 static inline void
397 set_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
399 r->sig[n / HOST_BITS_PER_LONG]
400 |= (unsigned long)1 << (n % HOST_BITS_PER_LONG);
403 /* Clear bit N of the significand of R. */
405 static inline void
406 clear_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
408 r->sig[n / HOST_BITS_PER_LONG]
409 &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG));
412 /* Test bit N of the significand of R. */
414 static inline bool
415 test_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
417 /* ??? Compiler bug here if we return this expression directly.
418 The conversion to bool strips the "&1" and we wind up testing
419 e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */
420 int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1;
421 return t;
424 /* Clear bits 0..N-1 of the significand of R. */
426 static void
427 clear_significand_below (REAL_VALUE_TYPE *r, unsigned int n)
429 int i, w = n / HOST_BITS_PER_LONG;
431 for (i = 0; i < w; ++i)
432 r->sig[i] = 0;
434 r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1);
437 /* Divide the significands of A and B, placing the result in R. Return
438 true if the division was inexact. */
440 static inline bool
441 div_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
442 const REAL_VALUE_TYPE *b)
444 REAL_VALUE_TYPE u;
445 int i, bit = SIGNIFICAND_BITS - 1;
446 unsigned long msb, inexact;
448 u = *a;
449 memset (r->sig, 0, sizeof (r->sig));
451 msb = 0;
452 goto start;
455 msb = u.sig[SIGSZ-1] & SIG_MSB;
456 lshift_significand_1 (&u, &u);
457 start:
458 if (msb || cmp_significands (&u, b) >= 0)
460 sub_significands (&u, &u, b, 0);
461 set_significand_bit (r, bit);
464 while (--bit >= 0);
466 for (i = 0, inexact = 0; i < SIGSZ; i++)
467 inexact |= u.sig[i];
469 return inexact != 0;
472 /* Adjust the exponent and significand of R such that the most
473 significant bit is set. We underflow to zero and overflow to
474 infinity here, without denormals. (The intermediate representation
475 exponent is large enough to handle target denormals normalized.) */
477 static void
478 normalize (REAL_VALUE_TYPE *r)
480 int shift = 0, exp;
481 int i, j;
483 /* Find the first word that is nonzero. */
484 for (i = SIGSZ - 1; i >= 0; i--)
485 if (r->sig[i] == 0)
486 shift += HOST_BITS_PER_LONG;
487 else
488 break;
490 /* Zero significand flushes to zero. */
491 if (i < 0)
493 r->cl = rvc_zero;
494 SET_REAL_EXP (r, 0);
495 return;
498 /* Find the first bit that is nonzero. */
499 for (j = 0; ; j++)
500 if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j)))
501 break;
502 shift += j;
504 if (shift > 0)
506 exp = REAL_EXP (r) - shift;
507 if (exp > MAX_EXP)
508 get_inf (r, r->sign);
509 else if (exp < -MAX_EXP)
510 get_zero (r, r->sign);
511 else
513 SET_REAL_EXP (r, exp);
514 lshift_significand (r, r, shift);
519 /* Calculate R = A + (SUBTRACT_P ? -B : B). Return true if the
520 result may be inexact due to a loss of precision. */
522 static bool
523 do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
524 const REAL_VALUE_TYPE *b, int subtract_p)
526 int dexp, sign, exp;
527 REAL_VALUE_TYPE t;
528 bool inexact = false;
530 /* Determine if we need to add or subtract. */
531 sign = a->sign;
532 subtract_p = (sign ^ b->sign) ^ subtract_p;
534 switch (CLASS2 (a->cl, b->cl))
536 case CLASS2 (rvc_zero, rvc_zero):
537 /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0. */
538 get_zero (r, sign & !subtract_p);
539 return false;
541 case CLASS2 (rvc_zero, rvc_normal):
542 case CLASS2 (rvc_zero, rvc_inf):
543 case CLASS2 (rvc_zero, rvc_nan):
544 /* 0 + ANY = ANY. */
545 case CLASS2 (rvc_normal, rvc_nan):
546 case CLASS2 (rvc_inf, rvc_nan):
547 case CLASS2 (rvc_nan, rvc_nan):
548 /* ANY + NaN = NaN. */
549 case CLASS2 (rvc_normal, rvc_inf):
550 /* R + Inf = Inf. */
551 *r = *b;
552 r->sign = sign ^ subtract_p;
553 return false;
555 case CLASS2 (rvc_normal, rvc_zero):
556 case CLASS2 (rvc_inf, rvc_zero):
557 case CLASS2 (rvc_nan, rvc_zero):
558 /* ANY + 0 = ANY. */
559 case CLASS2 (rvc_nan, rvc_normal):
560 case CLASS2 (rvc_nan, rvc_inf):
561 /* NaN + ANY = NaN. */
562 case CLASS2 (rvc_inf, rvc_normal):
563 /* Inf + R = Inf. */
564 *r = *a;
565 return false;
567 case CLASS2 (rvc_inf, rvc_inf):
568 if (subtract_p)
569 /* Inf - Inf = NaN. */
570 get_canonical_qnan (r, 0);
571 else
572 /* Inf + Inf = Inf. */
573 *r = *a;
574 return false;
576 case CLASS2 (rvc_normal, rvc_normal):
577 break;
579 default:
580 gcc_unreachable ();
583 /* Swap the arguments such that A has the larger exponent. */
584 dexp = REAL_EXP (a) - REAL_EXP (b);
585 if (dexp < 0)
587 const REAL_VALUE_TYPE *t;
588 t = a, a = b, b = t;
589 dexp = -dexp;
590 sign ^= subtract_p;
592 exp = REAL_EXP (a);
594 /* If the exponents are not identical, we need to shift the
595 significand of B down. */
596 if (dexp > 0)
598 /* If the exponents are too far apart, the significands
599 do not overlap, which makes the subtraction a noop. */
600 if (dexp >= SIGNIFICAND_BITS)
602 *r = *a;
603 r->sign = sign;
604 return true;
607 inexact |= sticky_rshift_significand (&t, b, dexp);
608 b = &t;
611 if (subtract_p)
613 if (sub_significands (r, a, b, inexact))
615 /* We got a borrow out of the subtraction. That means that
616 A and B had the same exponent, and B had the larger
617 significand. We need to swap the sign and negate the
618 significand. */
619 sign ^= 1;
620 neg_significand (r, r);
623 else
625 if (add_significands (r, a, b))
627 /* We got carry out of the addition. This means we need to
628 shift the significand back down one bit and increase the
629 exponent. */
630 inexact |= sticky_rshift_significand (r, r, 1);
631 r->sig[SIGSZ-1] |= SIG_MSB;
632 if (++exp > MAX_EXP)
634 get_inf (r, sign);
635 return true;
640 r->cl = rvc_normal;
641 r->sign = sign;
642 SET_REAL_EXP (r, exp);
643 /* Zero out the remaining fields. */
644 r->signalling = 0;
645 r->canonical = 0;
647 /* Re-normalize the result. */
648 normalize (r);
650 /* Special case: if the subtraction results in zero, the result
651 is positive. */
652 if (r->cl == rvc_zero)
653 r->sign = 0;
654 else
655 r->sig[0] |= inexact;
657 return inexact;
660 /* Calculate R = A * B. Return true if the result may be inexact. */
662 static bool
663 do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
664 const REAL_VALUE_TYPE *b)
666 REAL_VALUE_TYPE u, t, *rr;
667 unsigned int i, j, k;
668 int sign = a->sign ^ b->sign;
669 bool inexact = false;
671 switch (CLASS2 (a->cl, b->cl))
673 case CLASS2 (rvc_zero, rvc_zero):
674 case CLASS2 (rvc_zero, rvc_normal):
675 case CLASS2 (rvc_normal, rvc_zero):
676 /* +-0 * ANY = 0 with appropriate sign. */
677 get_zero (r, sign);
678 return false;
680 case CLASS2 (rvc_zero, rvc_nan):
681 case CLASS2 (rvc_normal, rvc_nan):
682 case CLASS2 (rvc_inf, rvc_nan):
683 case CLASS2 (rvc_nan, rvc_nan):
684 /* ANY * NaN = NaN. */
685 *r = *b;
686 r->sign = sign;
687 return false;
689 case CLASS2 (rvc_nan, rvc_zero):
690 case CLASS2 (rvc_nan, rvc_normal):
691 case CLASS2 (rvc_nan, rvc_inf):
692 /* NaN * ANY = NaN. */
693 *r = *a;
694 r->sign = sign;
695 return false;
697 case CLASS2 (rvc_zero, rvc_inf):
698 case CLASS2 (rvc_inf, rvc_zero):
699 /* 0 * Inf = NaN */
700 get_canonical_qnan (r, sign);
701 return false;
703 case CLASS2 (rvc_inf, rvc_inf):
704 case CLASS2 (rvc_normal, rvc_inf):
705 case CLASS2 (rvc_inf, rvc_normal):
706 /* Inf * Inf = Inf, R * Inf = Inf */
707 get_inf (r, sign);
708 return false;
710 case CLASS2 (rvc_normal, rvc_normal):
711 break;
713 default:
714 gcc_unreachable ();
717 if (r == a || r == b)
718 rr = &t;
719 else
720 rr = r;
721 get_zero (rr, 0);
723 /* Collect all the partial products. Since we don't have sure access
724 to a widening multiply, we split each long into two half-words.
726 Consider the long-hand form of a four half-word multiplication:
728 A B C D
729 * E F G H
730 --------------
731 DE DF DG DH
732 CE CF CG CH
733 BE BF BG BH
734 AE AF AG AH
736 We construct partial products of the widened half-word products
737 that are known to not overlap, e.g. DF+DH. Each such partial
738 product is given its proper exponent, which allows us to sum them
739 and obtain the finished product. */
741 for (i = 0; i < SIGSZ * 2; ++i)
743 unsigned long ai = a->sig[i / 2];
744 if (i & 1)
745 ai >>= HOST_BITS_PER_LONG / 2;
746 else
747 ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
749 if (ai == 0)
750 continue;
752 for (j = 0; j < 2; ++j)
754 int exp = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
755 + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2)));
757 if (exp > MAX_EXP)
759 get_inf (r, sign);
760 return true;
762 if (exp < -MAX_EXP)
764 /* Would underflow to zero, which we shouldn't bother adding. */
765 inexact = true;
766 continue;
769 memset (&u, 0, sizeof (u));
770 u.cl = rvc_normal;
771 SET_REAL_EXP (&u, exp);
773 for (k = j; k < SIGSZ * 2; k += 2)
775 unsigned long bi = b->sig[k / 2];
776 if (k & 1)
777 bi >>= HOST_BITS_PER_LONG / 2;
778 else
779 bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
781 u.sig[k / 2] = ai * bi;
784 normalize (&u);
785 inexact |= do_add (rr, rr, &u, 0);
789 rr->sign = sign;
790 if (rr != r)
791 *r = t;
793 return inexact;
796 /* Calculate R = A / B. Return true if the result may be inexact. */
798 static bool
799 do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
800 const REAL_VALUE_TYPE *b)
802 int exp, sign = a->sign ^ b->sign;
803 REAL_VALUE_TYPE t, *rr;
804 bool inexact;
806 switch (CLASS2 (a->cl, b->cl))
808 case CLASS2 (rvc_zero, rvc_zero):
809 /* 0 / 0 = NaN. */
810 case CLASS2 (rvc_inf, rvc_inf):
811 /* Inf / Inf = NaN. */
812 get_canonical_qnan (r, sign);
813 return false;
815 case CLASS2 (rvc_zero, rvc_normal):
816 case CLASS2 (rvc_zero, rvc_inf):
817 /* 0 / ANY = 0. */
818 case CLASS2 (rvc_normal, rvc_inf):
819 /* R / Inf = 0. */
820 get_zero (r, sign);
821 return false;
823 case CLASS2 (rvc_normal, rvc_zero):
824 /* R / 0 = Inf. */
825 case CLASS2 (rvc_inf, rvc_zero):
826 /* Inf / 0 = Inf. */
827 get_inf (r, sign);
828 return false;
830 case CLASS2 (rvc_zero, rvc_nan):
831 case CLASS2 (rvc_normal, rvc_nan):
832 case CLASS2 (rvc_inf, rvc_nan):
833 case CLASS2 (rvc_nan, rvc_nan):
834 /* ANY / NaN = NaN. */
835 *r = *b;
836 r->sign = sign;
837 return false;
839 case CLASS2 (rvc_nan, rvc_zero):
840 case CLASS2 (rvc_nan, rvc_normal):
841 case CLASS2 (rvc_nan, rvc_inf):
842 /* NaN / ANY = NaN. */
843 *r = *a;
844 r->sign = sign;
845 return false;
847 case CLASS2 (rvc_inf, rvc_normal):
848 /* Inf / R = Inf. */
849 get_inf (r, sign);
850 return false;
852 case CLASS2 (rvc_normal, rvc_normal):
853 break;
855 default:
856 gcc_unreachable ();
859 if (r == a || r == b)
860 rr = &t;
861 else
862 rr = r;
864 /* Make sure all fields in the result are initialized. */
865 get_zero (rr, 0);
866 rr->cl = rvc_normal;
867 rr->sign = sign;
869 exp = REAL_EXP (a) - REAL_EXP (b) + 1;
870 if (exp > MAX_EXP)
872 get_inf (r, sign);
873 return true;
875 if (exp < -MAX_EXP)
877 get_zero (r, sign);
878 return true;
880 SET_REAL_EXP (rr, exp);
882 inexact = div_significands (rr, a, b);
884 /* Re-normalize the result. */
885 normalize (rr);
886 rr->sig[0] |= inexact;
888 if (rr != r)
889 *r = t;
891 return inexact;
894 /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
895 one of the two operands is a NaN. */
897 static int
898 do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
899 int nan_result)
901 int ret;
903 switch (CLASS2 (a->cl, b->cl))
905 case CLASS2 (rvc_zero, rvc_zero):
906 /* Sign of zero doesn't matter for compares. */
907 return 0;
909 case CLASS2 (rvc_inf, rvc_zero):
910 case CLASS2 (rvc_inf, rvc_normal):
911 case CLASS2 (rvc_normal, rvc_zero):
912 return (a->sign ? -1 : 1);
914 case CLASS2 (rvc_inf, rvc_inf):
915 return -a->sign - -b->sign;
917 case CLASS2 (rvc_zero, rvc_normal):
918 case CLASS2 (rvc_zero, rvc_inf):
919 case CLASS2 (rvc_normal, rvc_inf):
920 return (b->sign ? 1 : -1);
922 case CLASS2 (rvc_zero, rvc_nan):
923 case CLASS2 (rvc_normal, rvc_nan):
924 case CLASS2 (rvc_inf, rvc_nan):
925 case CLASS2 (rvc_nan, rvc_nan):
926 case CLASS2 (rvc_nan, rvc_zero):
927 case CLASS2 (rvc_nan, rvc_normal):
928 case CLASS2 (rvc_nan, rvc_inf):
929 return nan_result;
931 case CLASS2 (rvc_normal, rvc_normal):
932 break;
934 default:
935 gcc_unreachable ();
938 if (a->sign != b->sign)
939 return -a->sign - -b->sign;
941 if (REAL_EXP (a) > REAL_EXP (b))
942 ret = 1;
943 else if (REAL_EXP (a) < REAL_EXP (b))
944 ret = -1;
945 else
946 ret = cmp_significands (a, b);
948 return (a->sign ? -ret : ret);
951 /* Return A truncated to an integral value toward zero. */
953 static void
954 do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
956 *r = *a;
958 switch (r->cl)
960 case rvc_zero:
961 case rvc_inf:
962 case rvc_nan:
963 break;
965 case rvc_normal:
966 if (REAL_EXP (r) <= 0)
967 get_zero (r, r->sign);
968 else if (REAL_EXP (r) < SIGNIFICAND_BITS)
969 clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r));
970 break;
972 default:
973 gcc_unreachable ();
977 /* Perform the binary or unary operation described by CODE.
978 For a unary operation, leave OP1 NULL. This function returns
979 true if the result may be inexact due to loss of precision. */
981 bool
982 real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
983 const REAL_VALUE_TYPE *op1)
985 enum tree_code code = icode;
987 switch (code)
989 case PLUS_EXPR:
990 return do_add (r, op0, op1, 0);
992 case MINUS_EXPR:
993 return do_add (r, op0, op1, 1);
995 case MULT_EXPR:
996 return do_multiply (r, op0, op1);
998 case RDIV_EXPR:
999 return do_divide (r, op0, op1);
1001 case MIN_EXPR:
1002 if (op1->cl == rvc_nan)
1003 *r = *op1;
1004 else if (do_compare (op0, op1, -1) < 0)
1005 *r = *op0;
1006 else
1007 *r = *op1;
1008 break;
1010 case MAX_EXPR:
1011 if (op1->cl == rvc_nan)
1012 *r = *op1;
1013 else if (do_compare (op0, op1, 1) < 0)
1014 *r = *op1;
1015 else
1016 *r = *op0;
1017 break;
1019 case NEGATE_EXPR:
1020 *r = *op0;
1021 r->sign ^= 1;
1022 break;
1024 case ABS_EXPR:
1025 *r = *op0;
1026 r->sign = 0;
1027 break;
1029 case FIX_TRUNC_EXPR:
1030 do_fix_trunc (r, op0);
1031 break;
1033 default:
1034 gcc_unreachable ();
1036 return false;
1039 /* Legacy. Similar, but return the result directly. */
1041 REAL_VALUE_TYPE
1042 real_arithmetic2 (int icode, const REAL_VALUE_TYPE *op0,
1043 const REAL_VALUE_TYPE *op1)
1045 REAL_VALUE_TYPE r;
1046 real_arithmetic (&r, icode, op0, op1);
1047 return r;
1050 bool
1051 real_compare (int icode, const REAL_VALUE_TYPE *op0,
1052 const REAL_VALUE_TYPE *op1)
1054 enum tree_code code = icode;
1056 switch (code)
1058 case LT_EXPR:
1059 return do_compare (op0, op1, 1) < 0;
1060 case LE_EXPR:
1061 return do_compare (op0, op1, 1) <= 0;
1062 case GT_EXPR:
1063 return do_compare (op0, op1, -1) > 0;
1064 case GE_EXPR:
1065 return do_compare (op0, op1, -1) >= 0;
1066 case EQ_EXPR:
1067 return do_compare (op0, op1, -1) == 0;
1068 case NE_EXPR:
1069 return do_compare (op0, op1, -1) != 0;
1070 case UNORDERED_EXPR:
1071 return op0->cl == rvc_nan || op1->cl == rvc_nan;
1072 case ORDERED_EXPR:
1073 return op0->cl != rvc_nan && op1->cl != rvc_nan;
1074 case UNLT_EXPR:
1075 return do_compare (op0, op1, -1) < 0;
1076 case UNLE_EXPR:
1077 return do_compare (op0, op1, -1) <= 0;
1078 case UNGT_EXPR:
1079 return do_compare (op0, op1, 1) > 0;
1080 case UNGE_EXPR:
1081 return do_compare (op0, op1, 1) >= 0;
1082 case UNEQ_EXPR:
1083 return do_compare (op0, op1, 0) == 0;
1084 case LTGT_EXPR:
1085 return do_compare (op0, op1, 0) != 0;
1087 default:
1088 gcc_unreachable ();
1092 /* Return floor log2(R). */
1095 real_exponent (const REAL_VALUE_TYPE *r)
1097 switch (r->cl)
1099 case rvc_zero:
1100 return 0;
1101 case rvc_inf:
1102 case rvc_nan:
1103 return (unsigned int)-1 >> 1;
1104 case rvc_normal:
1105 return REAL_EXP (r);
1106 default:
1107 gcc_unreachable ();
1111 /* R = OP0 * 2**EXP. */
1113 void
1114 real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
1116 *r = *op0;
1117 switch (r->cl)
1119 case rvc_zero:
1120 case rvc_inf:
1121 case rvc_nan:
1122 break;
1124 case rvc_normal:
1125 exp += REAL_EXP (op0);
1126 if (exp > MAX_EXP)
1127 get_inf (r, r->sign);
1128 else if (exp < -MAX_EXP)
1129 get_zero (r, r->sign);
1130 else
1131 SET_REAL_EXP (r, exp);
1132 break;
1134 default:
1135 gcc_unreachable ();
1139 /* Determine whether a floating-point value X is infinite. */
1141 bool
1142 real_isinf (const REAL_VALUE_TYPE *r)
1144 return (r->cl == rvc_inf);
1147 /* Determine whether a floating-point value X is a NaN. */
1149 bool
1150 real_isnan (const REAL_VALUE_TYPE *r)
1152 return (r->cl == rvc_nan);
1155 /* Determine whether a floating-point value X is negative. */
1157 bool
1158 real_isneg (const REAL_VALUE_TYPE *r)
1160 return r->sign;
1163 /* Determine whether a floating-point value X is minus zero. */
1165 bool
1166 real_isnegzero (const REAL_VALUE_TYPE *r)
1168 return r->sign && r->cl == rvc_zero;
1171 /* Compare two floating-point objects for bitwise identity. */
1173 bool
1174 real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
1176 int i;
1178 if (a->cl != b->cl)
1179 return false;
1180 if (a->sign != b->sign)
1181 return false;
1183 switch (a->cl)
1185 case rvc_zero:
1186 case rvc_inf:
1187 return true;
1189 case rvc_normal:
1190 if (REAL_EXP (a) != REAL_EXP (b))
1191 return false;
1192 break;
1194 case rvc_nan:
1195 if (a->signalling != b->signalling)
1196 return false;
1197 /* The significand is ignored for canonical NaNs. */
1198 if (a->canonical || b->canonical)
1199 return a->canonical == b->canonical;
1200 break;
1202 default:
1203 gcc_unreachable ();
1206 for (i = 0; i < SIGSZ; ++i)
1207 if (a->sig[i] != b->sig[i])
1208 return false;
1210 return true;
1213 /* Try to change R into its exact multiplicative inverse in machine
1214 mode MODE. Return true if successful. */
1216 bool
1217 exact_real_inverse (enum machine_mode mode, REAL_VALUE_TYPE *r)
1219 const REAL_VALUE_TYPE *one = real_digit (1);
1220 REAL_VALUE_TYPE u;
1221 int i;
1223 if (r->cl != rvc_normal)
1224 return false;
1226 /* Check for a power of two: all significand bits zero except the MSB. */
1227 for (i = 0; i < SIGSZ-1; ++i)
1228 if (r->sig[i] != 0)
1229 return false;
1230 if (r->sig[SIGSZ-1] != SIG_MSB)
1231 return false;
1233 /* Find the inverse and truncate to the required mode. */
1234 do_divide (&u, one, r);
1235 real_convert (&u, mode, &u);
1237 /* The rounding may have overflowed. */
1238 if (u.cl != rvc_normal)
1239 return false;
1240 for (i = 0; i < SIGSZ-1; ++i)
1241 if (u.sig[i] != 0)
1242 return false;
1243 if (u.sig[SIGSZ-1] != SIG_MSB)
1244 return false;
1246 *r = u;
1247 return true;
1250 /* Render R as an integer. */
1252 HOST_WIDE_INT
1253 real_to_integer (const REAL_VALUE_TYPE *r)
1255 unsigned HOST_WIDE_INT i;
1257 switch (r->cl)
1259 case rvc_zero:
1260 underflow:
1261 return 0;
1263 case rvc_inf:
1264 case rvc_nan:
1265 overflow:
1266 i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1267 if (!r->sign)
1268 i--;
1269 return i;
1271 case rvc_normal:
1272 if (REAL_EXP (r) <= 0)
1273 goto underflow;
1274 /* Only force overflow for unsigned overflow. Signed overflow is
1275 undefined, so it doesn't matter what we return, and some callers
1276 expect to be able to use this routine for both signed and
1277 unsigned conversions. */
1278 if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT)
1279 goto overflow;
1281 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1282 i = r->sig[SIGSZ-1];
1283 else
1285 gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
1286 i = r->sig[SIGSZ-1];
1287 i = i << (HOST_BITS_PER_LONG - 1) << 1;
1288 i |= r->sig[SIGSZ-2];
1291 i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r);
1293 if (r->sign)
1294 i = -i;
1295 return i;
1297 default:
1298 gcc_unreachable ();
1302 /* Likewise, but to an integer pair, HI+LOW. */
1304 void
1305 real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
1306 const REAL_VALUE_TYPE *r)
1308 REAL_VALUE_TYPE t;
1309 HOST_WIDE_INT low, high;
1310 int exp;
1312 switch (r->cl)
1314 case rvc_zero:
1315 underflow:
1316 low = high = 0;
1317 break;
1319 case rvc_inf:
1320 case rvc_nan:
1321 overflow:
1322 high = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1323 if (r->sign)
1324 low = 0;
1325 else
1327 high--;
1328 low = -1;
1330 break;
1332 case rvc_normal:
1333 exp = REAL_EXP (r);
1334 if (exp <= 0)
1335 goto underflow;
1336 /* Only force overflow for unsigned overflow. Signed overflow is
1337 undefined, so it doesn't matter what we return, and some callers
1338 expect to be able to use this routine for both signed and
1339 unsigned conversions. */
1340 if (exp > 2*HOST_BITS_PER_WIDE_INT)
1341 goto overflow;
1343 rshift_significand (&t, r, 2*HOST_BITS_PER_WIDE_INT - exp);
1344 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1346 high = t.sig[SIGSZ-1];
1347 low = t.sig[SIGSZ-2];
1349 else
1351 gcc_assert (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG);
1352 high = t.sig[SIGSZ-1];
1353 high = high << (HOST_BITS_PER_LONG - 1) << 1;
1354 high |= t.sig[SIGSZ-2];
1356 low = t.sig[SIGSZ-3];
1357 low = low << (HOST_BITS_PER_LONG - 1) << 1;
1358 low |= t.sig[SIGSZ-4];
1361 if (r->sign)
1363 if (low == 0)
1364 high = -high;
1365 else
1366 low = -low, high = ~high;
1368 break;
1370 default:
1371 gcc_unreachable ();
1374 *plow = low;
1375 *phigh = high;
1378 /* A subroutine of real_to_decimal. Compute the quotient and remainder
1379 of NUM / DEN. Return the quotient and place the remainder in NUM.
1380 It is expected that NUM / DEN are close enough that the quotient is
1381 small. */
1383 static unsigned long
1384 rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den)
1386 unsigned long q, msb;
1387 int expn = REAL_EXP (num), expd = REAL_EXP (den);
1389 if (expn < expd)
1390 return 0;
1392 q = msb = 0;
1393 goto start;
1396 msb = num->sig[SIGSZ-1] & SIG_MSB;
1397 q <<= 1;
1398 lshift_significand_1 (num, num);
1399 start:
1400 if (msb || cmp_significands (num, den) >= 0)
1402 sub_significands (num, num, den, 0);
1403 q |= 1;
1406 while (--expn >= expd);
1408 SET_REAL_EXP (num, expd);
1409 normalize (num);
1411 return q;
1414 /* Render R as a decimal floating point constant. Emit DIGITS significant
1415 digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the
1416 maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing
1417 zeros. */
1419 #define M_LOG10_2 0.30102999566398119521
1421 void
1422 real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
1423 size_t digits, int crop_trailing_zeros)
1425 const REAL_VALUE_TYPE *one, *ten;
1426 REAL_VALUE_TYPE r, pten, u, v;
1427 int dec_exp, cmp_one, digit;
1428 size_t max_digits;
1429 char *p, *first, *last;
1430 bool sign;
1432 r = *r_orig;
1433 switch (r.cl)
1435 case rvc_zero:
1436 strcpy (str, (r.sign ? "-0.0" : "0.0"));
1437 return;
1438 case rvc_normal:
1439 break;
1440 case rvc_inf:
1441 strcpy (str, (r.sign ? "-Inf" : "+Inf"));
1442 return;
1443 case rvc_nan:
1444 /* ??? Print the significand as well, if not canonical? */
1445 strcpy (str, (r.sign ? "-NaN" : "+NaN"));
1446 return;
1447 default:
1448 gcc_unreachable ();
1451 /* Bound the number of digits printed by the size of the representation. */
1452 max_digits = SIGNIFICAND_BITS * M_LOG10_2;
1453 if (digits == 0 || digits > max_digits)
1454 digits = max_digits;
1456 /* Estimate the decimal exponent, and compute the length of the string it
1457 will print as. Be conservative and add one to account for possible
1458 overflow or rounding error. */
1459 dec_exp = REAL_EXP (&r) * M_LOG10_2;
1460 for (max_digits = 1; dec_exp ; max_digits++)
1461 dec_exp /= 10;
1463 /* Bound the number of digits printed by the size of the output buffer. */
1464 max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
1465 gcc_assert (max_digits <= buf_size);
1466 if (digits > max_digits)
1467 digits = max_digits;
1469 one = real_digit (1);
1470 ten = ten_to_ptwo (0);
1472 sign = r.sign;
1473 r.sign = 0;
1475 dec_exp = 0;
1476 pten = *one;
1478 cmp_one = do_compare (&r, one, 0);
1479 if (cmp_one > 0)
1481 int m;
1483 /* Number is greater than one. Convert significand to an integer
1484 and strip trailing decimal zeros. */
1486 u = r;
1487 SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1);
1489 /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
1490 m = floor_log2 (max_digits);
1492 /* Iterate over the bits of the possible powers of 10 that might
1493 be present in U and eliminate them. That is, if we find that
1494 10**2**M divides U evenly, keep the division and increase
1495 DEC_EXP by 2**M. */
1498 REAL_VALUE_TYPE t;
1500 do_divide (&t, &u, ten_to_ptwo (m));
1501 do_fix_trunc (&v, &t);
1502 if (cmp_significands (&v, &t) == 0)
1504 u = t;
1505 dec_exp += 1 << m;
1508 while (--m >= 0);
1510 /* Revert the scaling to integer that we performed earlier. */
1511 SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r)
1512 - (SIGNIFICAND_BITS - 1));
1513 r = u;
1515 /* Find power of 10. Do this by dividing out 10**2**M when
1516 this is larger than the current remainder. Fill PTEN with
1517 the power of 10 that we compute. */
1518 if (REAL_EXP (&r) > 0)
1520 m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1;
1523 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1524 if (do_compare (&u, ptentwo, 0) >= 0)
1526 do_divide (&u, &u, ptentwo);
1527 do_multiply (&pten, &pten, ptentwo);
1528 dec_exp += 1 << m;
1531 while (--m >= 0);
1533 else
1534 /* We managed to divide off enough tens in the above reduction
1535 loop that we've now got a negative exponent. Fall into the
1536 less-than-one code to compute the proper value for PTEN. */
1537 cmp_one = -1;
1539 if (cmp_one < 0)
1541 int m;
1543 /* Number is less than one. Pad significand with leading
1544 decimal zeros. */
1546 v = r;
1547 while (1)
1549 /* Stop if we'd shift bits off the bottom. */
1550 if (v.sig[0] & 7)
1551 break;
1553 do_multiply (&u, &v, ten);
1555 /* Stop if we're now >= 1. */
1556 if (REAL_EXP (&u) > 0)
1557 break;
1559 v = u;
1560 dec_exp -= 1;
1562 r = v;
1564 /* Find power of 10. Do this by multiplying in P=10**2**M when
1565 the current remainder is smaller than 1/P. Fill PTEN with the
1566 power of 10 that we compute. */
1567 m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1;
1570 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1571 const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
1573 if (do_compare (&v, ptenmtwo, 0) <= 0)
1575 do_multiply (&v, &v, ptentwo);
1576 do_multiply (&pten, &pten, ptentwo);
1577 dec_exp -= 1 << m;
1580 while (--m >= 0);
1582 /* Invert the positive power of 10 that we've collected so far. */
1583 do_divide (&pten, one, &pten);
1586 p = str;
1587 if (sign)
1588 *p++ = '-';
1589 first = p++;
1591 /* At this point, PTEN should contain the nearest power of 10 smaller
1592 than R, such that this division produces the first digit.
1594 Using a divide-step primitive that returns the complete integral
1595 remainder avoids the rounding error that would be produced if
1596 we were to use do_divide here and then simply multiply by 10 for
1597 each subsequent digit. */
1599 digit = rtd_divmod (&r, &pten);
1601 /* Be prepared for error in that division via underflow ... */
1602 if (digit == 0 && cmp_significand_0 (&r))
1604 /* Multiply by 10 and try again. */
1605 do_multiply (&r, &r, ten);
1606 digit = rtd_divmod (&r, &pten);
1607 dec_exp -= 1;
1608 gcc_assert (digit != 0);
1611 /* ... or overflow. */
1612 if (digit == 10)
1614 *p++ = '1';
1615 if (--digits > 0)
1616 *p++ = '0';
1617 dec_exp += 1;
1619 else
1621 gcc_assert (digit <= 10);
1622 *p++ = digit + '0';
1625 /* Generate subsequent digits. */
1626 while (--digits > 0)
1628 do_multiply (&r, &r, ten);
1629 digit = rtd_divmod (&r, &pten);
1630 *p++ = digit + '0';
1632 last = p;
1634 /* Generate one more digit with which to do rounding. */
1635 do_multiply (&r, &r, ten);
1636 digit = rtd_divmod (&r, &pten);
1638 /* Round the result. */
1639 if (digit == 5)
1641 /* Round to nearest. If R is nonzero there are additional
1642 nonzero digits to be extracted. */
1643 if (cmp_significand_0 (&r))
1644 digit++;
1645 /* Round to even. */
1646 else if ((p[-1] - '0') & 1)
1647 digit++;
1649 if (digit > 5)
1651 while (p > first)
1653 digit = *--p;
1654 if (digit == '9')
1655 *p = '0';
1656 else
1658 *p = digit + 1;
1659 break;
1663 /* Carry out of the first digit. This means we had all 9's and
1664 now have all 0's. "Prepend" a 1 by overwriting the first 0. */
1665 if (p == first)
1667 first[1] = '1';
1668 dec_exp++;
1672 /* Insert the decimal point. */
1673 first[0] = first[1];
1674 first[1] = '.';
1676 /* If requested, drop trailing zeros. Never crop past "1.0". */
1677 if (crop_trailing_zeros)
1678 while (last > first + 3 && last[-1] == '0')
1679 last--;
1681 /* Append the exponent. */
1682 sprintf (last, "e%+d", dec_exp);
1685 /* Render R as a hexadecimal floating point constant. Emit DIGITS
1686 significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0,
1687 choose the maximum for the representation. If CROP_TRAILING_ZEROS,
1688 strip trailing zeros. */
1690 void
1691 real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
1692 size_t digits, int crop_trailing_zeros)
1694 int i, j, exp = REAL_EXP (r);
1695 char *p, *first;
1696 char exp_buf[16];
1697 size_t max_digits;
1699 switch (r->cl)
1701 case rvc_zero:
1702 exp = 0;
1703 break;
1704 case rvc_normal:
1705 break;
1706 case rvc_inf:
1707 strcpy (str, (r->sign ? "-Inf" : "+Inf"));
1708 return;
1709 case rvc_nan:
1710 /* ??? Print the significand as well, if not canonical? */
1711 strcpy (str, (r->sign ? "-NaN" : "+NaN"));
1712 return;
1713 default:
1714 gcc_unreachable ();
1717 if (digits == 0)
1718 digits = SIGNIFICAND_BITS / 4;
1720 /* Bound the number of digits printed by the size of the output buffer. */
1722 sprintf (exp_buf, "p%+d", exp);
1723 max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
1724 gcc_assert (max_digits <= buf_size);
1725 if (digits > max_digits)
1726 digits = max_digits;
1728 p = str;
1729 if (r->sign)
1730 *p++ = '-';
1731 *p++ = '0';
1732 *p++ = 'x';
1733 *p++ = '0';
1734 *p++ = '.';
1735 first = p;
1737 for (i = SIGSZ - 1; i >= 0; --i)
1738 for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
1740 *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
1741 if (--digits == 0)
1742 goto out;
1745 out:
1746 if (crop_trailing_zeros)
1747 while (p > first + 1 && p[-1] == '0')
1748 p--;
1750 sprintf (p, "p%+d", exp);
1753 /* Initialize R from a decimal or hexadecimal string. The string is
1754 assumed to have been syntax checked already. */
1756 void
1757 real_from_string (REAL_VALUE_TYPE *r, const char *str)
1759 int exp = 0;
1760 bool sign = false;
1762 get_zero (r, 0);
1764 if (*str == '-')
1766 sign = true;
1767 str++;
1769 else if (*str == '+')
1770 str++;
1772 if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1774 /* Hexadecimal floating point. */
1775 int pos = SIGNIFICAND_BITS - 4, d;
1777 str += 2;
1779 while (*str == '0')
1780 str++;
1781 while (1)
1783 d = hex_value (*str);
1784 if (d == _hex_bad)
1785 break;
1786 if (pos >= 0)
1788 r->sig[pos / HOST_BITS_PER_LONG]
1789 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1790 pos -= 4;
1792 else if (d)
1793 /* Ensure correct rounding by setting last bit if there is
1794 a subsequent nonzero digit. */
1795 r->sig[0] |= 1;
1796 exp += 4;
1797 str++;
1799 if (*str == '.')
1801 str++;
1802 if (pos == SIGNIFICAND_BITS - 4)
1804 while (*str == '0')
1805 str++, exp -= 4;
1807 while (1)
1809 d = hex_value (*str);
1810 if (d == _hex_bad)
1811 break;
1812 if (pos >= 0)
1814 r->sig[pos / HOST_BITS_PER_LONG]
1815 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1816 pos -= 4;
1818 else if (d)
1819 /* Ensure correct rounding by setting last bit if there is
1820 a subsequent nonzero digit. */
1821 r->sig[0] |= 1;
1822 str++;
1825 if (*str == 'p' || *str == 'P')
1827 bool exp_neg = false;
1829 str++;
1830 if (*str == '-')
1832 exp_neg = true;
1833 str++;
1835 else if (*str == '+')
1836 str++;
1838 d = 0;
1839 while (ISDIGIT (*str))
1841 d *= 10;
1842 d += *str - '0';
1843 if (d > MAX_EXP)
1845 /* Overflowed the exponent. */
1846 if (exp_neg)
1847 goto underflow;
1848 else
1849 goto overflow;
1851 str++;
1853 if (exp_neg)
1854 d = -d;
1856 exp += d;
1859 r->cl = rvc_normal;
1860 SET_REAL_EXP (r, exp);
1862 normalize (r);
1864 else
1866 /* Decimal floating point. */
1867 const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
1868 int d;
1870 while (*str == '0')
1871 str++;
1872 while (ISDIGIT (*str))
1874 d = *str++ - '0';
1875 do_multiply (r, r, ten);
1876 if (d)
1877 do_add (r, r, real_digit (d), 0);
1879 if (*str == '.')
1881 str++;
1882 if (r->cl == rvc_zero)
1884 while (*str == '0')
1885 str++, exp--;
1887 while (ISDIGIT (*str))
1889 d = *str++ - '0';
1890 do_multiply (r, r, ten);
1891 if (d)
1892 do_add (r, r, real_digit (d), 0);
1893 exp--;
1897 if (*str == 'e' || *str == 'E')
1899 bool exp_neg = false;
1901 str++;
1902 if (*str == '-')
1904 exp_neg = true;
1905 str++;
1907 else if (*str == '+')
1908 str++;
1910 d = 0;
1911 while (ISDIGIT (*str))
1913 d *= 10;
1914 d += *str - '0';
1915 if (d > MAX_EXP)
1917 /* Overflowed the exponent. */
1918 if (exp_neg)
1919 goto underflow;
1920 else
1921 goto overflow;
1923 str++;
1925 if (exp_neg)
1926 d = -d;
1927 exp += d;
1930 if (exp)
1931 times_pten (r, exp);
1934 r->sign = sign;
1935 return;
1937 underflow:
1938 get_zero (r, sign);
1939 return;
1941 overflow:
1942 get_inf (r, sign);
1943 return;
1946 /* Legacy. Similar, but return the result directly. */
1948 REAL_VALUE_TYPE
1949 real_from_string2 (const char *s, enum machine_mode mode)
1951 REAL_VALUE_TYPE r;
1953 real_from_string (&r, s);
1954 if (mode != VOIDmode)
1955 real_convert (&r, mode, &r);
1957 return r;
1960 /* Initialize R from the integer pair HIGH+LOW. */
1962 void
1963 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
1964 unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
1965 int unsigned_p)
1967 if (low == 0 && high == 0)
1968 get_zero (r, 0);
1969 else
1971 memset (r, 0, sizeof (*r));
1972 r->cl = rvc_normal;
1973 r->sign = high < 0 && !unsigned_p;
1974 SET_REAL_EXP (r, 2 * HOST_BITS_PER_WIDE_INT);
1976 if (r->sign)
1978 high = ~high;
1979 if (low == 0)
1980 high += 1;
1981 else
1982 low = -low;
1985 if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
1987 r->sig[SIGSZ-1] = high;
1988 r->sig[SIGSZ-2] = low;
1990 else
1992 gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
1993 r->sig[SIGSZ-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
1994 r->sig[SIGSZ-2] = high;
1995 r->sig[SIGSZ-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
1996 r->sig[SIGSZ-4] = low;
1999 normalize (r);
2002 if (mode != VOIDmode)
2003 real_convert (r, mode, r);
2006 /* Returns 10**2**N. */
2008 static const REAL_VALUE_TYPE *
2009 ten_to_ptwo (int n)
2011 static REAL_VALUE_TYPE tens[EXP_BITS];
2013 gcc_assert (n >= 0);
2014 gcc_assert (n < EXP_BITS);
2016 if (tens[n].cl == rvc_zero)
2018 if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2020 HOST_WIDE_INT t = 10;
2021 int i;
2023 for (i = 0; i < n; ++i)
2024 t *= t;
2026 real_from_integer (&tens[n], VOIDmode, t, 0, 1);
2028 else
2030 const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2031 do_multiply (&tens[n], t, t);
2035 return &tens[n];
2038 /* Returns 10**(-2**N). */
2040 static const REAL_VALUE_TYPE *
2041 ten_to_mptwo (int n)
2043 static REAL_VALUE_TYPE tens[EXP_BITS];
2045 gcc_assert (n >= 0);
2046 gcc_assert (n < EXP_BITS);
2048 if (tens[n].cl == rvc_zero)
2049 do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2051 return &tens[n];
2054 /* Returns N. */
2056 static const REAL_VALUE_TYPE *
2057 real_digit (int n)
2059 static REAL_VALUE_TYPE num[10];
2061 gcc_assert (n >= 0);
2062 gcc_assert (n <= 9);
2064 if (n > 0 && num[n].cl == rvc_zero)
2065 real_from_integer (&num[n], VOIDmode, n, 0, 1);
2067 return &num[n];
2070 /* Multiply R by 10**EXP. */
2072 static void
2073 times_pten (REAL_VALUE_TYPE *r, int exp)
2075 REAL_VALUE_TYPE pten, *rr;
2076 bool negative = (exp < 0);
2077 int i;
2079 if (negative)
2081 exp = -exp;
2082 pten = *real_digit (1);
2083 rr = &pten;
2085 else
2086 rr = r;
2088 for (i = 0; exp > 0; ++i, exp >>= 1)
2089 if (exp & 1)
2090 do_multiply (rr, rr, ten_to_ptwo (i));
2092 if (negative)
2093 do_divide (r, r, &pten);
2096 /* Fills R with +Inf. */
2098 void
2099 real_inf (REAL_VALUE_TYPE *r)
2101 get_inf (r, 0);
2104 /* Fills R with a NaN whose significand is described by STR. If QUIET,
2105 we force a QNaN, else we force an SNaN. The string, if not empty,
2106 is parsed as a number and placed in the significand. Return true
2107 if the string was successfully parsed. */
2109 bool
2110 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2111 enum machine_mode mode)
2113 const struct real_format *fmt;
2115 fmt = REAL_MODE_FORMAT (mode);
2116 gcc_assert (fmt);
2118 if (*str == 0)
2120 if (quiet)
2121 get_canonical_qnan (r, 0);
2122 else
2123 get_canonical_snan (r, 0);
2125 else
2127 int base = 10, d;
2129 memset (r, 0, sizeof (*r));
2130 r->cl = rvc_nan;
2132 /* Parse akin to strtol into the significand of R. */
2134 while (ISSPACE (*str))
2135 str++;
2136 if (*str == '-')
2137 str++;
2138 else if (*str == '+')
2139 str++;
2140 if (*str == '0')
2142 if (*++str == 'x')
2143 str++, base = 16;
2144 else
2145 base = 8;
2148 while ((d = hex_value (*str)) < base)
2150 REAL_VALUE_TYPE u;
2152 switch (base)
2154 case 8:
2155 lshift_significand (r, r, 3);
2156 break;
2157 case 16:
2158 lshift_significand (r, r, 4);
2159 break;
2160 case 10:
2161 lshift_significand_1 (&u, r);
2162 lshift_significand (r, r, 3);
2163 add_significands (r, r, &u);
2164 break;
2165 default:
2166 gcc_unreachable ();
2169 get_zero (&u, 0);
2170 u.sig[0] = d;
2171 add_significands (r, r, &u);
2173 str++;
2176 /* Must have consumed the entire string for success. */
2177 if (*str != 0)
2178 return false;
2180 /* Shift the significand into place such that the bits
2181 are in the most significant bits for the format. */
2182 lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
2184 /* Our MSB is always unset for NaNs. */
2185 r->sig[SIGSZ-1] &= ~SIG_MSB;
2187 /* Force quiet or signalling NaN. */
2188 r->signalling = !quiet;
2191 return true;
2194 /* Fills R with the largest finite value representable in mode MODE.
2195 If SIGN is nonzero, R is set to the most negative finite value. */
2197 void
2198 real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
2200 const struct real_format *fmt;
2201 int np2;
2203 fmt = REAL_MODE_FORMAT (mode);
2204 gcc_assert (fmt);
2206 r->cl = rvc_normal;
2207 r->sign = sign;
2208 r->signalling = 0;
2209 r->canonical = 0;
2210 SET_REAL_EXP (r, fmt->emax * fmt->log2_b);
2212 np2 = SIGNIFICAND_BITS - fmt->p * fmt->log2_b;
2213 memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
2214 clear_significand_below (r, np2);
2217 /* Fills R with 2**N. */
2219 void
2220 real_2expN (REAL_VALUE_TYPE *r, int n)
2222 memset (r, 0, sizeof (*r));
2224 n++;
2225 if (n > MAX_EXP)
2226 r->cl = rvc_inf;
2227 else if (n < -MAX_EXP)
2229 else
2231 r->cl = rvc_normal;
2232 SET_REAL_EXP (r, n);
2233 r->sig[SIGSZ-1] = SIG_MSB;
2238 static void
2239 round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
2241 int p2, np2, i, w;
2242 unsigned long sticky;
2243 bool guard, lsb;
2244 int emin2m1, emax2;
2246 p2 = fmt->p * fmt->log2_b;
2247 emin2m1 = (fmt->emin - 1) * fmt->log2_b;
2248 emax2 = fmt->emax * fmt->log2_b;
2250 np2 = SIGNIFICAND_BITS - p2;
2251 switch (r->cl)
2253 underflow:
2254 get_zero (r, r->sign);
2255 case rvc_zero:
2256 if (!fmt->has_signed_zero)
2257 r->sign = 0;
2258 return;
2260 overflow:
2261 get_inf (r, r->sign);
2262 case rvc_inf:
2263 return;
2265 case rvc_nan:
2266 clear_significand_below (r, np2);
2267 return;
2269 case rvc_normal:
2270 break;
2272 default:
2273 gcc_unreachable ();
2276 /* If we're not base2, normalize the exponent to a multiple of
2277 the true base. */
2278 if (fmt->log2_b != 1)
2280 int shift = REAL_EXP (r) & (fmt->log2_b - 1);
2281 if (shift)
2283 shift = fmt->log2_b - shift;
2284 r->sig[0] |= sticky_rshift_significand (r, r, shift);
2285 SET_REAL_EXP (r, REAL_EXP (r) + shift);
2289 /* Check the range of the exponent. If we're out of range,
2290 either underflow or overflow. */
2291 if (REAL_EXP (r) > emax2)
2292 goto overflow;
2293 else if (REAL_EXP (r) <= emin2m1)
2295 int diff;
2297 if (!fmt->has_denorm)
2299 /* Don't underflow completely until we've had a chance to round. */
2300 if (REAL_EXP (r) < emin2m1)
2301 goto underflow;
2303 else
2305 diff = emin2m1 - REAL_EXP (r) + 1;
2306 if (diff > p2)
2307 goto underflow;
2309 /* De-normalize the significand. */
2310 r->sig[0] |= sticky_rshift_significand (r, r, diff);
2311 SET_REAL_EXP (r, REAL_EXP (r) + diff);
2315 /* There are P2 true significand bits, followed by one guard bit,
2316 followed by one sticky bit, followed by stuff. Fold nonzero
2317 stuff into the sticky bit. */
2319 sticky = 0;
2320 for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2321 sticky |= r->sig[i];
2322 sticky |=
2323 r->sig[w] & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2325 guard = test_significand_bit (r, np2 - 1);
2326 lsb = test_significand_bit (r, np2);
2328 /* Round to even. */
2329 if (guard && (sticky || lsb))
2331 REAL_VALUE_TYPE u;
2332 get_zero (&u, 0);
2333 set_significand_bit (&u, np2);
2335 if (add_significands (r, r, &u))
2337 /* Overflow. Means the significand had been all ones, and
2338 is now all zeros. Need to increase the exponent, and
2339 possibly re-normalize it. */
2340 SET_REAL_EXP (r, REAL_EXP (r) + 1);
2341 if (REAL_EXP (r) > emax2)
2342 goto overflow;
2343 r->sig[SIGSZ-1] = SIG_MSB;
2345 if (fmt->log2_b != 1)
2347 int shift = REAL_EXP (r) & (fmt->log2_b - 1);
2348 if (shift)
2350 shift = fmt->log2_b - shift;
2351 rshift_significand (r, r, shift);
2352 SET_REAL_EXP (r, REAL_EXP (r) + shift);
2353 if (REAL_EXP (r) > emax2)
2354 goto overflow;
2360 /* Catch underflow that we deferred until after rounding. */
2361 if (REAL_EXP (r) <= emin2m1)
2362 goto underflow;
2364 /* Clear out trailing garbage. */
2365 clear_significand_below (r, np2);
2368 /* Extend or truncate to a new mode. */
2370 void
2371 real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
2372 const REAL_VALUE_TYPE *a)
2374 const struct real_format *fmt;
2376 fmt = REAL_MODE_FORMAT (mode);
2377 gcc_assert (fmt);
2379 *r = *a;
2380 round_for_format (fmt, r);
2382 /* round_for_format de-normalizes denormals. Undo just that part. */
2383 if (r->cl == rvc_normal)
2384 normalize (r);
2387 /* Legacy. Likewise, except return the struct directly. */
2389 REAL_VALUE_TYPE
2390 real_value_truncate (enum machine_mode mode, REAL_VALUE_TYPE a)
2392 REAL_VALUE_TYPE r;
2393 real_convert (&r, mode, &a);
2394 return r;
2397 /* Return true if truncating to MODE is exact. */
2399 bool
2400 exact_real_truncate (enum machine_mode mode, const REAL_VALUE_TYPE *a)
2402 REAL_VALUE_TYPE t;
2403 real_convert (&t, mode, a);
2404 return real_identical (&t, a);
2407 /* Write R to the given target format. Place the words of the result
2408 in target word order in BUF. There are always 32 bits in each
2409 long, no matter the size of the host long.
2411 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2413 long
2414 real_to_target_fmt (long *buf, const REAL_VALUE_TYPE *r_orig,
2415 const struct real_format *fmt)
2417 REAL_VALUE_TYPE r;
2418 long buf1;
2420 r = *r_orig;
2421 round_for_format (fmt, &r);
2423 if (!buf)
2424 buf = &buf1;
2425 (*fmt->encode) (fmt, buf, &r);
2427 return *buf;
2430 /* Similar, but look up the format from MODE. */
2432 long
2433 real_to_target (long *buf, const REAL_VALUE_TYPE *r, enum machine_mode mode)
2435 const struct real_format *fmt;
2437 fmt = REAL_MODE_FORMAT (mode);
2438 gcc_assert (fmt);
2440 return real_to_target_fmt (buf, r, fmt);
2443 /* Read R from the given target format. Read the words of the result
2444 in target word order in BUF. There are always 32 bits in each
2445 long, no matter the size of the host long. */
2447 void
2448 real_from_target_fmt (REAL_VALUE_TYPE *r, const long *buf,
2449 const struct real_format *fmt)
2451 (*fmt->decode) (fmt, r, buf);
2454 /* Similar, but look up the format from MODE. */
2456 void
2457 real_from_target (REAL_VALUE_TYPE *r, const long *buf, enum machine_mode mode)
2459 const struct real_format *fmt;
2461 fmt = REAL_MODE_FORMAT (mode);
2462 gcc_assert (fmt);
2464 (*fmt->decode) (fmt, r, buf);
2467 /* Return the number of bits in the significand for MODE. */
2468 /* ??? Legacy. Should get access to real_format directly. */
2471 significand_size (enum machine_mode mode)
2473 const struct real_format *fmt;
2475 fmt = REAL_MODE_FORMAT (mode);
2476 if (fmt == NULL)
2477 return 0;
2479 return fmt->p * fmt->log2_b;
2482 /* Return a hash value for the given real value. */
2483 /* ??? The "unsigned int" return value is intended to be hashval_t,
2484 but I didn't want to pull hashtab.h into real.h. */
2486 unsigned int
2487 real_hash (const REAL_VALUE_TYPE *r)
2489 unsigned int h;
2490 size_t i;
2492 h = r->cl | (r->sign << 2);
2493 switch (r->cl)
2495 case rvc_zero:
2496 case rvc_inf:
2497 return h;
2499 case rvc_normal:
2500 h |= REAL_EXP (r) << 3;
2501 break;
2503 case rvc_nan:
2504 if (r->signalling)
2505 h ^= (unsigned int)-1;
2506 if (r->canonical)
2507 return h;
2508 break;
2510 default:
2511 gcc_unreachable ();
2514 if (sizeof(unsigned long) > sizeof(unsigned int))
2515 for (i = 0; i < SIGSZ; ++i)
2517 unsigned long s = r->sig[i];
2518 h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2520 else
2521 for (i = 0; i < SIGSZ; ++i)
2522 h ^= r->sig[i];
2524 return h;
2527 /* IEEE single-precision format. */
2529 static void encode_ieee_single (const struct real_format *fmt,
2530 long *, const REAL_VALUE_TYPE *);
2531 static void decode_ieee_single (const struct real_format *,
2532 REAL_VALUE_TYPE *, const long *);
2534 static void
2535 encode_ieee_single (const struct real_format *fmt, long *buf,
2536 const REAL_VALUE_TYPE *r)
2538 unsigned long image, sig, exp;
2539 unsigned long sign = r->sign;
2540 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2542 image = sign << 31;
2543 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2545 switch (r->cl)
2547 case rvc_zero:
2548 break;
2550 case rvc_inf:
2551 if (fmt->has_inf)
2552 image |= 255 << 23;
2553 else
2554 image |= 0x7fffffff;
2555 break;
2557 case rvc_nan:
2558 if (fmt->has_nans)
2560 if (r->canonical)
2561 sig = 0;
2562 if (r->signalling == fmt->qnan_msb_set)
2563 sig &= ~(1 << 22);
2564 else
2565 sig |= 1 << 22;
2566 /* We overload qnan_msb_set here: it's only clear for
2567 mips_ieee_single, which wants all mantissa bits but the
2568 quiet/signalling one set in canonical NaNs (at least
2569 Quiet ones). */
2570 if (r->canonical && !fmt->qnan_msb_set)
2571 sig |= (1 << 22) - 1;
2572 else if (sig == 0)
2573 sig = 1 << 21;
2575 image |= 255 << 23;
2576 image |= sig;
2578 else
2579 image |= 0x7fffffff;
2580 break;
2582 case rvc_normal:
2583 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2584 whereas the intermediate representation is 0.F x 2**exp.
2585 Which means we're off by one. */
2586 if (denormal)
2587 exp = 0;
2588 else
2589 exp = REAL_EXP (r) + 127 - 1;
2590 image |= exp << 23;
2591 image |= sig;
2592 break;
2594 default:
2595 gcc_unreachable ();
2598 buf[0] = image;
2601 static void
2602 decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2603 const long *buf)
2605 unsigned long image = buf[0] & 0xffffffff;
2606 bool sign = (image >> 31) & 1;
2607 int exp = (image >> 23) & 0xff;
2609 memset (r, 0, sizeof (*r));
2610 image <<= HOST_BITS_PER_LONG - 24;
2611 image &= ~SIG_MSB;
2613 if (exp == 0)
2615 if (image && fmt->has_denorm)
2617 r->cl = rvc_normal;
2618 r->sign = sign;
2619 SET_REAL_EXP (r, -126);
2620 r->sig[SIGSZ-1] = image << 1;
2621 normalize (r);
2623 else if (fmt->has_signed_zero)
2624 r->sign = sign;
2626 else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
2628 if (image)
2630 r->cl = rvc_nan;
2631 r->sign = sign;
2632 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
2633 ^ fmt->qnan_msb_set);
2634 r->sig[SIGSZ-1] = image;
2636 else
2638 r->cl = rvc_inf;
2639 r->sign = sign;
2642 else
2644 r->cl = rvc_normal;
2645 r->sign = sign;
2646 SET_REAL_EXP (r, exp - 127 + 1);
2647 r->sig[SIGSZ-1] = image | SIG_MSB;
2651 const struct real_format ieee_single_format =
2653 encode_ieee_single,
2654 decode_ieee_single,
2659 -125,
2660 128,
2663 true,
2664 true,
2665 true,
2666 true,
2667 true
2670 const struct real_format mips_single_format =
2672 encode_ieee_single,
2673 decode_ieee_single,
2678 -125,
2679 128,
2682 true,
2683 true,
2684 true,
2685 true,
2686 false
2690 /* IEEE double-precision format. */
2692 static void encode_ieee_double (const struct real_format *fmt,
2693 long *, const REAL_VALUE_TYPE *);
2694 static void decode_ieee_double (const struct real_format *,
2695 REAL_VALUE_TYPE *, const long *);
2697 static void
2698 encode_ieee_double (const struct real_format *fmt, long *buf,
2699 const REAL_VALUE_TYPE *r)
2701 unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
2702 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2704 image_hi = r->sign << 31;
2705 image_lo = 0;
2707 if (HOST_BITS_PER_LONG == 64)
2709 sig_hi = r->sig[SIGSZ-1];
2710 sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
2711 sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
2713 else
2715 sig_hi = r->sig[SIGSZ-1];
2716 sig_lo = r->sig[SIGSZ-2];
2717 sig_lo = (sig_hi << 21) | (sig_lo >> 11);
2718 sig_hi = (sig_hi >> 11) & 0xfffff;
2721 switch (r->cl)
2723 case rvc_zero:
2724 break;
2726 case rvc_inf:
2727 if (fmt->has_inf)
2728 image_hi |= 2047 << 20;
2729 else
2731 image_hi |= 0x7fffffff;
2732 image_lo = 0xffffffff;
2734 break;
2736 case rvc_nan:
2737 if (fmt->has_nans)
2739 if (r->canonical)
2740 sig_hi = sig_lo = 0;
2741 if (r->signalling == fmt->qnan_msb_set)
2742 sig_hi &= ~(1 << 19);
2743 else
2744 sig_hi |= 1 << 19;
2745 /* We overload qnan_msb_set here: it's only clear for
2746 mips_ieee_single, which wants all mantissa bits but the
2747 quiet/signalling one set in canonical NaNs (at least
2748 Quiet ones). */
2749 if (r->canonical && !fmt->qnan_msb_set)
2751 sig_hi |= (1 << 19) - 1;
2752 sig_lo = 0xffffffff;
2754 else if (sig_hi == 0 && sig_lo == 0)
2755 sig_hi = 1 << 18;
2757 image_hi |= 2047 << 20;
2758 image_hi |= sig_hi;
2759 image_lo = sig_lo;
2761 else
2763 image_hi |= 0x7fffffff;
2764 image_lo = 0xffffffff;
2766 break;
2768 case rvc_normal:
2769 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2770 whereas the intermediate representation is 0.F x 2**exp.
2771 Which means we're off by one. */
2772 if (denormal)
2773 exp = 0;
2774 else
2775 exp = REAL_EXP (r) + 1023 - 1;
2776 image_hi |= exp << 20;
2777 image_hi |= sig_hi;
2778 image_lo = sig_lo;
2779 break;
2781 default:
2782 gcc_unreachable ();
2785 if (FLOAT_WORDS_BIG_ENDIAN)
2786 buf[0] = image_hi, buf[1] = image_lo;
2787 else
2788 buf[0] = image_lo, buf[1] = image_hi;
2791 static void
2792 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2793 const long *buf)
2795 unsigned long image_hi, image_lo;
2796 bool sign;
2797 int exp;
2799 if (FLOAT_WORDS_BIG_ENDIAN)
2800 image_hi = buf[0], image_lo = buf[1];
2801 else
2802 image_lo = buf[0], image_hi = buf[1];
2803 image_lo &= 0xffffffff;
2804 image_hi &= 0xffffffff;
2806 sign = (image_hi >> 31) & 1;
2807 exp = (image_hi >> 20) & 0x7ff;
2809 memset (r, 0, sizeof (*r));
2811 image_hi <<= 32 - 21;
2812 image_hi |= image_lo >> 21;
2813 image_hi &= 0x7fffffff;
2814 image_lo <<= 32 - 21;
2816 if (exp == 0)
2818 if ((image_hi || image_lo) && fmt->has_denorm)
2820 r->cl = rvc_normal;
2821 r->sign = sign;
2822 SET_REAL_EXP (r, -1022);
2823 if (HOST_BITS_PER_LONG == 32)
2825 image_hi = (image_hi << 1) | (image_lo >> 31);
2826 image_lo <<= 1;
2827 r->sig[SIGSZ-1] = image_hi;
2828 r->sig[SIGSZ-2] = image_lo;
2830 else
2832 image_hi = (image_hi << 31 << 2) | (image_lo << 1);
2833 r->sig[SIGSZ-1] = image_hi;
2835 normalize (r);
2837 else if (fmt->has_signed_zero)
2838 r->sign = sign;
2840 else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
2842 if (image_hi || image_lo)
2844 r->cl = rvc_nan;
2845 r->sign = sign;
2846 r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
2847 if (HOST_BITS_PER_LONG == 32)
2849 r->sig[SIGSZ-1] = image_hi;
2850 r->sig[SIGSZ-2] = image_lo;
2852 else
2853 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
2855 else
2857 r->cl = rvc_inf;
2858 r->sign = sign;
2861 else
2863 r->cl = rvc_normal;
2864 r->sign = sign;
2865 SET_REAL_EXP (r, exp - 1023 + 1);
2866 if (HOST_BITS_PER_LONG == 32)
2868 r->sig[SIGSZ-1] = image_hi | SIG_MSB;
2869 r->sig[SIGSZ-2] = image_lo;
2871 else
2872 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
2876 const struct real_format ieee_double_format =
2878 encode_ieee_double,
2879 decode_ieee_double,
2884 -1021,
2885 1024,
2888 true,
2889 true,
2890 true,
2891 true,
2892 true
2895 const struct real_format mips_double_format =
2897 encode_ieee_double,
2898 decode_ieee_double,
2903 -1021,
2904 1024,
2907 true,
2908 true,
2909 true,
2910 true,
2911 false
2915 /* IEEE extended real format. This comes in three flavors: Intel's as
2916 a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
2917 12- and 16-byte images may be big- or little endian; Motorola's is
2918 always big endian. */
2920 /* Helper subroutine which converts from the internal format to the
2921 12-byte little-endian Intel format. Functions below adjust this
2922 for the other possible formats. */
2923 static void
2924 encode_ieee_extended (const struct real_format *fmt, long *buf,
2925 const REAL_VALUE_TYPE *r)
2927 unsigned long image_hi, sig_hi, sig_lo;
2928 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2930 image_hi = r->sign << 15;
2931 sig_hi = sig_lo = 0;
2933 switch (r->cl)
2935 case rvc_zero:
2936 break;
2938 case rvc_inf:
2939 if (fmt->has_inf)
2941 image_hi |= 32767;
2943 /* Intel requires the explicit integer bit to be set, otherwise
2944 it considers the value a "pseudo-infinity". Motorola docs
2945 say it doesn't care. */
2946 sig_hi = 0x80000000;
2948 else
2950 image_hi |= 32767;
2951 sig_lo = sig_hi = 0xffffffff;
2953 break;
2955 case rvc_nan:
2956 if (fmt->has_nans)
2958 image_hi |= 32767;
2959 if (HOST_BITS_PER_LONG == 32)
2961 sig_hi = r->sig[SIGSZ-1];
2962 sig_lo = r->sig[SIGSZ-2];
2964 else
2966 sig_lo = r->sig[SIGSZ-1];
2967 sig_hi = sig_lo >> 31 >> 1;
2968 sig_lo &= 0xffffffff;
2970 if (r->signalling == fmt->qnan_msb_set)
2971 sig_hi &= ~(1 << 30);
2972 else
2973 sig_hi |= 1 << 30;
2974 if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
2975 sig_hi = 1 << 29;
2977 /* Intel requires the explicit integer bit to be set, otherwise
2978 it considers the value a "pseudo-nan". Motorola docs say it
2979 doesn't care. */
2980 sig_hi |= 0x80000000;
2982 else
2984 image_hi |= 32767;
2985 sig_lo = sig_hi = 0xffffffff;
2987 break;
2989 case rvc_normal:
2991 int exp = REAL_EXP (r);
2993 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2994 whereas the intermediate representation is 0.F x 2**exp.
2995 Which means we're off by one.
2997 Except for Motorola, which consider exp=0 and explicit
2998 integer bit set to continue to be normalized. In theory
2999 this discrepancy has been taken care of by the difference
3000 in fmt->emin in round_for_format. */
3002 if (denormal)
3003 exp = 0;
3004 else
3006 exp += 16383 - 1;
3007 gcc_assert (exp >= 0);
3009 image_hi |= exp;
3011 if (HOST_BITS_PER_LONG == 32)
3013 sig_hi = r->sig[SIGSZ-1];
3014 sig_lo = r->sig[SIGSZ-2];
3016 else
3018 sig_lo = r->sig[SIGSZ-1];
3019 sig_hi = sig_lo >> 31 >> 1;
3020 sig_lo &= 0xffffffff;
3023 break;
3025 default:
3026 gcc_unreachable ();
3029 buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3032 /* Convert from the internal format to the 12-byte Motorola format
3033 for an IEEE extended real. */
3034 static void
3035 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3036 const REAL_VALUE_TYPE *r)
3038 long intermed[3];
3039 encode_ieee_extended (fmt, intermed, r);
3041 /* Motorola chips are assumed always to be big-endian. Also, the
3042 padding in a Motorola extended real goes between the exponent and
3043 the mantissa. At this point the mantissa is entirely within
3044 elements 0 and 1 of intermed, and the exponent entirely within
3045 element 2, so all we have to do is swap the order around, and
3046 shift element 2 left 16 bits. */
3047 buf[0] = intermed[2] << 16;
3048 buf[1] = intermed[1];
3049 buf[2] = intermed[0];
3052 /* Convert from the internal format to the 12-byte Intel format for
3053 an IEEE extended real. */
3054 static void
3055 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3056 const REAL_VALUE_TYPE *r)
3058 if (FLOAT_WORDS_BIG_ENDIAN)
3060 /* All the padding in an Intel-format extended real goes at the high
3061 end, which in this case is after the mantissa, not the exponent.
3062 Therefore we must shift everything down 16 bits. */
3063 long intermed[3];
3064 encode_ieee_extended (fmt, intermed, r);
3065 buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3066 buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3067 buf[2] = (intermed[0] << 16);
3069 else
3070 /* encode_ieee_extended produces what we want directly. */
3071 encode_ieee_extended (fmt, buf, r);
3074 /* Convert from the internal format to the 16-byte Intel format for
3075 an IEEE extended real. */
3076 static void
3077 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3078 const REAL_VALUE_TYPE *r)
3080 /* All the padding in an Intel-format extended real goes at the high end. */
3081 encode_ieee_extended_intel_96 (fmt, buf, r);
3082 buf[3] = 0;
3085 /* As above, we have a helper function which converts from 12-byte
3086 little-endian Intel format to internal format. Functions below
3087 adjust for the other possible formats. */
3088 static void
3089 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3090 const long *buf)
3092 unsigned long image_hi, sig_hi, sig_lo;
3093 bool sign;
3094 int exp;
3096 sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3097 sig_lo &= 0xffffffff;
3098 sig_hi &= 0xffffffff;
3099 image_hi &= 0xffffffff;
3101 sign = (image_hi >> 15) & 1;
3102 exp = image_hi & 0x7fff;
3104 memset (r, 0, sizeof (*r));
3106 if (exp == 0)
3108 if ((sig_hi || sig_lo) && fmt->has_denorm)
3110 r->cl = rvc_normal;
3111 r->sign = sign;
3113 /* When the IEEE format contains a hidden bit, we know that
3114 it's zero at this point, and so shift up the significand
3115 and decrease the exponent to match. In this case, Motorola
3116 defines the explicit integer bit to be valid, so we don't
3117 know whether the msb is set or not. */
3118 SET_REAL_EXP (r, fmt->emin);
3119 if (HOST_BITS_PER_LONG == 32)
3121 r->sig[SIGSZ-1] = sig_hi;
3122 r->sig[SIGSZ-2] = sig_lo;
3124 else
3125 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3127 normalize (r);
3129 else if (fmt->has_signed_zero)
3130 r->sign = sign;
3132 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3134 /* See above re "pseudo-infinities" and "pseudo-nans".
3135 Short summary is that the MSB will likely always be
3136 set, and that we don't care about it. */
3137 sig_hi &= 0x7fffffff;
3139 if (sig_hi || sig_lo)
3141 r->cl = rvc_nan;
3142 r->sign = sign;
3143 r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3144 if (HOST_BITS_PER_LONG == 32)
3146 r->sig[SIGSZ-1] = sig_hi;
3147 r->sig[SIGSZ-2] = sig_lo;
3149 else
3150 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3152 else
3154 r->cl = rvc_inf;
3155 r->sign = sign;
3158 else
3160 r->cl = rvc_normal;
3161 r->sign = sign;
3162 SET_REAL_EXP (r, exp - 16383 + 1);
3163 if (HOST_BITS_PER_LONG == 32)
3165 r->sig[SIGSZ-1] = sig_hi;
3166 r->sig[SIGSZ-2] = sig_lo;
3168 else
3169 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3173 /* Convert from the internal format to the 12-byte Motorola format
3174 for an IEEE extended real. */
3175 static void
3176 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3177 const long *buf)
3179 long intermed[3];
3181 /* Motorola chips are assumed always to be big-endian. Also, the
3182 padding in a Motorola extended real goes between the exponent and
3183 the mantissa; remove it. */
3184 intermed[0] = buf[2];
3185 intermed[1] = buf[1];
3186 intermed[2] = (unsigned long)buf[0] >> 16;
3188 decode_ieee_extended (fmt, r, intermed);
3191 /* Convert from the internal format to the 12-byte Intel format for
3192 an IEEE extended real. */
3193 static void
3194 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3195 const long *buf)
3197 if (FLOAT_WORDS_BIG_ENDIAN)
3199 /* All the padding in an Intel-format extended real goes at the high
3200 end, which in this case is after the mantissa, not the exponent.
3201 Therefore we must shift everything up 16 bits. */
3202 long intermed[3];
3204 intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3205 intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3206 intermed[2] = ((unsigned long)buf[0] >> 16);
3208 decode_ieee_extended (fmt, r, intermed);
3210 else
3211 /* decode_ieee_extended produces what we want directly. */
3212 decode_ieee_extended (fmt, r, buf);
3215 /* Convert from the internal format to the 16-byte Intel format for
3216 an IEEE extended real. */
3217 static void
3218 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3219 const long *buf)
3221 /* All the padding in an Intel-format extended real goes at the high end. */
3222 decode_ieee_extended_intel_96 (fmt, r, buf);
3225 const struct real_format ieee_extended_motorola_format =
3227 encode_ieee_extended_motorola,
3228 decode_ieee_extended_motorola,
3233 -16382,
3234 16384,
3237 true,
3238 true,
3239 true,
3240 true,
3241 true
3244 const struct real_format ieee_extended_intel_96_format =
3246 encode_ieee_extended_intel_96,
3247 decode_ieee_extended_intel_96,
3252 -16381,
3253 16384,
3256 true,
3257 true,
3258 true,
3259 true,
3260 true
3263 const struct real_format ieee_extended_intel_128_format =
3265 encode_ieee_extended_intel_128,
3266 decode_ieee_extended_intel_128,
3271 -16381,
3272 16384,
3275 true,
3276 true,
3277 true,
3278 true,
3279 true
3282 /* The following caters to i386 systems that set the rounding precision
3283 to 53 bits instead of 64, e.g. FreeBSD. */
3284 const struct real_format ieee_extended_intel_96_round_53_format =
3286 encode_ieee_extended_intel_96,
3287 decode_ieee_extended_intel_96,
3292 -16381,
3293 16384,
3296 true,
3297 true,
3298 true,
3299 true,
3300 true
3303 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3304 numbers whose sum is equal to the extended precision value. The number
3305 with greater magnitude is first. This format has the same magnitude
3306 range as an IEEE double precision value, but effectively 106 bits of
3307 significand precision. Infinity and NaN are represented by their IEEE
3308 double precision value stored in the first number, the second number is
3309 +0.0 or -0.0 for Infinity and don't-care for NaN. */
3311 static void encode_ibm_extended (const struct real_format *fmt,
3312 long *, const REAL_VALUE_TYPE *);
3313 static void decode_ibm_extended (const struct real_format *,
3314 REAL_VALUE_TYPE *, const long *);
3316 static void
3317 encode_ibm_extended (const struct real_format *fmt, long *buf,
3318 const REAL_VALUE_TYPE *r)
3320 REAL_VALUE_TYPE u, normr, v;
3321 const struct real_format *base_fmt;
3323 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3325 /* Renormlize R before doing any arithmetic on it. */
3326 normr = *r;
3327 if (normr.cl == rvc_normal)
3328 normalize (&normr);
3330 /* u = IEEE double precision portion of significand. */
3331 u = normr;
3332 round_for_format (base_fmt, &u);
3333 encode_ieee_double (base_fmt, &buf[0], &u);
3335 if (u.cl == rvc_normal)
3337 do_add (&v, &normr, &u, 1);
3338 /* Call round_for_format since we might need to denormalize. */
3339 round_for_format (base_fmt, &v);
3340 encode_ieee_double (base_fmt, &buf[2], &v);
3342 else
3344 /* Inf, NaN, 0 are all representable as doubles, so the
3345 least-significant part can be 0.0. */
3346 buf[2] = 0;
3347 buf[3] = 0;
3351 static void
3352 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3353 const long *buf)
3355 REAL_VALUE_TYPE u, v;
3356 const struct real_format *base_fmt;
3358 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3359 decode_ieee_double (base_fmt, &u, &buf[0]);
3361 if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3363 decode_ieee_double (base_fmt, &v, &buf[2]);
3364 do_add (r, &u, &v, 0);
3366 else
3367 *r = u;
3370 const struct real_format ibm_extended_format =
3372 encode_ibm_extended,
3373 decode_ibm_extended,
3376 53 + 53,
3378 -1021 + 53,
3379 1024,
3380 127,
3382 true,
3383 true,
3384 true,
3385 true,
3386 true
3389 const struct real_format mips_extended_format =
3391 encode_ibm_extended,
3392 decode_ibm_extended,
3395 53 + 53,
3397 -1021 + 53,
3398 1024,
3399 127,
3401 true,
3402 true,
3403 true,
3404 true,
3405 false
3409 /* IEEE quad precision format. */
3411 static void encode_ieee_quad (const struct real_format *fmt,
3412 long *, const REAL_VALUE_TYPE *);
3413 static void decode_ieee_quad (const struct real_format *,
3414 REAL_VALUE_TYPE *, const long *);
3416 static void
3417 encode_ieee_quad (const struct real_format *fmt, long *buf,
3418 const REAL_VALUE_TYPE *r)
3420 unsigned long image3, image2, image1, image0, exp;
3421 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3422 REAL_VALUE_TYPE u;
3424 image3 = r->sign << 31;
3425 image2 = 0;
3426 image1 = 0;
3427 image0 = 0;
3429 rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3431 switch (r->cl)
3433 case rvc_zero:
3434 break;
3436 case rvc_inf:
3437 if (fmt->has_inf)
3438 image3 |= 32767 << 16;
3439 else
3441 image3 |= 0x7fffffff;
3442 image2 = 0xffffffff;
3443 image1 = 0xffffffff;
3444 image0 = 0xffffffff;
3446 break;
3448 case rvc_nan:
3449 if (fmt->has_nans)
3451 image3 |= 32767 << 16;
3453 if (r->canonical)
3455 /* Don't use bits from the significand. The
3456 initialization above is right. */
3458 else if (HOST_BITS_PER_LONG == 32)
3460 image0 = u.sig[0];
3461 image1 = u.sig[1];
3462 image2 = u.sig[2];
3463 image3 |= u.sig[3] & 0xffff;
3465 else
3467 image0 = u.sig[0];
3468 image1 = image0 >> 31 >> 1;
3469 image2 = u.sig[1];
3470 image3 |= (image2 >> 31 >> 1) & 0xffff;
3471 image0 &= 0xffffffff;
3472 image2 &= 0xffffffff;
3474 if (r->signalling == fmt->qnan_msb_set)
3475 image3 &= ~0x8000;
3476 else
3477 image3 |= 0x8000;
3478 /* We overload qnan_msb_set here: it's only clear for
3479 mips_ieee_single, which wants all mantissa bits but the
3480 quiet/signalling one set in canonical NaNs (at least
3481 Quiet ones). */
3482 if (r->canonical && !fmt->qnan_msb_set)
3484 image3 |= 0x7fff;
3485 image2 = image1 = image0 = 0xffffffff;
3487 else if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3488 image3 |= 0x4000;
3490 else
3492 image3 |= 0x7fffffff;
3493 image2 = 0xffffffff;
3494 image1 = 0xffffffff;
3495 image0 = 0xffffffff;
3497 break;
3499 case rvc_normal:
3500 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3501 whereas the intermediate representation is 0.F x 2**exp.
3502 Which means we're off by one. */
3503 if (denormal)
3504 exp = 0;
3505 else
3506 exp = REAL_EXP (r) + 16383 - 1;
3507 image3 |= exp << 16;
3509 if (HOST_BITS_PER_LONG == 32)
3511 image0 = u.sig[0];
3512 image1 = u.sig[1];
3513 image2 = u.sig[2];
3514 image3 |= u.sig[3] & 0xffff;
3516 else
3518 image0 = u.sig[0];
3519 image1 = image0 >> 31 >> 1;
3520 image2 = u.sig[1];
3521 image3 |= (image2 >> 31 >> 1) & 0xffff;
3522 image0 &= 0xffffffff;
3523 image2 &= 0xffffffff;
3525 break;
3527 default:
3528 gcc_unreachable ();
3531 if (FLOAT_WORDS_BIG_ENDIAN)
3533 buf[0] = image3;
3534 buf[1] = image2;
3535 buf[2] = image1;
3536 buf[3] = image0;
3538 else
3540 buf[0] = image0;
3541 buf[1] = image1;
3542 buf[2] = image2;
3543 buf[3] = image3;
3547 static void
3548 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3549 const long *buf)
3551 unsigned long image3, image2, image1, image0;
3552 bool sign;
3553 int exp;
3555 if (FLOAT_WORDS_BIG_ENDIAN)
3557 image3 = buf[0];
3558 image2 = buf[1];
3559 image1 = buf[2];
3560 image0 = buf[3];
3562 else
3564 image0 = buf[0];
3565 image1 = buf[1];
3566 image2 = buf[2];
3567 image3 = buf[3];
3569 image0 &= 0xffffffff;
3570 image1 &= 0xffffffff;
3571 image2 &= 0xffffffff;
3573 sign = (image3 >> 31) & 1;
3574 exp = (image3 >> 16) & 0x7fff;
3575 image3 &= 0xffff;
3577 memset (r, 0, sizeof (*r));
3579 if (exp == 0)
3581 if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
3583 r->cl = rvc_normal;
3584 r->sign = sign;
3586 SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
3587 if (HOST_BITS_PER_LONG == 32)
3589 r->sig[0] = image0;
3590 r->sig[1] = image1;
3591 r->sig[2] = image2;
3592 r->sig[3] = image3;
3594 else
3596 r->sig[0] = (image1 << 31 << 1) | image0;
3597 r->sig[1] = (image3 << 31 << 1) | image2;
3600 normalize (r);
3602 else if (fmt->has_signed_zero)
3603 r->sign = sign;
3605 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3607 if (image3 | image2 | image1 | image0)
3609 r->cl = rvc_nan;
3610 r->sign = sign;
3611 r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
3613 if (HOST_BITS_PER_LONG == 32)
3615 r->sig[0] = image0;
3616 r->sig[1] = image1;
3617 r->sig[2] = image2;
3618 r->sig[3] = image3;
3620 else
3622 r->sig[0] = (image1 << 31 << 1) | image0;
3623 r->sig[1] = (image3 << 31 << 1) | image2;
3625 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3627 else
3629 r->cl = rvc_inf;
3630 r->sign = sign;
3633 else
3635 r->cl = rvc_normal;
3636 r->sign = sign;
3637 SET_REAL_EXP (r, exp - 16383 + 1);
3639 if (HOST_BITS_PER_LONG == 32)
3641 r->sig[0] = image0;
3642 r->sig[1] = image1;
3643 r->sig[2] = image2;
3644 r->sig[3] = image3;
3646 else
3648 r->sig[0] = (image1 << 31 << 1) | image0;
3649 r->sig[1] = (image3 << 31 << 1) | image2;
3651 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3652 r->sig[SIGSZ-1] |= SIG_MSB;
3656 const struct real_format ieee_quad_format =
3658 encode_ieee_quad,
3659 decode_ieee_quad,
3662 113,
3663 113,
3664 -16381,
3665 16384,
3666 127,
3667 127,
3668 true,
3669 true,
3670 true,
3671 true,
3672 true
3675 const struct real_format mips_quad_format =
3677 encode_ieee_quad,
3678 decode_ieee_quad,
3681 113,
3682 113,
3683 -16381,
3684 16384,
3685 127,
3686 127,
3687 true,
3688 true,
3689 true,
3690 true,
3691 false
3694 /* Descriptions of VAX floating point formats can be found beginning at
3696 http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
3698 The thing to remember is that they're almost IEEE, except for word
3699 order, exponent bias, and the lack of infinities, nans, and denormals.
3701 We don't implement the H_floating format here, simply because neither
3702 the VAX or Alpha ports use it. */
3704 static void encode_vax_f (const struct real_format *fmt,
3705 long *, const REAL_VALUE_TYPE *);
3706 static void decode_vax_f (const struct real_format *,
3707 REAL_VALUE_TYPE *, const long *);
3708 static void encode_vax_d (const struct real_format *fmt,
3709 long *, const REAL_VALUE_TYPE *);
3710 static void decode_vax_d (const struct real_format *,
3711 REAL_VALUE_TYPE *, const long *);
3712 static void encode_vax_g (const struct real_format *fmt,
3713 long *, const REAL_VALUE_TYPE *);
3714 static void decode_vax_g (const struct real_format *,
3715 REAL_VALUE_TYPE *, const long *);
3717 static void
3718 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3719 const REAL_VALUE_TYPE *r)
3721 unsigned long sign, exp, sig, image;
3723 sign = r->sign << 15;
3725 switch (r->cl)
3727 case rvc_zero:
3728 image = 0;
3729 break;
3731 case rvc_inf:
3732 case rvc_nan:
3733 image = 0xffff7fff | sign;
3734 break;
3736 case rvc_normal:
3737 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
3738 exp = REAL_EXP (r) + 128;
3740 image = (sig << 16) & 0xffff0000;
3741 image |= sign;
3742 image |= exp << 7;
3743 image |= sig >> 16;
3744 break;
3746 default:
3747 gcc_unreachable ();
3750 buf[0] = image;
3753 static void
3754 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
3755 REAL_VALUE_TYPE *r, const long *buf)
3757 unsigned long image = buf[0] & 0xffffffff;
3758 int exp = (image >> 7) & 0xff;
3760 memset (r, 0, sizeof (*r));
3762 if (exp != 0)
3764 r->cl = rvc_normal;
3765 r->sign = (image >> 15) & 1;
3766 SET_REAL_EXP (r, exp - 128);
3768 image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
3769 r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
3773 static void
3774 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3775 const REAL_VALUE_TYPE *r)
3777 unsigned long image0, image1, sign = r->sign << 15;
3779 switch (r->cl)
3781 case rvc_zero:
3782 image0 = image1 = 0;
3783 break;
3785 case rvc_inf:
3786 case rvc_nan:
3787 image0 = 0xffff7fff | sign;
3788 image1 = 0xffffffff;
3789 break;
3791 case rvc_normal:
3792 /* Extract the significand into straight hi:lo. */
3793 if (HOST_BITS_PER_LONG == 64)
3795 image0 = r->sig[SIGSZ-1];
3796 image1 = (image0 >> (64 - 56)) & 0xffffffff;
3797 image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
3799 else
3801 image0 = r->sig[SIGSZ-1];
3802 image1 = r->sig[SIGSZ-2];
3803 image1 = (image0 << 24) | (image1 >> 8);
3804 image0 = (image0 >> 8) & 0xffffff;
3807 /* Rearrange the half-words of the significand to match the
3808 external format. */
3809 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
3810 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3812 /* Add the sign and exponent. */
3813 image0 |= sign;
3814 image0 |= (REAL_EXP (r) + 128) << 7;
3815 break;
3817 default:
3818 gcc_unreachable ();
3821 if (FLOAT_WORDS_BIG_ENDIAN)
3822 buf[0] = image1, buf[1] = image0;
3823 else
3824 buf[0] = image0, buf[1] = image1;
3827 static void
3828 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
3829 REAL_VALUE_TYPE *r, const long *buf)
3831 unsigned long image0, image1;
3832 int exp;
3834 if (FLOAT_WORDS_BIG_ENDIAN)
3835 image1 = buf[0], image0 = buf[1];
3836 else
3837 image0 = buf[0], image1 = buf[1];
3838 image0 &= 0xffffffff;
3839 image1 &= 0xffffffff;
3841 exp = (image0 >> 7) & 0xff;
3843 memset (r, 0, sizeof (*r));
3845 if (exp != 0)
3847 r->cl = rvc_normal;
3848 r->sign = (image0 >> 15) & 1;
3849 SET_REAL_EXP (r, exp - 128);
3851 /* Rearrange the half-words of the external format into
3852 proper ascending order. */
3853 image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
3854 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3856 if (HOST_BITS_PER_LONG == 64)
3858 image0 = (image0 << 31 << 1) | image1;
3859 image0 <<= 64 - 56;
3860 image0 |= SIG_MSB;
3861 r->sig[SIGSZ-1] = image0;
3863 else
3865 r->sig[SIGSZ-1] = image0;
3866 r->sig[SIGSZ-2] = image1;
3867 lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
3868 r->sig[SIGSZ-1] |= SIG_MSB;
3873 static void
3874 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3875 const REAL_VALUE_TYPE *r)
3877 unsigned long image0, image1, sign = r->sign << 15;
3879 switch (r->cl)
3881 case rvc_zero:
3882 image0 = image1 = 0;
3883 break;
3885 case rvc_inf:
3886 case rvc_nan:
3887 image0 = 0xffff7fff | sign;
3888 image1 = 0xffffffff;
3889 break;
3891 case rvc_normal:
3892 /* Extract the significand into straight hi:lo. */
3893 if (HOST_BITS_PER_LONG == 64)
3895 image0 = r->sig[SIGSZ-1];
3896 image1 = (image0 >> (64 - 53)) & 0xffffffff;
3897 image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
3899 else
3901 image0 = r->sig[SIGSZ-1];
3902 image1 = r->sig[SIGSZ-2];
3903 image1 = (image0 << 21) | (image1 >> 11);
3904 image0 = (image0 >> 11) & 0xfffff;
3907 /* Rearrange the half-words of the significand to match the
3908 external format. */
3909 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
3910 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3912 /* Add the sign and exponent. */
3913 image0 |= sign;
3914 image0 |= (REAL_EXP (r) + 1024) << 4;
3915 break;
3917 default:
3918 gcc_unreachable ();
3921 if (FLOAT_WORDS_BIG_ENDIAN)
3922 buf[0] = image1, buf[1] = image0;
3923 else
3924 buf[0] = image0, buf[1] = image1;
3927 static void
3928 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
3929 REAL_VALUE_TYPE *r, const long *buf)
3931 unsigned long image0, image1;
3932 int exp;
3934 if (FLOAT_WORDS_BIG_ENDIAN)
3935 image1 = buf[0], image0 = buf[1];
3936 else
3937 image0 = buf[0], image1 = buf[1];
3938 image0 &= 0xffffffff;
3939 image1 &= 0xffffffff;
3941 exp = (image0 >> 4) & 0x7ff;
3943 memset (r, 0, sizeof (*r));
3945 if (exp != 0)
3947 r->cl = rvc_normal;
3948 r->sign = (image0 >> 15) & 1;
3949 SET_REAL_EXP (r, exp - 1024);
3951 /* Rearrange the half-words of the external format into
3952 proper ascending order. */
3953 image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
3954 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3956 if (HOST_BITS_PER_LONG == 64)
3958 image0 = (image0 << 31 << 1) | image1;
3959 image0 <<= 64 - 53;
3960 image0 |= SIG_MSB;
3961 r->sig[SIGSZ-1] = image0;
3963 else
3965 r->sig[SIGSZ-1] = image0;
3966 r->sig[SIGSZ-2] = image1;
3967 lshift_significand (r, r, 64 - 53);
3968 r->sig[SIGSZ-1] |= SIG_MSB;
3973 const struct real_format vax_f_format =
3975 encode_vax_f,
3976 decode_vax_f,
3981 -127,
3982 127,
3985 false,
3986 false,
3987 false,
3988 false,
3989 false
3992 const struct real_format vax_d_format =
3994 encode_vax_d,
3995 decode_vax_d,
4000 -127,
4001 127,
4004 false,
4005 false,
4006 false,
4007 false,
4008 false
4011 const struct real_format vax_g_format =
4013 encode_vax_g,
4014 decode_vax_g,
4019 -1023,
4020 1023,
4023 false,
4024 false,
4025 false,
4026 false,
4027 false
4030 /* A good reference for these can be found in chapter 9 of
4031 "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
4032 An on-line version can be found here:
4034 http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
4037 static void encode_i370_single (const struct real_format *fmt,
4038 long *, const REAL_VALUE_TYPE *);
4039 static void decode_i370_single (const struct real_format *,
4040 REAL_VALUE_TYPE *, const long *);
4041 static void encode_i370_double (const struct real_format *fmt,
4042 long *, const REAL_VALUE_TYPE *);
4043 static void decode_i370_double (const struct real_format *,
4044 REAL_VALUE_TYPE *, const long *);
4046 static void
4047 encode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4048 long *buf, const REAL_VALUE_TYPE *r)
4050 unsigned long sign, exp, sig, image;
4052 sign = r->sign << 31;
4054 switch (r->cl)
4056 case rvc_zero:
4057 image = 0;
4058 break;
4060 case rvc_inf:
4061 case rvc_nan:
4062 image = 0x7fffffff | sign;
4063 break;
4065 case rvc_normal:
4066 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
4067 exp = ((REAL_EXP (r) / 4) + 64) << 24;
4068 image = sign | exp | sig;
4069 break;
4071 default:
4072 gcc_unreachable ();
4075 buf[0] = image;
4078 static void
4079 decode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4080 REAL_VALUE_TYPE *r, const long *buf)
4082 unsigned long sign, sig, image = buf[0];
4083 int exp;
4085 sign = (image >> 31) & 1;
4086 exp = (image >> 24) & 0x7f;
4087 sig = image & 0xffffff;
4089 memset (r, 0, sizeof (*r));
4091 if (exp || sig)
4093 r->cl = rvc_normal;
4094 r->sign = sign;
4095 SET_REAL_EXP (r, (exp - 64) * 4);
4096 r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
4097 normalize (r);
4101 static void
4102 encode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4103 long *buf, const REAL_VALUE_TYPE *r)
4105 unsigned long sign, exp, image_hi, image_lo;
4107 sign = r->sign << 31;
4109 switch (r->cl)
4111 case rvc_zero:
4112 image_hi = image_lo = 0;
4113 break;
4115 case rvc_inf:
4116 case rvc_nan:
4117 image_hi = 0x7fffffff | sign;
4118 image_lo = 0xffffffff;
4119 break;
4121 case rvc_normal:
4122 if (HOST_BITS_PER_LONG == 64)
4124 image_hi = r->sig[SIGSZ-1];
4125 image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
4126 image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
4128 else
4130 image_hi = r->sig[SIGSZ-1];
4131 image_lo = r->sig[SIGSZ-2];
4132 image_lo = (image_lo >> 8) | (image_hi << 24);
4133 image_hi >>= 8;
4136 exp = ((REAL_EXP (r) / 4) + 64) << 24;
4137 image_hi |= sign | exp;
4138 break;
4140 default:
4141 gcc_unreachable ();
4144 if (FLOAT_WORDS_BIG_ENDIAN)
4145 buf[0] = image_hi, buf[1] = image_lo;
4146 else
4147 buf[0] = image_lo, buf[1] = image_hi;
4150 static void
4151 decode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4152 REAL_VALUE_TYPE *r, const long *buf)
4154 unsigned long sign, image_hi, image_lo;
4155 int exp;
4157 if (FLOAT_WORDS_BIG_ENDIAN)
4158 image_hi = buf[0], image_lo = buf[1];
4159 else
4160 image_lo = buf[0], image_hi = buf[1];
4162 sign = (image_hi >> 31) & 1;
4163 exp = (image_hi >> 24) & 0x7f;
4164 image_hi &= 0xffffff;
4165 image_lo &= 0xffffffff;
4167 memset (r, 0, sizeof (*r));
4169 if (exp || image_hi || image_lo)
4171 r->cl = rvc_normal;
4172 r->sign = sign;
4173 SET_REAL_EXP (r, (exp - 64) * 4 + (SIGNIFICAND_BITS - 56));
4175 if (HOST_BITS_PER_LONG == 32)
4177 r->sig[0] = image_lo;
4178 r->sig[1] = image_hi;
4180 else
4181 r->sig[0] = image_lo | (image_hi << 31 << 1);
4183 normalize (r);
4187 const struct real_format i370_single_format =
4189 encode_i370_single,
4190 decode_i370_single,
4195 -64,
4199 false,
4200 false,
4201 false, /* ??? The encoding does allow for "unnormals". */
4202 false, /* ??? The encoding does allow for "unnormals". */
4203 false
4206 const struct real_format i370_double_format =
4208 encode_i370_double,
4209 decode_i370_double,
4214 -64,
4218 false,
4219 false,
4220 false, /* ??? The encoding does allow for "unnormals". */
4221 false, /* ??? The encoding does allow for "unnormals". */
4222 false
4225 /* The "twos-complement" c4x format is officially defined as
4227 x = s(~s).f * 2**e
4229 This is rather misleading. One must remember that F is signed.
4230 A better description would be
4232 x = -1**s * ((s + 1 + .f) * 2**e
4234 So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
4235 that's -1 * (1+1+(-.5)) == -1.5. I think.
4237 The constructions here are taken from Tables 5-1 and 5-2 of the
4238 TMS320C4x User's Guide wherein step-by-step instructions for
4239 conversion from IEEE are presented. That's close enough to our
4240 internal representation so as to make things easy.
4242 See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf */
4244 static void encode_c4x_single (const struct real_format *fmt,
4245 long *, const REAL_VALUE_TYPE *);
4246 static void decode_c4x_single (const struct real_format *,
4247 REAL_VALUE_TYPE *, const long *);
4248 static void encode_c4x_extended (const struct real_format *fmt,
4249 long *, const REAL_VALUE_TYPE *);
4250 static void decode_c4x_extended (const struct real_format *,
4251 REAL_VALUE_TYPE *, const long *);
4253 static void
4254 encode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4255 long *buf, const REAL_VALUE_TYPE *r)
4257 unsigned long image, exp, sig;
4259 switch (r->cl)
4261 case rvc_zero:
4262 exp = -128;
4263 sig = 0;
4264 break;
4266 case rvc_inf:
4267 case rvc_nan:
4268 exp = 127;
4269 sig = 0x800000 - r->sign;
4270 break;
4272 case rvc_normal:
4273 exp = REAL_EXP (r) - 1;
4274 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4275 if (r->sign)
4277 if (sig)
4278 sig = -sig;
4279 else
4280 exp--;
4281 sig |= 0x800000;
4283 break;
4285 default:
4286 gcc_unreachable ();
4289 image = ((exp & 0xff) << 24) | (sig & 0xffffff);
4290 buf[0] = image;
4293 static void
4294 decode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4295 REAL_VALUE_TYPE *r, const long *buf)
4297 unsigned long image = buf[0];
4298 unsigned long sig;
4299 int exp, sf;
4301 exp = (((image >> 24) & 0xff) ^ 0x80) - 0x80;
4302 sf = ((image & 0xffffff) ^ 0x800000) - 0x800000;
4304 memset (r, 0, sizeof (*r));
4306 if (exp != -128)
4308 r->cl = rvc_normal;
4310 sig = sf & 0x7fffff;
4311 if (sf < 0)
4313 r->sign = 1;
4314 if (sig)
4315 sig = -sig;
4316 else
4317 exp++;
4319 sig = (sig << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4321 SET_REAL_EXP (r, exp + 1);
4322 r->sig[SIGSZ-1] = sig;
4326 static void
4327 encode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4328 long *buf, const REAL_VALUE_TYPE *r)
4330 unsigned long exp, sig;
4332 switch (r->cl)
4334 case rvc_zero:
4335 exp = -128;
4336 sig = 0;
4337 break;
4339 case rvc_inf:
4340 case rvc_nan:
4341 exp = 127;
4342 sig = 0x80000000 - r->sign;
4343 break;
4345 case rvc_normal:
4346 exp = REAL_EXP (r) - 1;
4348 sig = r->sig[SIGSZ-1];
4349 if (HOST_BITS_PER_LONG == 64)
4350 sig = sig >> 1 >> 31;
4351 sig &= 0x7fffffff;
4353 if (r->sign)
4355 if (sig)
4356 sig = -sig;
4357 else
4358 exp--;
4359 sig |= 0x80000000;
4361 break;
4363 default:
4364 gcc_unreachable ();
4367 exp = (exp & 0xff) << 24;
4368 sig &= 0xffffffff;
4370 if (FLOAT_WORDS_BIG_ENDIAN)
4371 buf[0] = exp, buf[1] = sig;
4372 else
4373 buf[0] = sig, buf[0] = exp;
4376 static void
4377 decode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4378 REAL_VALUE_TYPE *r, const long *buf)
4380 unsigned long sig;
4381 int exp, sf;
4383 if (FLOAT_WORDS_BIG_ENDIAN)
4384 exp = buf[0], sf = buf[1];
4385 else
4386 sf = buf[0], exp = buf[1];
4388 exp = (((exp >> 24) & 0xff) & 0x80) - 0x80;
4389 sf = ((sf & 0xffffffff) ^ 0x80000000) - 0x80000000;
4391 memset (r, 0, sizeof (*r));
4393 if (exp != -128)
4395 r->cl = rvc_normal;
4397 sig = sf & 0x7fffffff;
4398 if (sf < 0)
4400 r->sign = 1;
4401 if (sig)
4402 sig = -sig;
4403 else
4404 exp++;
4406 if (HOST_BITS_PER_LONG == 64)
4407 sig = sig << 1 << 31;
4408 sig |= SIG_MSB;
4410 SET_REAL_EXP (r, exp + 1);
4411 r->sig[SIGSZ-1] = sig;
4415 const struct real_format c4x_single_format =
4417 encode_c4x_single,
4418 decode_c4x_single,
4423 -126,
4424 128,
4427 false,
4428 false,
4429 false,
4430 false,
4431 false
4434 const struct real_format c4x_extended_format =
4436 encode_c4x_extended,
4437 decode_c4x_extended,
4442 -126,
4443 128,
4446 false,
4447 false,
4448 false,
4449 false,
4450 false
4454 /* A synthetic "format" for internal arithmetic. It's the size of the
4455 internal significand minus the two bits needed for proper rounding.
4456 The encode and decode routines exist only to satisfy our paranoia
4457 harness. */
4459 static void encode_internal (const struct real_format *fmt,
4460 long *, const REAL_VALUE_TYPE *);
4461 static void decode_internal (const struct real_format *,
4462 REAL_VALUE_TYPE *, const long *);
4464 static void
4465 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4466 const REAL_VALUE_TYPE *r)
4468 memcpy (buf, r, sizeof (*r));
4471 static void
4472 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4473 REAL_VALUE_TYPE *r, const long *buf)
4475 memcpy (r, buf, sizeof (*r));
4478 const struct real_format real_internal_format =
4480 encode_internal,
4481 decode_internal,
4484 SIGNIFICAND_BITS - 2,
4485 SIGNIFICAND_BITS - 2,
4486 -MAX_EXP,
4487 MAX_EXP,
4490 true,
4491 true,
4492 false,
4493 true,
4494 true
4497 /* Calculate the square root of X in mode MODE, and store the result
4498 in R. Return TRUE if the operation does not raise an exception.
4499 For details see "High Precision Division and Square Root",
4500 Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June
4501 1993. http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf. */
4503 bool
4504 real_sqrt (REAL_VALUE_TYPE *r, enum machine_mode mode,
4505 const REAL_VALUE_TYPE *x)
4507 static REAL_VALUE_TYPE halfthree;
4508 static bool init = false;
4509 REAL_VALUE_TYPE h, t, i;
4510 int iter, exp;
4512 /* sqrt(-0.0) is -0.0. */
4513 if (real_isnegzero (x))
4515 *r = *x;
4516 return false;
4519 /* Negative arguments return NaN. */
4520 if (real_isneg (x))
4522 get_canonical_qnan (r, 0);
4523 return false;
4526 /* Infinity and NaN return themselves. */
4527 if (real_isinf (x) || real_isnan (x))
4529 *r = *x;
4530 return false;
4533 if (!init)
4535 do_add (&halfthree, &dconst1, &dconsthalf, 0);
4536 init = true;
4539 /* Initial guess for reciprocal sqrt, i. */
4540 exp = real_exponent (x);
4541 real_ldexp (&i, &dconst1, -exp/2);
4543 /* Newton's iteration for reciprocal sqrt, i. */
4544 for (iter = 0; iter < 16; iter++)
4546 /* i(n+1) = i(n) * (1.5 - 0.5*i(n)*i(n)*x). */
4547 do_multiply (&t, x, &i);
4548 do_multiply (&h, &t, &i);
4549 do_multiply (&t, &h, &dconsthalf);
4550 do_add (&h, &halfthree, &t, 1);
4551 do_multiply (&t, &i, &h);
4553 /* Check for early convergence. */
4554 if (iter >= 6 && real_identical (&i, &t))
4555 break;
4557 /* ??? Unroll loop to avoid copying. */
4558 i = t;
4561 /* Final iteration: r = i*x + 0.5*i*x*(1.0 - i*(i*x)). */
4562 do_multiply (&t, x, &i);
4563 do_multiply (&h, &t, &i);
4564 do_add (&i, &dconst1, &h, 1);
4565 do_multiply (&h, &t, &i);
4566 do_multiply (&i, &dconsthalf, &h);
4567 do_add (&h, &t, &i, 0);
4569 /* ??? We need a Tuckerman test to get the last bit. */
4571 real_convert (r, mode, &h);
4572 return true;
4575 /* Calculate X raised to the integer exponent N in mode MODE and store
4576 the result in R. Return true if the result may be inexact due to
4577 loss of precision. The algorithm is the classic "left-to-right binary
4578 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4579 Algorithms", "The Art of Computer Programming", Volume 2. */
4581 bool
4582 real_powi (REAL_VALUE_TYPE *r, enum machine_mode mode,
4583 const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4585 unsigned HOST_WIDE_INT bit;
4586 REAL_VALUE_TYPE t;
4587 bool inexact = false;
4588 bool init = false;
4589 bool neg;
4590 int i;
4592 if (n == 0)
4594 *r = dconst1;
4595 return false;
4597 else if (n < 0)
4599 /* Don't worry about overflow, from now on n is unsigned. */
4600 neg = true;
4601 n = -n;
4603 else
4604 neg = false;
4606 t = *x;
4607 bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4608 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4610 if (init)
4612 inexact |= do_multiply (&t, &t, &t);
4613 if (n & bit)
4614 inexact |= do_multiply (&t, &t, x);
4616 else if (n & bit)
4617 init = true;
4618 bit >>= 1;
4621 if (neg)
4622 inexact |= do_divide (&t, &dconst1, &t);
4624 real_convert (r, mode, &t);
4625 return inexact;
4628 /* Round X to the nearest integer not larger in absolute value, i.e.
4629 towards zero, placing the result in R in mode MODE. */
4631 void
4632 real_trunc (REAL_VALUE_TYPE *r, enum machine_mode mode,
4633 const REAL_VALUE_TYPE *x)
4635 do_fix_trunc (r, x);
4636 if (mode != VOIDmode)
4637 real_convert (r, mode, r);
4640 /* Round X to the largest integer not greater in value, i.e. round
4641 down, placing the result in R in mode MODE. */
4643 void
4644 real_floor (REAL_VALUE_TYPE *r, enum machine_mode mode,
4645 const REAL_VALUE_TYPE *x)
4647 REAL_VALUE_TYPE t;
4649 do_fix_trunc (&t, x);
4650 if (! real_identical (&t, x) && x->sign)
4651 do_add (&t, &t, &dconstm1, 0);
4652 if (mode != VOIDmode)
4653 real_convert (r, mode, &t);
4654 else
4655 *r = t;
4658 /* Round X to the smallest integer not less then argument, i.e. round
4659 up, placing the result in R in mode MODE. */
4661 void
4662 real_ceil (REAL_VALUE_TYPE *r, enum machine_mode mode,
4663 const REAL_VALUE_TYPE *x)
4665 REAL_VALUE_TYPE t;
4667 do_fix_trunc (&t, x);
4668 if (! real_identical (&t, x) && ! x->sign)
4669 do_add (&t, &t, &dconst1, 0);
4670 if (mode != VOIDmode)
4671 real_convert (r, mode, &t);
4672 else
4673 *r = t;
4676 /* Round X to the nearest integer, but round halfway cases away from
4677 zero. */
4679 void
4680 real_round (REAL_VALUE_TYPE *r, enum machine_mode mode,
4681 const REAL_VALUE_TYPE *x)
4683 do_add (r, x, &dconsthalf, x->sign);
4684 do_fix_trunc (r, r);
4685 if (mode != VOIDmode)
4686 real_convert (r, mode, r);
4689 /* Set the sign of R to the sign of X. */
4691 void
4692 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
4694 r->sign = x->sign;