OSDN Git Service

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