OSDN Git Service

2005-12-16 Paolo Bonzini <bonzini@gnu.org>
[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.  */
1795
1796 void
1797 real_from_string (REAL_VALUE_TYPE *r, const char *str)
1798 {
1799   int exp = 0;
1800   bool sign = false;
1801
1802   get_zero (r, 0);
1803
1804   if (*str == '-')
1805     {
1806       sign = true;
1807       str++;
1808     }
1809   else if (*str == '+')
1810     str++;
1811
1812   if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1813     {
1814       /* Hexadecimal floating point.  */
1815       int pos = SIGNIFICAND_BITS - 4, d;
1816
1817       str += 2;
1818
1819       while (*str == '0')
1820         str++;
1821       while (1)
1822         {
1823           d = hex_value (*str);
1824           if (d == _hex_bad)
1825             break;
1826           if (pos >= 0)
1827             {
1828               r->sig[pos / HOST_BITS_PER_LONG]
1829                 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1830               pos -= 4;
1831             }
1832           else if (d)
1833             /* Ensure correct rounding by setting last bit if there is
1834                a subsequent nonzero digit.  */
1835             r->sig[0] |= 1;
1836           exp += 4;
1837           str++;
1838         }
1839       if (*str == '.')
1840         {
1841           str++;
1842           if (pos == SIGNIFICAND_BITS - 4)
1843             {
1844               while (*str == '0')
1845                 str++, exp -= 4;
1846             }
1847           while (1)
1848             {
1849               d = hex_value (*str);
1850               if (d == _hex_bad)
1851                 break;
1852               if (pos >= 0)
1853                 {
1854                   r->sig[pos / HOST_BITS_PER_LONG]
1855                     |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1856                   pos -= 4;
1857                 }
1858               else if (d)
1859                 /* Ensure correct rounding by setting last bit if there is
1860                    a subsequent nonzero digit.  */
1861                 r->sig[0] |= 1;
1862               str++;
1863             }
1864         }
1865       if (*str == 'p' || *str == 'P')
1866         {
1867           bool exp_neg = false;
1868
1869           str++;
1870           if (*str == '-')
1871             {
1872               exp_neg = true;
1873               str++;
1874             }
1875           else if (*str == '+')
1876             str++;
1877
1878           d = 0;
1879           while (ISDIGIT (*str))
1880             {
1881               d *= 10;
1882               d += *str - '0';
1883               if (d > MAX_EXP)
1884                 {
1885                   /* Overflowed the exponent.  */
1886                   if (exp_neg)
1887                     goto underflow;
1888                   else
1889                     goto overflow;
1890                 }
1891               str++;
1892             }
1893           if (exp_neg)
1894             d = -d;
1895
1896           exp += d;
1897         }
1898
1899       r->cl = rvc_normal;
1900       SET_REAL_EXP (r, exp);
1901
1902       normalize (r);
1903     }
1904   else
1905     {
1906       /* Decimal floating point.  */
1907       const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
1908       int d;
1909
1910       while (*str == '0')
1911         str++;
1912       while (ISDIGIT (*str))
1913         {
1914           d = *str++ - '0';
1915           do_multiply (r, r, ten);
1916           if (d)
1917             do_add (r, r, real_digit (d), 0);
1918         }
1919       if (*str == '.')
1920         {
1921           str++;
1922           if (r->cl == rvc_zero)
1923             {
1924               while (*str == '0')
1925                 str++, exp--;
1926             }
1927           while (ISDIGIT (*str))
1928             {
1929               d = *str++ - '0';
1930               do_multiply (r, r, ten);
1931               if (d)
1932                 do_add (r, r, real_digit (d), 0);
1933               exp--;
1934             }
1935         }
1936
1937       if (*str == 'e' || *str == 'E')
1938         {
1939           bool exp_neg = false;
1940
1941           str++;
1942           if (*str == '-')
1943             {
1944               exp_neg = true;
1945               str++;
1946             }
1947           else if (*str == '+')
1948             str++;
1949
1950           d = 0;
1951           while (ISDIGIT (*str))
1952             {
1953               d *= 10;
1954               d += *str - '0';
1955               if (d > MAX_EXP)
1956                 {
1957                   /* Overflowed the exponent.  */
1958                   if (exp_neg)
1959                     goto underflow;
1960                   else
1961                     goto overflow;
1962                 }
1963               str++;
1964             }
1965           if (exp_neg)
1966             d = -d;
1967           exp += d;
1968         }
1969
1970       if (exp)
1971         times_pten (r, exp);
1972     }
1973
1974   r->sign = sign;
1975   return;
1976
1977  underflow:
1978   get_zero (r, sign);
1979   return;
1980
1981  overflow:
1982   get_inf (r, sign);
1983   return;
1984 }
1985
1986 /* Legacy.  Similar, but return the result directly.  */
1987
1988 REAL_VALUE_TYPE
1989 real_from_string2 (const char *s, enum machine_mode mode)
1990 {
1991   REAL_VALUE_TYPE r;
1992
1993   real_from_string (&r, s);
1994   if (mode != VOIDmode)
1995     real_convert (&r, mode, &r);
1996
1997   return r;
1998 }
1999
2000 /* Initialize R from string S and desired MODE. */
2001
2002 void 
2003 real_from_string3 (REAL_VALUE_TYPE *r, const char *s, enum machine_mode mode)
2004 {
2005   if (DECIMAL_FLOAT_MODE_P (mode))
2006     decimal_real_from_string (r, s);
2007   else
2008     real_from_string (r, s);
2009
2010   if (mode != VOIDmode)
2011     real_convert (r, mode, r);  
2012
2013
2014 /* Initialize R from the integer pair HIGH+LOW.  */
2015
2016 void
2017 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
2018                    unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
2019                    int unsigned_p)
2020 {
2021   if (low == 0 && high == 0)
2022     get_zero (r, 0);
2023   else
2024     {
2025       memset (r, 0, sizeof (*r));
2026       r->cl = rvc_normal;
2027       r->sign = high < 0 && !unsigned_p;
2028       SET_REAL_EXP (r, 2 * HOST_BITS_PER_WIDE_INT);
2029
2030       if (r->sign)
2031         {
2032           high = ~high;
2033           if (low == 0)
2034             high += 1;
2035           else
2036             low = -low;
2037         }
2038
2039       if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
2040         {
2041           r->sig[SIGSZ-1] = high;
2042           r->sig[SIGSZ-2] = low;
2043         }
2044       else
2045         {
2046           gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
2047           r->sig[SIGSZ-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
2048           r->sig[SIGSZ-2] = high;
2049           r->sig[SIGSZ-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
2050           r->sig[SIGSZ-4] = low;
2051         }
2052
2053       normalize (r);
2054     }
2055
2056   if (mode != VOIDmode)
2057     real_convert (r, mode, r);
2058 }
2059
2060 /* Returns 10**2**N.  */
2061
2062 static const REAL_VALUE_TYPE *
2063 ten_to_ptwo (int n)
2064 {
2065   static REAL_VALUE_TYPE tens[EXP_BITS];
2066
2067   gcc_assert (n >= 0);
2068   gcc_assert (n < EXP_BITS);
2069
2070   if (tens[n].cl == rvc_zero)
2071     {
2072       if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2073         {
2074           HOST_WIDE_INT t = 10;
2075           int i;
2076
2077           for (i = 0; i < n; ++i)
2078             t *= t;
2079
2080           real_from_integer (&tens[n], VOIDmode, t, 0, 1);
2081         }
2082       else
2083         {
2084           const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2085           do_multiply (&tens[n], t, t);
2086         }
2087     }
2088
2089   return &tens[n];
2090 }
2091
2092 /* Returns 10**(-2**N).  */
2093
2094 static const REAL_VALUE_TYPE *
2095 ten_to_mptwo (int n)
2096 {
2097   static REAL_VALUE_TYPE tens[EXP_BITS];
2098
2099   gcc_assert (n >= 0);
2100   gcc_assert (n < EXP_BITS);
2101
2102   if (tens[n].cl == rvc_zero)
2103     do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2104
2105   return &tens[n];
2106 }
2107
2108 /* Returns N.  */
2109
2110 static const REAL_VALUE_TYPE *
2111 real_digit (int n)
2112 {
2113   static REAL_VALUE_TYPE num[10];
2114
2115   gcc_assert (n >= 0);
2116   gcc_assert (n <= 9);
2117
2118   if (n > 0 && num[n].cl == rvc_zero)
2119     real_from_integer (&num[n], VOIDmode, n, 0, 1);
2120
2121   return &num[n];
2122 }
2123
2124 /* Multiply R by 10**EXP.  */
2125
2126 static void
2127 times_pten (REAL_VALUE_TYPE *r, int exp)
2128 {
2129   REAL_VALUE_TYPE pten, *rr;
2130   bool negative = (exp < 0);
2131   int i;
2132
2133   if (negative)
2134     {
2135       exp = -exp;
2136       pten = *real_digit (1);
2137       rr = &pten;
2138     }
2139   else
2140     rr = r;
2141
2142   for (i = 0; exp > 0; ++i, exp >>= 1)
2143     if (exp & 1)
2144       do_multiply (rr, rr, ten_to_ptwo (i));
2145
2146   if (negative)
2147     do_divide (r, r, &pten);
2148 }
2149
2150 /* Fills R with +Inf.  */
2151
2152 void
2153 real_inf (REAL_VALUE_TYPE *r)
2154 {
2155   get_inf (r, 0);
2156 }
2157
2158 /* Fills R with a NaN whose significand is described by STR.  If QUIET,
2159    we force a QNaN, else we force an SNaN.  The string, if not empty,
2160    is parsed as a number and placed in the significand.  Return true
2161    if the string was successfully parsed.  */
2162
2163 bool
2164 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2165           enum machine_mode mode)
2166 {
2167   const struct real_format *fmt;
2168
2169   fmt = REAL_MODE_FORMAT (mode);
2170   gcc_assert (fmt);
2171
2172   if (*str == 0)
2173     {
2174       if (quiet)
2175         get_canonical_qnan (r, 0);
2176       else
2177         get_canonical_snan (r, 0);
2178     }
2179   else
2180     {
2181       int base = 10, d;
2182
2183       memset (r, 0, sizeof (*r));
2184       r->cl = rvc_nan;
2185
2186       /* Parse akin to strtol into the significand of R.  */
2187
2188       while (ISSPACE (*str))
2189         str++;
2190       if (*str == '-')
2191         str++;
2192       else if (*str == '+')
2193         str++;
2194       if (*str == '0')
2195         {
2196           if (*++str == 'x')
2197             str++, base = 16;
2198           else
2199             base = 8;
2200         }
2201
2202       while ((d = hex_value (*str)) < base)
2203         {
2204           REAL_VALUE_TYPE u;
2205
2206           switch (base)
2207             {
2208             case 8:
2209               lshift_significand (r, r, 3);
2210               break;
2211             case 16:
2212               lshift_significand (r, r, 4);
2213               break;
2214             case 10:
2215               lshift_significand_1 (&u, r);
2216               lshift_significand (r, r, 3);
2217               add_significands (r, r, &u);
2218               break;
2219             default:
2220               gcc_unreachable ();
2221             }
2222
2223           get_zero (&u, 0);
2224           u.sig[0] = d;
2225           add_significands (r, r, &u);
2226
2227           str++;
2228         }
2229
2230       /* Must have consumed the entire string for success.  */
2231       if (*str != 0)
2232         return false;
2233
2234       /* Shift the significand into place such that the bits
2235          are in the most significant bits for the format.  */
2236       lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
2237
2238       /* Our MSB is always unset for NaNs.  */
2239       r->sig[SIGSZ-1] &= ~SIG_MSB;
2240
2241       /* Force quiet or signalling NaN.  */
2242       r->signalling = !quiet;
2243     }
2244
2245   return true;
2246 }
2247
2248 /* Fills R with the largest finite value representable in mode MODE.
2249    If SIGN is nonzero, R is set to the most negative finite value.  */
2250
2251 void
2252 real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
2253 {
2254   const struct real_format *fmt;
2255   int np2;
2256
2257   fmt = REAL_MODE_FORMAT (mode);
2258   gcc_assert (fmt);
2259   memset (r, 0, sizeof (*r));
2260   
2261   if (fmt->b == 10)
2262     decimal_real_maxval (r, sign, mode);
2263   else
2264     {
2265       r->cl = rvc_normal;
2266       r->sign = sign;
2267       SET_REAL_EXP (r, fmt->emax * fmt->log2_b);
2268
2269       np2 = SIGNIFICAND_BITS - fmt->p * fmt->log2_b;
2270       memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
2271       clear_significand_below (r, np2);
2272     }
2273 }
2274
2275 /* Fills R with 2**N.  */
2276
2277 void
2278 real_2expN (REAL_VALUE_TYPE *r, int n)
2279 {
2280   memset (r, 0, sizeof (*r));
2281
2282   n++;
2283   if (n > MAX_EXP)
2284     r->cl = rvc_inf;
2285   else if (n < -MAX_EXP)
2286     ;
2287   else
2288     {
2289       r->cl = rvc_normal;
2290       SET_REAL_EXP (r, n);
2291       r->sig[SIGSZ-1] = SIG_MSB;
2292     }
2293 }
2294
2295 \f
2296 static void
2297 round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
2298 {
2299   int p2, np2, i, w;
2300   unsigned long sticky;
2301   bool guard, lsb;
2302   int emin2m1, emax2;
2303
2304   if (r->decimal)
2305     {
2306       if (fmt->b == 10)
2307         {
2308           decimal_round_for_format (fmt, r);
2309           return;
2310         }
2311       /* FIXME. We can come here via fp_easy_constant
2312          (e.g. -O0 on '_Decimal32 x = 1.0 + 2.0dd'), but have not
2313          investigated whether this convert needs to be here, or
2314          something else is missing. */
2315       decimal_real_convert (r, DFmode, r);
2316     }
2317
2318   p2 = fmt->p * fmt->log2_b;
2319   emin2m1 = (fmt->emin - 1) * fmt->log2_b;
2320   emax2 = fmt->emax * fmt->log2_b;
2321
2322   np2 = SIGNIFICAND_BITS - p2;
2323   switch (r->cl)
2324     {
2325     underflow:
2326       get_zero (r, r->sign);
2327     case rvc_zero:
2328       if (!fmt->has_signed_zero)
2329         r->sign = 0;
2330       return;
2331
2332     overflow:
2333       get_inf (r, r->sign);
2334     case rvc_inf:
2335       return;
2336
2337     case rvc_nan:
2338       clear_significand_below (r, np2);
2339       return;
2340
2341     case rvc_normal:
2342       break;
2343
2344     default:
2345       gcc_unreachable ();
2346     }
2347
2348   /* If we're not base2, normalize the exponent to a multiple of
2349      the true base.  */
2350   if (fmt->log2_b != 1)
2351     {
2352       int shift;
2353
2354       gcc_assert (fmt->b != 10);
2355       shift = REAL_EXP (r) & (fmt->log2_b - 1);
2356       if (shift)
2357         {
2358           shift = fmt->log2_b - shift;
2359           r->sig[0] |= sticky_rshift_significand (r, r, shift);
2360           SET_REAL_EXP (r, REAL_EXP (r) + shift);
2361         }
2362     }
2363
2364   /* Check the range of the exponent.  If we're out of range,
2365      either underflow or overflow.  */
2366   if (REAL_EXP (r) > emax2)
2367     goto overflow;
2368   else if (REAL_EXP (r) <= emin2m1)
2369     {
2370       int diff;
2371
2372       if (!fmt->has_denorm)
2373         {
2374           /* Don't underflow completely until we've had a chance to round.  */
2375           if (REAL_EXP (r) < emin2m1)
2376             goto underflow;
2377         }
2378       else
2379         {
2380           diff = emin2m1 - REAL_EXP (r) + 1;
2381           if (diff > p2)
2382             goto underflow;
2383
2384           /* De-normalize the significand.  */
2385           r->sig[0] |= sticky_rshift_significand (r, r, diff);
2386           SET_REAL_EXP (r, REAL_EXP (r) + diff);
2387         }
2388     }
2389
2390   /* There are P2 true significand bits, followed by one guard bit,
2391      followed by one sticky bit, followed by stuff.  Fold nonzero
2392      stuff into the sticky bit.  */
2393
2394   sticky = 0;
2395   for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2396     sticky |= r->sig[i];
2397   sticky |=
2398     r->sig[w] & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2399
2400   guard = test_significand_bit (r, np2 - 1);
2401   lsb = test_significand_bit (r, np2);
2402
2403   /* Round to even.  */
2404   if (guard && (sticky || lsb))
2405     {
2406       REAL_VALUE_TYPE u;
2407       get_zero (&u, 0);
2408       set_significand_bit (&u, np2);
2409
2410       if (add_significands (r, r, &u))
2411         {
2412           /* Overflow.  Means the significand had been all ones, and
2413              is now all zeros.  Need to increase the exponent, and
2414              possibly re-normalize it.  */
2415           SET_REAL_EXP (r, REAL_EXP (r) + 1);
2416           if (REAL_EXP (r) > emax2)
2417             goto overflow;
2418           r->sig[SIGSZ-1] = SIG_MSB;
2419
2420           if (fmt->log2_b != 1)
2421             {
2422               int shift = REAL_EXP (r) & (fmt->log2_b - 1);
2423               if (shift)
2424                 {
2425                   shift = fmt->log2_b - shift;
2426                   rshift_significand (r, r, shift);
2427                   SET_REAL_EXP (r, REAL_EXP (r) + shift);
2428                   if (REAL_EXP (r) > emax2)
2429                     goto overflow;
2430                 }
2431             }
2432         }
2433     }
2434
2435   /* Catch underflow that we deferred until after rounding.  */
2436   if (REAL_EXP (r) <= emin2m1)
2437     goto underflow;
2438
2439   /* Clear out trailing garbage.  */
2440   clear_significand_below (r, np2);
2441 }
2442
2443 /* Extend or truncate to a new mode.  */
2444
2445 void
2446 real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
2447               const REAL_VALUE_TYPE *a)
2448 {
2449   const struct real_format *fmt;
2450
2451   fmt = REAL_MODE_FORMAT (mode);
2452   gcc_assert (fmt);
2453
2454   *r = *a;
2455
2456   if (a->decimal || fmt->b == 10)
2457     decimal_real_convert (r, mode, a);
2458
2459   round_for_format (fmt, r);
2460
2461   /* round_for_format de-normalizes denormals.  Undo just that part.  */
2462   if (r->cl == rvc_normal)
2463     normalize (r);
2464 }
2465
2466 /* Legacy.  Likewise, except return the struct directly.  */
2467
2468 REAL_VALUE_TYPE
2469 real_value_truncate (enum machine_mode mode, REAL_VALUE_TYPE a)
2470 {
2471   REAL_VALUE_TYPE r;
2472   real_convert (&r, mode, &a);
2473   return r;
2474 }
2475
2476 /* Return true if truncating to MODE is exact.  */
2477
2478 bool
2479 exact_real_truncate (enum machine_mode mode, const REAL_VALUE_TYPE *a)
2480 {
2481   const struct real_format *fmt;
2482   REAL_VALUE_TYPE t;
2483   int emin2m1;
2484
2485   fmt = REAL_MODE_FORMAT (mode);
2486   gcc_assert (fmt);
2487
2488   /* Don't allow conversion to denormals.  */
2489   emin2m1 = (fmt->emin - 1) * fmt->log2_b;
2490   if (REAL_EXP (a) <= emin2m1)
2491     return false;
2492
2493   /* After conversion to the new mode, the value must be identical.  */
2494   real_convert (&t, mode, a);
2495   return real_identical (&t, a);
2496 }
2497
2498 /* Write R to the given target format.  Place the words of the result
2499    in target word order in BUF.  There are always 32 bits in each
2500    long, no matter the size of the host long.
2501
2502    Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE.  */
2503
2504 long
2505 real_to_target_fmt (long *buf, const REAL_VALUE_TYPE *r_orig,
2506                     const struct real_format *fmt)
2507 {
2508   REAL_VALUE_TYPE r;
2509   long buf1;
2510
2511   r = *r_orig;
2512   round_for_format (fmt, &r);
2513
2514   if (!buf)
2515     buf = &buf1;
2516   (*fmt->encode) (fmt, buf, &r);
2517
2518   return *buf;
2519 }
2520
2521 /* Similar, but look up the format from MODE.  */
2522
2523 long
2524 real_to_target (long *buf, const REAL_VALUE_TYPE *r, enum machine_mode mode)
2525 {
2526   const struct real_format *fmt;
2527
2528   fmt = REAL_MODE_FORMAT (mode);
2529   gcc_assert (fmt);
2530
2531   return real_to_target_fmt (buf, r, fmt);
2532 }
2533
2534 /* Read R from the given target format.  Read the words of the result
2535    in target word order in BUF.  There are always 32 bits in each
2536    long, no matter the size of the host long.  */
2537
2538 void
2539 real_from_target_fmt (REAL_VALUE_TYPE *r, const long *buf,
2540                       const struct real_format *fmt)
2541 {
2542   (*fmt->decode) (fmt, r, buf);
2543 }
2544
2545 /* Similar, but look up the format from MODE.  */
2546
2547 void
2548 real_from_target (REAL_VALUE_TYPE *r, const long *buf, enum machine_mode mode)
2549 {
2550   const struct real_format *fmt;
2551
2552   fmt = REAL_MODE_FORMAT (mode);
2553   gcc_assert (fmt);
2554
2555   (*fmt->decode) (fmt, r, buf);
2556 }
2557
2558 /* Return the number of bits of the largest binary value that the
2559    significand of MODE will hold.  */
2560 /* ??? Legacy.  Should get access to real_format directly.  */
2561
2562 int
2563 significand_size (enum machine_mode mode)
2564 {
2565   const struct real_format *fmt;
2566
2567   fmt = REAL_MODE_FORMAT (mode);
2568   if (fmt == NULL)
2569     return 0;
2570
2571   if (fmt->b == 10)
2572     {
2573       /* Return the size in bits of the largest binary value that can be
2574          held by the decimal coefficient for this mode.  This is one more
2575          than the number of bits required to hold the largest coefficient
2576          of this mode.  */
2577       double log2_10 = 3.3219281;
2578       return fmt->p * log2_10;
2579     }
2580   return fmt->p * fmt->log2_b;
2581 }
2582
2583 /* Return a hash value for the given real value.  */
2584 /* ??? The "unsigned int" return value is intended to be hashval_t,
2585    but I didn't want to pull hashtab.h into real.h.  */
2586
2587 unsigned int
2588 real_hash (const REAL_VALUE_TYPE *r)
2589 {
2590   unsigned int h;
2591   size_t i;
2592
2593   h = r->cl | (r->sign << 2);
2594   switch (r->cl)
2595     {
2596     case rvc_zero:
2597     case rvc_inf:
2598       return h;
2599
2600     case rvc_normal:
2601       h |= REAL_EXP (r) << 3;
2602       break;
2603
2604     case rvc_nan:
2605       if (r->signalling)
2606         h ^= (unsigned int)-1;
2607       if (r->canonical)
2608         return h;
2609       break;
2610
2611     default:
2612       gcc_unreachable ();
2613     }
2614
2615   if (sizeof(unsigned long) > sizeof(unsigned int))
2616     for (i = 0; i < SIGSZ; ++i)
2617       {
2618         unsigned long s = r->sig[i];
2619         h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2620       }
2621   else
2622     for (i = 0; i < SIGSZ; ++i)
2623       h ^= r->sig[i];
2624
2625   return h;
2626 }
2627 \f
2628 /* IEEE single-precision format.  */
2629
2630 static void encode_ieee_single (const struct real_format *fmt,
2631                                 long *, const REAL_VALUE_TYPE *);
2632 static void decode_ieee_single (const struct real_format *,
2633                                 REAL_VALUE_TYPE *, const long *);
2634
2635 static void
2636 encode_ieee_single (const struct real_format *fmt, long *buf,
2637                     const REAL_VALUE_TYPE *r)
2638 {
2639   unsigned long image, sig, exp;
2640   unsigned long sign = r->sign;
2641   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2642
2643   image = sign << 31;
2644   sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2645
2646   switch (r->cl)
2647     {
2648     case rvc_zero:
2649       break;
2650
2651     case rvc_inf:
2652       if (fmt->has_inf)
2653         image |= 255 << 23;
2654       else
2655         image |= 0x7fffffff;
2656       break;
2657
2658     case rvc_nan:
2659       if (fmt->has_nans)
2660         {
2661           if (r->canonical)
2662             sig = 0;
2663           if (r->signalling == fmt->qnan_msb_set)
2664             sig &= ~(1 << 22);
2665           else
2666             sig |= 1 << 22;
2667           /* We overload qnan_msb_set here: it's only clear for
2668              mips_ieee_single, which wants all mantissa bits but the
2669              quiet/signalling one set in canonical NaNs (at least
2670              Quiet ones).  */
2671           if (r->canonical && !fmt->qnan_msb_set)
2672             sig |= (1 << 22) - 1;
2673           else if (sig == 0)
2674             sig = 1 << 21;
2675
2676           image |= 255 << 23;
2677           image |= sig;
2678         }
2679       else
2680         image |= 0x7fffffff;
2681       break;
2682
2683     case rvc_normal:
2684       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2685          whereas the intermediate representation is 0.F x 2**exp.
2686          Which means we're off by one.  */
2687       if (denormal)
2688         exp = 0;
2689       else
2690       exp = REAL_EXP (r) + 127 - 1;
2691       image |= exp << 23;
2692       image |= sig;
2693       break;
2694
2695     default:
2696       gcc_unreachable ();
2697     }
2698
2699   buf[0] = image;
2700 }
2701
2702 static void
2703 decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2704                     const long *buf)
2705 {
2706   unsigned long image = buf[0] & 0xffffffff;
2707   bool sign = (image >> 31) & 1;
2708   int exp = (image >> 23) & 0xff;
2709
2710   memset (r, 0, sizeof (*r));
2711   image <<= HOST_BITS_PER_LONG - 24;
2712   image &= ~SIG_MSB;
2713
2714   if (exp == 0)
2715     {
2716       if (image && fmt->has_denorm)
2717         {
2718           r->cl = rvc_normal;
2719           r->sign = sign;
2720           SET_REAL_EXP (r, -126);
2721           r->sig[SIGSZ-1] = image << 1;
2722           normalize (r);
2723         }
2724       else if (fmt->has_signed_zero)
2725         r->sign = sign;
2726     }
2727   else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
2728     {
2729       if (image)
2730         {
2731           r->cl = rvc_nan;
2732           r->sign = sign;
2733           r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
2734                            ^ fmt->qnan_msb_set);
2735           r->sig[SIGSZ-1] = image;
2736         }
2737       else
2738         {
2739           r->cl = rvc_inf;
2740           r->sign = sign;
2741         }
2742     }
2743   else
2744     {
2745       r->cl = rvc_normal;
2746       r->sign = sign;
2747       SET_REAL_EXP (r, exp - 127 + 1);
2748       r->sig[SIGSZ-1] = image | SIG_MSB;
2749     }
2750 }
2751
2752 const struct real_format ieee_single_format =
2753   {
2754     encode_ieee_single,
2755     decode_ieee_single,
2756     2,
2757     1,
2758     24,
2759     24,
2760     -125,
2761     128,
2762     31,
2763     31,
2764     true,
2765     true,
2766     true,
2767     true,
2768     true
2769   };
2770
2771 const struct real_format mips_single_format =
2772   {
2773     encode_ieee_single,
2774     decode_ieee_single,
2775     2,
2776     1,
2777     24,
2778     24,
2779     -125,
2780     128,
2781     31,
2782     31,
2783     true,
2784     true,
2785     true,
2786     true,
2787     false
2788   };
2789
2790 \f
2791 /* IEEE double-precision format.  */
2792
2793 static void encode_ieee_double (const struct real_format *fmt,
2794                                 long *, const REAL_VALUE_TYPE *);
2795 static void decode_ieee_double (const struct real_format *,
2796                                 REAL_VALUE_TYPE *, const long *);
2797
2798 static void
2799 encode_ieee_double (const struct real_format *fmt, long *buf,
2800                     const REAL_VALUE_TYPE *r)
2801 {
2802   unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
2803   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2804
2805   image_hi = r->sign << 31;
2806   image_lo = 0;
2807
2808   if (HOST_BITS_PER_LONG == 64)
2809     {
2810       sig_hi = r->sig[SIGSZ-1];
2811       sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
2812       sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
2813     }
2814   else
2815     {
2816       sig_hi = r->sig[SIGSZ-1];
2817       sig_lo = r->sig[SIGSZ-2];
2818       sig_lo = (sig_hi << 21) | (sig_lo >> 11);
2819       sig_hi = (sig_hi >> 11) & 0xfffff;
2820     }
2821
2822   switch (r->cl)
2823     {
2824     case rvc_zero:
2825       break;
2826
2827     case rvc_inf:
2828       if (fmt->has_inf)
2829         image_hi |= 2047 << 20;
2830       else
2831         {
2832           image_hi |= 0x7fffffff;
2833           image_lo = 0xffffffff;
2834         }
2835       break;
2836
2837     case rvc_nan:
2838       if (fmt->has_nans)
2839         {
2840           if (r->canonical)
2841             sig_hi = sig_lo = 0;
2842           if (r->signalling == fmt->qnan_msb_set)
2843             sig_hi &= ~(1 << 19);
2844           else
2845             sig_hi |= 1 << 19;
2846           /* We overload qnan_msb_set here: it's only clear for
2847              mips_ieee_single, which wants all mantissa bits but the
2848              quiet/signalling one set in canonical NaNs (at least
2849              Quiet ones).  */
2850           if (r->canonical && !fmt->qnan_msb_set)
2851             {
2852               sig_hi |= (1 << 19) - 1;
2853               sig_lo = 0xffffffff;
2854             }
2855           else if (sig_hi == 0 && sig_lo == 0)
2856             sig_hi = 1 << 18;
2857
2858           image_hi |= 2047 << 20;
2859           image_hi |= sig_hi;
2860           image_lo = sig_lo;
2861         }
2862       else
2863         {
2864           image_hi |= 0x7fffffff;
2865           image_lo = 0xffffffff;
2866         }
2867       break;
2868
2869     case rvc_normal:
2870       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2871          whereas the intermediate representation is 0.F x 2**exp.
2872          Which means we're off by one.  */
2873       if (denormal)
2874         exp = 0;
2875       else
2876         exp = REAL_EXP (r) + 1023 - 1;
2877       image_hi |= exp << 20;
2878       image_hi |= sig_hi;
2879       image_lo = sig_lo;
2880       break;
2881
2882     default:
2883       gcc_unreachable ();
2884     }
2885
2886   if (FLOAT_WORDS_BIG_ENDIAN)
2887     buf[0] = image_hi, buf[1] = image_lo;
2888   else
2889     buf[0] = image_lo, buf[1] = image_hi;
2890 }
2891
2892 static void
2893 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2894                     const long *buf)
2895 {
2896   unsigned long image_hi, image_lo;
2897   bool sign;
2898   int exp;
2899
2900   if (FLOAT_WORDS_BIG_ENDIAN)
2901     image_hi = buf[0], image_lo = buf[1];
2902   else
2903     image_lo = buf[0], image_hi = buf[1];
2904   image_lo &= 0xffffffff;
2905   image_hi &= 0xffffffff;
2906
2907   sign = (image_hi >> 31) & 1;
2908   exp = (image_hi >> 20) & 0x7ff;
2909
2910   memset (r, 0, sizeof (*r));
2911
2912   image_hi <<= 32 - 21;
2913   image_hi |= image_lo >> 21;
2914   image_hi &= 0x7fffffff;
2915   image_lo <<= 32 - 21;
2916
2917   if (exp == 0)
2918     {
2919       if ((image_hi || image_lo) && fmt->has_denorm)
2920         {
2921           r->cl = rvc_normal;
2922           r->sign = sign;
2923           SET_REAL_EXP (r, -1022);
2924           if (HOST_BITS_PER_LONG == 32)
2925             {
2926               image_hi = (image_hi << 1) | (image_lo >> 31);
2927               image_lo <<= 1;
2928               r->sig[SIGSZ-1] = image_hi;
2929               r->sig[SIGSZ-2] = image_lo;
2930             }
2931           else
2932             {
2933               image_hi = (image_hi << 31 << 2) | (image_lo << 1);
2934               r->sig[SIGSZ-1] = image_hi;
2935             }
2936           normalize (r);
2937         }
2938       else if (fmt->has_signed_zero)
2939         r->sign = sign;
2940     }
2941   else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
2942     {
2943       if (image_hi || image_lo)
2944         {
2945           r->cl = rvc_nan;
2946           r->sign = sign;
2947           r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
2948           if (HOST_BITS_PER_LONG == 32)
2949             {
2950               r->sig[SIGSZ-1] = image_hi;
2951               r->sig[SIGSZ-2] = image_lo;
2952             }
2953           else
2954             r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
2955         }
2956       else
2957         {
2958           r->cl = rvc_inf;
2959           r->sign = sign;
2960         }
2961     }
2962   else
2963     {
2964       r->cl = rvc_normal;
2965       r->sign = sign;
2966       SET_REAL_EXP (r, exp - 1023 + 1);
2967       if (HOST_BITS_PER_LONG == 32)
2968         {
2969           r->sig[SIGSZ-1] = image_hi | SIG_MSB;
2970           r->sig[SIGSZ-2] = image_lo;
2971         }
2972       else
2973         r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
2974     }
2975 }
2976
2977 const struct real_format ieee_double_format =
2978   {
2979     encode_ieee_double,
2980     decode_ieee_double,
2981     2,
2982     1,
2983     53,
2984     53,
2985     -1021,
2986     1024,
2987     63,
2988     63,
2989     true,
2990     true,
2991     true,
2992     true,
2993     true
2994   };
2995
2996 const struct real_format mips_double_format =
2997   {
2998     encode_ieee_double,
2999     decode_ieee_double,
3000     2,
3001     1,
3002     53,
3003     53,
3004     -1021,
3005     1024,
3006     63,
3007     63,
3008     true,
3009     true,
3010     true,
3011     true,
3012     false
3013   };
3014
3015 \f
3016 /* IEEE extended real format.  This comes in three flavors: Intel's as
3017    a 12 byte image, Intel's as a 16 byte image, and Motorola's.  Intel
3018    12- and 16-byte images may be big- or little endian; Motorola's is
3019    always big endian.  */
3020
3021 /* Helper subroutine which converts from the internal format to the
3022    12-byte little-endian Intel format.  Functions below adjust this
3023    for the other possible formats.  */
3024 static void
3025 encode_ieee_extended (const struct real_format *fmt, long *buf,
3026                       const REAL_VALUE_TYPE *r)
3027 {
3028   unsigned long image_hi, sig_hi, sig_lo;
3029   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3030
3031   image_hi = r->sign << 15;
3032   sig_hi = sig_lo = 0;
3033
3034   switch (r->cl)
3035     {
3036     case rvc_zero:
3037       break;
3038
3039     case rvc_inf:
3040       if (fmt->has_inf)
3041         {
3042           image_hi |= 32767;
3043
3044           /* Intel requires the explicit integer bit to be set, otherwise
3045              it considers the value a "pseudo-infinity".  Motorola docs
3046              say it doesn't care.  */
3047           sig_hi = 0x80000000;
3048         }
3049       else
3050         {
3051           image_hi |= 32767;
3052           sig_lo = sig_hi = 0xffffffff;
3053         }
3054       break;
3055
3056     case rvc_nan:
3057       if (fmt->has_nans)
3058         {
3059           image_hi |= 32767;
3060           if (HOST_BITS_PER_LONG == 32)
3061             {
3062               sig_hi = r->sig[SIGSZ-1];
3063               sig_lo = r->sig[SIGSZ-2];
3064             }
3065           else
3066             {
3067               sig_lo = r->sig[SIGSZ-1];
3068               sig_hi = sig_lo >> 31 >> 1;
3069               sig_lo &= 0xffffffff;
3070             }
3071           if (r->signalling == fmt->qnan_msb_set)
3072             sig_hi &= ~(1 << 30);
3073           else
3074             sig_hi |= 1 << 30;
3075           if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
3076             sig_hi = 1 << 29;
3077
3078           /* Intel requires the explicit integer bit to be set, otherwise
3079              it considers the value a "pseudo-nan".  Motorola docs say it
3080              doesn't care.  */
3081           sig_hi |= 0x80000000;
3082         }
3083       else
3084         {
3085           image_hi |= 32767;
3086           sig_lo = sig_hi = 0xffffffff;
3087         }
3088       break;
3089
3090     case rvc_normal:
3091       {
3092         int exp = REAL_EXP (r);
3093
3094         /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3095            whereas the intermediate representation is 0.F x 2**exp.
3096            Which means we're off by one.
3097
3098            Except for Motorola, which consider exp=0 and explicit
3099            integer bit set to continue to be normalized.  In theory
3100            this discrepancy has been taken care of by the difference
3101            in fmt->emin in round_for_format.  */
3102
3103         if (denormal)
3104           exp = 0;
3105         else
3106           {
3107             exp += 16383 - 1;
3108             gcc_assert (exp >= 0);
3109           }
3110         image_hi |= exp;
3111
3112         if (HOST_BITS_PER_LONG == 32)
3113           {
3114             sig_hi = r->sig[SIGSZ-1];
3115             sig_lo = r->sig[SIGSZ-2];
3116           }
3117         else
3118           {
3119             sig_lo = r->sig[SIGSZ-1];
3120             sig_hi = sig_lo >> 31 >> 1;
3121             sig_lo &= 0xffffffff;
3122           }
3123       }
3124       break;
3125
3126     default:
3127       gcc_unreachable ();
3128     }
3129
3130   buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3131 }
3132
3133 /* Convert from the internal format to the 12-byte Motorola format
3134    for an IEEE extended real.  */
3135 static void
3136 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3137                                const REAL_VALUE_TYPE *r)
3138 {
3139   long intermed[3];
3140   encode_ieee_extended (fmt, intermed, r);
3141
3142   /* Motorola chips are assumed always to be big-endian.  Also, the
3143      padding in a Motorola extended real goes between the exponent and
3144      the mantissa.  At this point the mantissa is entirely within
3145      elements 0 and 1 of intermed, and the exponent entirely within
3146      element 2, so all we have to do is swap the order around, and
3147      shift element 2 left 16 bits.  */
3148   buf[0] = intermed[2] << 16;
3149   buf[1] = intermed[1];
3150   buf[2] = intermed[0];
3151 }
3152
3153 /* Convert from the internal format to the 12-byte Intel format for
3154    an IEEE extended real.  */
3155 static void
3156 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3157                                const REAL_VALUE_TYPE *r)
3158 {
3159   if (FLOAT_WORDS_BIG_ENDIAN)
3160     {
3161       /* All the padding in an Intel-format extended real goes at the high
3162          end, which in this case is after the mantissa, not the exponent.
3163          Therefore we must shift everything down 16 bits.  */
3164       long intermed[3];
3165       encode_ieee_extended (fmt, intermed, r);
3166       buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3167       buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3168       buf[2] =  (intermed[0] << 16);
3169     }
3170   else
3171     /* encode_ieee_extended produces what we want directly.  */
3172     encode_ieee_extended (fmt, buf, r);
3173 }
3174
3175 /* Convert from the internal format to the 16-byte Intel format for
3176    an IEEE extended real.  */
3177 static void
3178 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3179                                 const REAL_VALUE_TYPE *r)
3180 {
3181   /* All the padding in an Intel-format extended real goes at the high end.  */
3182   encode_ieee_extended_intel_96 (fmt, buf, r);
3183   buf[3] = 0;
3184 }
3185
3186 /* As above, we have a helper function which converts from 12-byte
3187    little-endian Intel format to internal format.  Functions below
3188    adjust for the other possible formats.  */
3189 static void
3190 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3191                       const long *buf)
3192 {
3193   unsigned long image_hi, sig_hi, sig_lo;
3194   bool sign;
3195   int exp;
3196
3197   sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3198   sig_lo &= 0xffffffff;
3199   sig_hi &= 0xffffffff;
3200   image_hi &= 0xffffffff;
3201
3202   sign = (image_hi >> 15) & 1;
3203   exp = image_hi & 0x7fff;
3204
3205   memset (r, 0, sizeof (*r));
3206
3207   if (exp == 0)
3208     {
3209       if ((sig_hi || sig_lo) && fmt->has_denorm)
3210         {
3211           r->cl = rvc_normal;
3212           r->sign = sign;
3213
3214           /* When the IEEE format contains a hidden bit, we know that
3215              it's zero at this point, and so shift up the significand
3216              and decrease the exponent to match.  In this case, Motorola
3217              defines the explicit integer bit to be valid, so we don't
3218              know whether the msb is set or not.  */
3219           SET_REAL_EXP (r, fmt->emin);
3220           if (HOST_BITS_PER_LONG == 32)
3221             {
3222               r->sig[SIGSZ-1] = sig_hi;
3223               r->sig[SIGSZ-2] = sig_lo;
3224             }
3225           else
3226             r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3227
3228           normalize (r);
3229         }
3230       else if (fmt->has_signed_zero)
3231         r->sign = sign;
3232     }
3233   else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3234     {
3235       /* See above re "pseudo-infinities" and "pseudo-nans".
3236          Short summary is that the MSB will likely always be
3237          set, and that we don't care about it.  */
3238       sig_hi &= 0x7fffffff;
3239
3240       if (sig_hi || sig_lo)
3241         {
3242           r->cl = rvc_nan;
3243           r->sign = sign;
3244           r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3245           if (HOST_BITS_PER_LONG == 32)
3246             {
3247               r->sig[SIGSZ-1] = sig_hi;
3248               r->sig[SIGSZ-2] = sig_lo;
3249             }
3250           else
3251             r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3252         }
3253       else
3254         {
3255           r->cl = rvc_inf;
3256           r->sign = sign;
3257         }
3258     }
3259   else
3260     {
3261       r->cl = rvc_normal;
3262       r->sign = sign;
3263       SET_REAL_EXP (r, exp - 16383 + 1);
3264       if (HOST_BITS_PER_LONG == 32)
3265         {
3266           r->sig[SIGSZ-1] = sig_hi;
3267           r->sig[SIGSZ-2] = sig_lo;
3268         }
3269       else
3270         r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3271     }
3272 }
3273
3274 /* Convert from the internal format to the 12-byte Motorola format
3275    for an IEEE extended real.  */
3276 static void
3277 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3278                                const long *buf)
3279 {
3280   long intermed[3];
3281
3282   /* Motorola chips are assumed always to be big-endian.  Also, the
3283      padding in a Motorola extended real goes between the exponent and
3284      the mantissa; remove it.  */
3285   intermed[0] = buf[2];
3286   intermed[1] = buf[1];
3287   intermed[2] = (unsigned long)buf[0] >> 16;
3288
3289   decode_ieee_extended (fmt, r, intermed);
3290 }
3291
3292 /* Convert from the internal format to the 12-byte Intel format for
3293    an IEEE extended real.  */
3294 static void
3295 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3296                                const long *buf)
3297 {
3298   if (FLOAT_WORDS_BIG_ENDIAN)
3299     {
3300       /* All the padding in an Intel-format extended real goes at the high
3301          end, which in this case is after the mantissa, not the exponent.
3302          Therefore we must shift everything up 16 bits.  */
3303       long intermed[3];
3304
3305       intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3306       intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3307       intermed[2] =  ((unsigned long)buf[0] >> 16);
3308
3309       decode_ieee_extended (fmt, r, intermed);
3310     }
3311   else
3312     /* decode_ieee_extended produces what we want directly.  */
3313     decode_ieee_extended (fmt, r, buf);
3314 }
3315
3316 /* Convert from the internal format to the 16-byte Intel format for
3317    an IEEE extended real.  */
3318 static void
3319 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3320                                 const long *buf)
3321 {
3322   /* All the padding in an Intel-format extended real goes at the high end.  */
3323   decode_ieee_extended_intel_96 (fmt, r, buf);
3324 }
3325
3326 const struct real_format ieee_extended_motorola_format =
3327   {
3328     encode_ieee_extended_motorola,
3329     decode_ieee_extended_motorola,
3330     2,
3331     1,
3332     64,
3333     64,
3334     -16382,
3335     16384,
3336     95,
3337     95,
3338     true,
3339     true,
3340     true,
3341     true,
3342     true
3343   };
3344
3345 const struct real_format ieee_extended_intel_96_format =
3346   {
3347     encode_ieee_extended_intel_96,
3348     decode_ieee_extended_intel_96,
3349     2,
3350     1,
3351     64,
3352     64,
3353     -16381,
3354     16384,
3355     79,
3356     79,
3357     true,
3358     true,
3359     true,
3360     true,
3361     true
3362   };
3363
3364 const struct real_format ieee_extended_intel_128_format =
3365   {
3366     encode_ieee_extended_intel_128,
3367     decode_ieee_extended_intel_128,
3368     2,
3369     1,
3370     64,
3371     64,
3372     -16381,
3373     16384,
3374     79,
3375     79,
3376     true,
3377     true,
3378     true,
3379     true,
3380     true
3381   };
3382
3383 /* The following caters to i386 systems that set the rounding precision
3384    to 53 bits instead of 64, e.g. FreeBSD.  */
3385 const struct real_format ieee_extended_intel_96_round_53_format =
3386   {
3387     encode_ieee_extended_intel_96,
3388     decode_ieee_extended_intel_96,
3389     2,
3390     1,
3391     53,
3392     53,
3393     -16381,
3394     16384,
3395     79,
3396     79,
3397     true,
3398     true,
3399     true,
3400     true,
3401     true
3402   };
3403 \f
3404 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3405    numbers whose sum is equal to the extended precision value.  The number
3406    with greater magnitude is first.  This format has the same magnitude
3407    range as an IEEE double precision value, but effectively 106 bits of
3408    significand precision.  Infinity and NaN are represented by their IEEE
3409    double precision value stored in the first number, the second number is
3410    +0.0 or -0.0 for Infinity and don't-care for NaN.  */
3411
3412 static void encode_ibm_extended (const struct real_format *fmt,
3413                                  long *, const REAL_VALUE_TYPE *);
3414 static void decode_ibm_extended (const struct real_format *,
3415                                  REAL_VALUE_TYPE *, const long *);
3416
3417 static void
3418 encode_ibm_extended (const struct real_format *fmt, long *buf,
3419                      const REAL_VALUE_TYPE *r)
3420 {
3421   REAL_VALUE_TYPE u, normr, v;
3422   const struct real_format *base_fmt;
3423
3424   base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3425
3426   /* Renormlize R before doing any arithmetic on it.  */
3427   normr = *r;
3428   if (normr.cl == rvc_normal)
3429     normalize (&normr);
3430
3431   /* u = IEEE double precision portion of significand.  */
3432   u = normr;
3433   round_for_format (base_fmt, &u);
3434   encode_ieee_double (base_fmt, &buf[0], &u);
3435
3436   if (u.cl == rvc_normal)
3437     {
3438       do_add (&v, &normr, &u, 1);
3439       /* Call round_for_format since we might need to denormalize.  */
3440       round_for_format (base_fmt, &v);
3441       encode_ieee_double (base_fmt, &buf[2], &v);
3442     }
3443   else
3444     {
3445       /* Inf, NaN, 0 are all representable as doubles, so the
3446          least-significant part can be 0.0.  */
3447       buf[2] = 0;
3448       buf[3] = 0;
3449     }
3450 }
3451
3452 static void
3453 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3454                      const long *buf)
3455 {
3456   REAL_VALUE_TYPE u, v;
3457   const struct real_format *base_fmt;
3458
3459   base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3460   decode_ieee_double (base_fmt, &u, &buf[0]);
3461
3462   if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3463     {
3464       decode_ieee_double (base_fmt, &v, &buf[2]);
3465       do_add (r, &u, &v, 0);
3466     }
3467   else
3468     *r = u;
3469 }
3470
3471 const struct real_format ibm_extended_format =
3472   {
3473     encode_ibm_extended,
3474     decode_ibm_extended,
3475     2,
3476     1,
3477     53 + 53,
3478     53,
3479     -1021 + 53,
3480     1024,
3481     127,
3482     -1,
3483     true,
3484     true,
3485     true,
3486     true,
3487     true
3488   };
3489
3490 const struct real_format mips_extended_format =
3491   {
3492     encode_ibm_extended,
3493     decode_ibm_extended,
3494     2,
3495     1,
3496     53 + 53,
3497     53,
3498     -1021 + 53,
3499     1024,
3500     127,
3501     -1,
3502     true,
3503     true,
3504     true,
3505     true,
3506     false
3507   };
3508
3509 \f
3510 /* IEEE quad precision format.  */
3511
3512 static void encode_ieee_quad (const struct real_format *fmt,
3513                               long *, const REAL_VALUE_TYPE *);
3514 static void decode_ieee_quad (const struct real_format *,
3515                               REAL_VALUE_TYPE *, const long *);
3516
3517 static void
3518 encode_ieee_quad (const struct real_format *fmt, long *buf,
3519                   const REAL_VALUE_TYPE *r)
3520 {
3521   unsigned long image3, image2, image1, image0, exp;
3522   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3523   REAL_VALUE_TYPE u;
3524
3525   image3 = r->sign << 31;
3526   image2 = 0;
3527   image1 = 0;
3528   image0 = 0;
3529
3530   rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3531
3532   switch (r->cl)
3533     {
3534     case rvc_zero:
3535       break;
3536
3537     case rvc_inf:
3538       if (fmt->has_inf)
3539         image3 |= 32767 << 16;
3540       else
3541         {
3542           image3 |= 0x7fffffff;
3543           image2 = 0xffffffff;
3544           image1 = 0xffffffff;
3545           image0 = 0xffffffff;
3546         }
3547       break;
3548
3549     case rvc_nan:
3550       if (fmt->has_nans)
3551         {
3552           image3 |= 32767 << 16;
3553
3554           if (r->canonical)
3555             {
3556               /* Don't use bits from the significand.  The
3557                  initialization above is right.  */
3558             }
3559           else if (HOST_BITS_PER_LONG == 32)
3560             {
3561               image0 = u.sig[0];
3562               image1 = u.sig[1];
3563               image2 = u.sig[2];
3564               image3 |= u.sig[3] & 0xffff;
3565             }
3566           else
3567             {
3568               image0 = u.sig[0];
3569               image1 = image0 >> 31 >> 1;
3570               image2 = u.sig[1];
3571               image3 |= (image2 >> 31 >> 1) & 0xffff;
3572               image0 &= 0xffffffff;
3573               image2 &= 0xffffffff;
3574             }
3575           if (r->signalling == fmt->qnan_msb_set)
3576             image3 &= ~0x8000;
3577           else
3578             image3 |= 0x8000;
3579           /* We overload qnan_msb_set here: it's only clear for
3580              mips_ieee_single, which wants all mantissa bits but the
3581              quiet/signalling one set in canonical NaNs (at least
3582              Quiet ones).  */
3583           if (r->canonical && !fmt->qnan_msb_set)
3584             {
3585               image3 |= 0x7fff;
3586               image2 = image1 = image0 = 0xffffffff;
3587             }
3588           else if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3589             image3 |= 0x4000;
3590         }
3591       else
3592         {
3593           image3 |= 0x7fffffff;
3594           image2 = 0xffffffff;
3595           image1 = 0xffffffff;
3596           image0 = 0xffffffff;
3597         }
3598       break;
3599
3600     case rvc_normal:
3601       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3602          whereas the intermediate representation is 0.F x 2**exp.
3603          Which means we're off by one.  */
3604       if (denormal)
3605         exp = 0;
3606       else
3607         exp = REAL_EXP (r) + 16383 - 1;
3608       image3 |= exp << 16;
3609
3610       if (HOST_BITS_PER_LONG == 32)
3611         {
3612           image0 = u.sig[0];
3613           image1 = u.sig[1];
3614           image2 = u.sig[2];
3615           image3 |= u.sig[3] & 0xffff;
3616         }
3617       else
3618         {
3619           image0 = u.sig[0];
3620           image1 = image0 >> 31 >> 1;
3621           image2 = u.sig[1];
3622           image3 |= (image2 >> 31 >> 1) & 0xffff;
3623           image0 &= 0xffffffff;
3624           image2 &= 0xffffffff;
3625         }
3626       break;
3627
3628     default:
3629       gcc_unreachable ();
3630     }
3631
3632   if (FLOAT_WORDS_BIG_ENDIAN)
3633     {
3634       buf[0] = image3;
3635       buf[1] = image2;
3636       buf[2] = image1;
3637       buf[3] = image0;
3638     }
3639   else
3640     {
3641       buf[0] = image0;
3642       buf[1] = image1;
3643       buf[2] = image2;
3644       buf[3] = image3;
3645     }
3646 }
3647
3648 static void
3649 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3650                   const long *buf)
3651 {
3652   unsigned long image3, image2, image1, image0;
3653   bool sign;
3654   int exp;
3655
3656   if (FLOAT_WORDS_BIG_ENDIAN)
3657     {
3658       image3 = buf[0];
3659       image2 = buf[1];
3660       image1 = buf[2];
3661       image0 = buf[3];
3662     }
3663   else
3664     {
3665       image0 = buf[0];
3666       image1 = buf[1];
3667       image2 = buf[2];
3668       image3 = buf[3];
3669     }
3670   image0 &= 0xffffffff;
3671   image1 &= 0xffffffff;
3672   image2 &= 0xffffffff;
3673
3674   sign = (image3 >> 31) & 1;
3675   exp = (image3 >> 16) & 0x7fff;
3676   image3 &= 0xffff;
3677
3678   memset (r, 0, sizeof (*r));
3679
3680   if (exp == 0)
3681     {
3682       if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
3683         {
3684           r->cl = rvc_normal;
3685           r->sign = sign;
3686
3687           SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
3688           if (HOST_BITS_PER_LONG == 32)
3689             {
3690               r->sig[0] = image0;
3691               r->sig[1] = image1;
3692               r->sig[2] = image2;
3693               r->sig[3] = image3;
3694             }
3695           else
3696             {
3697               r->sig[0] = (image1 << 31 << 1) | image0;
3698               r->sig[1] = (image3 << 31 << 1) | image2;
3699             }
3700
3701           normalize (r);
3702         }
3703       else if (fmt->has_signed_zero)
3704         r->sign = sign;
3705     }
3706   else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3707     {
3708       if (image3 | image2 | image1 | image0)
3709         {
3710           r->cl = rvc_nan;
3711           r->sign = sign;
3712           r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
3713
3714           if (HOST_BITS_PER_LONG == 32)
3715             {
3716               r->sig[0] = image0;
3717               r->sig[1] = image1;
3718               r->sig[2] = image2;
3719               r->sig[3] = image3;
3720             }
3721           else
3722             {
3723               r->sig[0] = (image1 << 31 << 1) | image0;
3724               r->sig[1] = (image3 << 31 << 1) | image2;
3725             }
3726           lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3727         }
3728       else
3729         {
3730           r->cl = rvc_inf;
3731           r->sign = sign;
3732         }
3733     }
3734   else
3735     {
3736       r->cl = rvc_normal;
3737       r->sign = sign;
3738       SET_REAL_EXP (r, exp - 16383 + 1);
3739
3740       if (HOST_BITS_PER_LONG == 32)
3741         {
3742           r->sig[0] = image0;
3743           r->sig[1] = image1;
3744           r->sig[2] = image2;
3745           r->sig[3] = image3;
3746         }
3747       else
3748         {
3749           r->sig[0] = (image1 << 31 << 1) | image0;
3750           r->sig[1] = (image3 << 31 << 1) | image2;
3751         }
3752       lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3753       r->sig[SIGSZ-1] |= SIG_MSB;
3754     }
3755 }
3756
3757 const struct real_format ieee_quad_format =
3758   {
3759     encode_ieee_quad,
3760     decode_ieee_quad,
3761     2,
3762     1,
3763     113,
3764     113,
3765     -16381,
3766     16384,
3767     127,
3768     127,
3769     true,
3770     true,
3771     true,
3772     true,
3773     true
3774   };
3775
3776 const struct real_format mips_quad_format =
3777   {
3778     encode_ieee_quad,
3779     decode_ieee_quad,
3780     2,
3781     1,
3782     113,
3783     113,
3784     -16381,
3785     16384,
3786     127,
3787     127,
3788     true,
3789     true,
3790     true,
3791     true,
3792     false
3793   };
3794 \f
3795 /* Descriptions of VAX floating point formats can be found beginning at
3796
3797    http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
3798
3799    The thing to remember is that they're almost IEEE, except for word
3800    order, exponent bias, and the lack of infinities, nans, and denormals.
3801
3802    We don't implement the H_floating format here, simply because neither
3803    the VAX or Alpha ports use it.  */
3804
3805 static void encode_vax_f (const struct real_format *fmt,
3806                           long *, const REAL_VALUE_TYPE *);
3807 static void decode_vax_f (const struct real_format *,
3808                           REAL_VALUE_TYPE *, const long *);
3809 static void encode_vax_d (const struct real_format *fmt,
3810                           long *, const REAL_VALUE_TYPE *);
3811 static void decode_vax_d (const struct real_format *,
3812                           REAL_VALUE_TYPE *, const long *);
3813 static void encode_vax_g (const struct real_format *fmt,
3814                           long *, const REAL_VALUE_TYPE *);
3815 static void decode_vax_g (const struct real_format *,
3816                           REAL_VALUE_TYPE *, const long *);
3817
3818 static void
3819 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3820               const REAL_VALUE_TYPE *r)
3821 {
3822   unsigned long sign, exp, sig, image;
3823
3824   sign = r->sign << 15;
3825
3826   switch (r->cl)
3827     {
3828     case rvc_zero:
3829       image = 0;
3830       break;
3831
3832     case rvc_inf:
3833     case rvc_nan:
3834       image = 0xffff7fff | sign;
3835       break;
3836
3837     case rvc_normal:
3838       sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
3839       exp = REAL_EXP (r) + 128;
3840
3841       image = (sig << 16) & 0xffff0000;
3842       image |= sign;
3843       image |= exp << 7;
3844       image |= sig >> 16;
3845       break;
3846
3847     default:
3848       gcc_unreachable ();
3849     }
3850
3851   buf[0] = image;
3852 }
3853
3854 static void
3855 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
3856               REAL_VALUE_TYPE *r, const long *buf)
3857 {
3858   unsigned long image = buf[0] & 0xffffffff;
3859   int exp = (image >> 7) & 0xff;
3860
3861   memset (r, 0, sizeof (*r));
3862
3863   if (exp != 0)
3864     {
3865       r->cl = rvc_normal;
3866       r->sign = (image >> 15) & 1;
3867       SET_REAL_EXP (r, exp - 128);
3868
3869       image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
3870       r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
3871     }
3872 }
3873
3874 static void
3875 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3876               const REAL_VALUE_TYPE *r)
3877 {
3878   unsigned long image0, image1, sign = r->sign << 15;
3879
3880   switch (r->cl)
3881     {
3882     case rvc_zero:
3883       image0 = image1 = 0;
3884       break;
3885
3886     case rvc_inf:
3887     case rvc_nan:
3888       image0 = 0xffff7fff | sign;
3889       image1 = 0xffffffff;
3890       break;
3891
3892     case rvc_normal:
3893       /* Extract the significand into straight hi:lo.  */
3894       if (HOST_BITS_PER_LONG == 64)
3895         {
3896           image0 = r->sig[SIGSZ-1];
3897           image1 = (image0 >> (64 - 56)) & 0xffffffff;
3898           image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
3899         }
3900       else
3901         {
3902           image0 = r->sig[SIGSZ-1];
3903           image1 = r->sig[SIGSZ-2];
3904           image1 = (image0 << 24) | (image1 >> 8);
3905           image0 = (image0 >> 8) & 0xffffff;
3906         }
3907
3908       /* Rearrange the half-words of the significand to match the
3909          external format.  */
3910       image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
3911       image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3912
3913       /* Add the sign and exponent.  */
3914       image0 |= sign;
3915       image0 |= (REAL_EXP (r) + 128) << 7;
3916       break;
3917
3918     default:
3919       gcc_unreachable ();
3920     }
3921
3922   if (FLOAT_WORDS_BIG_ENDIAN)
3923     buf[0] = image1, buf[1] = image0;
3924   else
3925     buf[0] = image0, buf[1] = image1;
3926 }
3927
3928 static void
3929 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
3930               REAL_VALUE_TYPE *r, const long *buf)
3931 {
3932   unsigned long image0, image1;
3933   int exp;
3934
3935   if (FLOAT_WORDS_BIG_ENDIAN)
3936     image1 = buf[0], image0 = buf[1];
3937   else
3938     image0 = buf[0], image1 = buf[1];
3939   image0 &= 0xffffffff;
3940   image1 &= 0xffffffff;
3941
3942   exp = (image0 >> 7) & 0xff;
3943
3944   memset (r, 0, sizeof (*r));
3945
3946   if (exp != 0)
3947     {
3948       r->cl = rvc_normal;
3949       r->sign = (image0 >> 15) & 1;
3950       SET_REAL_EXP (r, exp - 128);
3951
3952       /* Rearrange the half-words of the external format into
3953          proper ascending order.  */
3954       image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
3955       image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3956
3957       if (HOST_BITS_PER_LONG == 64)
3958         {
3959           image0 = (image0 << 31 << 1) | image1;
3960           image0 <<= 64 - 56;
3961           image0 |= SIG_MSB;
3962           r->sig[SIGSZ-1] = image0;
3963         }
3964       else
3965         {
3966           r->sig[SIGSZ-1] = image0;
3967           r->sig[SIGSZ-2] = image1;
3968           lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
3969           r->sig[SIGSZ-1] |= SIG_MSB;
3970         }
3971     }
3972 }
3973
3974 static void
3975 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3976               const REAL_VALUE_TYPE *r)
3977 {
3978   unsigned long image0, image1, sign = r->sign << 15;
3979
3980   switch (r->cl)
3981     {
3982     case rvc_zero:
3983       image0 = image1 = 0;
3984       break;
3985
3986     case rvc_inf:
3987     case rvc_nan:
3988       image0 = 0xffff7fff | sign;
3989       image1 = 0xffffffff;
3990       break;
3991
3992     case rvc_normal:
3993       /* Extract the significand into straight hi:lo.  */
3994       if (HOST_BITS_PER_LONG == 64)
3995         {
3996           image0 = r->sig[SIGSZ-1];
3997           image1 = (image0 >> (64 - 53)) & 0xffffffff;
3998           image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
3999         }
4000       else
4001         {
4002           image0 = r->sig[SIGSZ-1];
4003           image1 = r->sig[SIGSZ-2];
4004           image1 = (image0 << 21) | (image1 >> 11);
4005           image0 = (image0 >> 11) & 0xfffff;
4006         }
4007
4008       /* Rearrange the half-words of the significand to match the
4009          external format.  */
4010       image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
4011       image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
4012
4013       /* Add the sign and exponent.  */
4014       image0 |= sign;
4015       image0 |= (REAL_EXP (r) + 1024) << 4;
4016       break;
4017
4018     default:
4019       gcc_unreachable ();
4020     }
4021
4022   if (FLOAT_WORDS_BIG_ENDIAN)
4023     buf[0] = image1, buf[1] = image0;
4024   else
4025     buf[0] = image0, buf[1] = image1;
4026 }
4027
4028 static void
4029 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
4030               REAL_VALUE_TYPE *r, const long *buf)
4031 {
4032   unsigned long image0, image1;
4033   int exp;
4034
4035   if (FLOAT_WORDS_BIG_ENDIAN)
4036     image1 = buf[0], image0 = buf[1];
4037   else
4038     image0 = buf[0], image1 = buf[1];
4039   image0 &= 0xffffffff;
4040   image1 &= 0xffffffff;
4041
4042   exp = (image0 >> 4) & 0x7ff;
4043
4044   memset (r, 0, sizeof (*r));
4045
4046   if (exp != 0)
4047     {
4048       r->cl = rvc_normal;
4049       r->sign = (image0 >> 15) & 1;
4050       SET_REAL_EXP (r, exp - 1024);
4051
4052       /* Rearrange the half-words of the external format into
4053          proper ascending order.  */
4054       image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
4055       image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
4056
4057       if (HOST_BITS_PER_LONG == 64)
4058         {
4059           image0 = (image0 << 31 << 1) | image1;
4060           image0 <<= 64 - 53;
4061           image0 |= SIG_MSB;
4062           r->sig[SIGSZ-1] = image0;
4063         }
4064       else
4065         {
4066           r->sig[SIGSZ-1] = image0;
4067           r->sig[SIGSZ-2] = image1;
4068           lshift_significand (r, r, 64 - 53);
4069           r->sig[SIGSZ-1] |= SIG_MSB;
4070         }
4071     }
4072 }
4073
4074 const struct real_format vax_f_format =
4075   {
4076     encode_vax_f,
4077     decode_vax_f,
4078     2,
4079     1,
4080     24,
4081     24,
4082     -127,
4083     127,
4084     15,
4085     15,
4086     false,
4087     false,
4088     false,
4089     false,
4090     false
4091   };
4092
4093 const struct real_format vax_d_format =
4094   {
4095     encode_vax_d,
4096     decode_vax_d,
4097     2,
4098     1,
4099     56,
4100     56,
4101     -127,
4102     127,
4103     15,
4104     15,
4105     false,
4106     false,
4107     false,
4108     false,
4109     false
4110   };
4111
4112 const struct real_format vax_g_format =
4113   {
4114     encode_vax_g,
4115     decode_vax_g,
4116     2,
4117     1,
4118     53,
4119     53,
4120     -1023,
4121     1023,
4122     15,
4123     15,
4124     false,
4125     false,
4126     false,
4127     false,
4128     false
4129   };
4130 \f
4131 /* A good reference for these can be found in chapter 9 of
4132    "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
4133    An on-line version can be found here:
4134
4135    http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
4136 */
4137
4138 static void encode_i370_single (const struct real_format *fmt,
4139                                 long *, const REAL_VALUE_TYPE *);
4140 static void decode_i370_single (const struct real_format *,
4141                                 REAL_VALUE_TYPE *, const long *);
4142 static void encode_i370_double (const struct real_format *fmt,
4143                                 long *, const REAL_VALUE_TYPE *);
4144 static void decode_i370_double (const struct real_format *,
4145                                 REAL_VALUE_TYPE *, const long *);
4146
4147 static void
4148 encode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4149                     long *buf, const REAL_VALUE_TYPE *r)
4150 {
4151   unsigned long sign, exp, sig, image;
4152
4153   sign = r->sign << 31;
4154
4155   switch (r->cl)
4156     {
4157     case rvc_zero:
4158       image = 0;
4159       break;
4160
4161     case rvc_inf:
4162     case rvc_nan:
4163       image = 0x7fffffff | sign;
4164       break;
4165
4166     case rvc_normal:
4167       sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
4168       exp = ((REAL_EXP (r) / 4) + 64) << 24;
4169       image = sign | exp | sig;
4170       break;
4171
4172     default:
4173       gcc_unreachable ();
4174     }
4175
4176   buf[0] = image;
4177 }
4178
4179 static void
4180 decode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4181                     REAL_VALUE_TYPE *r, const long *buf)
4182 {
4183   unsigned long sign, sig, image = buf[0];
4184   int exp;
4185
4186   sign = (image >> 31) & 1;
4187   exp = (image >> 24) & 0x7f;
4188   sig = image & 0xffffff;
4189
4190   memset (r, 0, sizeof (*r));
4191
4192   if (exp || sig)
4193     {
4194       r->cl = rvc_normal;
4195       r->sign = sign;
4196       SET_REAL_EXP (r, (exp - 64) * 4);
4197       r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
4198       normalize (r);
4199     }
4200 }
4201
4202 static void
4203 encode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4204                     long *buf, const REAL_VALUE_TYPE *r)
4205 {
4206   unsigned long sign, exp, image_hi, image_lo;
4207
4208   sign = r->sign << 31;
4209
4210   switch (r->cl)
4211     {
4212     case rvc_zero:
4213       image_hi = image_lo = 0;
4214       break;
4215
4216     case rvc_inf:
4217     case rvc_nan:
4218       image_hi = 0x7fffffff | sign;
4219       image_lo = 0xffffffff;
4220       break;
4221
4222     case rvc_normal:
4223       if (HOST_BITS_PER_LONG == 64)
4224         {
4225           image_hi = r->sig[SIGSZ-1];
4226           image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
4227           image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
4228         }
4229       else
4230         {
4231           image_hi = r->sig[SIGSZ-1];
4232           image_lo = r->sig[SIGSZ-2];
4233           image_lo = (image_lo >> 8) | (image_hi << 24);
4234           image_hi >>= 8;
4235         }
4236
4237       exp = ((REAL_EXP (r) / 4) + 64) << 24;
4238       image_hi |= sign | exp;
4239       break;
4240
4241     default:
4242       gcc_unreachable ();
4243     }
4244
4245   if (FLOAT_WORDS_BIG_ENDIAN)
4246     buf[0] = image_hi, buf[1] = image_lo;
4247   else
4248     buf[0] = image_lo, buf[1] = image_hi;
4249 }
4250
4251 static void
4252 decode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4253                     REAL_VALUE_TYPE *r, const long *buf)
4254 {
4255   unsigned long sign, image_hi, image_lo;
4256   int exp;
4257
4258   if (FLOAT_WORDS_BIG_ENDIAN)
4259     image_hi = buf[0], image_lo = buf[1];
4260   else
4261     image_lo = buf[0], image_hi = buf[1];
4262
4263   sign = (image_hi >> 31) & 1;
4264   exp = (image_hi >> 24) & 0x7f;
4265   image_hi &= 0xffffff;
4266   image_lo &= 0xffffffff;
4267
4268   memset (r, 0, sizeof (*r));
4269
4270   if (exp || image_hi || image_lo)
4271     {
4272       r->cl = rvc_normal;
4273       r->sign = sign;
4274       SET_REAL_EXP (r, (exp - 64) * 4 + (SIGNIFICAND_BITS - 56));
4275
4276       if (HOST_BITS_PER_LONG == 32)
4277         {
4278           r->sig[0] = image_lo;
4279           r->sig[1] = image_hi;
4280         }
4281       else
4282         r->sig[0] = image_lo | (image_hi << 31 << 1);
4283
4284       normalize (r);
4285     }
4286 }
4287
4288 const struct real_format i370_single_format =
4289   {
4290     encode_i370_single,
4291     decode_i370_single,
4292     16,
4293     4,
4294     6,
4295     6,
4296     -64,
4297     63,
4298     31,
4299     31,
4300     false,
4301     false,
4302     false, /* ??? The encoding does allow for "unnormals".  */
4303     false, /* ??? The encoding does allow for "unnormals".  */
4304     false
4305   };
4306
4307 const struct real_format i370_double_format =
4308   {
4309     encode_i370_double,
4310     decode_i370_double,
4311     16,
4312     4,
4313     14,
4314     14,
4315     -64,
4316     63,
4317     63,
4318     63,
4319     false,
4320     false,
4321     false, /* ??? The encoding does allow for "unnormals".  */
4322     false, /* ??? The encoding does allow for "unnormals".  */
4323     false
4324   };
4325 \f
4326 /* Encode real R into a single precision DFP value in BUF.  */
4327 static void
4328 encode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4329                        long *buf ATTRIBUTE_UNUSED, 
4330                        const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4331 {
4332   encode_decimal32 (fmt, buf, r);
4333 }
4334
4335 /* Decode a single precision DFP value in BUF into a real R.  */
4336 static void 
4337 decode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4338                        REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED, 
4339                        const long *buf ATTRIBUTE_UNUSED)
4340 {
4341   decode_decimal32 (fmt, r, buf);
4342 }
4343
4344 /* Encode real R into a double precision DFP value in BUF.  */
4345 static void 
4346 encode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4347                        long *buf ATTRIBUTE_UNUSED, 
4348                        const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4349 {
4350   encode_decimal64 (fmt, buf, r);
4351 }
4352
4353 /* Decode a double precision DFP value in BUF into a real R.  */
4354 static void 
4355 decode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4356                        REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED, 
4357                        const long *buf ATTRIBUTE_UNUSED)
4358 {
4359   decode_decimal64 (fmt, r, buf);
4360 }
4361
4362 /* Encode real R into a quad precision DFP value in BUF.  */
4363 static void 
4364 encode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4365                      long *buf ATTRIBUTE_UNUSED,
4366                      const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
4367 {
4368   encode_decimal128 (fmt, buf, r);
4369 }
4370
4371 /* Decode a quad precision DFP value in BUF into a real R.  */
4372 static void 
4373 decode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
4374                      REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
4375                      const long *buf ATTRIBUTE_UNUSED)
4376 {
4377   decode_decimal128 (fmt, r, buf);
4378 }
4379
4380 /* Single precision decimal floating point (IEEE 754R). */
4381 const struct real_format decimal_single_format =
4382   {
4383     encode_decimal_single,
4384     decode_decimal_single,
4385     10, 
4386     1,  /* log10 */
4387     7,
4388     7,
4389     -95,
4390     96,
4391     31,
4392     31,
4393     true,
4394     true,
4395     true,
4396     true, 
4397     true
4398   };
4399
4400 /* Double precision decimal floating point (IEEE 754R). */
4401 const struct real_format decimal_double_format =
4402   {
4403     encode_decimal_double,
4404     decode_decimal_double,
4405     10,
4406     1,  /* log10 */
4407     16,
4408     16,
4409     -383,
4410     384,
4411     63,
4412     63,
4413     true,
4414     true,
4415     true,
4416     true,
4417     true
4418   };
4419
4420 /* Quad precision decimal floating point (IEEE 754R). */
4421 const struct real_format decimal_quad_format =
4422   {
4423     encode_decimal_quad,
4424     decode_decimal_quad,
4425     10,
4426     1,  /* log10 */
4427     34,
4428     34,
4429     -6143,
4430     6144,
4431     127,
4432     127,
4433     true,
4434     true,
4435     true, 
4436     true, 
4437     true
4438   };
4439 \f
4440 /* The "twos-complement" c4x format is officially defined as
4441
4442         x = s(~s).f * 2**e
4443
4444    This is rather misleading.  One must remember that F is signed.
4445    A better description would be
4446
4447         x = -1**s * ((s + 1 + .f) * 2**e
4448
4449    So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
4450    that's -1 * (1+1+(-.5)) == -1.5.  I think.
4451
4452    The constructions here are taken from Tables 5-1 and 5-2 of the
4453    TMS320C4x User's Guide wherein step-by-step instructions for
4454    conversion from IEEE are presented.  That's close enough to our
4455    internal representation so as to make things easy.
4456
4457    See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf  */
4458
4459 static void encode_c4x_single (const struct real_format *fmt,
4460                                long *, const REAL_VALUE_TYPE *);
4461 static void decode_c4x_single (const struct real_format *,
4462                                REAL_VALUE_TYPE *, const long *);
4463 static void encode_c4x_extended (const struct real_format *fmt,
4464                                  long *, const REAL_VALUE_TYPE *);
4465 static void decode_c4x_extended (const struct real_format *,
4466                                  REAL_VALUE_TYPE *, const long *);
4467
4468 static void
4469 encode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4470                    long *buf, const REAL_VALUE_TYPE *r)
4471 {
4472   unsigned long image, exp, sig;
4473
4474   switch (r->cl)
4475     {
4476     case rvc_zero:
4477       exp = -128;
4478       sig = 0;
4479       break;
4480
4481     case rvc_inf:
4482     case rvc_nan:
4483       exp = 127;
4484       sig = 0x800000 - r->sign;
4485       break;
4486
4487     case rvc_normal:
4488       exp = REAL_EXP (r) - 1;
4489       sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4490       if (r->sign)
4491         {
4492           if (sig)
4493             sig = -sig;
4494           else
4495             exp--;
4496           sig |= 0x800000;
4497         }
4498       break;
4499
4500     default:
4501       gcc_unreachable ();
4502     }
4503
4504   image = ((exp & 0xff) << 24) | (sig & 0xffffff);
4505   buf[0] = image;
4506 }
4507
4508 static void
4509 decode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4510                    REAL_VALUE_TYPE *r, const long *buf)
4511 {
4512   unsigned long image = buf[0];
4513   unsigned long sig;
4514   int exp, sf;
4515
4516   exp = (((image >> 24) & 0xff) ^ 0x80) - 0x80;
4517   sf = ((image & 0xffffff) ^ 0x800000) - 0x800000;
4518
4519   memset (r, 0, sizeof (*r));
4520
4521   if (exp != -128)
4522     {
4523       r->cl = rvc_normal;
4524
4525       sig = sf & 0x7fffff;
4526       if (sf < 0)
4527         {
4528           r->sign = 1;
4529           if (sig)
4530             sig = -sig;
4531           else
4532             exp++;
4533         }
4534       sig = (sig << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4535
4536       SET_REAL_EXP (r, exp + 1);
4537       r->sig[SIGSZ-1] = sig;
4538     }
4539 }
4540
4541 static void
4542 encode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4543                      long *buf, const REAL_VALUE_TYPE *r)
4544 {
4545   unsigned long exp, sig;
4546
4547   switch (r->cl)
4548     {
4549     case rvc_zero:
4550       exp = -128;
4551       sig = 0;
4552       break;
4553
4554     case rvc_inf:
4555     case rvc_nan:
4556       exp = 127;
4557       sig = 0x80000000 - r->sign;
4558       break;
4559
4560     case rvc_normal:
4561       exp = REAL_EXP (r) - 1;
4562
4563       sig = r->sig[SIGSZ-1];
4564       if (HOST_BITS_PER_LONG == 64)
4565         sig = sig >> 1 >> 31;
4566       sig &= 0x7fffffff;
4567
4568       if (r->sign)
4569         {
4570           if (sig)
4571             sig = -sig;
4572           else
4573             exp--;
4574           sig |= 0x80000000;
4575         }
4576       break;
4577
4578     default:
4579       gcc_unreachable ();
4580     }
4581
4582   exp = (exp & 0xff) << 24;
4583   sig &= 0xffffffff;
4584
4585   if (FLOAT_WORDS_BIG_ENDIAN)
4586     buf[0] = exp, buf[1] = sig;
4587   else
4588     buf[0] = sig, buf[0] = exp;
4589 }
4590
4591 static void
4592 decode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4593                      REAL_VALUE_TYPE *r, const long *buf)
4594 {
4595   unsigned long sig;
4596   int exp, sf;
4597
4598   if (FLOAT_WORDS_BIG_ENDIAN)
4599     exp = buf[0], sf = buf[1];
4600   else
4601     sf = buf[0], exp = buf[1];
4602
4603   exp = (((exp >> 24) & 0xff) & 0x80) - 0x80;
4604   sf = ((sf & 0xffffffff) ^ 0x80000000) - 0x80000000;
4605
4606   memset (r, 0, sizeof (*r));
4607
4608   if (exp != -128)
4609     {
4610       r->cl = rvc_normal;
4611
4612       sig = sf & 0x7fffffff;
4613       if (sf < 0)
4614         {
4615           r->sign = 1;
4616           if (sig)
4617             sig = -sig;
4618           else
4619             exp++;
4620         }
4621       if (HOST_BITS_PER_LONG == 64)
4622         sig = sig << 1 << 31;
4623       sig |= SIG_MSB;
4624
4625       SET_REAL_EXP (r, exp + 1);
4626       r->sig[SIGSZ-1] = sig;
4627     }
4628 }
4629
4630 const struct real_format c4x_single_format =
4631   {
4632     encode_c4x_single,
4633     decode_c4x_single,
4634     2,
4635     1,
4636     24,
4637     24,
4638     -126,
4639     128,
4640     23,
4641     -1,
4642     false,
4643     false,
4644     false,
4645     false,
4646     false
4647   };
4648
4649 const struct real_format c4x_extended_format =
4650   {
4651     encode_c4x_extended,
4652     decode_c4x_extended,
4653     2,
4654     1,
4655     32,
4656     32,
4657     -126,
4658     128,
4659     31,
4660     -1,
4661     false,
4662     false,
4663     false,
4664     false,
4665     false
4666   };
4667
4668 \f
4669 /* A synthetic "format" for internal arithmetic.  It's the size of the
4670    internal significand minus the two bits needed for proper rounding.
4671    The encode and decode routines exist only to satisfy our paranoia
4672    harness.  */
4673
4674 static void encode_internal (const struct real_format *fmt,
4675                              long *, const REAL_VALUE_TYPE *);
4676 static void decode_internal (const struct real_format *,
4677                              REAL_VALUE_TYPE *, const long *);
4678
4679 static void
4680 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4681                  const REAL_VALUE_TYPE *r)
4682 {
4683   memcpy (buf, r, sizeof (*r));
4684 }
4685
4686 static void
4687 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4688                  REAL_VALUE_TYPE *r, const long *buf)
4689 {
4690   memcpy (r, buf, sizeof (*r));
4691 }
4692
4693 const struct real_format real_internal_format =
4694   {
4695     encode_internal,
4696     decode_internal,
4697     2,
4698     1,
4699     SIGNIFICAND_BITS - 2,
4700     SIGNIFICAND_BITS - 2,
4701     -MAX_EXP,
4702     MAX_EXP,
4703     -1,
4704     -1,
4705     true,
4706     true,
4707     false,
4708     true,
4709     true
4710   };
4711 \f
4712 /* Calculate the square root of X in mode MODE, and store the result
4713    in R.  Return TRUE if the operation does not raise an exception.
4714    For details see "High Precision Division and Square Root",
4715    Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June
4716    1993.  http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf.  */
4717
4718 bool
4719 real_sqrt (REAL_VALUE_TYPE *r, enum machine_mode mode,
4720            const REAL_VALUE_TYPE *x)
4721 {
4722   static REAL_VALUE_TYPE halfthree;
4723   static bool init = false;
4724   REAL_VALUE_TYPE h, t, i;
4725   int iter, exp;
4726
4727   /* sqrt(-0.0) is -0.0.  */
4728   if (real_isnegzero (x))
4729     {
4730       *r = *x;
4731       return false;
4732     }
4733
4734   /* Negative arguments return NaN.  */
4735   if (real_isneg (x))
4736     {
4737       get_canonical_qnan (r, 0);
4738       return false;
4739     }
4740
4741   /* Infinity and NaN return themselves.  */
4742   if (real_isinf (x) || real_isnan (x))
4743     {
4744       *r = *x;
4745       return false;
4746     }
4747
4748   if (!init)
4749     {
4750       do_add (&halfthree, &dconst1, &dconsthalf, 0);
4751       init = true;
4752     }
4753
4754   /* Initial guess for reciprocal sqrt, i.  */
4755   exp = real_exponent (x);
4756   real_ldexp (&i, &dconst1, -exp/2);
4757
4758   /* Newton's iteration for reciprocal sqrt, i.  */
4759   for (iter = 0; iter < 16; iter++)
4760     {
4761       /* i(n+1) = i(n) * (1.5 - 0.5*i(n)*i(n)*x).  */
4762       do_multiply (&t, x, &i);
4763       do_multiply (&h, &t, &i);
4764       do_multiply (&t, &h, &dconsthalf);
4765       do_add (&h, &halfthree, &t, 1);
4766       do_multiply (&t, &i, &h);
4767
4768       /* Check for early convergence.  */
4769       if (iter >= 6 && real_identical (&i, &t))
4770         break;
4771
4772       /* ??? Unroll loop to avoid copying.  */
4773       i = t;
4774     }
4775
4776   /* Final iteration: r = i*x + 0.5*i*x*(1.0 - i*(i*x)).  */
4777   do_multiply (&t, x, &i);
4778   do_multiply (&h, &t, &i);
4779   do_add (&i, &dconst1, &h, 1);
4780   do_multiply (&h, &t, &i);
4781   do_multiply (&i, &dconsthalf, &h);
4782   do_add (&h, &t, &i, 0);
4783
4784   /* ??? We need a Tuckerman test to get the last bit.  */
4785
4786   real_convert (r, mode, &h);
4787   return true;
4788 }
4789
4790 /* Calculate X raised to the integer exponent N in mode MODE and store
4791    the result in R.  Return true if the result may be inexact due to
4792    loss of precision.  The algorithm is the classic "left-to-right binary
4793    method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4794    Algorithms", "The Art of Computer Programming", Volume 2.  */
4795
4796 bool
4797 real_powi (REAL_VALUE_TYPE *r, enum machine_mode mode,
4798            const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4799 {
4800   unsigned HOST_WIDE_INT bit;
4801   REAL_VALUE_TYPE t;
4802   bool inexact = false;
4803   bool init = false;
4804   bool neg;
4805   int i;
4806
4807   if (n == 0)
4808     {
4809       *r = dconst1;
4810       return false;
4811     }
4812   else if (n < 0)
4813     {
4814       /* Don't worry about overflow, from now on n is unsigned.  */
4815       neg = true;
4816       n = -n;
4817     }
4818   else
4819     neg = false;
4820
4821   t = *x;
4822   bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4823   for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4824     {
4825       if (init)
4826         {
4827           inexact |= do_multiply (&t, &t, &t);
4828           if (n & bit)
4829             inexact |= do_multiply (&t, &t, x);
4830         }
4831       else if (n & bit)
4832         init = true;
4833       bit >>= 1;
4834     }
4835
4836   if (neg)
4837     inexact |= do_divide (&t, &dconst1, &t);
4838
4839   real_convert (r, mode, &t);
4840   return inexact;
4841 }
4842
4843 /* Round X to the nearest integer not larger in absolute value, i.e.
4844    towards zero, placing the result in R in mode MODE.  */
4845
4846 void
4847 real_trunc (REAL_VALUE_TYPE *r, enum machine_mode mode,
4848             const REAL_VALUE_TYPE *x)
4849 {
4850   do_fix_trunc (r, x);
4851   if (mode != VOIDmode)
4852     real_convert (r, mode, r);
4853 }
4854
4855 /* Round X to the largest integer not greater in value, i.e. round
4856    down, placing the result in R in mode MODE.  */
4857
4858 void
4859 real_floor (REAL_VALUE_TYPE *r, enum machine_mode mode,
4860             const REAL_VALUE_TYPE *x)
4861 {
4862   REAL_VALUE_TYPE t;
4863
4864   do_fix_trunc (&t, x);
4865   if (! real_identical (&t, x) && x->sign)
4866     do_add (&t, &t, &dconstm1, 0);
4867   if (mode != VOIDmode)
4868     real_convert (r, mode, &t);
4869   else
4870     *r = t;
4871 }
4872
4873 /* Round X to the smallest integer not less then argument, i.e. round
4874    up, placing the result in R in mode MODE.  */
4875
4876 void
4877 real_ceil (REAL_VALUE_TYPE *r, enum machine_mode mode,
4878            const REAL_VALUE_TYPE *x)
4879 {
4880   REAL_VALUE_TYPE t;
4881
4882   do_fix_trunc (&t, x);
4883   if (! real_identical (&t, x) && ! x->sign)
4884     do_add (&t, &t, &dconst1, 0);
4885   if (mode != VOIDmode)
4886     real_convert (r, mode, &t);
4887   else
4888     *r = t;
4889 }
4890
4891 /* Round X to the nearest integer, but round halfway cases away from
4892    zero.  */
4893
4894 void
4895 real_round (REAL_VALUE_TYPE *r, enum machine_mode mode,
4896             const REAL_VALUE_TYPE *x)
4897 {
4898   do_add (r, x, &dconsthalf, x->sign);
4899   do_fix_trunc (r, r);
4900   if (mode != VOIDmode)
4901     real_convert (r, mode, r);
4902 }
4903
4904 /* Set the sign of R to the sign of X.  */
4905
4906 void
4907 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
4908 {
4909   r->sign = x->sign;
4910 }
4911