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