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