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