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