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