OSDN Git Service

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