OSDN Git Service

contrib/
[pf3gnuchains/gcc-fork.git] / gcc / real.c
1 /* real.c - software floating point emulation.
2    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2002, 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
4    Contributed by Stephen L. Moshier (moshier@world.std.com).
5    Re-written by Richard Henderson <rth@redhat.com>
6
7    This file is part of GCC.
8
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 3, or (at your option) any later
12    version.
13
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.
18
19    You should have received a copy of the GNU General Public License
20    along with GCC; see the file COPYING3.  If not see
21    <http://www.gnu.org/licenses/>.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
28 #include "toplev.h"
29 #include "real.h"
30 #include "tm_p.h"
31 #include "dfp.h"
32
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.
36
37    Specifically
38
39         x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
40
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.
47
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).
51
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.
57
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.
61
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.  */
68
69
70 /* Used to classify two numbers simultaneously.  */
71 #define CLASS2(A, B)  ((A) << 2 | (B))
72
73 #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
74  #error "Some constant folding done by hand to avoid shift count warnings"
75 #endif
76
77 static void get_zero (REAL_VALUE_TYPE *, int);
78 static void get_canonical_qnan (REAL_VALUE_TYPE *, int);
79 static void get_canonical_snan (REAL_VALUE_TYPE *, int);
80 static void get_inf (REAL_VALUE_TYPE *, int);
81 static bool sticky_rshift_significand (REAL_VALUE_TYPE *,
82                                        const REAL_VALUE_TYPE *, unsigned int);
83 static void rshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
84                                 unsigned int);
85 static void lshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
86                                 unsigned int);
87 static void lshift_significand_1 (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
88 static bool add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *,
89                               const REAL_VALUE_TYPE *);
90 static bool sub_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
91                               const REAL_VALUE_TYPE *, int);
92 static void neg_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
93 static int cmp_significands (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
94 static int cmp_significand_0 (const REAL_VALUE_TYPE *);
95 static void set_significand_bit (REAL_VALUE_TYPE *, unsigned int);
96 static void clear_significand_bit (REAL_VALUE_TYPE *, unsigned int);
97 static bool test_significand_bit (REAL_VALUE_TYPE *, unsigned int);
98 static void clear_significand_below (REAL_VALUE_TYPE *, unsigned int);
99 static bool div_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
100                               const REAL_VALUE_TYPE *);
101 static void normalize (REAL_VALUE_TYPE *);
102
103 static bool do_add (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
104                     const REAL_VALUE_TYPE *, int);
105 static bool do_multiply (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
106                          const REAL_VALUE_TYPE *);
107 static bool do_divide (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
108                        const REAL_VALUE_TYPE *);
109 static int do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
110 static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
111
112 static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *);
113
114 static const REAL_VALUE_TYPE * ten_to_ptwo (int);
115 static const REAL_VALUE_TYPE * ten_to_mptwo (int);
116 static const REAL_VALUE_TYPE * real_digit (int);
117 static void times_pten (REAL_VALUE_TYPE *, int);
118
119 static void round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
120 \f
121 /* Initialize R with a positive zero.  */
122
123 static inline void
124 get_zero (REAL_VALUE_TYPE *r, int sign)
125 {
126   memset (r, 0, sizeof (*r));
127   r->sign = sign;
128 }
129
130 /* Initialize R with the canonical quiet NaN.  */
131
132 static inline void
133 get_canonical_qnan (REAL_VALUE_TYPE *r, int sign)
134 {
135   memset (r, 0, sizeof (*r));
136   r->cl = rvc_nan;
137   r->sign = sign;
138   r->canonical = 1;
139 }
140
141 static inline void
142 get_canonical_snan (REAL_VALUE_TYPE *r, int sign)
143 {
144   memset (r, 0, sizeof (*r));
145   r->cl = rvc_nan;
146   r->sign = sign;
147   r->signalling = 1;
148   r->canonical = 1;
149 }
150
151 static inline void
152 get_inf (REAL_VALUE_TYPE *r, int sign)
153 {
154   memset (r, 0, sizeof (*r));
155   r->cl = rvc_inf;
156   r->sign = sign;
157 }
158
159 \f
160 /* Right-shift the significand of A by N bits; put the result in the
161    significand of R.  If any one bits are shifted out, return true.  */
162
163 static bool
164 sticky_rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
165                            unsigned int n)
166 {
167   unsigned long sticky = 0;
168   unsigned int i, ofs = 0;
169
170   if (n >= HOST_BITS_PER_LONG)
171     {
172       for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i)
173         sticky |= a->sig[i];
174       n &= HOST_BITS_PER_LONG - 1;
175     }
176
177   if (n != 0)
178     {
179       sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1);
180       for (i = 0; i < SIGSZ; ++i)
181         {
182           r->sig[i]
183             = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
184                | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
185                   << (HOST_BITS_PER_LONG - n)));
186         }
187     }
188   else
189     {
190       for (i = 0; ofs + i < SIGSZ; ++i)
191         r->sig[i] = a->sig[ofs + i];
192       for (; i < SIGSZ; ++i)
193         r->sig[i] = 0;
194     }
195
196   return sticky != 0;
197 }
198
199 /* Right-shift the significand of A by N bits; put the result in the
200    significand of R.  */
201
202 static void
203 rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
204                     unsigned int n)
205 {
206   unsigned int i, ofs = n / HOST_BITS_PER_LONG;
207
208   n &= HOST_BITS_PER_LONG - 1;
209   if (n != 0)
210     {
211       for (i = 0; i < SIGSZ; ++i)
212         {
213           r->sig[i]
214             = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
215                | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
216                   << (HOST_BITS_PER_LONG - n)));
217         }
218     }
219   else
220     {
221       for (i = 0; ofs + i < SIGSZ; ++i)
222         r->sig[i] = a->sig[ofs + i];
223       for (; i < SIGSZ; ++i)
224         r->sig[i] = 0;
225     }
226 }
227
228 /* Left-shift the significand of A by N bits; put the result in the
229    significand of R.  */
230
231 static void
232 lshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
233                     unsigned int n)
234 {
235   unsigned int i, ofs = n / HOST_BITS_PER_LONG;
236
237   n &= HOST_BITS_PER_LONG - 1;
238   if (n == 0)
239     {
240       for (i = 0; ofs + i < SIGSZ; ++i)
241         r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs];
242       for (; i < SIGSZ; ++i)
243         r->sig[SIGSZ-1-i] = 0;
244     }
245   else
246     for (i = 0; i < SIGSZ; ++i)
247       {
248         r->sig[SIGSZ-1-i]
249           = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n)
250              | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1])
251                 >> (HOST_BITS_PER_LONG - n)));
252       }
253 }
254
255 /* Likewise, but N is specialized to 1.  */
256
257 static inline void
258 lshift_significand_1 (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
259 {
260   unsigned int i;
261
262   for (i = SIGSZ - 1; i > 0; --i)
263     r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1));
264   r->sig[0] = a->sig[0] << 1;
265 }
266
267 /* Add the significands of A and B, placing the result in R.  Return
268    true if there was carry out of the most significant word.  */
269
270 static inline bool
271 add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
272                   const REAL_VALUE_TYPE *b)
273 {
274   bool carry = false;
275   int i;
276
277   for (i = 0; i < SIGSZ; ++i)
278     {
279       unsigned long ai = a->sig[i];
280       unsigned long ri = ai + b->sig[i];
281
282       if (carry)
283         {
284           carry = ri < ai;
285           carry |= ++ri == 0;
286         }
287       else
288         carry = ri < ai;
289
290       r->sig[i] = ri;
291     }
292
293   return carry;
294 }
295
296 /* Subtract the significands of A and B, placing the result in R.  CARRY is
297    true if there's a borrow incoming to the least significant word.
298    Return true if there was borrow out of the most significant word.  */
299
300 static inline bool
301 sub_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
302                   const REAL_VALUE_TYPE *b, int carry)
303 {
304   int i;
305
306   for (i = 0; i < SIGSZ; ++i)
307     {
308       unsigned long ai = a->sig[i];
309       unsigned long ri = ai - b->sig[i];
310
311       if (carry)
312         {
313           carry = ri > ai;
314           carry |= ~--ri == 0;
315         }
316       else
317         carry = ri > ai;
318
319       r->sig[i] = ri;
320     }
321
322   return carry;
323 }
324
325 /* Negate the significand A, placing the result in R.  */
326
327 static inline void
328 neg_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
329 {
330   bool carry = true;
331   int i;
332
333   for (i = 0; i < SIGSZ; ++i)
334     {
335       unsigned long ri, ai = a->sig[i];
336
337       if (carry)
338         {
339           if (ai)
340             {
341               ri = -ai;
342               carry = false;
343             }
344           else
345             ri = ai;
346         }
347       else
348         ri = ~ai;
349
350       r->sig[i] = ri;
351     }
352 }
353
354 /* Compare significands.  Return tri-state vs zero.  */
355
356 static inline int
357 cmp_significands (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
358 {
359   int i;
360
361   for (i = SIGSZ - 1; i >= 0; --i)
362     {
363       unsigned long ai = a->sig[i];
364       unsigned long bi = b->sig[i];
365
366       if (ai > bi)
367         return 1;
368       if (ai < bi)
369         return -1;
370     }
371
372   return 0;
373 }
374
375 /* Return true if A is nonzero.  */
376
377 static inline int
378 cmp_significand_0 (const REAL_VALUE_TYPE *a)
379 {
380   int i;
381
382   for (i = SIGSZ - 1; i >= 0; --i)
383     if (a->sig[i])
384       return 1;
385
386   return 0;
387 }
388
389 /* Set bit N of the significand of R.  */
390
391 static inline void
392 set_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
393 {
394   r->sig[n / HOST_BITS_PER_LONG]
395     |= (unsigned long)1 << (n % HOST_BITS_PER_LONG);
396 }
397
398 /* Clear bit N of the significand of R.  */
399
400 static inline void
401 clear_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
402 {
403   r->sig[n / HOST_BITS_PER_LONG]
404     &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG));
405 }
406
407 /* Test bit N of the significand of R.  */
408
409 static inline bool
410 test_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
411 {
412   /* ??? Compiler bug here if we return this expression directly.
413      The conversion to bool strips the "&1" and we wind up testing
414      e.g. 2 != 0 -> true.  Seen in gcc version 3.2 20020520.  */
415   int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1;
416   return t;
417 }
418
419 /* Clear bits 0..N-1 of the significand of R.  */
420
421 static void
422 clear_significand_below (REAL_VALUE_TYPE *r, unsigned int n)
423 {
424   int i, w = n / HOST_BITS_PER_LONG;
425
426   for (i = 0; i < w; ++i)
427     r->sig[i] = 0;
428
429   r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1);
430 }
431
432 /* Divide the significands of A and B, placing the result in R.  Return
433    true if the division was inexact.  */
434
435 static inline bool
436 div_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
437                   const REAL_VALUE_TYPE *b)
438 {
439   REAL_VALUE_TYPE u;
440   int i, bit = SIGNIFICAND_BITS - 1;
441   unsigned long msb, inexact;
442
443   u = *a;
444   memset (r->sig, 0, sizeof (r->sig));
445
446   msb = 0;
447   goto start;
448   do
449     {
450       msb = u.sig[SIGSZ-1] & SIG_MSB;
451       lshift_significand_1 (&u, &u);
452     start:
453       if (msb || cmp_significands (&u, b) >= 0)
454         {
455           sub_significands (&u, &u, b, 0);
456           set_significand_bit (r, bit);
457         }
458     }
459   while (--bit >= 0);
460
461   for (i = 0, inexact = 0; i < SIGSZ; i++)
462     inexact |= u.sig[i];
463
464   return inexact != 0;
465 }
466
467 /* Adjust the exponent and significand of R such that the most
468    significant bit is set.  We underflow to zero and overflow to
469    infinity here, without denormals.  (The intermediate representation
470    exponent is large enough to handle target denormals normalized.)  */
471
472 static void
473 normalize (REAL_VALUE_TYPE *r)
474 {
475   int shift = 0, exp;
476   int i, j;
477
478   if (r->decimal)
479     return;
480
481   /* Find the first word that is nonzero.  */
482   for (i = SIGSZ - 1; i >= 0; i--)
483     if (r->sig[i] == 0)
484       shift += HOST_BITS_PER_LONG;
485     else
486       break;
487
488   /* Zero significand flushes to zero.  */
489   if (i < 0)
490     {
491       r->cl = rvc_zero;
492       SET_REAL_EXP (r, 0);
493       return;
494     }
495
496   /* Find the first bit that is nonzero.  */
497   for (j = 0; ; j++)
498     if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j)))
499       break;
500   shift += j;
501
502   if (shift > 0)
503     {
504       exp = REAL_EXP (r) - shift;
505       if (exp > MAX_EXP)
506         get_inf (r, r->sign);
507       else if (exp < -MAX_EXP)
508         get_zero (r, r->sign);
509       else
510         {
511           SET_REAL_EXP (r, exp);
512           lshift_significand (r, r, shift);
513         }
514     }
515 }
516 \f
517 /* Calculate R = A + (SUBTRACT_P ? -B : B).  Return true if the
518    result may be inexact due to a loss of precision.  */
519
520 static bool
521 do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
522         const REAL_VALUE_TYPE *b, int subtract_p)
523 {
524   int dexp, sign, exp;
525   REAL_VALUE_TYPE t;
526   bool inexact = false;
527
528   /* Determine if we need to add or subtract.  */
529   sign = a->sign;
530   subtract_p = (sign ^ b->sign) ^ subtract_p;
531
532   switch (CLASS2 (a->cl, b->cl))
533     {
534     case CLASS2 (rvc_zero, rvc_zero):
535       /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0.  */
536       get_zero (r, sign & !subtract_p);
537       return false;
538
539     case CLASS2 (rvc_zero, rvc_normal):
540     case CLASS2 (rvc_zero, rvc_inf):
541     case CLASS2 (rvc_zero, rvc_nan):
542       /* 0 + ANY = ANY.  */
543     case CLASS2 (rvc_normal, rvc_nan):
544     case CLASS2 (rvc_inf, rvc_nan):
545     case CLASS2 (rvc_nan, rvc_nan):
546       /* ANY + NaN = NaN.  */
547     case CLASS2 (rvc_normal, rvc_inf):
548       /* R + Inf = Inf.  */
549       *r = *b;
550       r->sign = sign ^ subtract_p;
551       return false;
552
553     case CLASS2 (rvc_normal, rvc_zero):
554     case CLASS2 (rvc_inf, rvc_zero):
555     case CLASS2 (rvc_nan, rvc_zero):
556       /* ANY + 0 = ANY.  */
557     case CLASS2 (rvc_nan, rvc_normal):
558     case CLASS2 (rvc_nan, rvc_inf):
559       /* NaN + ANY = NaN.  */
560     case CLASS2 (rvc_inf, rvc_normal):
561       /* Inf + R = Inf.  */
562       *r = *a;
563       return false;
564
565     case CLASS2 (rvc_inf, rvc_inf):
566       if (subtract_p)
567         /* Inf - Inf = NaN.  */
568         get_canonical_qnan (r, 0);
569       else
570         /* Inf + Inf = Inf.  */
571         *r = *a;
572       return false;
573
574     case CLASS2 (rvc_normal, rvc_normal):
575       break;
576
577     default:
578       gcc_unreachable ();
579     }
580
581   /* Swap the arguments such that A has the larger exponent.  */
582   dexp = REAL_EXP (a) - REAL_EXP (b);
583   if (dexp < 0)
584     {
585       const REAL_VALUE_TYPE *t;
586       t = a, a = b, b = t;
587       dexp = -dexp;
588       sign ^= subtract_p;
589     }
590   exp = REAL_EXP (a);
591
592   /* If the exponents are not identical, we need to shift the
593      significand of B down.  */
594   if (dexp > 0)
595     {
596       /* If the exponents are too far apart, the significands
597          do not overlap, which makes the subtraction a noop.  */
598       if (dexp >= SIGNIFICAND_BITS)
599         {
600           *r = *a;
601           r->sign = sign;
602           return true;
603         }
604
605       inexact |= sticky_rshift_significand (&t, b, dexp);
606       b = &t;
607     }
608
609   if (subtract_p)
610     {
611       if (sub_significands (r, a, b, inexact))
612         {
613           /* We got a borrow out of the subtraction.  That means that
614              A and B had the same exponent, and B had the larger
615              significand.  We need to swap the sign and negate the
616              significand.  */
617           sign ^= 1;
618           neg_significand (r, r);
619         }
620     }
621   else
622     {
623       if (add_significands (r, a, b))
624         {
625           /* We got carry out of the addition.  This means we need to
626              shift the significand back down one bit and increase the
627              exponent.  */
628           inexact |= sticky_rshift_significand (r, r, 1);
629           r->sig[SIGSZ-1] |= SIG_MSB;
630           if (++exp > MAX_EXP)
631             {
632               get_inf (r, sign);
633               return true;
634             }
635         }
636     }
637
638   r->cl = rvc_normal;
639   r->sign = sign;
640   SET_REAL_EXP (r, exp);
641   /* Zero out the remaining fields.  */
642   r->signalling = 0;
643   r->canonical = 0;
644   r->decimal = 0;
645
646   /* Re-normalize the result.  */
647   normalize (r);
648
649   /* Special case: if the subtraction results in zero, the result
650      is positive.  */
651   if (r->cl == rvc_zero)
652     r->sign = 0;
653   else
654     r->sig[0] |= inexact;
655
656   return inexact;
657 }
658
659 /* Calculate R = A * B.  Return true if the result may be inexact.  */
660
661 static bool
662 do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
663              const REAL_VALUE_TYPE *b)
664 {
665   REAL_VALUE_TYPE u, t, *rr;
666   unsigned int i, j, k;
667   int sign = a->sign ^ b->sign;
668   bool inexact = false;
669
670   switch (CLASS2 (a->cl, b->cl))
671     {
672     case CLASS2 (rvc_zero, rvc_zero):
673     case CLASS2 (rvc_zero, rvc_normal):
674     case CLASS2 (rvc_normal, rvc_zero):
675       /* +-0 * ANY = 0 with appropriate sign.  */
676       get_zero (r, sign);
677       return false;
678
679     case CLASS2 (rvc_zero, rvc_nan):
680     case CLASS2 (rvc_normal, rvc_nan):
681     case CLASS2 (rvc_inf, rvc_nan):
682     case CLASS2 (rvc_nan, rvc_nan):
683       /* ANY * NaN = NaN.  */
684       *r = *b;
685       r->sign = sign;
686       return false;
687
688     case CLASS2 (rvc_nan, rvc_zero):
689     case CLASS2 (rvc_nan, rvc_normal):
690     case CLASS2 (rvc_nan, rvc_inf):
691       /* NaN * ANY = NaN.  */
692       *r = *a;
693       r->sign = sign;
694       return false;
695
696     case CLASS2 (rvc_zero, rvc_inf):
697     case CLASS2 (rvc_inf, rvc_zero):
698       /* 0 * Inf = NaN */
699       get_canonical_qnan (r, sign);
700       return false;
701
702     case CLASS2 (rvc_inf, rvc_inf):
703     case CLASS2 (rvc_normal, rvc_inf):
704     case CLASS2 (rvc_inf, rvc_normal):
705       /* Inf * Inf = Inf, R * Inf = Inf */
706       get_inf (r, sign);
707       return false;
708
709     case CLASS2 (rvc_normal, rvc_normal):
710       break;
711
712     default:
713       gcc_unreachable ();
714     }
715
716   if (r == a || r == b)
717     rr = &t;
718   else
719     rr = r;
720   get_zero (rr, 0);
721
722   /* Collect all the partial products.  Since we don't have sure access
723      to a widening multiply, we split each long into two half-words.
724
725      Consider the long-hand form of a four half-word multiplication:
726
727                  A  B  C  D
728               *  E  F  G  H
729              --------------
730                 DE DF DG DH
731              CE CF CG CH
732           BE BF BG BH
733        AE AF AG AH
734
735      We construct partial products of the widened half-word products
736      that are known to not overlap, e.g. DF+DH.  Each such partial
737      product is given its proper exponent, which allows us to sum them
738      and obtain the finished product.  */
739
740   for (i = 0; i < SIGSZ * 2; ++i)
741     {
742       unsigned long ai = a->sig[i / 2];
743       if (i & 1)
744         ai >>= HOST_BITS_PER_LONG / 2;
745       else
746         ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
747
748       if (ai == 0)
749         continue;
750
751       for (j = 0; j < 2; ++j)
752         {
753           int exp = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
754                      + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2)));
755
756           if (exp > MAX_EXP)
757             {
758               get_inf (r, sign);
759               return true;
760             }
761           if (exp < -MAX_EXP)
762             {
763               /* Would underflow to zero, which we shouldn't bother adding.  */
764               inexact = true;
765               continue;
766             }
767
768           memset (&u, 0, sizeof (u));
769           u.cl = rvc_normal;
770           SET_REAL_EXP (&u, exp);
771
772           for (k = j; k < SIGSZ * 2; k += 2)
773             {
774               unsigned long bi = b->sig[k / 2];
775               if (k & 1)
776                 bi >>= HOST_BITS_PER_LONG / 2;
777               else
778                 bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
779
780               u.sig[k / 2] = ai * bi;
781             }
782
783           normalize (&u);
784           inexact |= do_add (rr, rr, &u, 0);
785         }
786     }
787
788   rr->sign = sign;
789   if (rr != r)
790     *r = t;
791
792   return inexact;
793 }
794
795 /* Calculate R = A / B.  Return true if the result may be inexact.  */
796
797 static bool
798 do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
799            const REAL_VALUE_TYPE *b)
800 {
801   int exp, sign = a->sign ^ b->sign;
802   REAL_VALUE_TYPE t, *rr;
803   bool inexact;
804
805   switch (CLASS2 (a->cl, b->cl))
806     {
807     case CLASS2 (rvc_zero, rvc_zero):
808       /* 0 / 0 = NaN.  */
809     case CLASS2 (rvc_inf, rvc_inf):
810       /* Inf / Inf = NaN.  */
811       get_canonical_qnan (r, sign);
812       return false;
813
814     case CLASS2 (rvc_zero, rvc_normal):
815     case CLASS2 (rvc_zero, rvc_inf):
816       /* 0 / ANY = 0.  */
817     case CLASS2 (rvc_normal, rvc_inf):
818       /* R / Inf = 0.  */
819       get_zero (r, sign);
820       return false;
821
822     case CLASS2 (rvc_normal, rvc_zero):
823       /* R / 0 = Inf.  */
824     case CLASS2 (rvc_inf, rvc_zero):
825       /* Inf / 0 = Inf.  */
826       get_inf (r, sign);
827       return false;
828
829     case CLASS2 (rvc_zero, rvc_nan):
830     case CLASS2 (rvc_normal, rvc_nan):
831     case CLASS2 (rvc_inf, rvc_nan):
832     case CLASS2 (rvc_nan, rvc_nan):
833       /* ANY / NaN = NaN.  */
834       *r = *b;
835       r->sign = sign;
836       return false;
837
838     case CLASS2 (rvc_nan, rvc_zero):
839     case CLASS2 (rvc_nan, rvc_normal):
840     case CLASS2 (rvc_nan, rvc_inf):
841       /* NaN / ANY = NaN.  */
842       *r = *a;
843       r->sign = sign;
844       return false;
845
846     case CLASS2 (rvc_inf, rvc_normal):
847       /* Inf / R = Inf.  */
848       get_inf (r, sign);
849       return false;
850
851     case CLASS2 (rvc_normal, rvc_normal):
852       break;
853
854     default:
855       gcc_unreachable ();
856     }
857
858   if (r == a || r == b)
859     rr = &t;
860   else
861     rr = r;
862
863   /* Make sure all fields in the result are initialized.  */
864   get_zero (rr, 0);
865   rr->cl = rvc_normal;
866   rr->sign = sign;
867
868   exp = REAL_EXP (a) - REAL_EXP (b) + 1;
869   if (exp > MAX_EXP)
870     {
871       get_inf (r, sign);
872       return true;
873     }
874   if (exp < -MAX_EXP)
875     {
876       get_zero (r, sign);
877       return true;
878     }
879   SET_REAL_EXP (rr, exp);
880
881   inexact = div_significands (rr, a, b);
882
883   /* Re-normalize the result.  */
884   normalize (rr);
885   rr->sig[0] |= inexact;
886
887   if (rr != r)
888     *r = t;
889
890   return inexact;
891 }
892
893 /* Return a tri-state comparison of A vs B.  Return NAN_RESULT if
894    one of the two operands is a NaN.  */
895
896 static int
897 do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
898             int nan_result)
899 {
900   int ret;
901
902   switch (CLASS2 (a->cl, b->cl))
903     {
904     case CLASS2 (rvc_zero, rvc_zero):
905       /* Sign of zero doesn't matter for compares.  */
906       return 0;
907
908     case CLASS2 (rvc_inf, rvc_zero):
909     case CLASS2 (rvc_inf, rvc_normal):
910     case CLASS2 (rvc_normal, rvc_zero):
911       return (a->sign ? -1 : 1);
912
913     case CLASS2 (rvc_inf, rvc_inf):
914       return -a->sign - -b->sign;
915
916     case CLASS2 (rvc_zero, rvc_normal):
917     case CLASS2 (rvc_zero, rvc_inf):
918     case CLASS2 (rvc_normal, rvc_inf):
919       return (b->sign ? 1 : -1);
920
921     case CLASS2 (rvc_zero, rvc_nan):
922     case CLASS2 (rvc_normal, rvc_nan):
923     case CLASS2 (rvc_inf, rvc_nan):
924     case CLASS2 (rvc_nan, rvc_nan):
925     case CLASS2 (rvc_nan, rvc_zero):
926     case CLASS2 (rvc_nan, rvc_normal):
927     case CLASS2 (rvc_nan, rvc_inf):
928       return nan_result;
929
930     case CLASS2 (rvc_normal, rvc_normal):
931       break;
932
933     default:
934       gcc_unreachable ();
935     }
936
937   if (a->sign != b->sign)
938     return -a->sign - -b->sign;
939
940   if (a->decimal || b->decimal)
941     return decimal_do_compare (a, b, nan_result);
942
943   if (REAL_EXP (a) > REAL_EXP (b))
944     ret = 1;
945   else if (REAL_EXP (a) < REAL_EXP (b))
946     ret = -1;
947   else
948     ret = cmp_significands (a, b);
949
950   return (a->sign ? -ret : ret);
951 }
952
953 /* Return A truncated to an integral value toward zero.  */
954
955 static void
956 do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
957 {
958   *r = *a;
959
960   switch (r->cl)
961     {
962     case rvc_zero:
963     case rvc_inf:
964     case rvc_nan:
965       break;
966
967     case rvc_normal:
968       if (r->decimal)
969         {
970           decimal_do_fix_trunc (r, a);
971           return;
972         }
973       if (REAL_EXP (r) <= 0)
974         get_zero (r, r->sign);
975       else if (REAL_EXP (r) < SIGNIFICAND_BITS)
976         clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r));
977       break;
978
979     default:
980       gcc_unreachable ();
981     }
982 }
983
984 /* Perform the binary or unary operation described by CODE.
985    For a unary operation, leave OP1 NULL.  This function returns
986    true if the result may be inexact due to loss of precision.  */
987
988 bool
989 real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
990                  const REAL_VALUE_TYPE *op1)
991 {
992   enum tree_code code = icode;
993
994   if (op0->decimal || (op1 && op1->decimal))
995     return decimal_real_arithmetic (r, icode, op0, op1);
996
997   switch (code)
998     {
999     case PLUS_EXPR:
1000       return do_add (r, op0, op1, 0);
1001
1002     case MINUS_EXPR:
1003       return do_add (r, op0, op1, 1);
1004
1005     case MULT_EXPR:
1006       return do_multiply (r, op0, op1);
1007
1008     case RDIV_EXPR:
1009       return do_divide (r, op0, op1);
1010
1011     case MIN_EXPR:
1012       if (op1->cl == rvc_nan)
1013         *r = *op1;
1014       else if (do_compare (op0, op1, -1) < 0)
1015         *r = *op0;
1016       else
1017         *r = *op1;
1018       break;
1019
1020     case MAX_EXPR:
1021       if (op1->cl == rvc_nan)
1022         *r = *op1;
1023       else if (do_compare (op0, op1, 1) < 0)
1024         *r = *op1;
1025       else
1026         *r = *op0;
1027       break;
1028
1029     case NEGATE_EXPR:
1030       *r = *op0;
1031       r->sign ^= 1;
1032       break;
1033
1034     case ABS_EXPR:
1035       *r = *op0;
1036       r->sign = 0;
1037       break;
1038
1039     case FIX_TRUNC_EXPR:
1040       do_fix_trunc (r, op0);
1041       break;
1042
1043     default:
1044       gcc_unreachable ();
1045     }
1046   return false;
1047 }
1048
1049 /* Legacy.  Similar, but return the result directly.  */
1050
1051 REAL_VALUE_TYPE
1052 real_arithmetic2 (int icode, const REAL_VALUE_TYPE *op0,
1053                   const REAL_VALUE_TYPE *op1)
1054 {
1055   REAL_VALUE_TYPE r;
1056   real_arithmetic (&r, icode, op0, op1);
1057   return r;
1058 }
1059
1060 bool
1061 real_compare (int icode, const REAL_VALUE_TYPE *op0,
1062               const REAL_VALUE_TYPE *op1)
1063 {
1064   enum tree_code code = icode;
1065
1066   switch (code)
1067     {
1068     case LT_EXPR:
1069       return do_compare (op0, op1, 1) < 0;
1070     case LE_EXPR:
1071       return do_compare (op0, op1, 1) <= 0;
1072     case GT_EXPR:
1073       return do_compare (op0, op1, -1) > 0;
1074     case GE_EXPR:
1075       return do_compare (op0, op1, -1) >= 0;
1076     case EQ_EXPR:
1077       return do_compare (op0, op1, -1) == 0;
1078     case NE_EXPR:
1079       return do_compare (op0, op1, -1) != 0;
1080     case UNORDERED_EXPR:
1081       return op0->cl == rvc_nan || op1->cl == rvc_nan;
1082     case ORDERED_EXPR:
1083       return op0->cl != rvc_nan && op1->cl != rvc_nan;
1084     case UNLT_EXPR:
1085       return do_compare (op0, op1, -1) < 0;
1086     case UNLE_EXPR:
1087       return do_compare (op0, op1, -1) <= 0;
1088     case UNGT_EXPR:
1089       return do_compare (op0, op1, 1) > 0;
1090     case UNGE_EXPR:
1091       return do_compare (op0, op1, 1) >= 0;
1092     case UNEQ_EXPR:
1093       return do_compare (op0, op1, 0) == 0;
1094     case LTGT_EXPR:
1095       return do_compare (op0, op1, 0) != 0;
1096
1097     default:
1098       gcc_unreachable ();
1099     }
1100 }
1101
1102 /* Return floor log2(R).  */
1103
1104 int
1105 real_exponent (const REAL_VALUE_TYPE *r)
1106 {
1107   switch (r->cl)
1108     {
1109     case rvc_zero:
1110       return 0;
1111     case rvc_inf:
1112     case rvc_nan:
1113       return (unsigned int)-1 >> 1;
1114     case rvc_normal:
1115       return REAL_EXP (r);
1116     default:
1117       gcc_unreachable ();
1118     }
1119 }
1120
1121 /* R = OP0 * 2**EXP.  */
1122
1123 void
1124 real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
1125 {
1126   *r = *op0;
1127   switch (r->cl)
1128     {
1129     case rvc_zero:
1130     case rvc_inf:
1131     case rvc_nan:
1132       break;
1133
1134     case rvc_normal:
1135       exp += REAL_EXP (op0);
1136       if (exp > MAX_EXP)
1137         get_inf (r, r->sign);
1138       else if (exp < -MAX_EXP)
1139         get_zero (r, r->sign);
1140       else
1141         SET_REAL_EXP (r, exp);
1142       break;
1143
1144     default:
1145       gcc_unreachable ();
1146     }
1147 }
1148
1149 /* Determine whether a floating-point value X is infinite.  */
1150
1151 bool
1152 real_isinf (const REAL_VALUE_TYPE *r)
1153 {
1154   return (r->cl == rvc_inf);
1155 }
1156
1157 /* Determine whether a floating-point value X is a NaN.  */
1158
1159 bool
1160 real_isnan (const REAL_VALUE_TYPE *r)
1161 {
1162   return (r->cl == rvc_nan);
1163 }
1164
1165 /* Determine whether a floating-point value X is finite.  */
1166
1167 bool
1168 real_isfinite (const REAL_VALUE_TYPE *r)
1169 {
1170   return (r->cl != rvc_nan) && (r->cl != rvc_inf);
1171 }
1172
1173 /* Determine whether a floating-point value X is negative.  */
1174
1175 bool
1176 real_isneg (const REAL_VALUE_TYPE *r)
1177 {
1178   return r->sign;
1179 }
1180
1181 /* Determine whether a floating-point value X is minus zero.  */
1182
1183 bool
1184 real_isnegzero (const REAL_VALUE_TYPE *r)
1185 {
1186   return r->sign && r->cl == rvc_zero;
1187 }
1188
1189 /* Compare two floating-point objects for bitwise identity.  */
1190
1191 bool
1192 real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
1193 {
1194   int i;
1195
1196   if (a->cl != b->cl)
1197     return false;
1198   if (a->sign != b->sign)
1199     return false;
1200
1201   switch (a->cl)
1202     {
1203     case rvc_zero:
1204     case rvc_inf:
1205       return true;
1206
1207     case rvc_normal:
1208       if (a->decimal != b->decimal)
1209         return false;
1210       if (REAL_EXP (a) != REAL_EXP (b))
1211         return false;
1212       break;
1213
1214     case rvc_nan:
1215       if (a->signalling != b->signalling)
1216         return false;
1217       /* The significand is ignored for canonical NaNs.  */
1218       if (a->canonical || b->canonical)
1219         return a->canonical == b->canonical;
1220       break;
1221
1222     default:
1223       gcc_unreachable ();
1224     }
1225
1226   for (i = 0; i < SIGSZ; ++i)
1227     if (a->sig[i] != b->sig[i])
1228       return false;
1229
1230   return true;
1231 }
1232
1233 /* Try to change R into its exact multiplicative inverse in machine
1234    mode MODE.  Return true if successful.  */
1235
1236 bool
1237 exact_real_inverse (enum machine_mode mode, REAL_VALUE_TYPE *r)
1238 {
1239   const REAL_VALUE_TYPE *one = real_digit (1);
1240   REAL_VALUE_TYPE u;
1241   int i;
1242
1243   if (r->cl != rvc_normal)
1244     return false;
1245
1246   /* Check for a power of two: all significand bits zero except the MSB.  */
1247   for (i = 0; i < SIGSZ-1; ++i)
1248     if (r->sig[i] != 0)
1249       return false;
1250   if (r->sig[SIGSZ-1] != SIG_MSB)
1251     return false;
1252
1253   /* Find the inverse and truncate to the required mode.  */
1254   do_divide (&u, one, r);
1255   real_convert (&u, mode, &u);
1256
1257   /* The rounding may have overflowed.  */
1258   if (u.cl != rvc_normal)
1259     return false;
1260   for (i = 0; i < SIGSZ-1; ++i)
1261     if (u.sig[i] != 0)
1262       return false;
1263   if (u.sig[SIGSZ-1] != SIG_MSB)
1264     return false;
1265
1266   *r = u;
1267   return true;
1268 }
1269 \f
1270 /* Render R as an integer.  */
1271
1272 HOST_WIDE_INT
1273 real_to_integer (const REAL_VALUE_TYPE *r)
1274 {
1275   unsigned HOST_WIDE_INT i;
1276
1277   switch (r->cl)
1278     {
1279     case rvc_zero:
1280     underflow:
1281       return 0;
1282
1283     case rvc_inf:
1284     case rvc_nan:
1285     overflow:
1286       i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1287       if (!r->sign)
1288         i--;
1289       return i;
1290
1291     case rvc_normal:
1292       if (r->decimal)
1293         return decimal_real_to_integer (r);
1294
1295       if (REAL_EXP (r) <= 0)
1296         goto underflow;
1297       /* Only force overflow for unsigned overflow.  Signed overflow is
1298          undefined, so it doesn't matter what we return, and some callers
1299          expect to be able to use this routine for both signed and
1300          unsigned conversions.  */
1301       if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT)
1302         goto overflow;
1303
1304       if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1305         i = r->sig[SIGSZ-1];
1306       else 
1307         {
1308           gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
1309           i = r->sig[SIGSZ-1];
1310           i = i << (HOST_BITS_PER_LONG - 1) << 1;
1311           i |= r->sig[SIGSZ-2];
1312         }
1313
1314       i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r);
1315
1316       if (r->sign)
1317         i = -i;
1318       return i;
1319
1320     default:
1321       gcc_unreachable ();
1322     }
1323 }
1324
1325 /* Likewise, but to an integer pair, HI+LOW.  */
1326
1327 void
1328 real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
1329                   const REAL_VALUE_TYPE *r)
1330 {
1331   REAL_VALUE_TYPE t;
1332   HOST_WIDE_INT low, high;
1333   int exp;
1334
1335   switch (r->cl)
1336     {
1337     case rvc_zero:
1338     underflow:
1339       low = high = 0;
1340       break;
1341
1342     case rvc_inf:
1343     case rvc_nan:
1344     overflow:
1345       high = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1346       if (r->sign)
1347         low = 0;
1348       else
1349         {
1350           high--;
1351           low = -1;
1352         }
1353       break;
1354
1355     case rvc_normal:
1356       if (r->decimal)
1357         { 
1358           decimal_real_to_integer2 (plow, phigh, r);
1359           return;
1360         }
1361         
1362       exp = REAL_EXP (r);
1363       if (exp <= 0)
1364         goto underflow;
1365       /* Only force overflow for unsigned overflow.  Signed overflow is
1366          undefined, so it doesn't matter what we return, and some callers
1367          expect to be able to use this routine for both signed and
1368          unsigned conversions.  */
1369       if (exp > 2*HOST_BITS_PER_WIDE_INT)
1370         goto overflow;
1371
1372       rshift_significand (&t, r, 2*HOST_BITS_PER_WIDE_INT - exp);
1373       if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1374         {
1375           high = t.sig[SIGSZ-1];
1376           low = t.sig[SIGSZ-2];
1377         }
1378       else 
1379         {
1380           gcc_assert (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG);
1381           high = t.sig[SIGSZ-1];
1382           high = high << (HOST_BITS_PER_LONG - 1) << 1;
1383           high |= t.sig[SIGSZ-2];
1384
1385           low = t.sig[SIGSZ-3];
1386           low = low << (HOST_BITS_PER_LONG - 1) << 1;
1387           low |= t.sig[SIGSZ-4];
1388         }
1389
1390       if (r->sign)
1391         {
1392           if (low == 0)
1393             high = -high;
1394           else
1395             low = -low, high = ~high;
1396         }
1397       break;
1398
1399     default:
1400       gcc_unreachable ();
1401     }
1402
1403   *plow = low;
1404   *phigh = high;
1405 }
1406
1407 /* A subroutine of real_to_decimal.  Compute the quotient and remainder
1408    of NUM / DEN.  Return the quotient and place the remainder in NUM.
1409    It is expected that NUM / DEN are close enough that the quotient is
1410    small.  */
1411
1412 static unsigned long
1413 rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den)
1414 {
1415   unsigned long q, msb;
1416   int expn = REAL_EXP (num), expd = REAL_EXP (den);
1417
1418   if (expn < expd)
1419     return 0;
1420
1421   q = msb = 0;
1422   goto start;
1423   do
1424     {
1425       msb = num->sig[SIGSZ-1] & SIG_MSB;
1426       q <<= 1;
1427       lshift_significand_1 (num, num);
1428     start:
1429       if (msb || cmp_significands (num, den) >= 0)
1430         {
1431           sub_significands (num, num, den, 0);
1432           q |= 1;
1433         }
1434     }
1435   while (--expn >= expd);
1436
1437   SET_REAL_EXP (num, expd);
1438   normalize (num);
1439
1440   return q;
1441 }
1442
1443 /* Render R as a decimal floating point constant.  Emit DIGITS significant
1444    digits in the result, bounded by BUF_SIZE.  If DIGITS is 0, choose the
1445    maximum for the representation.  If CROP_TRAILING_ZEROS, strip trailing
1446    zeros.  */
1447
1448 #define M_LOG10_2       0.30102999566398119521
1449
1450 void
1451 real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
1452                  size_t digits, int crop_trailing_zeros)
1453 {
1454   const REAL_VALUE_TYPE *one, *ten;
1455   REAL_VALUE_TYPE r, pten, u, v;
1456   int dec_exp, cmp_one, digit;
1457   size_t max_digits;
1458   char *p, *first, *last;
1459   bool sign;
1460
1461   r = *r_orig;
1462   switch (r.cl)
1463     {
1464     case rvc_zero:
1465       strcpy (str, (r.sign ? "-0.0" : "0.0"));
1466       return;
1467     case rvc_normal:
1468       break;
1469     case rvc_inf:
1470       strcpy (str, (r.sign ? "-Inf" : "+Inf"));
1471       return;
1472     case rvc_nan:
1473       /* ??? Print the significand as well, if not canonical?  */
1474       sprintf (str, "%c%cNaN", (r_orig->sign ? '-' : '+'),
1475                (r_orig->signalling ? 'S' : 'Q'));
1476       return;
1477     default:
1478       gcc_unreachable ();
1479     }
1480
1481   if (r.decimal)
1482     {
1483       decimal_real_to_decimal (str, &r, buf_size, digits, crop_trailing_zeros);
1484       return;
1485     }
1486
1487   /* Bound the number of digits printed by the size of the representation.  */
1488   max_digits = SIGNIFICAND_BITS * M_LOG10_2;
1489   if (digits == 0 || digits > max_digits)
1490     digits = max_digits;
1491
1492   /* Estimate the decimal exponent, and compute the length of the string it
1493      will print as.  Be conservative and add one to account for possible
1494      overflow or rounding error.  */
1495   dec_exp = REAL_EXP (&r) * M_LOG10_2;
1496   for (max_digits = 1; dec_exp ; max_digits++)
1497     dec_exp /= 10;
1498
1499   /* Bound the number of digits printed by the size of the output buffer.  */
1500   max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
1501   gcc_assert (max_digits <= buf_size);
1502   if (digits > max_digits)
1503     digits = max_digits;
1504
1505   one = real_digit (1);
1506   ten = ten_to_ptwo (0);
1507
1508   sign = r.sign;
1509   r.sign = 0;
1510
1511   dec_exp = 0;
1512   pten = *one;
1513
1514   cmp_one = do_compare (&r, one, 0);
1515   if (cmp_one > 0)
1516     {
1517       int m;
1518
1519       /* Number is greater than one.  Convert significand to an integer
1520          and strip trailing decimal zeros.  */
1521
1522       u = r;
1523       SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1);
1524
1525       /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS.  */
1526       m = floor_log2 (max_digits);
1527
1528       /* Iterate over the bits of the possible powers of 10 that might
1529          be present in U and eliminate them.  That is, if we find that
1530          10**2**M divides U evenly, keep the division and increase
1531          DEC_EXP by 2**M.  */
1532       do
1533         {
1534           REAL_VALUE_TYPE t;
1535
1536           do_divide (&t, &u, ten_to_ptwo (m));
1537           do_fix_trunc (&v, &t);
1538           if (cmp_significands (&v, &t) == 0)
1539             {
1540               u = t;
1541               dec_exp += 1 << m;
1542             }
1543         }
1544       while (--m >= 0);
1545
1546       /* Revert the scaling to integer that we performed earlier.  */
1547       SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r)
1548                     - (SIGNIFICAND_BITS - 1));
1549       r = u;
1550
1551       /* Find power of 10.  Do this by dividing out 10**2**M when
1552          this is larger than the current remainder.  Fill PTEN with
1553          the power of 10 that we compute.  */
1554       if (REAL_EXP (&r) > 0)
1555         {
1556           m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1;
1557           do
1558             {
1559               const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1560               if (do_compare (&u, ptentwo, 0) >= 0)
1561                 {
1562                   do_divide (&u, &u, ptentwo);
1563                   do_multiply (&pten, &pten, ptentwo);
1564                   dec_exp += 1 << m;
1565                 }
1566             }
1567           while (--m >= 0);
1568         }
1569       else
1570         /* We managed to divide off enough tens in the above reduction
1571            loop that we've now got a negative exponent.  Fall into the
1572            less-than-one code to compute the proper value for PTEN.  */
1573         cmp_one = -1;
1574     }
1575   if (cmp_one < 0)
1576     {
1577       int m;
1578
1579       /* Number is less than one.  Pad significand with leading
1580          decimal zeros.  */
1581
1582       v = r;
1583       while (1)
1584         {
1585           /* Stop if we'd shift bits off the bottom.  */
1586           if (v.sig[0] & 7)
1587             break;
1588
1589           do_multiply (&u, &v, ten);
1590
1591           /* Stop if we're now >= 1.  */
1592           if (REAL_EXP (&u) > 0)
1593             break;
1594
1595           v = u;
1596           dec_exp -= 1;
1597         }
1598       r = v;
1599
1600       /* Find power of 10.  Do this by multiplying in P=10**2**M when
1601          the current remainder is smaller than 1/P.  Fill PTEN with the
1602          power of 10 that we compute.  */
1603       m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1;
1604       do
1605         {
1606           const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1607           const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
1608
1609           if (do_compare (&v, ptenmtwo, 0) <= 0)
1610             {
1611               do_multiply (&v, &v, ptentwo);
1612               do_multiply (&pten, &pten, ptentwo);
1613               dec_exp -= 1 << m;
1614             }
1615         }
1616       while (--m >= 0);
1617
1618       /* Invert the positive power of 10 that we've collected so far.  */
1619       do_divide (&pten, one, &pten);
1620     }
1621
1622   p = str;
1623   if (sign)
1624     *p++ = '-';
1625   first = p++;
1626
1627   /* At this point, PTEN should contain the nearest power of 10 smaller
1628      than R, such that this division produces the first digit.
1629
1630      Using a divide-step primitive that returns the complete integral
1631      remainder avoids the rounding error that would be produced if
1632      we were to use do_divide here and then simply multiply by 10 for
1633      each subsequent digit.  */
1634
1635   digit = rtd_divmod (&r, &pten);
1636
1637   /* Be prepared for error in that division via underflow ...  */
1638   if (digit == 0 && cmp_significand_0 (&r))
1639     {
1640       /* Multiply by 10 and try again.  */
1641       do_multiply (&r, &r, ten);
1642       digit = rtd_divmod (&r, &pten);
1643       dec_exp -= 1;
1644       gcc_assert (digit != 0);
1645     }
1646
1647   /* ... or overflow.  */
1648   if (digit == 10)
1649     {
1650       *p++ = '1';
1651       if (--digits > 0)
1652         *p++ = '0';
1653       dec_exp += 1;
1654     }
1655   else
1656     {
1657       gcc_assert (digit <= 10);
1658       *p++ = digit + '0';
1659     }
1660
1661   /* Generate subsequent digits.  */
1662   while (--digits > 0)
1663     {
1664       do_multiply (&r, &r, ten);
1665       digit = rtd_divmod (&r, &pten);
1666       *p++ = digit + '0';
1667     }
1668   last = p;
1669
1670   /* Generate one more digit with which to do rounding.  */
1671   do_multiply (&r, &r, ten);
1672   digit = rtd_divmod (&r, &pten);
1673
1674   /* Round the result.  */
1675   if (digit == 5)
1676     {
1677       /* Round to nearest.  If R is nonzero there are additional
1678          nonzero digits to be extracted.  */
1679       if (cmp_significand_0 (&r))
1680         digit++;
1681       /* Round to even.  */
1682       else if ((p[-1] - '0') & 1)
1683         digit++;
1684     }
1685   if (digit > 5)
1686     {
1687       while (p > first)
1688         {
1689           digit = *--p;
1690           if (digit == '9')
1691             *p = '0';
1692           else
1693             {
1694               *p = digit + 1;
1695               break;
1696             }
1697         }
1698
1699       /* Carry out of the first digit.  This means we had all 9's and
1700          now have all 0's.  "Prepend" a 1 by overwriting the first 0.  */
1701       if (p == first)
1702         {
1703           first[1] = '1';
1704           dec_exp++;
1705         }
1706     }
1707
1708   /* Insert the decimal point.  */
1709   first[0] = first[1];
1710   first[1] = '.';
1711
1712   /* If requested, drop trailing zeros.  Never crop past "1.0".  */
1713   if (crop_trailing_zeros)
1714     while (last > first + 3 && last[-1] == '0')
1715       last--;
1716
1717   /* Append the exponent.  */
1718   sprintf (last, "e%+d", dec_exp);
1719 }
1720
1721 /* Render R as a hexadecimal floating point constant.  Emit DIGITS
1722    significant digits in the result, bounded by BUF_SIZE.  If DIGITS is 0,
1723    choose the maximum for the representation.  If CROP_TRAILING_ZEROS,
1724    strip trailing zeros.  */
1725
1726 void
1727 real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
1728                      size_t digits, int crop_trailing_zeros)
1729 {
1730   int i, j, exp = REAL_EXP (r);
1731   char *p, *first;
1732   char exp_buf[16];
1733   size_t max_digits;
1734
1735   switch (r->cl)
1736     {
1737     case rvc_zero:
1738       exp = 0;
1739       break;
1740     case rvc_normal:
1741       break;
1742     case rvc_inf:
1743       strcpy (str, (r->sign ? "-Inf" : "+Inf"));
1744       return;
1745     case rvc_nan:
1746       /* ??? Print the significand as well, if not canonical?  */
1747       sprintf (str, "%c%cNaN", (r->sign ? '-' : '+'),
1748                (r->signalling ? 'S' : 'Q'));
1749       return;
1750     default:
1751       gcc_unreachable ();
1752     }
1753
1754   if (r->decimal)
1755     {
1756       /* Hexadecimal format for decimal floats is not interesting. */
1757       strcpy (str, "N/A");
1758       return;
1759     }
1760
1761   if (digits == 0)
1762     digits = SIGNIFICAND_BITS / 4;
1763
1764   /* Bound the number of digits printed by the size of the output buffer.  */
1765
1766   sprintf (exp_buf, "p%+d", exp);
1767   max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
1768   gcc_assert (max_digits <= buf_size);
1769   if (digits > max_digits)
1770     digits = max_digits;
1771
1772   p = str;
1773   if (r->sign)
1774     *p++ = '-';
1775   *p++ = '0';
1776   *p++ = 'x';
1777   *p++ = '0';
1778   *p++ = '.';
1779   first = p;
1780
1781   for (i = SIGSZ - 1; i >= 0; --i)
1782     for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
1783       {
1784         *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
1785         if (--digits == 0)
1786           goto out;
1787       }
1788
1789  out:
1790   if (crop_trailing_zeros)
1791     while (p > first + 1 && p[-1] == '0')
1792       p--;
1793
1794   sprintf (p, "p%+d", exp);
1795 }
1796
1797 /* Initialize R from a decimal or hexadecimal string.  The string is
1798    assumed to have been syntax checked already.  Return -1 if the
1799    value underflows, +1 if overflows, and 0 otherwise. */
1800
1801 int
1802 real_from_string (REAL_VALUE_TYPE *r, const char *str)
1803 {
1804   int exp = 0;
1805   bool sign = false;
1806
1807   get_zero (r, 0);
1808
1809   if (*str == '-')
1810     {
1811       sign = true;
1812       str++;
1813     }
1814   else if (*str == '+')
1815     str++;
1816
1817   if (!strncmp (str, "QNaN", 4))
1818     {
1819       get_canonical_qnan (r, sign);
1820       return 0;
1821     }
1822   else if (!strncmp (str, "SNaN", 4))
1823     {
1824       get_canonical_snan (r, sign);
1825       return 0;
1826     }
1827   else if (!strncmp (str, "Inf", 3))
1828     {
1829       get_inf (r, sign);
1830       return 0;
1831     }
1832
1833   if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1834     {
1835       /* Hexadecimal floating point.  */
1836       int pos = SIGNIFICAND_BITS - 4, d;
1837
1838       str += 2;
1839
1840       while (*str == '0')
1841         str++;
1842       while (1)
1843         {
1844           d = hex_value (*str);
1845           if (d == _hex_bad)
1846             break;
1847           if (pos >= 0)
1848             {
1849               r->sig[pos / HOST_BITS_PER_LONG]
1850                 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1851               pos -= 4;
1852             }
1853           else if (d)
1854             /* Ensure correct rounding by setting last bit if there is
1855                a subsequent nonzero digit.  */
1856             r->sig[0] |= 1;
1857           exp += 4;
1858           str++;
1859         }
1860       if (*str == '.')
1861         {
1862           str++;
1863           if (pos == SIGNIFICAND_BITS - 4)
1864             {
1865               while (*str == '0')
1866                 str++, exp -= 4;
1867             }
1868           while (1)
1869             {
1870               d = hex_value (*str);
1871               if (d == _hex_bad)
1872                 break;
1873               if (pos >= 0)
1874                 {
1875                   r->sig[pos / HOST_BITS_PER_LONG]
1876                     |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1877                   pos -= 4;
1878                 }
1879               else if (d)
1880                 /* Ensure correct rounding by setting last bit if there is
1881                    a subsequent nonzero digit.  */
1882                 r->sig[0] |= 1;
1883               str++;
1884             }
1885         }
1886
1887       /* If the mantissa is zero, ignore the exponent.  */
1888       if (!cmp_significand_0 (r))
1889         goto is_a_zero;
1890
1891       if (*str == 'p' || *str == 'P')
1892         {
1893           bool exp_neg = false;
1894
1895           str++;
1896           if (*str == '-')
1897             {
1898               exp_neg = true;
1899               str++;
1900             }
1901           else if (*str == '+')
1902             str++;
1903
1904           d = 0;
1905           while (ISDIGIT (*str))
1906             {
1907               d *= 10;
1908               d += *str - '0';
1909               if (d > MAX_EXP)
1910                 {
1911                   /* Overflowed the exponent.  */
1912                   if (exp_neg)
1913                     goto underflow;
1914                   else
1915                     goto overflow;
1916                 }
1917               str++;
1918             }
1919           if (exp_neg)
1920             d = -d;
1921
1922           exp += d;
1923         }
1924
1925       r->cl = rvc_normal;
1926       SET_REAL_EXP (r, exp);
1927
1928       normalize (r);
1929     }
1930   else
1931     {
1932       /* Decimal floating point.  */
1933       const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
1934       int d;
1935
1936       while (*str == '0')
1937         str++;
1938       while (ISDIGIT (*str))
1939         {
1940           d = *str++ - '0';
1941           do_multiply (r, r, ten);
1942           if (d)
1943             do_add (r, r, real_digit (d), 0);
1944         }
1945       if (*str == '.')
1946         {
1947           str++;
1948           if (r->cl == rvc_zero)
1949             {
1950               while (*str == '0')
1951                 str++, exp--;
1952             }
1953           while (ISDIGIT (*str))
1954             {
1955               d = *str++ - '0';
1956               do_multiply (r, r, ten);
1957               if (d)
1958                 do_add (r, r, real_digit (d), 0);
1959               exp--;
1960             }
1961         }
1962
1963       /* If the mantissa is zero, ignore the exponent.  */
1964       if (r->cl == rvc_zero)
1965         goto is_a_zero;
1966
1967       if (*str == 'e' || *str == 'E')
1968         {
1969           bool exp_neg = false;
1970
1971           str++;
1972           if (*str == '-')
1973             {
1974               exp_neg = true;
1975               str++;
1976             }
1977           else if (*str == '+')
1978             str++;
1979
1980           d = 0;
1981           while (ISDIGIT (*str))
1982             {
1983               d *= 10;
1984               d += *str - '0';
1985               if (d > MAX_EXP)
1986                 {
1987                   /* Overflowed the exponent.  */
1988                   if (exp_neg)
1989                     goto underflow;
1990                   else
1991                     goto overflow;
1992                 }
1993               str++;
1994             }
1995           if (exp_neg)
1996             d = -d;
1997           exp += d;
1998         }
1999
2000       if (exp)
2001         times_pten (r, exp);
2002     }
2003
2004   r->sign = sign;
2005   return 0;
2006
2007  is_a_zero:
2008   get_zero (r, sign);
2009   return 0;
2010
2011  underflow:
2012   get_zero (r, sign);
2013   return -1;
2014
2015  overflow:
2016   get_inf (r, sign);
2017   return 1;
2018 }
2019
2020 /* Legacy.  Similar, but return the result directly.  */
2021
2022 REAL_VALUE_TYPE
2023 real_from_string2 (const char *s, enum machine_mode mode)
2024 {
2025   REAL_VALUE_TYPE r;
2026
2027   real_from_string (&r, s);
2028   if (mode != VOIDmode)
2029     real_convert (&r, mode, &r);
2030
2031   return r;
2032 }
2033
2034 /* Initialize R from string S and desired MODE. */
2035
2036 void 
2037 real_from_string3 (REAL_VALUE_TYPE *r, const char *s, enum machine_mode mode)
2038 {
2039   if (DECIMAL_FLOAT_MODE_P (mode))
2040     decimal_real_from_string (r, s);
2041   else
2042     real_from_string (r, s);
2043
2044   if (mode != VOIDmode)
2045     real_convert (r, mode, r);  
2046
2047
2048 /* Initialize R from the integer pair HIGH+LOW.  */
2049
2050 void
2051 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
2052                    unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
2053                    int unsigned_p)
2054 {
2055   if (low == 0 && high == 0)
2056     get_zero (r, 0);
2057   else
2058     {
2059       memset (r, 0, sizeof (*r));
2060       r->cl = rvc_normal;
2061       r->sign = high < 0 && !unsigned_p;
2062       SET_REAL_EXP (r, 2 * HOST_BITS_PER_WIDE_INT);
2063
2064       if (r->sign)
2065         {
2066           high = ~high;
2067           if (low == 0)
2068             high += 1;
2069           else
2070             low = -low;
2071         }
2072
2073       if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
2074         {
2075           r->sig[SIGSZ-1] = high;
2076           r->sig[SIGSZ-2] = low;
2077         }
2078       else
2079         {
2080           gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
2081           r->sig[SIGSZ-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
2082           r->sig[SIGSZ-2] = high;
2083           r->sig[SIGSZ-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
2084           r->sig[SIGSZ-4] = low;
2085         }
2086
2087       normalize (r);
2088     }
2089
2090   if (mode != VOIDmode)
2091     real_convert (r, mode, r);
2092 }
2093
2094 /* Returns 10**2**N.  */
2095
2096 static const REAL_VALUE_TYPE *
2097 ten_to_ptwo (int n)
2098 {
2099   static REAL_VALUE_TYPE tens[EXP_BITS];
2100
2101   gcc_assert (n >= 0);
2102   gcc_assert (n < EXP_BITS);
2103
2104   if (tens[n].cl == rvc_zero)
2105     {
2106       if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2107         {
2108           HOST_WIDE_INT t = 10;
2109           int i;
2110
2111           for (i = 0; i < n; ++i)
2112             t *= t;
2113
2114           real_from_integer (&tens[n], VOIDmode, t, 0, 1);
2115         }
2116       else
2117         {
2118           const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2119           do_multiply (&tens[n], t, t);
2120         }
2121     }
2122
2123   return &tens[n];
2124 }
2125
2126 /* Returns 10**(-2**N).  */
2127
2128 static const REAL_VALUE_TYPE *
2129 ten_to_mptwo (int n)
2130 {
2131   static REAL_VALUE_TYPE tens[EXP_BITS];
2132
2133   gcc_assert (n >= 0);
2134   gcc_assert (n < EXP_BITS);
2135
2136   if (tens[n].cl == rvc_zero)
2137     do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2138
2139   return &tens[n];
2140 }
2141
2142 /* Returns N.  */
2143
2144 static const REAL_VALUE_TYPE *
2145 real_digit (int n)
2146 {
2147   static REAL_VALUE_TYPE num[10];
2148
2149   gcc_assert (n >= 0);
2150   gcc_assert (n <= 9);
2151
2152   if (n > 0 && num[n].cl == rvc_zero)
2153     real_from_integer (&num[n], VOIDmode, n, 0, 1);
2154
2155   return &num[n];
2156 }
2157
2158 /* Multiply R by 10**EXP.  */
2159
2160 static void
2161 times_pten (REAL_VALUE_TYPE *r, int exp)
2162 {
2163   REAL_VALUE_TYPE pten, *rr;
2164   bool negative = (exp < 0);
2165   int i;
2166
2167   if (negative)
2168     {
2169       exp = -exp;
2170       pten = *real_digit (1);
2171       rr = &pten;
2172     }
2173   else
2174     rr = r;
2175
2176   for (i = 0; exp > 0; ++i, exp >>= 1)
2177     if (exp & 1)
2178       do_multiply (rr, rr, ten_to_ptwo (i));
2179
2180   if (negative)
2181     do_divide (r, r, &pten);
2182 }
2183
2184 /* Returns the special REAL_VALUE_TYPE enumerated by E.  */
2185
2186 const REAL_VALUE_TYPE *
2187 get_real_const (enum real_value_const e)
2188 {
2189   static REAL_VALUE_TYPE value[rv_max];
2190
2191   gcc_assert (e < rv_max);
2192
2193   /* Initialize mathematical constants for constant folding builtins.
2194      These constants need to be given to at least 160 bits precision.  */
2195   if (value[e].cl == rvc_zero)
2196     switch (e)
2197     {
2198     case rv_e:
2199       {
2200         mpfr_t m;
2201         mpfr_init2 (m, SIGNIFICAND_BITS);
2202         mpfr_set_ui (m, 1, GMP_RNDN);
2203         mpfr_exp (m, m, GMP_RNDN);
2204         real_from_mpfr (&value[e], m, NULL_TREE, GMP_RNDN);
2205         mpfr_clear (m);
2206       }
2207       break;
2208     case rv_third:
2209       real_arithmetic (&value[e], RDIV_EXPR, &dconst1, real_digit (3));
2210       break;
2211     case rv_sqrt2:
2212       {
2213         mpfr_t m;
2214         mpfr_init2 (m, SIGNIFICAND_BITS);
2215         mpfr_sqrt_ui (m, 2, GMP_RNDN);
2216         real_from_mpfr (&value[e], m, NULL_TREE, GMP_RNDN);
2217         mpfr_clear (m);
2218       }
2219       break;
2220     default:
2221       gcc_unreachable();
2222     }
2223
2224   return &value[e];
2225 }
2226
2227 /* Fills R with +Inf.  */
2228
2229 void
2230 real_inf (REAL_VALUE_TYPE *r)
2231 {
2232   get_inf (r, 0);
2233 }
2234
2235 /* Fills R with a NaN whose significand is described by STR.  If QUIET,
2236    we force a QNaN, else we force an SNaN.  The string, if not empty,
2237    is parsed as a number and placed in the significand.  Return true
2238    if the string was successfully parsed.  */
2239
2240 bool
2241 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2242           enum machine_mode mode)
2243 {
2244   const struct real_format *fmt;
2245
2246   fmt = REAL_MODE_FORMAT (mode);
2247   gcc_assert (fmt);
2248
2249   if (*str == 0)
2250     {
2251       if (quiet)
2252         get_canonical_qnan (r, 0);
2253       else
2254         get_canonical_snan (r, 0);
2255     }
2256   else
2257     {
2258       int base = 10, d;
2259
2260       memset (r, 0, sizeof (*r));
2261       r->cl = rvc_nan;
2262
2263       /* Parse akin to strtol into the significand of R.  */
2264
2265       while (ISSPACE (*str))
2266         str++;
2267       if (*str == '-')
2268         str++;
2269       else if (*str == '+')
2270         str++;
2271       if (*str == '0')
2272         {
2273           str++;
2274           if (*str == 'x' || *str == 'X')
2275             {
2276               base = 16;
2277               str++;
2278             }
2279           else
2280             base = 8;
2281         }
2282
2283       while ((d = hex_value (*str)) < base)
2284         {
2285           REAL_VALUE_TYPE u;
2286
2287           switch (base)
2288             {
2289             case 8:
2290               lshift_significand (r, r, 3);
2291               break;
2292             case 16:
2293               lshift_significand (r, r, 4);
2294               break;
2295             case 10:
2296               lshift_significand_1 (&u, r);
2297               lshift_significand (r, r, 3);
2298               add_significands (r, r, &u);
2299               break;
2300             default:
2301               gcc_unreachable ();
2302             }
2303
2304           get_zero (&u, 0);
2305           u.sig[0] = d;
2306           add_significands (r, r, &u);
2307
2308           str++;
2309         }
2310
2311       /* Must have consumed the entire string for success.  */
2312       if (*str != 0)
2313         return false;
2314
2315       /* Shift the significand into place such that the bits
2316          are in the most significant bits for the format.  */
2317       lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
2318
2319       /* Our MSB is always unset for NaNs.  */
2320       r->sig[SIGSZ-1] &= ~SIG_MSB;
2321
2322       /* Force quiet or signalling NaN.  */
2323       r->signalling = !quiet;
2324     }
2325
2326   return true;
2327 }
2328
2329 /* Fills R with the largest finite value representable in mode MODE.
2330    If SIGN is nonzero, R is set to the most negative finite value.  */
2331
2332 void
2333 real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
2334 {
2335   const struct real_format *fmt;
2336   int np2;
2337
2338   fmt = REAL_MODE_FORMAT (mode);
2339   gcc_assert (fmt);
2340   memset (r, 0, sizeof (*r));
2341   
2342   if (fmt->b == 10)
2343     decimal_real_maxval (r, sign, mode);
2344   else
2345     {
2346       r->cl = rvc_normal;
2347       r->sign = sign;
2348       SET_REAL_EXP (r, fmt->emax);
2349
2350       np2 = SIGNIFICAND_BITS - fmt->p;
2351       memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
2352       clear_significand_below (r, np2);
2353
2354       if (fmt->pnan < fmt->p)
2355         /* This is an IBM extended double format made up of two IEEE
2356            doubles.  The value of the long double is the sum of the
2357            values of the two parts.  The most significant part is
2358            required to be the value of the long double rounded to the
2359            nearest double.  Rounding means we need a slightly smaller
2360            value for LDBL_MAX.  */
2361         clear_significand_bit (r, SIGNIFICAND_BITS - fmt->pnan);
2362     }
2363 }
2364
2365 /* Fills R with 2**N.  */
2366
2367 void
2368 real_2expN (REAL_VALUE_TYPE *r, int n, enum machine_mode fmode)
2369 {
2370   memset (r, 0, sizeof (*r));
2371
2372   n++;
2373   if (n > MAX_EXP)
2374     r->cl = rvc_inf;
2375   else if (n < -MAX_EXP)
2376     ;
2377   else
2378     {
2379       r->cl = rvc_normal;
2380       SET_REAL_EXP (r, n);
2381       r->sig[SIGSZ-1] = SIG_MSB;
2382     }
2383   if (DECIMAL_FLOAT_MODE_P (fmode))
2384     decimal_real_convert (r, fmode, r);
2385 }
2386
2387 \f
2388 static void
2389 round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
2390 {
2391   int p2, np2, i, w;
2392   unsigned long sticky;
2393   bool guard, lsb;
2394   int emin2m1, emax2;
2395
2396   if (r->decimal)
2397     {
2398       if (fmt->b == 10)
2399         {
2400           decimal_round_for_format (fmt, r);
2401           return;
2402         }
2403       /* FIXME. We can come here via fp_easy_constant
2404          (e.g. -O0 on '_Decimal32 x = 1.0 + 2.0dd'), but have not
2405          investigated whether this convert needs to be here, or
2406          something else is missing. */
2407       decimal_real_convert (r, DFmode, r);
2408     }
2409
2410   p2 = fmt->p;
2411   emin2m1 = fmt->emin - 1;
2412   emax2 = fmt->emax;
2413
2414   np2 = SIGNIFICAND_BITS - p2;
2415   switch (r->cl)
2416     {
2417     underflow:
2418       get_zero (r, r->sign);
2419     case rvc_zero:
2420       if (!fmt->has_signed_zero)
2421         r->sign = 0;
2422       return;
2423
2424     overflow:
2425       get_inf (r, r->sign);
2426     case rvc_inf:
2427       return;
2428
2429     case rvc_nan:
2430       clear_significand_below (r, np2);
2431       return;
2432
2433     case rvc_normal:
2434       break;
2435
2436     default:
2437       gcc_unreachable ();
2438     }
2439
2440   /* Check the range of the exponent.  If we're out of range,
2441      either underflow or overflow.  */
2442   if (REAL_EXP (r) > emax2)
2443     goto overflow;
2444   else if (REAL_EXP (r) <= emin2m1)
2445     {
2446       int diff;
2447
2448       if (!fmt->has_denorm)
2449         {
2450           /* Don't underflow completely until we've had a chance to round.  */
2451           if (REAL_EXP (r) < emin2m1)
2452             goto underflow;
2453         }
2454       else
2455         {
2456           diff = emin2m1 - REAL_EXP (r) + 1;
2457           if (diff > p2)
2458             goto underflow;
2459
2460           /* De-normalize the significand.  */
2461           r->sig[0] |= sticky_rshift_significand (r, r, diff);
2462           SET_REAL_EXP (r, REAL_EXP (r) + diff);
2463         }
2464     }
2465
2466   /* There are P2 true significand bits, followed by one guard bit,
2467      followed by one sticky bit, followed by stuff.  Fold nonzero
2468      stuff into the sticky bit.  */
2469
2470   sticky = 0;
2471   for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2472     sticky |= r->sig[i];
2473   sticky |=
2474     r->sig[w] & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2475
2476   guard = test_significand_bit (r, np2 - 1);
2477   lsb = test_significand_bit (r, np2);
2478
2479   /* Round to even.  */
2480   if (guard && (sticky || lsb))
2481     {
2482       REAL_VALUE_TYPE u;
2483       get_zero (&u, 0);
2484       set_significand_bit (&u, np2);
2485
2486       if (add_significands (r, r, &u))
2487         {
2488           /* Overflow.  Means the significand had been all ones, and
2489              is now all zeros.  Need to increase the exponent, and
2490              possibly re-normalize it.  */
2491           SET_REAL_EXP (r, REAL_EXP (r) + 1);
2492           if (REAL_EXP (r) > emax2)
2493             goto overflow;
2494           r->sig[SIGSZ-1] = SIG_MSB;
2495         }
2496     }
2497
2498   /* Catch underflow that we deferred until after rounding.  */
2499   if (REAL_EXP (r) <= emin2m1)
2500     goto underflow;
2501
2502   /* Clear out trailing garbage.  */
2503   clear_significand_below (r, np2);
2504 }
2505
2506 /* Extend or truncate to a new mode.  */
2507
2508 void
2509 real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
2510               const REAL_VALUE_TYPE *a)
2511 {
2512   const struct real_format *fmt;
2513
2514   fmt = REAL_MODE_FORMAT (mode);
2515   gcc_assert (fmt);
2516
2517   *r = *a;
2518
2519   if (a->decimal || fmt->b == 10)
2520     decimal_real_convert (r, mode, a);
2521
2522   round_for_format (fmt, r);
2523
2524   /* round_for_format de-normalizes denormals.  Undo just that part.  */
2525   if (r->cl == rvc_normal)
2526     normalize (r);
2527 }
2528
2529 /* Legacy.  Likewise, except return the struct directly.  */
2530
2531 REAL_VALUE_TYPE
2532 real_value_truncate (enum machine_mode mode, REAL_VALUE_TYPE a)
2533 {
2534   REAL_VALUE_TYPE r;
2535   real_convert (&r, mode, &a);
2536   return r;
2537 }
2538
2539 /* Return true if truncating to MODE is exact.  */
2540
2541 bool
2542 exact_real_truncate (enum machine_mode mode, const REAL_VALUE_TYPE *a)
2543 {
2544   const struct real_format *fmt;
2545   REAL_VALUE_TYPE t;
2546   int emin2m1;
2547
2548   fmt = REAL_MODE_FORMAT (mode);
2549   gcc_assert (fmt);
2550
2551   /* Don't allow conversion to denormals.  */
2552   emin2m1 = fmt->emin - 1;
2553   if (REAL_EXP (a) <= emin2m1)
2554     return false;
2555
2556   /* After conversion to the new mode, the value must be identical.  */
2557   real_convert (&t, mode, a);
2558   return real_identical (&t, a);
2559 }
2560
2561 /* Write R to the given target format.  Place the words of the result
2562    in target word order in BUF.  There are always 32 bits in each
2563    long, no matter the size of the host long.
2564
2565    Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE.  */
2566
2567 long
2568 real_to_target_fmt (long *buf, const REAL_VALUE_TYPE *r_orig,
2569                     const struct real_format *fmt)
2570 {
2571   REAL_VALUE_TYPE r;
2572   long buf1;
2573
2574   r = *r_orig;
2575   round_for_format (fmt, &r);
2576
2577   if (!buf)
2578     buf = &buf1;
2579   (*fmt->encode) (fmt, buf, &r);
2580
2581   return *buf;
2582 }
2583
2584 /* Similar, but look up the format from MODE.  */
2585
2586 long
2587 real_to_target (long *buf, const REAL_VALUE_TYPE *r, enum machine_mode mode)
2588 {
2589   const struct real_format *fmt;
2590
2591   fmt = REAL_MODE_FORMAT (mode);
2592   gcc_assert (fmt);
2593
2594   return real_to_target_fmt (buf, r, fmt);
2595 }
2596
2597 /* Read R from the given target format.  Read the words of the result
2598    in target word order in BUF.  There are always 32 bits in each
2599    long, no matter the size of the host long.  */
2600
2601 void
2602 real_from_target_fmt (REAL_VALUE_TYPE *r, const long *buf,
2603                       const struct real_format *fmt)
2604 {
2605   (*fmt->decode) (fmt, r, buf);
2606 }
2607
2608 /* Similar, but look up the format from MODE.  */
2609
2610 void
2611 real_from_target (REAL_VALUE_TYPE *r, const long *buf, enum machine_mode mode)
2612 {
2613   const struct real_format *fmt;
2614
2615   fmt = REAL_MODE_FORMAT (mode);
2616   gcc_assert (fmt);
2617
2618   (*fmt->decode) (fmt, r, buf);
2619 }
2620
2621 /* Return the number of bits of the largest binary value that the
2622    significand of MODE will hold.  */
2623 /* ??? Legacy.  Should get access to real_format directly.  */
2624
2625 int
2626 significand_size (enum machine_mode mode)
2627 {
2628   const struct real_format *fmt;
2629
2630   fmt = REAL_MODE_FORMAT (mode);
2631   if (fmt == NULL)
2632     return 0;
2633
2634   if (fmt->b == 10)
2635     {
2636       /* Return the size in bits of the largest binary value that can be
2637          held by the decimal coefficient for this mode.  This is one more
2638          than the number of bits required to hold the largest coefficient
2639          of this mode.  */
2640       double log2_10 = 3.3219281;
2641       return fmt->p * log2_10;
2642     }
2643   return fmt->p;
2644 }
2645
2646 /* Return a hash value for the given real value.  */
2647 /* ??? The "unsigned int" return value is intended to be hashval_t,
2648    but I didn't want to pull hashtab.h into real.h.  */
2649
2650 unsigned int
2651 real_hash (const REAL_VALUE_TYPE *r)
2652 {
2653   unsigned int h;
2654   size_t i;
2655
2656   h = r->cl | (r->sign << 2);
2657   switch (r->cl)
2658     {
2659     case rvc_zero:
2660     case rvc_inf:
2661       return h;
2662
2663     case rvc_normal:
2664       h |= REAL_EXP (r) << 3;
2665       break;
2666
2667     case rvc_nan:
2668       if (r->signalling)
2669         h ^= (unsigned int)-1;
2670       if (r->canonical)
2671         return h;
2672       break;
2673
2674     default:
2675       gcc_unreachable ();
2676     }
2677
2678   if (sizeof(unsigned long) > sizeof(unsigned int))
2679     for (i = 0; i < SIGSZ; ++i)
2680       {
2681         unsigned long s = r->sig[i];
2682         h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2683       }
2684   else
2685     for (i = 0; i < SIGSZ; ++i)
2686       h ^= r->sig[i];
2687
2688   return h;
2689 }
2690 \f
2691 /* IEEE single-precision format.  */
2692
2693 static void encode_ieee_single (const struct real_format *fmt,
2694                                 long *, const REAL_VALUE_TYPE *);
2695 static void decode_ieee_single (const struct real_format *,
2696                                 REAL_VALUE_TYPE *, const long *);
2697
2698 static void
2699 encode_ieee_single (const struct real_format *fmt, long *buf,
2700                     const REAL_VALUE_TYPE *r)
2701 {
2702   unsigned long image, sig, exp;
2703   unsigned long sign = r->sign;
2704   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2705
2706   image = sign << 31;
2707   sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2708
2709   switch (r->cl)
2710     {
2711     case rvc_zero:
2712       break;
2713
2714     case rvc_inf:
2715       if (fmt->has_inf)
2716         image |= 255 << 23;
2717       else
2718         image |= 0x7fffffff;
2719       break;
2720
2721     case rvc_nan:
2722       if (fmt->has_nans)
2723         {
2724           if (r->canonical)
2725             sig = (fmt->canonical_nan_lsbs_set ? (1 << 22) - 1 : 0);
2726           if (r->signalling == fmt->qnan_msb_set)
2727             sig &= ~(1 << 22);
2728           else
2729             sig |= 1 << 22;
2730           if (sig == 0)
2731             sig = 1 << 21;
2732
2733           image |= 255 << 23;
2734           image |= sig;
2735         }
2736       else
2737         image |= 0x7fffffff;
2738       break;
2739
2740     case rvc_normal:
2741       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2742          whereas the intermediate representation is 0.F x 2**exp.
2743          Which means we're off by one.  */
2744       if (denormal)
2745         exp = 0;
2746       else
2747       exp = REAL_EXP (r) + 127 - 1;
2748       image |= exp << 23;
2749       image |= sig;
2750       break;
2751
2752     default:
2753       gcc_unreachable ();
2754     }
2755
2756   buf[0] = image;
2757 }
2758
2759 static void
2760 decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2761                     const long *buf)
2762 {
2763   unsigned long image = buf[0] & 0xffffffff;
2764   bool sign = (image >> 31) & 1;
2765   int exp = (image >> 23) & 0xff;
2766
2767   memset (r, 0, sizeof (*r));
2768   image <<= HOST_BITS_PER_LONG - 24;
2769   image &= ~SIG_MSB;
2770
2771   if (exp == 0)
2772     {
2773       if (image && fmt->has_denorm)
2774         {
2775           r->cl = rvc_normal;
2776           r->sign = sign;
2777           SET_REAL_EXP (r, -126);
2778           r->sig[SIGSZ-1] = image << 1;
2779           normalize (r);
2780         }
2781       else if (fmt->has_signed_zero)
2782         r->sign = sign;
2783     }
2784   else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
2785     {
2786       if (image)
2787         {
2788           r->cl = rvc_nan;
2789           r->sign = sign;
2790           r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
2791                            ^ fmt->qnan_msb_set);
2792           r->sig[SIGSZ-1] = image;
2793         }
2794       else
2795         {
2796           r->cl = rvc_inf;
2797           r->sign = sign;
2798         }
2799     }
2800   else
2801     {
2802       r->cl = rvc_normal;
2803       r->sign = sign;
2804       SET_REAL_EXP (r, exp - 127 + 1);
2805       r->sig[SIGSZ-1] = image | SIG_MSB;
2806     }
2807 }
2808
2809 const struct real_format ieee_single_format =
2810   {
2811     encode_ieee_single,
2812     decode_ieee_single,
2813     2,
2814     24,
2815     24,
2816     -125,
2817     128,
2818     31,
2819     31,
2820     true,
2821     true,
2822     true,
2823     true,
2824     true,
2825     false
2826   };
2827
2828 const struct real_format mips_single_format =
2829   {
2830     encode_ieee_single,
2831     decode_ieee_single,
2832     2,
2833     24,
2834     24,
2835     -125,
2836     128,
2837     31,
2838     31,
2839     true,
2840     true,
2841     true,
2842     true,
2843     false,
2844     true
2845   };
2846
2847 const struct real_format motorola_single_format =
2848   {
2849     encode_ieee_single,
2850     decode_ieee_single,
2851     2,
2852     24,
2853     24,
2854     -125,
2855     128,
2856     31,
2857     31,
2858     true,
2859     true,
2860     true,
2861     true,
2862     true,
2863     true
2864   };
2865 \f
2866 /* IEEE double-precision format.  */
2867
2868 static void encode_ieee_double (const struct real_format *fmt,
2869                                 long *, const REAL_VALUE_TYPE *);
2870 static void decode_ieee_double (const struct real_format *,
2871                                 REAL_VALUE_TYPE *, const long *);
2872
2873 static void
2874 encode_ieee_double (const struct real_format *fmt, long *buf,
2875                     const REAL_VALUE_TYPE *r)
2876 {
2877   unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
2878   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2879
2880   image_hi = r->sign << 31;
2881   image_lo = 0;
2882
2883   if (HOST_BITS_PER_LONG == 64)
2884     {
2885       sig_hi = r->sig[SIGSZ-1];
2886       sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
2887       sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
2888     }
2889   else
2890     {
2891       sig_hi = r->sig[SIGSZ-1];
2892       sig_lo = r->sig[SIGSZ-2];
2893       sig_lo = (sig_hi << 21) | (sig_lo >> 11);
2894       sig_hi = (sig_hi >> 11) & 0xfffff;
2895     }
2896
2897   switch (r->cl)
2898     {
2899     case rvc_zero:
2900       break;
2901
2902     case rvc_inf:
2903       if (fmt->has_inf)
2904         image_hi |= 2047 << 20;
2905       else
2906         {
2907           image_hi |= 0x7fffffff;
2908           image_lo = 0xffffffff;
2909         }
2910       break;
2911
2912     case rvc_nan:
2913       if (fmt->has_nans)
2914         {
2915           if (r->canonical)
2916             {
2917               if (fmt->canonical_nan_lsbs_set)
2918                 {
2919                   sig_hi = (1 << 19) - 1;
2920                   sig_lo = 0xffffffff;
2921                 }
2922               else
2923                 {
2924                   sig_hi = 0;
2925                   sig_lo = 0;
2926                 }
2927             }
2928           if (r->signalling == fmt->qnan_msb_set)
2929             sig_hi &= ~(1 << 19);
2930           else
2931             sig_hi |= 1 << 19;
2932           if (sig_hi == 0 && sig_lo == 0)
2933             sig_hi = 1 << 18;
2934
2935           image_hi |= 2047 << 20;
2936           image_hi |= sig_hi;
2937           image_lo = sig_lo;
2938         }
2939       else
2940         {
2941           image_hi |= 0x7fffffff;
2942           image_lo = 0xffffffff;
2943         }
2944       break;
2945
2946     case rvc_normal:
2947       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2948          whereas the intermediate representation is 0.F x 2**exp.
2949          Which means we're off by one.  */
2950       if (denormal)
2951         exp = 0;
2952       else
2953         exp = REAL_EXP (r) + 1023 - 1;
2954       image_hi |= exp << 20;
2955       image_hi |= sig_hi;
2956       image_lo = sig_lo;
2957       break;
2958
2959     default:
2960       gcc_unreachable ();
2961     }
2962
2963   if (FLOAT_WORDS_BIG_ENDIAN)
2964     buf[0] = image_hi, buf[1] = image_lo;
2965   else
2966     buf[0] = image_lo, buf[1] = image_hi;
2967 }
2968
2969 static void
2970 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2971                     const long *buf)
2972 {
2973   unsigned long image_hi, image_lo;
2974   bool sign;
2975   int exp;
2976
2977   if (FLOAT_WORDS_BIG_ENDIAN)
2978     image_hi = buf[0], image_lo = buf[1];
2979   else
2980     image_lo = buf[0], image_hi = buf[1];
2981   image_lo &= 0xffffffff;
2982   image_hi &= 0xffffffff;
2983
2984   sign = (image_hi >> 31) & 1;
2985   exp = (image_hi >> 20) & 0x7ff;
2986
2987   memset (r, 0, sizeof (*r));
2988
2989   image_hi <<= 32 - 21;
2990   image_hi |= image_lo >> 21;
2991   image_hi &= 0x7fffffff;
2992   image_lo <<= 32 - 21;
2993
2994   if (exp == 0)
2995     {
2996       if ((image_hi || image_lo) && fmt->has_denorm)
2997         {
2998           r->cl = rvc_normal;
2999           r->sign = sign;
3000           SET_REAL_EXP (r, -1022);
3001           if (HOST_BITS_PER_LONG == 32)
3002             {
3003               image_hi = (image_hi << 1) | (image_lo >> 31);
3004               image_lo <<= 1;
3005               r->sig[SIGSZ-1] = image_hi;
3006               r->sig[SIGSZ-2] = image_lo;
3007             }
3008           else
3009             {
3010               image_hi = (image_hi << 31 << 2) | (image_lo << 1);
3011               r->sig[SIGSZ-1] = image_hi;
3012             }
3013           normalize (r);
3014         }
3015       else if (fmt->has_signed_zero)
3016         r->sign = sign;
3017     }
3018   else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
3019     {
3020       if (image_hi || image_lo)
3021         {
3022           r->cl = rvc_nan;
3023           r->sign = sign;
3024           r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3025           if (HOST_BITS_PER_LONG == 32)
3026             {
3027               r->sig[SIGSZ-1] = image_hi;
3028               r->sig[SIGSZ-2] = image_lo;
3029             }
3030           else
3031             r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
3032         }
3033       else
3034         {
3035           r->cl = rvc_inf;
3036           r->sign = sign;
3037         }
3038     }
3039   else
3040     {
3041       r->cl = rvc_normal;
3042       r->sign = sign;
3043       SET_REAL_EXP (r, exp - 1023 + 1);
3044       if (HOST_BITS_PER_LONG == 32)
3045         {
3046           r->sig[SIGSZ-1] = image_hi | SIG_MSB;
3047           r->sig[SIGSZ-2] = image_lo;
3048         }
3049       else
3050         r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
3051     }
3052 }
3053
3054 const struct real_format ieee_double_format =
3055   {
3056     encode_ieee_double,
3057     decode_ieee_double,
3058     2,
3059     53,
3060     53,
3061     -1021,
3062     1024,
3063     63,
3064     63,
3065     true,
3066     true,
3067     true,
3068     true,
3069     true,
3070     false
3071   };
3072
3073 const struct real_format mips_double_format =
3074   {
3075     encode_ieee_double,
3076     decode_ieee_double,
3077     2,
3078     53,
3079     53,
3080     -1021,
3081     1024,
3082     63,
3083     63,
3084     true,
3085     true,
3086     true,
3087     true,
3088     false,
3089     true
3090   };
3091
3092 const struct real_format motorola_double_format =
3093   {
3094     encode_ieee_double,
3095     decode_ieee_double,
3096     2,
3097     53,
3098     53,
3099     -1021,
3100     1024,
3101     63,
3102     63,
3103     true,
3104     true,
3105     true,
3106     true,
3107     true,
3108     true
3109   };
3110 \f
3111 /* IEEE extended real format.  This comes in three flavors: Intel's as
3112    a 12 byte image, Intel's as a 16 byte image, and Motorola's.  Intel
3113    12- and 16-byte images may be big- or little endian; Motorola's is
3114    always big endian.  */
3115
3116 /* Helper subroutine which converts from the internal format to the
3117    12-byte little-endian Intel format.  Functions below adjust this
3118    for the other possible formats.  */
3119 static void
3120 encode_ieee_extended (const struct real_format *fmt, long *buf,
3121                       const REAL_VALUE_TYPE *r)
3122 {
3123   unsigned long image_hi, sig_hi, sig_lo;
3124   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3125
3126   image_hi = r->sign << 15;
3127   sig_hi = sig_lo = 0;
3128
3129   switch (r->cl)
3130     {
3131     case rvc_zero:
3132       break;
3133
3134     case rvc_inf:
3135       if (fmt->has_inf)
3136         {
3137           image_hi |= 32767;
3138
3139           /* Intel requires the explicit integer bit to be set, otherwise
3140              it considers the value a "pseudo-infinity".  Motorola docs
3141              say it doesn't care.  */
3142           sig_hi = 0x80000000;
3143         }
3144       else
3145         {
3146           image_hi |= 32767;
3147           sig_lo = sig_hi = 0xffffffff;
3148         }
3149       break;
3150
3151     case rvc_nan:
3152       if (fmt->has_nans)
3153         {
3154           image_hi |= 32767;
3155           if (r->canonical)
3156             {
3157               if (fmt->canonical_nan_lsbs_set)
3158                 {
3159                   sig_hi = (1 << 30) - 1;
3160                   sig_lo = 0xffffffff;
3161                 }
3162             }
3163           else if (HOST_BITS_PER_LONG == 32)
3164             {
3165               sig_hi = r->sig[SIGSZ-1];
3166               sig_lo = r->sig[SIGSZ-2];
3167             }
3168           else
3169             {
3170               sig_lo = r->sig[SIGSZ-1];
3171               sig_hi = sig_lo >> 31 >> 1;
3172               sig_lo &= 0xffffffff;
3173             }
3174           if (r->signalling == fmt->qnan_msb_set)
3175             sig_hi &= ~(1 << 30);
3176           else
3177             sig_hi |= 1 << 30;
3178           if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
3179             sig_hi = 1 << 29;
3180
3181           /* Intel requires the explicit integer bit to be set, otherwise
3182              it considers the value a "pseudo-nan".  Motorola docs say it
3183              doesn't care.  */
3184           sig_hi |= 0x80000000;
3185         }
3186       else
3187         {
3188           image_hi |= 32767;
3189           sig_lo = sig_hi = 0xffffffff;
3190         }
3191       break;
3192
3193     case rvc_normal:
3194       {
3195         int exp = REAL_EXP (r);
3196
3197         /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3198            whereas the intermediate representation is 0.F x 2**exp.
3199            Which means we're off by one.
3200
3201            Except for Motorola, which consider exp=0 and explicit
3202            integer bit set to continue to be normalized.  In theory
3203            this discrepancy has been taken care of by the difference
3204            in fmt->emin in round_for_format.  */
3205
3206         if (denormal)
3207           exp = 0;
3208         else
3209           {
3210             exp += 16383 - 1;
3211             gcc_assert (exp >= 0);
3212           }
3213         image_hi |= exp;
3214
3215         if (HOST_BITS_PER_LONG == 32)
3216           {
3217             sig_hi = r->sig[SIGSZ-1];
3218             sig_lo = r->sig[SIGSZ-2];
3219           }
3220         else
3221           {
3222             sig_lo = r->sig[SIGSZ-1];
3223             sig_hi = sig_lo >> 31 >> 1;
3224             sig_lo &= 0xffffffff;
3225           }
3226       }
3227       break;
3228
3229     default:
3230       gcc_unreachable ();
3231     }
3232
3233   buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3234 }
3235
3236 /* Convert from the internal format to the 12-byte Motorola format
3237    for an IEEE extended real.  */
3238 static void
3239 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3240                                const REAL_VALUE_TYPE *r)
3241 {
3242   long intermed[3];
3243   encode_ieee_extended (fmt, intermed, r);
3244
3245   /* Motorola chips are assumed always to be big-endian.  Also, the
3246      padding in a Motorola extended real goes between the exponent and
3247      the mantissa.  At this point the mantissa is entirely within
3248      elements 0 and 1 of intermed, and the exponent entirely within
3249      element 2, so all we have to do is swap the order around, and
3250      shift element 2 left 16 bits.  */
3251   buf[0] = intermed[2] << 16;
3252   buf[1] = intermed[1];
3253   buf[2] = intermed[0];
3254 }
3255
3256 /* Convert from the internal format to the 12-byte Intel format for
3257    an IEEE extended real.  */
3258 static void
3259 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3260                                const REAL_VALUE_TYPE *r)
3261 {
3262   if (FLOAT_WORDS_BIG_ENDIAN)
3263     {
3264       /* All the padding in an Intel-format extended real goes at the high
3265          end, which in this case is after the mantissa, not the exponent.
3266          Therefore we must shift everything down 16 bits.  */
3267       long intermed[3];
3268       encode_ieee_extended (fmt, intermed, r);
3269       buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3270       buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3271       buf[2] =  (intermed[0] << 16);
3272     }
3273   else
3274     /* encode_ieee_extended produces what we want directly.  */
3275     encode_ieee_extended (fmt, buf, r);
3276 }
3277
3278 /* Convert from the internal format to the 16-byte Intel format for
3279    an IEEE extended real.  */
3280 static void
3281 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3282                                 const REAL_VALUE_TYPE *r)
3283 {
3284   /* All the padding in an Intel-format extended real goes at the high end.  */
3285   encode_ieee_extended_intel_96 (fmt, buf, r);
3286   buf[3] = 0;
3287 }
3288
3289 /* As above, we have a helper function which converts from 12-byte
3290    little-endian Intel format to internal format.  Functions below
3291    adjust for the other possible formats.  */
3292 static void
3293 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3294                       const long *buf)
3295 {
3296   unsigned long image_hi, sig_hi, sig_lo;
3297   bool sign;
3298   int exp;
3299
3300   sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3301   sig_lo &= 0xffffffff;
3302   sig_hi &= 0xffffffff;
3303   image_hi &= 0xffffffff;
3304
3305   sign = (image_hi >> 15) & 1;
3306   exp = image_hi & 0x7fff;
3307
3308   memset (r, 0, sizeof (*r));
3309
3310   if (exp == 0)
3311     {
3312       if ((sig_hi || sig_lo) && fmt->has_denorm)
3313         {
3314           r->cl = rvc_normal;
3315           r->sign = sign;
3316
3317           /* When the IEEE format contains a hidden bit, we know that
3318              it's zero at this point, and so shift up the significand
3319              and decrease the exponent to match.  In this case, Motorola
3320              defines the explicit integer bit to be valid, so we don't
3321              know whether the msb is set or not.  */
3322           SET_REAL_EXP (r, fmt->emin);
3323           if (HOST_BITS_PER_LONG == 32)
3324             {
3325               r->sig[SIGSZ-1] = sig_hi;
3326               r->sig[SIGSZ-2] = sig_lo;
3327             }
3328           else
3329             r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3330
3331           normalize (r);
3332         }
3333       else if (fmt->has_signed_zero)
3334         r->sign = sign;
3335     }
3336   else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3337     {
3338       /* See above re "pseudo-infinities" and "pseudo-nans".
3339          Short summary is that the MSB will likely always be
3340          set, and that we don't care about it.  */
3341       sig_hi &= 0x7fffffff;
3342
3343       if (sig_hi || sig_lo)
3344         {
3345           r->cl = rvc_nan;
3346           r->sign = sign;
3347           r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3348           if (HOST_BITS_PER_LONG == 32)
3349             {
3350               r->sig[SIGSZ-1] = sig_hi;
3351               r->sig[SIGSZ-2] = sig_lo;
3352             }
3353           else
3354             r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3355         }
3356       else
3357         {
3358           r->cl = rvc_inf;
3359           r->sign = sign;
3360         }
3361     }
3362   else
3363     {
3364       r->cl = rvc_normal;
3365       r->sign = sign;
3366       SET_REAL_EXP (r, exp - 16383 + 1);
3367       if (HOST_BITS_PER_LONG == 32)
3368         {
3369           r->sig[SIGSZ-1] = sig_hi;
3370           r->sig[SIGSZ-2] = sig_lo;
3371         }
3372       else
3373         r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3374     }
3375 }
3376
3377 /* Convert from the internal format to the 12-byte Motorola format
3378    for an IEEE extended real.  */
3379 static void
3380 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3381                                const long *buf)
3382 {
3383   long intermed[3];
3384
3385   /* Motorola chips are assumed always to be big-endian.  Also, the
3386      padding in a Motorola extended real goes between the exponent and
3387      the mantissa; remove it.  */
3388   intermed[0] = buf[2];
3389   intermed[1] = buf[1];
3390   intermed[2] = (unsigned long)buf[0] >> 16;
3391
3392   decode_ieee_extended (fmt, r, intermed);
3393 }
3394
3395 /* Convert from the internal format to the 12-byte Intel format for
3396    an IEEE extended real.  */
3397 static void
3398 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3399                                const long *buf)
3400 {
3401   if (FLOAT_WORDS_BIG_ENDIAN)
3402     {
3403       /* All the padding in an Intel-format extended real goes at the high
3404          end, which in this case is after the mantissa, not the exponent.
3405          Therefore we must shift everything up 16 bits.  */
3406       long intermed[3];
3407
3408       intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3409       intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3410       intermed[2] =  ((unsigned long)buf[0] >> 16);
3411
3412       decode_ieee_extended (fmt, r, intermed);
3413     }
3414   else
3415     /* decode_ieee_extended produces what we want directly.  */
3416     decode_ieee_extended (fmt, r, buf);
3417 }
3418
3419 /* Convert from the internal format to the 16-byte Intel format for
3420    an IEEE extended real.  */
3421 static void
3422 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3423                                 const long *buf)
3424 {
3425   /* All the padding in an Intel-format extended real goes at the high end.  */
3426   decode_ieee_extended_intel_96 (fmt, r, buf);
3427 }
3428
3429 const struct real_format ieee_extended_motorola_format =
3430   {
3431     encode_ieee_extended_motorola,
3432     decode_ieee_extended_motorola,
3433     2,
3434     64,
3435     64,
3436     -16382,
3437     16384,
3438     95,
3439     95,
3440     true,
3441     true,
3442     true,
3443     true,
3444     true,
3445     true
3446   };
3447
3448 const struct real_format ieee_extended_intel_96_format =
3449   {
3450     encode_ieee_extended_intel_96,
3451     decode_ieee_extended_intel_96,
3452     2,
3453     64,
3454     64,
3455     -16381,
3456     16384,
3457     79,
3458     79,
3459     true,
3460     true,
3461     true,
3462     true,
3463     true,
3464     false
3465   };
3466
3467 const struct real_format ieee_extended_intel_128_format =
3468   {
3469     encode_ieee_extended_intel_128,
3470     decode_ieee_extended_intel_128,
3471     2,
3472     64,
3473     64,
3474     -16381,
3475     16384,
3476     79,
3477     79,
3478     true,
3479     true,
3480     true,
3481     true,
3482     true,
3483     false
3484   };
3485
3486 /* The following caters to i386 systems that set the rounding precision
3487    to 53 bits instead of 64, e.g. FreeBSD.  */
3488 const struct real_format ieee_extended_intel_96_round_53_format =
3489   {
3490     encode_ieee_extended_intel_96,
3491     decode_ieee_extended_intel_96,
3492     2,
3493     53,
3494     53,
3495     -16381,
3496     16384,
3497     79,
3498     79,
3499     true,
3500     true,
3501     true,
3502     true,
3503     true,
3504     false
3505   };
3506 \f
3507 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3508    numbers whose sum is equal to the extended precision value.  The number
3509    with greater magnitude is first.  This format has the same magnitude
3510    range as an IEEE double precision value, but effectively 106 bits of
3511    significand precision.  Infinity and NaN are represented by their IEEE
3512    double precision value stored in the first number, the second number is
3513    +0.0 or -0.0 for Infinity and don't-care for NaN.  */
3514
3515 static void encode_ibm_extended (const struct real_format *fmt,
3516                                  long *, const REAL_VALUE_TYPE *);
3517 static void decode_ibm_extended (const struct real_format *,
3518                                  REAL_VALUE_TYPE *, const long *);
3519
3520 static void
3521 encode_ibm_extended (const struct real_format *fmt, long *buf,
3522                      const REAL_VALUE_TYPE *r)
3523 {
3524   REAL_VALUE_TYPE u, normr, v;
3525   const struct real_format *base_fmt;
3526
3527   base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3528
3529   /* Renormalize R before doing any arithmetic on it.  */
3530   normr = *r;
3531   if (normr.cl == rvc_normal)
3532     normalize (&normr);
3533
3534   /* u = IEEE double precision portion of significand.  */
3535   u = normr;
3536   round_for_format (base_fmt, &u);
3537   encode_ieee_double (base_fmt, &buf[0], &u);
3538
3539   if (u.cl == rvc_normal)
3540     {
3541       do_add (&v, &normr, &u, 1);
3542       /* Call round_for_format since we might need to denormalize.  */
3543       round_for_format (base_fmt, &v);
3544       encode_ieee_double (base_fmt, &buf[2], &v);
3545     }
3546   else
3547     {
3548       /* Inf, NaN, 0 are all representable as doubles, so the
3549          least-significant part can be 0.0.  */
3550       buf[2] = 0;
3551       buf[3] = 0;
3552     }
3553 }
3554
3555 static void
3556 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3557                      const long *buf)
3558 {
3559   REAL_VALUE_TYPE u, v;
3560   const struct real_format *base_fmt;
3561
3562   base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3563   decode_ieee_double (base_fmt, &u, &buf[0]);
3564
3565   if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3566     {
3567       decode_ieee_double (base_fmt, &v, &buf[2]);
3568       do_add (r, &u, &v, 0);
3569     }
3570   else
3571     *r = u;
3572 }
3573
3574 const struct real_format ibm_extended_format =
3575   {
3576     encode_ibm_extended,
3577     decode_ibm_extended,
3578     2,
3579     53 + 53,
3580     53,
3581     -1021 + 53,
3582     1024,
3583     127,
3584     -1,
3585     true,
3586     true,
3587     true,
3588     true,
3589     true,
3590     false
3591   };
3592
3593 const struct real_format mips_extended_format =
3594   {
3595     encode_ibm_extended,
3596     decode_ibm_extended,
3597     2,
3598     53 + 53,
3599     53,
3600     -1021 + 53,
3601     1024,
3602     127,
3603     -1,
3604     true,
3605     true,
3606     true,
3607     true,
3608     false,
3609     true
3610   };
3611
3612 \f
3613 /* IEEE quad precision format.  */
3614
3615 static void encode_ieee_quad (const struct real_format *fmt,
3616                               long *, const REAL_VALUE_TYPE *);
3617 static void decode_ieee_quad (const struct real_format *,
3618                               REAL_VALUE_TYPE *, const long *);
3619
3620 static void
3621 encode_ieee_quad (const struct real_format *fmt, long *buf,
3622                   const REAL_VALUE_TYPE *r)
3623 {
3624   unsigned long image3, image2, image1, image0, exp;
3625   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3626   REAL_VALUE_TYPE u;
3627
3628   image3 = r->sign << 31;
3629   image2 = 0;
3630   image1 = 0;
3631   image0 = 0;
3632
3633   rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3634
3635   switch (r->cl)
3636     {
3637     case rvc_zero:
3638       break;
3639
3640     case rvc_inf:
3641       if (fmt->has_inf)
3642         image3 |= 32767 << 16;
3643       else
3644         {
3645           image3 |= 0x7fffffff;
3646           image2 = 0xffffffff;
3647           image1 = 0xffffffff;
3648           image0 = 0xffffffff;
3649         }
3650       break;
3651
3652     case rvc_nan:
3653       if (fmt->has_nans)
3654         {
3655           image3 |= 32767 << 16;
3656
3657           if (r->canonical)
3658             {
3659               if (fmt->canonical_nan_lsbs_set)
3660                 {
3661                   image3 |= 0x7fff;
3662                   image2 = image1 = image0 = 0xffffffff;
3663                 }
3664             }
3665           else if (HOST_BITS_PER_LONG == 32)
3666             {
3667               image0 = u.sig[0];
3668               image1 = u.sig[1];
3669               image2 = u.sig[2];
3670               image3 |= u.sig[3] & 0xffff;
3671             }
3672           else
3673             {
3674               image0 = u.sig[0];
3675               image1 = image0 >> 31 >> 1;
3676               image2 = u.sig[1];
3677               image3 |= (image2 >> 31 >> 1) & 0xffff;
3678               image0 &= 0xffffffff;
3679               image2 &= 0xffffffff;
3680             }
3681           if (r->signalling == fmt->qnan_msb_set)
3682             image3 &= ~0x8000;
3683           else
3684             image3 |= 0x8000;
3685           if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3686             image3 |= 0x4000;
3687         }
3688       else
3689         {
3690           image3 |= 0x7fffffff;
3691           image2 = 0xffffffff;
3692           image1 = 0xffffffff;
3693           image0 = 0xffffffff;
3694         }
3695       break;
3696
3697     case rvc_normal:
3698       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3699          whereas the intermediate representation is 0.F x 2**exp.
3700          Which means we're off by one.  */
3701       if (denormal)
3702         exp = 0;
3703       else
3704         exp = REAL_EXP (r) + 16383 - 1;
3705       image3 |= exp << 16;
3706
3707       if (HOST_BITS_PER_LONG == 32)
3708         {
3709           image0 = u.sig[0];
3710           image1 = u.sig[1];
3711           image2 = u.sig[2];
3712           image3 |= u.sig[3] & 0xffff;
3713         }
3714       else
3715         {
3716           image0 = u.sig[0];
3717           image1 = image0 >> 31 >> 1;
3718           image2 = u.sig[1];
3719           image3 |= (image2 >> 31 >> 1) & 0xffff;
3720           image0 &= 0xffffffff;
3721           image2 &= 0xffffffff;
3722         }
3723       break;
3724
3725     default:
3726       gcc_unreachable ();
3727     }
3728
3729   if (FLOAT_WORDS_BIG_ENDIAN)
3730     {
3731       buf[0] = image3;
3732       buf[1] = image2;
3733       buf[2] = image1;
3734       buf[3] = image0;
3735     }
3736   else
3737     {
3738       buf[0] = image0;
3739       buf[1] = image1;
3740       buf[2] = image2;
3741       buf[3] = image3;
3742     }
3743 }
3744
3745 static void
3746 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3747                   const long *buf)
3748 {
3749   unsigned long image3, image2, image1, image0;
3750   bool sign;
3751   int exp;
3752
3753   if (FLOAT_WORDS_BIG_ENDIAN)
3754     {
3755       image3 = buf[0];
3756       image2 = buf[1];
3757       image1 = buf[2];
3758       image0 = buf[3];
3759     }
3760   else
3761     {
3762       image0 = buf[0];
3763       image1 = buf[1];
3764       image2 = buf[2];
3765       image3 = buf[3];
3766     }
3767   image0 &= 0xffffffff;
3768   image1 &= 0xffffffff;
3769   image2 &= 0xffffffff;
3770
3771   sign = (image3 >> 31) & 1;
3772   exp = (image3 >> 16) & 0x7fff;
3773   image3 &= 0xffff;
3774
3775   memset (r, 0, sizeof (*r));
3776
3777   if (exp == 0)
3778     {
3779       if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
3780         {
3781           r->cl = rvc_normal;
3782           r->sign = sign;
3783
3784           SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
3785           if (HOST_BITS_PER_LONG == 32)
3786             {
3787               r->sig[0] = image0;
3788               r->sig[1] = image1;
3789               r->sig[2] = image2;
3790               r->sig[3] = image3;
3791             }
3792           else
3793             {
3794               r->sig[0] = (image1 << 31 << 1) | image0;
3795               r->sig[1] = (image3 << 31 << 1) | image2;
3796             }
3797
3798           normalize (r);
3799         }
3800       else if (fmt->has_signed_zero)
3801         r->sign = sign;
3802     }
3803   else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3804     {
3805       if (image3 | image2 | image1 | image0)
3806         {
3807           r->cl = rvc_nan;
3808           r->sign = sign;
3809           r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
3810
3811           if (HOST_BITS_PER_LONG == 32)
3812             {
3813               r->sig[0] = image0;
3814               r->sig[1] = image1;
3815               r->sig[2] = image2;
3816               r->sig[3] = image3;
3817             }
3818           else
3819             {
3820               r->sig[0] = (image1 << 31 << 1) | image0;
3821               r->sig[1] = (image3 << 31 << 1) | image2;
3822             }
3823           lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3824         }
3825       else
3826         {
3827           r->cl = rvc_inf;
3828           r->sign = sign;
3829         }
3830     }
3831   else
3832     {
3833       r->cl = rvc_normal;
3834       r->sign = sign;
3835       SET_REAL_EXP (r, exp - 16383 + 1);
3836
3837       if (HOST_BITS_PER_LONG == 32)
3838         {
3839           r->sig[0] = image0;
3840           r->sig[1] = image1;
3841           r->sig[2] = image2;
3842           r->sig[3] = image3;
3843         }
3844       else
3845         {
3846           r->sig[0] = (image1 << 31 << 1) | image0;
3847           r->sig[1] = (image3 << 31 << 1) | image2;
3848         }
3849       lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3850       r->sig[SIGSZ-1] |= SIG_MSB;
3851     }
3852 }
3853
3854 const struct real_format ieee_quad_format =
3855   {
3856     encode_ieee_quad,
3857     decode_ieee_quad,
3858     2,
3859     113,
3860     113,
3861     -16381,
3862     16384,
3863     127,
3864     127,
3865     true,
3866     true,
3867     true,
3868     true,
3869     true,
3870     false
3871   };
3872
3873 const struct real_format mips_quad_format =
3874   {
3875     encode_ieee_quad,
3876     decode_ieee_quad,
3877     2,
3878     113,
3879     113,
3880     -16381,
3881     16384,
3882     127,
3883     127,
3884     true,
3885     true,
3886     true,
3887     true,
3888     false,
3889     true
3890   };
3891 \f
3892 /* Descriptions of VAX floating point formats can be found beginning at
3893
3894    http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
3895
3896    The thing to remember is that they're almost IEEE, except for word
3897    order, exponent bias, and the lack of infinities, nans, and denormals.
3898
3899    We don't implement the H_floating format here, simply because neither
3900    the VAX or Alpha ports use it.  */
3901
3902 static void encode_vax_f (const struct real_format *fmt,
3903                           long *, const REAL_VALUE_TYPE *);
3904 static void decode_vax_f (const struct real_format *,
3905                           REAL_VALUE_TYPE *, const long *);
3906 static void encode_vax_d (const struct real_format *fmt,
3907                           long *, const REAL_VALUE_TYPE *);
3908 static void decode_vax_d (const struct real_format *,
3909                           REAL_VALUE_TYPE *, const long *);
3910 static void encode_vax_g (const struct real_format *fmt,
3911                           long *, const REAL_VALUE_TYPE *);
3912 static void decode_vax_g (const struct real_format *,
3913                           REAL_VALUE_TYPE *, const long *);
3914
3915 static void
3916 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3917               const REAL_VALUE_TYPE *r)
3918 {
3919   unsigned long sign, exp, sig, image;
3920
3921   sign = r->sign << 15;
3922
3923   switch (r->cl)
3924     {
3925     case rvc_zero:
3926       image = 0;
3927       break;
3928
3929     case rvc_inf:
3930     case rvc_nan:
3931       image = 0xffff7fff | sign;
3932       break;
3933
3934     case rvc_normal:
3935       sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
3936       exp = REAL_EXP (r) + 128;
3937
3938       image = (sig << 16) & 0xffff0000;
3939       image |= sign;
3940       image |= exp << 7;
3941       image |= sig >> 16;
3942       break;
3943
3944     default:
3945       gcc_unreachable ();
3946     }
3947
3948   buf[0] = image;
3949 }
3950
3951 static void
3952 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
3953               REAL_VALUE_TYPE *r, const long *buf)
3954 {
3955   unsigned long image = buf[0] & 0xffffffff;
3956   int exp = (image >> 7) & 0xff;
3957
3958   memset (r, 0, sizeof (*r));
3959
3960   if (exp != 0)
3961     {
3962       r->cl = rvc_normal;
3963       r->sign = (image >> 15) & 1;
3964       SET_REAL_EXP (r, exp - 128);
3965
3966       image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
3967       r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
3968     }
3969 }
3970
3971 static void
3972 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3973               const REAL_VALUE_TYPE *r)
3974 {
3975   unsigned long image0, image1, sign = r->sign << 15;
3976
3977   switch (r->cl)
3978     {
3979     case rvc_zero:
3980       image0 = image1 = 0;
3981       break;
3982
3983     case rvc_inf:
3984     case rvc_nan:
3985       image0 = 0xffff7fff | sign;
3986       image1 = 0xffffffff;
3987       break;
3988
3989     case rvc_normal:
3990       /* Extract the significand into straight hi:lo.  */
3991       if (HOST_BITS_PER_LONG == 64)
3992         {
3993           image0 = r->sig[SIGSZ-1];
3994           image1 = (image0 >> (64 - 56)) & 0xffffffff;
3995           image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
3996         }
3997       else
3998         {
3999           image0 = r->sig[SIGSZ-1];
4000           image1 = r->sig[SIGSZ-2];
4001           image1 = (image0 << 24) | (image1 >> 8);
4002           image0 = (image0 >> 8) & 0xffffff;
4003         }
4004
4005       /* Rearrange the half-words of the significand to match the
4006          external format.  */
4007       image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
4008       image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4009
4010       /* Add the sign and exponent.  */
4011       image0 |= sign;
4012       image0 |= (REAL_EXP (r) + 128) << 7;
4013       break;
4014
4015     default:
4016       gcc_unreachable ();
4017     }
4018
4019   if (FLOAT_WORDS_BIG_ENDIAN)
4020     buf[0] = image1, buf[1] = image0;
4021   else
4022     buf[0] = image0, buf[1] = image1;
4023 }
4024
4025 static void
4026 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
4027               REAL_VALUE_TYPE *r, const long *buf)
4028 {
4029   unsigned long image0, image1;
4030   int exp;
4031
4032   if (FLOAT_WORDS_BIG_ENDIAN)
4033     image1 = buf[0], image0 = buf[1];
4034   else
4035     image0 = buf[0], image1 = buf[1];
4036   image0 &= 0xffffffff;
4037   image1 &= 0xffffffff;
4038
4039   exp = (image0 >> 7) & 0xff;
4040
4041   memset (r, 0, sizeof (*r));
4042
4043   if (exp != 0)
4044     {
4045       r->cl = rvc_normal;
4046       r->sign = (image0 >> 15) & 1;
4047       SET_REAL_EXP (r, exp - 128);
4048
4049       /* Rearrange the half-words of the external format into
4050          proper ascending order.  */
4051       image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
4052       image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4053
4054       if (HOST_BITS_PER_LONG == 64)
4055         {
4056           image0 = (image0 << 31 << 1) | image1;
4057           image0 <<= 64 - 56;
4058           image0 |= SIG_MSB;
4059           r->sig[SIGSZ-1] = image0;
4060         }
4061       else
4062         {
4063           r->sig[SIGSZ-1] = image0;
4064           r->sig[SIGSZ-2] = image1;
4065           lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
4066           r->sig[SIGSZ-1] |= SIG_MSB;
4067         }
4068     }
4069 }
4070
4071 static void
4072 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4073               const REAL_VALUE_TYPE *r)
4074 {
4075   unsigned long image0, image1, sign = r->sign << 15;
4076
4077   switch (r->cl)
4078     {
4079     case rvc_zero:
4080       image0 = image1 = 0;
4081       break;
4082
4083     case rvc_inf:
4084     case rvc_nan:
4085       image0 = 0xffff7fff | sign;
4086       image1 = 0xffffffff;
4087       break;
4088
4089     case rvc_normal:
4090       /* Extract the significand into straight hi:lo.  */
4091       if (HOST_BITS_PER_LONG == 64)
4092         {
4093           image0 = r->sig[SIGSZ-1];
4094           image1 = (image0 >> (64 - 53)) & 0xffffffff;
4095           image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
4096         }
4097       else
4098         {
4099           image0 = r->sig[SIGSZ-1];
4100           image1 = r->sig[SIGSZ-2];
4101           image1 = (image0 << 21) | (image1 >> 11);
4102           image0 = (image0 >> 11) & 0xfffff;
4103         }
4104
4105       /* Rearrange the half-words of the significand to match the
4106          external format.  */
4107       image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
4108       image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4109
4110       /* Add the sign and exponent.  */
4111       image0 |= sign;
4112       image0 |= (REAL_EXP (r) + 1024) << 4;
4113       break;
4114
4115     default:
4116       gcc_unreachable ();
4117     }
4118
4119   if (FLOAT_WORDS_BIG_ENDIAN)
4120     buf[0] = image1, buf[1] = image0;
4121   else
4122     buf[0] = image0, buf[1] = image1;
4123 }
4124
4125 static void
4126 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
4127               REAL_VALUE_TYPE *r, const long *buf)
4128 {
4129   unsigned long image0, image1;
4130   int exp;
4131
4132   if (FLOAT_WORDS_BIG_ENDIAN)
4133     image1 = buf[0], image0 = buf[1];
4134   else
4135     image0 = buf[0], image1 = buf[1];
4136   image0 &= 0xffffffff;
4137   image1 &= 0xffffffff;
4138
4139   exp = (image0 >> 4) & 0x7ff;
4140
4141   memset (r, 0, sizeof (*r));
4142
4143   if (exp != 0)
4144     {
4145       r->cl = rvc_normal;
4146       r->sign = (image0 >> 15) & 1;
4147       SET_REAL_EXP (r, exp - 1024);
4148
4149       /* Rearrange the half-words of the external format into
4150          proper ascending order.  */
4151       image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
4152       image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4153
4154       if (HOST_BITS_PER_LONG == 64)
4155         {
4156           image0 = (image0 << 31 << 1) | image1;
4157           image0 <<= 64 - 53;
4158           image0 |= SIG_MSB;
4159           r->sig[SIGSZ-1] = image0;
4160         }
4161       else
4162         {
4163           r->sig[SIGSZ-1] = image0;
4164           r->sig[SIGSZ-2] = image1;
4165           lshift_significand (r, r, 64 - 53);
4166           r->sig[SIGSZ-1] |= SIG_MSB;
4167         }
4168     }
4169 }
4170
4171 const struct real_format vax_f_format =
4172   {
4173     encode_vax_f,
4174     decode_vax_f,
4175     2,
4176     24,
4177     24,
4178     -127,
4179     127,
4180     15,
4181     15,
4182     false,
4183     false,
4184     false,
4185     false,
4186     false,
4187     false
4188   };
4189
4190 const struct real_format vax_d_format =
4191   {
4192     encode_vax_d,
4193     decode_vax_d,
4194     2,
4195     56,
4196     56,
4197     -127,
4198     127,
4199     15,
4200     15,
4201     false,
4202     false,
4203     false,
4204     false,
4205     false,
4206     false
4207   };
4208
4209 const struct real_format vax_g_format =
4210   {
4211     encode_vax_g,
4212     decode_vax_g,
4213     2,
4214     53,
4215     53,
4216     -1023,
4217     1023,
4218     15,
4219     15,
4220     false,
4221     false,
4222     false,
4223     false,
4224     false,
4225     false
4226   };
4227 \f
4228 /* Encode real R into a single precision DFP value in BUF.  */
4229 static void
4230 encode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4231                        long *buf ATTRIBUTE_UNUSED, 
4232                        const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4233 {
4234   encode_decimal32 (fmt, buf, r);
4235 }
4236
4237 /* Decode a single precision DFP value in BUF into a real R.  */
4238 static void 
4239 decode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4240                        REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED, 
4241                        const long *buf ATTRIBUTE_UNUSED)
4242 {
4243   decode_decimal32 (fmt, r, buf);
4244 }
4245
4246 /* Encode real R into a double precision DFP value in BUF.  */
4247 static void 
4248 encode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4249                        long *buf ATTRIBUTE_UNUSED, 
4250                        const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4251 {
4252   encode_decimal64 (fmt, buf, r);
4253 }
4254
4255 /* Decode a double precision DFP value in BUF into a real R.  */
4256 static void 
4257 decode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4258                        REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED, 
4259                        const long *buf ATTRIBUTE_UNUSED)
4260 {
4261   decode_decimal64 (fmt, r, buf);
4262 }
4263
4264 /* Encode real R into a quad precision DFP value in BUF.  */
4265 static void 
4266 encode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4267                      long *buf ATTRIBUTE_UNUSED,
4268                      const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4269 {
4270   encode_decimal128 (fmt, buf, r);
4271 }
4272
4273 /* Decode a quad precision DFP value in BUF into a real R.  */
4274 static void 
4275 decode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4276                      REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4277                      const long *buf ATTRIBUTE_UNUSED)
4278 {
4279   decode_decimal128 (fmt, r, buf);
4280 }
4281
4282 /* Single precision decimal floating point (IEEE 754). */
4283 const struct real_format decimal_single_format =
4284   {
4285     encode_decimal_single,
4286     decode_decimal_single,
4287     10, 
4288     7,
4289     7,
4290     -95,
4291     96,
4292     31,
4293     31,
4294     true,
4295     true,
4296     true,
4297     true, 
4298     true,
4299     false
4300   };
4301
4302 /* Double precision decimal floating point (IEEE 754). */
4303 const struct real_format decimal_double_format =
4304   {
4305     encode_decimal_double,
4306     decode_decimal_double,
4307     10,
4308     16,
4309     16,
4310     -383,
4311     384,
4312     63,
4313     63,
4314     true,
4315     true,
4316     true,
4317     true,
4318     true,
4319     false
4320   };
4321
4322 /* Quad precision decimal floating point (IEEE 754). */
4323 const struct real_format decimal_quad_format =
4324   {
4325     encode_decimal_quad,
4326     decode_decimal_quad,
4327     10,
4328     34,
4329     34,
4330     -6143,
4331     6144,
4332     127,
4333     127,
4334     true,
4335     true,
4336     true, 
4337     true, 
4338     true,
4339     false
4340   };
4341 \f
4342 /* A synthetic "format" for internal arithmetic.  It's the size of the
4343    internal significand minus the two bits needed for proper rounding.
4344    The encode and decode routines exist only to satisfy our paranoia
4345    harness.  */
4346
4347 static void encode_internal (const struct real_format *fmt,
4348                              long *, const REAL_VALUE_TYPE *);
4349 static void decode_internal (const struct real_format *,
4350                              REAL_VALUE_TYPE *, const long *);
4351
4352 static void
4353 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4354                  const REAL_VALUE_TYPE *r)
4355 {
4356   memcpy (buf, r, sizeof (*r));
4357 }
4358
4359 static void
4360 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4361                  REAL_VALUE_TYPE *r, const long *buf)
4362 {
4363   memcpy (r, buf, sizeof (*r));
4364 }
4365
4366 const struct real_format real_internal_format =
4367   {
4368     encode_internal,
4369     decode_internal,
4370     2,
4371     SIGNIFICAND_BITS - 2,
4372     SIGNIFICAND_BITS - 2,
4373     -MAX_EXP,
4374     MAX_EXP,
4375     -1,
4376     -1,
4377     true,
4378     true,
4379     false,
4380     true,
4381     true,
4382     false
4383   };
4384 \f
4385 /* Calculate the square root of X in mode MODE, and store the result
4386    in R.  Return TRUE if the operation does not raise an exception.
4387    For details see "High Precision Division and Square Root",
4388    Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June
4389    1993.  http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf.  */
4390
4391 bool
4392 real_sqrt (REAL_VALUE_TYPE *r, enum machine_mode mode,
4393            const REAL_VALUE_TYPE *x)
4394 {
4395   static REAL_VALUE_TYPE halfthree;
4396   static bool init = false;
4397   REAL_VALUE_TYPE h, t, i;
4398   int iter, exp;
4399
4400   /* sqrt(-0.0) is -0.0.  */
4401   if (real_isnegzero (x))
4402     {
4403       *r = *x;
4404       return false;
4405     }
4406
4407   /* Negative arguments return NaN.  */
4408   if (real_isneg (x))
4409     {
4410       get_canonical_qnan (r, 0);
4411       return false;
4412     }
4413
4414   /* Infinity and NaN return themselves.  */
4415   if (!real_isfinite (x))
4416     {
4417       *r = *x;
4418       return false;
4419     }
4420
4421   if (!init)
4422     {
4423       do_add (&halfthree, &dconst1, &dconsthalf, 0);
4424       init = true;
4425     }
4426
4427   /* Initial guess for reciprocal sqrt, i.  */
4428   exp = real_exponent (x);
4429   real_ldexp (&i, &dconst1, -exp/2);
4430
4431   /* Newton's iteration for reciprocal sqrt, i.  */
4432   for (iter = 0; iter < 16; iter++)
4433     {
4434       /* i(n+1) = i(n) * (1.5 - 0.5*i(n)*i(n)*x).  */
4435       do_multiply (&t, x, &i);
4436       do_multiply (&h, &t, &i);
4437       do_multiply (&t, &h, &dconsthalf);
4438       do_add (&h, &halfthree, &t, 1);
4439       do_multiply (&t, &i, &h);
4440
4441       /* Check for early convergence.  */
4442       if (iter >= 6 && real_identical (&i, &t))
4443         break;
4444
4445       /* ??? Unroll loop to avoid copying.  */
4446       i = t;
4447     }
4448
4449   /* Final iteration: r = i*x + 0.5*i*x*(1.0 - i*(i*x)).  */
4450   do_multiply (&t, x, &i);
4451   do_multiply (&h, &t, &i);
4452   do_add (&i, &dconst1, &h, 1);
4453   do_multiply (&h, &t, &i);
4454   do_multiply (&i, &dconsthalf, &h);
4455   do_add (&h, &t, &i, 0);
4456
4457   /* ??? We need a Tuckerman test to get the last bit.  */
4458
4459   real_convert (r, mode, &h);
4460   return true;
4461 }
4462
4463 /* Calculate X raised to the integer exponent N in mode MODE and store
4464    the result in R.  Return true if the result may be inexact due to
4465    loss of precision.  The algorithm is the classic "left-to-right binary
4466    method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4467    Algorithms", "The Art of Computer Programming", Volume 2.  */
4468
4469 bool
4470 real_powi (REAL_VALUE_TYPE *r, enum machine_mode mode,
4471            const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4472 {
4473   unsigned HOST_WIDE_INT bit;
4474   REAL_VALUE_TYPE t;
4475   bool inexact = false;
4476   bool init = false;
4477   bool neg;
4478   int i;
4479
4480   if (n == 0)
4481     {
4482       *r = dconst1;
4483       return false;
4484     }
4485   else if (n < 0)
4486     {
4487       /* Don't worry about overflow, from now on n is unsigned.  */
4488       neg = true;
4489       n = -n;
4490     }
4491   else
4492     neg = false;
4493
4494   t = *x;
4495   bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4496   for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4497     {
4498       if (init)
4499         {
4500           inexact |= do_multiply (&t, &t, &t);
4501           if (n & bit)
4502             inexact |= do_multiply (&t, &t, x);
4503         }
4504       else if (n & bit)
4505         init = true;
4506       bit >>= 1;
4507     }
4508
4509   if (neg)
4510     inexact |= do_divide (&t, &dconst1, &t);
4511
4512   real_convert (r, mode, &t);
4513   return inexact;
4514 }
4515
4516 /* Round X to the nearest integer not larger in absolute value, i.e.
4517    towards zero, placing the result in R in mode MODE.  */
4518
4519 void
4520 real_trunc (REAL_VALUE_TYPE *r, enum machine_mode mode,
4521             const REAL_VALUE_TYPE *x)
4522 {
4523   do_fix_trunc (r, x);
4524   if (mode != VOIDmode)
4525     real_convert (r, mode, r);
4526 }
4527
4528 /* Round X to the largest integer not greater in value, i.e. round
4529    down, placing the result in R in mode MODE.  */
4530
4531 void
4532 real_floor (REAL_VALUE_TYPE *r, enum machine_mode mode,
4533             const REAL_VALUE_TYPE *x)
4534 {
4535   REAL_VALUE_TYPE t;
4536
4537   do_fix_trunc (&t, x);
4538   if (! real_identical (&t, x) && x->sign)
4539     do_add (&t, &t, &dconstm1, 0);
4540   if (mode != VOIDmode)
4541     real_convert (r, mode, &t);
4542   else
4543     *r = t;
4544 }
4545
4546 /* Round X to the smallest integer not less then argument, i.e. round
4547    up, placing the result in R in mode MODE.  */
4548
4549 void
4550 real_ceil (REAL_VALUE_TYPE *r, enum machine_mode mode,
4551            const REAL_VALUE_TYPE *x)
4552 {
4553   REAL_VALUE_TYPE t;
4554
4555   do_fix_trunc (&t, x);
4556   if (! real_identical (&t, x) && ! x->sign)
4557     do_add (&t, &t, &dconst1, 0);
4558   if (mode != VOIDmode)
4559     real_convert (r, mode, &t);
4560   else
4561     *r = t;
4562 }
4563
4564 /* Round X to the nearest integer, but round halfway cases away from
4565    zero.  */
4566
4567 void
4568 real_round (REAL_VALUE_TYPE *r, enum machine_mode mode,
4569             const REAL_VALUE_TYPE *x)
4570 {
4571   do_add (r, x, &dconsthalf, x->sign);
4572   do_fix_trunc (r, r);
4573   if (mode != VOIDmode)
4574     real_convert (r, mode, r);
4575 }
4576
4577 /* Set the sign of R to the sign of X.  */
4578
4579 void
4580 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
4581 {
4582   r->sign = x->sign;
4583 }
4584
4585 /* Convert from REAL_VALUE_TYPE to MPFR.  The caller is responsible
4586    for initializing and clearing the MPFR parameter.  */
4587
4588 void
4589 mpfr_from_real (mpfr_ptr m, const REAL_VALUE_TYPE *r, mp_rnd_t rndmode)
4590 {
4591   /* We use a string as an intermediate type.  */
4592   char buf[128];
4593   int ret;
4594
4595   /* Take care of Infinity and NaN.  */
4596   if (r->cl == rvc_inf)
4597     {
4598       mpfr_set_inf (m, r->sign == 1 ? -1 : 1);
4599       return;
4600     }
4601   
4602   if (r->cl == rvc_nan)
4603     {
4604       mpfr_set_nan (m);
4605       return;
4606     }
4607   
4608   real_to_hexadecimal (buf, r, sizeof (buf), 0, 1);
4609   /* mpfr_set_str() parses hexadecimal floats from strings in the same
4610      format that GCC will output them.  Nothing extra is needed.  */
4611   ret = mpfr_set_str (m, buf, 16, rndmode);
4612   gcc_assert (ret == 0);
4613 }
4614
4615 /* Convert from MPFR to REAL_VALUE_TYPE, for a given type TYPE and rounding
4616    mode RNDMODE.  TYPE is only relevant if M is a NaN.  */
4617
4618 void
4619 real_from_mpfr (REAL_VALUE_TYPE *r, mpfr_srcptr m, tree type, mp_rnd_t rndmode)
4620 {
4621   /* We use a string as an intermediate type.  */
4622   char buf[128], *rstr;
4623   mp_exp_t exp;
4624
4625   /* Take care of Infinity and NaN.  */
4626   if (mpfr_inf_p (m))
4627     {
4628       real_inf (r);
4629       if (mpfr_sgn (m) < 0)
4630         *r = REAL_VALUE_NEGATE (*r);
4631       return;
4632     }
4633
4634   if (mpfr_nan_p (m))
4635     {
4636       real_nan (r, "", 1, TYPE_MODE (type));
4637       return;
4638     }
4639
4640   rstr = mpfr_get_str (NULL, &exp, 16, 0, m, rndmode);
4641
4642   /* The additional 12 chars add space for the sprintf below.  This
4643      leaves 6 digits for the exponent which is supposedly enough.  */
4644   gcc_assert (rstr != NULL && strlen (rstr) < sizeof (buf) - 12);
4645
4646   /* REAL_VALUE_ATOF expects the exponent for mantissa * 2**exp,
4647      mpfr_get_str returns the exponent for mantissa * 16**exp, adjust
4648      for that.  */
4649   exp *= 4;
4650
4651   if (rstr[0] == '-')
4652     sprintf (buf, "-0x.%sp%d", &rstr[1], (int) exp);
4653   else
4654     sprintf (buf, "0x.%sp%d", rstr, (int) exp);
4655
4656   mpfr_free_str (rstr);
4657   
4658   real_from_string (r, buf);
4659 }
4660
4661 /* Check whether the real constant value given is an integer.  */
4662
4663 bool
4664 real_isinteger (const REAL_VALUE_TYPE *c, enum machine_mode mode)
4665 {
4666   REAL_VALUE_TYPE cint;
4667
4668   real_trunc (&cint, mode, c);
4669   return real_identical (c, &cint);
4670 }
4671
4672 /* Write into BUF the maximum representable finite floating-point
4673    number, (1 - b**-p) * b**emax for a given FP format FMT as a hex
4674    float string.  LEN is the size of BUF, and the buffer must be large
4675    enough to contain the resulting string.  */
4676
4677 void
4678 get_max_float (const struct real_format *fmt, char *buf, size_t len)
4679 {
4680   int i, n;
4681   char *p;
4682
4683   strcpy (buf, "0x0.");
4684   n = fmt->p;
4685   for (i = 0, p = buf + 4; i + 3 < n; i += 4)
4686     *p++ = 'f';
4687   if (i < n)
4688     *p++ = "08ce"[n - i];
4689   sprintf (p, "p%d", fmt->emax);
4690   if (fmt->pnan < fmt->p)
4691     {
4692       /* This is an IBM extended double format made up of two IEEE
4693          doubles.  The value of the long double is the sum of the
4694          values of the two parts.  The most significant part is
4695          required to be the value of the long double rounded to the
4696          nearest double.  Rounding means we need a slightly smaller
4697          value for LDBL_MAX.  */
4698       buf[4 + fmt->pnan / 4] = "7bde"[fmt->pnan % 4];
4699     }
4700
4701   gcc_assert (strlen (buf) < len);
4702 }