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