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