OSDN Git Service

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