Daily bump.
[official-gcc.git] / gcc / real.c
bloba748b87b33a82fa2317aacaeb6587c2fd74f0ba9
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, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, 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);
644 /* Re-normalize the result. */
645 normalize (r);
647 /* Special case: if the subtraction results in zero, the result
648 is positive. */
649 if (r->cl == rvc_zero)
650 r->sign = 0;
651 else
652 r->sig[0] |= inexact;
654 return inexact;
657 /* Calculate R = A * B. Return true if the result may be inexact. */
659 static bool
660 do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
661 const REAL_VALUE_TYPE *b)
663 REAL_VALUE_TYPE u, t, *rr;
664 unsigned int i, j, k;
665 int sign = a->sign ^ b->sign;
666 bool inexact = false;
668 switch (CLASS2 (a->cl, b->cl))
670 case CLASS2 (rvc_zero, rvc_zero):
671 case CLASS2 (rvc_zero, rvc_normal):
672 case CLASS2 (rvc_normal, rvc_zero):
673 /* +-0 * ANY = 0 with appropriate sign. */
674 get_zero (r, sign);
675 return false;
677 case CLASS2 (rvc_zero, rvc_nan):
678 case CLASS2 (rvc_normal, rvc_nan):
679 case CLASS2 (rvc_inf, rvc_nan):
680 case CLASS2 (rvc_nan, rvc_nan):
681 /* ANY * NaN = NaN. */
682 *r = *b;
683 r->sign = sign;
684 return false;
686 case CLASS2 (rvc_nan, rvc_zero):
687 case CLASS2 (rvc_nan, rvc_normal):
688 case CLASS2 (rvc_nan, rvc_inf):
689 /* NaN * ANY = NaN. */
690 *r = *a;
691 r->sign = sign;
692 return false;
694 case CLASS2 (rvc_zero, rvc_inf):
695 case CLASS2 (rvc_inf, rvc_zero):
696 /* 0 * Inf = NaN */
697 get_canonical_qnan (r, sign);
698 return false;
700 case CLASS2 (rvc_inf, rvc_inf):
701 case CLASS2 (rvc_normal, rvc_inf):
702 case CLASS2 (rvc_inf, rvc_normal):
703 /* Inf * Inf = Inf, R * Inf = Inf */
704 get_inf (r, sign);
705 return false;
707 case CLASS2 (rvc_normal, rvc_normal):
708 break;
710 default:
711 gcc_unreachable ();
714 if (r == a || r == b)
715 rr = &t;
716 else
717 rr = r;
718 get_zero (rr, 0);
720 /* Collect all the partial products. Since we don't have sure access
721 to a widening multiply, we split each long into two half-words.
723 Consider the long-hand form of a four half-word multiplication:
725 A B C D
726 * E F G H
727 --------------
728 DE DF DG DH
729 CE CF CG CH
730 BE BF BG BH
731 AE AF AG AH
733 We construct partial products of the widened half-word products
734 that are known to not overlap, e.g. DF+DH. Each such partial
735 product is given its proper exponent, which allows us to sum them
736 and obtain the finished product. */
738 for (i = 0; i < SIGSZ * 2; ++i)
740 unsigned long ai = a->sig[i / 2];
741 if (i & 1)
742 ai >>= HOST_BITS_PER_LONG / 2;
743 else
744 ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
746 if (ai == 0)
747 continue;
749 for (j = 0; j < 2; ++j)
751 int exp = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
752 + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2)));
754 if (exp > MAX_EXP)
756 get_inf (r, sign);
757 return true;
759 if (exp < -MAX_EXP)
761 /* Would underflow to zero, which we shouldn't bother adding. */
762 inexact = true;
763 continue;
766 memset (&u, 0, sizeof (u));
767 u.cl = rvc_normal;
768 SET_REAL_EXP (&u, exp);
770 for (k = j; k < SIGSZ * 2; k += 2)
772 unsigned long bi = b->sig[k / 2];
773 if (k & 1)
774 bi >>= HOST_BITS_PER_LONG / 2;
775 else
776 bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
778 u.sig[k / 2] = ai * bi;
781 normalize (&u);
782 inexact |= do_add (rr, rr, &u, 0);
786 rr->sign = sign;
787 if (rr != r)
788 *r = t;
790 return inexact;
793 /* Calculate R = A / B. Return true if the result may be inexact. */
795 static bool
796 do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
797 const REAL_VALUE_TYPE *b)
799 int exp, sign = a->sign ^ b->sign;
800 REAL_VALUE_TYPE t, *rr;
801 bool inexact;
803 switch (CLASS2 (a->cl, b->cl))
805 case CLASS2 (rvc_zero, rvc_zero):
806 /* 0 / 0 = NaN. */
807 case CLASS2 (rvc_inf, rvc_inf):
808 /* Inf / Inf = NaN. */
809 get_canonical_qnan (r, sign);
810 return false;
812 case CLASS2 (rvc_zero, rvc_normal):
813 case CLASS2 (rvc_zero, rvc_inf):
814 /* 0 / ANY = 0. */
815 case CLASS2 (rvc_normal, rvc_inf):
816 /* R / Inf = 0. */
817 get_zero (r, sign);
818 return false;
820 case CLASS2 (rvc_normal, rvc_zero):
821 /* R / 0 = Inf. */
822 case CLASS2 (rvc_inf, rvc_zero):
823 /* Inf / 0 = Inf. */
824 get_inf (r, sign);
825 return false;
827 case CLASS2 (rvc_zero, rvc_nan):
828 case CLASS2 (rvc_normal, rvc_nan):
829 case CLASS2 (rvc_inf, rvc_nan):
830 case CLASS2 (rvc_nan, rvc_nan):
831 /* ANY / NaN = NaN. */
832 *r = *b;
833 r->sign = sign;
834 return false;
836 case CLASS2 (rvc_nan, rvc_zero):
837 case CLASS2 (rvc_nan, rvc_normal):
838 case CLASS2 (rvc_nan, rvc_inf):
839 /* NaN / ANY = NaN. */
840 *r = *a;
841 r->sign = sign;
842 return false;
844 case CLASS2 (rvc_inf, rvc_normal):
845 /* Inf / R = Inf. */
846 get_inf (r, sign);
847 return false;
849 case CLASS2 (rvc_normal, rvc_normal):
850 break;
852 default:
853 gcc_unreachable ();
856 if (r == a || r == b)
857 rr = &t;
858 else
859 rr = r;
861 /* Make sure all fields in the result are initialized. */
862 get_zero (rr, 0);
863 rr->cl = rvc_normal;
864 rr->sign = sign;
866 exp = REAL_EXP (a) - REAL_EXP (b) + 1;
867 if (exp > MAX_EXP)
869 get_inf (r, sign);
870 return true;
872 if (exp < -MAX_EXP)
874 get_zero (r, sign);
875 return true;
877 SET_REAL_EXP (rr, exp);
879 inexact = div_significands (rr, a, b);
881 /* Re-normalize the result. */
882 normalize (rr);
883 rr->sig[0] |= inexact;
885 if (rr != r)
886 *r = t;
888 return inexact;
891 /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
892 one of the two operands is a NaN. */
894 static int
895 do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
896 int nan_result)
898 int ret;
900 switch (CLASS2 (a->cl, b->cl))
902 case CLASS2 (rvc_zero, rvc_zero):
903 /* Sign of zero doesn't matter for compares. */
904 return 0;
906 case CLASS2 (rvc_inf, rvc_zero):
907 case CLASS2 (rvc_inf, rvc_normal):
908 case CLASS2 (rvc_normal, rvc_zero):
909 return (a->sign ? -1 : 1);
911 case CLASS2 (rvc_inf, rvc_inf):
912 return -a->sign - -b->sign;
914 case CLASS2 (rvc_zero, rvc_normal):
915 case CLASS2 (rvc_zero, rvc_inf):
916 case CLASS2 (rvc_normal, rvc_inf):
917 return (b->sign ? 1 : -1);
919 case CLASS2 (rvc_zero, rvc_nan):
920 case CLASS2 (rvc_normal, rvc_nan):
921 case CLASS2 (rvc_inf, rvc_nan):
922 case CLASS2 (rvc_nan, rvc_nan):
923 case CLASS2 (rvc_nan, rvc_zero):
924 case CLASS2 (rvc_nan, rvc_normal):
925 case CLASS2 (rvc_nan, rvc_inf):
926 return nan_result;
928 case CLASS2 (rvc_normal, rvc_normal):
929 break;
931 default:
932 gcc_unreachable ();
935 if (a->sign != b->sign)
936 return -a->sign - -b->sign;
938 if (REAL_EXP (a) > REAL_EXP (b))
939 ret = 1;
940 else if (REAL_EXP (a) < REAL_EXP (b))
941 ret = -1;
942 else
943 ret = cmp_significands (a, b);
945 return (a->sign ? -ret : ret);
948 /* Return A truncated to an integral value toward zero. */
950 static void
951 do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
953 *r = *a;
955 switch (r->cl)
957 case rvc_zero:
958 case rvc_inf:
959 case rvc_nan:
960 break;
962 case rvc_normal:
963 if (REAL_EXP (r) <= 0)
964 get_zero (r, r->sign);
965 else if (REAL_EXP (r) < SIGNIFICAND_BITS)
966 clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r));
967 break;
969 default:
970 gcc_unreachable ();
974 /* Perform the binary or unary operation described by CODE.
975 For a unary operation, leave OP1 NULL. This function returns
976 true if the result may be inexact due to loss of precision. */
978 bool
979 real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
980 const REAL_VALUE_TYPE *op1)
982 enum tree_code code = icode;
984 switch (code)
986 case PLUS_EXPR:
987 return do_add (r, op0, op1, 0);
989 case MINUS_EXPR:
990 return do_add (r, op0, op1, 1);
992 case MULT_EXPR:
993 return do_multiply (r, op0, op1);
995 case RDIV_EXPR:
996 return do_divide (r, op0, op1);
998 case MIN_EXPR:
999 if (op1->cl == rvc_nan)
1000 *r = *op1;
1001 else if (do_compare (op0, op1, -1) < 0)
1002 *r = *op0;
1003 else
1004 *r = *op1;
1005 break;
1007 case MAX_EXPR:
1008 if (op1->cl == rvc_nan)
1009 *r = *op1;
1010 else if (do_compare (op0, op1, 1) < 0)
1011 *r = *op1;
1012 else
1013 *r = *op0;
1014 break;
1016 case NEGATE_EXPR:
1017 *r = *op0;
1018 r->sign ^= 1;
1019 break;
1021 case ABS_EXPR:
1022 *r = *op0;
1023 r->sign = 0;
1024 break;
1026 case FIX_TRUNC_EXPR:
1027 do_fix_trunc (r, op0);
1028 break;
1030 default:
1031 gcc_unreachable ();
1033 return false;
1036 /* Legacy. Similar, but return the result directly. */
1038 REAL_VALUE_TYPE
1039 real_arithmetic2 (int icode, const REAL_VALUE_TYPE *op0,
1040 const REAL_VALUE_TYPE *op1)
1042 REAL_VALUE_TYPE r;
1043 real_arithmetic (&r, icode, op0, op1);
1044 return r;
1047 bool
1048 real_compare (int icode, const REAL_VALUE_TYPE *op0,
1049 const REAL_VALUE_TYPE *op1)
1051 enum tree_code code = icode;
1053 switch (code)
1055 case LT_EXPR:
1056 return do_compare (op0, op1, 1) < 0;
1057 case LE_EXPR:
1058 return do_compare (op0, op1, 1) <= 0;
1059 case GT_EXPR:
1060 return do_compare (op0, op1, -1) > 0;
1061 case GE_EXPR:
1062 return do_compare (op0, op1, -1) >= 0;
1063 case EQ_EXPR:
1064 return do_compare (op0, op1, -1) == 0;
1065 case NE_EXPR:
1066 return do_compare (op0, op1, -1) != 0;
1067 case UNORDERED_EXPR:
1068 return op0->cl == rvc_nan || op1->cl == rvc_nan;
1069 case ORDERED_EXPR:
1070 return op0->cl != rvc_nan && op1->cl != rvc_nan;
1071 case UNLT_EXPR:
1072 return do_compare (op0, op1, -1) < 0;
1073 case UNLE_EXPR:
1074 return do_compare (op0, op1, -1) <= 0;
1075 case UNGT_EXPR:
1076 return do_compare (op0, op1, 1) > 0;
1077 case UNGE_EXPR:
1078 return do_compare (op0, op1, 1) >= 0;
1079 case UNEQ_EXPR:
1080 return do_compare (op0, op1, 0) == 0;
1081 case LTGT_EXPR:
1082 return do_compare (op0, op1, 0) != 0;
1084 default:
1085 gcc_unreachable ();
1089 /* Return floor log2(R). */
1092 real_exponent (const REAL_VALUE_TYPE *r)
1094 switch (r->cl)
1096 case rvc_zero:
1097 return 0;
1098 case rvc_inf:
1099 case rvc_nan:
1100 return (unsigned int)-1 >> 1;
1101 case rvc_normal:
1102 return REAL_EXP (r);
1103 default:
1104 gcc_unreachable ();
1108 /* R = OP0 * 2**EXP. */
1110 void
1111 real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
1113 *r = *op0;
1114 switch (r->cl)
1116 case rvc_zero:
1117 case rvc_inf:
1118 case rvc_nan:
1119 break;
1121 case rvc_normal:
1122 exp += REAL_EXP (op0);
1123 if (exp > MAX_EXP)
1124 get_inf (r, r->sign);
1125 else if (exp < -MAX_EXP)
1126 get_zero (r, r->sign);
1127 else
1128 SET_REAL_EXP (r, exp);
1129 break;
1131 default:
1132 gcc_unreachable ();
1136 /* Determine whether a floating-point value X is infinite. */
1138 bool
1139 real_isinf (const REAL_VALUE_TYPE *r)
1141 return (r->cl == rvc_inf);
1144 /* Determine whether a floating-point value X is a NaN. */
1146 bool
1147 real_isnan (const REAL_VALUE_TYPE *r)
1149 return (r->cl == rvc_nan);
1152 /* Determine whether a floating-point value X is negative. */
1154 bool
1155 real_isneg (const REAL_VALUE_TYPE *r)
1157 return r->sign;
1160 /* Determine whether a floating-point value X is minus zero. */
1162 bool
1163 real_isnegzero (const REAL_VALUE_TYPE *r)
1165 return r->sign && r->cl == rvc_zero;
1168 /* Compare two floating-point objects for bitwise identity. */
1170 bool
1171 real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
1173 int i;
1175 if (a->cl != b->cl)
1176 return false;
1177 if (a->sign != b->sign)
1178 return false;
1180 switch (a->cl)
1182 case rvc_zero:
1183 case rvc_inf:
1184 return true;
1186 case rvc_normal:
1187 if (REAL_EXP (a) != REAL_EXP (b))
1188 return false;
1189 break;
1191 case rvc_nan:
1192 if (a->signalling != b->signalling)
1193 return false;
1194 /* The significand is ignored for canonical NaNs. */
1195 if (a->canonical || b->canonical)
1196 return a->canonical == b->canonical;
1197 break;
1199 default:
1200 gcc_unreachable ();
1203 for (i = 0; i < SIGSZ; ++i)
1204 if (a->sig[i] != b->sig[i])
1205 return false;
1207 return true;
1210 /* Try to change R into its exact multiplicative inverse in machine
1211 mode MODE. Return true if successful. */
1213 bool
1214 exact_real_inverse (enum machine_mode mode, REAL_VALUE_TYPE *r)
1216 const REAL_VALUE_TYPE *one = real_digit (1);
1217 REAL_VALUE_TYPE u;
1218 int i;
1220 if (r->cl != rvc_normal)
1221 return false;
1223 /* Check for a power of two: all significand bits zero except the MSB. */
1224 for (i = 0; i < SIGSZ-1; ++i)
1225 if (r->sig[i] != 0)
1226 return false;
1227 if (r->sig[SIGSZ-1] != SIG_MSB)
1228 return false;
1230 /* Find the inverse and truncate to the required mode. */
1231 do_divide (&u, one, r);
1232 real_convert (&u, mode, &u);
1234 /* The rounding may have overflowed. */
1235 if (u.cl != rvc_normal)
1236 return false;
1237 for (i = 0; i < SIGSZ-1; ++i)
1238 if (u.sig[i] != 0)
1239 return false;
1240 if (u.sig[SIGSZ-1] != SIG_MSB)
1241 return false;
1243 *r = u;
1244 return true;
1247 /* Render R as an integer. */
1249 HOST_WIDE_INT
1250 real_to_integer (const REAL_VALUE_TYPE *r)
1252 unsigned HOST_WIDE_INT i;
1254 switch (r->cl)
1256 case rvc_zero:
1257 underflow:
1258 return 0;
1260 case rvc_inf:
1261 case rvc_nan:
1262 overflow:
1263 i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1264 if (!r->sign)
1265 i--;
1266 return i;
1268 case rvc_normal:
1269 if (REAL_EXP (r) <= 0)
1270 goto underflow;
1271 /* Only force overflow for unsigned overflow. Signed overflow is
1272 undefined, so it doesn't matter what we return, and some callers
1273 expect to be able to use this routine for both signed and
1274 unsigned conversions. */
1275 if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT)
1276 goto overflow;
1278 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1279 i = r->sig[SIGSZ-1];
1280 else
1282 gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
1283 i = r->sig[SIGSZ-1];
1284 i = i << (HOST_BITS_PER_LONG - 1) << 1;
1285 i |= r->sig[SIGSZ-2];
1288 i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r);
1290 if (r->sign)
1291 i = -i;
1292 return i;
1294 default:
1295 gcc_unreachable ();
1299 /* Likewise, but to an integer pair, HI+LOW. */
1301 void
1302 real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
1303 const REAL_VALUE_TYPE *r)
1305 REAL_VALUE_TYPE t;
1306 HOST_WIDE_INT low, high;
1307 int exp;
1309 switch (r->cl)
1311 case rvc_zero:
1312 underflow:
1313 low = high = 0;
1314 break;
1316 case rvc_inf:
1317 case rvc_nan:
1318 overflow:
1319 high = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1320 if (r->sign)
1321 low = 0;
1322 else
1324 high--;
1325 low = -1;
1327 break;
1329 case rvc_normal:
1330 exp = REAL_EXP (r);
1331 if (exp <= 0)
1332 goto underflow;
1333 /* Only force overflow for unsigned overflow. Signed overflow is
1334 undefined, so it doesn't matter what we return, and some callers
1335 expect to be able to use this routine for both signed and
1336 unsigned conversions. */
1337 if (exp > 2*HOST_BITS_PER_WIDE_INT)
1338 goto overflow;
1340 rshift_significand (&t, r, 2*HOST_BITS_PER_WIDE_INT - exp);
1341 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1343 high = t.sig[SIGSZ-1];
1344 low = t.sig[SIGSZ-2];
1346 else
1348 gcc_assert (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG);
1349 high = t.sig[SIGSZ-1];
1350 high = high << (HOST_BITS_PER_LONG - 1) << 1;
1351 high |= t.sig[SIGSZ-2];
1353 low = t.sig[SIGSZ-3];
1354 low = low << (HOST_BITS_PER_LONG - 1) << 1;
1355 low |= t.sig[SIGSZ-4];
1358 if (r->sign)
1360 if (low == 0)
1361 high = -high;
1362 else
1363 low = -low, high = ~high;
1365 break;
1367 default:
1368 gcc_unreachable ();
1371 *plow = low;
1372 *phigh = high;
1375 /* A subroutine of real_to_decimal. Compute the quotient and remainder
1376 of NUM / DEN. Return the quotient and place the remainder in NUM.
1377 It is expected that NUM / DEN are close enough that the quotient is
1378 small. */
1380 static unsigned long
1381 rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den)
1383 unsigned long q, msb;
1384 int expn = REAL_EXP (num), expd = REAL_EXP (den);
1386 if (expn < expd)
1387 return 0;
1389 q = msb = 0;
1390 goto start;
1393 msb = num->sig[SIGSZ-1] & SIG_MSB;
1394 q <<= 1;
1395 lshift_significand_1 (num, num);
1396 start:
1397 if (msb || cmp_significands (num, den) >= 0)
1399 sub_significands (num, num, den, 0);
1400 q |= 1;
1403 while (--expn >= expd);
1405 SET_REAL_EXP (num, expd);
1406 normalize (num);
1408 return q;
1411 /* Render R as a decimal floating point constant. Emit DIGITS significant
1412 digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the
1413 maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing
1414 zeros. */
1416 #define M_LOG10_2 0.30102999566398119521
1418 void
1419 real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
1420 size_t digits, int crop_trailing_zeros)
1422 const REAL_VALUE_TYPE *one, *ten;
1423 REAL_VALUE_TYPE r, pten, u, v;
1424 int dec_exp, cmp_one, digit;
1425 size_t max_digits;
1426 char *p, *first, *last;
1427 bool sign;
1429 r = *r_orig;
1430 switch (r.cl)
1432 case rvc_zero:
1433 strcpy (str, (r.sign ? "-0.0" : "0.0"));
1434 return;
1435 case rvc_normal:
1436 break;
1437 case rvc_inf:
1438 strcpy (str, (r.sign ? "-Inf" : "+Inf"));
1439 return;
1440 case rvc_nan:
1441 /* ??? Print the significand as well, if not canonical? */
1442 strcpy (str, (r.sign ? "-NaN" : "+NaN"));
1443 return;
1444 default:
1445 gcc_unreachable ();
1448 /* Bound the number of digits printed by the size of the representation. */
1449 max_digits = SIGNIFICAND_BITS * M_LOG10_2;
1450 if (digits == 0 || digits > max_digits)
1451 digits = max_digits;
1453 /* Estimate the decimal exponent, and compute the length of the string it
1454 will print as. Be conservative and add one to account for possible
1455 overflow or rounding error. */
1456 dec_exp = REAL_EXP (&r) * M_LOG10_2;
1457 for (max_digits = 1; dec_exp ; max_digits++)
1458 dec_exp /= 10;
1460 /* Bound the number of digits printed by the size of the output buffer. */
1461 max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
1462 gcc_assert (max_digits <= buf_size);
1463 if (digits > max_digits)
1464 digits = max_digits;
1466 one = real_digit (1);
1467 ten = ten_to_ptwo (0);
1469 sign = r.sign;
1470 r.sign = 0;
1472 dec_exp = 0;
1473 pten = *one;
1475 cmp_one = do_compare (&r, one, 0);
1476 if (cmp_one > 0)
1478 int m;
1480 /* Number is greater than one. Convert significand to an integer
1481 and strip trailing decimal zeros. */
1483 u = r;
1484 SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1);
1486 /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
1487 m = floor_log2 (max_digits);
1489 /* Iterate over the bits of the possible powers of 10 that might
1490 be present in U and eliminate them. That is, if we find that
1491 10**2**M divides U evenly, keep the division and increase
1492 DEC_EXP by 2**M. */
1495 REAL_VALUE_TYPE t;
1497 do_divide (&t, &u, ten_to_ptwo (m));
1498 do_fix_trunc (&v, &t);
1499 if (cmp_significands (&v, &t) == 0)
1501 u = t;
1502 dec_exp += 1 << m;
1505 while (--m >= 0);
1507 /* Revert the scaling to integer that we performed earlier. */
1508 SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r)
1509 - (SIGNIFICAND_BITS - 1));
1510 r = u;
1512 /* Find power of 10. Do this by dividing out 10**2**M when
1513 this is larger than the current remainder. Fill PTEN with
1514 the power of 10 that we compute. */
1515 if (REAL_EXP (&r) > 0)
1517 m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1;
1520 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1521 if (do_compare (&u, ptentwo, 0) >= 0)
1523 do_divide (&u, &u, ptentwo);
1524 do_multiply (&pten, &pten, ptentwo);
1525 dec_exp += 1 << m;
1528 while (--m >= 0);
1530 else
1531 /* We managed to divide off enough tens in the above reduction
1532 loop that we've now got a negative exponent. Fall into the
1533 less-than-one code to compute the proper value for PTEN. */
1534 cmp_one = -1;
1536 if (cmp_one < 0)
1538 int m;
1540 /* Number is less than one. Pad significand with leading
1541 decimal zeros. */
1543 v = r;
1544 while (1)
1546 /* Stop if we'd shift bits off the bottom. */
1547 if (v.sig[0] & 7)
1548 break;
1550 do_multiply (&u, &v, ten);
1552 /* Stop if we're now >= 1. */
1553 if (REAL_EXP (&u) > 0)
1554 break;
1556 v = u;
1557 dec_exp -= 1;
1559 r = v;
1561 /* Find power of 10. Do this by multiplying in P=10**2**M when
1562 the current remainder is smaller than 1/P. Fill PTEN with the
1563 power of 10 that we compute. */
1564 m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1;
1567 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1568 const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
1570 if (do_compare (&v, ptenmtwo, 0) <= 0)
1572 do_multiply (&v, &v, ptentwo);
1573 do_multiply (&pten, &pten, ptentwo);
1574 dec_exp -= 1 << m;
1577 while (--m >= 0);
1579 /* Invert the positive power of 10 that we've collected so far. */
1580 do_divide (&pten, one, &pten);
1583 p = str;
1584 if (sign)
1585 *p++ = '-';
1586 first = p++;
1588 /* At this point, PTEN should contain the nearest power of 10 smaller
1589 than R, such that this division produces the first digit.
1591 Using a divide-step primitive that returns the complete integral
1592 remainder avoids the rounding error that would be produced if
1593 we were to use do_divide here and then simply multiply by 10 for
1594 each subsequent digit. */
1596 digit = rtd_divmod (&r, &pten);
1598 /* Be prepared for error in that division via underflow ... */
1599 if (digit == 0 && cmp_significand_0 (&r))
1601 /* Multiply by 10 and try again. */
1602 do_multiply (&r, &r, ten);
1603 digit = rtd_divmod (&r, &pten);
1604 dec_exp -= 1;
1605 gcc_assert (digit != 0);
1608 /* ... or overflow. */
1609 if (digit == 10)
1611 *p++ = '1';
1612 if (--digits > 0)
1613 *p++ = '0';
1614 dec_exp += 1;
1616 else
1618 gcc_assert (digit <= 10);
1619 *p++ = digit + '0';
1622 /* Generate subsequent digits. */
1623 while (--digits > 0)
1625 do_multiply (&r, &r, ten);
1626 digit = rtd_divmod (&r, &pten);
1627 *p++ = digit + '0';
1629 last = p;
1631 /* Generate one more digit with which to do rounding. */
1632 do_multiply (&r, &r, ten);
1633 digit = rtd_divmod (&r, &pten);
1635 /* Round the result. */
1636 if (digit == 5)
1638 /* Round to nearest. If R is nonzero there are additional
1639 nonzero digits to be extracted. */
1640 if (cmp_significand_0 (&r))
1641 digit++;
1642 /* Round to even. */
1643 else if ((p[-1] - '0') & 1)
1644 digit++;
1646 if (digit > 5)
1648 while (p > first)
1650 digit = *--p;
1651 if (digit == '9')
1652 *p = '0';
1653 else
1655 *p = digit + 1;
1656 break;
1660 /* Carry out of the first digit. This means we had all 9's and
1661 now have all 0's. "Prepend" a 1 by overwriting the first 0. */
1662 if (p == first)
1664 first[1] = '1';
1665 dec_exp++;
1669 /* Insert the decimal point. */
1670 first[0] = first[1];
1671 first[1] = '.';
1673 /* If requested, drop trailing zeros. Never crop past "1.0". */
1674 if (crop_trailing_zeros)
1675 while (last > first + 3 && last[-1] == '0')
1676 last--;
1678 /* Append the exponent. */
1679 sprintf (last, "e%+d", dec_exp);
1682 /* Render R as a hexadecimal floating point constant. Emit DIGITS
1683 significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0,
1684 choose the maximum for the representation. If CROP_TRAILING_ZEROS,
1685 strip trailing zeros. */
1687 void
1688 real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
1689 size_t digits, int crop_trailing_zeros)
1691 int i, j, exp = REAL_EXP (r);
1692 char *p, *first;
1693 char exp_buf[16];
1694 size_t max_digits;
1696 switch (r->cl)
1698 case rvc_zero:
1699 exp = 0;
1700 break;
1701 case rvc_normal:
1702 break;
1703 case rvc_inf:
1704 strcpy (str, (r->sign ? "-Inf" : "+Inf"));
1705 return;
1706 case rvc_nan:
1707 /* ??? Print the significand as well, if not canonical? */
1708 strcpy (str, (r->sign ? "-NaN" : "+NaN"));
1709 return;
1710 default:
1711 gcc_unreachable ();
1714 if (digits == 0)
1715 digits = SIGNIFICAND_BITS / 4;
1717 /* Bound the number of digits printed by the size of the output buffer. */
1719 sprintf (exp_buf, "p%+d", exp);
1720 max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
1721 gcc_assert (max_digits <= buf_size);
1722 if (digits > max_digits)
1723 digits = max_digits;
1725 p = str;
1726 if (r->sign)
1727 *p++ = '-';
1728 *p++ = '0';
1729 *p++ = 'x';
1730 *p++ = '0';
1731 *p++ = '.';
1732 first = p;
1734 for (i = SIGSZ - 1; i >= 0; --i)
1735 for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
1737 *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
1738 if (--digits == 0)
1739 goto out;
1742 out:
1743 if (crop_trailing_zeros)
1744 while (p > first + 1 && p[-1] == '0')
1745 p--;
1747 sprintf (p, "p%+d", exp);
1750 /* Initialize R from a decimal or hexadecimal string. The string is
1751 assumed to have been syntax checked already. */
1753 void
1754 real_from_string (REAL_VALUE_TYPE *r, const char *str)
1756 int exp = 0;
1757 bool sign = false;
1759 get_zero (r, 0);
1761 if (*str == '-')
1763 sign = true;
1764 str++;
1766 else if (*str == '+')
1767 str++;
1769 if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1771 /* Hexadecimal floating point. */
1772 int pos = SIGNIFICAND_BITS - 4, d;
1774 str += 2;
1776 while (*str == '0')
1777 str++;
1778 while (1)
1780 d = hex_value (*str);
1781 if (d == _hex_bad)
1782 break;
1783 if (pos >= 0)
1785 r->sig[pos / HOST_BITS_PER_LONG]
1786 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1787 pos -= 4;
1789 exp += 4;
1790 str++;
1792 if (*str == '.')
1794 str++;
1795 if (pos == SIGNIFICAND_BITS - 4)
1797 while (*str == '0')
1798 str++, exp -= 4;
1800 while (1)
1802 d = hex_value (*str);
1803 if (d == _hex_bad)
1804 break;
1805 if (pos >= 0)
1807 r->sig[pos / HOST_BITS_PER_LONG]
1808 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1809 pos -= 4;
1811 str++;
1814 if (*str == 'p' || *str == 'P')
1816 bool exp_neg = false;
1818 str++;
1819 if (*str == '-')
1821 exp_neg = true;
1822 str++;
1824 else if (*str == '+')
1825 str++;
1827 d = 0;
1828 while (ISDIGIT (*str))
1830 d *= 10;
1831 d += *str - '0';
1832 if (d > MAX_EXP)
1834 /* Overflowed the exponent. */
1835 if (exp_neg)
1836 goto underflow;
1837 else
1838 goto overflow;
1840 str++;
1842 if (exp_neg)
1843 d = -d;
1845 exp += d;
1848 r->cl = rvc_normal;
1849 SET_REAL_EXP (r, exp);
1851 normalize (r);
1853 else
1855 /* Decimal floating point. */
1856 const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
1857 int d;
1859 while (*str == '0')
1860 str++;
1861 while (ISDIGIT (*str))
1863 d = *str++ - '0';
1864 do_multiply (r, r, ten);
1865 if (d)
1866 do_add (r, r, real_digit (d), 0);
1868 if (*str == '.')
1870 str++;
1871 if (r->cl == rvc_zero)
1873 while (*str == '0')
1874 str++, exp--;
1876 while (ISDIGIT (*str))
1878 d = *str++ - '0';
1879 do_multiply (r, r, ten);
1880 if (d)
1881 do_add (r, r, real_digit (d), 0);
1882 exp--;
1886 if (*str == 'e' || *str == 'E')
1888 bool exp_neg = false;
1890 str++;
1891 if (*str == '-')
1893 exp_neg = true;
1894 str++;
1896 else if (*str == '+')
1897 str++;
1899 d = 0;
1900 while (ISDIGIT (*str))
1902 d *= 10;
1903 d += *str - '0';
1904 if (d > MAX_EXP)
1906 /* Overflowed the exponent. */
1907 if (exp_neg)
1908 goto underflow;
1909 else
1910 goto overflow;
1912 str++;
1914 if (exp_neg)
1915 d = -d;
1916 exp += d;
1919 if (exp)
1920 times_pten (r, exp);
1923 r->sign = sign;
1924 return;
1926 underflow:
1927 get_zero (r, sign);
1928 return;
1930 overflow:
1931 get_inf (r, sign);
1932 return;
1935 /* Legacy. Similar, but return the result directly. */
1937 REAL_VALUE_TYPE
1938 real_from_string2 (const char *s, enum machine_mode mode)
1940 REAL_VALUE_TYPE r;
1942 real_from_string (&r, s);
1943 if (mode != VOIDmode)
1944 real_convert (&r, mode, &r);
1946 return r;
1949 /* Initialize R from the integer pair HIGH+LOW. */
1951 void
1952 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
1953 unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
1954 int unsigned_p)
1956 if (low == 0 && high == 0)
1957 get_zero (r, 0);
1958 else
1960 r->cl = rvc_normal;
1961 r->sign = high < 0 && !unsigned_p;
1962 SET_REAL_EXP (r, 2 * HOST_BITS_PER_WIDE_INT);
1964 if (r->sign)
1966 high = ~high;
1967 if (low == 0)
1968 high += 1;
1969 else
1970 low = -low;
1973 if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
1975 r->sig[SIGSZ-1] = high;
1976 r->sig[SIGSZ-2] = low;
1977 memset (r->sig, 0, sizeof(long)*(SIGSZ-2));
1979 else
1981 gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
1982 r->sig[SIGSZ-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
1983 r->sig[SIGSZ-2] = high;
1984 r->sig[SIGSZ-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
1985 r->sig[SIGSZ-4] = low;
1986 if (SIGSZ > 4)
1987 memset (r->sig, 0, sizeof(long)*(SIGSZ-4));
1990 normalize (r);
1993 if (mode != VOIDmode)
1994 real_convert (r, mode, r);
1997 /* Returns 10**2**N. */
1999 static const REAL_VALUE_TYPE *
2000 ten_to_ptwo (int n)
2002 static REAL_VALUE_TYPE tens[EXP_BITS];
2004 gcc_assert (n >= 0);
2005 gcc_assert (n < EXP_BITS);
2007 if (tens[n].cl == rvc_zero)
2009 if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2011 HOST_WIDE_INT t = 10;
2012 int i;
2014 for (i = 0; i < n; ++i)
2015 t *= t;
2017 real_from_integer (&tens[n], VOIDmode, t, 0, 1);
2019 else
2021 const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2022 do_multiply (&tens[n], t, t);
2026 return &tens[n];
2029 /* Returns 10**(-2**N). */
2031 static const REAL_VALUE_TYPE *
2032 ten_to_mptwo (int n)
2034 static REAL_VALUE_TYPE tens[EXP_BITS];
2036 gcc_assert (n >= 0);
2037 gcc_assert (n < EXP_BITS);
2039 if (tens[n].cl == rvc_zero)
2040 do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2042 return &tens[n];
2045 /* Returns N. */
2047 static const REAL_VALUE_TYPE *
2048 real_digit (int n)
2050 static REAL_VALUE_TYPE num[10];
2052 gcc_assert (n >= 0);
2053 gcc_assert (n <= 9);
2055 if (n > 0 && num[n].cl == rvc_zero)
2056 real_from_integer (&num[n], VOIDmode, n, 0, 1);
2058 return &num[n];
2061 /* Multiply R by 10**EXP. */
2063 static void
2064 times_pten (REAL_VALUE_TYPE *r, int exp)
2066 REAL_VALUE_TYPE pten, *rr;
2067 bool negative = (exp < 0);
2068 int i;
2070 if (negative)
2072 exp = -exp;
2073 pten = *real_digit (1);
2074 rr = &pten;
2076 else
2077 rr = r;
2079 for (i = 0; exp > 0; ++i, exp >>= 1)
2080 if (exp & 1)
2081 do_multiply (rr, rr, ten_to_ptwo (i));
2083 if (negative)
2084 do_divide (r, r, &pten);
2087 /* Fills R with +Inf. */
2089 void
2090 real_inf (REAL_VALUE_TYPE *r)
2092 get_inf (r, 0);
2095 /* Fills R with a NaN whose significand is described by STR. If QUIET,
2096 we force a QNaN, else we force an SNaN. The string, if not empty,
2097 is parsed as a number and placed in the significand. Return true
2098 if the string was successfully parsed. */
2100 bool
2101 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2102 enum machine_mode mode)
2104 const struct real_format *fmt;
2106 fmt = REAL_MODE_FORMAT (mode);
2107 gcc_assert (fmt);
2109 if (*str == 0)
2111 if (quiet)
2112 get_canonical_qnan (r, 0);
2113 else
2114 get_canonical_snan (r, 0);
2116 else
2118 int base = 10, d;
2119 bool neg = false;
2121 memset (r, 0, sizeof (*r));
2122 r->cl = rvc_nan;
2124 /* Parse akin to strtol into the significand of R. */
2126 while (ISSPACE (*str))
2127 str++;
2128 if (*str == '-')
2129 str++, neg = true;
2130 else if (*str == '+')
2131 str++;
2132 if (*str == '0')
2134 if (*++str == 'x')
2135 str++, base = 16;
2136 else
2137 base = 8;
2140 while ((d = hex_value (*str)) < base)
2142 REAL_VALUE_TYPE u;
2144 switch (base)
2146 case 8:
2147 lshift_significand (r, r, 3);
2148 break;
2149 case 16:
2150 lshift_significand (r, r, 4);
2151 break;
2152 case 10:
2153 lshift_significand_1 (&u, r);
2154 lshift_significand (r, r, 3);
2155 add_significands (r, r, &u);
2156 break;
2157 default:
2158 gcc_unreachable ();
2161 get_zero (&u, 0);
2162 u.sig[0] = d;
2163 add_significands (r, r, &u);
2165 str++;
2168 /* Must have consumed the entire string for success. */
2169 if (*str != 0)
2170 return false;
2172 /* Shift the significand into place such that the bits
2173 are in the most significant bits for the format. */
2174 lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
2176 /* Our MSB is always unset for NaNs. */
2177 r->sig[SIGSZ-1] &= ~SIG_MSB;
2179 /* Force quiet or signalling NaN. */
2180 r->signalling = !quiet;
2183 return true;
2186 /* Fills R with the largest finite value representable in mode MODE.
2187 If SIGN is nonzero, R is set to the most negative finite value. */
2189 void
2190 real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
2192 const struct real_format *fmt;
2193 int np2;
2195 fmt = REAL_MODE_FORMAT (mode);
2196 gcc_assert (fmt);
2198 r->cl = rvc_normal;
2199 r->sign = sign;
2200 r->signalling = 0;
2201 r->canonical = 0;
2202 SET_REAL_EXP (r, fmt->emax * fmt->log2_b);
2204 np2 = SIGNIFICAND_BITS - fmt->p * fmt->log2_b;
2205 memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
2206 clear_significand_below (r, np2);
2209 /* Fills R with 2**N. */
2211 void
2212 real_2expN (REAL_VALUE_TYPE *r, int n)
2214 memset (r, 0, sizeof (*r));
2216 n++;
2217 if (n > MAX_EXP)
2218 r->cl = rvc_inf;
2219 else if (n < -MAX_EXP)
2221 else
2223 r->cl = rvc_normal;
2224 SET_REAL_EXP (r, n);
2225 r->sig[SIGSZ-1] = SIG_MSB;
2230 static void
2231 round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
2233 int p2, np2, i, w;
2234 unsigned long sticky;
2235 bool guard, lsb;
2236 int emin2m1, emax2;
2238 p2 = fmt->p * fmt->log2_b;
2239 emin2m1 = (fmt->emin - 1) * fmt->log2_b;
2240 emax2 = fmt->emax * fmt->log2_b;
2242 np2 = SIGNIFICAND_BITS - p2;
2243 switch (r->cl)
2245 underflow:
2246 get_zero (r, r->sign);
2247 case rvc_zero:
2248 if (!fmt->has_signed_zero)
2249 r->sign = 0;
2250 return;
2252 overflow:
2253 get_inf (r, r->sign);
2254 case rvc_inf:
2255 return;
2257 case rvc_nan:
2258 clear_significand_below (r, np2);
2259 return;
2261 case rvc_normal:
2262 break;
2264 default:
2265 gcc_unreachable ();
2268 /* If we're not base2, normalize the exponent to a multiple of
2269 the true base. */
2270 if (fmt->log2_b != 1)
2272 int shift = REAL_EXP (r) & (fmt->log2_b - 1);
2273 if (shift)
2275 shift = fmt->log2_b - shift;
2276 r->sig[0] |= sticky_rshift_significand (r, r, shift);
2277 SET_REAL_EXP (r, REAL_EXP (r) + shift);
2281 /* Check the range of the exponent. If we're out of range,
2282 either underflow or overflow. */
2283 if (REAL_EXP (r) > emax2)
2284 goto overflow;
2285 else if (REAL_EXP (r) <= emin2m1)
2287 int diff;
2289 if (!fmt->has_denorm)
2291 /* Don't underflow completely until we've had a chance to round. */
2292 if (REAL_EXP (r) < emin2m1)
2293 goto underflow;
2295 else
2297 diff = emin2m1 - REAL_EXP (r) + 1;
2298 if (diff > p2)
2299 goto underflow;
2301 /* De-normalize the significand. */
2302 r->sig[0] |= sticky_rshift_significand (r, r, diff);
2303 SET_REAL_EXP (r, REAL_EXP (r) + diff);
2307 /* There are P2 true significand bits, followed by one guard bit,
2308 followed by one sticky bit, followed by stuff. Fold nonzero
2309 stuff into the sticky bit. */
2311 sticky = 0;
2312 for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2313 sticky |= r->sig[i];
2314 sticky |=
2315 r->sig[w] & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2317 guard = test_significand_bit (r, np2 - 1);
2318 lsb = test_significand_bit (r, np2);
2320 /* Round to even. */
2321 if (guard && (sticky || lsb))
2323 REAL_VALUE_TYPE u;
2324 get_zero (&u, 0);
2325 set_significand_bit (&u, np2);
2327 if (add_significands (r, r, &u))
2329 /* Overflow. Means the significand had been all ones, and
2330 is now all zeros. Need to increase the exponent, and
2331 possibly re-normalize it. */
2332 SET_REAL_EXP (r, REAL_EXP (r) + 1);
2333 if (REAL_EXP (r) > emax2)
2334 goto overflow;
2335 r->sig[SIGSZ-1] = SIG_MSB;
2337 if (fmt->log2_b != 1)
2339 int shift = REAL_EXP (r) & (fmt->log2_b - 1);
2340 if (shift)
2342 shift = fmt->log2_b - shift;
2343 rshift_significand (r, r, shift);
2344 SET_REAL_EXP (r, REAL_EXP (r) + shift);
2345 if (REAL_EXP (r) > emax2)
2346 goto overflow;
2352 /* Catch underflow that we deferred until after rounding. */
2353 if (REAL_EXP (r) <= emin2m1)
2354 goto underflow;
2356 /* Clear out trailing garbage. */
2357 clear_significand_below (r, np2);
2360 /* Extend or truncate to a new mode. */
2362 void
2363 real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
2364 const REAL_VALUE_TYPE *a)
2366 const struct real_format *fmt;
2368 fmt = REAL_MODE_FORMAT (mode);
2369 gcc_assert (fmt);
2371 *r = *a;
2372 round_for_format (fmt, r);
2374 /* round_for_format de-normalizes denormals. Undo just that part. */
2375 if (r->cl == rvc_normal)
2376 normalize (r);
2379 /* Legacy. Likewise, except return the struct directly. */
2381 REAL_VALUE_TYPE
2382 real_value_truncate (enum machine_mode mode, REAL_VALUE_TYPE a)
2384 REAL_VALUE_TYPE r;
2385 real_convert (&r, mode, &a);
2386 return r;
2389 /* Return true if truncating to MODE is exact. */
2391 bool
2392 exact_real_truncate (enum machine_mode mode, const REAL_VALUE_TYPE *a)
2394 REAL_VALUE_TYPE t;
2395 real_convert (&t, mode, a);
2396 return real_identical (&t, a);
2399 /* Write R to the given target format. Place the words of the result
2400 in target word order in BUF. There are always 32 bits in each
2401 long, no matter the size of the host long.
2403 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2405 long
2406 real_to_target_fmt (long *buf, const REAL_VALUE_TYPE *r_orig,
2407 const struct real_format *fmt)
2409 REAL_VALUE_TYPE r;
2410 long buf1;
2412 r = *r_orig;
2413 round_for_format (fmt, &r);
2415 if (!buf)
2416 buf = &buf1;
2417 (*fmt->encode) (fmt, buf, &r);
2419 return *buf;
2422 /* Similar, but look up the format from MODE. */
2424 long
2425 real_to_target (long *buf, const REAL_VALUE_TYPE *r, enum machine_mode mode)
2427 const struct real_format *fmt;
2429 fmt = REAL_MODE_FORMAT (mode);
2430 gcc_assert (fmt);
2432 return real_to_target_fmt (buf, r, fmt);
2435 /* Read R from the given target format. Read the words of the result
2436 in target word order in BUF. There are always 32 bits in each
2437 long, no matter the size of the host long. */
2439 void
2440 real_from_target_fmt (REAL_VALUE_TYPE *r, const long *buf,
2441 const struct real_format *fmt)
2443 (*fmt->decode) (fmt, r, buf);
2446 /* Similar, but look up the format from MODE. */
2448 void
2449 real_from_target (REAL_VALUE_TYPE *r, const long *buf, enum machine_mode mode)
2451 const struct real_format *fmt;
2453 fmt = REAL_MODE_FORMAT (mode);
2454 gcc_assert (fmt);
2456 (*fmt->decode) (fmt, r, buf);
2459 /* Return the number of bits in the significand for MODE. */
2460 /* ??? Legacy. Should get access to real_format directly. */
2463 significand_size (enum machine_mode mode)
2465 const struct real_format *fmt;
2467 fmt = REAL_MODE_FORMAT (mode);
2468 if (fmt == NULL)
2469 return 0;
2471 return fmt->p * fmt->log2_b;
2474 /* Return a hash value for the given real value. */
2475 /* ??? The "unsigned int" return value is intended to be hashval_t,
2476 but I didn't want to pull hashtab.h into real.h. */
2478 unsigned int
2479 real_hash (const REAL_VALUE_TYPE *r)
2481 unsigned int h;
2482 size_t i;
2484 h = r->cl | (r->sign << 2);
2485 switch (r->cl)
2487 case rvc_zero:
2488 case rvc_inf:
2489 return h;
2491 case rvc_normal:
2492 h |= REAL_EXP (r) << 3;
2493 break;
2495 case rvc_nan:
2496 if (r->signalling)
2497 h ^= (unsigned int)-1;
2498 if (r->canonical)
2499 return h;
2500 break;
2502 default:
2503 gcc_unreachable ();
2506 if (sizeof(unsigned long) > sizeof(unsigned int))
2507 for (i = 0; i < SIGSZ; ++i)
2509 unsigned long s = r->sig[i];
2510 h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2512 else
2513 for (i = 0; i < SIGSZ; ++i)
2514 h ^= r->sig[i];
2516 return h;
2519 /* IEEE single-precision format. */
2521 static void encode_ieee_single (const struct real_format *fmt,
2522 long *, const REAL_VALUE_TYPE *);
2523 static void decode_ieee_single (const struct real_format *,
2524 REAL_VALUE_TYPE *, const long *);
2526 static void
2527 encode_ieee_single (const struct real_format *fmt, long *buf,
2528 const REAL_VALUE_TYPE *r)
2530 unsigned long image, sig, exp;
2531 unsigned long sign = r->sign;
2532 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2534 image = sign << 31;
2535 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2537 switch (r->cl)
2539 case rvc_zero:
2540 break;
2542 case rvc_inf:
2543 if (fmt->has_inf)
2544 image |= 255 << 23;
2545 else
2546 image |= 0x7fffffff;
2547 break;
2549 case rvc_nan:
2550 if (fmt->has_nans)
2552 if (r->canonical)
2553 sig = 0;
2554 if (r->signalling == fmt->qnan_msb_set)
2555 sig &= ~(1 << 22);
2556 else
2557 sig |= 1 << 22;
2558 /* We overload qnan_msb_set here: it's only clear for
2559 mips_ieee_single, which wants all mantissa bits but the
2560 quiet/signalling one set in canonical NaNs (at least
2561 Quiet ones). */
2562 if (r->canonical && !fmt->qnan_msb_set)
2563 sig |= (1 << 22) - 1;
2564 else if (sig == 0)
2565 sig = 1 << 21;
2567 image |= 255 << 23;
2568 image |= sig;
2570 else
2571 image |= 0x7fffffff;
2572 break;
2574 case rvc_normal:
2575 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2576 whereas the intermediate representation is 0.F x 2**exp.
2577 Which means we're off by one. */
2578 if (denormal)
2579 exp = 0;
2580 else
2581 exp = REAL_EXP (r) + 127 - 1;
2582 image |= exp << 23;
2583 image |= sig;
2584 break;
2586 default:
2587 gcc_unreachable ();
2590 buf[0] = image;
2593 static void
2594 decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2595 const long *buf)
2597 unsigned long image = buf[0] & 0xffffffff;
2598 bool sign = (image >> 31) & 1;
2599 int exp = (image >> 23) & 0xff;
2601 memset (r, 0, sizeof (*r));
2602 image <<= HOST_BITS_PER_LONG - 24;
2603 image &= ~SIG_MSB;
2605 if (exp == 0)
2607 if (image && fmt->has_denorm)
2609 r->cl = rvc_normal;
2610 r->sign = sign;
2611 SET_REAL_EXP (r, -126);
2612 r->sig[SIGSZ-1] = image << 1;
2613 normalize (r);
2615 else if (fmt->has_signed_zero)
2616 r->sign = sign;
2618 else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
2620 if (image)
2622 r->cl = rvc_nan;
2623 r->sign = sign;
2624 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
2625 ^ fmt->qnan_msb_set);
2626 r->sig[SIGSZ-1] = image;
2628 else
2630 r->cl = rvc_inf;
2631 r->sign = sign;
2634 else
2636 r->cl = rvc_normal;
2637 r->sign = sign;
2638 SET_REAL_EXP (r, exp - 127 + 1);
2639 r->sig[SIGSZ-1] = image | SIG_MSB;
2643 const struct real_format ieee_single_format =
2645 encode_ieee_single,
2646 decode_ieee_single,
2651 -125,
2652 128,
2654 true,
2655 true,
2656 true,
2657 true,
2658 true
2661 const struct real_format mips_single_format =
2663 encode_ieee_single,
2664 decode_ieee_single,
2669 -125,
2670 128,
2672 true,
2673 true,
2674 true,
2675 true,
2676 false
2680 /* IEEE double-precision format. */
2682 static void encode_ieee_double (const struct real_format *fmt,
2683 long *, const REAL_VALUE_TYPE *);
2684 static void decode_ieee_double (const struct real_format *,
2685 REAL_VALUE_TYPE *, const long *);
2687 static void
2688 encode_ieee_double (const struct real_format *fmt, long *buf,
2689 const REAL_VALUE_TYPE *r)
2691 unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
2692 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2694 image_hi = r->sign << 31;
2695 image_lo = 0;
2697 if (HOST_BITS_PER_LONG == 64)
2699 sig_hi = r->sig[SIGSZ-1];
2700 sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
2701 sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
2703 else
2705 sig_hi = r->sig[SIGSZ-1];
2706 sig_lo = r->sig[SIGSZ-2];
2707 sig_lo = (sig_hi << 21) | (sig_lo >> 11);
2708 sig_hi = (sig_hi >> 11) & 0xfffff;
2711 switch (r->cl)
2713 case rvc_zero:
2714 break;
2716 case rvc_inf:
2717 if (fmt->has_inf)
2718 image_hi |= 2047 << 20;
2719 else
2721 image_hi |= 0x7fffffff;
2722 image_lo = 0xffffffff;
2724 break;
2726 case rvc_nan:
2727 if (fmt->has_nans)
2729 if (r->canonical)
2730 sig_hi = sig_lo = 0;
2731 if (r->signalling == fmt->qnan_msb_set)
2732 sig_hi &= ~(1 << 19);
2733 else
2734 sig_hi |= 1 << 19;
2735 /* We overload qnan_msb_set here: it's only clear for
2736 mips_ieee_single, which wants all mantissa bits but the
2737 quiet/signalling one set in canonical NaNs (at least
2738 Quiet ones). */
2739 if (r->canonical && !fmt->qnan_msb_set)
2741 sig_hi |= (1 << 19) - 1;
2742 sig_lo = 0xffffffff;
2744 else if (sig_hi == 0 && sig_lo == 0)
2745 sig_hi = 1 << 18;
2747 image_hi |= 2047 << 20;
2748 image_hi |= sig_hi;
2749 image_lo = sig_lo;
2751 else
2753 image_hi |= 0x7fffffff;
2754 image_lo = 0xffffffff;
2756 break;
2758 case rvc_normal:
2759 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2760 whereas the intermediate representation is 0.F x 2**exp.
2761 Which means we're off by one. */
2762 if (denormal)
2763 exp = 0;
2764 else
2765 exp = REAL_EXP (r) + 1023 - 1;
2766 image_hi |= exp << 20;
2767 image_hi |= sig_hi;
2768 image_lo = sig_lo;
2769 break;
2771 default:
2772 gcc_unreachable ();
2775 if (FLOAT_WORDS_BIG_ENDIAN)
2776 buf[0] = image_hi, buf[1] = image_lo;
2777 else
2778 buf[0] = image_lo, buf[1] = image_hi;
2781 static void
2782 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2783 const long *buf)
2785 unsigned long image_hi, image_lo;
2786 bool sign;
2787 int exp;
2789 if (FLOAT_WORDS_BIG_ENDIAN)
2790 image_hi = buf[0], image_lo = buf[1];
2791 else
2792 image_lo = buf[0], image_hi = buf[1];
2793 image_lo &= 0xffffffff;
2794 image_hi &= 0xffffffff;
2796 sign = (image_hi >> 31) & 1;
2797 exp = (image_hi >> 20) & 0x7ff;
2799 memset (r, 0, sizeof (*r));
2801 image_hi <<= 32 - 21;
2802 image_hi |= image_lo >> 21;
2803 image_hi &= 0x7fffffff;
2804 image_lo <<= 32 - 21;
2806 if (exp == 0)
2808 if ((image_hi || image_lo) && fmt->has_denorm)
2810 r->cl = rvc_normal;
2811 r->sign = sign;
2812 SET_REAL_EXP (r, -1022);
2813 if (HOST_BITS_PER_LONG == 32)
2815 image_hi = (image_hi << 1) | (image_lo >> 31);
2816 image_lo <<= 1;
2817 r->sig[SIGSZ-1] = image_hi;
2818 r->sig[SIGSZ-2] = image_lo;
2820 else
2822 image_hi = (image_hi << 31 << 2) | (image_lo << 1);
2823 r->sig[SIGSZ-1] = image_hi;
2825 normalize (r);
2827 else if (fmt->has_signed_zero)
2828 r->sign = sign;
2830 else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
2832 if (image_hi || image_lo)
2834 r->cl = rvc_nan;
2835 r->sign = sign;
2836 r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
2837 if (HOST_BITS_PER_LONG == 32)
2839 r->sig[SIGSZ-1] = image_hi;
2840 r->sig[SIGSZ-2] = image_lo;
2842 else
2843 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
2845 else
2847 r->cl = rvc_inf;
2848 r->sign = sign;
2851 else
2853 r->cl = rvc_normal;
2854 r->sign = sign;
2855 SET_REAL_EXP (r, exp - 1023 + 1);
2856 if (HOST_BITS_PER_LONG == 32)
2858 r->sig[SIGSZ-1] = image_hi | SIG_MSB;
2859 r->sig[SIGSZ-2] = image_lo;
2861 else
2862 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
2866 const struct real_format ieee_double_format =
2868 encode_ieee_double,
2869 decode_ieee_double,
2874 -1021,
2875 1024,
2877 true,
2878 true,
2879 true,
2880 true,
2881 true
2884 const struct real_format mips_double_format =
2886 encode_ieee_double,
2887 decode_ieee_double,
2892 -1021,
2893 1024,
2895 true,
2896 true,
2897 true,
2898 true,
2899 false
2903 /* IEEE extended real format. This comes in three flavors: Intel's as
2904 a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
2905 12- and 16-byte images may be big- or little endian; Motorola's is
2906 always big endian. */
2908 /* Helper subroutine which converts from the internal format to the
2909 12-byte little-endian Intel format. Functions below adjust this
2910 for the other possible formats. */
2911 static void
2912 encode_ieee_extended (const struct real_format *fmt, long *buf,
2913 const REAL_VALUE_TYPE *r)
2915 unsigned long image_hi, sig_hi, sig_lo;
2916 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2918 image_hi = r->sign << 15;
2919 sig_hi = sig_lo = 0;
2921 switch (r->cl)
2923 case rvc_zero:
2924 break;
2926 case rvc_inf:
2927 if (fmt->has_inf)
2929 image_hi |= 32767;
2931 /* Intel requires the explicit integer bit to be set, otherwise
2932 it considers the value a "pseudo-infinity". Motorola docs
2933 say it doesn't care. */
2934 sig_hi = 0x80000000;
2936 else
2938 image_hi |= 32767;
2939 sig_lo = sig_hi = 0xffffffff;
2941 break;
2943 case rvc_nan:
2944 if (fmt->has_nans)
2946 image_hi |= 32767;
2947 if (HOST_BITS_PER_LONG == 32)
2949 sig_hi = r->sig[SIGSZ-1];
2950 sig_lo = r->sig[SIGSZ-2];
2952 else
2954 sig_lo = r->sig[SIGSZ-1];
2955 sig_hi = sig_lo >> 31 >> 1;
2956 sig_lo &= 0xffffffff;
2958 if (r->signalling == fmt->qnan_msb_set)
2959 sig_hi &= ~(1 << 30);
2960 else
2961 sig_hi |= 1 << 30;
2962 if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
2963 sig_hi = 1 << 29;
2965 /* Intel requires the explicit integer bit to be set, otherwise
2966 it considers the value a "pseudo-nan". Motorola docs say it
2967 doesn't care. */
2968 sig_hi |= 0x80000000;
2970 else
2972 image_hi |= 32767;
2973 sig_lo = sig_hi = 0xffffffff;
2975 break;
2977 case rvc_normal:
2979 int exp = REAL_EXP (r);
2981 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2982 whereas the intermediate representation is 0.F x 2**exp.
2983 Which means we're off by one.
2985 Except for Motorola, which consider exp=0 and explicit
2986 integer bit set to continue to be normalized. In theory
2987 this discrepancy has been taken care of by the difference
2988 in fmt->emin in round_for_format. */
2990 if (denormal)
2991 exp = 0;
2992 else
2994 exp += 16383 - 1;
2995 gcc_assert (exp >= 0);
2997 image_hi |= exp;
2999 if (HOST_BITS_PER_LONG == 32)
3001 sig_hi = r->sig[SIGSZ-1];
3002 sig_lo = r->sig[SIGSZ-2];
3004 else
3006 sig_lo = r->sig[SIGSZ-1];
3007 sig_hi = sig_lo >> 31 >> 1;
3008 sig_lo &= 0xffffffff;
3011 break;
3013 default:
3014 gcc_unreachable ();
3017 buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3020 /* Convert from the internal format to the 12-byte Motorola format
3021 for an IEEE extended real. */
3022 static void
3023 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3024 const REAL_VALUE_TYPE *r)
3026 long intermed[3];
3027 encode_ieee_extended (fmt, intermed, r);
3029 /* Motorola chips are assumed always to be big-endian. Also, the
3030 padding in a Motorola extended real goes between the exponent and
3031 the mantissa. At this point the mantissa is entirely within
3032 elements 0 and 1 of intermed, and the exponent entirely within
3033 element 2, so all we have to do is swap the order around, and
3034 shift element 2 left 16 bits. */
3035 buf[0] = intermed[2] << 16;
3036 buf[1] = intermed[1];
3037 buf[2] = intermed[0];
3040 /* Convert from the internal format to the 12-byte Intel format for
3041 an IEEE extended real. */
3042 static void
3043 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3044 const REAL_VALUE_TYPE *r)
3046 if (FLOAT_WORDS_BIG_ENDIAN)
3048 /* All the padding in an Intel-format extended real goes at the high
3049 end, which in this case is after the mantissa, not the exponent.
3050 Therefore we must shift everything down 16 bits. */
3051 long intermed[3];
3052 encode_ieee_extended (fmt, intermed, r);
3053 buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3054 buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3055 buf[2] = (intermed[0] << 16);
3057 else
3058 /* encode_ieee_extended produces what we want directly. */
3059 encode_ieee_extended (fmt, buf, r);
3062 /* Convert from the internal format to the 16-byte Intel format for
3063 an IEEE extended real. */
3064 static void
3065 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3066 const REAL_VALUE_TYPE *r)
3068 /* All the padding in an Intel-format extended real goes at the high end. */
3069 encode_ieee_extended_intel_96 (fmt, buf, r);
3070 buf[3] = 0;
3073 /* As above, we have a helper function which converts from 12-byte
3074 little-endian Intel format to internal format. Functions below
3075 adjust for the other possible formats. */
3076 static void
3077 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3078 const long *buf)
3080 unsigned long image_hi, sig_hi, sig_lo;
3081 bool sign;
3082 int exp;
3084 sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3085 sig_lo &= 0xffffffff;
3086 sig_hi &= 0xffffffff;
3087 image_hi &= 0xffffffff;
3089 sign = (image_hi >> 15) & 1;
3090 exp = image_hi & 0x7fff;
3092 memset (r, 0, sizeof (*r));
3094 if (exp == 0)
3096 if ((sig_hi || sig_lo) && fmt->has_denorm)
3098 r->cl = rvc_normal;
3099 r->sign = sign;
3101 /* When the IEEE format contains a hidden bit, we know that
3102 it's zero at this point, and so shift up the significand
3103 and decrease the exponent to match. In this case, Motorola
3104 defines the explicit integer bit to be valid, so we don't
3105 know whether the msb is set or not. */
3106 SET_REAL_EXP (r, fmt->emin);
3107 if (HOST_BITS_PER_LONG == 32)
3109 r->sig[SIGSZ-1] = sig_hi;
3110 r->sig[SIGSZ-2] = sig_lo;
3112 else
3113 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3115 normalize (r);
3117 else if (fmt->has_signed_zero)
3118 r->sign = sign;
3120 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3122 /* See above re "pseudo-infinities" and "pseudo-nans".
3123 Short summary is that the MSB will likely always be
3124 set, and that we don't care about it. */
3125 sig_hi &= 0x7fffffff;
3127 if (sig_hi || sig_lo)
3129 r->cl = rvc_nan;
3130 r->sign = sign;
3131 r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3132 if (HOST_BITS_PER_LONG == 32)
3134 r->sig[SIGSZ-1] = sig_hi;
3135 r->sig[SIGSZ-2] = sig_lo;
3137 else
3138 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3140 else
3142 r->cl = rvc_inf;
3143 r->sign = sign;
3146 else
3148 r->cl = rvc_normal;
3149 r->sign = sign;
3150 SET_REAL_EXP (r, exp - 16383 + 1);
3151 if (HOST_BITS_PER_LONG == 32)
3153 r->sig[SIGSZ-1] = sig_hi;
3154 r->sig[SIGSZ-2] = sig_lo;
3156 else
3157 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3161 /* Convert from the internal format to the 12-byte Motorola format
3162 for an IEEE extended real. */
3163 static void
3164 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3165 const long *buf)
3167 long intermed[3];
3169 /* Motorola chips are assumed always to be big-endian. Also, the
3170 padding in a Motorola extended real goes between the exponent and
3171 the mantissa; remove it. */
3172 intermed[0] = buf[2];
3173 intermed[1] = buf[1];
3174 intermed[2] = (unsigned long)buf[0] >> 16;
3176 decode_ieee_extended (fmt, r, intermed);
3179 /* Convert from the internal format to the 12-byte Intel format for
3180 an IEEE extended real. */
3181 static void
3182 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3183 const long *buf)
3185 if (FLOAT_WORDS_BIG_ENDIAN)
3187 /* All the padding in an Intel-format extended real goes at the high
3188 end, which in this case is after the mantissa, not the exponent.
3189 Therefore we must shift everything up 16 bits. */
3190 long intermed[3];
3192 intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3193 intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3194 intermed[2] = ((unsigned long)buf[0] >> 16);
3196 decode_ieee_extended (fmt, r, intermed);
3198 else
3199 /* decode_ieee_extended produces what we want directly. */
3200 decode_ieee_extended (fmt, r, buf);
3203 /* Convert from the internal format to the 16-byte Intel format for
3204 an IEEE extended real. */
3205 static void
3206 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3207 const long *buf)
3209 /* All the padding in an Intel-format extended real goes at the high end. */
3210 decode_ieee_extended_intel_96 (fmt, r, buf);
3213 const struct real_format ieee_extended_motorola_format =
3215 encode_ieee_extended_motorola,
3216 decode_ieee_extended_motorola,
3221 -16382,
3222 16384,
3224 true,
3225 true,
3226 true,
3227 true,
3228 true
3231 const struct real_format ieee_extended_intel_96_format =
3233 encode_ieee_extended_intel_96,
3234 decode_ieee_extended_intel_96,
3239 -16381,
3240 16384,
3242 true,
3243 true,
3244 true,
3245 true,
3246 true
3249 const struct real_format ieee_extended_intel_128_format =
3251 encode_ieee_extended_intel_128,
3252 decode_ieee_extended_intel_128,
3257 -16381,
3258 16384,
3260 true,
3261 true,
3262 true,
3263 true,
3264 true
3267 /* The following caters to i386 systems that set the rounding precision
3268 to 53 bits instead of 64, e.g. FreeBSD. */
3269 const struct real_format ieee_extended_intel_96_round_53_format =
3271 encode_ieee_extended_intel_96,
3272 decode_ieee_extended_intel_96,
3277 -16381,
3278 16384,
3280 true,
3281 true,
3282 true,
3283 true,
3284 true
3287 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3288 numbers whose sum is equal to the extended precision value. The number
3289 with greater magnitude is first. This format has the same magnitude
3290 range as an IEEE double precision value, but effectively 106 bits of
3291 significand precision. Infinity and NaN are represented by their IEEE
3292 double precision value stored in the first number, the second number is
3293 +0.0 or -0.0 for Infinity and don't-care for NaN. */
3295 static void encode_ibm_extended (const struct real_format *fmt,
3296 long *, const REAL_VALUE_TYPE *);
3297 static void decode_ibm_extended (const struct real_format *,
3298 REAL_VALUE_TYPE *, const long *);
3300 static void
3301 encode_ibm_extended (const struct real_format *fmt, long *buf,
3302 const REAL_VALUE_TYPE *r)
3304 REAL_VALUE_TYPE u, normr, v;
3305 const struct real_format *base_fmt;
3307 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3309 /* Renormlize R before doing any arithmetic on it. */
3310 normr = *r;
3311 if (normr.cl == rvc_normal)
3312 normalize (&normr);
3314 /* u = IEEE double precision portion of significand. */
3315 u = normr;
3316 round_for_format (base_fmt, &u);
3317 encode_ieee_double (base_fmt, &buf[0], &u);
3319 if (u.cl == rvc_normal)
3321 do_add (&v, &normr, &u, 1);
3322 /* Call round_for_format since we might need to denormalize. */
3323 round_for_format (base_fmt, &v);
3324 encode_ieee_double (base_fmt, &buf[2], &v);
3326 else
3328 /* Inf, NaN, 0 are all representable as doubles, so the
3329 least-significant part can be 0.0. */
3330 buf[2] = 0;
3331 buf[3] = 0;
3335 static void
3336 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3337 const long *buf)
3339 REAL_VALUE_TYPE u, v;
3340 const struct real_format *base_fmt;
3342 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3343 decode_ieee_double (base_fmt, &u, &buf[0]);
3345 if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3347 decode_ieee_double (base_fmt, &v, &buf[2]);
3348 do_add (r, &u, &v, 0);
3350 else
3351 *r = u;
3354 const struct real_format ibm_extended_format =
3356 encode_ibm_extended,
3357 decode_ibm_extended,
3360 53 + 53,
3362 -1021 + 53,
3363 1024,
3365 true,
3366 true,
3367 true,
3368 true,
3369 true
3372 const struct real_format mips_extended_format =
3374 encode_ibm_extended,
3375 decode_ibm_extended,
3378 53 + 53,
3380 -1021 + 53,
3381 1024,
3383 true,
3384 true,
3385 true,
3386 true,
3387 false
3391 /* IEEE quad precision format. */
3393 static void encode_ieee_quad (const struct real_format *fmt,
3394 long *, const REAL_VALUE_TYPE *);
3395 static void decode_ieee_quad (const struct real_format *,
3396 REAL_VALUE_TYPE *, const long *);
3398 static void
3399 encode_ieee_quad (const struct real_format *fmt, long *buf,
3400 const REAL_VALUE_TYPE *r)
3402 unsigned long image3, image2, image1, image0, exp;
3403 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3404 REAL_VALUE_TYPE u;
3406 image3 = r->sign << 31;
3407 image2 = 0;
3408 image1 = 0;
3409 image0 = 0;
3411 rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3413 switch (r->cl)
3415 case rvc_zero:
3416 break;
3418 case rvc_inf:
3419 if (fmt->has_inf)
3420 image3 |= 32767 << 16;
3421 else
3423 image3 |= 0x7fffffff;
3424 image2 = 0xffffffff;
3425 image1 = 0xffffffff;
3426 image0 = 0xffffffff;
3428 break;
3430 case rvc_nan:
3431 if (fmt->has_nans)
3433 image3 |= 32767 << 16;
3435 if (r->canonical)
3437 /* Don't use bits from the significand. The
3438 initialization above is right. */
3440 else if (HOST_BITS_PER_LONG == 32)
3442 image0 = u.sig[0];
3443 image1 = u.sig[1];
3444 image2 = u.sig[2];
3445 image3 |= u.sig[3] & 0xffff;
3447 else
3449 image0 = u.sig[0];
3450 image1 = image0 >> 31 >> 1;
3451 image2 = u.sig[1];
3452 image3 |= (image2 >> 31 >> 1) & 0xffff;
3453 image0 &= 0xffffffff;
3454 image2 &= 0xffffffff;
3456 if (r->signalling == fmt->qnan_msb_set)
3457 image3 &= ~0x8000;
3458 else
3459 image3 |= 0x8000;
3460 /* We overload qnan_msb_set here: it's only clear for
3461 mips_ieee_single, which wants all mantissa bits but the
3462 quiet/signalling one set in canonical NaNs (at least
3463 Quiet ones). */
3464 if (r->canonical && !fmt->qnan_msb_set)
3466 image3 |= 0x7fff;
3467 image2 = image1 = image0 = 0xffffffff;
3469 else if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3470 image3 |= 0x4000;
3472 else
3474 image3 |= 0x7fffffff;
3475 image2 = 0xffffffff;
3476 image1 = 0xffffffff;
3477 image0 = 0xffffffff;
3479 break;
3481 case rvc_normal:
3482 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3483 whereas the intermediate representation is 0.F x 2**exp.
3484 Which means we're off by one. */
3485 if (denormal)
3486 exp = 0;
3487 else
3488 exp = REAL_EXP (r) + 16383 - 1;
3489 image3 |= exp << 16;
3491 if (HOST_BITS_PER_LONG == 32)
3493 image0 = u.sig[0];
3494 image1 = u.sig[1];
3495 image2 = u.sig[2];
3496 image3 |= u.sig[3] & 0xffff;
3498 else
3500 image0 = u.sig[0];
3501 image1 = image0 >> 31 >> 1;
3502 image2 = u.sig[1];
3503 image3 |= (image2 >> 31 >> 1) & 0xffff;
3504 image0 &= 0xffffffff;
3505 image2 &= 0xffffffff;
3507 break;
3509 default:
3510 gcc_unreachable ();
3513 if (FLOAT_WORDS_BIG_ENDIAN)
3515 buf[0] = image3;
3516 buf[1] = image2;
3517 buf[2] = image1;
3518 buf[3] = image0;
3520 else
3522 buf[0] = image0;
3523 buf[1] = image1;
3524 buf[2] = image2;
3525 buf[3] = image3;
3529 static void
3530 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3531 const long *buf)
3533 unsigned long image3, image2, image1, image0;
3534 bool sign;
3535 int exp;
3537 if (FLOAT_WORDS_BIG_ENDIAN)
3539 image3 = buf[0];
3540 image2 = buf[1];
3541 image1 = buf[2];
3542 image0 = buf[3];
3544 else
3546 image0 = buf[0];
3547 image1 = buf[1];
3548 image2 = buf[2];
3549 image3 = buf[3];
3551 image0 &= 0xffffffff;
3552 image1 &= 0xffffffff;
3553 image2 &= 0xffffffff;
3555 sign = (image3 >> 31) & 1;
3556 exp = (image3 >> 16) & 0x7fff;
3557 image3 &= 0xffff;
3559 memset (r, 0, sizeof (*r));
3561 if (exp == 0)
3563 if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
3565 r->cl = rvc_normal;
3566 r->sign = sign;
3568 SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
3569 if (HOST_BITS_PER_LONG == 32)
3571 r->sig[0] = image0;
3572 r->sig[1] = image1;
3573 r->sig[2] = image2;
3574 r->sig[3] = image3;
3576 else
3578 r->sig[0] = (image1 << 31 << 1) | image0;
3579 r->sig[1] = (image3 << 31 << 1) | image2;
3582 normalize (r);
3584 else if (fmt->has_signed_zero)
3585 r->sign = sign;
3587 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3589 if (image3 | image2 | image1 | image0)
3591 r->cl = rvc_nan;
3592 r->sign = sign;
3593 r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
3595 if (HOST_BITS_PER_LONG == 32)
3597 r->sig[0] = image0;
3598 r->sig[1] = image1;
3599 r->sig[2] = image2;
3600 r->sig[3] = image3;
3602 else
3604 r->sig[0] = (image1 << 31 << 1) | image0;
3605 r->sig[1] = (image3 << 31 << 1) | image2;
3607 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3609 else
3611 r->cl = rvc_inf;
3612 r->sign = sign;
3615 else
3617 r->cl = rvc_normal;
3618 r->sign = sign;
3619 SET_REAL_EXP (r, exp - 16383 + 1);
3621 if (HOST_BITS_PER_LONG == 32)
3623 r->sig[0] = image0;
3624 r->sig[1] = image1;
3625 r->sig[2] = image2;
3626 r->sig[3] = image3;
3628 else
3630 r->sig[0] = (image1 << 31 << 1) | image0;
3631 r->sig[1] = (image3 << 31 << 1) | image2;
3633 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3634 r->sig[SIGSZ-1] |= SIG_MSB;
3638 const struct real_format ieee_quad_format =
3640 encode_ieee_quad,
3641 decode_ieee_quad,
3644 113,
3645 113,
3646 -16381,
3647 16384,
3648 127,
3649 true,
3650 true,
3651 true,
3652 true,
3653 true
3656 const struct real_format mips_quad_format =
3658 encode_ieee_quad,
3659 decode_ieee_quad,
3662 113,
3663 113,
3664 -16381,
3665 16384,
3666 127,
3667 true,
3668 true,
3669 true,
3670 true,
3671 false
3674 /* Descriptions of VAX floating point formats can be found beginning at
3676 http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
3678 The thing to remember is that they're almost IEEE, except for word
3679 order, exponent bias, and the lack of infinities, nans, and denormals.
3681 We don't implement the H_floating format here, simply because neither
3682 the VAX or Alpha ports use it. */
3684 static void encode_vax_f (const struct real_format *fmt,
3685 long *, const REAL_VALUE_TYPE *);
3686 static void decode_vax_f (const struct real_format *,
3687 REAL_VALUE_TYPE *, const long *);
3688 static void encode_vax_d (const struct real_format *fmt,
3689 long *, const REAL_VALUE_TYPE *);
3690 static void decode_vax_d (const struct real_format *,
3691 REAL_VALUE_TYPE *, const long *);
3692 static void encode_vax_g (const struct real_format *fmt,
3693 long *, const REAL_VALUE_TYPE *);
3694 static void decode_vax_g (const struct real_format *,
3695 REAL_VALUE_TYPE *, const long *);
3697 static void
3698 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3699 const REAL_VALUE_TYPE *r)
3701 unsigned long sign, exp, sig, image;
3703 sign = r->sign << 15;
3705 switch (r->cl)
3707 case rvc_zero:
3708 image = 0;
3709 break;
3711 case rvc_inf:
3712 case rvc_nan:
3713 image = 0xffff7fff | sign;
3714 break;
3716 case rvc_normal:
3717 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
3718 exp = REAL_EXP (r) + 128;
3720 image = (sig << 16) & 0xffff0000;
3721 image |= sign;
3722 image |= exp << 7;
3723 image |= sig >> 16;
3724 break;
3726 default:
3727 gcc_unreachable ();
3730 buf[0] = image;
3733 static void
3734 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
3735 REAL_VALUE_TYPE *r, const long *buf)
3737 unsigned long image = buf[0] & 0xffffffff;
3738 int exp = (image >> 7) & 0xff;
3740 memset (r, 0, sizeof (*r));
3742 if (exp != 0)
3744 r->cl = rvc_normal;
3745 r->sign = (image >> 15) & 1;
3746 SET_REAL_EXP (r, exp - 128);
3748 image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
3749 r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
3753 static void
3754 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3755 const REAL_VALUE_TYPE *r)
3757 unsigned long image0, image1, sign = r->sign << 15;
3759 switch (r->cl)
3761 case rvc_zero:
3762 image0 = image1 = 0;
3763 break;
3765 case rvc_inf:
3766 case rvc_nan:
3767 image0 = 0xffff7fff | sign;
3768 image1 = 0xffffffff;
3769 break;
3771 case rvc_normal:
3772 /* Extract the significand into straight hi:lo. */
3773 if (HOST_BITS_PER_LONG == 64)
3775 image0 = r->sig[SIGSZ-1];
3776 image1 = (image0 >> (64 - 56)) & 0xffffffff;
3777 image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
3779 else
3781 image0 = r->sig[SIGSZ-1];
3782 image1 = r->sig[SIGSZ-2];
3783 image1 = (image0 << 24) | (image1 >> 8);
3784 image0 = (image0 >> 8) & 0xffffff;
3787 /* Rearrange the half-words of the significand to match the
3788 external format. */
3789 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
3790 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3792 /* Add the sign and exponent. */
3793 image0 |= sign;
3794 image0 |= (REAL_EXP (r) + 128) << 7;
3795 break;
3797 default:
3798 gcc_unreachable ();
3801 if (FLOAT_WORDS_BIG_ENDIAN)
3802 buf[0] = image1, buf[1] = image0;
3803 else
3804 buf[0] = image0, buf[1] = image1;
3807 static void
3808 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
3809 REAL_VALUE_TYPE *r, const long *buf)
3811 unsigned long image0, image1;
3812 int exp;
3814 if (FLOAT_WORDS_BIG_ENDIAN)
3815 image1 = buf[0], image0 = buf[1];
3816 else
3817 image0 = buf[0], image1 = buf[1];
3818 image0 &= 0xffffffff;
3819 image1 &= 0xffffffff;
3821 exp = (image0 >> 7) & 0xff;
3823 memset (r, 0, sizeof (*r));
3825 if (exp != 0)
3827 r->cl = rvc_normal;
3828 r->sign = (image0 >> 15) & 1;
3829 SET_REAL_EXP (r, exp - 128);
3831 /* Rearrange the half-words of the external format into
3832 proper ascending order. */
3833 image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
3834 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3836 if (HOST_BITS_PER_LONG == 64)
3838 image0 = (image0 << 31 << 1) | image1;
3839 image0 <<= 64 - 56;
3840 image0 |= SIG_MSB;
3841 r->sig[SIGSZ-1] = image0;
3843 else
3845 r->sig[SIGSZ-1] = image0;
3846 r->sig[SIGSZ-2] = image1;
3847 lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
3848 r->sig[SIGSZ-1] |= SIG_MSB;
3853 static void
3854 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3855 const REAL_VALUE_TYPE *r)
3857 unsigned long image0, image1, sign = r->sign << 15;
3859 switch (r->cl)
3861 case rvc_zero:
3862 image0 = image1 = 0;
3863 break;
3865 case rvc_inf:
3866 case rvc_nan:
3867 image0 = 0xffff7fff | sign;
3868 image1 = 0xffffffff;
3869 break;
3871 case rvc_normal:
3872 /* Extract the significand into straight hi:lo. */
3873 if (HOST_BITS_PER_LONG == 64)
3875 image0 = r->sig[SIGSZ-1];
3876 image1 = (image0 >> (64 - 53)) & 0xffffffff;
3877 image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
3879 else
3881 image0 = r->sig[SIGSZ-1];
3882 image1 = r->sig[SIGSZ-2];
3883 image1 = (image0 << 21) | (image1 >> 11);
3884 image0 = (image0 >> 11) & 0xfffff;
3887 /* Rearrange the half-words of the significand to match the
3888 external format. */
3889 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
3890 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3892 /* Add the sign and exponent. */
3893 image0 |= sign;
3894 image0 |= (REAL_EXP (r) + 1024) << 4;
3895 break;
3897 default:
3898 gcc_unreachable ();
3901 if (FLOAT_WORDS_BIG_ENDIAN)
3902 buf[0] = image1, buf[1] = image0;
3903 else
3904 buf[0] = image0, buf[1] = image1;
3907 static void
3908 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
3909 REAL_VALUE_TYPE *r, const long *buf)
3911 unsigned long image0, image1;
3912 int exp;
3914 if (FLOAT_WORDS_BIG_ENDIAN)
3915 image1 = buf[0], image0 = buf[1];
3916 else
3917 image0 = buf[0], image1 = buf[1];
3918 image0 &= 0xffffffff;
3919 image1 &= 0xffffffff;
3921 exp = (image0 >> 4) & 0x7ff;
3923 memset (r, 0, sizeof (*r));
3925 if (exp != 0)
3927 r->cl = rvc_normal;
3928 r->sign = (image0 >> 15) & 1;
3929 SET_REAL_EXP (r, exp - 1024);
3931 /* Rearrange the half-words of the external format into
3932 proper ascending order. */
3933 image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
3934 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3936 if (HOST_BITS_PER_LONG == 64)
3938 image0 = (image0 << 31 << 1) | image1;
3939 image0 <<= 64 - 53;
3940 image0 |= SIG_MSB;
3941 r->sig[SIGSZ-1] = image0;
3943 else
3945 r->sig[SIGSZ-1] = image0;
3946 r->sig[SIGSZ-2] = image1;
3947 lshift_significand (r, r, 64 - 53);
3948 r->sig[SIGSZ-1] |= SIG_MSB;
3953 const struct real_format vax_f_format =
3955 encode_vax_f,
3956 decode_vax_f,
3961 -127,
3962 127,
3964 false,
3965 false,
3966 false,
3967 false,
3968 false
3971 const struct real_format vax_d_format =
3973 encode_vax_d,
3974 decode_vax_d,
3979 -127,
3980 127,
3982 false,
3983 false,
3984 false,
3985 false,
3986 false
3989 const struct real_format vax_g_format =
3991 encode_vax_g,
3992 decode_vax_g,
3997 -1023,
3998 1023,
4000 false,
4001 false,
4002 false,
4003 false,
4004 false
4007 /* A good reference for these can be found in chapter 9 of
4008 "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
4009 An on-line version can be found here:
4011 http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
4014 static void encode_i370_single (const struct real_format *fmt,
4015 long *, const REAL_VALUE_TYPE *);
4016 static void decode_i370_single (const struct real_format *,
4017 REAL_VALUE_TYPE *, const long *);
4018 static void encode_i370_double (const struct real_format *fmt,
4019 long *, const REAL_VALUE_TYPE *);
4020 static void decode_i370_double (const struct real_format *,
4021 REAL_VALUE_TYPE *, const long *);
4023 static void
4024 encode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4025 long *buf, const REAL_VALUE_TYPE *r)
4027 unsigned long sign, exp, sig, image;
4029 sign = r->sign << 31;
4031 switch (r->cl)
4033 case rvc_zero:
4034 image = 0;
4035 break;
4037 case rvc_inf:
4038 case rvc_nan:
4039 image = 0x7fffffff | sign;
4040 break;
4042 case rvc_normal:
4043 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
4044 exp = ((REAL_EXP (r) / 4) + 64) << 24;
4045 image = sign | exp | sig;
4046 break;
4048 default:
4049 gcc_unreachable ();
4052 buf[0] = image;
4055 static void
4056 decode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4057 REAL_VALUE_TYPE *r, const long *buf)
4059 unsigned long sign, sig, image = buf[0];
4060 int exp;
4062 sign = (image >> 31) & 1;
4063 exp = (image >> 24) & 0x7f;
4064 sig = image & 0xffffff;
4066 memset (r, 0, sizeof (*r));
4068 if (exp || sig)
4070 r->cl = rvc_normal;
4071 r->sign = sign;
4072 SET_REAL_EXP (r, (exp - 64) * 4);
4073 r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
4074 normalize (r);
4078 static void
4079 encode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4080 long *buf, const REAL_VALUE_TYPE *r)
4082 unsigned long sign, exp, image_hi, image_lo;
4084 sign = r->sign << 31;
4086 switch (r->cl)
4088 case rvc_zero:
4089 image_hi = image_lo = 0;
4090 break;
4092 case rvc_inf:
4093 case rvc_nan:
4094 image_hi = 0x7fffffff | sign;
4095 image_lo = 0xffffffff;
4096 break;
4098 case rvc_normal:
4099 if (HOST_BITS_PER_LONG == 64)
4101 image_hi = r->sig[SIGSZ-1];
4102 image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
4103 image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
4105 else
4107 image_hi = r->sig[SIGSZ-1];
4108 image_lo = r->sig[SIGSZ-2];
4109 image_lo = (image_lo >> 8) | (image_hi << 24);
4110 image_hi >>= 8;
4113 exp = ((REAL_EXP (r) / 4) + 64) << 24;
4114 image_hi |= sign | exp;
4115 break;
4117 default:
4118 gcc_unreachable ();
4121 if (FLOAT_WORDS_BIG_ENDIAN)
4122 buf[0] = image_hi, buf[1] = image_lo;
4123 else
4124 buf[0] = image_lo, buf[1] = image_hi;
4127 static void
4128 decode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4129 REAL_VALUE_TYPE *r, const long *buf)
4131 unsigned long sign, image_hi, image_lo;
4132 int exp;
4134 if (FLOAT_WORDS_BIG_ENDIAN)
4135 image_hi = buf[0], image_lo = buf[1];
4136 else
4137 image_lo = buf[0], image_hi = buf[1];
4139 sign = (image_hi >> 31) & 1;
4140 exp = (image_hi >> 24) & 0x7f;
4141 image_hi &= 0xffffff;
4142 image_lo &= 0xffffffff;
4144 memset (r, 0, sizeof (*r));
4146 if (exp || image_hi || image_lo)
4148 r->cl = rvc_normal;
4149 r->sign = sign;
4150 SET_REAL_EXP (r, (exp - 64) * 4 + (SIGNIFICAND_BITS - 56));
4152 if (HOST_BITS_PER_LONG == 32)
4154 r->sig[0] = image_lo;
4155 r->sig[1] = image_hi;
4157 else
4158 r->sig[0] = image_lo | (image_hi << 31 << 1);
4160 normalize (r);
4164 const struct real_format i370_single_format =
4166 encode_i370_single,
4167 decode_i370_single,
4172 -64,
4175 false,
4176 false,
4177 false, /* ??? The encoding does allow for "unnormals". */
4178 false, /* ??? The encoding does allow for "unnormals". */
4179 false
4182 const struct real_format i370_double_format =
4184 encode_i370_double,
4185 decode_i370_double,
4190 -64,
4193 false,
4194 false,
4195 false, /* ??? The encoding does allow for "unnormals". */
4196 false, /* ??? The encoding does allow for "unnormals". */
4197 false
4200 /* The "twos-complement" c4x format is officially defined as
4202 x = s(~s).f * 2**e
4204 This is rather misleading. One must remember that F is signed.
4205 A better description would be
4207 x = -1**s * ((s + 1 + .f) * 2**e
4209 So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
4210 that's -1 * (1+1+(-.5)) == -1.5. I think.
4212 The constructions here are taken from Tables 5-1 and 5-2 of the
4213 TMS320C4x User's Guide wherein step-by-step instructions for
4214 conversion from IEEE are presented. That's close enough to our
4215 internal representation so as to make things easy.
4217 See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf */
4219 static void encode_c4x_single (const struct real_format *fmt,
4220 long *, const REAL_VALUE_TYPE *);
4221 static void decode_c4x_single (const struct real_format *,
4222 REAL_VALUE_TYPE *, const long *);
4223 static void encode_c4x_extended (const struct real_format *fmt,
4224 long *, const REAL_VALUE_TYPE *);
4225 static void decode_c4x_extended (const struct real_format *,
4226 REAL_VALUE_TYPE *, const long *);
4228 static void
4229 encode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4230 long *buf, const REAL_VALUE_TYPE *r)
4232 unsigned long image, exp, sig;
4234 switch (r->cl)
4236 case rvc_zero:
4237 exp = -128;
4238 sig = 0;
4239 break;
4241 case rvc_inf:
4242 case rvc_nan:
4243 exp = 127;
4244 sig = 0x800000 - r->sign;
4245 break;
4247 case rvc_normal:
4248 exp = REAL_EXP (r) - 1;
4249 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4250 if (r->sign)
4252 if (sig)
4253 sig = -sig;
4254 else
4255 exp--;
4256 sig |= 0x800000;
4258 break;
4260 default:
4261 gcc_unreachable ();
4264 image = ((exp & 0xff) << 24) | (sig & 0xffffff);
4265 buf[0] = image;
4268 static void
4269 decode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4270 REAL_VALUE_TYPE *r, const long *buf)
4272 unsigned long image = buf[0];
4273 unsigned long sig;
4274 int exp, sf;
4276 exp = (((image >> 24) & 0xff) ^ 0x80) - 0x80;
4277 sf = ((image & 0xffffff) ^ 0x800000) - 0x800000;
4279 memset (r, 0, sizeof (*r));
4281 if (exp != -128)
4283 r->cl = rvc_normal;
4285 sig = sf & 0x7fffff;
4286 if (sf < 0)
4288 r->sign = 1;
4289 if (sig)
4290 sig = -sig;
4291 else
4292 exp++;
4294 sig = (sig << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4296 SET_REAL_EXP (r, exp + 1);
4297 r->sig[SIGSZ-1] = sig;
4301 static void
4302 encode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4303 long *buf, const REAL_VALUE_TYPE *r)
4305 unsigned long exp, sig;
4307 switch (r->cl)
4309 case rvc_zero:
4310 exp = -128;
4311 sig = 0;
4312 break;
4314 case rvc_inf:
4315 case rvc_nan:
4316 exp = 127;
4317 sig = 0x80000000 - r->sign;
4318 break;
4320 case rvc_normal:
4321 exp = REAL_EXP (r) - 1;
4323 sig = r->sig[SIGSZ-1];
4324 if (HOST_BITS_PER_LONG == 64)
4325 sig = sig >> 1 >> 31;
4326 sig &= 0x7fffffff;
4328 if (r->sign)
4330 if (sig)
4331 sig = -sig;
4332 else
4333 exp--;
4334 sig |= 0x80000000;
4336 break;
4338 default:
4339 gcc_unreachable ();
4342 exp = (exp & 0xff) << 24;
4343 sig &= 0xffffffff;
4345 if (FLOAT_WORDS_BIG_ENDIAN)
4346 buf[0] = exp, buf[1] = sig;
4347 else
4348 buf[0] = sig, buf[0] = exp;
4351 static void
4352 decode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4353 REAL_VALUE_TYPE *r, const long *buf)
4355 unsigned long sig;
4356 int exp, sf;
4358 if (FLOAT_WORDS_BIG_ENDIAN)
4359 exp = buf[0], sf = buf[1];
4360 else
4361 sf = buf[0], exp = buf[1];
4363 exp = (((exp >> 24) & 0xff) & 0x80) - 0x80;
4364 sf = ((sf & 0xffffffff) ^ 0x80000000) - 0x80000000;
4366 memset (r, 0, sizeof (*r));
4368 if (exp != -128)
4370 r->cl = rvc_normal;
4372 sig = sf & 0x7fffffff;
4373 if (sf < 0)
4375 r->sign = 1;
4376 if (sig)
4377 sig = -sig;
4378 else
4379 exp++;
4381 if (HOST_BITS_PER_LONG == 64)
4382 sig = sig << 1 << 31;
4383 sig |= SIG_MSB;
4385 SET_REAL_EXP (r, exp + 1);
4386 r->sig[SIGSZ-1] = sig;
4390 const struct real_format c4x_single_format =
4392 encode_c4x_single,
4393 decode_c4x_single,
4398 -126,
4399 128,
4401 false,
4402 false,
4403 false,
4404 false,
4405 false
4408 const struct real_format c4x_extended_format =
4410 encode_c4x_extended,
4411 decode_c4x_extended,
4416 -126,
4417 128,
4419 false,
4420 false,
4421 false,
4422 false,
4423 false
4427 /* A synthetic "format" for internal arithmetic. It's the size of the
4428 internal significand minus the two bits needed for proper rounding.
4429 The encode and decode routines exist only to satisfy our paranoia
4430 harness. */
4432 static void encode_internal (const struct real_format *fmt,
4433 long *, const REAL_VALUE_TYPE *);
4434 static void decode_internal (const struct real_format *,
4435 REAL_VALUE_TYPE *, const long *);
4437 static void
4438 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4439 const REAL_VALUE_TYPE *r)
4441 memcpy (buf, r, sizeof (*r));
4444 static void
4445 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4446 REAL_VALUE_TYPE *r, const long *buf)
4448 memcpy (r, buf, sizeof (*r));
4451 const struct real_format real_internal_format =
4453 encode_internal,
4454 decode_internal,
4457 SIGNIFICAND_BITS - 2,
4458 SIGNIFICAND_BITS - 2,
4459 -MAX_EXP,
4460 MAX_EXP,
4462 true,
4463 true,
4464 false,
4465 true,
4466 true
4469 /* Calculate the square root of X in mode MODE, and store the result
4470 in R. Return TRUE if the operation does not raise an exception.
4471 For details see "High Precision Division and Square Root",
4472 Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June
4473 1993. http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf. */
4475 bool
4476 real_sqrt (REAL_VALUE_TYPE *r, enum machine_mode mode,
4477 const REAL_VALUE_TYPE *x)
4479 static REAL_VALUE_TYPE halfthree;
4480 static bool init = false;
4481 REAL_VALUE_TYPE h, t, i;
4482 int iter, exp;
4484 /* sqrt(-0.0) is -0.0. */
4485 if (real_isnegzero (x))
4487 *r = *x;
4488 return false;
4491 /* Negative arguments return NaN. */
4492 if (real_isneg (x))
4494 get_canonical_qnan (r, 0);
4495 return false;
4498 /* Infinity and NaN return themselves. */
4499 if (real_isinf (x) || real_isnan (x))
4501 *r = *x;
4502 return false;
4505 if (!init)
4507 do_add (&halfthree, &dconst1, &dconsthalf, 0);
4508 init = true;
4511 /* Initial guess for reciprocal sqrt, i. */
4512 exp = real_exponent (x);
4513 real_ldexp (&i, &dconst1, -exp/2);
4515 /* Newton's iteration for reciprocal sqrt, i. */
4516 for (iter = 0; iter < 16; iter++)
4518 /* i(n+1) = i(n) * (1.5 - 0.5*i(n)*i(n)*x). */
4519 do_multiply (&t, x, &i);
4520 do_multiply (&h, &t, &i);
4521 do_multiply (&t, &h, &dconsthalf);
4522 do_add (&h, &halfthree, &t, 1);
4523 do_multiply (&t, &i, &h);
4525 /* Check for early convergence. */
4526 if (iter >= 6 && real_identical (&i, &t))
4527 break;
4529 /* ??? Unroll loop to avoid copying. */
4530 i = t;
4533 /* Final iteration: r = i*x + 0.5*i*x*(1.0 - i*(i*x)). */
4534 do_multiply (&t, x, &i);
4535 do_multiply (&h, &t, &i);
4536 do_add (&i, &dconst1, &h, 1);
4537 do_multiply (&h, &t, &i);
4538 do_multiply (&i, &dconsthalf, &h);
4539 do_add (&h, &t, &i, 0);
4541 /* ??? We need a Tuckerman test to get the last bit. */
4543 real_convert (r, mode, &h);
4544 return true;
4547 /* Calculate X raised to the integer exponent N in mode MODE and store
4548 the result in R. Return true if the result may be inexact due to
4549 loss of precision. The algorithm is the classic "left-to-right binary
4550 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4551 Algorithms", "The Art of Computer Programming", Volume 2. */
4553 bool
4554 real_powi (REAL_VALUE_TYPE *r, enum machine_mode mode,
4555 const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4557 unsigned HOST_WIDE_INT bit;
4558 REAL_VALUE_TYPE t;
4559 bool inexact = false;
4560 bool init = false;
4561 bool neg;
4562 int i;
4564 if (n == 0)
4566 *r = dconst1;
4567 return false;
4569 else if (n < 0)
4571 /* Don't worry about overflow, from now on n is unsigned. */
4572 neg = true;
4573 n = -n;
4575 else
4576 neg = false;
4578 t = *x;
4579 bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4580 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4582 if (init)
4584 inexact |= do_multiply (&t, &t, &t);
4585 if (n & bit)
4586 inexact |= do_multiply (&t, &t, x);
4588 else if (n & bit)
4589 init = true;
4590 bit >>= 1;
4593 if (neg)
4594 inexact |= do_divide (&t, &dconst1, &t);
4596 real_convert (r, mode, &t);
4597 return inexact;
4600 /* Round X to the nearest integer not larger in absolute value, i.e.
4601 towards zero, placing the result in R in mode MODE. */
4603 void
4604 real_trunc (REAL_VALUE_TYPE *r, enum machine_mode mode,
4605 const REAL_VALUE_TYPE *x)
4607 do_fix_trunc (r, x);
4608 if (mode != VOIDmode)
4609 real_convert (r, mode, r);
4612 /* Round X to the largest integer not greater in value, i.e. round
4613 down, placing the result in R in mode MODE. */
4615 void
4616 real_floor (REAL_VALUE_TYPE *r, enum machine_mode mode,
4617 const REAL_VALUE_TYPE *x)
4619 REAL_VALUE_TYPE t;
4621 do_fix_trunc (&t, x);
4622 if (! real_identical (&t, x) && x->sign)
4623 do_add (&t, &t, &dconstm1, 0);
4624 if (mode != VOIDmode)
4625 real_convert (r, mode, &t);
4626 else
4627 *r = t;
4630 /* Round X to the smallest integer not less then argument, i.e. round
4631 up, placing the result in R in mode MODE. */
4633 void
4634 real_ceil (REAL_VALUE_TYPE *r, enum machine_mode mode,
4635 const REAL_VALUE_TYPE *x)
4637 REAL_VALUE_TYPE t;
4639 do_fix_trunc (&t, x);
4640 if (! real_identical (&t, x) && ! x->sign)
4641 do_add (&t, &t, &dconst1, 0);
4642 if (mode != VOIDmode)
4643 real_convert (r, mode, &t);
4644 else
4645 *r = t;
4648 /* Round X to the nearest integer, but round halfway cases away from
4649 zero. */
4651 void
4652 real_round (REAL_VALUE_TYPE *r, enum machine_mode mode,
4653 const REAL_VALUE_TYPE *x)
4655 do_add (r, x, &dconsthalf, x->sign);
4656 do_fix_trunc (r, r);
4657 if (mode != VOIDmode)
4658 real_convert (r, mode, r);
4661 /* Set the sign of R to the sign of X. */
4663 void
4664 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
4666 r->sign = x->sign;