PR c/13282
[official-gcc.git] / gcc / real.c
blob2eb2019399f7454e2f608bc8ede3da29ee6d09ee
1 /* real.c - software floating point emulation.
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
4 Contributed by Stephen L. Moshier (moshier@world.std.com).
5 Re-written by Richard Henderson <rth@redhat.com>
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, USA. */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "toplev.h"
30 #include "real.h"
31 #include "tm_p.h"
33 /* The floating point model used internally is not exactly IEEE 754
34 compliant, and close to the description in the ISO C99 standard,
35 section 5.2.4.2.2 Characteristics of floating types.
37 Specifically
39 x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
41 where
42 s = sign (+- 1)
43 b = base or radix, here always 2
44 e = exponent
45 p = precision (the number of base-b digits in the significand)
46 f_k = the digits of the significand.
48 We differ from typical IEEE 754 encodings in that the entire
49 significand is fractional. Normalized significands are in the
50 range [0.5, 1.0).
52 A requirement of the model is that P be larger than the largest
53 supported target floating-point type by at least 2 bits. This gives
54 us proper rounding when we truncate to the target type. In addition,
55 E must be large enough to hold the smallest supported denormal number
56 in a normalized form.
58 Both of these requirements are easily satisfied. The largest target
59 significand is 113 bits; we store at least 160. The smallest
60 denormal number fits in 17 exponent bits; we store 27.
62 Note that the decimal string conversion routines are sensitive to
63 rounding errors. Since the raw arithmetic routines do not themselves
64 have guard digits or rounding, the computation of 10**exp can
65 accumulate more than a few digits of error. The previous incarnation
66 of real.c successfully used a 144-bit fraction; given the current
67 layout of REAL_VALUE_TYPE we're forced to expand to at least 160 bits.
69 Target floating point models that use base 16 instead of base 2
70 (i.e. IBM 370), are handled during round_for_format, in which we
71 canonicalize the exponent to be a multiple of 4 (log2(16)), and
72 adjust the significand to match. */
75 /* Used to classify two numbers simultaneously. */
76 #define CLASS2(A, B) ((A) << 2 | (B))
78 #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
79 #error "Some constant folding done by hand to avoid shift count warnings"
80 #endif
82 static void get_zero (REAL_VALUE_TYPE *, int);
83 static void get_canonical_qnan (REAL_VALUE_TYPE *, int);
84 static void get_canonical_snan (REAL_VALUE_TYPE *, int);
85 static void get_inf (REAL_VALUE_TYPE *, int);
86 static bool sticky_rshift_significand (REAL_VALUE_TYPE *,
87 const REAL_VALUE_TYPE *, unsigned int);
88 static void rshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
89 unsigned int);
90 static void lshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
91 unsigned int);
92 static void lshift_significand_1 (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
93 static bool add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *,
94 const REAL_VALUE_TYPE *);
95 static bool sub_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
96 const REAL_VALUE_TYPE *, int);
97 static void neg_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
98 static int cmp_significands (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
99 static int cmp_significand_0 (const REAL_VALUE_TYPE *);
100 static void set_significand_bit (REAL_VALUE_TYPE *, unsigned int);
101 static void clear_significand_bit (REAL_VALUE_TYPE *, unsigned int);
102 static bool test_significand_bit (REAL_VALUE_TYPE *, unsigned int);
103 static void clear_significand_below (REAL_VALUE_TYPE *, unsigned int);
104 static bool div_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
105 const REAL_VALUE_TYPE *);
106 static void normalize (REAL_VALUE_TYPE *);
108 static bool do_add (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
109 const REAL_VALUE_TYPE *, int);
110 static bool do_multiply (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
111 const REAL_VALUE_TYPE *);
112 static bool do_divide (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
113 const REAL_VALUE_TYPE *);
114 static int do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
115 static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
117 static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *);
119 static const REAL_VALUE_TYPE * ten_to_ptwo (int);
120 static const REAL_VALUE_TYPE * ten_to_mptwo (int);
121 static const REAL_VALUE_TYPE * real_digit (int);
122 static void times_pten (REAL_VALUE_TYPE *, int);
124 static void round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
126 /* Initialize R with a positive zero. */
128 static inline void
129 get_zero (REAL_VALUE_TYPE *r, int sign)
131 memset (r, 0, sizeof (*r));
132 r->sign = sign;
135 /* Initialize R with the canonical quiet NaN. */
137 static inline void
138 get_canonical_qnan (REAL_VALUE_TYPE *r, int sign)
140 memset (r, 0, sizeof (*r));
141 r->cl = rvc_nan;
142 r->sign = sign;
143 r->canonical = 1;
146 static inline void
147 get_canonical_snan (REAL_VALUE_TYPE *r, int sign)
149 memset (r, 0, sizeof (*r));
150 r->cl = rvc_nan;
151 r->sign = sign;
152 r->signalling = 1;
153 r->canonical = 1;
156 static inline void
157 get_inf (REAL_VALUE_TYPE *r, int sign)
159 memset (r, 0, sizeof (*r));
160 r->cl = rvc_inf;
161 r->sign = sign;
165 /* Right-shift the significand of A by N bits; put the result in the
166 significand of R. If any one bits are shifted out, return true. */
168 static bool
169 sticky_rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
170 unsigned int n)
172 unsigned long sticky = 0;
173 unsigned int i, ofs = 0;
175 if (n >= HOST_BITS_PER_LONG)
177 for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i)
178 sticky |= a->sig[i];
179 n &= HOST_BITS_PER_LONG - 1;
182 if (n != 0)
184 sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1);
185 for (i = 0; i < SIGSZ; ++i)
187 r->sig[i]
188 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
189 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
190 << (HOST_BITS_PER_LONG - n)));
193 else
195 for (i = 0; ofs + i < SIGSZ; ++i)
196 r->sig[i] = a->sig[ofs + i];
197 for (; i < SIGSZ; ++i)
198 r->sig[i] = 0;
201 return sticky != 0;
204 /* Right-shift the significand of A by N bits; put the result in the
205 significand of R. */
207 static void
208 rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
209 unsigned int n)
211 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
213 n &= HOST_BITS_PER_LONG - 1;
214 if (n != 0)
216 for (i = 0; i < SIGSZ; ++i)
218 r->sig[i]
219 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
220 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
221 << (HOST_BITS_PER_LONG - n)));
224 else
226 for (i = 0; ofs + i < SIGSZ; ++i)
227 r->sig[i] = a->sig[ofs + i];
228 for (; i < SIGSZ; ++i)
229 r->sig[i] = 0;
233 /* Left-shift the significand of A by N bits; put the result in the
234 significand of R. */
236 static void
237 lshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
238 unsigned int n)
240 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
242 n &= HOST_BITS_PER_LONG - 1;
243 if (n == 0)
245 for (i = 0; ofs + i < SIGSZ; ++i)
246 r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs];
247 for (; i < SIGSZ; ++i)
248 r->sig[SIGSZ-1-i] = 0;
250 else
251 for (i = 0; i < SIGSZ; ++i)
253 r->sig[SIGSZ-1-i]
254 = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n)
255 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1])
256 >> (HOST_BITS_PER_LONG - n)));
260 /* Likewise, but N is specialized to 1. */
262 static inline void
263 lshift_significand_1 (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
265 unsigned int i;
267 for (i = SIGSZ - 1; i > 0; --i)
268 r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1));
269 r->sig[0] = a->sig[0] << 1;
272 /* Add the significands of A and B, placing the result in R. Return
273 true if there was carry out of the most significant word. */
275 static inline bool
276 add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
277 const REAL_VALUE_TYPE *b)
279 bool carry = false;
280 int i;
282 for (i = 0; i < SIGSZ; ++i)
284 unsigned long ai = a->sig[i];
285 unsigned long ri = ai + b->sig[i];
287 if (carry)
289 carry = ri < ai;
290 carry |= ++ri == 0;
292 else
293 carry = ri < ai;
295 r->sig[i] = ri;
298 return carry;
301 /* Subtract the significands of A and B, placing the result in R. CARRY is
302 true if there's a borrow incoming to the least significant word.
303 Return true if there was borrow out of the most significant word. */
305 static inline bool
306 sub_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
307 const REAL_VALUE_TYPE *b, int carry)
309 int i;
311 for (i = 0; i < SIGSZ; ++i)
313 unsigned long ai = a->sig[i];
314 unsigned long ri = ai - b->sig[i];
316 if (carry)
318 carry = ri > ai;
319 carry |= ~--ri == 0;
321 else
322 carry = ri > ai;
324 r->sig[i] = ri;
327 return carry;
330 /* Negate the significand A, placing the result in R. */
332 static inline void
333 neg_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
335 bool carry = true;
336 int i;
338 for (i = 0; i < SIGSZ; ++i)
340 unsigned long ri, ai = a->sig[i];
342 if (carry)
344 if (ai)
346 ri = -ai;
347 carry = false;
349 else
350 ri = ai;
352 else
353 ri = ~ai;
355 r->sig[i] = ri;
359 /* Compare significands. Return tri-state vs zero. */
361 static inline int
362 cmp_significands (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
364 int i;
366 for (i = SIGSZ - 1; i >= 0; --i)
368 unsigned long ai = a->sig[i];
369 unsigned long bi = b->sig[i];
371 if (ai > bi)
372 return 1;
373 if (ai < bi)
374 return -1;
377 return 0;
380 /* Return true if A is nonzero. */
382 static inline int
383 cmp_significand_0 (const REAL_VALUE_TYPE *a)
385 int i;
387 for (i = SIGSZ - 1; i >= 0; --i)
388 if (a->sig[i])
389 return 1;
391 return 0;
394 /* Set bit N of the significand of R. */
396 static inline void
397 set_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
399 r->sig[n / HOST_BITS_PER_LONG]
400 |= (unsigned long)1 << (n % HOST_BITS_PER_LONG);
403 /* Clear bit N of the significand of R. */
405 static inline void
406 clear_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
408 r->sig[n / HOST_BITS_PER_LONG]
409 &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG));
412 /* Test bit N of the significand of R. */
414 static inline bool
415 test_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
417 /* ??? Compiler bug here if we return this expression directly.
418 The conversion to bool strips the "&1" and we wind up testing
419 e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */
420 int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1;
421 return t;
424 /* Clear bits 0..N-1 of the significand of R. */
426 static void
427 clear_significand_below (REAL_VALUE_TYPE *r, unsigned int n)
429 int i, w = n / HOST_BITS_PER_LONG;
431 for (i = 0; i < w; ++i)
432 r->sig[i] = 0;
434 r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1);
437 /* Divide the significands of A and B, placing the result in R. Return
438 true if the division was inexact. */
440 static inline bool
441 div_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
442 const REAL_VALUE_TYPE *b)
444 REAL_VALUE_TYPE u;
445 int i, bit = SIGNIFICAND_BITS - 1;
446 unsigned long msb, inexact;
448 u = *a;
449 memset (r->sig, 0, sizeof (r->sig));
451 msb = 0;
452 goto start;
455 msb = u.sig[SIGSZ-1] & SIG_MSB;
456 lshift_significand_1 (&u, &u);
457 start:
458 if (msb || cmp_significands (&u, b) >= 0)
460 sub_significands (&u, &u, b, 0);
461 set_significand_bit (r, bit);
464 while (--bit >= 0);
466 for (i = 0, inexact = 0; i < SIGSZ; i++)
467 inexact |= u.sig[i];
469 return inexact != 0;
472 /* Adjust the exponent and significand of R such that the most
473 significant bit is set. We underflow to zero and overflow to
474 infinity here, without denormals. (The intermediate representation
475 exponent is large enough to handle target denormals normalized.) */
477 static void
478 normalize (REAL_VALUE_TYPE *r)
480 int shift = 0, exp;
481 int i, j;
483 /* Find the first word that is nonzero. */
484 for (i = SIGSZ - 1; i >= 0; i--)
485 if (r->sig[i] == 0)
486 shift += HOST_BITS_PER_LONG;
487 else
488 break;
490 /* Zero significand flushes to zero. */
491 if (i < 0)
493 r->cl = rvc_zero;
494 SET_REAL_EXP (r, 0);
495 return;
498 /* Find the first bit that is nonzero. */
499 for (j = 0; ; j++)
500 if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j)))
501 break;
502 shift += j;
504 if (shift > 0)
506 exp = REAL_EXP (r) - shift;
507 if (exp > MAX_EXP)
508 get_inf (r, r->sign);
509 else if (exp < -MAX_EXP)
510 get_zero (r, r->sign);
511 else
513 SET_REAL_EXP (r, exp);
514 lshift_significand (r, r, shift);
519 /* Calculate R = A + (SUBTRACT_P ? -B : B). Return true if the
520 result may be inexact due to a loss of precision. */
522 static bool
523 do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
524 const REAL_VALUE_TYPE *b, int subtract_p)
526 int dexp, sign, exp;
527 REAL_VALUE_TYPE t;
528 bool inexact = false;
530 /* Determine if we need to add or subtract. */
531 sign = a->sign;
532 subtract_p = (sign ^ b->sign) ^ subtract_p;
534 switch (CLASS2 (a->cl, b->cl))
536 case CLASS2 (rvc_zero, rvc_zero):
537 /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0. */
538 get_zero (r, sign & !subtract_p);
539 return false;
541 case CLASS2 (rvc_zero, rvc_normal):
542 case CLASS2 (rvc_zero, rvc_inf):
543 case CLASS2 (rvc_zero, rvc_nan):
544 /* 0 + ANY = ANY. */
545 case CLASS2 (rvc_normal, rvc_nan):
546 case CLASS2 (rvc_inf, rvc_nan):
547 case CLASS2 (rvc_nan, rvc_nan):
548 /* ANY + NaN = NaN. */
549 case CLASS2 (rvc_normal, rvc_inf):
550 /* R + Inf = Inf. */
551 *r = *b;
552 r->sign = sign ^ subtract_p;
553 return false;
555 case CLASS2 (rvc_normal, rvc_zero):
556 case CLASS2 (rvc_inf, rvc_zero):
557 case CLASS2 (rvc_nan, rvc_zero):
558 /* ANY + 0 = ANY. */
559 case CLASS2 (rvc_nan, rvc_normal):
560 case CLASS2 (rvc_nan, rvc_inf):
561 /* NaN + ANY = NaN. */
562 case CLASS2 (rvc_inf, rvc_normal):
563 /* Inf + R = Inf. */
564 *r = *a;
565 return false;
567 case CLASS2 (rvc_inf, rvc_inf):
568 if (subtract_p)
569 /* Inf - Inf = NaN. */
570 get_canonical_qnan (r, 0);
571 else
572 /* Inf + Inf = Inf. */
573 *r = *a;
574 return false;
576 case CLASS2 (rvc_normal, rvc_normal):
577 break;
579 default:
580 abort ();
583 /* Swap the arguments such that A has the larger exponent. */
584 dexp = REAL_EXP (a) - REAL_EXP (b);
585 if (dexp < 0)
587 const REAL_VALUE_TYPE *t;
588 t = a, a = b, b = t;
589 dexp = -dexp;
590 sign ^= subtract_p;
592 exp = REAL_EXP (a);
594 /* If the exponents are not identical, we need to shift the
595 significand of B down. */
596 if (dexp > 0)
598 /* If the exponents are too far apart, the significands
599 do not overlap, which makes the subtraction a noop. */
600 if (dexp >= SIGNIFICAND_BITS)
602 *r = *a;
603 r->sign = sign;
604 return true;
607 inexact |= sticky_rshift_significand (&t, b, dexp);
608 b = &t;
611 if (subtract_p)
613 if (sub_significands (r, a, b, inexact))
615 /* We got a borrow out of the subtraction. That means that
616 A and B had the same exponent, and B had the larger
617 significand. We need to swap the sign and negate the
618 significand. */
619 sign ^= 1;
620 neg_significand (r, r);
623 else
625 if (add_significands (r, a, b))
627 /* We got carry out of the addition. This means we need to
628 shift the significand back down one bit and increase the
629 exponent. */
630 inexact |= sticky_rshift_significand (r, r, 1);
631 r->sig[SIGSZ-1] |= SIG_MSB;
632 if (++exp > MAX_EXP)
634 get_inf (r, sign);
635 return true;
640 r->cl = rvc_normal;
641 r->sign = sign;
642 SET_REAL_EXP (r, exp);
644 /* Re-normalize the result. */
645 normalize (r);
647 /* Special case: if the subtraction results in zero, the result
648 is positive. */
649 if (r->cl == rvc_zero)
650 r->sign = 0;
651 else
652 r->sig[0] |= inexact;
654 return inexact;
657 /* Calculate R = A * B. Return true if the result may be inexact. */
659 static bool
660 do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
661 const REAL_VALUE_TYPE *b)
663 REAL_VALUE_TYPE u, t, *rr;
664 unsigned int i, j, k;
665 int sign = a->sign ^ b->sign;
666 bool inexact = false;
668 switch (CLASS2 (a->cl, b->cl))
670 case CLASS2 (rvc_zero, rvc_zero):
671 case CLASS2 (rvc_zero, rvc_normal):
672 case CLASS2 (rvc_normal, rvc_zero):
673 /* +-0 * ANY = 0 with appropriate sign. */
674 get_zero (r, sign);
675 return false;
677 case CLASS2 (rvc_zero, rvc_nan):
678 case CLASS2 (rvc_normal, rvc_nan):
679 case CLASS2 (rvc_inf, rvc_nan):
680 case CLASS2 (rvc_nan, rvc_nan):
681 /* ANY * NaN = NaN. */
682 *r = *b;
683 r->sign = sign;
684 return false;
686 case CLASS2 (rvc_nan, rvc_zero):
687 case CLASS2 (rvc_nan, rvc_normal):
688 case CLASS2 (rvc_nan, rvc_inf):
689 /* NaN * ANY = NaN. */
690 *r = *a;
691 r->sign = sign;
692 return false;
694 case CLASS2 (rvc_zero, rvc_inf):
695 case CLASS2 (rvc_inf, rvc_zero):
696 /* 0 * Inf = NaN */
697 get_canonical_qnan (r, sign);
698 return false;
700 case CLASS2 (rvc_inf, rvc_inf):
701 case CLASS2 (rvc_normal, rvc_inf):
702 case CLASS2 (rvc_inf, rvc_normal):
703 /* Inf * Inf = Inf, R * Inf = Inf */
704 get_inf (r, sign);
705 return false;
707 case CLASS2 (rvc_normal, rvc_normal):
708 break;
710 default:
711 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 = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
752 + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2)));
754 if (exp > MAX_EXP)
756 get_inf (r, sign);
757 return true;
759 if (exp < -MAX_EXP)
761 /* Would underflow to zero, which we shouldn't bother adding. */
762 inexact = true;
763 continue;
766 memset (&u, 0, sizeof (u));
767 u.cl = rvc_normal;
768 SET_REAL_EXP (&u, exp);
770 for (k = j; k < SIGSZ * 2; k += 2)
772 unsigned long bi = b->sig[k / 2];
773 if (k & 1)
774 bi >>= HOST_BITS_PER_LONG / 2;
775 else
776 bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
778 u.sig[k / 2] = ai * bi;
781 normalize (&u);
782 inexact |= do_add (rr, rr, &u, 0);
786 rr->sign = sign;
787 if (rr != r)
788 *r = t;
790 return inexact;
793 /* Calculate R = A / B. Return true if the result may be inexact. */
795 static bool
796 do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
797 const REAL_VALUE_TYPE *b)
799 int exp, sign = a->sign ^ b->sign;
800 REAL_VALUE_TYPE t, *rr;
801 bool inexact;
803 switch (CLASS2 (a->cl, b->cl))
805 case CLASS2 (rvc_zero, rvc_zero):
806 /* 0 / 0 = NaN. */
807 case CLASS2 (rvc_inf, rvc_inf):
808 /* Inf / Inf = NaN. */
809 get_canonical_qnan (r, sign);
810 return false;
812 case CLASS2 (rvc_zero, rvc_normal):
813 case CLASS2 (rvc_zero, rvc_inf):
814 /* 0 / ANY = 0. */
815 case CLASS2 (rvc_normal, rvc_inf):
816 /* R / Inf = 0. */
817 get_zero (r, sign);
818 return false;
820 case CLASS2 (rvc_normal, rvc_zero):
821 /* R / 0 = Inf. */
822 case CLASS2 (rvc_inf, rvc_zero):
823 /* Inf / 0 = Inf. */
824 get_inf (r, sign);
825 return false;
827 case CLASS2 (rvc_zero, rvc_nan):
828 case CLASS2 (rvc_normal, rvc_nan):
829 case CLASS2 (rvc_inf, rvc_nan):
830 case CLASS2 (rvc_nan, rvc_nan):
831 /* ANY / NaN = NaN. */
832 *r = *b;
833 r->sign = sign;
834 return false;
836 case CLASS2 (rvc_nan, rvc_zero):
837 case CLASS2 (rvc_nan, rvc_normal):
838 case CLASS2 (rvc_nan, rvc_inf):
839 /* NaN / ANY = NaN. */
840 *r = *a;
841 r->sign = sign;
842 return false;
844 case CLASS2 (rvc_inf, rvc_normal):
845 /* Inf / R = Inf. */
846 get_inf (r, sign);
847 return false;
849 case CLASS2 (rvc_normal, rvc_normal):
850 break;
852 default:
853 abort ();
856 if (r == a || r == b)
857 rr = &t;
858 else
859 rr = r;
861 /* Make sure all fields in the result are initialized. */
862 get_zero (rr, 0);
863 rr->cl = rvc_normal;
864 rr->sign = sign;
866 exp = REAL_EXP (a) - REAL_EXP (b) + 1;
867 if (exp > MAX_EXP)
869 get_inf (r, sign);
870 return true;
872 if (exp < -MAX_EXP)
874 get_zero (r, sign);
875 return true;
877 SET_REAL_EXP (rr, exp);
879 inexact = div_significands (rr, a, b);
881 /* Re-normalize the result. */
882 normalize (rr);
883 rr->sig[0] |= inexact;
885 if (rr != r)
886 *r = t;
888 return inexact;
891 /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
892 one of the two operands is a NaN. */
894 static int
895 do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
896 int nan_result)
898 int ret;
900 switch (CLASS2 (a->cl, b->cl))
902 case CLASS2 (rvc_zero, rvc_zero):
903 /* Sign of zero doesn't matter for compares. */
904 return 0;
906 case CLASS2 (rvc_inf, rvc_zero):
907 case CLASS2 (rvc_inf, rvc_normal):
908 case CLASS2 (rvc_normal, rvc_zero):
909 return (a->sign ? -1 : 1);
911 case CLASS2 (rvc_inf, rvc_inf):
912 return -a->sign - -b->sign;
914 case CLASS2 (rvc_zero, rvc_normal):
915 case CLASS2 (rvc_zero, rvc_inf):
916 case CLASS2 (rvc_normal, rvc_inf):
917 return (b->sign ? 1 : -1);
919 case CLASS2 (rvc_zero, rvc_nan):
920 case CLASS2 (rvc_normal, rvc_nan):
921 case CLASS2 (rvc_inf, rvc_nan):
922 case CLASS2 (rvc_nan, rvc_nan):
923 case CLASS2 (rvc_nan, rvc_zero):
924 case CLASS2 (rvc_nan, rvc_normal):
925 case CLASS2 (rvc_nan, rvc_inf):
926 return nan_result;
928 case CLASS2 (rvc_normal, rvc_normal):
929 break;
931 default:
932 abort ();
935 if (a->sign != b->sign)
936 return -a->sign - -b->sign;
938 if (REAL_EXP (a) > REAL_EXP (b))
939 ret = 1;
940 else if (REAL_EXP (a) < REAL_EXP (b))
941 ret = -1;
942 else
943 ret = cmp_significands (a, b);
945 return (a->sign ? -ret : ret);
948 /* Return A truncated to an integral value toward zero. */
950 static void
951 do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
953 *r = *a;
955 switch (r->cl)
957 case rvc_zero:
958 case rvc_inf:
959 case rvc_nan:
960 break;
962 case rvc_normal:
963 if (REAL_EXP (r) <= 0)
964 get_zero (r, r->sign);
965 else if (REAL_EXP (r) < SIGNIFICAND_BITS)
966 clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r));
967 break;
969 default:
970 abort ();
974 /* Perform the binary or unary operation described by CODE.
975 For a unary operation, leave OP1 NULL. */
977 void
978 real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
979 const REAL_VALUE_TYPE *op1)
981 enum tree_code code = icode;
983 switch (code)
985 case PLUS_EXPR:
986 do_add (r, op0, op1, 0);
987 break;
989 case MINUS_EXPR:
990 do_add (r, op0, op1, 1);
991 break;
993 case MULT_EXPR:
994 do_multiply (r, op0, op1);
995 break;
997 case RDIV_EXPR:
998 do_divide (r, op0, op1);
999 break;
1001 case MIN_EXPR:
1002 if (op1->cl == rvc_nan)
1003 *r = *op1;
1004 else if (do_compare (op0, op1, -1) < 0)
1005 *r = *op0;
1006 else
1007 *r = *op1;
1008 break;
1010 case MAX_EXPR:
1011 if (op1->cl == rvc_nan)
1012 *r = *op1;
1013 else if (do_compare (op0, op1, 1) < 0)
1014 *r = *op1;
1015 else
1016 *r = *op0;
1017 break;
1019 case NEGATE_EXPR:
1020 *r = *op0;
1021 r->sign ^= 1;
1022 break;
1024 case ABS_EXPR:
1025 *r = *op0;
1026 r->sign = 0;
1027 break;
1029 case FIX_TRUNC_EXPR:
1030 do_fix_trunc (r, op0);
1031 break;
1033 default:
1034 abort ();
1038 /* Legacy. Similar, but return the result directly. */
1040 REAL_VALUE_TYPE
1041 real_arithmetic2 (int icode, const REAL_VALUE_TYPE *op0,
1042 const REAL_VALUE_TYPE *op1)
1044 REAL_VALUE_TYPE r;
1045 real_arithmetic (&r, icode, op0, op1);
1046 return r;
1049 bool
1050 real_compare (int icode, const REAL_VALUE_TYPE *op0,
1051 const REAL_VALUE_TYPE *op1)
1053 enum tree_code code = icode;
1055 switch (code)
1057 case LT_EXPR:
1058 return do_compare (op0, op1, 1) < 0;
1059 case LE_EXPR:
1060 return do_compare (op0, op1, 1) <= 0;
1061 case GT_EXPR:
1062 return do_compare (op0, op1, -1) > 0;
1063 case GE_EXPR:
1064 return do_compare (op0, op1, -1) >= 0;
1065 case EQ_EXPR:
1066 return do_compare (op0, op1, -1) == 0;
1067 case NE_EXPR:
1068 return do_compare (op0, op1, -1) != 0;
1069 case UNORDERED_EXPR:
1070 return op0->cl == rvc_nan || op1->cl == rvc_nan;
1071 case ORDERED_EXPR:
1072 return op0->cl != rvc_nan && op1->cl != rvc_nan;
1073 case UNLT_EXPR:
1074 return do_compare (op0, op1, -1) < 0;
1075 case UNLE_EXPR:
1076 return do_compare (op0, op1, -1) <= 0;
1077 case UNGT_EXPR:
1078 return do_compare (op0, op1, 1) > 0;
1079 case UNGE_EXPR:
1080 return do_compare (op0, op1, 1) >= 0;
1081 case UNEQ_EXPR:
1082 return do_compare (op0, op1, 0) == 0;
1083 case LTGT_EXPR:
1084 return do_compare (op0, op1, 0) != 0;
1086 default:
1087 abort ();
1091 /* Return floor log2(R). */
1094 real_exponent (const REAL_VALUE_TYPE *r)
1096 switch (r->cl)
1098 case rvc_zero:
1099 return 0;
1100 case rvc_inf:
1101 case rvc_nan:
1102 return (unsigned int)-1 >> 1;
1103 case rvc_normal:
1104 return REAL_EXP (r);
1105 default:
1106 abort ();
1110 /* R = OP0 * 2**EXP. */
1112 void
1113 real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
1115 *r = *op0;
1116 switch (r->cl)
1118 case rvc_zero:
1119 case rvc_inf:
1120 case rvc_nan:
1121 break;
1123 case rvc_normal:
1124 exp += REAL_EXP (op0);
1125 if (exp > MAX_EXP)
1126 get_inf (r, r->sign);
1127 else if (exp < -MAX_EXP)
1128 get_zero (r, r->sign);
1129 else
1130 SET_REAL_EXP (r, exp);
1131 break;
1133 default:
1134 abort ();
1138 /* Determine whether a floating-point value X is infinite. */
1140 bool
1141 real_isinf (const REAL_VALUE_TYPE *r)
1143 return (r->cl == rvc_inf);
1146 /* Determine whether a floating-point value X is a NaN. */
1148 bool
1149 real_isnan (const REAL_VALUE_TYPE *r)
1151 return (r->cl == rvc_nan);
1154 /* Determine whether a floating-point value X is negative. */
1156 bool
1157 real_isneg (const REAL_VALUE_TYPE *r)
1159 return r->sign;
1162 /* Determine whether a floating-point value X is minus zero. */
1164 bool
1165 real_isnegzero (const REAL_VALUE_TYPE *r)
1167 return r->sign && r->cl == rvc_zero;
1170 /* Compare two floating-point objects for bitwise identity. */
1172 bool
1173 real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
1175 int i;
1177 if (a->cl != b->cl)
1178 return false;
1179 if (a->sign != b->sign)
1180 return false;
1182 switch (a->cl)
1184 case rvc_zero:
1185 case rvc_inf:
1186 return true;
1188 case rvc_normal:
1189 if (REAL_EXP (a) != REAL_EXP (b))
1190 return false;
1191 break;
1193 case rvc_nan:
1194 if (a->signalling != b->signalling)
1195 return false;
1196 /* The significand is ignored for canonical NaNs. */
1197 if (a->canonical || b->canonical)
1198 return a->canonical == b->canonical;
1199 break;
1201 default:
1202 abort ();
1205 for (i = 0; i < SIGSZ; ++i)
1206 if (a->sig[i] != b->sig[i])
1207 return false;
1209 return true;
1212 /* Try to change R into its exact multiplicative inverse in machine
1213 mode MODE. Return true if successful. */
1215 bool
1216 exact_real_inverse (enum machine_mode mode, REAL_VALUE_TYPE *r)
1218 const REAL_VALUE_TYPE *one = real_digit (1);
1219 REAL_VALUE_TYPE u;
1220 int i;
1222 if (r->cl != rvc_normal)
1223 return false;
1225 /* Check for a power of two: all significand bits zero except the MSB. */
1226 for (i = 0; i < SIGSZ-1; ++i)
1227 if (r->sig[i] != 0)
1228 return false;
1229 if (r->sig[SIGSZ-1] != SIG_MSB)
1230 return false;
1232 /* Find the inverse and truncate to the required mode. */
1233 do_divide (&u, one, r);
1234 real_convert (&u, mode, &u);
1236 /* The rounding may have overflowed. */
1237 if (u.cl != rvc_normal)
1238 return false;
1239 for (i = 0; i < SIGSZ-1; ++i)
1240 if (u.sig[i] != 0)
1241 return false;
1242 if (u.sig[SIGSZ-1] != SIG_MSB)
1243 return false;
1245 *r = u;
1246 return true;
1249 /* Render R as an integer. */
1251 HOST_WIDE_INT
1252 real_to_integer (const REAL_VALUE_TYPE *r)
1254 unsigned HOST_WIDE_INT i;
1256 switch (r->cl)
1258 case rvc_zero:
1259 underflow:
1260 return 0;
1262 case rvc_inf:
1263 case rvc_nan:
1264 overflow:
1265 i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1266 if (!r->sign)
1267 i--;
1268 return i;
1270 case rvc_normal:
1271 if (REAL_EXP (r) <= 0)
1272 goto underflow;
1273 /* Only force overflow for unsigned overflow. Signed overflow is
1274 undefined, so it doesn't matter what we return, and some callers
1275 expect to be able to use this routine for both signed and
1276 unsigned conversions. */
1277 if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT)
1278 goto overflow;
1280 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1281 i = r->sig[SIGSZ-1];
1282 else if (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG)
1284 i = r->sig[SIGSZ-1];
1285 i = i << (HOST_BITS_PER_LONG - 1) << 1;
1286 i |= r->sig[SIGSZ-2];
1288 else
1289 abort ();
1291 i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r);
1293 if (r->sign)
1294 i = -i;
1295 return i;
1297 default:
1298 abort ();
1302 /* Likewise, but to an integer pair, HI+LOW. */
1304 void
1305 real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
1306 const REAL_VALUE_TYPE *r)
1308 REAL_VALUE_TYPE t;
1309 HOST_WIDE_INT low, high;
1310 int exp;
1312 switch (r->cl)
1314 case rvc_zero:
1315 underflow:
1316 low = high = 0;
1317 break;
1319 case rvc_inf:
1320 case rvc_nan:
1321 overflow:
1322 high = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1323 if (r->sign)
1324 low = 0;
1325 else
1327 high--;
1328 low = -1;
1330 break;
1332 case rvc_normal:
1333 exp = REAL_EXP (r);
1334 if (exp <= 0)
1335 goto underflow;
1336 /* Only force overflow for unsigned overflow. Signed overflow is
1337 undefined, so it doesn't matter what we return, and some callers
1338 expect to be able to use this routine for both signed and
1339 unsigned conversions. */
1340 if (exp > 2*HOST_BITS_PER_WIDE_INT)
1341 goto overflow;
1343 rshift_significand (&t, r, 2*HOST_BITS_PER_WIDE_INT - exp);
1344 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1346 high = t.sig[SIGSZ-1];
1347 low = t.sig[SIGSZ-2];
1349 else if (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG)
1351 high = t.sig[SIGSZ-1];
1352 high = high << (HOST_BITS_PER_LONG - 1) << 1;
1353 high |= t.sig[SIGSZ-2];
1355 low = t.sig[SIGSZ-3];
1356 low = low << (HOST_BITS_PER_LONG - 1) << 1;
1357 low |= t.sig[SIGSZ-4];
1359 else
1360 abort ();
1362 if (r->sign)
1364 if (low == 0)
1365 high = -high;
1366 else
1367 low = -low, high = ~high;
1369 break;
1371 default:
1372 abort ();
1375 *plow = low;
1376 *phigh = high;
1379 /* A subroutine of real_to_decimal. Compute the quotient and remainder
1380 of NUM / DEN. Return the quotient and place the remainder in NUM.
1381 It is expected that NUM / DEN are close enough that the quotient is
1382 small. */
1384 static unsigned long
1385 rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den)
1387 unsigned long q, msb;
1388 int expn = REAL_EXP (num), expd = REAL_EXP (den);
1390 if (expn < expd)
1391 return 0;
1393 q = msb = 0;
1394 goto start;
1397 msb = num->sig[SIGSZ-1] & SIG_MSB;
1398 q <<= 1;
1399 lshift_significand_1 (num, num);
1400 start:
1401 if (msb || cmp_significands (num, den) >= 0)
1403 sub_significands (num, num, den, 0);
1404 q |= 1;
1407 while (--expn >= expd);
1409 SET_REAL_EXP (num, expd);
1410 normalize (num);
1412 return q;
1415 /* Render R as a decimal floating point constant. Emit DIGITS significant
1416 digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the
1417 maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing
1418 zeros. */
1420 #define M_LOG10_2 0.30102999566398119521
1422 void
1423 real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
1424 size_t digits, int crop_trailing_zeros)
1426 const REAL_VALUE_TYPE *one, *ten;
1427 REAL_VALUE_TYPE r, pten, u, v;
1428 int dec_exp, cmp_one, digit;
1429 size_t max_digits;
1430 char *p, *first, *last;
1431 bool sign;
1433 r = *r_orig;
1434 switch (r.cl)
1436 case rvc_zero:
1437 strcpy (str, (r.sign ? "-0.0" : "0.0"));
1438 return;
1439 case rvc_normal:
1440 break;
1441 case rvc_inf:
1442 strcpy (str, (r.sign ? "-Inf" : "+Inf"));
1443 return;
1444 case rvc_nan:
1445 /* ??? Print the significand as well, if not canonical? */
1446 strcpy (str, (r.sign ? "-NaN" : "+NaN"));
1447 return;
1448 default:
1449 abort ();
1452 /* Bound the number of digits printed by the size of the representation. */
1453 max_digits = SIGNIFICAND_BITS * M_LOG10_2;
1454 if (digits == 0 || digits > max_digits)
1455 digits = max_digits;
1457 /* Estimate the decimal exponent, and compute the length of the string it
1458 will print as. Be conservative and add one to account for possible
1459 overflow or rounding error. */
1460 dec_exp = REAL_EXP (&r) * M_LOG10_2;
1461 for (max_digits = 1; dec_exp ; max_digits++)
1462 dec_exp /= 10;
1464 /* Bound the number of digits printed by the size of the output buffer. */
1465 max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
1466 if (max_digits > buf_size)
1467 abort ();
1468 if (digits > max_digits)
1469 digits = max_digits;
1471 one = real_digit (1);
1472 ten = ten_to_ptwo (0);
1474 sign = r.sign;
1475 r.sign = 0;
1477 dec_exp = 0;
1478 pten = *one;
1480 cmp_one = do_compare (&r, one, 0);
1481 if (cmp_one > 0)
1483 int m;
1485 /* Number is greater than one. Convert significand to an integer
1486 and strip trailing decimal zeros. */
1488 u = r;
1489 SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1);
1491 /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
1492 m = floor_log2 (max_digits);
1494 /* Iterate over the bits of the possible powers of 10 that might
1495 be present in U and eliminate them. That is, if we find that
1496 10**2**M divides U evenly, keep the division and increase
1497 DEC_EXP by 2**M. */
1500 REAL_VALUE_TYPE t;
1502 do_divide (&t, &u, ten_to_ptwo (m));
1503 do_fix_trunc (&v, &t);
1504 if (cmp_significands (&v, &t) == 0)
1506 u = t;
1507 dec_exp += 1 << m;
1510 while (--m >= 0);
1512 /* Revert the scaling to integer that we performed earlier. */
1513 SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r)
1514 - (SIGNIFICAND_BITS - 1));
1515 r = u;
1517 /* Find power of 10. Do this by dividing out 10**2**M when
1518 this is larger than the current remainder. Fill PTEN with
1519 the power of 10 that we compute. */
1520 if (REAL_EXP (&r) > 0)
1522 m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1;
1525 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1526 if (do_compare (&u, ptentwo, 0) >= 0)
1528 do_divide (&u, &u, ptentwo);
1529 do_multiply (&pten, &pten, ptentwo);
1530 dec_exp += 1 << m;
1533 while (--m >= 0);
1535 else
1536 /* We managed to divide off enough tens in the above reduction
1537 loop that we've now got a negative exponent. Fall into the
1538 less-than-one code to compute the proper value for PTEN. */
1539 cmp_one = -1;
1541 if (cmp_one < 0)
1543 int m;
1545 /* Number is less than one. Pad significand with leading
1546 decimal zeros. */
1548 v = r;
1549 while (1)
1551 /* Stop if we'd shift bits off the bottom. */
1552 if (v.sig[0] & 7)
1553 break;
1555 do_multiply (&u, &v, ten);
1557 /* Stop if we're now >= 1. */
1558 if (REAL_EXP (&u) > 0)
1559 break;
1561 v = u;
1562 dec_exp -= 1;
1564 r = v;
1566 /* Find power of 10. Do this by multiplying in P=10**2**M when
1567 the current remainder is smaller than 1/P. Fill PTEN with the
1568 power of 10 that we compute. */
1569 m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1;
1572 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1573 const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
1575 if (do_compare (&v, ptenmtwo, 0) <= 0)
1577 do_multiply (&v, &v, ptentwo);
1578 do_multiply (&pten, &pten, ptentwo);
1579 dec_exp -= 1 << m;
1582 while (--m >= 0);
1584 /* Invert the positive power of 10 that we've collected so far. */
1585 do_divide (&pten, one, &pten);
1588 p = str;
1589 if (sign)
1590 *p++ = '-';
1591 first = p++;
1593 /* At this point, PTEN should contain the nearest power of 10 smaller
1594 than R, such that this division produces the first digit.
1596 Using a divide-step primitive that returns the complete integral
1597 remainder avoids the rounding error that would be produced if
1598 we were to use do_divide here and then simply multiply by 10 for
1599 each subsequent digit. */
1601 digit = rtd_divmod (&r, &pten);
1603 /* Be prepared for error in that division via underflow ... */
1604 if (digit == 0 && cmp_significand_0 (&r))
1606 /* Multiply by 10 and try again. */
1607 do_multiply (&r, &r, ten);
1608 digit = rtd_divmod (&r, &pten);
1609 dec_exp -= 1;
1610 if (digit == 0)
1611 abort ();
1614 /* ... or overflow. */
1615 if (digit == 10)
1617 *p++ = '1';
1618 if (--digits > 0)
1619 *p++ = '0';
1620 dec_exp += 1;
1622 else if (digit > 10)
1623 abort ();
1624 else
1625 *p++ = digit + '0';
1627 /* Generate subsequent digits. */
1628 while (--digits > 0)
1630 do_multiply (&r, &r, ten);
1631 digit = rtd_divmod (&r, &pten);
1632 *p++ = digit + '0';
1634 last = p;
1636 /* Generate one more digit with which to do rounding. */
1637 do_multiply (&r, &r, ten);
1638 digit = rtd_divmod (&r, &pten);
1640 /* Round the result. */
1641 if (digit == 5)
1643 /* Round to nearest. If R is nonzero there are additional
1644 nonzero digits to be extracted. */
1645 if (cmp_significand_0 (&r))
1646 digit++;
1647 /* Round to even. */
1648 else if ((p[-1] - '0') & 1)
1649 digit++;
1651 if (digit > 5)
1653 while (p > first)
1655 digit = *--p;
1656 if (digit == '9')
1657 *p = '0';
1658 else
1660 *p = digit + 1;
1661 break;
1665 /* Carry out of the first digit. This means we had all 9's and
1666 now have all 0's. "Prepend" a 1 by overwriting the first 0. */
1667 if (p == first)
1669 first[1] = '1';
1670 dec_exp++;
1674 /* Insert the decimal point. */
1675 first[0] = first[1];
1676 first[1] = '.';
1678 /* If requested, drop trailing zeros. Never crop past "1.0". */
1679 if (crop_trailing_zeros)
1680 while (last > first + 3 && last[-1] == '0')
1681 last--;
1683 /* Append the exponent. */
1684 sprintf (last, "e%+d", dec_exp);
1687 /* Render R as a hexadecimal floating point constant. Emit DIGITS
1688 significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0,
1689 choose the maximum for the representation. If CROP_TRAILING_ZEROS,
1690 strip trailing zeros. */
1692 void
1693 real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
1694 size_t digits, int crop_trailing_zeros)
1696 int i, j, exp = REAL_EXP (r);
1697 char *p, *first;
1698 char exp_buf[16];
1699 size_t max_digits;
1701 switch (r->cl)
1703 case rvc_zero:
1704 exp = 0;
1705 break;
1706 case rvc_normal:
1707 break;
1708 case rvc_inf:
1709 strcpy (str, (r->sign ? "-Inf" : "+Inf"));
1710 return;
1711 case rvc_nan:
1712 /* ??? Print the significand as well, if not canonical? */
1713 strcpy (str, (r->sign ? "-NaN" : "+NaN"));
1714 return;
1715 default:
1716 abort ();
1719 if (digits == 0)
1720 digits = SIGNIFICAND_BITS / 4;
1722 /* Bound the number of digits printed by the size of the output buffer. */
1724 sprintf (exp_buf, "p%+d", exp);
1725 max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
1726 if (max_digits > buf_size)
1727 abort ();
1728 if (digits > max_digits)
1729 digits = max_digits;
1731 p = str;
1732 if (r->sign)
1733 *p++ = '-';
1734 *p++ = '0';
1735 *p++ = 'x';
1736 *p++ = '0';
1737 *p++ = '.';
1738 first = p;
1740 for (i = SIGSZ - 1; i >= 0; --i)
1741 for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
1743 *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
1744 if (--digits == 0)
1745 goto out;
1748 out:
1749 if (crop_trailing_zeros)
1750 while (p > first + 1 && p[-1] == '0')
1751 p--;
1753 sprintf (p, "p%+d", exp);
1756 /* Initialize R from a decimal or hexadecimal string. The string is
1757 assumed to have been syntax checked already. */
1759 void
1760 real_from_string (REAL_VALUE_TYPE *r, const char *str)
1762 int exp = 0;
1763 bool sign = false;
1765 get_zero (r, 0);
1767 if (*str == '-')
1769 sign = true;
1770 str++;
1772 else if (*str == '+')
1773 str++;
1775 if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1777 /* Hexadecimal floating point. */
1778 int pos = SIGNIFICAND_BITS - 4, d;
1780 str += 2;
1782 while (*str == '0')
1783 str++;
1784 while (1)
1786 d = hex_value (*str);
1787 if (d == _hex_bad)
1788 break;
1789 if (pos >= 0)
1791 r->sig[pos / HOST_BITS_PER_LONG]
1792 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1793 pos -= 4;
1795 exp += 4;
1796 str++;
1798 if (*str == '.')
1800 str++;
1801 if (pos == SIGNIFICAND_BITS - 4)
1803 while (*str == '0')
1804 str++, exp -= 4;
1806 while (1)
1808 d = hex_value (*str);
1809 if (d == _hex_bad)
1810 break;
1811 if (pos >= 0)
1813 r->sig[pos / HOST_BITS_PER_LONG]
1814 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1815 pos -= 4;
1817 str++;
1820 if (*str == 'p' || *str == 'P')
1822 bool exp_neg = false;
1824 str++;
1825 if (*str == '-')
1827 exp_neg = true;
1828 str++;
1830 else if (*str == '+')
1831 str++;
1833 d = 0;
1834 while (ISDIGIT (*str))
1836 d *= 10;
1837 d += *str - '0';
1838 if (d > MAX_EXP)
1840 /* Overflowed the exponent. */
1841 if (exp_neg)
1842 goto underflow;
1843 else
1844 goto overflow;
1846 str++;
1848 if (exp_neg)
1849 d = -d;
1851 exp += d;
1854 r->cl = rvc_normal;
1855 SET_REAL_EXP (r, exp);
1857 normalize (r);
1859 else
1861 /* Decimal floating point. */
1862 const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
1863 int d;
1865 while (*str == '0')
1866 str++;
1867 while (ISDIGIT (*str))
1869 d = *str++ - '0';
1870 do_multiply (r, r, ten);
1871 if (d)
1872 do_add (r, r, real_digit (d), 0);
1874 if (*str == '.')
1876 str++;
1877 if (r->cl == rvc_zero)
1879 while (*str == '0')
1880 str++, exp--;
1882 while (ISDIGIT (*str))
1884 d = *str++ - '0';
1885 do_multiply (r, r, ten);
1886 if (d)
1887 do_add (r, r, real_digit (d), 0);
1888 exp--;
1892 if (*str == 'e' || *str == 'E')
1894 bool exp_neg = false;
1896 str++;
1897 if (*str == '-')
1899 exp_neg = true;
1900 str++;
1902 else if (*str == '+')
1903 str++;
1905 d = 0;
1906 while (ISDIGIT (*str))
1908 d *= 10;
1909 d += *str - '0';
1910 if (d > MAX_EXP)
1912 /* Overflowed the exponent. */
1913 if (exp_neg)
1914 goto underflow;
1915 else
1916 goto overflow;
1918 str++;
1920 if (exp_neg)
1921 d = -d;
1922 exp += d;
1925 if (exp)
1926 times_pten (r, exp);
1929 r->sign = sign;
1930 return;
1932 underflow:
1933 get_zero (r, sign);
1934 return;
1936 overflow:
1937 get_inf (r, sign);
1938 return;
1941 /* Legacy. Similar, but return the result directly. */
1943 REAL_VALUE_TYPE
1944 real_from_string2 (const char *s, enum machine_mode mode)
1946 REAL_VALUE_TYPE r;
1948 real_from_string (&r, s);
1949 if (mode != VOIDmode)
1950 real_convert (&r, mode, &r);
1952 return r;
1955 /* Initialize R from the integer pair HIGH+LOW. */
1957 void
1958 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
1959 unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
1960 int unsigned_p)
1962 if (low == 0 && high == 0)
1963 get_zero (r, 0);
1964 else
1966 r->cl = rvc_normal;
1967 r->sign = high < 0 && !unsigned_p;
1968 SET_REAL_EXP (r, 2 * HOST_BITS_PER_WIDE_INT);
1970 if (r->sign)
1972 high = ~high;
1973 if (low == 0)
1974 high += 1;
1975 else
1976 low = -low;
1979 if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
1981 r->sig[SIGSZ-1] = high;
1982 r->sig[SIGSZ-2] = low;
1983 memset (r->sig, 0, sizeof(long)*(SIGSZ-2));
1985 else if (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT)
1987 r->sig[SIGSZ-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
1988 r->sig[SIGSZ-2] = high;
1989 r->sig[SIGSZ-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
1990 r->sig[SIGSZ-4] = low;
1991 if (SIGSZ > 4)
1992 memset (r->sig, 0, sizeof(long)*(SIGSZ-4));
1994 else
1995 abort ();
1997 normalize (r);
2000 if (mode != VOIDmode)
2001 real_convert (r, mode, r);
2004 /* Returns 10**2**N. */
2006 static const REAL_VALUE_TYPE *
2007 ten_to_ptwo (int n)
2009 static REAL_VALUE_TYPE tens[EXP_BITS];
2011 if (n < 0 || n >= EXP_BITS)
2012 abort ();
2014 if (tens[n].cl == rvc_zero)
2016 if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2018 HOST_WIDE_INT t = 10;
2019 int i;
2021 for (i = 0; i < n; ++i)
2022 t *= t;
2024 real_from_integer (&tens[n], VOIDmode, t, 0, 1);
2026 else
2028 const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2029 do_multiply (&tens[n], t, t);
2033 return &tens[n];
2036 /* Returns 10**(-2**N). */
2038 static const REAL_VALUE_TYPE *
2039 ten_to_mptwo (int n)
2041 static REAL_VALUE_TYPE tens[EXP_BITS];
2043 if (n < 0 || n >= EXP_BITS)
2044 abort ();
2046 if (tens[n].cl == rvc_zero)
2047 do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2049 return &tens[n];
2052 /* Returns N. */
2054 static const REAL_VALUE_TYPE *
2055 real_digit (int n)
2057 static REAL_VALUE_TYPE num[10];
2059 if (n < 0 || n > 9)
2060 abort ();
2062 if (n > 0 && num[n].cl == rvc_zero)
2063 real_from_integer (&num[n], VOIDmode, n, 0, 1);
2065 return &num[n];
2068 /* Multiply R by 10**EXP. */
2070 static void
2071 times_pten (REAL_VALUE_TYPE *r, int exp)
2073 REAL_VALUE_TYPE pten, *rr;
2074 bool negative = (exp < 0);
2075 int i;
2077 if (negative)
2079 exp = -exp;
2080 pten = *real_digit (1);
2081 rr = &pten;
2083 else
2084 rr = r;
2086 for (i = 0; exp > 0; ++i, exp >>= 1)
2087 if (exp & 1)
2088 do_multiply (rr, rr, ten_to_ptwo (i));
2090 if (negative)
2091 do_divide (r, r, &pten);
2094 /* Fills R with +Inf. */
2096 void
2097 real_inf (REAL_VALUE_TYPE *r)
2099 get_inf (r, 0);
2102 /* Fills R with a NaN whose significand is described by STR. If QUIET,
2103 we force a QNaN, else we force an SNaN. The string, if not empty,
2104 is parsed as a number and placed in the significand. Return true
2105 if the string was successfully parsed. */
2107 bool
2108 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2109 enum machine_mode mode)
2111 const struct real_format *fmt;
2113 fmt = REAL_MODE_FORMAT (mode);
2114 if (fmt == NULL)
2115 abort ();
2117 if (*str == 0)
2119 if (quiet)
2120 get_canonical_qnan (r, 0);
2121 else
2122 get_canonical_snan (r, 0);
2124 else
2126 int base = 10, d;
2127 bool neg = false;
2129 memset (r, 0, sizeof (*r));
2130 r->cl = rvc_nan;
2132 /* Parse akin to strtol into the significand of R. */
2134 while (ISSPACE (*str))
2135 str++;
2136 if (*str == '-')
2137 str++, neg = true;
2138 else if (*str == '+')
2139 str++;
2140 if (*str == '0')
2142 if (*++str == 'x')
2143 str++, base = 16;
2144 else
2145 base = 8;
2148 while ((d = hex_value (*str)) < base)
2150 REAL_VALUE_TYPE u;
2152 switch (base)
2154 case 8:
2155 lshift_significand (r, r, 3);
2156 break;
2157 case 16:
2158 lshift_significand (r, r, 4);
2159 break;
2160 case 10:
2161 lshift_significand_1 (&u, r);
2162 lshift_significand (r, r, 3);
2163 add_significands (r, r, &u);
2164 break;
2165 default:
2166 abort ();
2169 get_zero (&u, 0);
2170 u.sig[0] = d;
2171 add_significands (r, r, &u);
2173 str++;
2176 /* Must have consumed the entire string for success. */
2177 if (*str != 0)
2178 return false;
2180 /* Shift the significand into place such that the bits
2181 are in the most significant bits for the format. */
2182 lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
2184 /* Our MSB is always unset for NaNs. */
2185 r->sig[SIGSZ-1] &= ~SIG_MSB;
2187 /* Force quiet or signalling NaN. */
2188 r->signalling = !quiet;
2191 return true;
2194 /* Fills R with the largest finite value representable in mode MODE.
2195 If SIGN is nonzero, R is set to the most negative finite value. */
2197 void
2198 real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
2200 const struct real_format *fmt;
2201 int np2;
2203 fmt = REAL_MODE_FORMAT (mode);
2204 if (fmt == NULL)
2205 abort ();
2207 r->cl = rvc_normal;
2208 r->sign = sign;
2209 r->signalling = 0;
2210 r->canonical = 0;
2211 SET_REAL_EXP (r, fmt->emax * fmt->log2_b);
2213 np2 = SIGNIFICAND_BITS - fmt->p * fmt->log2_b;
2214 memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
2215 clear_significand_below (r, np2);
2218 /* Fills R with 2**N. */
2220 void
2221 real_2expN (REAL_VALUE_TYPE *r, int n)
2223 memset (r, 0, sizeof (*r));
2225 n++;
2226 if (n > MAX_EXP)
2227 r->cl = rvc_inf;
2228 else if (n < -MAX_EXP)
2230 else
2232 r->cl = rvc_normal;
2233 SET_REAL_EXP (r, n);
2234 r->sig[SIGSZ-1] = SIG_MSB;
2239 static void
2240 round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
2242 int p2, np2, i, w;
2243 unsigned long sticky;
2244 bool guard, lsb;
2245 int emin2m1, emax2;
2247 p2 = fmt->p * fmt->log2_b;
2248 emin2m1 = (fmt->emin - 1) * fmt->log2_b;
2249 emax2 = fmt->emax * fmt->log2_b;
2251 np2 = SIGNIFICAND_BITS - p2;
2252 switch (r->cl)
2254 underflow:
2255 get_zero (r, r->sign);
2256 case rvc_zero:
2257 if (!fmt->has_signed_zero)
2258 r->sign = 0;
2259 return;
2261 overflow:
2262 get_inf (r, r->sign);
2263 case rvc_inf:
2264 return;
2266 case rvc_nan:
2267 clear_significand_below (r, np2);
2268 return;
2270 case rvc_normal:
2271 break;
2273 default:
2274 abort ();
2277 /* If we're not base2, normalize the exponent to a multiple of
2278 the true base. */
2279 if (fmt->log2_b != 1)
2281 int shift = REAL_EXP (r) & (fmt->log2_b - 1);
2282 if (shift)
2284 shift = fmt->log2_b - shift;
2285 r->sig[0] |= sticky_rshift_significand (r, r, shift);
2286 SET_REAL_EXP (r, REAL_EXP (r) + shift);
2290 /* Check the range of the exponent. If we're out of range,
2291 either underflow or overflow. */
2292 if (REAL_EXP (r) > emax2)
2293 goto overflow;
2294 else if (REAL_EXP (r) <= emin2m1)
2296 int diff;
2298 if (!fmt->has_denorm)
2300 /* Don't underflow completely until we've had a chance to round. */
2301 if (REAL_EXP (r) < emin2m1)
2302 goto underflow;
2304 else
2306 diff = emin2m1 - REAL_EXP (r) + 1;
2307 if (diff > p2)
2308 goto underflow;
2310 /* De-normalize the significand. */
2311 r->sig[0] |= sticky_rshift_significand (r, r, diff);
2312 SET_REAL_EXP (r, REAL_EXP (r) + diff);
2316 /* There are P2 true significand bits, followed by one guard bit,
2317 followed by one sticky bit, followed by stuff. Fold nonzero
2318 stuff into the sticky bit. */
2320 sticky = 0;
2321 for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2322 sticky |= r->sig[i];
2323 sticky |=
2324 r->sig[w] & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2326 guard = test_significand_bit (r, np2 - 1);
2327 lsb = test_significand_bit (r, np2);
2329 /* Round to even. */
2330 if (guard && (sticky || lsb))
2332 REAL_VALUE_TYPE u;
2333 get_zero (&u, 0);
2334 set_significand_bit (&u, np2);
2336 if (add_significands (r, r, &u))
2338 /* Overflow. Means the significand had been all ones, and
2339 is now all zeros. Need to increase the exponent, and
2340 possibly re-normalize it. */
2341 SET_REAL_EXP (r, REAL_EXP (r) + 1);
2342 if (REAL_EXP (r) > emax2)
2343 goto overflow;
2344 r->sig[SIGSZ-1] = SIG_MSB;
2346 if (fmt->log2_b != 1)
2348 int shift = REAL_EXP (r) & (fmt->log2_b - 1);
2349 if (shift)
2351 shift = fmt->log2_b - shift;
2352 rshift_significand (r, r, shift);
2353 SET_REAL_EXP (r, REAL_EXP (r) + shift);
2354 if (REAL_EXP (r) > emax2)
2355 goto overflow;
2361 /* Catch underflow that we deferred until after rounding. */
2362 if (REAL_EXP (r) <= emin2m1)
2363 goto underflow;
2365 /* Clear out trailing garbage. */
2366 clear_significand_below (r, np2);
2369 /* Extend or truncate to a new mode. */
2371 void
2372 real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
2373 const REAL_VALUE_TYPE *a)
2375 const struct real_format *fmt;
2377 fmt = REAL_MODE_FORMAT (mode);
2378 if (fmt == NULL)
2379 abort ();
2381 *r = *a;
2382 round_for_format (fmt, r);
2384 /* round_for_format de-normalizes denormals. Undo just that part. */
2385 if (r->cl == rvc_normal)
2386 normalize (r);
2389 /* Legacy. Likewise, except return the struct directly. */
2391 REAL_VALUE_TYPE
2392 real_value_truncate (enum machine_mode mode, REAL_VALUE_TYPE a)
2394 REAL_VALUE_TYPE r;
2395 real_convert (&r, mode, &a);
2396 return r;
2399 /* Return true if truncating to MODE is exact. */
2401 bool
2402 exact_real_truncate (enum machine_mode mode, const REAL_VALUE_TYPE *a)
2404 REAL_VALUE_TYPE t;
2405 real_convert (&t, mode, a);
2406 return real_identical (&t, a);
2409 /* Write R to the given target format. Place the words of the result
2410 in target word order in BUF. There are always 32 bits in each
2411 long, no matter the size of the host long.
2413 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2415 long
2416 real_to_target_fmt (long *buf, const REAL_VALUE_TYPE *r_orig,
2417 const struct real_format *fmt)
2419 REAL_VALUE_TYPE r;
2420 long buf1;
2422 r = *r_orig;
2423 round_for_format (fmt, &r);
2425 if (!buf)
2426 buf = &buf1;
2427 (*fmt->encode) (fmt, buf, &r);
2429 return *buf;
2432 /* Similar, but look up the format from MODE. */
2434 long
2435 real_to_target (long *buf, const REAL_VALUE_TYPE *r, enum machine_mode mode)
2437 const struct real_format *fmt;
2439 fmt = REAL_MODE_FORMAT (mode);
2440 if (fmt == NULL)
2441 abort ();
2443 return real_to_target_fmt (buf, r, fmt);
2446 /* Read R from the given target format. Read the words of the result
2447 in target word order in BUF. There are always 32 bits in each
2448 long, no matter the size of the host long. */
2450 void
2451 real_from_target_fmt (REAL_VALUE_TYPE *r, const long *buf,
2452 const struct real_format *fmt)
2454 (*fmt->decode) (fmt, r, buf);
2457 /* Similar, but look up the format from MODE. */
2459 void
2460 real_from_target (REAL_VALUE_TYPE *r, const long *buf, enum machine_mode mode)
2462 const struct real_format *fmt;
2464 fmt = REAL_MODE_FORMAT (mode);
2465 if (fmt == NULL)
2466 abort ();
2468 (*fmt->decode) (fmt, r, buf);
2471 /* Return the number of bits in the significand for MODE. */
2472 /* ??? Legacy. Should get access to real_format directly. */
2475 significand_size (enum machine_mode mode)
2477 const struct real_format *fmt;
2479 fmt = REAL_MODE_FORMAT (mode);
2480 if (fmt == NULL)
2481 return 0;
2483 return fmt->p * fmt->log2_b;
2486 /* Return a hash value for the given real value. */
2487 /* ??? The "unsigned int" return value is intended to be hashval_t,
2488 but I didn't want to pull hashtab.h into real.h. */
2490 unsigned int
2491 real_hash (const REAL_VALUE_TYPE *r)
2493 unsigned int h;
2494 size_t i;
2496 h = r->cl | (r->sign << 2);
2497 switch (r->cl)
2499 case rvc_zero:
2500 case rvc_inf:
2501 return h;
2503 case rvc_normal:
2504 h |= REAL_EXP (r) << 3;
2505 break;
2507 case rvc_nan:
2508 if (r->signalling)
2509 h ^= (unsigned int)-1;
2510 if (r->canonical)
2511 return h;
2512 break;
2514 default:
2515 abort ();
2518 if (sizeof(unsigned long) > sizeof(unsigned int))
2519 for (i = 0; i < SIGSZ; ++i)
2521 unsigned long s = r->sig[i];
2522 h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2524 else
2525 for (i = 0; i < SIGSZ; ++i)
2526 h ^= r->sig[i];
2528 return h;
2531 /* IEEE single-precision format. */
2533 static void encode_ieee_single (const struct real_format *fmt,
2534 long *, const REAL_VALUE_TYPE *);
2535 static void decode_ieee_single (const struct real_format *,
2536 REAL_VALUE_TYPE *, const long *);
2538 static void
2539 encode_ieee_single (const struct real_format *fmt, long *buf,
2540 const REAL_VALUE_TYPE *r)
2542 unsigned long image, sig, exp;
2543 unsigned long sign = r->sign;
2544 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2546 image = sign << 31;
2547 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2549 switch (r->cl)
2551 case rvc_zero:
2552 break;
2554 case rvc_inf:
2555 if (fmt->has_inf)
2556 image |= 255 << 23;
2557 else
2558 image |= 0x7fffffff;
2559 break;
2561 case rvc_nan:
2562 if (fmt->has_nans)
2564 if (r->canonical)
2565 sig = 0;
2566 if (r->signalling == fmt->qnan_msb_set)
2567 sig &= ~(1 << 22);
2568 else
2569 sig |= 1 << 22;
2570 /* We overload qnan_msb_set here: it's only clear for
2571 mips_ieee_single, which wants all mantissa bits but the
2572 quiet/signalling one set in canonical NaNs (at least
2573 Quiet ones). */
2574 if (r->canonical && !fmt->qnan_msb_set)
2575 sig |= (1 << 22) - 1;
2576 else if (sig == 0)
2577 sig = 1 << 21;
2579 image |= 255 << 23;
2580 image |= sig;
2582 else
2583 image |= 0x7fffffff;
2584 break;
2586 case rvc_normal:
2587 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2588 whereas the intermediate representation is 0.F x 2**exp.
2589 Which means we're off by one. */
2590 if (denormal)
2591 exp = 0;
2592 else
2593 exp = REAL_EXP (r) + 127 - 1;
2594 image |= exp << 23;
2595 image |= sig;
2596 break;
2598 default:
2599 abort ();
2602 buf[0] = image;
2605 static void
2606 decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2607 const long *buf)
2609 unsigned long image = buf[0] & 0xffffffff;
2610 bool sign = (image >> 31) & 1;
2611 int exp = (image >> 23) & 0xff;
2613 memset (r, 0, sizeof (*r));
2614 image <<= HOST_BITS_PER_LONG - 24;
2615 image &= ~SIG_MSB;
2617 if (exp == 0)
2619 if (image && fmt->has_denorm)
2621 r->cl = rvc_normal;
2622 r->sign = sign;
2623 SET_REAL_EXP (r, -126);
2624 r->sig[SIGSZ-1] = image << 1;
2625 normalize (r);
2627 else if (fmt->has_signed_zero)
2628 r->sign = sign;
2630 else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
2632 if (image)
2634 r->cl = rvc_nan;
2635 r->sign = sign;
2636 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
2637 ^ fmt->qnan_msb_set);
2638 r->sig[SIGSZ-1] = image;
2640 else
2642 r->cl = rvc_inf;
2643 r->sign = sign;
2646 else
2648 r->cl = rvc_normal;
2649 r->sign = sign;
2650 SET_REAL_EXP (r, exp - 127 + 1);
2651 r->sig[SIGSZ-1] = image | SIG_MSB;
2655 const struct real_format ieee_single_format =
2657 encode_ieee_single,
2658 decode_ieee_single,
2663 -125,
2664 128,
2666 true,
2667 true,
2668 true,
2669 true,
2670 true
2673 const struct real_format mips_single_format =
2675 encode_ieee_single,
2676 decode_ieee_single,
2681 -125,
2682 128,
2684 true,
2685 true,
2686 true,
2687 true,
2688 false
2692 /* IEEE double-precision format. */
2694 static void encode_ieee_double (const struct real_format *fmt,
2695 long *, const REAL_VALUE_TYPE *);
2696 static void decode_ieee_double (const struct real_format *,
2697 REAL_VALUE_TYPE *, const long *);
2699 static void
2700 encode_ieee_double (const struct real_format *fmt, long *buf,
2701 const REAL_VALUE_TYPE *r)
2703 unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
2704 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2706 image_hi = r->sign << 31;
2707 image_lo = 0;
2709 if (HOST_BITS_PER_LONG == 64)
2711 sig_hi = r->sig[SIGSZ-1];
2712 sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
2713 sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
2715 else
2717 sig_hi = r->sig[SIGSZ-1];
2718 sig_lo = r->sig[SIGSZ-2];
2719 sig_lo = (sig_hi << 21) | (sig_lo >> 11);
2720 sig_hi = (sig_hi >> 11) & 0xfffff;
2723 switch (r->cl)
2725 case rvc_zero:
2726 break;
2728 case rvc_inf:
2729 if (fmt->has_inf)
2730 image_hi |= 2047 << 20;
2731 else
2733 image_hi |= 0x7fffffff;
2734 image_lo = 0xffffffff;
2736 break;
2738 case rvc_nan:
2739 if (fmt->has_nans)
2741 if (r->canonical)
2742 sig_hi = sig_lo = 0;
2743 if (r->signalling == fmt->qnan_msb_set)
2744 sig_hi &= ~(1 << 19);
2745 else
2746 sig_hi |= 1 << 19;
2747 /* We overload qnan_msb_set here: it's only clear for
2748 mips_ieee_single, which wants all mantissa bits but the
2749 quiet/signalling one set in canonical NaNs (at least
2750 Quiet ones). */
2751 if (r->canonical && !fmt->qnan_msb_set)
2753 sig_hi |= (1 << 19) - 1;
2754 sig_lo = 0xffffffff;
2756 else if (sig_hi == 0 && sig_lo == 0)
2757 sig_hi = 1 << 18;
2759 image_hi |= 2047 << 20;
2760 image_hi |= sig_hi;
2761 image_lo = sig_lo;
2763 else
2765 image_hi |= 0x7fffffff;
2766 image_lo = 0xffffffff;
2768 break;
2770 case rvc_normal:
2771 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2772 whereas the intermediate representation is 0.F x 2**exp.
2773 Which means we're off by one. */
2774 if (denormal)
2775 exp = 0;
2776 else
2777 exp = REAL_EXP (r) + 1023 - 1;
2778 image_hi |= exp << 20;
2779 image_hi |= sig_hi;
2780 image_lo = sig_lo;
2781 break;
2783 default:
2784 abort ();
2787 if (FLOAT_WORDS_BIG_ENDIAN)
2788 buf[0] = image_hi, buf[1] = image_lo;
2789 else
2790 buf[0] = image_lo, buf[1] = image_hi;
2793 static void
2794 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2795 const long *buf)
2797 unsigned long image_hi, image_lo;
2798 bool sign;
2799 int exp;
2801 if (FLOAT_WORDS_BIG_ENDIAN)
2802 image_hi = buf[0], image_lo = buf[1];
2803 else
2804 image_lo = buf[0], image_hi = buf[1];
2805 image_lo &= 0xffffffff;
2806 image_hi &= 0xffffffff;
2808 sign = (image_hi >> 31) & 1;
2809 exp = (image_hi >> 20) & 0x7ff;
2811 memset (r, 0, sizeof (*r));
2813 image_hi <<= 32 - 21;
2814 image_hi |= image_lo >> 21;
2815 image_hi &= 0x7fffffff;
2816 image_lo <<= 32 - 21;
2818 if (exp == 0)
2820 if ((image_hi || image_lo) && fmt->has_denorm)
2822 r->cl = rvc_normal;
2823 r->sign = sign;
2824 SET_REAL_EXP (r, -1022);
2825 if (HOST_BITS_PER_LONG == 32)
2827 image_hi = (image_hi << 1) | (image_lo >> 31);
2828 image_lo <<= 1;
2829 r->sig[SIGSZ-1] = image_hi;
2830 r->sig[SIGSZ-2] = image_lo;
2832 else
2834 image_hi = (image_hi << 31 << 2) | (image_lo << 1);
2835 r->sig[SIGSZ-1] = image_hi;
2837 normalize (r);
2839 else if (fmt->has_signed_zero)
2840 r->sign = sign;
2842 else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
2844 if (image_hi || image_lo)
2846 r->cl = rvc_nan;
2847 r->sign = sign;
2848 r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
2849 if (HOST_BITS_PER_LONG == 32)
2851 r->sig[SIGSZ-1] = image_hi;
2852 r->sig[SIGSZ-2] = image_lo;
2854 else
2855 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
2857 else
2859 r->cl = rvc_inf;
2860 r->sign = sign;
2863 else
2865 r->cl = rvc_normal;
2866 r->sign = sign;
2867 SET_REAL_EXP (r, exp - 1023 + 1);
2868 if (HOST_BITS_PER_LONG == 32)
2870 r->sig[SIGSZ-1] = image_hi | SIG_MSB;
2871 r->sig[SIGSZ-2] = image_lo;
2873 else
2874 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
2878 const struct real_format ieee_double_format =
2880 encode_ieee_double,
2881 decode_ieee_double,
2886 -1021,
2887 1024,
2889 true,
2890 true,
2891 true,
2892 true,
2893 true
2896 const struct real_format mips_double_format =
2898 encode_ieee_double,
2899 decode_ieee_double,
2904 -1021,
2905 1024,
2907 true,
2908 true,
2909 true,
2910 true,
2911 false
2915 /* IEEE extended real format. This comes in three flavors: Intel's as
2916 a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
2917 12- and 16-byte images may be big- or little endian; Motorola's is
2918 always big endian. */
2920 /* Helper subroutine which converts from the internal format to the
2921 12-byte little-endian Intel format. Functions below adjust this
2922 for the other possible formats. */
2923 static void
2924 encode_ieee_extended (const struct real_format *fmt, long *buf,
2925 const REAL_VALUE_TYPE *r)
2927 unsigned long image_hi, sig_hi, sig_lo;
2928 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2930 image_hi = r->sign << 15;
2931 sig_hi = sig_lo = 0;
2933 switch (r->cl)
2935 case rvc_zero:
2936 break;
2938 case rvc_inf:
2939 if (fmt->has_inf)
2941 image_hi |= 32767;
2943 /* Intel requires the explicit integer bit to be set, otherwise
2944 it considers the value a "pseudo-infinity". Motorola docs
2945 say it doesn't care. */
2946 sig_hi = 0x80000000;
2948 else
2950 image_hi |= 32767;
2951 sig_lo = sig_hi = 0xffffffff;
2953 break;
2955 case rvc_nan:
2956 if (fmt->has_nans)
2958 image_hi |= 32767;
2959 if (HOST_BITS_PER_LONG == 32)
2961 sig_hi = r->sig[SIGSZ-1];
2962 sig_lo = r->sig[SIGSZ-2];
2964 else
2966 sig_lo = r->sig[SIGSZ-1];
2967 sig_hi = sig_lo >> 31 >> 1;
2968 sig_lo &= 0xffffffff;
2970 if (r->signalling == fmt->qnan_msb_set)
2971 sig_hi &= ~(1 << 30);
2972 else
2973 sig_hi |= 1 << 30;
2974 if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
2975 sig_hi = 1 << 29;
2977 /* Intel requires the explicit integer bit to be set, otherwise
2978 it considers the value a "pseudo-nan". Motorola docs say it
2979 doesn't care. */
2980 sig_hi |= 0x80000000;
2982 else
2984 image_hi |= 32767;
2985 sig_lo = sig_hi = 0xffffffff;
2987 break;
2989 case rvc_normal:
2991 int exp = REAL_EXP (r);
2993 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2994 whereas the intermediate representation is 0.F x 2**exp.
2995 Which means we're off by one.
2997 Except for Motorola, which consider exp=0 and explicit
2998 integer bit set to continue to be normalized. In theory
2999 this discrepancy has been taken care of by the difference
3000 in fmt->emin in round_for_format. */
3002 if (denormal)
3003 exp = 0;
3004 else
3006 exp += 16383 - 1;
3007 if (exp < 0)
3008 abort ();
3010 image_hi |= exp;
3012 if (HOST_BITS_PER_LONG == 32)
3014 sig_hi = r->sig[SIGSZ-1];
3015 sig_lo = r->sig[SIGSZ-2];
3017 else
3019 sig_lo = r->sig[SIGSZ-1];
3020 sig_hi = sig_lo >> 31 >> 1;
3021 sig_lo &= 0xffffffff;
3024 break;
3026 default:
3027 abort ();
3030 buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3033 /* Convert from the internal format to the 12-byte Motorola format
3034 for an IEEE extended real. */
3035 static void
3036 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3037 const REAL_VALUE_TYPE *r)
3039 long intermed[3];
3040 encode_ieee_extended (fmt, intermed, r);
3042 /* Motorola chips are assumed always to be big-endian. Also, the
3043 padding in a Motorola extended real goes between the exponent and
3044 the mantissa. At this point the mantissa is entirely within
3045 elements 0 and 1 of intermed, and the exponent entirely within
3046 element 2, so all we have to do is swap the order around, and
3047 shift element 2 left 16 bits. */
3048 buf[0] = intermed[2] << 16;
3049 buf[1] = intermed[1];
3050 buf[2] = intermed[0];
3053 /* Convert from the internal format to the 12-byte Intel format for
3054 an IEEE extended real. */
3055 static void
3056 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3057 const REAL_VALUE_TYPE *r)
3059 if (FLOAT_WORDS_BIG_ENDIAN)
3061 /* All the padding in an Intel-format extended real goes at the high
3062 end, which in this case is after the mantissa, not the exponent.
3063 Therefore we must shift everything down 16 bits. */
3064 long intermed[3];
3065 encode_ieee_extended (fmt, intermed, r);
3066 buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3067 buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3068 buf[2] = (intermed[0] << 16);
3070 else
3071 /* encode_ieee_extended produces what we want directly. */
3072 encode_ieee_extended (fmt, buf, r);
3075 /* Convert from the internal format to the 16-byte Intel format for
3076 an IEEE extended real. */
3077 static void
3078 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3079 const REAL_VALUE_TYPE *r)
3081 /* All the padding in an Intel-format extended real goes at the high end. */
3082 encode_ieee_extended_intel_96 (fmt, buf, r);
3083 buf[3] = 0;
3086 /* As above, we have a helper function which converts from 12-byte
3087 little-endian Intel format to internal format. Functions below
3088 adjust for the other possible formats. */
3089 static void
3090 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3091 const long *buf)
3093 unsigned long image_hi, sig_hi, sig_lo;
3094 bool sign;
3095 int exp;
3097 sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3098 sig_lo &= 0xffffffff;
3099 sig_hi &= 0xffffffff;
3100 image_hi &= 0xffffffff;
3102 sign = (image_hi >> 15) & 1;
3103 exp = image_hi & 0x7fff;
3105 memset (r, 0, sizeof (*r));
3107 if (exp == 0)
3109 if ((sig_hi || sig_lo) && fmt->has_denorm)
3111 r->cl = rvc_normal;
3112 r->sign = sign;
3114 /* When the IEEE format contains a hidden bit, we know that
3115 it's zero at this point, and so shift up the significand
3116 and decrease the exponent to match. In this case, Motorola
3117 defines the explicit integer bit to be valid, so we don't
3118 know whether the msb is set or not. */
3119 SET_REAL_EXP (r, fmt->emin);
3120 if (HOST_BITS_PER_LONG == 32)
3122 r->sig[SIGSZ-1] = sig_hi;
3123 r->sig[SIGSZ-2] = sig_lo;
3125 else
3126 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3128 normalize (r);
3130 else if (fmt->has_signed_zero)
3131 r->sign = sign;
3133 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3135 /* See above re "pseudo-infinities" and "pseudo-nans".
3136 Short summary is that the MSB will likely always be
3137 set, and that we don't care about it. */
3138 sig_hi &= 0x7fffffff;
3140 if (sig_hi || sig_lo)
3142 r->cl = rvc_nan;
3143 r->sign = sign;
3144 r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3145 if (HOST_BITS_PER_LONG == 32)
3147 r->sig[SIGSZ-1] = sig_hi;
3148 r->sig[SIGSZ-2] = sig_lo;
3150 else
3151 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3153 else
3155 r->cl = rvc_inf;
3156 r->sign = sign;
3159 else
3161 r->cl = rvc_normal;
3162 r->sign = sign;
3163 SET_REAL_EXP (r, exp - 16383 + 1);
3164 if (HOST_BITS_PER_LONG == 32)
3166 r->sig[SIGSZ-1] = sig_hi;
3167 r->sig[SIGSZ-2] = sig_lo;
3169 else
3170 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3174 /* Convert from the internal format to the 12-byte Motorola format
3175 for an IEEE extended real. */
3176 static void
3177 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3178 const long *buf)
3180 long intermed[3];
3182 /* Motorola chips are assumed always to be big-endian. Also, the
3183 padding in a Motorola extended real goes between the exponent and
3184 the mantissa; remove it. */
3185 intermed[0] = buf[2];
3186 intermed[1] = buf[1];
3187 intermed[2] = (unsigned long)buf[0] >> 16;
3189 decode_ieee_extended (fmt, r, intermed);
3192 /* Convert from the internal format to the 12-byte Intel format for
3193 an IEEE extended real. */
3194 static void
3195 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3196 const long *buf)
3198 if (FLOAT_WORDS_BIG_ENDIAN)
3200 /* All the padding in an Intel-format extended real goes at the high
3201 end, which in this case is after the mantissa, not the exponent.
3202 Therefore we must shift everything up 16 bits. */
3203 long intermed[3];
3205 intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3206 intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3207 intermed[2] = ((unsigned long)buf[0] >> 16);
3209 decode_ieee_extended (fmt, r, intermed);
3211 else
3212 /* decode_ieee_extended produces what we want directly. */
3213 decode_ieee_extended (fmt, r, buf);
3216 /* Convert from the internal format to the 16-byte Intel format for
3217 an IEEE extended real. */
3218 static void
3219 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3220 const long *buf)
3222 /* All the padding in an Intel-format extended real goes at the high end. */
3223 decode_ieee_extended_intel_96 (fmt, r, buf);
3226 const struct real_format ieee_extended_motorola_format =
3228 encode_ieee_extended_motorola,
3229 decode_ieee_extended_motorola,
3234 -16382,
3235 16384,
3237 true,
3238 true,
3239 true,
3240 true,
3241 true
3244 const struct real_format ieee_extended_intel_96_format =
3246 encode_ieee_extended_intel_96,
3247 decode_ieee_extended_intel_96,
3252 -16381,
3253 16384,
3255 true,
3256 true,
3257 true,
3258 true,
3259 true
3262 const struct real_format ieee_extended_intel_128_format =
3264 encode_ieee_extended_intel_128,
3265 decode_ieee_extended_intel_128,
3270 -16381,
3271 16384,
3273 true,
3274 true,
3275 true,
3276 true,
3277 true
3280 /* The following caters to i386 systems that set the rounding precision
3281 to 53 bits instead of 64, e.g. FreeBSD. */
3282 const struct real_format ieee_extended_intel_96_round_53_format =
3284 encode_ieee_extended_intel_96,
3285 decode_ieee_extended_intel_96,
3290 -16381,
3291 16384,
3293 true,
3294 true,
3295 true,
3296 true,
3297 true
3300 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3301 numbers whose sum is equal to the extended precision value. The number
3302 with greater magnitude is first. This format has the same magnitude
3303 range as an IEEE double precision value, but effectively 106 bits of
3304 significand precision. Infinity and NaN are represented by their IEEE
3305 double precision value stored in the first number, the second number is
3306 ignored. Zeroes, Infinities, and NaNs are set in both doubles
3307 due to precedent. */
3309 static void encode_ibm_extended (const struct real_format *fmt,
3310 long *, const REAL_VALUE_TYPE *);
3311 static void decode_ibm_extended (const struct real_format *,
3312 REAL_VALUE_TYPE *, const long *);
3314 static void
3315 encode_ibm_extended (const struct real_format *fmt, long *buf,
3316 const REAL_VALUE_TYPE *r)
3318 REAL_VALUE_TYPE u, normr, v;
3319 const struct real_format *base_fmt;
3321 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3323 /* Renormlize R before doing any arithmetic on it. */
3324 normr = *r;
3325 if (normr.cl == rvc_normal)
3326 normalize (&normr);
3328 /* u = IEEE double precision portion of significand. */
3329 u = normr;
3330 round_for_format (base_fmt, &u);
3331 encode_ieee_double (base_fmt, &buf[0], &u);
3333 if (u.cl == rvc_normal)
3335 do_add (&v, &normr, &u, 1);
3336 /* Call round_for_format since we might need to denormalize. */
3337 round_for_format (base_fmt, &v);
3338 encode_ieee_double (base_fmt, &buf[2], &v);
3340 else
3342 /* Inf, NaN, 0 are all representable as doubles, so the
3343 least-significant part can be 0.0. */
3344 buf[2] = 0;
3345 buf[3] = 0;
3349 static void
3350 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3351 const long *buf)
3353 REAL_VALUE_TYPE u, v;
3354 const struct real_format *base_fmt;
3356 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3357 decode_ieee_double (base_fmt, &u, &buf[0]);
3359 if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3361 decode_ieee_double (base_fmt, &v, &buf[2]);
3362 do_add (r, &u, &v, 0);
3364 else
3365 *r = u;
3368 const struct real_format ibm_extended_format =
3370 encode_ibm_extended,
3371 decode_ibm_extended,
3374 53 + 53,
3376 -1021 + 53,
3377 1024,
3379 true,
3380 true,
3381 true,
3382 true,
3383 true
3386 const struct real_format mips_extended_format =
3388 encode_ibm_extended,
3389 decode_ibm_extended,
3392 53 + 53,
3394 -1021 + 53,
3395 1024,
3397 true,
3398 true,
3399 true,
3400 true,
3401 false
3405 /* IEEE quad precision format. */
3407 static void encode_ieee_quad (const struct real_format *fmt,
3408 long *, const REAL_VALUE_TYPE *);
3409 static void decode_ieee_quad (const struct real_format *,
3410 REAL_VALUE_TYPE *, const long *);
3412 static void
3413 encode_ieee_quad (const struct real_format *fmt, long *buf,
3414 const REAL_VALUE_TYPE *r)
3416 unsigned long image3, image2, image1, image0, exp;
3417 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3418 REAL_VALUE_TYPE u;
3420 image3 = r->sign << 31;
3421 image2 = 0;
3422 image1 = 0;
3423 image0 = 0;
3425 rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3427 switch (r->cl)
3429 case rvc_zero:
3430 break;
3432 case rvc_inf:
3433 if (fmt->has_inf)
3434 image3 |= 32767 << 16;
3435 else
3437 image3 |= 0x7fffffff;
3438 image2 = 0xffffffff;
3439 image1 = 0xffffffff;
3440 image0 = 0xffffffff;
3442 break;
3444 case rvc_nan:
3445 if (fmt->has_nans)
3447 image3 |= 32767 << 16;
3449 if (r->canonical)
3451 /* Don't use bits from the significand. The
3452 initialization above is right. */
3454 else if (HOST_BITS_PER_LONG == 32)
3456 image0 = u.sig[0];
3457 image1 = u.sig[1];
3458 image2 = u.sig[2];
3459 image3 |= u.sig[3] & 0xffff;
3461 else
3463 image0 = u.sig[0];
3464 image1 = image0 >> 31 >> 1;
3465 image2 = u.sig[1];
3466 image3 |= (image2 >> 31 >> 1) & 0xffff;
3467 image0 &= 0xffffffff;
3468 image2 &= 0xffffffff;
3470 if (r->signalling == fmt->qnan_msb_set)
3471 image3 &= ~0x8000;
3472 else
3473 image3 |= 0x8000;
3474 /* We overload qnan_msb_set here: it's only clear for
3475 mips_ieee_single, which wants all mantissa bits but the
3476 quiet/signalling one set in canonical NaNs (at least
3477 Quiet ones). */
3478 if (r->canonical && !fmt->qnan_msb_set)
3480 image3 |= 0x7fff;
3481 image2 = image1 = image0 = 0xffffffff;
3483 else if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3484 image3 |= 0x4000;
3486 else
3488 image3 |= 0x7fffffff;
3489 image2 = 0xffffffff;
3490 image1 = 0xffffffff;
3491 image0 = 0xffffffff;
3493 break;
3495 case rvc_normal:
3496 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3497 whereas the intermediate representation is 0.F x 2**exp.
3498 Which means we're off by one. */
3499 if (denormal)
3500 exp = 0;
3501 else
3502 exp = REAL_EXP (r) + 16383 - 1;
3503 image3 |= exp << 16;
3505 if (HOST_BITS_PER_LONG == 32)
3507 image0 = u.sig[0];
3508 image1 = u.sig[1];
3509 image2 = u.sig[2];
3510 image3 |= u.sig[3] & 0xffff;
3512 else
3514 image0 = u.sig[0];
3515 image1 = image0 >> 31 >> 1;
3516 image2 = u.sig[1];
3517 image3 |= (image2 >> 31 >> 1) & 0xffff;
3518 image0 &= 0xffffffff;
3519 image2 &= 0xffffffff;
3521 break;
3523 default:
3524 abort ();
3527 if (FLOAT_WORDS_BIG_ENDIAN)
3529 buf[0] = image3;
3530 buf[1] = image2;
3531 buf[2] = image1;
3532 buf[3] = image0;
3534 else
3536 buf[0] = image0;
3537 buf[1] = image1;
3538 buf[2] = image2;
3539 buf[3] = image3;
3543 static void
3544 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3545 const long *buf)
3547 unsigned long image3, image2, image1, image0;
3548 bool sign;
3549 int exp;
3551 if (FLOAT_WORDS_BIG_ENDIAN)
3553 image3 = buf[0];
3554 image2 = buf[1];
3555 image1 = buf[2];
3556 image0 = buf[3];
3558 else
3560 image0 = buf[0];
3561 image1 = buf[1];
3562 image2 = buf[2];
3563 image3 = buf[3];
3565 image0 &= 0xffffffff;
3566 image1 &= 0xffffffff;
3567 image2 &= 0xffffffff;
3569 sign = (image3 >> 31) & 1;
3570 exp = (image3 >> 16) & 0x7fff;
3571 image3 &= 0xffff;
3573 memset (r, 0, sizeof (*r));
3575 if (exp == 0)
3577 if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
3579 r->cl = rvc_normal;
3580 r->sign = sign;
3582 SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
3583 if (HOST_BITS_PER_LONG == 32)
3585 r->sig[0] = image0;
3586 r->sig[1] = image1;
3587 r->sig[2] = image2;
3588 r->sig[3] = image3;
3590 else
3592 r->sig[0] = (image1 << 31 << 1) | image0;
3593 r->sig[1] = (image3 << 31 << 1) | image2;
3596 normalize (r);
3598 else if (fmt->has_signed_zero)
3599 r->sign = sign;
3601 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3603 if (image3 | image2 | image1 | image0)
3605 r->cl = rvc_nan;
3606 r->sign = sign;
3607 r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
3609 if (HOST_BITS_PER_LONG == 32)
3611 r->sig[0] = image0;
3612 r->sig[1] = image1;
3613 r->sig[2] = image2;
3614 r->sig[3] = image3;
3616 else
3618 r->sig[0] = (image1 << 31 << 1) | image0;
3619 r->sig[1] = (image3 << 31 << 1) | image2;
3621 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3623 else
3625 r->cl = rvc_inf;
3626 r->sign = sign;
3629 else
3631 r->cl = rvc_normal;
3632 r->sign = sign;
3633 SET_REAL_EXP (r, exp - 16383 + 1);
3635 if (HOST_BITS_PER_LONG == 32)
3637 r->sig[0] = image0;
3638 r->sig[1] = image1;
3639 r->sig[2] = image2;
3640 r->sig[3] = image3;
3642 else
3644 r->sig[0] = (image1 << 31 << 1) | image0;
3645 r->sig[1] = (image3 << 31 << 1) | image2;
3647 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3648 r->sig[SIGSZ-1] |= SIG_MSB;
3652 const struct real_format ieee_quad_format =
3654 encode_ieee_quad,
3655 decode_ieee_quad,
3658 113,
3659 113,
3660 -16381,
3661 16384,
3662 127,
3663 true,
3664 true,
3665 true,
3666 true,
3667 true
3670 const struct real_format mips_quad_format =
3672 encode_ieee_quad,
3673 decode_ieee_quad,
3676 113,
3677 113,
3678 -16381,
3679 16384,
3680 127,
3681 true,
3682 true,
3683 true,
3684 true,
3685 false
3688 /* Descriptions of VAX floating point formats can be found beginning at
3690 http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
3692 The thing to remember is that they're almost IEEE, except for word
3693 order, exponent bias, and the lack of infinities, nans, and denormals.
3695 We don't implement the H_floating format here, simply because neither
3696 the VAX or Alpha ports use it. */
3698 static void encode_vax_f (const struct real_format *fmt,
3699 long *, const REAL_VALUE_TYPE *);
3700 static void decode_vax_f (const struct real_format *,
3701 REAL_VALUE_TYPE *, const long *);
3702 static void encode_vax_d (const struct real_format *fmt,
3703 long *, const REAL_VALUE_TYPE *);
3704 static void decode_vax_d (const struct real_format *,
3705 REAL_VALUE_TYPE *, const long *);
3706 static void encode_vax_g (const struct real_format *fmt,
3707 long *, const REAL_VALUE_TYPE *);
3708 static void decode_vax_g (const struct real_format *,
3709 REAL_VALUE_TYPE *, const long *);
3711 static void
3712 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3713 const REAL_VALUE_TYPE *r)
3715 unsigned long sign, exp, sig, image;
3717 sign = r->sign << 15;
3719 switch (r->cl)
3721 case rvc_zero:
3722 image = 0;
3723 break;
3725 case rvc_inf:
3726 case rvc_nan:
3727 image = 0xffff7fff | sign;
3728 break;
3730 case rvc_normal:
3731 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
3732 exp = REAL_EXP (r) + 128;
3734 image = (sig << 16) & 0xffff0000;
3735 image |= sign;
3736 image |= exp << 7;
3737 image |= sig >> 16;
3738 break;
3740 default:
3741 abort ();
3744 buf[0] = image;
3747 static void
3748 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
3749 REAL_VALUE_TYPE *r, const long *buf)
3751 unsigned long image = buf[0] & 0xffffffff;
3752 int exp = (image >> 7) & 0xff;
3754 memset (r, 0, sizeof (*r));
3756 if (exp != 0)
3758 r->cl = rvc_normal;
3759 r->sign = (image >> 15) & 1;
3760 SET_REAL_EXP (r, exp - 128);
3762 image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
3763 r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
3767 static void
3768 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3769 const REAL_VALUE_TYPE *r)
3771 unsigned long image0, image1, sign = r->sign << 15;
3773 switch (r->cl)
3775 case rvc_zero:
3776 image0 = image1 = 0;
3777 break;
3779 case rvc_inf:
3780 case rvc_nan:
3781 image0 = 0xffff7fff | sign;
3782 image1 = 0xffffffff;
3783 break;
3785 case rvc_normal:
3786 /* Extract the significand into straight hi:lo. */
3787 if (HOST_BITS_PER_LONG == 64)
3789 image0 = r->sig[SIGSZ-1];
3790 image1 = (image0 >> (64 - 56)) & 0xffffffff;
3791 image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
3793 else
3795 image0 = r->sig[SIGSZ-1];
3796 image1 = r->sig[SIGSZ-2];
3797 image1 = (image0 << 24) | (image1 >> 8);
3798 image0 = (image0 >> 8) & 0xffffff;
3801 /* Rearrange the half-words of the significand to match the
3802 external format. */
3803 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
3804 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3806 /* Add the sign and exponent. */
3807 image0 |= sign;
3808 image0 |= (REAL_EXP (r) + 128) << 7;
3809 break;
3811 default:
3812 abort ();
3815 if (FLOAT_WORDS_BIG_ENDIAN)
3816 buf[0] = image1, buf[1] = image0;
3817 else
3818 buf[0] = image0, buf[1] = image1;
3821 static void
3822 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
3823 REAL_VALUE_TYPE *r, const long *buf)
3825 unsigned long image0, image1;
3826 int exp;
3828 if (FLOAT_WORDS_BIG_ENDIAN)
3829 image1 = buf[0], image0 = buf[1];
3830 else
3831 image0 = buf[0], image1 = buf[1];
3832 image0 &= 0xffffffff;
3833 image1 &= 0xffffffff;
3835 exp = (image0 >> 7) & 0xff;
3837 memset (r, 0, sizeof (*r));
3839 if (exp != 0)
3841 r->cl = rvc_normal;
3842 r->sign = (image0 >> 15) & 1;
3843 SET_REAL_EXP (r, exp - 128);
3845 /* Rearrange the half-words of the external format into
3846 proper ascending order. */
3847 image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
3848 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3850 if (HOST_BITS_PER_LONG == 64)
3852 image0 = (image0 << 31 << 1) | image1;
3853 image0 <<= 64 - 56;
3854 image0 |= SIG_MSB;
3855 r->sig[SIGSZ-1] = image0;
3857 else
3859 r->sig[SIGSZ-1] = image0;
3860 r->sig[SIGSZ-2] = image1;
3861 lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
3862 r->sig[SIGSZ-1] |= SIG_MSB;
3867 static void
3868 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3869 const REAL_VALUE_TYPE *r)
3871 unsigned long image0, image1, sign = r->sign << 15;
3873 switch (r->cl)
3875 case rvc_zero:
3876 image0 = image1 = 0;
3877 break;
3879 case rvc_inf:
3880 case rvc_nan:
3881 image0 = 0xffff7fff | sign;
3882 image1 = 0xffffffff;
3883 break;
3885 case rvc_normal:
3886 /* Extract the significand into straight hi:lo. */
3887 if (HOST_BITS_PER_LONG == 64)
3889 image0 = r->sig[SIGSZ-1];
3890 image1 = (image0 >> (64 - 53)) & 0xffffffff;
3891 image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
3893 else
3895 image0 = r->sig[SIGSZ-1];
3896 image1 = r->sig[SIGSZ-2];
3897 image1 = (image0 << 21) | (image1 >> 11);
3898 image0 = (image0 >> 11) & 0xfffff;
3901 /* Rearrange the half-words of the significand to match the
3902 external format. */
3903 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
3904 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3906 /* Add the sign and exponent. */
3907 image0 |= sign;
3908 image0 |= (REAL_EXP (r) + 1024) << 4;
3909 break;
3911 default:
3912 abort ();
3915 if (FLOAT_WORDS_BIG_ENDIAN)
3916 buf[0] = image1, buf[1] = image0;
3917 else
3918 buf[0] = image0, buf[1] = image1;
3921 static void
3922 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
3923 REAL_VALUE_TYPE *r, const long *buf)
3925 unsigned long image0, image1;
3926 int exp;
3928 if (FLOAT_WORDS_BIG_ENDIAN)
3929 image1 = buf[0], image0 = buf[1];
3930 else
3931 image0 = buf[0], image1 = buf[1];
3932 image0 &= 0xffffffff;
3933 image1 &= 0xffffffff;
3935 exp = (image0 >> 4) & 0x7ff;
3937 memset (r, 0, sizeof (*r));
3939 if (exp != 0)
3941 r->cl = rvc_normal;
3942 r->sign = (image0 >> 15) & 1;
3943 SET_REAL_EXP (r, exp - 1024);
3945 /* Rearrange the half-words of the external format into
3946 proper ascending order. */
3947 image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
3948 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3950 if (HOST_BITS_PER_LONG == 64)
3952 image0 = (image0 << 31 << 1) | image1;
3953 image0 <<= 64 - 53;
3954 image0 |= SIG_MSB;
3955 r->sig[SIGSZ-1] = image0;
3957 else
3959 r->sig[SIGSZ-1] = image0;
3960 r->sig[SIGSZ-2] = image1;
3961 lshift_significand (r, r, 64 - 53);
3962 r->sig[SIGSZ-1] |= SIG_MSB;
3967 const struct real_format vax_f_format =
3969 encode_vax_f,
3970 decode_vax_f,
3975 -127,
3976 127,
3978 false,
3979 false,
3980 false,
3981 false,
3982 false
3985 const struct real_format vax_d_format =
3987 encode_vax_d,
3988 decode_vax_d,
3993 -127,
3994 127,
3996 false,
3997 false,
3998 false,
3999 false,
4000 false
4003 const struct real_format vax_g_format =
4005 encode_vax_g,
4006 decode_vax_g,
4011 -1023,
4012 1023,
4014 false,
4015 false,
4016 false,
4017 false,
4018 false
4021 /* A good reference for these can be found in chapter 9 of
4022 "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
4023 An on-line version can be found here:
4025 http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
4028 static void encode_i370_single (const struct real_format *fmt,
4029 long *, const REAL_VALUE_TYPE *);
4030 static void decode_i370_single (const struct real_format *,
4031 REAL_VALUE_TYPE *, const long *);
4032 static void encode_i370_double (const struct real_format *fmt,
4033 long *, const REAL_VALUE_TYPE *);
4034 static void decode_i370_double (const struct real_format *,
4035 REAL_VALUE_TYPE *, const long *);
4037 static void
4038 encode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4039 long *buf, const REAL_VALUE_TYPE *r)
4041 unsigned long sign, exp, sig, image;
4043 sign = r->sign << 31;
4045 switch (r->cl)
4047 case rvc_zero:
4048 image = 0;
4049 break;
4051 case rvc_inf:
4052 case rvc_nan:
4053 image = 0x7fffffff | sign;
4054 break;
4056 case rvc_normal:
4057 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
4058 exp = ((REAL_EXP (r) / 4) + 64) << 24;
4059 image = sign | exp | sig;
4060 break;
4062 default:
4063 abort ();
4066 buf[0] = image;
4069 static void
4070 decode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4071 REAL_VALUE_TYPE *r, const long *buf)
4073 unsigned long sign, sig, image = buf[0];
4074 int exp;
4076 sign = (image >> 31) & 1;
4077 exp = (image >> 24) & 0x7f;
4078 sig = image & 0xffffff;
4080 memset (r, 0, sizeof (*r));
4082 if (exp || sig)
4084 r->cl = rvc_normal;
4085 r->sign = sign;
4086 SET_REAL_EXP (r, (exp - 64) * 4);
4087 r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
4088 normalize (r);
4092 static void
4093 encode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4094 long *buf, const REAL_VALUE_TYPE *r)
4096 unsigned long sign, exp, image_hi, image_lo;
4098 sign = r->sign << 31;
4100 switch (r->cl)
4102 case rvc_zero:
4103 image_hi = image_lo = 0;
4104 break;
4106 case rvc_inf:
4107 case rvc_nan:
4108 image_hi = 0x7fffffff | sign;
4109 image_lo = 0xffffffff;
4110 break;
4112 case rvc_normal:
4113 if (HOST_BITS_PER_LONG == 64)
4115 image_hi = r->sig[SIGSZ-1];
4116 image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
4117 image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
4119 else
4121 image_hi = r->sig[SIGSZ-1];
4122 image_lo = r->sig[SIGSZ-2];
4123 image_lo = (image_lo >> 8) | (image_hi << 24);
4124 image_hi >>= 8;
4127 exp = ((REAL_EXP (r) / 4) + 64) << 24;
4128 image_hi |= sign | exp;
4129 break;
4131 default:
4132 abort ();
4135 if (FLOAT_WORDS_BIG_ENDIAN)
4136 buf[0] = image_hi, buf[1] = image_lo;
4137 else
4138 buf[0] = image_lo, buf[1] = image_hi;
4141 static void
4142 decode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4143 REAL_VALUE_TYPE *r, const long *buf)
4145 unsigned long sign, image_hi, image_lo;
4146 int exp;
4148 if (FLOAT_WORDS_BIG_ENDIAN)
4149 image_hi = buf[0], image_lo = buf[1];
4150 else
4151 image_lo = buf[0], image_hi = buf[1];
4153 sign = (image_hi >> 31) & 1;
4154 exp = (image_hi >> 24) & 0x7f;
4155 image_hi &= 0xffffff;
4156 image_lo &= 0xffffffff;
4158 memset (r, 0, sizeof (*r));
4160 if (exp || image_hi || image_lo)
4162 r->cl = rvc_normal;
4163 r->sign = sign;
4164 SET_REAL_EXP (r, (exp - 64) * 4 + (SIGNIFICAND_BITS - 56));
4166 if (HOST_BITS_PER_LONG == 32)
4168 r->sig[0] = image_lo;
4169 r->sig[1] = image_hi;
4171 else
4172 r->sig[0] = image_lo | (image_hi << 31 << 1);
4174 normalize (r);
4178 const struct real_format i370_single_format =
4180 encode_i370_single,
4181 decode_i370_single,
4186 -64,
4189 false,
4190 false,
4191 false, /* ??? The encoding does allow for "unnormals". */
4192 false, /* ??? The encoding does allow for "unnormals". */
4193 false
4196 const struct real_format i370_double_format =
4198 encode_i370_double,
4199 decode_i370_double,
4204 -64,
4207 false,
4208 false,
4209 false, /* ??? The encoding does allow for "unnormals". */
4210 false, /* ??? The encoding does allow for "unnormals". */
4211 false
4214 /* The "twos-complement" c4x format is officially defined as
4216 x = s(~s).f * 2**e
4218 This is rather misleading. One must remember that F is signed.
4219 A better description would be
4221 x = -1**s * ((s + 1 + .f) * 2**e
4223 So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
4224 that's -1 * (1+1+(-.5)) == -1.5. I think.
4226 The constructions here are taken from Tables 5-1 and 5-2 of the
4227 TMS320C4x User's Guide wherein step-by-step instructions for
4228 conversion from IEEE are presented. That's close enough to our
4229 internal representation so as to make things easy.
4231 See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf */
4233 static void encode_c4x_single (const struct real_format *fmt,
4234 long *, const REAL_VALUE_TYPE *);
4235 static void decode_c4x_single (const struct real_format *,
4236 REAL_VALUE_TYPE *, const long *);
4237 static void encode_c4x_extended (const struct real_format *fmt,
4238 long *, const REAL_VALUE_TYPE *);
4239 static void decode_c4x_extended (const struct real_format *,
4240 REAL_VALUE_TYPE *, const long *);
4242 static void
4243 encode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4244 long *buf, const REAL_VALUE_TYPE *r)
4246 unsigned long image, exp, sig;
4248 switch (r->cl)
4250 case rvc_zero:
4251 exp = -128;
4252 sig = 0;
4253 break;
4255 case rvc_inf:
4256 case rvc_nan:
4257 exp = 127;
4258 sig = 0x800000 - r->sign;
4259 break;
4261 case rvc_normal:
4262 exp = REAL_EXP (r) - 1;
4263 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4264 if (r->sign)
4266 if (sig)
4267 sig = -sig;
4268 else
4269 exp--;
4270 sig |= 0x800000;
4272 break;
4274 default:
4275 abort ();
4278 image = ((exp & 0xff) << 24) | (sig & 0xffffff);
4279 buf[0] = image;
4282 static void
4283 decode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4284 REAL_VALUE_TYPE *r, const long *buf)
4286 unsigned long image = buf[0];
4287 unsigned long sig;
4288 int exp, sf;
4290 exp = (((image >> 24) & 0xff) ^ 0x80) - 0x80;
4291 sf = ((image & 0xffffff) ^ 0x800000) - 0x800000;
4293 memset (r, 0, sizeof (*r));
4295 if (exp != -128)
4297 r->cl = rvc_normal;
4299 sig = sf & 0x7fffff;
4300 if (sf < 0)
4302 r->sign = 1;
4303 if (sig)
4304 sig = -sig;
4305 else
4306 exp++;
4308 sig = (sig << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4310 SET_REAL_EXP (r, exp + 1);
4311 r->sig[SIGSZ-1] = sig;
4315 static void
4316 encode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4317 long *buf, const REAL_VALUE_TYPE *r)
4319 unsigned long exp, sig;
4321 switch (r->cl)
4323 case rvc_zero:
4324 exp = -128;
4325 sig = 0;
4326 break;
4328 case rvc_inf:
4329 case rvc_nan:
4330 exp = 127;
4331 sig = 0x80000000 - r->sign;
4332 break;
4334 case rvc_normal:
4335 exp = REAL_EXP (r) - 1;
4337 sig = r->sig[SIGSZ-1];
4338 if (HOST_BITS_PER_LONG == 64)
4339 sig = sig >> 1 >> 31;
4340 sig &= 0x7fffffff;
4342 if (r->sign)
4344 if (sig)
4345 sig = -sig;
4346 else
4347 exp--;
4348 sig |= 0x80000000;
4350 break;
4352 default:
4353 abort ();
4356 exp = (exp & 0xff) << 24;
4357 sig &= 0xffffffff;
4359 if (FLOAT_WORDS_BIG_ENDIAN)
4360 buf[0] = exp, buf[1] = sig;
4361 else
4362 buf[0] = sig, buf[0] = exp;
4365 static void
4366 decode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4367 REAL_VALUE_TYPE *r, const long *buf)
4369 unsigned long sig;
4370 int exp, sf;
4372 if (FLOAT_WORDS_BIG_ENDIAN)
4373 exp = buf[0], sf = buf[1];
4374 else
4375 sf = buf[0], exp = buf[1];
4377 exp = (((exp >> 24) & 0xff) & 0x80) - 0x80;
4378 sf = ((sf & 0xffffffff) ^ 0x80000000) - 0x80000000;
4380 memset (r, 0, sizeof (*r));
4382 if (exp != -128)
4384 r->cl = rvc_normal;
4386 sig = sf & 0x7fffffff;
4387 if (sf < 0)
4389 r->sign = 1;
4390 if (sig)
4391 sig = -sig;
4392 else
4393 exp++;
4395 if (HOST_BITS_PER_LONG == 64)
4396 sig = sig << 1 << 31;
4397 sig |= SIG_MSB;
4399 SET_REAL_EXP (r, exp + 1);
4400 r->sig[SIGSZ-1] = sig;
4404 const struct real_format c4x_single_format =
4406 encode_c4x_single,
4407 decode_c4x_single,
4412 -126,
4413 128,
4415 false,
4416 false,
4417 false,
4418 false,
4419 false
4422 const struct real_format c4x_extended_format =
4424 encode_c4x_extended,
4425 decode_c4x_extended,
4430 -126,
4431 128,
4433 false,
4434 false,
4435 false,
4436 false,
4437 false
4441 /* A synthetic "format" for internal arithmetic. It's the size of the
4442 internal significand minus the two bits needed for proper rounding.
4443 The encode and decode routines exist only to satisfy our paranoia
4444 harness. */
4446 static void encode_internal (const struct real_format *fmt,
4447 long *, const REAL_VALUE_TYPE *);
4448 static void decode_internal (const struct real_format *,
4449 REAL_VALUE_TYPE *, const long *);
4451 static void
4452 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4453 const REAL_VALUE_TYPE *r)
4455 memcpy (buf, r, sizeof (*r));
4458 static void
4459 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4460 REAL_VALUE_TYPE *r, const long *buf)
4462 memcpy (r, buf, sizeof (*r));
4465 const struct real_format real_internal_format =
4467 encode_internal,
4468 decode_internal,
4471 SIGNIFICAND_BITS - 2,
4472 SIGNIFICAND_BITS - 2,
4473 -MAX_EXP,
4474 MAX_EXP,
4476 true,
4477 true,
4478 false,
4479 true,
4480 true
4483 /* Calculate the square root of X in mode MODE, and store the result
4484 in R. Return TRUE if the operation does not raise an exception.
4485 For details see "High Precision Division and Square Root",
4486 Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June
4487 1993. http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf. */
4489 bool
4490 real_sqrt (REAL_VALUE_TYPE *r, enum machine_mode mode,
4491 const REAL_VALUE_TYPE *x)
4493 static REAL_VALUE_TYPE halfthree;
4494 static bool init = false;
4495 REAL_VALUE_TYPE h, t, i;
4496 int iter, exp;
4498 /* sqrt(-0.0) is -0.0. */
4499 if (real_isnegzero (x))
4501 *r = *x;
4502 return false;
4505 /* Negative arguments return NaN. */
4506 if (real_isneg (x))
4508 get_canonical_qnan (r, 0);
4509 return false;
4512 /* Infinity and NaN return themselves. */
4513 if (real_isinf (x) || real_isnan (x))
4515 *r = *x;
4516 return false;
4519 if (!init)
4521 do_add (&halfthree, &dconst1, &dconsthalf, 0);
4522 init = true;
4525 /* Initial guess for reciprocal sqrt, i. */
4526 exp = real_exponent (x);
4527 real_ldexp (&i, &dconst1, -exp/2);
4529 /* Newton's iteration for reciprocal sqrt, i. */
4530 for (iter = 0; iter < 16; iter++)
4532 /* i(n+1) = i(n) * (1.5 - 0.5*i(n)*i(n)*x). */
4533 do_multiply (&t, x, &i);
4534 do_multiply (&h, &t, &i);
4535 do_multiply (&t, &h, &dconsthalf);
4536 do_add (&h, &halfthree, &t, 1);
4537 do_multiply (&t, &i, &h);
4539 /* Check for early convergence. */
4540 if (iter >= 6 && real_identical (&i, &t))
4541 break;
4543 /* ??? Unroll loop to avoid copying. */
4544 i = t;
4547 /* Final iteration: r = i*x + 0.5*i*x*(1.0 - i*(i*x)). */
4548 do_multiply (&t, x, &i);
4549 do_multiply (&h, &t, &i);
4550 do_add (&i, &dconst1, &h, 1);
4551 do_multiply (&h, &t, &i);
4552 do_multiply (&i, &dconsthalf, &h);
4553 do_add (&h, &t, &i, 0);
4555 /* ??? We need a Tuckerman test to get the last bit. */
4557 real_convert (r, mode, &h);
4558 return true;
4561 /* Calculate X raised to the integer exponent N in mode MODE and store
4562 the result in R. Return true if the result may be inexact due to
4563 loss of precision. The algorithm is the classic "left-to-right binary
4564 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4565 Algorithms", "The Art of Computer Programming", Volume 2. */
4567 bool
4568 real_powi (REAL_VALUE_TYPE *r, enum machine_mode mode,
4569 const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4571 unsigned HOST_WIDE_INT bit;
4572 REAL_VALUE_TYPE t;
4573 bool inexact = false;
4574 bool init = false;
4575 bool neg;
4576 int i;
4578 if (n == 0)
4580 *r = dconst1;
4581 return false;
4583 else if (n < 0)
4585 /* Don't worry about overflow, from now on n is unsigned. */
4586 neg = true;
4587 n = -n;
4589 else
4590 neg = false;
4592 t = *x;
4593 bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4594 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4596 if (init)
4598 inexact |= do_multiply (&t, &t, &t);
4599 if (n & bit)
4600 inexact |= do_multiply (&t, &t, x);
4602 else if (n & bit)
4603 init = true;
4604 bit >>= 1;
4607 if (neg)
4608 inexact |= do_divide (&t, &dconst1, &t);
4610 real_convert (r, mode, &t);
4611 return inexact;
4614 /* Round X to the nearest integer not larger in absolute value, i.e.
4615 towards zero, placing the result in R in mode MODE. */
4617 void
4618 real_trunc (REAL_VALUE_TYPE *r, enum machine_mode mode,
4619 const REAL_VALUE_TYPE *x)
4621 do_fix_trunc (r, x);
4622 if (mode != VOIDmode)
4623 real_convert (r, mode, r);
4626 /* Round X to the largest integer not greater in value, i.e. round
4627 down, placing the result in R in mode MODE. */
4629 void
4630 real_floor (REAL_VALUE_TYPE *r, enum machine_mode mode,
4631 const REAL_VALUE_TYPE *x)
4633 REAL_VALUE_TYPE t;
4635 do_fix_trunc (&t, x);
4636 if (! real_identical (&t, x) && x->sign)
4637 do_add (&t, &t, &dconstm1, 0);
4638 if (mode != VOIDmode)
4639 real_convert (r, mode, &t);
4642 /* Round X to the smallest integer not less then argument, i.e. round
4643 up, placing the result in R in mode MODE. */
4645 void
4646 real_ceil (REAL_VALUE_TYPE *r, enum machine_mode mode,
4647 const REAL_VALUE_TYPE *x)
4649 REAL_VALUE_TYPE t;
4651 do_fix_trunc (&t, x);
4652 if (! real_identical (&t, x) && ! x->sign)
4653 do_add (&t, &t, &dconst1, 0);
4654 if (mode != VOIDmode)
4655 real_convert (r, mode, &t);
4658 /* Round X to the nearest integer, but round halfway cases away from
4659 zero. */
4661 void
4662 real_round (REAL_VALUE_TYPE *r, enum machine_mode mode,
4663 const REAL_VALUE_TYPE *x)
4665 do_add (r, x, &dconsthalf, x->sign);
4666 do_fix_trunc (r, r);
4667 if (mode != VOIDmode)
4668 real_convert (r, mode, r);
4671 /* Set the sign of R to the sign of X. */
4673 void
4674 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
4676 r->sign = x->sign;