OSDN Git Service

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