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