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