OSDN Git Service

* timevar.def (TV_SCEV_CONST): New timevar.
[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   /* Zero out the remaining fields.  */
644   r->signalling = 0;
645   r->canonical = 0;
646
647   /* Re-normalize the result.  */
648   normalize (r);
649
650   /* Special case: if the subtraction results in zero, the result
651      is positive.  */
652   if (r->cl == rvc_zero)
653     r->sign = 0;
654   else
655     r->sig[0] |= inexact;
656
657   return inexact;
658 }
659
660 /* Calculate R = A * B.  Return true if the result may be inexact.  */
661
662 static bool
663 do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
664              const REAL_VALUE_TYPE *b)
665 {
666   REAL_VALUE_TYPE u, t, *rr;
667   unsigned int i, j, k;
668   int sign = a->sign ^ b->sign;
669   bool inexact = false;
670
671   switch (CLASS2 (a->cl, b->cl))
672     {
673     case CLASS2 (rvc_zero, rvc_zero):
674     case CLASS2 (rvc_zero, rvc_normal):
675     case CLASS2 (rvc_normal, rvc_zero):
676       /* +-0 * ANY = 0 with appropriate sign.  */
677       get_zero (r, sign);
678       return false;
679
680     case CLASS2 (rvc_zero, rvc_nan):
681     case CLASS2 (rvc_normal, rvc_nan):
682     case CLASS2 (rvc_inf, rvc_nan):
683     case CLASS2 (rvc_nan, rvc_nan):
684       /* ANY * NaN = NaN.  */
685       *r = *b;
686       r->sign = sign;
687       return false;
688
689     case CLASS2 (rvc_nan, rvc_zero):
690     case CLASS2 (rvc_nan, rvc_normal):
691     case CLASS2 (rvc_nan, rvc_inf):
692       /* NaN * ANY = NaN.  */
693       *r = *a;
694       r->sign = sign;
695       return false;
696
697     case CLASS2 (rvc_zero, rvc_inf):
698     case CLASS2 (rvc_inf, rvc_zero):
699       /* 0 * Inf = NaN */
700       get_canonical_qnan (r, sign);
701       return false;
702
703     case CLASS2 (rvc_inf, rvc_inf):
704     case CLASS2 (rvc_normal, rvc_inf):
705     case CLASS2 (rvc_inf, rvc_normal):
706       /* Inf * Inf = Inf, R * Inf = Inf */
707       get_inf (r, sign);
708       return false;
709
710     case CLASS2 (rvc_normal, rvc_normal):
711       break;
712
713     default:
714       gcc_unreachable ();
715     }
716
717   if (r == a || r == b)
718     rr = &t;
719   else
720     rr = r;
721   get_zero (rr, 0);
722
723   /* Collect all the partial products.  Since we don't have sure access
724      to a widening multiply, we split each long into two half-words.
725
726      Consider the long-hand form of a four half-word multiplication:
727
728                  A  B  C  D
729               *  E  F  G  H
730              --------------
731                 DE DF DG DH
732              CE CF CG CH
733           BE BF BG BH
734        AE AF AG AH
735
736      We construct partial products of the widened half-word products
737      that are known to not overlap, e.g. DF+DH.  Each such partial
738      product is given its proper exponent, which allows us to sum them
739      and obtain the finished product.  */
740
741   for (i = 0; i < SIGSZ * 2; ++i)
742     {
743       unsigned long ai = a->sig[i / 2];
744       if (i & 1)
745         ai >>= HOST_BITS_PER_LONG / 2;
746       else
747         ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
748
749       if (ai == 0)
750         continue;
751
752       for (j = 0; j < 2; ++j)
753         {
754           int exp = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
755                      + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2)));
756
757           if (exp > MAX_EXP)
758             {
759               get_inf (r, sign);
760               return true;
761             }
762           if (exp < -MAX_EXP)
763             {
764               /* Would underflow to zero, which we shouldn't bother adding.  */
765               inexact = true;
766               continue;
767             }
768
769           memset (&u, 0, sizeof (u));
770           u.cl = rvc_normal;
771           SET_REAL_EXP (&u, exp);
772
773           for (k = j; k < SIGSZ * 2; k += 2)
774             {
775               unsigned long bi = b->sig[k / 2];
776               if (k & 1)
777                 bi >>= HOST_BITS_PER_LONG / 2;
778               else
779                 bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
780
781               u.sig[k / 2] = ai * bi;
782             }
783
784           normalize (&u);
785           inexact |= do_add (rr, rr, &u, 0);
786         }
787     }
788
789   rr->sign = sign;
790   if (rr != r)
791     *r = t;
792
793   return inexact;
794 }
795
796 /* Calculate R = A / B.  Return true if the result may be inexact.  */
797
798 static bool
799 do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
800            const REAL_VALUE_TYPE *b)
801 {
802   int exp, sign = a->sign ^ b->sign;
803   REAL_VALUE_TYPE t, *rr;
804   bool inexact;
805
806   switch (CLASS2 (a->cl, b->cl))
807     {
808     case CLASS2 (rvc_zero, rvc_zero):
809       /* 0 / 0 = NaN.  */
810     case CLASS2 (rvc_inf, rvc_inf):
811       /* Inf / Inf = NaN.  */
812       get_canonical_qnan (r, sign);
813       return false;
814
815     case CLASS2 (rvc_zero, rvc_normal):
816     case CLASS2 (rvc_zero, rvc_inf):
817       /* 0 / ANY = 0.  */
818     case CLASS2 (rvc_normal, rvc_inf):
819       /* R / Inf = 0.  */
820       get_zero (r, sign);
821       return false;
822
823     case CLASS2 (rvc_normal, rvc_zero):
824       /* R / 0 = Inf.  */
825     case CLASS2 (rvc_inf, rvc_zero):
826       /* Inf / 0 = Inf.  */
827       get_inf (r, sign);
828       return false;
829
830     case CLASS2 (rvc_zero, rvc_nan):
831     case CLASS2 (rvc_normal, rvc_nan):
832     case CLASS2 (rvc_inf, rvc_nan):
833     case CLASS2 (rvc_nan, rvc_nan):
834       /* ANY / NaN = NaN.  */
835       *r = *b;
836       r->sign = sign;
837       return false;
838
839     case CLASS2 (rvc_nan, rvc_zero):
840     case CLASS2 (rvc_nan, rvc_normal):
841     case CLASS2 (rvc_nan, rvc_inf):
842       /* NaN / ANY = NaN.  */
843       *r = *a;
844       r->sign = sign;
845       return false;
846
847     case CLASS2 (rvc_inf, rvc_normal):
848       /* Inf / R = Inf.  */
849       get_inf (r, sign);
850       return false;
851
852     case CLASS2 (rvc_normal, rvc_normal):
853       break;
854
855     default:
856       gcc_unreachable ();
857     }
858
859   if (r == a || r == b)
860     rr = &t;
861   else
862     rr = r;
863
864   /* Make sure all fields in the result are initialized.  */
865   get_zero (rr, 0);
866   rr->cl = rvc_normal;
867   rr->sign = sign;
868
869   exp = REAL_EXP (a) - REAL_EXP (b) + 1;
870   if (exp > MAX_EXP)
871     {
872       get_inf (r, sign);
873       return true;
874     }
875   if (exp < -MAX_EXP)
876     {
877       get_zero (r, sign);
878       return true;
879     }
880   SET_REAL_EXP (rr, exp);
881
882   inexact = div_significands (rr, a, b);
883
884   /* Re-normalize the result.  */
885   normalize (rr);
886   rr->sig[0] |= inexact;
887
888   if (rr != r)
889     *r = t;
890
891   return inexact;
892 }
893
894 /* Return a tri-state comparison of A vs B.  Return NAN_RESULT if
895    one of the two operands is a NaN.  */
896
897 static int
898 do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
899             int nan_result)
900 {
901   int ret;
902
903   switch (CLASS2 (a->cl, b->cl))
904     {
905     case CLASS2 (rvc_zero, rvc_zero):
906       /* Sign of zero doesn't matter for compares.  */
907       return 0;
908
909     case CLASS2 (rvc_inf, rvc_zero):
910     case CLASS2 (rvc_inf, rvc_normal):
911     case CLASS2 (rvc_normal, rvc_zero):
912       return (a->sign ? -1 : 1);
913
914     case CLASS2 (rvc_inf, rvc_inf):
915       return -a->sign - -b->sign;
916
917     case CLASS2 (rvc_zero, rvc_normal):
918     case CLASS2 (rvc_zero, rvc_inf):
919     case CLASS2 (rvc_normal, rvc_inf):
920       return (b->sign ? 1 : -1);
921
922     case CLASS2 (rvc_zero, rvc_nan):
923     case CLASS2 (rvc_normal, rvc_nan):
924     case CLASS2 (rvc_inf, rvc_nan):
925     case CLASS2 (rvc_nan, rvc_nan):
926     case CLASS2 (rvc_nan, rvc_zero):
927     case CLASS2 (rvc_nan, rvc_normal):
928     case CLASS2 (rvc_nan, rvc_inf):
929       return nan_result;
930
931     case CLASS2 (rvc_normal, rvc_normal):
932       break;
933
934     default:
935       gcc_unreachable ();
936     }
937
938   if (a->sign != b->sign)
939     return -a->sign - -b->sign;
940
941   if (REAL_EXP (a) > REAL_EXP (b))
942     ret = 1;
943   else if (REAL_EXP (a) < REAL_EXP (b))
944     ret = -1;
945   else
946     ret = cmp_significands (a, b);
947
948   return (a->sign ? -ret : ret);
949 }
950
951 /* Return A truncated to an integral value toward zero.  */
952
953 static void
954 do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
955 {
956   *r = *a;
957
958   switch (r->cl)
959     {
960     case rvc_zero:
961     case rvc_inf:
962     case rvc_nan:
963       break;
964
965     case rvc_normal:
966       if (REAL_EXP (r) <= 0)
967         get_zero (r, r->sign);
968       else if (REAL_EXP (r) < SIGNIFICAND_BITS)
969         clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r));
970       break;
971
972     default:
973       gcc_unreachable ();
974     }
975 }
976
977 /* Perform the binary or unary operation described by CODE.
978    For a unary operation, leave OP1 NULL.  This function returns
979    true if the result may be inexact due to loss of precision.  */
980
981 bool
982 real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
983                  const REAL_VALUE_TYPE *op1)
984 {
985   enum tree_code code = icode;
986
987   switch (code)
988     {
989     case PLUS_EXPR:
990       return do_add (r, op0, op1, 0);
991
992     case MINUS_EXPR:
993       return do_add (r, op0, op1, 1);
994
995     case MULT_EXPR:
996       return do_multiply (r, op0, op1);
997
998     case RDIV_EXPR:
999       return do_divide (r, op0, op1);
1000
1001     case MIN_EXPR:
1002       if (op1->cl == rvc_nan)
1003         *r = *op1;
1004       else if (do_compare (op0, op1, -1) < 0)
1005         *r = *op0;
1006       else
1007         *r = *op1;
1008       break;
1009
1010     case MAX_EXPR:
1011       if (op1->cl == rvc_nan)
1012         *r = *op1;
1013       else if (do_compare (op0, op1, 1) < 0)
1014         *r = *op1;
1015       else
1016         *r = *op0;
1017       break;
1018
1019     case NEGATE_EXPR:
1020       *r = *op0;
1021       r->sign ^= 1;
1022       break;
1023
1024     case ABS_EXPR:
1025       *r = *op0;
1026       r->sign = 0;
1027       break;
1028
1029     case FIX_TRUNC_EXPR:
1030       do_fix_trunc (r, op0);
1031       break;
1032
1033     default:
1034       gcc_unreachable ();
1035     }
1036   return false;
1037 }
1038
1039 /* Legacy.  Similar, but return the result directly.  */
1040
1041 REAL_VALUE_TYPE
1042 real_arithmetic2 (int icode, const REAL_VALUE_TYPE *op0,
1043                   const REAL_VALUE_TYPE *op1)
1044 {
1045   REAL_VALUE_TYPE r;
1046   real_arithmetic (&r, icode, op0, op1);
1047   return r;
1048 }
1049
1050 bool
1051 real_compare (int icode, const REAL_VALUE_TYPE *op0,
1052               const REAL_VALUE_TYPE *op1)
1053 {
1054   enum tree_code code = icode;
1055
1056   switch (code)
1057     {
1058     case LT_EXPR:
1059       return do_compare (op0, op1, 1) < 0;
1060     case LE_EXPR:
1061       return do_compare (op0, op1, 1) <= 0;
1062     case GT_EXPR:
1063       return do_compare (op0, op1, -1) > 0;
1064     case GE_EXPR:
1065       return do_compare (op0, op1, -1) >= 0;
1066     case EQ_EXPR:
1067       return do_compare (op0, op1, -1) == 0;
1068     case NE_EXPR:
1069       return do_compare (op0, op1, -1) != 0;
1070     case UNORDERED_EXPR:
1071       return op0->cl == rvc_nan || op1->cl == rvc_nan;
1072     case ORDERED_EXPR:
1073       return op0->cl != rvc_nan && op1->cl != rvc_nan;
1074     case UNLT_EXPR:
1075       return do_compare (op0, op1, -1) < 0;
1076     case UNLE_EXPR:
1077       return do_compare (op0, op1, -1) <= 0;
1078     case UNGT_EXPR:
1079       return do_compare (op0, op1, 1) > 0;
1080     case UNGE_EXPR:
1081       return do_compare (op0, op1, 1) >= 0;
1082     case UNEQ_EXPR:
1083       return do_compare (op0, op1, 0) == 0;
1084     case LTGT_EXPR:
1085       return do_compare (op0, op1, 0) != 0;
1086
1087     default:
1088       gcc_unreachable ();
1089     }
1090 }
1091
1092 /* Return floor log2(R).  */
1093
1094 int
1095 real_exponent (const REAL_VALUE_TYPE *r)
1096 {
1097   switch (r->cl)
1098     {
1099     case rvc_zero:
1100       return 0;
1101     case rvc_inf:
1102     case rvc_nan:
1103       return (unsigned int)-1 >> 1;
1104     case rvc_normal:
1105       return REAL_EXP (r);
1106     default:
1107       gcc_unreachable ();
1108     }
1109 }
1110
1111 /* R = OP0 * 2**EXP.  */
1112
1113 void
1114 real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
1115 {
1116   *r = *op0;
1117   switch (r->cl)
1118     {
1119     case rvc_zero:
1120     case rvc_inf:
1121     case rvc_nan:
1122       break;
1123
1124     case rvc_normal:
1125       exp += REAL_EXP (op0);
1126       if (exp > MAX_EXP)
1127         get_inf (r, r->sign);
1128       else if (exp < -MAX_EXP)
1129         get_zero (r, r->sign);
1130       else
1131         SET_REAL_EXP (r, exp);
1132       break;
1133
1134     default:
1135       gcc_unreachable ();
1136     }
1137 }
1138
1139 /* Determine whether a floating-point value X is infinite.  */
1140
1141 bool
1142 real_isinf (const REAL_VALUE_TYPE *r)
1143 {
1144   return (r->cl == rvc_inf);
1145 }
1146
1147 /* Determine whether a floating-point value X is a NaN.  */
1148
1149 bool
1150 real_isnan (const REAL_VALUE_TYPE *r)
1151 {
1152   return (r->cl == rvc_nan);
1153 }
1154
1155 /* Determine whether a floating-point value X is negative.  */
1156
1157 bool
1158 real_isneg (const REAL_VALUE_TYPE *r)
1159 {
1160   return r->sign;
1161 }
1162
1163 /* Determine whether a floating-point value X is minus zero.  */
1164
1165 bool
1166 real_isnegzero (const REAL_VALUE_TYPE *r)
1167 {
1168   return r->sign && r->cl == rvc_zero;
1169 }
1170
1171 /* Compare two floating-point objects for bitwise identity.  */
1172
1173 bool
1174 real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
1175 {
1176   int i;
1177
1178   if (a->cl != b->cl)
1179     return false;
1180   if (a->sign != b->sign)
1181     return false;
1182
1183   switch (a->cl)
1184     {
1185     case rvc_zero:
1186     case rvc_inf:
1187       return true;
1188
1189     case rvc_normal:
1190       if (REAL_EXP (a) != REAL_EXP (b))
1191         return false;
1192       break;
1193
1194     case rvc_nan:
1195       if (a->signalling != b->signalling)
1196         return false;
1197       /* The significand is ignored for canonical NaNs.  */
1198       if (a->canonical || b->canonical)
1199         return a->canonical == b->canonical;
1200       break;
1201
1202     default:
1203       gcc_unreachable ();
1204     }
1205
1206   for (i = 0; i < SIGSZ; ++i)
1207     if (a->sig[i] != b->sig[i])
1208       return false;
1209
1210   return true;
1211 }
1212
1213 /* Try to change R into its exact multiplicative inverse in machine
1214    mode MODE.  Return true if successful.  */
1215
1216 bool
1217 exact_real_inverse (enum machine_mode mode, REAL_VALUE_TYPE *r)
1218 {
1219   const REAL_VALUE_TYPE *one = real_digit (1);
1220   REAL_VALUE_TYPE u;
1221   int i;
1222
1223   if (r->cl != rvc_normal)
1224     return false;
1225
1226   /* Check for a power of two: all significand bits zero except the MSB.  */
1227   for (i = 0; i < SIGSZ-1; ++i)
1228     if (r->sig[i] != 0)
1229       return false;
1230   if (r->sig[SIGSZ-1] != SIG_MSB)
1231     return false;
1232
1233   /* Find the inverse and truncate to the required mode.  */
1234   do_divide (&u, one, r);
1235   real_convert (&u, mode, &u);
1236
1237   /* The rounding may have overflowed.  */
1238   if (u.cl != rvc_normal)
1239     return false;
1240   for (i = 0; i < SIGSZ-1; ++i)
1241     if (u.sig[i] != 0)
1242       return false;
1243   if (u.sig[SIGSZ-1] != SIG_MSB)
1244     return false;
1245
1246   *r = u;
1247   return true;
1248 }
1249 \f
1250 /* Render R as an integer.  */
1251
1252 HOST_WIDE_INT
1253 real_to_integer (const REAL_VALUE_TYPE *r)
1254 {
1255   unsigned HOST_WIDE_INT i;
1256
1257   switch (r->cl)
1258     {
1259     case rvc_zero:
1260     underflow:
1261       return 0;
1262
1263     case rvc_inf:
1264     case rvc_nan:
1265     overflow:
1266       i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1267       if (!r->sign)
1268         i--;
1269       return i;
1270
1271     case rvc_normal:
1272       if (REAL_EXP (r) <= 0)
1273         goto underflow;
1274       /* Only force overflow for unsigned overflow.  Signed overflow is
1275          undefined, so it doesn't matter what we return, and some callers
1276          expect to be able to use this routine for both signed and
1277          unsigned conversions.  */
1278       if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT)
1279         goto overflow;
1280
1281       if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1282         i = r->sig[SIGSZ-1];
1283       else 
1284         {
1285           gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
1286           i = r->sig[SIGSZ-1];
1287           i = i << (HOST_BITS_PER_LONG - 1) << 1;
1288           i |= r->sig[SIGSZ-2];
1289         }
1290
1291       i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r);
1292
1293       if (r->sign)
1294         i = -i;
1295       return i;
1296
1297     default:
1298       gcc_unreachable ();
1299     }
1300 }
1301
1302 /* Likewise, but to an integer pair, HI+LOW.  */
1303
1304 void
1305 real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
1306                   const REAL_VALUE_TYPE *r)
1307 {
1308   REAL_VALUE_TYPE t;
1309   HOST_WIDE_INT low, high;
1310   int exp;
1311
1312   switch (r->cl)
1313     {
1314     case rvc_zero:
1315     underflow:
1316       low = high = 0;
1317       break;
1318
1319     case rvc_inf:
1320     case rvc_nan:
1321     overflow:
1322       high = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1323       if (r->sign)
1324         low = 0;
1325       else
1326         {
1327           high--;
1328           low = -1;
1329         }
1330       break;
1331
1332     case rvc_normal:
1333       exp = REAL_EXP (r);
1334       if (exp <= 0)
1335         goto underflow;
1336       /* Only force overflow for unsigned overflow.  Signed overflow is
1337          undefined, so it doesn't matter what we return, and some callers
1338          expect to be able to use this routine for both signed and
1339          unsigned conversions.  */
1340       if (exp > 2*HOST_BITS_PER_WIDE_INT)
1341         goto overflow;
1342
1343       rshift_significand (&t, r, 2*HOST_BITS_PER_WIDE_INT - exp);
1344       if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1345         {
1346           high = t.sig[SIGSZ-1];
1347           low = t.sig[SIGSZ-2];
1348         }
1349       else 
1350         {
1351           gcc_assert (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG);
1352           high = t.sig[SIGSZ-1];
1353           high = high << (HOST_BITS_PER_LONG - 1) << 1;
1354           high |= t.sig[SIGSZ-2];
1355
1356           low = t.sig[SIGSZ-3];
1357           low = low << (HOST_BITS_PER_LONG - 1) << 1;
1358           low |= t.sig[SIGSZ-4];
1359         }
1360
1361       if (r->sign)
1362         {
1363           if (low == 0)
1364             high = -high;
1365           else
1366             low = -low, high = ~high;
1367         }
1368       break;
1369
1370     default:
1371       gcc_unreachable ();
1372     }
1373
1374   *plow = low;
1375   *phigh = high;
1376 }
1377
1378 /* A subroutine of real_to_decimal.  Compute the quotient and remainder
1379    of NUM / DEN.  Return the quotient and place the remainder in NUM.
1380    It is expected that NUM / DEN are close enough that the quotient is
1381    small.  */
1382
1383 static unsigned long
1384 rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den)
1385 {
1386   unsigned long q, msb;
1387   int expn = REAL_EXP (num), expd = REAL_EXP (den);
1388
1389   if (expn < expd)
1390     return 0;
1391
1392   q = msb = 0;
1393   goto start;
1394   do
1395     {
1396       msb = num->sig[SIGSZ-1] & SIG_MSB;
1397       q <<= 1;
1398       lshift_significand_1 (num, num);
1399     start:
1400       if (msb || cmp_significands (num, den) >= 0)
1401         {
1402           sub_significands (num, num, den, 0);
1403           q |= 1;
1404         }
1405     }
1406   while (--expn >= expd);
1407
1408   SET_REAL_EXP (num, expd);
1409   normalize (num);
1410
1411   return q;
1412 }
1413
1414 /* Render R as a decimal floating point constant.  Emit DIGITS significant
1415    digits in the result, bounded by BUF_SIZE.  If DIGITS is 0, choose the
1416    maximum for the representation.  If CROP_TRAILING_ZEROS, strip trailing
1417    zeros.  */
1418
1419 #define M_LOG10_2       0.30102999566398119521
1420
1421 void
1422 real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
1423                  size_t digits, int crop_trailing_zeros)
1424 {
1425   const REAL_VALUE_TYPE *one, *ten;
1426   REAL_VALUE_TYPE r, pten, u, v;
1427   int dec_exp, cmp_one, digit;
1428   size_t max_digits;
1429   char *p, *first, *last;
1430   bool sign;
1431
1432   r = *r_orig;
1433   switch (r.cl)
1434     {
1435     case rvc_zero:
1436       strcpy (str, (r.sign ? "-0.0" : "0.0"));
1437       return;
1438     case rvc_normal:
1439       break;
1440     case rvc_inf:
1441       strcpy (str, (r.sign ? "-Inf" : "+Inf"));
1442       return;
1443     case rvc_nan:
1444       /* ??? Print the significand as well, if not canonical?  */
1445       strcpy (str, (r.sign ? "-NaN" : "+NaN"));
1446       return;
1447     default:
1448       gcc_unreachable ();
1449     }
1450
1451   /* Bound the number of digits printed by the size of the representation.  */
1452   max_digits = SIGNIFICAND_BITS * M_LOG10_2;
1453   if (digits == 0 || digits > max_digits)
1454     digits = max_digits;
1455
1456   /* Estimate the decimal exponent, and compute the length of the string it
1457      will print as.  Be conservative and add one to account for possible
1458      overflow or rounding error.  */
1459   dec_exp = REAL_EXP (&r) * M_LOG10_2;
1460   for (max_digits = 1; dec_exp ; max_digits++)
1461     dec_exp /= 10;
1462
1463   /* Bound the number of digits printed by the size of the output buffer.  */
1464   max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
1465   gcc_assert (max_digits <= buf_size);
1466   if (digits > max_digits)
1467     digits = max_digits;
1468
1469   one = real_digit (1);
1470   ten = ten_to_ptwo (0);
1471
1472   sign = r.sign;
1473   r.sign = 0;
1474
1475   dec_exp = 0;
1476   pten = *one;
1477
1478   cmp_one = do_compare (&r, one, 0);
1479   if (cmp_one > 0)
1480     {
1481       int m;
1482
1483       /* Number is greater than one.  Convert significand to an integer
1484          and strip trailing decimal zeros.  */
1485
1486       u = r;
1487       SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1);
1488
1489       /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS.  */
1490       m = floor_log2 (max_digits);
1491
1492       /* Iterate over the bits of the possible powers of 10 that might
1493          be present in U and eliminate them.  That is, if we find that
1494          10**2**M divides U evenly, keep the division and increase
1495          DEC_EXP by 2**M.  */
1496       do
1497         {
1498           REAL_VALUE_TYPE t;
1499
1500           do_divide (&t, &u, ten_to_ptwo (m));
1501           do_fix_trunc (&v, &t);
1502           if (cmp_significands (&v, &t) == 0)
1503             {
1504               u = t;
1505               dec_exp += 1 << m;
1506             }
1507         }
1508       while (--m >= 0);
1509
1510       /* Revert the scaling to integer that we performed earlier.  */
1511       SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r)
1512                     - (SIGNIFICAND_BITS - 1));
1513       r = u;
1514
1515       /* Find power of 10.  Do this by dividing out 10**2**M when
1516          this is larger than the current remainder.  Fill PTEN with
1517          the power of 10 that we compute.  */
1518       if (REAL_EXP (&r) > 0)
1519         {
1520           m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1;
1521           do
1522             {
1523               const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1524               if (do_compare (&u, ptentwo, 0) >= 0)
1525                 {
1526                   do_divide (&u, &u, ptentwo);
1527                   do_multiply (&pten, &pten, ptentwo);
1528                   dec_exp += 1 << m;
1529                 }
1530             }
1531           while (--m >= 0);
1532         }
1533       else
1534         /* We managed to divide off enough tens in the above reduction
1535            loop that we've now got a negative exponent.  Fall into the
1536            less-than-one code to compute the proper value for PTEN.  */
1537         cmp_one = -1;
1538     }
1539   if (cmp_one < 0)
1540     {
1541       int m;
1542
1543       /* Number is less than one.  Pad significand with leading
1544          decimal zeros.  */
1545
1546       v = r;
1547       while (1)
1548         {
1549           /* Stop if we'd shift bits off the bottom.  */
1550           if (v.sig[0] & 7)
1551             break;
1552
1553           do_multiply (&u, &v, ten);
1554
1555           /* Stop if we're now >= 1.  */
1556           if (REAL_EXP (&u) > 0)
1557             break;
1558
1559           v = u;
1560           dec_exp -= 1;
1561         }
1562       r = v;
1563
1564       /* Find power of 10.  Do this by multiplying in P=10**2**M when
1565          the current remainder is smaller than 1/P.  Fill PTEN with the
1566          power of 10 that we compute.  */
1567       m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1;
1568       do
1569         {
1570           const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
1571           const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
1572
1573           if (do_compare (&v, ptenmtwo, 0) <= 0)
1574             {
1575               do_multiply (&v, &v, ptentwo);
1576               do_multiply (&pten, &pten, ptentwo);
1577               dec_exp -= 1 << m;
1578             }
1579         }
1580       while (--m >= 0);
1581
1582       /* Invert the positive power of 10 that we've collected so far.  */
1583       do_divide (&pten, one, &pten);
1584     }
1585
1586   p = str;
1587   if (sign)
1588     *p++ = '-';
1589   first = p++;
1590
1591   /* At this point, PTEN should contain the nearest power of 10 smaller
1592      than R, such that this division produces the first digit.
1593
1594      Using a divide-step primitive that returns the complete integral
1595      remainder avoids the rounding error that would be produced if
1596      we were to use do_divide here and then simply multiply by 10 for
1597      each subsequent digit.  */
1598
1599   digit = rtd_divmod (&r, &pten);
1600
1601   /* Be prepared for error in that division via underflow ...  */
1602   if (digit == 0 && cmp_significand_0 (&r))
1603     {
1604       /* Multiply by 10 and try again.  */
1605       do_multiply (&r, &r, ten);
1606       digit = rtd_divmod (&r, &pten);
1607       dec_exp -= 1;
1608       gcc_assert (digit != 0);
1609     }
1610
1611   /* ... or overflow.  */
1612   if (digit == 10)
1613     {
1614       *p++ = '1';
1615       if (--digits > 0)
1616         *p++ = '0';
1617       dec_exp += 1;
1618     }
1619   else
1620     {
1621       gcc_assert (digit <= 10);
1622       *p++ = digit + '0';
1623     }
1624
1625   /* Generate subsequent digits.  */
1626   while (--digits > 0)
1627     {
1628       do_multiply (&r, &r, ten);
1629       digit = rtd_divmod (&r, &pten);
1630       *p++ = digit + '0';
1631     }
1632   last = p;
1633
1634   /* Generate one more digit with which to do rounding.  */
1635   do_multiply (&r, &r, ten);
1636   digit = rtd_divmod (&r, &pten);
1637
1638   /* Round the result.  */
1639   if (digit == 5)
1640     {
1641       /* Round to nearest.  If R is nonzero there are additional
1642          nonzero digits to be extracted.  */
1643       if (cmp_significand_0 (&r))
1644         digit++;
1645       /* Round to even.  */
1646       else if ((p[-1] - '0') & 1)
1647         digit++;
1648     }
1649   if (digit > 5)
1650     {
1651       while (p > first)
1652         {
1653           digit = *--p;
1654           if (digit == '9')
1655             *p = '0';
1656           else
1657             {
1658               *p = digit + 1;
1659               break;
1660             }
1661         }
1662
1663       /* Carry out of the first digit.  This means we had all 9's and
1664          now have all 0's.  "Prepend" a 1 by overwriting the first 0.  */
1665       if (p == first)
1666         {
1667           first[1] = '1';
1668           dec_exp++;
1669         }
1670     }
1671
1672   /* Insert the decimal point.  */
1673   first[0] = first[1];
1674   first[1] = '.';
1675
1676   /* If requested, drop trailing zeros.  Never crop past "1.0".  */
1677   if (crop_trailing_zeros)
1678     while (last > first + 3 && last[-1] == '0')
1679       last--;
1680
1681   /* Append the exponent.  */
1682   sprintf (last, "e%+d", dec_exp);
1683 }
1684
1685 /* Render R as a hexadecimal floating point constant.  Emit DIGITS
1686    significant digits in the result, bounded by BUF_SIZE.  If DIGITS is 0,
1687    choose the maximum for the representation.  If CROP_TRAILING_ZEROS,
1688    strip trailing zeros.  */
1689
1690 void
1691 real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
1692                      size_t digits, int crop_trailing_zeros)
1693 {
1694   int i, j, exp = REAL_EXP (r);
1695   char *p, *first;
1696   char exp_buf[16];
1697   size_t max_digits;
1698
1699   switch (r->cl)
1700     {
1701     case rvc_zero:
1702       exp = 0;
1703       break;
1704     case rvc_normal:
1705       break;
1706     case rvc_inf:
1707       strcpy (str, (r->sign ? "-Inf" : "+Inf"));
1708       return;
1709     case rvc_nan:
1710       /* ??? Print the significand as well, if not canonical?  */
1711       strcpy (str, (r->sign ? "-NaN" : "+NaN"));
1712       return;
1713     default:
1714       gcc_unreachable ();
1715     }
1716
1717   if (digits == 0)
1718     digits = SIGNIFICAND_BITS / 4;
1719
1720   /* Bound the number of digits printed by the size of the output buffer.  */
1721
1722   sprintf (exp_buf, "p%+d", exp);
1723   max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
1724   gcc_assert (max_digits <= buf_size);
1725   if (digits > max_digits)
1726     digits = max_digits;
1727
1728   p = str;
1729   if (r->sign)
1730     *p++ = '-';
1731   *p++ = '0';
1732   *p++ = 'x';
1733   *p++ = '0';
1734   *p++ = '.';
1735   first = p;
1736
1737   for (i = SIGSZ - 1; i >= 0; --i)
1738     for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
1739       {
1740         *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
1741         if (--digits == 0)
1742           goto out;
1743       }
1744
1745  out:
1746   if (crop_trailing_zeros)
1747     while (p > first + 1 && p[-1] == '0')
1748       p--;
1749
1750   sprintf (p, "p%+d", exp);
1751 }
1752
1753 /* Initialize R from a decimal or hexadecimal string.  The string is
1754    assumed to have been syntax checked already.  */
1755
1756 void
1757 real_from_string (REAL_VALUE_TYPE *r, const char *str)
1758 {
1759   int exp = 0;
1760   bool sign = false;
1761
1762   get_zero (r, 0);
1763
1764   if (*str == '-')
1765     {
1766       sign = true;
1767       str++;
1768     }
1769   else if (*str == '+')
1770     str++;
1771
1772   if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1773     {
1774       /* Hexadecimal floating point.  */
1775       int pos = SIGNIFICAND_BITS - 4, d;
1776
1777       str += 2;
1778
1779       while (*str == '0')
1780         str++;
1781       while (1)
1782         {
1783           d = hex_value (*str);
1784           if (d == _hex_bad)
1785             break;
1786           if (pos >= 0)
1787             {
1788               r->sig[pos / HOST_BITS_PER_LONG]
1789                 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1790               pos -= 4;
1791             }
1792           exp += 4;
1793           str++;
1794         }
1795       if (*str == '.')
1796         {
1797           str++;
1798           if (pos == SIGNIFICAND_BITS - 4)
1799             {
1800               while (*str == '0')
1801                 str++, exp -= 4;
1802             }
1803           while (1)
1804             {
1805               d = hex_value (*str);
1806               if (d == _hex_bad)
1807                 break;
1808               if (pos >= 0)
1809                 {
1810                   r->sig[pos / HOST_BITS_PER_LONG]
1811                     |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1812                   pos -= 4;
1813                 }
1814               str++;
1815             }
1816         }
1817       if (*str == 'p' || *str == 'P')
1818         {
1819           bool exp_neg = false;
1820
1821           str++;
1822           if (*str == '-')
1823             {
1824               exp_neg = true;
1825               str++;
1826             }
1827           else if (*str == '+')
1828             str++;
1829
1830           d = 0;
1831           while (ISDIGIT (*str))
1832             {
1833               d *= 10;
1834               d += *str - '0';
1835               if (d > MAX_EXP)
1836                 {
1837                   /* Overflowed the exponent.  */
1838                   if (exp_neg)
1839                     goto underflow;
1840                   else
1841                     goto overflow;
1842                 }
1843               str++;
1844             }
1845           if (exp_neg)
1846             d = -d;
1847
1848           exp += d;
1849         }
1850
1851       r->cl = rvc_normal;
1852       SET_REAL_EXP (r, exp);
1853
1854       normalize (r);
1855     }
1856   else
1857     {
1858       /* Decimal floating point.  */
1859       const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
1860       int d;
1861
1862       while (*str == '0')
1863         str++;
1864       while (ISDIGIT (*str))
1865         {
1866           d = *str++ - '0';
1867           do_multiply (r, r, ten);
1868           if (d)
1869             do_add (r, r, real_digit (d), 0);
1870         }
1871       if (*str == '.')
1872         {
1873           str++;
1874           if (r->cl == rvc_zero)
1875             {
1876               while (*str == '0')
1877                 str++, exp--;
1878             }
1879           while (ISDIGIT (*str))
1880             {
1881               d = *str++ - '0';
1882               do_multiply (r, r, ten);
1883               if (d)
1884                 do_add (r, r, real_digit (d), 0);
1885               exp--;
1886             }
1887         }
1888
1889       if (*str == 'e' || *str == 'E')
1890         {
1891           bool exp_neg = false;
1892
1893           str++;
1894           if (*str == '-')
1895             {
1896               exp_neg = true;
1897               str++;
1898             }
1899           else if (*str == '+')
1900             str++;
1901
1902           d = 0;
1903           while (ISDIGIT (*str))
1904             {
1905               d *= 10;
1906               d += *str - '0';
1907               if (d > MAX_EXP)
1908                 {
1909                   /* Overflowed the exponent.  */
1910                   if (exp_neg)
1911                     goto underflow;
1912                   else
1913                     goto overflow;
1914                 }
1915               str++;
1916             }
1917           if (exp_neg)
1918             d = -d;
1919           exp += d;
1920         }
1921
1922       if (exp)
1923         times_pten (r, exp);
1924     }
1925
1926   r->sign = sign;
1927   return;
1928
1929  underflow:
1930   get_zero (r, sign);
1931   return;
1932
1933  overflow:
1934   get_inf (r, sign);
1935   return;
1936 }
1937
1938 /* Legacy.  Similar, but return the result directly.  */
1939
1940 REAL_VALUE_TYPE
1941 real_from_string2 (const char *s, enum machine_mode mode)
1942 {
1943   REAL_VALUE_TYPE r;
1944
1945   real_from_string (&r, s);
1946   if (mode != VOIDmode)
1947     real_convert (&r, mode, &r);
1948
1949   return r;
1950 }
1951
1952 /* Initialize R from the integer pair HIGH+LOW.  */
1953
1954 void
1955 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
1956                    unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
1957                    int unsigned_p)
1958 {
1959   if (low == 0 && high == 0)
1960     get_zero (r, 0);
1961   else
1962     {
1963       memset (r, 0, sizeof (*r));
1964       r->cl = rvc_normal;
1965       r->sign = high < 0 && !unsigned_p;
1966       SET_REAL_EXP (r, 2 * HOST_BITS_PER_WIDE_INT);
1967
1968       if (r->sign)
1969         {
1970           high = ~high;
1971           if (low == 0)
1972             high += 1;
1973           else
1974             low = -low;
1975         }
1976
1977       if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
1978         {
1979           r->sig[SIGSZ-1] = high;
1980           r->sig[SIGSZ-2] = low;
1981         }
1982       else
1983         {
1984           gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
1985           r->sig[SIGSZ-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
1986           r->sig[SIGSZ-2] = high;
1987           r->sig[SIGSZ-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
1988           r->sig[SIGSZ-4] = low;
1989         }
1990
1991       normalize (r);
1992     }
1993
1994   if (mode != VOIDmode)
1995     real_convert (r, mode, r);
1996 }
1997
1998 /* Returns 10**2**N.  */
1999
2000 static const REAL_VALUE_TYPE *
2001 ten_to_ptwo (int n)
2002 {
2003   static REAL_VALUE_TYPE tens[EXP_BITS];
2004
2005   gcc_assert (n >= 0);
2006   gcc_assert (n < EXP_BITS);
2007
2008   if (tens[n].cl == rvc_zero)
2009     {
2010       if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2011         {
2012           HOST_WIDE_INT t = 10;
2013           int i;
2014
2015           for (i = 0; i < n; ++i)
2016             t *= t;
2017
2018           real_from_integer (&tens[n], VOIDmode, t, 0, 1);
2019         }
2020       else
2021         {
2022           const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2023           do_multiply (&tens[n], t, t);
2024         }
2025     }
2026
2027   return &tens[n];
2028 }
2029
2030 /* Returns 10**(-2**N).  */
2031
2032 static const REAL_VALUE_TYPE *
2033 ten_to_mptwo (int n)
2034 {
2035   static REAL_VALUE_TYPE tens[EXP_BITS];
2036
2037   gcc_assert (n >= 0);
2038   gcc_assert (n < EXP_BITS);
2039
2040   if (tens[n].cl == rvc_zero)
2041     do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2042
2043   return &tens[n];
2044 }
2045
2046 /* Returns N.  */
2047
2048 static const REAL_VALUE_TYPE *
2049 real_digit (int n)
2050 {
2051   static REAL_VALUE_TYPE num[10];
2052
2053   gcc_assert (n >= 0);
2054   gcc_assert (n <= 9);
2055
2056   if (n > 0 && num[n].cl == rvc_zero)
2057     real_from_integer (&num[n], VOIDmode, n, 0, 1);
2058
2059   return &num[n];
2060 }
2061
2062 /* Multiply R by 10**EXP.  */
2063
2064 static void
2065 times_pten (REAL_VALUE_TYPE *r, int exp)
2066 {
2067   REAL_VALUE_TYPE pten, *rr;
2068   bool negative = (exp < 0);
2069   int i;
2070
2071   if (negative)
2072     {
2073       exp = -exp;
2074       pten = *real_digit (1);
2075       rr = &pten;
2076     }
2077   else
2078     rr = r;
2079
2080   for (i = 0; exp > 0; ++i, exp >>= 1)
2081     if (exp & 1)
2082       do_multiply (rr, rr, ten_to_ptwo (i));
2083
2084   if (negative)
2085     do_divide (r, r, &pten);
2086 }
2087
2088 /* Fills R with +Inf.  */
2089
2090 void
2091 real_inf (REAL_VALUE_TYPE *r)
2092 {
2093   get_inf (r, 0);
2094 }
2095
2096 /* Fills R with a NaN whose significand is described by STR.  If QUIET,
2097    we force a QNaN, else we force an SNaN.  The string, if not empty,
2098    is parsed as a number and placed in the significand.  Return true
2099    if the string was successfully parsed.  */
2100
2101 bool
2102 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2103           enum machine_mode mode)
2104 {
2105   const struct real_format *fmt;
2106
2107   fmt = REAL_MODE_FORMAT (mode);
2108   gcc_assert (fmt);
2109
2110   if (*str == 0)
2111     {
2112       if (quiet)
2113         get_canonical_qnan (r, 0);
2114       else
2115         get_canonical_snan (r, 0);
2116     }
2117   else
2118     {
2119       int base = 10, d;
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++;
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     31,
2655     true,
2656     true,
2657     true,
2658     true,
2659     true
2660   };
2661
2662 const struct real_format mips_single_format =
2663   {
2664     encode_ieee_single,
2665     decode_ieee_single,
2666     2,
2667     1,
2668     24,
2669     24,
2670     -125,
2671     128,
2672     31,
2673     31,
2674     true,
2675     true,
2676     true,
2677     true,
2678     false
2679   };
2680
2681 \f
2682 /* IEEE double-precision format.  */
2683
2684 static void encode_ieee_double (const struct real_format *fmt,
2685                                 long *, const REAL_VALUE_TYPE *);
2686 static void decode_ieee_double (const struct real_format *,
2687                                 REAL_VALUE_TYPE *, const long *);
2688
2689 static void
2690 encode_ieee_double (const struct real_format *fmt, long *buf,
2691                     const REAL_VALUE_TYPE *r)
2692 {
2693   unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
2694   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2695
2696   image_hi = r->sign << 31;
2697   image_lo = 0;
2698
2699   if (HOST_BITS_PER_LONG == 64)
2700     {
2701       sig_hi = r->sig[SIGSZ-1];
2702       sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
2703       sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
2704     }
2705   else
2706     {
2707       sig_hi = r->sig[SIGSZ-1];
2708       sig_lo = r->sig[SIGSZ-2];
2709       sig_lo = (sig_hi << 21) | (sig_lo >> 11);
2710       sig_hi = (sig_hi >> 11) & 0xfffff;
2711     }
2712
2713   switch (r->cl)
2714     {
2715     case rvc_zero:
2716       break;
2717
2718     case rvc_inf:
2719       if (fmt->has_inf)
2720         image_hi |= 2047 << 20;
2721       else
2722         {
2723           image_hi |= 0x7fffffff;
2724           image_lo = 0xffffffff;
2725         }
2726       break;
2727
2728     case rvc_nan:
2729       if (fmt->has_nans)
2730         {
2731           if (r->canonical)
2732             sig_hi = sig_lo = 0;
2733           if (r->signalling == fmt->qnan_msb_set)
2734             sig_hi &= ~(1 << 19);
2735           else
2736             sig_hi |= 1 << 19;
2737           /* We overload qnan_msb_set here: it's only clear for
2738              mips_ieee_single, which wants all mantissa bits but the
2739              quiet/signalling one set in canonical NaNs (at least
2740              Quiet ones).  */
2741           if (r->canonical && !fmt->qnan_msb_set)
2742             {
2743               sig_hi |= (1 << 19) - 1;
2744               sig_lo = 0xffffffff;
2745             }
2746           else if (sig_hi == 0 && sig_lo == 0)
2747             sig_hi = 1 << 18;
2748
2749           image_hi |= 2047 << 20;
2750           image_hi |= sig_hi;
2751           image_lo = sig_lo;
2752         }
2753       else
2754         {
2755           image_hi |= 0x7fffffff;
2756           image_lo = 0xffffffff;
2757         }
2758       break;
2759
2760     case rvc_normal:
2761       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2762          whereas the intermediate representation is 0.F x 2**exp.
2763          Which means we're off by one.  */
2764       if (denormal)
2765         exp = 0;
2766       else
2767         exp = REAL_EXP (r) + 1023 - 1;
2768       image_hi |= exp << 20;
2769       image_hi |= sig_hi;
2770       image_lo = sig_lo;
2771       break;
2772
2773     default:
2774       gcc_unreachable ();
2775     }
2776
2777   if (FLOAT_WORDS_BIG_ENDIAN)
2778     buf[0] = image_hi, buf[1] = image_lo;
2779   else
2780     buf[0] = image_lo, buf[1] = image_hi;
2781 }
2782
2783 static void
2784 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2785                     const long *buf)
2786 {
2787   unsigned long image_hi, image_lo;
2788   bool sign;
2789   int exp;
2790
2791   if (FLOAT_WORDS_BIG_ENDIAN)
2792     image_hi = buf[0], image_lo = buf[1];
2793   else
2794     image_lo = buf[0], image_hi = buf[1];
2795   image_lo &= 0xffffffff;
2796   image_hi &= 0xffffffff;
2797
2798   sign = (image_hi >> 31) & 1;
2799   exp = (image_hi >> 20) & 0x7ff;
2800
2801   memset (r, 0, sizeof (*r));
2802
2803   image_hi <<= 32 - 21;
2804   image_hi |= image_lo >> 21;
2805   image_hi &= 0x7fffffff;
2806   image_lo <<= 32 - 21;
2807
2808   if (exp == 0)
2809     {
2810       if ((image_hi || image_lo) && fmt->has_denorm)
2811         {
2812           r->cl = rvc_normal;
2813           r->sign = sign;
2814           SET_REAL_EXP (r, -1022);
2815           if (HOST_BITS_PER_LONG == 32)
2816             {
2817               image_hi = (image_hi << 1) | (image_lo >> 31);
2818               image_lo <<= 1;
2819               r->sig[SIGSZ-1] = image_hi;
2820               r->sig[SIGSZ-2] = image_lo;
2821             }
2822           else
2823             {
2824               image_hi = (image_hi << 31 << 2) | (image_lo << 1);
2825               r->sig[SIGSZ-1] = image_hi;
2826             }
2827           normalize (r);
2828         }
2829       else if (fmt->has_signed_zero)
2830         r->sign = sign;
2831     }
2832   else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
2833     {
2834       if (image_hi || image_lo)
2835         {
2836           r->cl = rvc_nan;
2837           r->sign = sign;
2838           r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
2839           if (HOST_BITS_PER_LONG == 32)
2840             {
2841               r->sig[SIGSZ-1] = image_hi;
2842               r->sig[SIGSZ-2] = image_lo;
2843             }
2844           else
2845             r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
2846         }
2847       else
2848         {
2849           r->cl = rvc_inf;
2850           r->sign = sign;
2851         }
2852     }
2853   else
2854     {
2855       r->cl = rvc_normal;
2856       r->sign = sign;
2857       SET_REAL_EXP (r, exp - 1023 + 1);
2858       if (HOST_BITS_PER_LONG == 32)
2859         {
2860           r->sig[SIGSZ-1] = image_hi | SIG_MSB;
2861           r->sig[SIGSZ-2] = image_lo;
2862         }
2863       else
2864         r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
2865     }
2866 }
2867
2868 const struct real_format ieee_double_format =
2869   {
2870     encode_ieee_double,
2871     decode_ieee_double,
2872     2,
2873     1,
2874     53,
2875     53,
2876     -1021,
2877     1024,
2878     63,
2879     63,
2880     true,
2881     true,
2882     true,
2883     true,
2884     true
2885   };
2886
2887 const struct real_format mips_double_format =
2888   {
2889     encode_ieee_double,
2890     decode_ieee_double,
2891     2,
2892     1,
2893     53,
2894     53,
2895     -1021,
2896     1024,
2897     63,
2898     63,
2899     true,
2900     true,
2901     true,
2902     true,
2903     false
2904   };
2905
2906 \f
2907 /* IEEE extended real format.  This comes in three flavors: Intel's as
2908    a 12 byte image, Intel's as a 16 byte image, and Motorola's.  Intel
2909    12- and 16-byte images may be big- or little endian; Motorola's is
2910    always big endian.  */
2911
2912 /* Helper subroutine which converts from the internal format to the
2913    12-byte little-endian Intel format.  Functions below adjust this
2914    for the other possible formats.  */
2915 static void
2916 encode_ieee_extended (const struct real_format *fmt, long *buf,
2917                       const REAL_VALUE_TYPE *r)
2918 {
2919   unsigned long image_hi, sig_hi, sig_lo;
2920   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2921
2922   image_hi = r->sign << 15;
2923   sig_hi = sig_lo = 0;
2924
2925   switch (r->cl)
2926     {
2927     case rvc_zero:
2928       break;
2929
2930     case rvc_inf:
2931       if (fmt->has_inf)
2932         {
2933           image_hi |= 32767;
2934
2935           /* Intel requires the explicit integer bit to be set, otherwise
2936              it considers the value a "pseudo-infinity".  Motorola docs
2937              say it doesn't care.  */
2938           sig_hi = 0x80000000;
2939         }
2940       else
2941         {
2942           image_hi |= 32767;
2943           sig_lo = sig_hi = 0xffffffff;
2944         }
2945       break;
2946
2947     case rvc_nan:
2948       if (fmt->has_nans)
2949         {
2950           image_hi |= 32767;
2951           if (HOST_BITS_PER_LONG == 32)
2952             {
2953               sig_hi = r->sig[SIGSZ-1];
2954               sig_lo = r->sig[SIGSZ-2];
2955             }
2956           else
2957             {
2958               sig_lo = r->sig[SIGSZ-1];
2959               sig_hi = sig_lo >> 31 >> 1;
2960               sig_lo &= 0xffffffff;
2961             }
2962           if (r->signalling == fmt->qnan_msb_set)
2963             sig_hi &= ~(1 << 30);
2964           else
2965             sig_hi |= 1 << 30;
2966           if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
2967             sig_hi = 1 << 29;
2968
2969           /* Intel requires the explicit integer bit to be set, otherwise
2970              it considers the value a "pseudo-nan".  Motorola docs say it
2971              doesn't care.  */
2972           sig_hi |= 0x80000000;
2973         }
2974       else
2975         {
2976           image_hi |= 32767;
2977           sig_lo = sig_hi = 0xffffffff;
2978         }
2979       break;
2980
2981     case rvc_normal:
2982       {
2983         int exp = REAL_EXP (r);
2984
2985         /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2986            whereas the intermediate representation is 0.F x 2**exp.
2987            Which means we're off by one.
2988
2989            Except for Motorola, which consider exp=0 and explicit
2990            integer bit set to continue to be normalized.  In theory
2991            this discrepancy has been taken care of by the difference
2992            in fmt->emin in round_for_format.  */
2993
2994         if (denormal)
2995           exp = 0;
2996         else
2997           {
2998             exp += 16383 - 1;
2999             gcc_assert (exp >= 0);
3000           }
3001         image_hi |= exp;
3002
3003         if (HOST_BITS_PER_LONG == 32)
3004           {
3005             sig_hi = r->sig[SIGSZ-1];
3006             sig_lo = r->sig[SIGSZ-2];
3007           }
3008         else
3009           {
3010             sig_lo = r->sig[SIGSZ-1];
3011             sig_hi = sig_lo >> 31 >> 1;
3012             sig_lo &= 0xffffffff;
3013           }
3014       }
3015       break;
3016
3017     default:
3018       gcc_unreachable ();
3019     }
3020
3021   buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3022 }
3023
3024 /* Convert from the internal format to the 12-byte Motorola format
3025    for an IEEE extended real.  */
3026 static void
3027 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3028                                const REAL_VALUE_TYPE *r)
3029 {
3030   long intermed[3];
3031   encode_ieee_extended (fmt, intermed, r);
3032
3033   /* Motorola chips are assumed always to be big-endian.  Also, the
3034      padding in a Motorola extended real goes between the exponent and
3035      the mantissa.  At this point the mantissa is entirely within
3036      elements 0 and 1 of intermed, and the exponent entirely within
3037      element 2, so all we have to do is swap the order around, and
3038      shift element 2 left 16 bits.  */
3039   buf[0] = intermed[2] << 16;
3040   buf[1] = intermed[1];
3041   buf[2] = intermed[0];
3042 }
3043
3044 /* Convert from the internal format to the 12-byte Intel format for
3045    an IEEE extended real.  */
3046 static void
3047 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3048                                const REAL_VALUE_TYPE *r)
3049 {
3050   if (FLOAT_WORDS_BIG_ENDIAN)
3051     {
3052       /* All the padding in an Intel-format extended real goes at the high
3053          end, which in this case is after the mantissa, not the exponent.
3054          Therefore we must shift everything down 16 bits.  */
3055       long intermed[3];
3056       encode_ieee_extended (fmt, intermed, r);
3057       buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3058       buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3059       buf[2] =  (intermed[0] << 16);
3060     }
3061   else
3062     /* encode_ieee_extended produces what we want directly.  */
3063     encode_ieee_extended (fmt, buf, r);
3064 }
3065
3066 /* Convert from the internal format to the 16-byte Intel format for
3067    an IEEE extended real.  */
3068 static void
3069 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3070                                 const REAL_VALUE_TYPE *r)
3071 {
3072   /* All the padding in an Intel-format extended real goes at the high end.  */
3073   encode_ieee_extended_intel_96 (fmt, buf, r);
3074   buf[3] = 0;
3075 }
3076
3077 /* As above, we have a helper function which converts from 12-byte
3078    little-endian Intel format to internal format.  Functions below
3079    adjust for the other possible formats.  */
3080 static void
3081 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3082                       const long *buf)
3083 {
3084   unsigned long image_hi, sig_hi, sig_lo;
3085   bool sign;
3086   int exp;
3087
3088   sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3089   sig_lo &= 0xffffffff;
3090   sig_hi &= 0xffffffff;
3091   image_hi &= 0xffffffff;
3092
3093   sign = (image_hi >> 15) & 1;
3094   exp = image_hi & 0x7fff;
3095
3096   memset (r, 0, sizeof (*r));
3097
3098   if (exp == 0)
3099     {
3100       if ((sig_hi || sig_lo) && fmt->has_denorm)
3101         {
3102           r->cl = rvc_normal;
3103           r->sign = sign;
3104
3105           /* When the IEEE format contains a hidden bit, we know that
3106              it's zero at this point, and so shift up the significand
3107              and decrease the exponent to match.  In this case, Motorola
3108              defines the explicit integer bit to be valid, so we don't
3109              know whether the msb is set or not.  */
3110           SET_REAL_EXP (r, fmt->emin);
3111           if (HOST_BITS_PER_LONG == 32)
3112             {
3113               r->sig[SIGSZ-1] = sig_hi;
3114               r->sig[SIGSZ-2] = sig_lo;
3115             }
3116           else
3117             r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3118
3119           normalize (r);
3120         }
3121       else if (fmt->has_signed_zero)
3122         r->sign = sign;
3123     }
3124   else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3125     {
3126       /* See above re "pseudo-infinities" and "pseudo-nans".
3127          Short summary is that the MSB will likely always be
3128          set, and that we don't care about it.  */
3129       sig_hi &= 0x7fffffff;
3130
3131       if (sig_hi || sig_lo)
3132         {
3133           r->cl = rvc_nan;
3134           r->sign = sign;
3135           r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3136           if (HOST_BITS_PER_LONG == 32)
3137             {
3138               r->sig[SIGSZ-1] = sig_hi;
3139               r->sig[SIGSZ-2] = sig_lo;
3140             }
3141           else
3142             r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3143         }
3144       else
3145         {
3146           r->cl = rvc_inf;
3147           r->sign = sign;
3148         }
3149     }
3150   else
3151     {
3152       r->cl = rvc_normal;
3153       r->sign = sign;
3154       SET_REAL_EXP (r, exp - 16383 + 1);
3155       if (HOST_BITS_PER_LONG == 32)
3156         {
3157           r->sig[SIGSZ-1] = sig_hi;
3158           r->sig[SIGSZ-2] = sig_lo;
3159         }
3160       else
3161         r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3162     }
3163 }
3164
3165 /* Convert from the internal format to the 12-byte Motorola format
3166    for an IEEE extended real.  */
3167 static void
3168 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3169                                const long *buf)
3170 {
3171   long intermed[3];
3172
3173   /* Motorola chips are assumed always to be big-endian.  Also, the
3174      padding in a Motorola extended real goes between the exponent and
3175      the mantissa; remove it.  */
3176   intermed[0] = buf[2];
3177   intermed[1] = buf[1];
3178   intermed[2] = (unsigned long)buf[0] >> 16;
3179
3180   decode_ieee_extended (fmt, r, intermed);
3181 }
3182
3183 /* Convert from the internal format to the 12-byte Intel format for
3184    an IEEE extended real.  */
3185 static void
3186 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3187                                const long *buf)
3188 {
3189   if (FLOAT_WORDS_BIG_ENDIAN)
3190     {
3191       /* All the padding in an Intel-format extended real goes at the high
3192          end, which in this case is after the mantissa, not the exponent.
3193          Therefore we must shift everything up 16 bits.  */
3194       long intermed[3];
3195
3196       intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3197       intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3198       intermed[2] =  ((unsigned long)buf[0] >> 16);
3199
3200       decode_ieee_extended (fmt, r, intermed);
3201     }
3202   else
3203     /* decode_ieee_extended produces what we want directly.  */
3204     decode_ieee_extended (fmt, r, buf);
3205 }
3206
3207 /* Convert from the internal format to the 16-byte Intel format for
3208    an IEEE extended real.  */
3209 static void
3210 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3211                                 const long *buf)
3212 {
3213   /* All the padding in an Intel-format extended real goes at the high end.  */
3214   decode_ieee_extended_intel_96 (fmt, r, buf);
3215 }
3216
3217 const struct real_format ieee_extended_motorola_format =
3218   {
3219     encode_ieee_extended_motorola,
3220     decode_ieee_extended_motorola,
3221     2,
3222     1,
3223     64,
3224     64,
3225     -16382,
3226     16384,
3227     95,
3228     95,
3229     true,
3230     true,
3231     true,
3232     true,
3233     true
3234   };
3235
3236 const struct real_format ieee_extended_intel_96_format =
3237   {
3238     encode_ieee_extended_intel_96,
3239     decode_ieee_extended_intel_96,
3240     2,
3241     1,
3242     64,
3243     64,
3244     -16381,
3245     16384,
3246     79,
3247     79,
3248     true,
3249     true,
3250     true,
3251     true,
3252     true
3253   };
3254
3255 const struct real_format ieee_extended_intel_128_format =
3256   {
3257     encode_ieee_extended_intel_128,
3258     decode_ieee_extended_intel_128,
3259     2,
3260     1,
3261     64,
3262     64,
3263     -16381,
3264     16384,
3265     79,
3266     79,
3267     true,
3268     true,
3269     true,
3270     true,
3271     true
3272   };
3273
3274 /* The following caters to i386 systems that set the rounding precision
3275    to 53 bits instead of 64, e.g. FreeBSD.  */
3276 const struct real_format ieee_extended_intel_96_round_53_format =
3277   {
3278     encode_ieee_extended_intel_96,
3279     decode_ieee_extended_intel_96,
3280     2,
3281     1,
3282     53,
3283     53,
3284     -16381,
3285     16384,
3286     79,
3287     79,
3288     true,
3289     true,
3290     true,
3291     true,
3292     true
3293   };
3294 \f
3295 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3296    numbers whose sum is equal to the extended precision value.  The number
3297    with greater magnitude is first.  This format has the same magnitude
3298    range as an IEEE double precision value, but effectively 106 bits of
3299    significand precision.  Infinity and NaN are represented by their IEEE
3300    double precision value stored in the first number, the second number is
3301    +0.0 or -0.0 for Infinity and don't-care for NaN.  */
3302
3303 static void encode_ibm_extended (const struct real_format *fmt,
3304                                  long *, const REAL_VALUE_TYPE *);
3305 static void decode_ibm_extended (const struct real_format *,
3306                                  REAL_VALUE_TYPE *, const long *);
3307
3308 static void
3309 encode_ibm_extended (const struct real_format *fmt, long *buf,
3310                      const REAL_VALUE_TYPE *r)
3311 {
3312   REAL_VALUE_TYPE u, normr, v;
3313   const struct real_format *base_fmt;
3314
3315   base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3316
3317   /* Renormlize R before doing any arithmetic on it.  */
3318   normr = *r;
3319   if (normr.cl == rvc_normal)
3320     normalize (&normr);
3321
3322   /* u = IEEE double precision portion of significand.  */
3323   u = normr;
3324   round_for_format (base_fmt, &u);
3325   encode_ieee_double (base_fmt, &buf[0], &u);
3326
3327   if (u.cl == rvc_normal)
3328     {
3329       do_add (&v, &normr, &u, 1);
3330       /* Call round_for_format since we might need to denormalize.  */
3331       round_for_format (base_fmt, &v);
3332       encode_ieee_double (base_fmt, &buf[2], &v);
3333     }
3334   else
3335     {
3336       /* Inf, NaN, 0 are all representable as doubles, so the
3337          least-significant part can be 0.0.  */
3338       buf[2] = 0;
3339       buf[3] = 0;
3340     }
3341 }
3342
3343 static void
3344 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3345                      const long *buf)
3346 {
3347   REAL_VALUE_TYPE u, v;
3348   const struct real_format *base_fmt;
3349
3350   base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3351   decode_ieee_double (base_fmt, &u, &buf[0]);
3352
3353   if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3354     {
3355       decode_ieee_double (base_fmt, &v, &buf[2]);
3356       do_add (r, &u, &v, 0);
3357     }
3358   else
3359     *r = u;
3360 }
3361
3362 const struct real_format ibm_extended_format =
3363   {
3364     encode_ibm_extended,
3365     decode_ibm_extended,
3366     2,
3367     1,
3368     53 + 53,
3369     53,
3370     -1021 + 53,
3371     1024,
3372     127,
3373     -1,
3374     true,
3375     true,
3376     true,
3377     true,
3378     true
3379   };
3380
3381 const struct real_format mips_extended_format =
3382   {
3383     encode_ibm_extended,
3384     decode_ibm_extended,
3385     2,
3386     1,
3387     53 + 53,
3388     53,
3389     -1021 + 53,
3390     1024,
3391     127,
3392     -1,
3393     true,
3394     true,
3395     true,
3396     true,
3397     false
3398   };
3399
3400 \f
3401 /* IEEE quad precision format.  */
3402
3403 static void encode_ieee_quad (const struct real_format *fmt,
3404                               long *, const REAL_VALUE_TYPE *);
3405 static void decode_ieee_quad (const struct real_format *,
3406                               REAL_VALUE_TYPE *, const long *);
3407
3408 static void
3409 encode_ieee_quad (const struct real_format *fmt, long *buf,
3410                   const REAL_VALUE_TYPE *r)
3411 {
3412   unsigned long image3, image2, image1, image0, exp;
3413   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3414   REAL_VALUE_TYPE u;
3415
3416   image3 = r->sign << 31;
3417   image2 = 0;
3418   image1 = 0;
3419   image0 = 0;
3420
3421   rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3422
3423   switch (r->cl)
3424     {
3425     case rvc_zero:
3426       break;
3427
3428     case rvc_inf:
3429       if (fmt->has_inf)
3430         image3 |= 32767 << 16;
3431       else
3432         {
3433           image3 |= 0x7fffffff;
3434           image2 = 0xffffffff;
3435           image1 = 0xffffffff;
3436           image0 = 0xffffffff;
3437         }
3438       break;
3439
3440     case rvc_nan:
3441       if (fmt->has_nans)
3442         {
3443           image3 |= 32767 << 16;
3444
3445           if (r->canonical)
3446             {
3447               /* Don't use bits from the significand.  The
3448                  initialization above is right.  */
3449             }
3450           else if (HOST_BITS_PER_LONG == 32)
3451             {
3452               image0 = u.sig[0];
3453               image1 = u.sig[1];
3454               image2 = u.sig[2];
3455               image3 |= u.sig[3] & 0xffff;
3456             }
3457           else
3458             {
3459               image0 = u.sig[0];
3460               image1 = image0 >> 31 >> 1;
3461               image2 = u.sig[1];
3462               image3 |= (image2 >> 31 >> 1) & 0xffff;
3463               image0 &= 0xffffffff;
3464               image2 &= 0xffffffff;
3465             }
3466           if (r->signalling == fmt->qnan_msb_set)
3467             image3 &= ~0x8000;
3468           else
3469             image3 |= 0x8000;
3470           /* We overload qnan_msb_set here: it's only clear for
3471              mips_ieee_single, which wants all mantissa bits but the
3472              quiet/signalling one set in canonical NaNs (at least
3473              Quiet ones).  */
3474           if (r->canonical && !fmt->qnan_msb_set)
3475             {
3476               image3 |= 0x7fff;
3477               image2 = image1 = image0 = 0xffffffff;
3478             }
3479           else if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3480             image3 |= 0x4000;
3481         }
3482       else
3483         {
3484           image3 |= 0x7fffffff;
3485           image2 = 0xffffffff;
3486           image1 = 0xffffffff;
3487           image0 = 0xffffffff;
3488         }
3489       break;
3490
3491     case rvc_normal:
3492       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3493          whereas the intermediate representation is 0.F x 2**exp.
3494          Which means we're off by one.  */
3495       if (denormal)
3496         exp = 0;
3497       else
3498         exp = REAL_EXP (r) + 16383 - 1;
3499       image3 |= exp << 16;
3500
3501       if (HOST_BITS_PER_LONG == 32)
3502         {
3503           image0 = u.sig[0];
3504           image1 = u.sig[1];
3505           image2 = u.sig[2];
3506           image3 |= u.sig[3] & 0xffff;
3507         }
3508       else
3509         {
3510           image0 = u.sig[0];
3511           image1 = image0 >> 31 >> 1;
3512           image2 = u.sig[1];
3513           image3 |= (image2 >> 31 >> 1) & 0xffff;
3514           image0 &= 0xffffffff;
3515           image2 &= 0xffffffff;
3516         }
3517       break;
3518
3519     default:
3520       gcc_unreachable ();
3521     }
3522
3523   if (FLOAT_WORDS_BIG_ENDIAN)
3524     {
3525       buf[0] = image3;
3526       buf[1] = image2;
3527       buf[2] = image1;
3528       buf[3] = image0;
3529     }
3530   else
3531     {
3532       buf[0] = image0;
3533       buf[1] = image1;
3534       buf[2] = image2;
3535       buf[3] = image3;
3536     }
3537 }
3538
3539 static void
3540 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3541                   const long *buf)
3542 {
3543   unsigned long image3, image2, image1, image0;
3544   bool sign;
3545   int exp;
3546
3547   if (FLOAT_WORDS_BIG_ENDIAN)
3548     {
3549       image3 = buf[0];
3550       image2 = buf[1];
3551       image1 = buf[2];
3552       image0 = buf[3];
3553     }
3554   else
3555     {
3556       image0 = buf[0];
3557       image1 = buf[1];
3558       image2 = buf[2];
3559       image3 = buf[3];
3560     }
3561   image0 &= 0xffffffff;
3562   image1 &= 0xffffffff;
3563   image2 &= 0xffffffff;
3564
3565   sign = (image3 >> 31) & 1;
3566   exp = (image3 >> 16) & 0x7fff;
3567   image3 &= 0xffff;
3568
3569   memset (r, 0, sizeof (*r));
3570
3571   if (exp == 0)
3572     {
3573       if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
3574         {
3575           r->cl = rvc_normal;
3576           r->sign = sign;
3577
3578           SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
3579           if (HOST_BITS_PER_LONG == 32)
3580             {
3581               r->sig[0] = image0;
3582               r->sig[1] = image1;
3583               r->sig[2] = image2;
3584               r->sig[3] = image3;
3585             }
3586           else
3587             {
3588               r->sig[0] = (image1 << 31 << 1) | image0;
3589               r->sig[1] = (image3 << 31 << 1) | image2;
3590             }
3591
3592           normalize (r);
3593         }
3594       else if (fmt->has_signed_zero)
3595         r->sign = sign;
3596     }
3597   else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3598     {
3599       if (image3 | image2 | image1 | image0)
3600         {
3601           r->cl = rvc_nan;
3602           r->sign = sign;
3603           r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
3604
3605           if (HOST_BITS_PER_LONG == 32)
3606             {
3607               r->sig[0] = image0;
3608               r->sig[1] = image1;
3609               r->sig[2] = image2;
3610               r->sig[3] = image3;
3611             }
3612           else
3613             {
3614               r->sig[0] = (image1 << 31 << 1) | image0;
3615               r->sig[1] = (image3 << 31 << 1) | image2;
3616             }
3617           lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3618         }
3619       else
3620         {
3621           r->cl = rvc_inf;
3622           r->sign = sign;
3623         }
3624     }
3625   else
3626     {
3627       r->cl = rvc_normal;
3628       r->sign = sign;
3629       SET_REAL_EXP (r, exp - 16383 + 1);
3630
3631       if (HOST_BITS_PER_LONG == 32)
3632         {
3633           r->sig[0] = image0;
3634           r->sig[1] = image1;
3635           r->sig[2] = image2;
3636           r->sig[3] = image3;
3637         }
3638       else
3639         {
3640           r->sig[0] = (image1 << 31 << 1) | image0;
3641           r->sig[1] = (image3 << 31 << 1) | image2;
3642         }
3643       lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3644       r->sig[SIGSZ-1] |= SIG_MSB;
3645     }
3646 }
3647
3648 const struct real_format ieee_quad_format =
3649   {
3650     encode_ieee_quad,
3651     decode_ieee_quad,
3652     2,
3653     1,
3654     113,
3655     113,
3656     -16381,
3657     16384,
3658     127,
3659     127,
3660     true,
3661     true,
3662     true,
3663     true,
3664     true
3665   };
3666
3667 const struct real_format mips_quad_format =
3668   {
3669     encode_ieee_quad,
3670     decode_ieee_quad,
3671     2,
3672     1,
3673     113,
3674     113,
3675     -16381,
3676     16384,
3677     127,
3678     127,
3679     true,
3680     true,
3681     true,
3682     true,
3683     false
3684   };
3685 \f
3686 /* Descriptions of VAX floating point formats can be found beginning at
3687
3688    http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
3689
3690    The thing to remember is that they're almost IEEE, except for word
3691    order, exponent bias, and the lack of infinities, nans, and denormals.
3692
3693    We don't implement the H_floating format here, simply because neither
3694    the VAX or Alpha ports use it.  */
3695
3696 static void encode_vax_f (const struct real_format *fmt,
3697                           long *, const REAL_VALUE_TYPE *);
3698 static void decode_vax_f (const struct real_format *,
3699                           REAL_VALUE_TYPE *, const long *);
3700 static void encode_vax_d (const struct real_format *fmt,
3701                           long *, const REAL_VALUE_TYPE *);
3702 static void decode_vax_d (const struct real_format *,
3703                           REAL_VALUE_TYPE *, const long *);
3704 static void encode_vax_g (const struct real_format *fmt,
3705                           long *, const REAL_VALUE_TYPE *);
3706 static void decode_vax_g (const struct real_format *,
3707                           REAL_VALUE_TYPE *, const long *);
3708
3709 static void
3710 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3711               const REAL_VALUE_TYPE *r)
3712 {
3713   unsigned long sign, exp, sig, image;
3714
3715   sign = r->sign << 15;
3716
3717   switch (r->cl)
3718     {
3719     case rvc_zero:
3720       image = 0;
3721       break;
3722
3723     case rvc_inf:
3724     case rvc_nan:
3725       image = 0xffff7fff | sign;
3726       break;
3727
3728     case rvc_normal:
3729       sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
3730       exp = REAL_EXP (r) + 128;
3731
3732       image = (sig << 16) & 0xffff0000;
3733       image |= sign;
3734       image |= exp << 7;
3735       image |= sig >> 16;
3736       break;
3737
3738     default:
3739       gcc_unreachable ();
3740     }
3741
3742   buf[0] = image;
3743 }
3744
3745 static void
3746 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
3747               REAL_VALUE_TYPE *r, const long *buf)
3748 {
3749   unsigned long image = buf[0] & 0xffffffff;
3750   int exp = (image >> 7) & 0xff;
3751
3752   memset (r, 0, sizeof (*r));
3753
3754   if (exp != 0)
3755     {
3756       r->cl = rvc_normal;
3757       r->sign = (image >> 15) & 1;
3758       SET_REAL_EXP (r, exp - 128);
3759
3760       image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
3761       r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
3762     }
3763 }
3764
3765 static void
3766 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3767               const REAL_VALUE_TYPE *r)
3768 {
3769   unsigned long image0, image1, sign = r->sign << 15;
3770
3771   switch (r->cl)
3772     {
3773     case rvc_zero:
3774       image0 = image1 = 0;
3775       break;
3776
3777     case rvc_inf:
3778     case rvc_nan:
3779       image0 = 0xffff7fff | sign;
3780       image1 = 0xffffffff;
3781       break;
3782
3783     case rvc_normal:
3784       /* Extract the significand into straight hi:lo.  */
3785       if (HOST_BITS_PER_LONG == 64)
3786         {
3787           image0 = r->sig[SIGSZ-1];
3788           image1 = (image0 >> (64 - 56)) & 0xffffffff;
3789           image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
3790         }
3791       else
3792         {
3793           image0 = r->sig[SIGSZ-1];
3794           image1 = r->sig[SIGSZ-2];
3795           image1 = (image0 << 24) | (image1 >> 8);
3796           image0 = (image0 >> 8) & 0xffffff;
3797         }
3798
3799       /* Rearrange the half-words of the significand to match the
3800          external format.  */
3801       image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
3802       image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3803
3804       /* Add the sign and exponent.  */
3805       image0 |= sign;
3806       image0 |= (REAL_EXP (r) + 128) << 7;
3807       break;
3808
3809     default:
3810       gcc_unreachable ();
3811     }
3812
3813   if (FLOAT_WORDS_BIG_ENDIAN)
3814     buf[0] = image1, buf[1] = image0;
3815   else
3816     buf[0] = image0, buf[1] = image1;
3817 }
3818
3819 static void
3820 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
3821               REAL_VALUE_TYPE *r, const long *buf)
3822 {
3823   unsigned long image0, image1;
3824   int exp;
3825
3826   if (FLOAT_WORDS_BIG_ENDIAN)
3827     image1 = buf[0], image0 = buf[1];
3828   else
3829     image0 = buf[0], image1 = buf[1];
3830   image0 &= 0xffffffff;
3831   image1 &= 0xffffffff;
3832
3833   exp = (image0 >> 7) & 0xff;
3834
3835   memset (r, 0, sizeof (*r));
3836
3837   if (exp != 0)
3838     {
3839       r->cl = rvc_normal;
3840       r->sign = (image0 >> 15) & 1;
3841       SET_REAL_EXP (r, exp - 128);
3842
3843       /* Rearrange the half-words of the external format into
3844          proper ascending order.  */
3845       image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
3846       image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3847
3848       if (HOST_BITS_PER_LONG == 64)
3849         {
3850           image0 = (image0 << 31 << 1) | image1;
3851           image0 <<= 64 - 56;
3852           image0 |= SIG_MSB;
3853           r->sig[SIGSZ-1] = image0;
3854         }
3855       else
3856         {
3857           r->sig[SIGSZ-1] = image0;
3858           r->sig[SIGSZ-2] = image1;
3859           lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
3860           r->sig[SIGSZ-1] |= SIG_MSB;
3861         }
3862     }
3863 }
3864
3865 static void
3866 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3867               const REAL_VALUE_TYPE *r)
3868 {
3869   unsigned long image0, image1, sign = r->sign << 15;
3870
3871   switch (r->cl)
3872     {
3873     case rvc_zero:
3874       image0 = image1 = 0;
3875       break;
3876
3877     case rvc_inf:
3878     case rvc_nan:
3879       image0 = 0xffff7fff | sign;
3880       image1 = 0xffffffff;
3881       break;
3882
3883     case rvc_normal:
3884       /* Extract the significand into straight hi:lo.  */
3885       if (HOST_BITS_PER_LONG == 64)
3886         {
3887           image0 = r->sig[SIGSZ-1];
3888           image1 = (image0 >> (64 - 53)) & 0xffffffff;
3889           image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
3890         }
3891       else
3892         {
3893           image0 = r->sig[SIGSZ-1];
3894           image1 = r->sig[SIGSZ-2];
3895           image1 = (image0 << 21) | (image1 >> 11);
3896           image0 = (image0 >> 11) & 0xfffff;
3897         }
3898
3899       /* Rearrange the half-words of the significand to match the
3900          external format.  */
3901       image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
3902       image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3903
3904       /* Add the sign and exponent.  */
3905       image0 |= sign;
3906       image0 |= (REAL_EXP (r) + 1024) << 4;
3907       break;
3908
3909     default:
3910       gcc_unreachable ();
3911     }
3912
3913   if (FLOAT_WORDS_BIG_ENDIAN)
3914     buf[0] = image1, buf[1] = image0;
3915   else
3916     buf[0] = image0, buf[1] = image1;
3917 }
3918
3919 static void
3920 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
3921               REAL_VALUE_TYPE *r, const long *buf)
3922 {
3923   unsigned long image0, image1;
3924   int exp;
3925
3926   if (FLOAT_WORDS_BIG_ENDIAN)
3927     image1 = buf[0], image0 = buf[1];
3928   else
3929     image0 = buf[0], image1 = buf[1];
3930   image0 &= 0xffffffff;
3931   image1 &= 0xffffffff;
3932
3933   exp = (image0 >> 4) & 0x7ff;
3934
3935   memset (r, 0, sizeof (*r));
3936
3937   if (exp != 0)
3938     {
3939       r->cl = rvc_normal;
3940       r->sign = (image0 >> 15) & 1;
3941       SET_REAL_EXP (r, exp - 1024);
3942
3943       /* Rearrange the half-words of the external format into
3944          proper ascending order.  */
3945       image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
3946       image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3947
3948       if (HOST_BITS_PER_LONG == 64)
3949         {
3950           image0 = (image0 << 31 << 1) | image1;
3951           image0 <<= 64 - 53;
3952           image0 |= SIG_MSB;
3953           r->sig[SIGSZ-1] = image0;
3954         }
3955       else
3956         {
3957           r->sig[SIGSZ-1] = image0;
3958           r->sig[SIGSZ-2] = image1;
3959           lshift_significand (r, r, 64 - 53);
3960           r->sig[SIGSZ-1] |= SIG_MSB;
3961         }
3962     }
3963 }
3964
3965 const struct real_format vax_f_format =
3966   {
3967     encode_vax_f,
3968     decode_vax_f,
3969     2,
3970     1,
3971     24,
3972     24,
3973     -127,
3974     127,
3975     15,
3976     15,
3977     false,
3978     false,
3979     false,
3980     false,
3981     false
3982   };
3983
3984 const struct real_format vax_d_format =
3985   {
3986     encode_vax_d,
3987     decode_vax_d,
3988     2,
3989     1,
3990     56,
3991     56,
3992     -127,
3993     127,
3994     15,
3995     15,
3996     false,
3997     false,
3998     false,
3999     false,
4000     false
4001   };
4002
4003 const struct real_format vax_g_format =
4004   {
4005     encode_vax_g,
4006     decode_vax_g,
4007     2,
4008     1,
4009     53,
4010     53,
4011     -1023,
4012     1023,
4013     15,
4014     15,
4015     false,
4016     false,
4017     false,
4018     false,
4019     false
4020   };
4021 \f
4022 /* A good reference for these can be found in chapter 9 of
4023    "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
4024    An on-line version can be found here:
4025
4026    http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
4027 */
4028
4029 static void encode_i370_single (const struct real_format *fmt,
4030                                 long *, const REAL_VALUE_TYPE *);
4031 static void decode_i370_single (const struct real_format *,
4032                                 REAL_VALUE_TYPE *, const long *);
4033 static void encode_i370_double (const struct real_format *fmt,
4034                                 long *, const REAL_VALUE_TYPE *);
4035 static void decode_i370_double (const struct real_format *,
4036                                 REAL_VALUE_TYPE *, const long *);
4037
4038 static void
4039 encode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4040                     long *buf, const REAL_VALUE_TYPE *r)
4041 {
4042   unsigned long sign, exp, sig, image;
4043
4044   sign = r->sign << 31;
4045
4046   switch (r->cl)
4047     {
4048     case rvc_zero:
4049       image = 0;
4050       break;
4051
4052     case rvc_inf:
4053     case rvc_nan:
4054       image = 0x7fffffff | sign;
4055       break;
4056
4057     case rvc_normal:
4058       sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
4059       exp = ((REAL_EXP (r) / 4) + 64) << 24;
4060       image = sign | exp | sig;
4061       break;
4062
4063     default:
4064       gcc_unreachable ();
4065     }
4066
4067   buf[0] = image;
4068 }
4069
4070 static void
4071 decode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4072                     REAL_VALUE_TYPE *r, const long *buf)
4073 {
4074   unsigned long sign, sig, image = buf[0];
4075   int exp;
4076
4077   sign = (image >> 31) & 1;
4078   exp = (image >> 24) & 0x7f;
4079   sig = image & 0xffffff;
4080
4081   memset (r, 0, sizeof (*r));
4082
4083   if (exp || sig)
4084     {
4085       r->cl = rvc_normal;
4086       r->sign = sign;
4087       SET_REAL_EXP (r, (exp - 64) * 4);
4088       r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
4089       normalize (r);
4090     }
4091 }
4092
4093 static void
4094 encode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4095                     long *buf, const REAL_VALUE_TYPE *r)
4096 {
4097   unsigned long sign, exp, image_hi, image_lo;
4098
4099   sign = r->sign << 31;
4100
4101   switch (r->cl)
4102     {
4103     case rvc_zero:
4104       image_hi = image_lo = 0;
4105       break;
4106
4107     case rvc_inf:
4108     case rvc_nan:
4109       image_hi = 0x7fffffff | sign;
4110       image_lo = 0xffffffff;
4111       break;
4112
4113     case rvc_normal:
4114       if (HOST_BITS_PER_LONG == 64)
4115         {
4116           image_hi = r->sig[SIGSZ-1];
4117           image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
4118           image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
4119         }
4120       else
4121         {
4122           image_hi = r->sig[SIGSZ-1];
4123           image_lo = r->sig[SIGSZ-2];
4124           image_lo = (image_lo >> 8) | (image_hi << 24);
4125           image_hi >>= 8;
4126         }
4127
4128       exp = ((REAL_EXP (r) / 4) + 64) << 24;
4129       image_hi |= sign | exp;
4130       break;
4131
4132     default:
4133       gcc_unreachable ();
4134     }
4135
4136   if (FLOAT_WORDS_BIG_ENDIAN)
4137     buf[0] = image_hi, buf[1] = image_lo;
4138   else
4139     buf[0] = image_lo, buf[1] = image_hi;
4140 }
4141
4142 static void
4143 decode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4144                     REAL_VALUE_TYPE *r, const long *buf)
4145 {
4146   unsigned long sign, image_hi, image_lo;
4147   int exp;
4148
4149   if (FLOAT_WORDS_BIG_ENDIAN)
4150     image_hi = buf[0], image_lo = buf[1];
4151   else
4152     image_lo = buf[0], image_hi = buf[1];
4153
4154   sign = (image_hi >> 31) & 1;
4155   exp = (image_hi >> 24) & 0x7f;
4156   image_hi &= 0xffffff;
4157   image_lo &= 0xffffffff;
4158
4159   memset (r, 0, sizeof (*r));
4160
4161   if (exp || image_hi || image_lo)
4162     {
4163       r->cl = rvc_normal;
4164       r->sign = sign;
4165       SET_REAL_EXP (r, (exp - 64) * 4 + (SIGNIFICAND_BITS - 56));
4166
4167       if (HOST_BITS_PER_LONG == 32)
4168         {
4169           r->sig[0] = image_lo;
4170           r->sig[1] = image_hi;
4171         }
4172       else
4173         r->sig[0] = image_lo | (image_hi << 31 << 1);
4174
4175       normalize (r);
4176     }
4177 }
4178
4179 const struct real_format i370_single_format =
4180   {
4181     encode_i370_single,
4182     decode_i370_single,
4183     16,
4184     4,
4185     6,
4186     6,
4187     -64,
4188     63,
4189     31,
4190     31,
4191     false,
4192     false,
4193     false, /* ??? The encoding does allow for "unnormals".  */
4194     false, /* ??? The encoding does allow for "unnormals".  */
4195     false
4196   };
4197
4198 const struct real_format i370_double_format =
4199   {
4200     encode_i370_double,
4201     decode_i370_double,
4202     16,
4203     4,
4204     14,
4205     14,
4206     -64,
4207     63,
4208     63,
4209     63,
4210     false,
4211     false,
4212     false, /* ??? The encoding does allow for "unnormals".  */
4213     false, /* ??? The encoding does allow for "unnormals".  */
4214     false
4215   };
4216 \f
4217 /* The "twos-complement" c4x format is officially defined as
4218
4219         x = s(~s).f * 2**e
4220
4221    This is rather misleading.  One must remember that F is signed.
4222    A better description would be
4223
4224         x = -1**s * ((s + 1 + .f) * 2**e
4225
4226    So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
4227    that's -1 * (1+1+(-.5)) == -1.5.  I think.
4228
4229    The constructions here are taken from Tables 5-1 and 5-2 of the
4230    TMS320C4x User's Guide wherein step-by-step instructions for
4231    conversion from IEEE are presented.  That's close enough to our
4232    internal representation so as to make things easy.
4233
4234    See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf  */
4235
4236 static void encode_c4x_single (const struct real_format *fmt,
4237                                long *, const REAL_VALUE_TYPE *);
4238 static void decode_c4x_single (const struct real_format *,
4239                                REAL_VALUE_TYPE *, const long *);
4240 static void encode_c4x_extended (const struct real_format *fmt,
4241                                  long *, const REAL_VALUE_TYPE *);
4242 static void decode_c4x_extended (const struct real_format *,
4243                                  REAL_VALUE_TYPE *, const long *);
4244
4245 static void
4246 encode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4247                    long *buf, const REAL_VALUE_TYPE *r)
4248 {
4249   unsigned long image, exp, sig;
4250
4251   switch (r->cl)
4252     {
4253     case rvc_zero:
4254       exp = -128;
4255       sig = 0;
4256       break;
4257
4258     case rvc_inf:
4259     case rvc_nan:
4260       exp = 127;
4261       sig = 0x800000 - r->sign;
4262       break;
4263
4264     case rvc_normal:
4265       exp = REAL_EXP (r) - 1;
4266       sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4267       if (r->sign)
4268         {
4269           if (sig)
4270             sig = -sig;
4271           else
4272             exp--;
4273           sig |= 0x800000;
4274         }
4275       break;
4276
4277     default:
4278       gcc_unreachable ();
4279     }
4280
4281   image = ((exp & 0xff) << 24) | (sig & 0xffffff);
4282   buf[0] = image;
4283 }
4284
4285 static void
4286 decode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4287                    REAL_VALUE_TYPE *r, const long *buf)
4288 {
4289   unsigned long image = buf[0];
4290   unsigned long sig;
4291   int exp, sf;
4292
4293   exp = (((image >> 24) & 0xff) ^ 0x80) - 0x80;
4294   sf = ((image & 0xffffff) ^ 0x800000) - 0x800000;
4295
4296   memset (r, 0, sizeof (*r));
4297
4298   if (exp != -128)
4299     {
4300       r->cl = rvc_normal;
4301
4302       sig = sf & 0x7fffff;
4303       if (sf < 0)
4304         {
4305           r->sign = 1;
4306           if (sig)
4307             sig = -sig;
4308           else
4309             exp++;
4310         }
4311       sig = (sig << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4312
4313       SET_REAL_EXP (r, exp + 1);
4314       r->sig[SIGSZ-1] = sig;
4315     }
4316 }
4317
4318 static void
4319 encode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4320                      long *buf, const REAL_VALUE_TYPE *r)
4321 {
4322   unsigned long exp, sig;
4323
4324   switch (r->cl)
4325     {
4326     case rvc_zero:
4327       exp = -128;
4328       sig = 0;
4329       break;
4330
4331     case rvc_inf:
4332     case rvc_nan:
4333       exp = 127;
4334       sig = 0x80000000 - r->sign;
4335       break;
4336
4337     case rvc_normal:
4338       exp = REAL_EXP (r) - 1;
4339
4340       sig = r->sig[SIGSZ-1];
4341       if (HOST_BITS_PER_LONG == 64)
4342         sig = sig >> 1 >> 31;
4343       sig &= 0x7fffffff;
4344
4345       if (r->sign)
4346         {
4347           if (sig)
4348             sig = -sig;
4349           else
4350             exp--;
4351           sig |= 0x80000000;
4352         }
4353       break;
4354
4355     default:
4356       gcc_unreachable ();
4357     }
4358
4359   exp = (exp & 0xff) << 24;
4360   sig &= 0xffffffff;
4361
4362   if (FLOAT_WORDS_BIG_ENDIAN)
4363     buf[0] = exp, buf[1] = sig;
4364   else
4365     buf[0] = sig, buf[0] = exp;
4366 }
4367
4368 static void
4369 decode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4370                      REAL_VALUE_TYPE *r, const long *buf)
4371 {
4372   unsigned long sig;
4373   int exp, sf;
4374
4375   if (FLOAT_WORDS_BIG_ENDIAN)
4376     exp = buf[0], sf = buf[1];
4377   else
4378     sf = buf[0], exp = buf[1];
4379
4380   exp = (((exp >> 24) & 0xff) & 0x80) - 0x80;
4381   sf = ((sf & 0xffffffff) ^ 0x80000000) - 0x80000000;
4382
4383   memset (r, 0, sizeof (*r));
4384
4385   if (exp != -128)
4386     {
4387       r->cl = rvc_normal;
4388
4389       sig = sf & 0x7fffffff;
4390       if (sf < 0)
4391         {
4392           r->sign = 1;
4393           if (sig)
4394             sig = -sig;
4395           else
4396             exp++;
4397         }
4398       if (HOST_BITS_PER_LONG == 64)
4399         sig = sig << 1 << 31;
4400       sig |= SIG_MSB;
4401
4402       SET_REAL_EXP (r, exp + 1);
4403       r->sig[SIGSZ-1] = sig;
4404     }
4405 }
4406
4407 const struct real_format c4x_single_format =
4408   {
4409     encode_c4x_single,
4410     decode_c4x_single,
4411     2,
4412     1,
4413     24,
4414     24,
4415     -126,
4416     128,
4417     23,
4418     -1,
4419     false,
4420     false,
4421     false,
4422     false,
4423     false
4424   };
4425
4426 const struct real_format c4x_extended_format =
4427   {
4428     encode_c4x_extended,
4429     decode_c4x_extended,
4430     2,
4431     1,
4432     32,
4433     32,
4434     -126,
4435     128,
4436     31,
4437     -1,
4438     false,
4439     false,
4440     false,
4441     false,
4442     false
4443   };
4444
4445 \f
4446 /* A synthetic "format" for internal arithmetic.  It's the size of the
4447    internal significand minus the two bits needed for proper rounding.
4448    The encode and decode routines exist only to satisfy our paranoia
4449    harness.  */
4450
4451 static void encode_internal (const struct real_format *fmt,
4452                              long *, const REAL_VALUE_TYPE *);
4453 static void decode_internal (const struct real_format *,
4454                              REAL_VALUE_TYPE *, const long *);
4455
4456 static void
4457 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4458                  const REAL_VALUE_TYPE *r)
4459 {
4460   memcpy (buf, r, sizeof (*r));
4461 }
4462
4463 static void
4464 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4465                  REAL_VALUE_TYPE *r, const long *buf)
4466 {
4467   memcpy (r, buf, sizeof (*r));
4468 }
4469
4470 const struct real_format real_internal_format =
4471   {
4472     encode_internal,
4473     decode_internal,
4474     2,
4475     1,
4476     SIGNIFICAND_BITS - 2,
4477     SIGNIFICAND_BITS - 2,
4478     -MAX_EXP,
4479     MAX_EXP,
4480     -1,
4481     -1,
4482     true,
4483     true,
4484     false,
4485     true,
4486     true
4487   };
4488 \f
4489 /* Calculate the square root of X in mode MODE, and store the result
4490    in R.  Return TRUE if the operation does not raise an exception.
4491    For details see "High Precision Division and Square Root",
4492    Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June
4493    1993.  http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf.  */
4494
4495 bool
4496 real_sqrt (REAL_VALUE_TYPE *r, enum machine_mode mode,
4497            const REAL_VALUE_TYPE *x)
4498 {
4499   static REAL_VALUE_TYPE halfthree;
4500   static bool init = false;
4501   REAL_VALUE_TYPE h, t, i;
4502   int iter, exp;
4503
4504   /* sqrt(-0.0) is -0.0.  */
4505   if (real_isnegzero (x))
4506     {
4507       *r = *x;
4508       return false;
4509     }
4510
4511   /* Negative arguments return NaN.  */
4512   if (real_isneg (x))
4513     {
4514       get_canonical_qnan (r, 0);
4515       return false;
4516     }
4517
4518   /* Infinity and NaN return themselves.  */
4519   if (real_isinf (x) || real_isnan (x))
4520     {
4521       *r = *x;
4522       return false;
4523     }
4524
4525   if (!init)
4526     {
4527       do_add (&halfthree, &dconst1, &dconsthalf, 0);
4528       init = true;
4529     }
4530
4531   /* Initial guess for reciprocal sqrt, i.  */
4532   exp = real_exponent (x);
4533   real_ldexp (&i, &dconst1, -exp/2);
4534
4535   /* Newton's iteration for reciprocal sqrt, i.  */
4536   for (iter = 0; iter < 16; iter++)
4537     {
4538       /* i(n+1) = i(n) * (1.5 - 0.5*i(n)*i(n)*x).  */
4539       do_multiply (&t, x, &i);
4540       do_multiply (&h, &t, &i);
4541       do_multiply (&t, &h, &dconsthalf);
4542       do_add (&h, &halfthree, &t, 1);
4543       do_multiply (&t, &i, &h);
4544
4545       /* Check for early convergence.  */
4546       if (iter >= 6 && real_identical (&i, &t))
4547         break;
4548
4549       /* ??? Unroll loop to avoid copying.  */
4550       i = t;
4551     }
4552
4553   /* Final iteration: r = i*x + 0.5*i*x*(1.0 - i*(i*x)).  */
4554   do_multiply (&t, x, &i);
4555   do_multiply (&h, &t, &i);
4556   do_add (&i, &dconst1, &h, 1);
4557   do_multiply (&h, &t, &i);
4558   do_multiply (&i, &dconsthalf, &h);
4559   do_add (&h, &t, &i, 0);
4560
4561   /* ??? We need a Tuckerman test to get the last bit.  */
4562
4563   real_convert (r, mode, &h);
4564   return true;
4565 }
4566
4567 /* Calculate X raised to the integer exponent N in mode MODE and store
4568    the result in R.  Return true if the result may be inexact due to
4569    loss of precision.  The algorithm is the classic "left-to-right binary
4570    method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4571    Algorithms", "The Art of Computer Programming", Volume 2.  */
4572
4573 bool
4574 real_powi (REAL_VALUE_TYPE *r, enum machine_mode mode,
4575            const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4576 {
4577   unsigned HOST_WIDE_INT bit;
4578   REAL_VALUE_TYPE t;
4579   bool inexact = false;
4580   bool init = false;
4581   bool neg;
4582   int i;
4583
4584   if (n == 0)
4585     {
4586       *r = dconst1;
4587       return false;
4588     }
4589   else if (n < 0)
4590     {
4591       /* Don't worry about overflow, from now on n is unsigned.  */
4592       neg = true;
4593       n = -n;
4594     }
4595   else
4596     neg = false;
4597
4598   t = *x;
4599   bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4600   for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4601     {
4602       if (init)
4603         {
4604           inexact |= do_multiply (&t, &t, &t);
4605           if (n & bit)
4606             inexact |= do_multiply (&t, &t, x);
4607         }
4608       else if (n & bit)
4609         init = true;
4610       bit >>= 1;
4611     }
4612
4613   if (neg)
4614     inexact |= do_divide (&t, &dconst1, &t);
4615
4616   real_convert (r, mode, &t);
4617   return inexact;
4618 }
4619
4620 /* Round X to the nearest integer not larger in absolute value, i.e.
4621    towards zero, placing the result in R in mode MODE.  */
4622
4623 void
4624 real_trunc (REAL_VALUE_TYPE *r, enum machine_mode mode,
4625             const REAL_VALUE_TYPE *x)
4626 {
4627   do_fix_trunc (r, x);
4628   if (mode != VOIDmode)
4629     real_convert (r, mode, r);
4630 }
4631
4632 /* Round X to the largest integer not greater in value, i.e. round
4633    down, placing the result in R in mode MODE.  */
4634
4635 void
4636 real_floor (REAL_VALUE_TYPE *r, enum machine_mode mode,
4637             const REAL_VALUE_TYPE *x)
4638 {
4639   REAL_VALUE_TYPE t;
4640
4641   do_fix_trunc (&t, x);
4642   if (! real_identical (&t, x) && x->sign)
4643     do_add (&t, &t, &dconstm1, 0);
4644   if (mode != VOIDmode)
4645     real_convert (r, mode, &t);
4646   else
4647     *r = t;
4648 }
4649
4650 /* Round X to the smallest integer not less then argument, i.e. round
4651    up, placing the result in R in mode MODE.  */
4652
4653 void
4654 real_ceil (REAL_VALUE_TYPE *r, enum machine_mode mode,
4655            const REAL_VALUE_TYPE *x)
4656 {
4657   REAL_VALUE_TYPE t;
4658
4659   do_fix_trunc (&t, x);
4660   if (! real_identical (&t, x) && ! x->sign)
4661     do_add (&t, &t, &dconst1, 0);
4662   if (mode != VOIDmode)
4663     real_convert (r, mode, &t);
4664   else
4665     *r = t;
4666 }
4667
4668 /* Round X to the nearest integer, but round halfway cases away from
4669    zero.  */
4670
4671 void
4672 real_round (REAL_VALUE_TYPE *r, enum machine_mode mode,
4673             const REAL_VALUE_TYPE *x)
4674 {
4675   do_add (r, x, &dconsthalf, x->sign);
4676   do_fix_trunc (r, r);
4677   if (mode != VOIDmode)
4678     real_convert (r, mode, r);
4679 }
4680
4681 /* Set the sign of R to the sign of X.  */
4682
4683 void
4684 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
4685 {
4686   r->sign = x->sign;
4687 }
4688