OSDN Git Service

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