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