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