OSDN Git Service

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