* fixinc/inclhack.def (avoid_bool_define, avoid_bool_type): Bypass
[official-gcc.git] / gcc / real.c
blob5180aec382aaf62b75546a4ec6ce02a8942f9b57
1 /* real.c - software floating point emulation.
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2002, 2003 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 C 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 than the
53 largest supported target floating-point type by at least 2 bits.
54 This gives us proper rounding when we truncate to the target type.
55 In addition, E must be large enough to hold the smallest supported
56 denormal number 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 29.
62 Note that the decimal string conversion routines are sensitive to
63 rounding error. 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->class = 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->class = 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->class = 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->class = rvc_zero;
494 r->exp = 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 = r->exp - 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 r->exp = 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->class, b->class))
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 abort ();
583 /* Swap the arguments such that A has the larger exponent. */
584 dexp = a->exp - b->exp;
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 = a->exp;
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->class = rvc_normal;
641 r->sign = sign;
642 r->exp = 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->class == 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->class, b->class))
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 abort ();
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 = (a->exp - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
752 + (b->exp - (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 u.class = rvc_normal;
767 u.sign = 0;
768 u.exp = 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->class, b->class))
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 abort ();
856 if (r == a || r == b)
857 rr = &t;
858 else
859 rr = r;
861 rr->class = rvc_normal;
862 rr->sign = sign;
864 exp = a->exp - b->exp + 1;
865 if (exp > MAX_EXP)
867 get_inf (r, sign);
868 return true;
870 if (exp < -MAX_EXP)
872 get_zero (r, sign);
873 return true;
875 rr->exp = exp;
877 inexact = div_significands (rr, a, b);
879 /* Re-normalize the result. */
880 normalize (rr);
881 rr->sig[0] |= inexact;
883 if (rr != r)
884 *r = t;
886 return inexact;
889 /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
890 one of the two operands is a NaN. */
892 static int
893 do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
894 int nan_result)
896 int ret;
898 switch (CLASS2 (a->class, b->class))
900 case CLASS2 (rvc_zero, rvc_zero):
901 /* Sign of zero doesn't matter for compares. */
902 return 0;
904 case CLASS2 (rvc_inf, rvc_zero):
905 case CLASS2 (rvc_inf, rvc_normal):
906 case CLASS2 (rvc_normal, rvc_zero):
907 return (a->sign ? -1 : 1);
909 case CLASS2 (rvc_inf, rvc_inf):
910 return -a->sign - -b->sign;
912 case CLASS2 (rvc_zero, rvc_normal):
913 case CLASS2 (rvc_zero, rvc_inf):
914 case CLASS2 (rvc_normal, rvc_inf):
915 return (b->sign ? 1 : -1);
917 case CLASS2 (rvc_zero, rvc_nan):
918 case CLASS2 (rvc_normal, rvc_nan):
919 case CLASS2 (rvc_inf, rvc_nan):
920 case CLASS2 (rvc_nan, rvc_nan):
921 case CLASS2 (rvc_nan, rvc_zero):
922 case CLASS2 (rvc_nan, rvc_normal):
923 case CLASS2 (rvc_nan, rvc_inf):
924 return nan_result;
926 case CLASS2 (rvc_normal, rvc_normal):
927 break;
929 default:
930 abort ();
933 if (a->sign != b->sign)
934 return -a->sign - -b->sign;
936 if (a->exp > b->exp)
937 ret = 1;
938 else if (a->exp < b->exp)
939 ret = -1;
940 else
941 ret = cmp_significands (a, b);
943 return (a->sign ? -ret : ret);
946 /* Return A truncated to an integral value toward zero. */
948 static void
949 do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
951 *r = *a;
953 switch (r->class)
955 case rvc_zero:
956 case rvc_inf:
957 case rvc_nan:
958 break;
960 case rvc_normal:
961 if (r->exp <= 0)
962 get_zero (r, r->sign);
963 else if (r->exp < SIGNIFICAND_BITS)
964 clear_significand_below (r, SIGNIFICAND_BITS - r->exp);
965 break;
967 default:
968 abort ();
972 /* Perform the binary or unary operation described by CODE.
973 For a unary operation, leave OP1 NULL. */
975 void
976 real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
977 const REAL_VALUE_TYPE *op1)
979 enum tree_code code = icode;
981 switch (code)
983 case PLUS_EXPR:
984 do_add (r, op0, op1, 0);
985 break;
987 case MINUS_EXPR:
988 do_add (r, op0, op1, 1);
989 break;
991 case MULT_EXPR:
992 do_multiply (r, op0, op1);
993 break;
995 case RDIV_EXPR:
996 do_divide (r, op0, op1);
997 break;
999 case MIN_EXPR:
1000 if (op1->class == rvc_nan)
1001 *r = *op1;
1002 else if (do_compare (op0, op1, -1) < 0)
1003 *r = *op0;
1004 else
1005 *r = *op1;
1006 break;
1008 case MAX_EXPR:
1009 if (op1->class == rvc_nan)
1010 *r = *op1;
1011 else if (do_compare (op0, op1, 1) < 0)
1012 *r = *op1;
1013 else
1014 *r = *op0;
1015 break;
1017 case NEGATE_EXPR:
1018 *r = *op0;
1019 r->sign ^= 1;
1020 break;
1022 case ABS_EXPR:
1023 *r = *op0;
1024 r->sign = 0;
1025 break;
1027 case FIX_TRUNC_EXPR:
1028 do_fix_trunc (r, op0);
1029 break;
1031 default:
1032 abort ();
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->class == rvc_nan || op1->class == rvc_nan;
1069 case ORDERED_EXPR:
1070 return op0->class != rvc_nan && op1->class != 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;
1082 default:
1083 abort ();
1087 /* Return floor log2(R). */
1090 real_exponent (const REAL_VALUE_TYPE *r)
1092 switch (r->class)
1094 case rvc_zero:
1095 return 0;
1096 case rvc_inf:
1097 case rvc_nan:
1098 return (unsigned int)-1 >> 1;
1099 case rvc_normal:
1100 return r->exp;
1101 default:
1102 abort ();
1106 /* R = OP0 * 2**EXP. */
1108 void
1109 real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
1111 *r = *op0;
1112 switch (r->class)
1114 case rvc_zero:
1115 case rvc_inf:
1116 case rvc_nan:
1117 break;
1119 case rvc_normal:
1120 exp += op0->exp;
1121 if (exp > MAX_EXP)
1122 get_inf (r, r->sign);
1123 else if (exp < -MAX_EXP)
1124 get_zero (r, r->sign);
1125 else
1126 r->exp = exp;
1127 break;
1129 default:
1130 abort ();
1134 /* Determine whether a floating-point value X is infinite. */
1136 bool
1137 real_isinf (const REAL_VALUE_TYPE *r)
1139 return (r->class == rvc_inf);
1142 /* Determine whether a floating-point value X is a NaN. */
1144 bool
1145 real_isnan (const REAL_VALUE_TYPE *r)
1147 return (r->class == rvc_nan);
1150 /* Determine whether a floating-point value X is negative. */
1152 bool
1153 real_isneg (const REAL_VALUE_TYPE *r)
1155 return r->sign;
1158 /* Determine whether a floating-point value X is minus zero. */
1160 bool
1161 real_isnegzero (const REAL_VALUE_TYPE *r)
1163 return r->sign && r->class == rvc_zero;
1166 /* Compare two floating-point objects for bitwise identity. */
1168 bool
1169 real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
1171 int i;
1173 if (a->class != b->class)
1174 return false;
1175 if (a->sign != b->sign)
1176 return false;
1178 switch (a->class)
1180 case rvc_zero:
1181 case rvc_inf:
1182 return true;
1184 case rvc_normal:
1185 if (a->exp != b->exp)
1186 return false;
1187 break;
1189 case rvc_nan:
1190 if (a->signalling != b->signalling)
1191 return false;
1192 /* The significand is ignored for canonical NaNs. */
1193 if (a->canonical || b->canonical)
1194 return a->canonical == b->canonical;
1195 break;
1197 default:
1198 abort ();
1201 for (i = 0; i < SIGSZ; ++i)
1202 if (a->sig[i] != b->sig[i])
1203 return false;
1205 return true;
1208 /* Try to change R into its exact multiplicative inverse in machine
1209 mode MODE. Return true if successful. */
1211 bool
1212 exact_real_inverse (enum machine_mode mode, REAL_VALUE_TYPE *r)
1214 const REAL_VALUE_TYPE *one = real_digit (1);
1215 REAL_VALUE_TYPE u;
1216 int i;
1218 if (r->class != rvc_normal)
1219 return false;
1221 /* Check for a power of two: all significand bits zero except the MSB. */
1222 for (i = 0; i < SIGSZ-1; ++i)
1223 if (r->sig[i] != 0)
1224 return false;
1225 if (r->sig[SIGSZ-1] != SIG_MSB)
1226 return false;
1228 /* Find the inverse and truncate to the required mode. */
1229 do_divide (&u, one, r);
1230 real_convert (&u, mode, &u);
1232 /* The rounding may have overflowed. */
1233 if (u.class != rvc_normal)
1234 return false;
1235 for (i = 0; i < SIGSZ-1; ++i)
1236 if (u.sig[i] != 0)
1237 return false;
1238 if (u.sig[SIGSZ-1] != SIG_MSB)
1239 return false;
1241 *r = u;
1242 return true;
1245 /* Render R as an integer. */
1247 HOST_WIDE_INT
1248 real_to_integer (const REAL_VALUE_TYPE *r)
1250 unsigned HOST_WIDE_INT i;
1252 switch (r->class)
1254 case rvc_zero:
1255 underflow:
1256 return 0;
1258 case rvc_inf:
1259 case rvc_nan:
1260 overflow:
1261 i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1262 if (!r->sign)
1263 i--;
1264 return i;
1266 case rvc_normal:
1267 if (r->exp <= 0)
1268 goto underflow;
1269 /* Only force overflow for unsigned overflow. Signed overflow is
1270 undefined, so it doesn't matter what we return, and some callers
1271 expect to be able to use this routine for both signed and
1272 unsigned conversions. */
1273 if (r->exp > HOST_BITS_PER_WIDE_INT)
1274 goto overflow;
1276 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1277 i = r->sig[SIGSZ-1];
1278 else if (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG)
1280 i = r->sig[SIGSZ-1];
1281 i = i << (HOST_BITS_PER_LONG - 1) << 1;
1282 i |= r->sig[SIGSZ-2];
1284 else
1285 abort ();
1287 i >>= HOST_BITS_PER_WIDE_INT - r->exp;
1289 if (r->sign)
1290 i = -i;
1291 return i;
1293 default:
1294 abort ();
1298 /* Likewise, but to an integer pair, HI+LOW. */
1300 void
1301 real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
1302 const REAL_VALUE_TYPE *r)
1304 REAL_VALUE_TYPE t;
1305 HOST_WIDE_INT low, high;
1306 int exp;
1308 switch (r->class)
1310 case rvc_zero:
1311 underflow:
1312 low = high = 0;
1313 break;
1315 case rvc_inf:
1316 case rvc_nan:
1317 overflow:
1318 high = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1319 if (r->sign)
1320 low = 0;
1321 else
1323 high--;
1324 low = -1;
1326 break;
1328 case rvc_normal:
1329 exp = r->exp;
1330 if (exp <= 0)
1331 goto underflow;
1332 /* Only force overflow for unsigned overflow. Signed overflow is
1333 undefined, so it doesn't matter what we return, and some callers
1334 expect to be able to use this routine for both signed and
1335 unsigned conversions. */
1336 if (exp > 2*HOST_BITS_PER_WIDE_INT)
1337 goto overflow;
1339 rshift_significand (&t, r, 2*HOST_BITS_PER_WIDE_INT - exp);
1340 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1342 high = t.sig[SIGSZ-1];
1343 low = t.sig[SIGSZ-2];
1345 else if (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG)
1347 high = t.sig[SIGSZ-1];
1348 high = high << (HOST_BITS_PER_LONG - 1) << 1;
1349 high |= t.sig[SIGSZ-2];
1351 low = t.sig[SIGSZ-3];
1352 low = low << (HOST_BITS_PER_LONG - 1) << 1;
1353 low |= t.sig[SIGSZ-4];
1355 else
1356 abort ();
1358 if (r->sign)
1360 if (low == 0)
1361 high = -high;
1362 else
1363 low = -low, high = ~high;
1365 break;
1367 default:
1368 abort ();
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 = num->exp, expd = den->exp;
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 num->exp = 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.class)
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 abort ();
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 = r.exp * 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 if (max_digits > buf_size)
1463 abort ();
1464 if (digits > max_digits)
1465 digits = max_digits;
1467 one = real_digit (1);
1468 ten = ten_to_ptwo (0);
1470 sign = r.sign;
1471 r.sign = 0;
1473 dec_exp = 0;
1474 pten = *one;
1476 cmp_one = do_compare (&r, one, 0);
1477 if (cmp_one > 0)
1479 int m;
1481 /* Number is greater than one. Convert significand to an integer
1482 and strip trailing decimal zeros. */
1484 u = r;
1485 u.exp = SIGNIFICAND_BITS - 1;
1487 /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
1488 m = floor_log2 (max_digits);
1490 /* Iterate over the bits of the possible powers of 10 that might
1491 be present in U and eliminate them. That is, if we find that
1492 10**2**M divides U evenly, keep the division and increase
1493 DEC_EXP by 2**M. */
1496 REAL_VALUE_TYPE t;
1498 do_divide (&t, &u, ten_to_ptwo (m));
1499 do_fix_trunc (&v, &t);
1500 if (cmp_significands (&v, &t) == 0)
1502 u = t;
1503 dec_exp += 1 << m;
1506 while (--m >= 0);
1508 /* Revert the scaling to integer that we performed earlier. */
1509 u.exp += r.exp - (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 (r.exp > 0)
1517 m = floor_log2 ((int)(r.exp * 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 (u.exp > 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)(-r.exp * 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 if (digit == 0)
1606 abort ();
1609 /* ... or overflow. */
1610 if (digit == 10)
1612 *p++ = '1';
1613 if (--digits > 0)
1614 *p++ = '0';
1615 dec_exp += 1;
1617 else if (digit > 10)
1618 abort ();
1619 else
1620 *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 = r->exp;
1692 char *p, *first;
1693 char exp_buf[16];
1694 size_t max_digits;
1696 switch (r->class)
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 abort ();
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 if (max_digits > buf_size)
1722 abort ();
1723 if (digits > max_digits)
1724 digits = max_digits;
1726 p = str;
1727 if (r->sign)
1728 *p++ = '-';
1729 *p++ = '0';
1730 *p++ = 'x';
1731 *p++ = '0';
1732 *p++ = '.';
1733 first = p;
1735 for (i = SIGSZ - 1; i >= 0; --i)
1736 for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
1738 *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
1739 if (--digits == 0)
1740 goto out;
1743 out:
1744 if (crop_trailing_zeros)
1745 while (p > first + 1 && p[-1] == '0')
1746 p--;
1748 sprintf (p, "p%+d", exp);
1751 /* Initialize R from a decimal or hexadecimal string. The string is
1752 assumed to have been syntax checked already. */
1754 void
1755 real_from_string (REAL_VALUE_TYPE *r, const char *str)
1757 int exp = 0;
1758 bool sign = false;
1760 get_zero (r, 0);
1762 if (*str == '-')
1764 sign = true;
1765 str++;
1767 else if (*str == '+')
1768 str++;
1770 if (str[0] == '0' && str[1] == 'x')
1772 /* Hexadecimal floating point. */
1773 int pos = SIGNIFICAND_BITS - 4, d;
1775 str += 2;
1777 while (*str == '0')
1778 str++;
1779 while (1)
1781 d = hex_value (*str);
1782 if (d == _hex_bad)
1783 break;
1784 if (pos >= 0)
1786 r->sig[pos / HOST_BITS_PER_LONG]
1787 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1788 pos -= 4;
1790 exp += 4;
1791 str++;
1793 if (*str == '.')
1795 str++;
1796 if (pos == SIGNIFICAND_BITS - 4)
1798 while (*str == '0')
1799 str++, exp -= 4;
1801 while (1)
1803 d = hex_value (*str);
1804 if (d == _hex_bad)
1805 break;
1806 if (pos >= 0)
1808 r->sig[pos / HOST_BITS_PER_LONG]
1809 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1810 pos -= 4;
1812 str++;
1815 if (*str == 'p' || *str == 'P')
1817 bool exp_neg = false;
1819 str++;
1820 if (*str == '-')
1822 exp_neg = true;
1823 str++;
1825 else if (*str == '+')
1826 str++;
1828 d = 0;
1829 while (ISDIGIT (*str))
1831 d *= 10;
1832 d += *str - '0';
1833 if (d > MAX_EXP)
1835 /* Overflowed the exponent. */
1836 if (exp_neg)
1837 goto underflow;
1838 else
1839 goto overflow;
1841 str++;
1843 if (exp_neg)
1844 d = -d;
1846 exp += d;
1849 r->class = rvc_normal;
1850 r->exp = exp;
1852 normalize (r);
1854 else
1856 /* Decimal floating point. */
1857 const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
1858 int d;
1860 while (*str == '0')
1861 str++;
1862 while (ISDIGIT (*str))
1864 d = *str++ - '0';
1865 do_multiply (r, r, ten);
1866 if (d)
1867 do_add (r, r, real_digit (d), 0);
1869 if (*str == '.')
1871 str++;
1872 if (r->class == rvc_zero)
1874 while (*str == '0')
1875 str++, exp--;
1877 while (ISDIGIT (*str))
1879 d = *str++ - '0';
1880 do_multiply (r, r, ten);
1881 if (d)
1882 do_add (r, r, real_digit (d), 0);
1883 exp--;
1887 if (*str == 'e' || *str == 'E')
1889 bool exp_neg = false;
1891 str++;
1892 if (*str == '-')
1894 exp_neg = true;
1895 str++;
1897 else if (*str == '+')
1898 str++;
1900 d = 0;
1901 while (ISDIGIT (*str))
1903 d *= 10;
1904 d += *str - '0';
1905 if (d > MAX_EXP)
1907 /* Overflowed the exponent. */
1908 if (exp_neg)
1909 goto underflow;
1910 else
1911 goto overflow;
1913 str++;
1915 if (exp_neg)
1916 d = -d;
1917 exp += d;
1920 if (exp)
1921 times_pten (r, exp);
1924 r->sign = sign;
1925 return;
1927 underflow:
1928 get_zero (r, sign);
1929 return;
1931 overflow:
1932 get_inf (r, sign);
1933 return;
1936 /* Legacy. Similar, but return the result directly. */
1938 REAL_VALUE_TYPE
1939 real_from_string2 (const char *s, enum machine_mode mode)
1941 REAL_VALUE_TYPE r;
1943 real_from_string (&r, s);
1944 if (mode != VOIDmode)
1945 real_convert (&r, mode, &r);
1947 return r;
1950 /* Initialize R from the integer pair HIGH+LOW. */
1952 void
1953 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
1954 unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
1955 int unsigned_p)
1957 if (low == 0 && high == 0)
1958 get_zero (r, 0);
1959 else
1961 r->class = rvc_normal;
1962 r->sign = high < 0 && !unsigned_p;
1963 r->exp = 2 * HOST_BITS_PER_WIDE_INT;
1965 if (r->sign)
1967 high = ~high;
1968 if (low == 0)
1969 high += 1;
1970 else
1971 low = -low;
1974 if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
1976 r->sig[SIGSZ-1] = high;
1977 r->sig[SIGSZ-2] = low;
1978 memset (r->sig, 0, sizeof(long)*(SIGSZ-2));
1980 else if (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));
1989 else
1990 abort ();
1992 normalize (r);
1995 if (mode != VOIDmode)
1996 real_convert (r, mode, r);
1999 /* Returns 10**2**N. */
2001 static const REAL_VALUE_TYPE *
2002 ten_to_ptwo (int n)
2004 static REAL_VALUE_TYPE tens[EXP_BITS];
2006 if (n < 0 || n >= EXP_BITS)
2007 abort ();
2009 if (tens[n].class == rvc_zero)
2011 if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2013 HOST_WIDE_INT t = 10;
2014 int i;
2016 for (i = 0; i < n; ++i)
2017 t *= t;
2019 real_from_integer (&tens[n], VOIDmode, t, 0, 1);
2021 else
2023 const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2024 do_multiply (&tens[n], t, t);
2028 return &tens[n];
2031 /* Returns 10**(-2**N). */
2033 static const REAL_VALUE_TYPE *
2034 ten_to_mptwo (int n)
2036 static REAL_VALUE_TYPE tens[EXP_BITS];
2038 if (n < 0 || n >= EXP_BITS)
2039 abort ();
2041 if (tens[n].class == rvc_zero)
2042 do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2044 return &tens[n];
2047 /* Returns N. */
2049 static const REAL_VALUE_TYPE *
2050 real_digit (int n)
2052 static REAL_VALUE_TYPE num[10];
2054 if (n < 0 || n > 9)
2055 abort ();
2057 if (n > 0 && num[n].class == rvc_zero)
2058 real_from_integer (&num[n], VOIDmode, n, 0, 1);
2060 return &num[n];
2063 /* Multiply R by 10**EXP. */
2065 static void
2066 times_pten (REAL_VALUE_TYPE *r, int exp)
2068 REAL_VALUE_TYPE pten, *rr;
2069 bool negative = (exp < 0);
2070 int i;
2072 if (negative)
2074 exp = -exp;
2075 pten = *real_digit (1);
2076 rr = &pten;
2078 else
2079 rr = r;
2081 for (i = 0; exp > 0; ++i, exp >>= 1)
2082 if (exp & 1)
2083 do_multiply (rr, rr, ten_to_ptwo (i));
2085 if (negative)
2086 do_divide (r, r, &pten);
2089 /* Fills R with +Inf. */
2091 void
2092 real_inf (REAL_VALUE_TYPE *r)
2094 get_inf (r, 0);
2097 /* Fills R with a NaN whose significand is described by STR. If QUIET,
2098 we force a QNaN, else we force an SNaN. The string, if not empty,
2099 is parsed as a number and placed in the significand. Return true
2100 if the string was successfully parsed. */
2102 bool
2103 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2104 enum machine_mode mode)
2106 const struct real_format *fmt;
2108 fmt = real_format_for_mode[mode - QFmode];
2109 if (fmt == NULL)
2110 abort ();
2112 if (*str == 0)
2114 if (quiet)
2115 get_canonical_qnan (r, 0);
2116 else
2117 get_canonical_snan (r, 0);
2119 else
2121 int base = 10, d;
2122 bool neg = false;
2124 memset (r, 0, sizeof (*r));
2125 r->class = rvc_nan;
2127 /* Parse akin to strtol into the significand of R. */
2129 while (ISSPACE (*str))
2130 str++;
2131 if (*str == '-')
2132 str++, neg = true;
2133 else if (*str == '+')
2134 str++;
2135 if (*str == '0')
2137 if (*++str == 'x')
2138 str++, base = 16;
2139 else
2140 base = 8;
2143 while ((d = hex_value (*str)) < base)
2145 REAL_VALUE_TYPE u;
2147 switch (base)
2149 case 8:
2150 lshift_significand (r, r, 3);
2151 break;
2152 case 16:
2153 lshift_significand (r, r, 4);
2154 break;
2155 case 10:
2156 lshift_significand_1 (&u, r);
2157 lshift_significand (r, r, 3);
2158 add_significands (r, r, &u);
2159 break;
2160 default:
2161 abort ();
2164 get_zero (&u, 0);
2165 u.sig[0] = d;
2166 add_significands (r, r, &u);
2168 str++;
2171 /* Must have consumed the entire string for success. */
2172 if (*str != 0)
2173 return false;
2175 /* Shift the significand into place such that the bits
2176 are in the most significant bits for the format. */
2177 lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
2179 /* Our MSB is always unset for NaNs. */
2180 r->sig[SIGSZ-1] &= ~SIG_MSB;
2182 /* Force quiet or signalling NaN. */
2183 r->signalling = !quiet;
2186 return true;
2189 /* Fills R with the largest finite value representable in mode MODE.
2190 If SIGN is nonzero, R is set to the most negative finite value. */
2192 void
2193 real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
2195 const struct real_format *fmt;
2196 int np2;
2198 fmt = real_format_for_mode[mode - QFmode];
2199 if (fmt == NULL)
2200 abort ();
2202 r->class = rvc_normal;
2203 r->sign = sign;
2204 r->signalling = 0;
2205 r->canonical = 0;
2206 r->exp = fmt->emax * fmt->log2_b;
2208 np2 = SIGNIFICAND_BITS - fmt->p * fmt->log2_b;
2209 memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
2210 clear_significand_below (r, np2);
2213 /* Fills R with 2**N. */
2215 void
2216 real_2expN (REAL_VALUE_TYPE *r, int n)
2218 memset (r, 0, sizeof (*r));
2220 n++;
2221 if (n > MAX_EXP)
2222 r->class = rvc_inf;
2223 else if (n < -MAX_EXP)
2225 else
2227 r->class = rvc_normal;
2228 r->exp = n;
2229 r->sig[SIGSZ-1] = SIG_MSB;
2234 static void
2235 round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
2237 int p2, np2, i, w;
2238 unsigned long sticky;
2239 bool guard, lsb;
2240 int emin2m1, emax2;
2242 p2 = fmt->p * fmt->log2_b;
2243 emin2m1 = (fmt->emin - 1) * fmt->log2_b;
2244 emax2 = fmt->emax * fmt->log2_b;
2246 np2 = SIGNIFICAND_BITS - p2;
2247 switch (r->class)
2249 underflow:
2250 get_zero (r, r->sign);
2251 case rvc_zero:
2252 if (!fmt->has_signed_zero)
2253 r->sign = 0;
2254 return;
2256 overflow:
2257 get_inf (r, r->sign);
2258 case rvc_inf:
2259 return;
2261 case rvc_nan:
2262 clear_significand_below (r, np2);
2263 return;
2265 case rvc_normal:
2266 break;
2268 default:
2269 abort ();
2272 /* If we're not base2, normalize the exponent to a multiple of
2273 the true base. */
2274 if (fmt->log2_b != 1)
2276 int shift = r->exp & (fmt->log2_b - 1);
2277 if (shift)
2279 shift = fmt->log2_b - shift;
2280 r->sig[0] |= sticky_rshift_significand (r, r, shift);
2281 r->exp += shift;
2285 /* Check the range of the exponent. If we're out of range,
2286 either underflow or overflow. */
2287 if (r->exp > emax2)
2288 goto overflow;
2289 else if (r->exp <= emin2m1)
2291 int diff;
2293 if (!fmt->has_denorm)
2295 /* Don't underflow completely until we've had a chance to round. */
2296 if (r->exp < emin2m1)
2297 goto underflow;
2299 else
2301 diff = emin2m1 - r->exp + 1;
2302 if (diff > p2)
2303 goto underflow;
2305 /* De-normalize the significand. */
2306 r->sig[0] |= sticky_rshift_significand (r, r, diff);
2307 r->exp += diff;
2311 /* There are P2 true significand bits, followed by one guard bit,
2312 followed by one sticky bit, followed by stuff. Fold nonzero
2313 stuff into the sticky bit. */
2315 sticky = 0;
2316 for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2317 sticky |= r->sig[i];
2318 sticky |=
2319 r->sig[w] & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2321 guard = test_significand_bit (r, np2 - 1);
2322 lsb = test_significand_bit (r, np2);
2324 /* Round to even. */
2325 if (guard && (sticky || lsb))
2327 REAL_VALUE_TYPE u;
2328 get_zero (&u, 0);
2329 set_significand_bit (&u, np2);
2331 if (add_significands (r, r, &u))
2333 /* Overflow. Means the significand had been all ones, and
2334 is now all zeros. Need to increase the exponent, and
2335 possibly re-normalize it. */
2336 if (++r->exp > emax2)
2337 goto overflow;
2338 r->sig[SIGSZ-1] = SIG_MSB;
2340 if (fmt->log2_b != 1)
2342 int shift = r->exp & (fmt->log2_b - 1);
2343 if (shift)
2345 shift = fmt->log2_b - shift;
2346 rshift_significand (r, r, shift);
2347 r->exp += shift;
2348 if (r->exp > emax2)
2349 goto overflow;
2355 /* Catch underflow that we deferred until after rounding. */
2356 if (r->exp <= emin2m1)
2357 goto underflow;
2359 /* Clear out trailing garbage. */
2360 clear_significand_below (r, np2);
2363 /* Extend or truncate to a new mode. */
2365 void
2366 real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
2367 const REAL_VALUE_TYPE *a)
2369 const struct real_format *fmt;
2371 fmt = real_format_for_mode[mode - QFmode];
2372 if (fmt == NULL)
2373 abort ();
2375 *r = *a;
2376 round_for_format (fmt, r);
2378 /* round_for_format de-normalizes denormals. Undo just that part. */
2379 if (r->class == rvc_normal)
2380 normalize (r);
2383 /* Legacy. Likewise, except return the struct directly. */
2385 REAL_VALUE_TYPE
2386 real_value_truncate (enum machine_mode mode, REAL_VALUE_TYPE a)
2388 REAL_VALUE_TYPE r;
2389 real_convert (&r, mode, &a);
2390 return r;
2393 /* Return true if truncating to MODE is exact. */
2395 bool
2396 exact_real_truncate (enum machine_mode mode, const REAL_VALUE_TYPE *a)
2398 REAL_VALUE_TYPE t;
2399 real_convert (&t, mode, a);
2400 return real_identical (&t, a);
2403 /* Write R to the given target format. Place the words of the result
2404 in target word order in BUF. There are always 32 bits in each
2405 long, no matter the size of the host long.
2407 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2409 long
2410 real_to_target_fmt (long *buf, const REAL_VALUE_TYPE *r_orig,
2411 const struct real_format *fmt)
2413 REAL_VALUE_TYPE r;
2414 long buf1;
2416 r = *r_orig;
2417 round_for_format (fmt, &r);
2419 if (!buf)
2420 buf = &buf1;
2421 (*fmt->encode) (fmt, buf, &r);
2423 return *buf;
2426 /* Similar, but look up the format from MODE. */
2428 long
2429 real_to_target (long *buf, const REAL_VALUE_TYPE *r, enum machine_mode mode)
2431 const struct real_format *fmt;
2433 fmt = real_format_for_mode[mode - QFmode];
2434 if (fmt == NULL)
2435 abort ();
2437 return real_to_target_fmt (buf, r, fmt);
2440 /* Read R from the given target format. Read the words of the result
2441 in target word order in BUF. There are always 32 bits in each
2442 long, no matter the size of the host long. */
2444 void
2445 real_from_target_fmt (REAL_VALUE_TYPE *r, const long *buf,
2446 const struct real_format *fmt)
2448 (*fmt->decode) (fmt, r, buf);
2451 /* Similar, but look up the format from MODE. */
2453 void
2454 real_from_target (REAL_VALUE_TYPE *r, const long *buf, enum machine_mode mode)
2456 const struct real_format *fmt;
2458 fmt = real_format_for_mode[mode - QFmode];
2459 if (fmt == NULL)
2460 abort ();
2462 (*fmt->decode) (fmt, r, buf);
2465 /* Return the number of bits in the significand for MODE. */
2466 /* ??? Legacy. Should get access to real_format directly. */
2469 significand_size (enum machine_mode mode)
2471 const struct real_format *fmt;
2473 fmt = real_format_for_mode[mode - QFmode];
2474 if (fmt == NULL)
2475 return 0;
2477 return fmt->p * fmt->log2_b;
2480 /* Return a hash value for the given real value. */
2481 /* ??? The "unsigned int" return value is intended to be hashval_t,
2482 but I didn't want to pull hashtab.h into real.h. */
2484 unsigned int
2485 real_hash (const REAL_VALUE_TYPE *r)
2487 unsigned int h;
2488 size_t i;
2490 h = r->class | (r->sign << 2);
2491 switch (r->class)
2493 case rvc_zero:
2494 case rvc_inf:
2495 return h;
2497 case rvc_normal:
2498 h |= r->exp << 3;
2499 break;
2501 case rvc_nan:
2502 if (r->signalling)
2503 h ^= (unsigned int)-1;
2504 if (r->canonical)
2505 return h;
2506 break;
2508 default:
2509 abort ();
2512 if (sizeof(unsigned long) > sizeof(unsigned int))
2513 for (i = 0; i < SIGSZ; ++i)
2515 unsigned long s = r->sig[i];
2516 h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2518 else
2519 for (i = 0; i < SIGSZ; ++i)
2520 h ^= r->sig[i];
2522 return h;
2525 /* IEEE single-precision format. */
2527 static void encode_ieee_single (const struct real_format *fmt,
2528 long *, const REAL_VALUE_TYPE *);
2529 static void decode_ieee_single (const struct real_format *,
2530 REAL_VALUE_TYPE *, const long *);
2532 static void
2533 encode_ieee_single (const struct real_format *fmt, long *buf,
2534 const REAL_VALUE_TYPE *r)
2536 unsigned long image, sig, exp;
2537 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2539 image = r->sign << 31;
2540 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2542 switch (r->class)
2544 case rvc_zero:
2545 break;
2547 case rvc_inf:
2548 if (fmt->has_inf)
2549 image |= 255 << 23;
2550 else
2551 image |= 0x7fffffff;
2552 break;
2554 case rvc_nan:
2555 if (fmt->has_nans)
2557 if (r->canonical)
2558 sig = 0;
2559 if (r->signalling == fmt->qnan_msb_set)
2560 sig &= ~(1 << 22);
2561 else
2562 sig |= 1 << 22;
2563 /* We overload qnan_msb_set here: it's only clear for
2564 mips_ieee_single, which wants all mantissa bits but the
2565 quiet/signalling one set in canonical NaNs (at least
2566 Quiet ones). */
2567 if (r->canonical && !fmt->qnan_msb_set)
2568 sig |= (1 << 22) - 1;
2569 else if (sig == 0)
2570 sig = 1 << 21;
2572 image |= 255 << 23;
2573 image |= sig;
2575 else
2576 image |= 0x7fffffff;
2577 break;
2579 case rvc_normal:
2580 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2581 whereas the intermediate representation is 0.F x 2**exp.
2582 Which means we're off by one. */
2583 if (denormal)
2584 exp = 0;
2585 else
2586 exp = r->exp + 127 - 1;
2587 image |= exp << 23;
2588 image |= sig;
2589 break;
2591 default:
2592 abort ();
2595 buf[0] = image;
2598 static void
2599 decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2600 const long *buf)
2602 unsigned long image = buf[0] & 0xffffffff;
2603 bool sign = (image >> 31) & 1;
2604 int exp = (image >> 23) & 0xff;
2606 memset (r, 0, sizeof (*r));
2607 image <<= HOST_BITS_PER_LONG - 24;
2608 image &= ~SIG_MSB;
2610 if (exp == 0)
2612 if (image && fmt->has_denorm)
2614 r->class = rvc_normal;
2615 r->sign = sign;
2616 r->exp = -126;
2617 r->sig[SIGSZ-1] = image << 1;
2618 normalize (r);
2620 else if (fmt->has_signed_zero)
2621 r->sign = sign;
2623 else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
2625 if (image)
2627 r->class = rvc_nan;
2628 r->sign = sign;
2629 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
2630 ^ fmt->qnan_msb_set);
2631 r->sig[SIGSZ-1] = image;
2633 else
2635 r->class = rvc_inf;
2636 r->sign = sign;
2639 else
2641 r->class = rvc_normal;
2642 r->sign = sign;
2643 r->exp = exp - 127 + 1;
2644 r->sig[SIGSZ-1] = image | SIG_MSB;
2648 const struct real_format ieee_single_format =
2650 encode_ieee_single,
2651 decode_ieee_single,
2656 -125,
2657 128,
2659 true,
2660 true,
2661 true,
2662 true,
2663 true
2666 const struct real_format mips_single_format =
2668 encode_ieee_single,
2669 decode_ieee_single,
2674 -125,
2675 128,
2677 true,
2678 true,
2679 true,
2680 true,
2681 false
2685 /* IEEE double-precision format. */
2687 static void encode_ieee_double (const struct real_format *fmt,
2688 long *, const REAL_VALUE_TYPE *);
2689 static void decode_ieee_double (const struct real_format *,
2690 REAL_VALUE_TYPE *, const long *);
2692 static void
2693 encode_ieee_double (const struct real_format *fmt, long *buf,
2694 const REAL_VALUE_TYPE *r)
2696 unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
2697 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2699 image_hi = r->sign << 31;
2700 image_lo = 0;
2702 if (HOST_BITS_PER_LONG == 64)
2704 sig_hi = r->sig[SIGSZ-1];
2705 sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
2706 sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
2708 else
2710 sig_hi = r->sig[SIGSZ-1];
2711 sig_lo = r->sig[SIGSZ-2];
2712 sig_lo = (sig_hi << 21) | (sig_lo >> 11);
2713 sig_hi = (sig_hi >> 11) & 0xfffff;
2716 switch (r->class)
2718 case rvc_zero:
2719 break;
2721 case rvc_inf:
2722 if (fmt->has_inf)
2723 image_hi |= 2047 << 20;
2724 else
2726 image_hi |= 0x7fffffff;
2727 image_lo = 0xffffffff;
2729 break;
2731 case rvc_nan:
2732 if (fmt->has_nans)
2734 if (r->canonical)
2735 sig_hi = sig_lo = 0;
2736 if (r->signalling == fmt->qnan_msb_set)
2737 sig_hi &= ~(1 << 19);
2738 else
2739 sig_hi |= 1 << 19;
2740 /* We overload qnan_msb_set here: it's only clear for
2741 mips_ieee_single, which wants all mantissa bits but the
2742 quiet/signalling one set in canonical NaNs (at least
2743 Quiet ones). */
2744 if (r->canonical && !fmt->qnan_msb_set)
2746 sig_hi |= (1 << 19) - 1;
2747 sig_lo = 0xffffffff;
2749 else if (sig_hi == 0 && sig_lo == 0)
2750 sig_hi = 1 << 18;
2752 image_hi |= 2047 << 20;
2753 image_hi |= sig_hi;
2754 image_lo = sig_lo;
2756 else
2758 image_hi |= 0x7fffffff;
2759 image_lo = 0xffffffff;
2761 break;
2763 case rvc_normal:
2764 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2765 whereas the intermediate representation is 0.F x 2**exp.
2766 Which means we're off by one. */
2767 if (denormal)
2768 exp = 0;
2769 else
2770 exp = r->exp + 1023 - 1;
2771 image_hi |= exp << 20;
2772 image_hi |= sig_hi;
2773 image_lo = sig_lo;
2774 break;
2776 default:
2777 abort ();
2780 if (FLOAT_WORDS_BIG_ENDIAN)
2781 buf[0] = image_hi, buf[1] = image_lo;
2782 else
2783 buf[0] = image_lo, buf[1] = image_hi;
2786 static void
2787 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2788 const long *buf)
2790 unsigned long image_hi, image_lo;
2791 bool sign;
2792 int exp;
2794 if (FLOAT_WORDS_BIG_ENDIAN)
2795 image_hi = buf[0], image_lo = buf[1];
2796 else
2797 image_lo = buf[0], image_hi = buf[1];
2798 image_lo &= 0xffffffff;
2799 image_hi &= 0xffffffff;
2801 sign = (image_hi >> 31) & 1;
2802 exp = (image_hi >> 20) & 0x7ff;
2804 memset (r, 0, sizeof (*r));
2806 image_hi <<= 32 - 21;
2807 image_hi |= image_lo >> 21;
2808 image_hi &= 0x7fffffff;
2809 image_lo <<= 32 - 21;
2811 if (exp == 0)
2813 if ((image_hi || image_lo) && fmt->has_denorm)
2815 r->class = rvc_normal;
2816 r->sign = sign;
2817 r->exp = -1022;
2818 if (HOST_BITS_PER_LONG == 32)
2820 image_hi = (image_hi << 1) | (image_lo >> 31);
2821 image_lo <<= 1;
2822 r->sig[SIGSZ-1] = image_hi;
2823 r->sig[SIGSZ-2] = image_lo;
2825 else
2827 image_hi = (image_hi << 31 << 2) | (image_lo << 1);
2828 r->sig[SIGSZ-1] = image_hi;
2830 normalize (r);
2832 else if (fmt->has_signed_zero)
2833 r->sign = sign;
2835 else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
2837 if (image_hi || image_lo)
2839 r->class = rvc_nan;
2840 r->sign = sign;
2841 r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
2842 if (HOST_BITS_PER_LONG == 32)
2844 r->sig[SIGSZ-1] = image_hi;
2845 r->sig[SIGSZ-2] = image_lo;
2847 else
2848 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
2850 else
2852 r->class = rvc_inf;
2853 r->sign = sign;
2856 else
2858 r->class = rvc_normal;
2859 r->sign = sign;
2860 r->exp = exp - 1023 + 1;
2861 if (HOST_BITS_PER_LONG == 32)
2863 r->sig[SIGSZ-1] = image_hi | SIG_MSB;
2864 r->sig[SIGSZ-2] = image_lo;
2866 else
2867 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
2871 const struct real_format ieee_double_format =
2873 encode_ieee_double,
2874 decode_ieee_double,
2879 -1021,
2880 1024,
2882 true,
2883 true,
2884 true,
2885 true,
2886 true
2889 const struct real_format mips_double_format =
2891 encode_ieee_double,
2892 decode_ieee_double,
2897 -1021,
2898 1024,
2900 true,
2901 true,
2902 true,
2903 true,
2904 false
2908 /* IEEE extended double precision format. This comes in three
2909 flavors: Intel's as a 12 byte image, Intel's as a 16 byte image,
2910 and Motorola's. */
2912 static void encode_ieee_extended (const struct real_format *fmt,
2913 long *, const REAL_VALUE_TYPE *);
2914 static void decode_ieee_extended (const struct real_format *,
2915 REAL_VALUE_TYPE *, const long *);
2917 static void encode_ieee_extended_128 (const struct real_format *fmt,
2918 long *, const REAL_VALUE_TYPE *);
2919 static void decode_ieee_extended_128 (const struct real_format *,
2920 REAL_VALUE_TYPE *, const long *);
2922 static void
2923 encode_ieee_extended (const struct real_format *fmt, long *buf,
2924 const REAL_VALUE_TYPE *r)
2926 unsigned long image_hi, sig_hi, sig_lo;
2927 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2929 image_hi = r->sign << 15;
2930 sig_hi = sig_lo = 0;
2932 switch (r->class)
2934 case rvc_zero:
2935 break;
2937 case rvc_inf:
2938 if (fmt->has_inf)
2940 image_hi |= 32767;
2942 /* Intel requires the explicit integer bit to be set, otherwise
2943 it considers the value a "pseudo-infinity". Motorola docs
2944 say it doesn't care. */
2945 sig_hi = 0x80000000;
2947 else
2949 image_hi |= 32767;
2950 sig_lo = sig_hi = 0xffffffff;
2952 break;
2954 case rvc_nan:
2955 if (fmt->has_nans)
2957 image_hi |= 32767;
2958 if (HOST_BITS_PER_LONG == 32)
2960 sig_hi = r->sig[SIGSZ-1];
2961 sig_lo = r->sig[SIGSZ-2];
2963 else
2965 sig_lo = r->sig[SIGSZ-1];
2966 sig_hi = sig_lo >> 31 >> 1;
2967 sig_lo &= 0xffffffff;
2969 if (r->signalling == fmt->qnan_msb_set)
2970 sig_hi &= ~(1 << 30);
2971 else
2972 sig_hi |= 1 << 30;
2973 if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
2974 sig_hi = 1 << 29;
2976 /* Intel requires the explicit integer bit to be set, otherwise
2977 it considers the value a "pseudo-nan". Motorola docs say it
2978 doesn't care. */
2979 sig_hi |= 0x80000000;
2981 else
2983 image_hi |= 32767;
2984 sig_lo = sig_hi = 0xffffffff;
2986 break;
2988 case rvc_normal:
2990 int exp = r->exp;
2992 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2993 whereas the intermediate representation is 0.F x 2**exp.
2994 Which means we're off by one.
2996 Except for Motorola, which consider exp=0 and explicit
2997 integer bit set to continue to be normalized. In theory
2998 this discrepancy has been taken care of by the difference
2999 in fmt->emin in round_for_format. */
3001 if (denormal)
3002 exp = 0;
3003 else
3005 exp += 16383 - 1;
3006 if (exp < 0)
3007 abort ();
3009 image_hi |= exp;
3011 if (HOST_BITS_PER_LONG == 32)
3013 sig_hi = r->sig[SIGSZ-1];
3014 sig_lo = r->sig[SIGSZ-2];
3016 else
3018 sig_lo = r->sig[SIGSZ-1];
3019 sig_hi = sig_lo >> 31 >> 1;
3020 sig_lo &= 0xffffffff;
3023 break;
3025 default:
3026 abort ();
3029 if (FLOAT_WORDS_BIG_ENDIAN)
3030 buf[0] = image_hi << 16, buf[1] = sig_hi, buf[2] = sig_lo;
3031 else
3032 buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3035 static void
3036 encode_ieee_extended_128 (const struct real_format *fmt, long *buf,
3037 const REAL_VALUE_TYPE *r)
3039 buf[3 * !FLOAT_WORDS_BIG_ENDIAN] = 0;
3040 encode_ieee_extended (fmt, buf+!!FLOAT_WORDS_BIG_ENDIAN, r);
3043 static void
3044 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3045 const long *buf)
3047 unsigned long image_hi, sig_hi, sig_lo;
3048 bool sign;
3049 int exp;
3051 if (FLOAT_WORDS_BIG_ENDIAN)
3052 image_hi = buf[0] >> 16, sig_hi = buf[1], sig_lo = buf[2];
3053 else
3054 sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3055 sig_lo &= 0xffffffff;
3056 sig_hi &= 0xffffffff;
3057 image_hi &= 0xffffffff;
3059 sign = (image_hi >> 15) & 1;
3060 exp = image_hi & 0x7fff;
3062 memset (r, 0, sizeof (*r));
3064 if (exp == 0)
3066 if ((sig_hi || sig_lo) && fmt->has_denorm)
3068 r->class = rvc_normal;
3069 r->sign = sign;
3071 /* When the IEEE format contains a hidden bit, we know that
3072 it's zero at this point, and so shift up the significand
3073 and decrease the exponent to match. In this case, Motorola
3074 defines the explicit integer bit to be valid, so we don't
3075 know whether the msb is set or not. */
3076 r->exp = fmt->emin;
3077 if (HOST_BITS_PER_LONG == 32)
3079 r->sig[SIGSZ-1] = sig_hi;
3080 r->sig[SIGSZ-2] = sig_lo;
3082 else
3083 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3085 normalize (r);
3087 else if (fmt->has_signed_zero)
3088 r->sign = sign;
3090 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3092 /* See above re "pseudo-infinities" and "pseudo-nans".
3093 Short summary is that the MSB will likely always be
3094 set, and that we don't care about it. */
3095 sig_hi &= 0x7fffffff;
3097 if (sig_hi || sig_lo)
3099 r->class = rvc_nan;
3100 r->sign = sign;
3101 r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3102 if (HOST_BITS_PER_LONG == 32)
3104 r->sig[SIGSZ-1] = sig_hi;
3105 r->sig[SIGSZ-2] = sig_lo;
3107 else
3108 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3110 else
3112 r->class = rvc_inf;
3113 r->sign = sign;
3116 else
3118 r->class = rvc_normal;
3119 r->sign = sign;
3120 r->exp = exp - 16383 + 1;
3121 if (HOST_BITS_PER_LONG == 32)
3123 r->sig[SIGSZ-1] = sig_hi;
3124 r->sig[SIGSZ-2] = sig_lo;
3126 else
3127 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3131 static void
3132 decode_ieee_extended_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3133 const long *buf)
3135 decode_ieee_extended (fmt, r, buf+!!FLOAT_WORDS_BIG_ENDIAN);
3138 const struct real_format ieee_extended_motorola_format =
3140 encode_ieee_extended,
3141 decode_ieee_extended,
3146 -16382,
3147 16384,
3149 true,
3150 true,
3151 true,
3152 true,
3153 true
3156 const struct real_format ieee_extended_intel_96_format =
3158 encode_ieee_extended,
3159 decode_ieee_extended,
3164 -16381,
3165 16384,
3167 true,
3168 true,
3169 true,
3170 true,
3171 true
3174 const struct real_format ieee_extended_intel_128_format =
3176 encode_ieee_extended_128,
3177 decode_ieee_extended_128,
3182 -16381,
3183 16384,
3185 true,
3186 true,
3187 true,
3188 true,
3189 true
3192 /* The following caters to i386 systems that set the rounding precision
3193 to 53 bits instead of 64, e.g. FreeBSD. */
3194 const struct real_format ieee_extended_intel_96_round_53_format =
3196 encode_ieee_extended,
3197 decode_ieee_extended,
3202 -16381,
3203 16384,
3205 true,
3206 true,
3207 true,
3208 true,
3209 true
3212 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3213 numbers whose sum is equal to the extended precision value. The number
3214 with greater magnitude is first. This format has the same magnitude
3215 range as an IEEE double precision value, but effectively 106 bits of
3216 significand precision. Infinity and NaN are represented by their IEEE
3217 double precision value stored in the first number, the second number is
3218 ignored. Zeroes, Infinities, and NaNs are set in both doubles
3219 due to precedent. */
3221 static void encode_ibm_extended (const struct real_format *fmt,
3222 long *, const REAL_VALUE_TYPE *);
3223 static void decode_ibm_extended (const struct real_format *,
3224 REAL_VALUE_TYPE *, const long *);
3226 static void
3227 encode_ibm_extended (const struct real_format *fmt, long *buf,
3228 const REAL_VALUE_TYPE *r)
3230 REAL_VALUE_TYPE u, v;
3231 const struct real_format *base_fmt;
3233 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3235 switch (r->class)
3237 case rvc_zero:
3238 /* Both doubles have sign bit set. */
3239 buf[0] = FLOAT_WORDS_BIG_ENDIAN ? r->sign << 31 : 0;
3240 buf[1] = FLOAT_WORDS_BIG_ENDIAN ? 0 : r->sign << 31;
3241 buf[2] = buf[0];
3242 buf[3] = buf[1];
3243 break;
3245 case rvc_inf:
3246 case rvc_nan:
3247 /* Both doubles set to Inf / NaN. */
3248 encode_ieee_double (base_fmt, &buf[0], r);
3249 buf[2] = buf[0];
3250 buf[3] = buf[1];
3251 return;
3253 case rvc_normal:
3254 /* u = IEEE double precision portion of significand. */
3255 u = *r;
3256 clear_significand_below (&u, SIGNIFICAND_BITS - 53);
3258 normalize (&u);
3259 /* If the upper double is zero, we have a denormal double, so
3260 move it to the first double and leave the second as zero. */
3261 if (u.class == rvc_zero)
3263 v = u;
3264 u = *r;
3265 normalize (&u);
3267 else
3269 /* v = remainder containing additional 53 bits of significand. */
3270 do_add (&v, r, &u, 1);
3271 round_for_format (base_fmt, &v);
3274 round_for_format (base_fmt, &u);
3276 encode_ieee_double (base_fmt, &buf[0], &u);
3277 encode_ieee_double (base_fmt, &buf[2], &v);
3278 break;
3280 default:
3281 abort ();
3285 static void
3286 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3287 const long *buf)
3289 REAL_VALUE_TYPE u, v;
3290 const struct real_format *base_fmt;
3292 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3293 decode_ieee_double (base_fmt, &u, &buf[0]);
3295 if (u.class != rvc_zero && u.class != rvc_inf && u.class != rvc_nan)
3297 decode_ieee_double (base_fmt, &v, &buf[2]);
3298 do_add (r, &u, &v, 0);
3300 else
3301 *r = u;
3304 const struct real_format ibm_extended_format =
3306 encode_ibm_extended,
3307 decode_ibm_extended,
3310 53 + 53,
3312 -1021 + 53,
3313 1024,
3315 true,
3316 true,
3317 true,
3318 true,
3319 true
3322 const struct real_format mips_extended_format =
3324 encode_ibm_extended,
3325 decode_ibm_extended,
3328 53 + 53,
3330 -1021 + 53,
3331 1024,
3333 true,
3334 true,
3335 true,
3336 true,
3337 false
3341 /* IEEE quad precision format. */
3343 static void encode_ieee_quad (const struct real_format *fmt,
3344 long *, const REAL_VALUE_TYPE *);
3345 static void decode_ieee_quad (const struct real_format *,
3346 REAL_VALUE_TYPE *, const long *);
3348 static void
3349 encode_ieee_quad (const struct real_format *fmt, long *buf,
3350 const REAL_VALUE_TYPE *r)
3352 unsigned long image3, image2, image1, image0, exp;
3353 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3354 REAL_VALUE_TYPE u;
3356 image3 = r->sign << 31;
3357 image2 = 0;
3358 image1 = 0;
3359 image0 = 0;
3361 rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3363 switch (r->class)
3365 case rvc_zero:
3366 break;
3368 case rvc_inf:
3369 if (fmt->has_inf)
3370 image3 |= 32767 << 16;
3371 else
3373 image3 |= 0x7fffffff;
3374 image2 = 0xffffffff;
3375 image1 = 0xffffffff;
3376 image0 = 0xffffffff;
3378 break;
3380 case rvc_nan:
3381 if (fmt->has_nans)
3383 image3 |= 32767 << 16;
3385 if (r->canonical)
3387 /* Don't use bits from the significand. The
3388 initialization above is right. */
3390 else if (HOST_BITS_PER_LONG == 32)
3392 image0 = u.sig[0];
3393 image1 = u.sig[1];
3394 image2 = u.sig[2];
3395 image3 |= u.sig[3] & 0xffff;
3397 else
3399 image0 = u.sig[0];
3400 image1 = image0 >> 31 >> 1;
3401 image2 = u.sig[1];
3402 image3 |= (image2 >> 31 >> 1) & 0xffff;
3403 image0 &= 0xffffffff;
3404 image2 &= 0xffffffff;
3406 if (r->signalling == fmt->qnan_msb_set)
3407 image3 &= ~0x8000;
3408 else
3409 image3 |= 0x8000;
3410 /* We overload qnan_msb_set here: it's only clear for
3411 mips_ieee_single, which wants all mantissa bits but the
3412 quiet/signalling one set in canonical NaNs (at least
3413 Quiet ones). */
3414 if (r->canonical && !fmt->qnan_msb_set)
3416 image3 |= 0x7fff;
3417 image2 = image1 = image0 = 0xffffffff;
3419 else if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3420 image3 |= 0x4000;
3422 else
3424 image3 |= 0x7fffffff;
3425 image2 = 0xffffffff;
3426 image1 = 0xffffffff;
3427 image0 = 0xffffffff;
3429 break;
3431 case rvc_normal:
3432 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3433 whereas the intermediate representation is 0.F x 2**exp.
3434 Which means we're off by one. */
3435 if (denormal)
3436 exp = 0;
3437 else
3438 exp = r->exp + 16383 - 1;
3439 image3 |= exp << 16;
3441 if (HOST_BITS_PER_LONG == 32)
3443 image0 = u.sig[0];
3444 image1 = u.sig[1];
3445 image2 = u.sig[2];
3446 image3 |= u.sig[3] & 0xffff;
3448 else
3450 image0 = u.sig[0];
3451 image1 = image0 >> 31 >> 1;
3452 image2 = u.sig[1];
3453 image3 |= (image2 >> 31 >> 1) & 0xffff;
3454 image0 &= 0xffffffff;
3455 image2 &= 0xffffffff;
3457 break;
3459 default:
3460 abort ();
3463 if (FLOAT_WORDS_BIG_ENDIAN)
3465 buf[0] = image3;
3466 buf[1] = image2;
3467 buf[2] = image1;
3468 buf[3] = image0;
3470 else
3472 buf[0] = image0;
3473 buf[1] = image1;
3474 buf[2] = image2;
3475 buf[3] = image3;
3479 static void
3480 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3481 const long *buf)
3483 unsigned long image3, image2, image1, image0;
3484 bool sign;
3485 int exp;
3487 if (FLOAT_WORDS_BIG_ENDIAN)
3489 image3 = buf[0];
3490 image2 = buf[1];
3491 image1 = buf[2];
3492 image0 = buf[3];
3494 else
3496 image0 = buf[0];
3497 image1 = buf[1];
3498 image2 = buf[2];
3499 image3 = buf[3];
3501 image0 &= 0xffffffff;
3502 image1 &= 0xffffffff;
3503 image2 &= 0xffffffff;
3505 sign = (image3 >> 31) & 1;
3506 exp = (image3 >> 16) & 0x7fff;
3507 image3 &= 0xffff;
3509 memset (r, 0, sizeof (*r));
3511 if (exp == 0)
3513 if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
3515 r->class = rvc_normal;
3516 r->sign = sign;
3518 r->exp = -16382 + (SIGNIFICAND_BITS - 112);
3519 if (HOST_BITS_PER_LONG == 32)
3521 r->sig[0] = image0;
3522 r->sig[1] = image1;
3523 r->sig[2] = image2;
3524 r->sig[3] = image3;
3526 else
3528 r->sig[0] = (image1 << 31 << 1) | image0;
3529 r->sig[1] = (image3 << 31 << 1) | image2;
3532 normalize (r);
3534 else if (fmt->has_signed_zero)
3535 r->sign = sign;
3537 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3539 if (image3 | image2 | image1 | image0)
3541 r->class = rvc_nan;
3542 r->sign = sign;
3543 r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
3545 if (HOST_BITS_PER_LONG == 32)
3547 r->sig[0] = image0;
3548 r->sig[1] = image1;
3549 r->sig[2] = image2;
3550 r->sig[3] = image3;
3552 else
3554 r->sig[0] = (image1 << 31 << 1) | image0;
3555 r->sig[1] = (image3 << 31 << 1) | image2;
3557 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3559 else
3561 r->class = rvc_inf;
3562 r->sign = sign;
3565 else
3567 r->class = rvc_normal;
3568 r->sign = sign;
3569 r->exp = exp - 16383 + 1;
3571 if (HOST_BITS_PER_LONG == 32)
3573 r->sig[0] = image0;
3574 r->sig[1] = image1;
3575 r->sig[2] = image2;
3576 r->sig[3] = image3;
3578 else
3580 r->sig[0] = (image1 << 31 << 1) | image0;
3581 r->sig[1] = (image3 << 31 << 1) | image2;
3583 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3584 r->sig[SIGSZ-1] |= SIG_MSB;
3588 const struct real_format ieee_quad_format =
3590 encode_ieee_quad,
3591 decode_ieee_quad,
3594 113,
3595 113,
3596 -16381,
3597 16384,
3598 127,
3599 true,
3600 true,
3601 true,
3602 true,
3603 true
3606 const struct real_format mips_quad_format =
3608 encode_ieee_quad,
3609 decode_ieee_quad,
3612 113,
3613 113,
3614 -16381,
3615 16384,
3616 127,
3617 true,
3618 true,
3619 true,
3620 true,
3621 false
3624 /* Descriptions of VAX floating point formats can be found beginning at
3626 http://www.openvms.compaq.com:8000/73final/4515/4515pro_013.html#f_floating_point_format
3628 The thing to remember is that they're almost IEEE, except for word
3629 order, exponent bias, and the lack of infinities, nans, and denormals.
3631 We don't implement the H_floating format here, simply because neither
3632 the VAX or Alpha ports use it. */
3634 static void encode_vax_f (const struct real_format *fmt,
3635 long *, const REAL_VALUE_TYPE *);
3636 static void decode_vax_f (const struct real_format *,
3637 REAL_VALUE_TYPE *, const long *);
3638 static void encode_vax_d (const struct real_format *fmt,
3639 long *, const REAL_VALUE_TYPE *);
3640 static void decode_vax_d (const struct real_format *,
3641 REAL_VALUE_TYPE *, const long *);
3642 static void encode_vax_g (const struct real_format *fmt,
3643 long *, const REAL_VALUE_TYPE *);
3644 static void decode_vax_g (const struct real_format *,
3645 REAL_VALUE_TYPE *, const long *);
3647 static void
3648 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3649 const REAL_VALUE_TYPE *r)
3651 unsigned long sign, exp, sig, image;
3653 sign = r->sign << 15;
3655 switch (r->class)
3657 case rvc_zero:
3658 image = 0;
3659 break;
3661 case rvc_inf:
3662 case rvc_nan:
3663 image = 0xffff7fff | sign;
3664 break;
3666 case rvc_normal:
3667 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
3668 exp = r->exp + 128;
3670 image = (sig << 16) & 0xffff0000;
3671 image |= sign;
3672 image |= exp << 7;
3673 image |= sig >> 16;
3674 break;
3676 default:
3677 abort ();
3680 buf[0] = image;
3683 static void
3684 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
3685 REAL_VALUE_TYPE *r, const long *buf)
3687 unsigned long image = buf[0] & 0xffffffff;
3688 int exp = (image >> 7) & 0xff;
3690 memset (r, 0, sizeof (*r));
3692 if (exp != 0)
3694 r->class = rvc_normal;
3695 r->sign = (image >> 15) & 1;
3696 r->exp = exp - 128;
3698 image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
3699 r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
3703 static void
3704 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3705 const REAL_VALUE_TYPE *r)
3707 unsigned long image0, image1, sign = r->sign << 15;
3709 switch (r->class)
3711 case rvc_zero:
3712 image0 = image1 = 0;
3713 break;
3715 case rvc_inf:
3716 case rvc_nan:
3717 image0 = 0xffff7fff | sign;
3718 image1 = 0xffffffff;
3719 break;
3721 case rvc_normal:
3722 /* Extract the significand into straight hi:lo. */
3723 if (HOST_BITS_PER_LONG == 64)
3725 image0 = r->sig[SIGSZ-1];
3726 image1 = (image0 >> (64 - 56)) & 0xffffffff;
3727 image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
3729 else
3731 image0 = r->sig[SIGSZ-1];
3732 image1 = r->sig[SIGSZ-2];
3733 image1 = (image0 << 24) | (image1 >> 8);
3734 image0 = (image0 >> 8) & 0xffffff;
3737 /* Rearrange the half-words of the significand to match the
3738 external format. */
3739 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
3740 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3742 /* Add the sign and exponent. */
3743 image0 |= sign;
3744 image0 |= (r->exp + 128) << 7;
3745 break;
3747 default:
3748 abort ();
3751 if (FLOAT_WORDS_BIG_ENDIAN)
3752 buf[0] = image1, buf[1] = image0;
3753 else
3754 buf[0] = image0, buf[1] = image1;
3757 static void
3758 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
3759 REAL_VALUE_TYPE *r, const long *buf)
3761 unsigned long image0, image1;
3762 int exp;
3764 if (FLOAT_WORDS_BIG_ENDIAN)
3765 image1 = buf[0], image0 = buf[1];
3766 else
3767 image0 = buf[0], image1 = buf[1];
3768 image0 &= 0xffffffff;
3769 image1 &= 0xffffffff;
3771 exp = (image0 >> 7) & 0x7f;
3773 memset (r, 0, sizeof (*r));
3775 if (exp != 0)
3777 r->class = rvc_normal;
3778 r->sign = (image0 >> 15) & 1;
3779 r->exp = exp - 128;
3781 /* Rearrange the half-words of the external format into
3782 proper ascending order. */
3783 image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
3784 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3786 if (HOST_BITS_PER_LONG == 64)
3788 image0 = (image0 << 31 << 1) | image1;
3789 image0 <<= 64 - 56;
3790 image0 |= SIG_MSB;
3791 r->sig[SIGSZ-1] = image0;
3793 else
3795 r->sig[SIGSZ-1] = image0;
3796 r->sig[SIGSZ-2] = image1;
3797 lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
3798 r->sig[SIGSZ-1] |= SIG_MSB;
3803 static void
3804 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3805 const REAL_VALUE_TYPE *r)
3807 unsigned long image0, image1, sign = r->sign << 15;
3809 switch (r->class)
3811 case rvc_zero:
3812 image0 = image1 = 0;
3813 break;
3815 case rvc_inf:
3816 case rvc_nan:
3817 image0 = 0xffff7fff | sign;
3818 image1 = 0xffffffff;
3819 break;
3821 case rvc_normal:
3822 /* Extract the significand into straight hi:lo. */
3823 if (HOST_BITS_PER_LONG == 64)
3825 image0 = r->sig[SIGSZ-1];
3826 image1 = (image0 >> (64 - 53)) & 0xffffffff;
3827 image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
3829 else
3831 image0 = r->sig[SIGSZ-1];
3832 image1 = r->sig[SIGSZ-2];
3833 image1 = (image0 << 21) | (image1 >> 11);
3834 image0 = (image0 >> 11) & 0xfffff;
3837 /* Rearrange the half-words of the significand to match the
3838 external format. */
3839 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
3840 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3842 /* Add the sign and exponent. */
3843 image0 |= sign;
3844 image0 |= (r->exp + 1024) << 4;
3845 break;
3847 default:
3848 abort ();
3851 if (FLOAT_WORDS_BIG_ENDIAN)
3852 buf[0] = image1, buf[1] = image0;
3853 else
3854 buf[0] = image0, buf[1] = image1;
3857 static void
3858 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
3859 REAL_VALUE_TYPE *r, const long *buf)
3861 unsigned long image0, image1;
3862 int exp;
3864 if (FLOAT_WORDS_BIG_ENDIAN)
3865 image1 = buf[0], image0 = buf[1];
3866 else
3867 image0 = buf[0], image1 = buf[1];
3868 image0 &= 0xffffffff;
3869 image1 &= 0xffffffff;
3871 exp = (image0 >> 4) & 0x7ff;
3873 memset (r, 0, sizeof (*r));
3875 if (exp != 0)
3877 r->class = rvc_normal;
3878 r->sign = (image0 >> 15) & 1;
3879 r->exp = exp - 1024;
3881 /* Rearrange the half-words of the external format into
3882 proper ascending order. */
3883 image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
3884 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3886 if (HOST_BITS_PER_LONG == 64)
3888 image0 = (image0 << 31 << 1) | image1;
3889 image0 <<= 64 - 53;
3890 image0 |= SIG_MSB;
3891 r->sig[SIGSZ-1] = image0;
3893 else
3895 r->sig[SIGSZ-1] = image0;
3896 r->sig[SIGSZ-2] = image1;
3897 lshift_significand (r, r, 64 - 53);
3898 r->sig[SIGSZ-1] |= SIG_MSB;
3903 const struct real_format vax_f_format =
3905 encode_vax_f,
3906 decode_vax_f,
3911 -127,
3912 127,
3914 false,
3915 false,
3916 false,
3917 false,
3918 false
3921 const struct real_format vax_d_format =
3923 encode_vax_d,
3924 decode_vax_d,
3929 -127,
3930 127,
3932 false,
3933 false,
3934 false,
3935 false,
3936 false
3939 const struct real_format vax_g_format =
3941 encode_vax_g,
3942 decode_vax_g,
3947 -1023,
3948 1023,
3950 false,
3951 false,
3952 false,
3953 false,
3954 false
3957 /* A good reference for these can be found in chapter 9 of
3958 "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
3959 An on-line version can be found here:
3961 http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
3964 static void encode_i370_single (const struct real_format *fmt,
3965 long *, const REAL_VALUE_TYPE *);
3966 static void decode_i370_single (const struct real_format *,
3967 REAL_VALUE_TYPE *, const long *);
3968 static void encode_i370_double (const struct real_format *fmt,
3969 long *, const REAL_VALUE_TYPE *);
3970 static void decode_i370_double (const struct real_format *,
3971 REAL_VALUE_TYPE *, const long *);
3973 static void
3974 encode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
3975 long *buf, const REAL_VALUE_TYPE *r)
3977 unsigned long sign, exp, sig, image;
3979 sign = r->sign << 31;
3981 switch (r->class)
3983 case rvc_zero:
3984 image = 0;
3985 break;
3987 case rvc_inf:
3988 case rvc_nan:
3989 image = 0x7fffffff | sign;
3990 break;
3992 case rvc_normal:
3993 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
3994 exp = ((r->exp / 4) + 64) << 24;
3995 image = sign | exp | sig;
3996 break;
3998 default:
3999 abort ();
4002 buf[0] = image;
4005 static void
4006 decode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4007 REAL_VALUE_TYPE *r, const long *buf)
4009 unsigned long sign, sig, image = buf[0];
4010 int exp;
4012 sign = (image >> 31) & 1;
4013 exp = (image >> 24) & 0x7f;
4014 sig = image & 0xffffff;
4016 memset (r, 0, sizeof (*r));
4018 if (exp || sig)
4020 r->class = rvc_normal;
4021 r->sign = sign;
4022 r->exp = (exp - 64) * 4;
4023 r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
4024 normalize (r);
4028 static void
4029 encode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4030 long *buf, const REAL_VALUE_TYPE *r)
4032 unsigned long sign, exp, image_hi, image_lo;
4034 sign = r->sign << 31;
4036 switch (r->class)
4038 case rvc_zero:
4039 image_hi = image_lo = 0;
4040 break;
4042 case rvc_inf:
4043 case rvc_nan:
4044 image_hi = 0x7fffffff | sign;
4045 image_lo = 0xffffffff;
4046 break;
4048 case rvc_normal:
4049 if (HOST_BITS_PER_LONG == 64)
4051 image_hi = r->sig[SIGSZ-1];
4052 image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
4053 image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
4055 else
4057 image_hi = r->sig[SIGSZ-1];
4058 image_lo = r->sig[SIGSZ-2];
4059 image_lo = (image_lo >> 8) | (image_hi << 24);
4060 image_hi >>= 8;
4063 exp = ((r->exp / 4) + 64) << 24;
4064 image_hi |= sign | exp;
4065 break;
4067 default:
4068 abort ();
4071 if (FLOAT_WORDS_BIG_ENDIAN)
4072 buf[0] = image_hi, buf[1] = image_lo;
4073 else
4074 buf[0] = image_lo, buf[1] = image_hi;
4077 static void
4078 decode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4079 REAL_VALUE_TYPE *r, const long *buf)
4081 unsigned long sign, image_hi, image_lo;
4082 int exp;
4084 if (FLOAT_WORDS_BIG_ENDIAN)
4085 image_hi = buf[0], image_lo = buf[1];
4086 else
4087 image_lo = buf[0], image_hi = buf[1];
4089 sign = (image_hi >> 31) & 1;
4090 exp = (image_hi >> 24) & 0x7f;
4091 image_hi &= 0xffffff;
4092 image_lo &= 0xffffffff;
4094 memset (r, 0, sizeof (*r));
4096 if (exp || image_hi || image_lo)
4098 r->class = rvc_normal;
4099 r->sign = sign;
4100 r->exp = (exp - 64) * 4 + (SIGNIFICAND_BITS - 56);
4102 if (HOST_BITS_PER_LONG == 32)
4104 r->sig[0] = image_lo;
4105 r->sig[1] = image_hi;
4107 else
4108 r->sig[0] = image_lo | (image_hi << 31 << 1);
4110 normalize (r);
4114 const struct real_format i370_single_format =
4116 encode_i370_single,
4117 decode_i370_single,
4122 -64,
4125 false,
4126 false,
4127 false, /* ??? The encoding does allow for "unnormals". */
4128 false, /* ??? The encoding does allow for "unnormals". */
4129 false
4132 const struct real_format i370_double_format =
4134 encode_i370_double,
4135 decode_i370_double,
4140 -64,
4143 false,
4144 false,
4145 false, /* ??? The encoding does allow for "unnormals". */
4146 false, /* ??? The encoding does allow for "unnormals". */
4147 false
4150 /* The "twos-complement" c4x format is officially defined as
4152 x = s(~s).f * 2**e
4154 This is rather misleading. One must remember that F is signed.
4155 A better description would be
4157 x = -1**s * ((s + 1 + .f) * 2**e
4159 So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
4160 that's -1 * (1+1+(-.5)) == -1.5. I think.
4162 The constructions here are taken from Tables 5-1 and 5-2 of the
4163 TMS320C4x User's Guide wherein step-by-step instructions for
4164 conversion from IEEE are presented. That's close enough to our
4165 internal representation so as to make things easy.
4167 See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf */
4169 static void encode_c4x_single (const struct real_format *fmt,
4170 long *, const REAL_VALUE_TYPE *);
4171 static void decode_c4x_single (const struct real_format *,
4172 REAL_VALUE_TYPE *, const long *);
4173 static void encode_c4x_extended (const struct real_format *fmt,
4174 long *, const REAL_VALUE_TYPE *);
4175 static void decode_c4x_extended (const struct real_format *,
4176 REAL_VALUE_TYPE *, const long *);
4178 static void
4179 encode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4180 long *buf, const REAL_VALUE_TYPE *r)
4182 unsigned long image, exp, sig;
4184 switch (r->class)
4186 case rvc_zero:
4187 exp = -128;
4188 sig = 0;
4189 break;
4191 case rvc_inf:
4192 case rvc_nan:
4193 exp = 127;
4194 sig = 0x800000 - r->sign;
4195 break;
4197 case rvc_normal:
4198 exp = r->exp - 1;
4199 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4200 if (r->sign)
4202 if (sig)
4203 sig = -sig;
4204 else
4205 exp--;
4206 sig |= 0x800000;
4208 break;
4210 default:
4211 abort ();
4214 image = ((exp & 0xff) << 24) | (sig & 0xffffff);
4215 buf[0] = image;
4218 static void
4219 decode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4220 REAL_VALUE_TYPE *r, const long *buf)
4222 unsigned long image = buf[0];
4223 unsigned long sig;
4224 int exp, sf;
4226 exp = (((image >> 24) & 0xff) ^ 0x80) - 0x80;
4227 sf = ((image & 0xffffff) ^ 0x800000) - 0x800000;
4229 memset (r, 0, sizeof (*r));
4231 if (exp != -128)
4233 r->class = rvc_normal;
4235 sig = sf & 0x7fffff;
4236 if (sf < 0)
4238 r->sign = 1;
4239 if (sig)
4240 sig = -sig;
4241 else
4242 exp++;
4244 sig = (sig << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4246 r->exp = exp + 1;
4247 r->sig[SIGSZ-1] = sig;
4251 static void
4252 encode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4253 long *buf, const REAL_VALUE_TYPE *r)
4255 unsigned long exp, sig;
4257 switch (r->class)
4259 case rvc_zero:
4260 exp = -128;
4261 sig = 0;
4262 break;
4264 case rvc_inf:
4265 case rvc_nan:
4266 exp = 127;
4267 sig = 0x80000000 - r->sign;
4268 break;
4270 case rvc_normal:
4271 exp = r->exp - 1;
4273 sig = r->sig[SIGSZ-1];
4274 if (HOST_BITS_PER_LONG == 64)
4275 sig = sig >> 1 >> 31;
4276 sig &= 0x7fffffff;
4278 if (r->sign)
4280 if (sig)
4281 sig = -sig;
4282 else
4283 exp--;
4284 sig |= 0x80000000;
4286 break;
4288 default:
4289 abort ();
4292 exp = (exp & 0xff) << 24;
4293 sig &= 0xffffffff;
4295 if (FLOAT_WORDS_BIG_ENDIAN)
4296 buf[0] = exp, buf[1] = sig;
4297 else
4298 buf[0] = sig, buf[0] = exp;
4301 static void
4302 decode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4303 REAL_VALUE_TYPE *r, const long *buf)
4305 unsigned long sig;
4306 int exp, sf;
4308 if (FLOAT_WORDS_BIG_ENDIAN)
4309 exp = buf[0], sf = buf[1];
4310 else
4311 sf = buf[0], exp = buf[1];
4313 exp = (((exp >> 24) & 0xff) & 0x80) - 0x80;
4314 sf = ((sf & 0xffffffff) ^ 0x80000000) - 0x80000000;
4316 memset (r, 0, sizeof (*r));
4318 if (exp != -128)
4320 r->class = rvc_normal;
4322 sig = sf & 0x7fffffff;
4323 if (sf < 0)
4325 r->sign = 1;
4326 if (sig)
4327 sig = -sig;
4328 else
4329 exp++;
4331 if (HOST_BITS_PER_LONG == 64)
4332 sig = sig << 1 << 31;
4333 sig |= SIG_MSB;
4335 r->exp = exp + 1;
4336 r->sig[SIGSZ-1] = sig;
4340 const struct real_format c4x_single_format =
4342 encode_c4x_single,
4343 decode_c4x_single,
4348 -126,
4349 128,
4351 false,
4352 false,
4353 false,
4354 false,
4355 false
4358 const struct real_format c4x_extended_format =
4360 encode_c4x_extended,
4361 decode_c4x_extended,
4366 -126,
4367 128,
4369 false,
4370 false,
4371 false,
4372 false,
4373 false
4377 /* A synthetic "format" for internal arithmetic. It's the size of the
4378 internal significand minus the two bits needed for proper rounding.
4379 The encode and decode routines exist only to satisfy our paranoia
4380 harness. */
4382 static void encode_internal (const struct real_format *fmt,
4383 long *, const REAL_VALUE_TYPE *);
4384 static void decode_internal (const struct real_format *,
4385 REAL_VALUE_TYPE *, const long *);
4387 static void
4388 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4389 const REAL_VALUE_TYPE *r)
4391 memcpy (buf, r, sizeof (*r));
4394 static void
4395 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4396 REAL_VALUE_TYPE *r, const long *buf)
4398 memcpy (r, buf, sizeof (*r));
4401 const struct real_format real_internal_format =
4403 encode_internal,
4404 decode_internal,
4407 SIGNIFICAND_BITS - 2,
4408 SIGNIFICAND_BITS - 2,
4409 -MAX_EXP,
4410 MAX_EXP,
4412 true,
4413 true,
4414 false,
4415 true,
4416 true
4419 /* Set up default mode to format mapping for IEEE. Everyone else has
4420 to set these values in OVERRIDE_OPTIONS. */
4422 const struct real_format *real_format_for_mode[TFmode - QFmode + 1] =
4424 NULL, /* QFmode */
4425 NULL, /* HFmode */
4426 NULL, /* TQFmode */
4427 &ieee_single_format, /* SFmode */
4428 &ieee_double_format, /* DFmode */
4430 /* We explicitly don't handle XFmode. There are two formats,
4431 pretty much equally common. Choose one in OVERRIDE_OPTIONS. */
4432 NULL, /* XFmode */
4433 &ieee_quad_format /* TFmode */
4437 /* Calculate the square root of X in mode MODE, and store the result
4438 in R. Return TRUE if the operation does not raise an exception.
4439 For details see "High Precision Division and Square Root",
4440 Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June
4441 1993. http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf. */
4443 bool
4444 real_sqrt (REAL_VALUE_TYPE *r, enum machine_mode mode,
4445 const REAL_VALUE_TYPE *x)
4447 static REAL_VALUE_TYPE halfthree;
4448 static bool init = false;
4449 REAL_VALUE_TYPE h, t, i;
4450 int iter, exp;
4452 /* sqrt(-0.0) is -0.0. */
4453 if (real_isnegzero (x))
4455 *r = *x;
4456 return false;
4459 /* Negative arguments return NaN. */
4460 if (real_isneg (x))
4462 /* Mode is ignored for canonical NaN. */
4463 real_nan (r, "", 1, SFmode);
4464 return false;
4467 /* Infinity and NaN return themselves. */
4468 if (real_isinf (x) || real_isnan (x))
4470 *r = *x;
4471 return false;
4474 if (!init)
4476 do_add (&halfthree, &dconst1, &dconsthalf, 0);
4477 init = true;
4480 /* Initial guess for reciprocal sqrt, i. */
4481 exp = real_exponent (x);
4482 real_ldexp (&i, &dconst1, -exp/2);
4484 /* Newton's iteration for reciprocal sqrt, i. */
4485 for (iter = 0; iter < 16; iter++)
4487 /* i(n+1) = i(n) * (1.5 - 0.5*i(n)*i(n)*x). */
4488 do_multiply (&t, x, &i);
4489 do_multiply (&h, &t, &i);
4490 do_multiply (&t, &h, &dconsthalf);
4491 do_add (&h, &halfthree, &t, 1);
4492 do_multiply (&t, &i, &h);
4494 /* Check for early convergence. */
4495 if (iter >= 6 && real_identical (&i, &t))
4496 break;
4498 /* ??? Unroll loop to avoid copying. */
4499 i = t;
4502 /* Final iteration: r = i*x + 0.5*i*x*(1.0 - i*(i*x)). */
4503 do_multiply (&t, x, &i);
4504 do_multiply (&h, &t, &i);
4505 do_add (&i, &dconst1, &h, 1);
4506 do_multiply (&h, &t, &i);
4507 do_multiply (&i, &dconsthalf, &h);
4508 do_add (&h, &t, &i, 0);
4510 /* ??? We need a Tuckerman test to get the last bit. */
4512 real_convert (r, mode, &h);
4513 return true;
4516 /* Calculate X raised to the integer exponent N in mode MODE and store
4517 the result in R. Return true if the result may be inexact due to
4518 loss of precision. The algorithm is the classic "left-to-right binary
4519 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4520 Algorithms", "The Art of Computer Programming", Volume 2. */
4522 bool
4523 real_powi (REAL_VALUE_TYPE *r, enum machine_mode mode,
4524 const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4526 unsigned HOST_WIDE_INT bit;
4527 REAL_VALUE_TYPE t;
4528 bool inexact = false;
4529 bool init = false;
4530 bool neg;
4531 int i;
4533 if (n == 0)
4535 *r = dconst1;
4536 return false;
4538 else if (n < 0)
4540 /* Don't worry about overflow, from now on n is unsigned. */
4541 neg = true;
4542 n = -n;
4544 else
4545 neg = false;
4547 t = *x;
4548 bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4549 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4551 if (init)
4553 inexact |= do_multiply (&t, &t, &t);
4554 if (n & bit)
4555 inexact |= do_multiply (&t, &t, x);
4557 else if (n & bit)
4558 init = true;
4559 bit >>= 1;
4562 if (neg)
4563 inexact |= do_divide (&t, &dconst1, &t);
4565 real_convert (r, mode, &t);
4566 return inexact;
4569 /* Round X to the nearest integer not larger in absolute value, i.e.
4570 towards zero, placing the result in R in mode MODE. */
4572 void
4573 real_trunc (REAL_VALUE_TYPE *r, enum machine_mode mode,
4574 const REAL_VALUE_TYPE *x)
4576 do_fix_trunc (r, x);
4577 if (mode != VOIDmode)
4578 real_convert (r, mode, r);
4581 /* Round X to the largest integer not greater in value, i.e. round
4582 down, placing the result in R in mode MODE. */
4584 void
4585 real_floor (REAL_VALUE_TYPE *r, enum machine_mode mode,
4586 const REAL_VALUE_TYPE *x)
4588 do_fix_trunc (r, x);
4589 if (! real_identical (r, x) && r->sign)
4590 do_add (r, r, &dconstm1, 0);
4591 if (mode != VOIDmode)
4592 real_convert (r, mode, r);
4595 /* Round X to the smallest integer not less then argument, i.e. round
4596 up, placing the result in R in mode MODE. */
4598 void
4599 real_ceil (REAL_VALUE_TYPE *r, enum machine_mode mode,
4600 const REAL_VALUE_TYPE *x)
4602 do_fix_trunc (r, x);
4603 if (! real_identical (r, x) && ! r->sign)
4604 do_add (r, r, &dconst1, 0);
4605 if (mode != VOIDmode)
4606 real_convert (r, mode, r);