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