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