OSDN Git Service

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