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