OSDN Git Service

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