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