re PR target/21412 (ICE loading TLS address)
[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, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, USA. */
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "toplev.h"
30 #include "real.h"
31 #include "tm_p.h"
32
33 /* The floating point model used internally is not exactly IEEE 754
34 compliant, and close to the description in the ISO C99 standard,
35 section 5.2.4.2.2 Characteristics of floating types.
36
37 Specifically
38
39 x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
40
41 where
42 s = sign (+- 1)
43 b = base or radix, here always 2
44 e = exponent
45 p = precision (the number of base-b digits in the significand)
46 f_k = the digits of the significand.
47
48 We differ from typical IEEE 754 encodings in that the entire
49 significand is fractional. Normalized significands are in the
50 range [0.5, 1.0).
51
52 A requirement of the model is that P be larger than the largest
53 supported target floating-point type by at least 2 bits. This gives
54 us proper rounding when we truncate to the target type. In addition,
55 E must be large enough to hold the smallest supported denormal number
56 in a normalized form.
57
58 Both of these requirements are easily satisfied. The largest target
59 significand is 113 bits; we store at least 160. The smallest
60 denormal number fits in 17 exponent bits; we store 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 exp += 4;
1793 str++;
1794 }
1795 if (*str == '.')
1796 {
1797 str++;
1798 if (pos == SIGNIFICAND_BITS - 4)
1799 {
1800 while (*str == '0')
1801 str++, exp -= 4;
1802 }
1803 while (1)
1804 {
1805 d = hex_value (*str);
1806 if (d == _hex_bad)
1807 break;
1808 if (pos >= 0)
1809 {
1810 r->sig[pos / HOST_BITS_PER_LONG]
1811 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1812 pos -= 4;
1813 }
1814 str++;
1815 }
1816 }
1817 if (*str == 'p' || *str == 'P')
1818 {
1819 bool exp_neg = false;
1820
1821 str++;
1822 if (*str == '-')
1823 {
1824 exp_neg = true;
1825 str++;
1826 }
1827 else if (*str == '+')
1828 str++;
1829
1830 d = 0;
1831 while (ISDIGIT (*str))
1832 {
1833 d *= 10;
1834 d += *str - '0';
1835 if (d > MAX_EXP)
1836 {
1837 /* Overflowed the exponent. */
1838 if (exp_neg)
1839 goto underflow;
1840 else
1841 goto overflow;
1842 }
1843 str++;
1844 }
1845 if (exp_neg)
1846 d = -d;
1847
1848 exp += d;
1849 }
1850
1851 r->cl = rvc_normal;
1852 SET_REAL_EXP (r, exp);
1853
1854 normalize (r);
1855 }
1856 else
1857 {
1858 /* Decimal floating point. */
1859 const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
1860 int d;
1861
1862 while (*str == '0')
1863 str++;
1864 while (ISDIGIT (*str))
1865 {
1866 d = *str++ - '0';
1867 do_multiply (r, r, ten);
1868 if (d)
1869 do_add (r, r, real_digit (d), 0);
1870 }
1871 if (*str == '.')
1872 {
1873 str++;
1874 if (r->cl == rvc_zero)
1875 {
1876 while (*str == '0')
1877 str++, exp--;
1878 }
1879 while (ISDIGIT (*str))
1880 {
1881 d = *str++ - '0';
1882 do_multiply (r, r, ten);
1883 if (d)
1884 do_add (r, r, real_digit (d), 0);
1885 exp--;
1886 }
1887 }
1888
1889 if (*str == 'e' || *str == 'E')
1890 {
1891 bool exp_neg = false;
1892
1893 str++;
1894 if (*str == '-')
1895 {
1896 exp_neg = true;
1897 str++;
1898 }
1899 else if (*str == '+')
1900 str++;
1901
1902 d = 0;
1903 while (ISDIGIT (*str))
1904 {
1905 d *= 10;
1906 d += *str - '0';
1907 if (d > MAX_EXP)
1908 {
1909 /* Overflowed the exponent. */
1910 if (exp_neg)
1911 goto underflow;
1912 else
1913 goto overflow;
1914 }
1915 str++;
1916 }
1917 if (exp_neg)
1918 d = -d;
1919 exp += d;
1920 }
1921
1922 if (exp)
1923 times_pten (r, exp);
1924 }
1925
1926 r->sign = sign;
1927 return;
1928
1929 underflow:
1930 get_zero (r, sign);
1931 return;
1932
1933 overflow:
1934 get_inf (r, sign);
1935 return;
1936 }
1937
1938 /* Legacy. Similar, but return the result directly. */
1939
1940 REAL_VALUE_TYPE
1941 real_from_string2 (const char *s, enum machine_mode mode)
1942 {
1943 REAL_VALUE_TYPE r;
1944
1945 real_from_string (&r, s);
1946 if (mode != VOIDmode)
1947 real_convert (&r, mode, &r);
1948
1949 return r;
1950 }
1951
1952 /* Initialize R from the integer pair HIGH+LOW. */
1953
1954 void
1955 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
1956 unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
1957 int unsigned_p)
1958 {
1959 if (low == 0 && high == 0)
1960 get_zero (r, 0);
1961 else
1962 {
1963 memset (r, 0, sizeof (*r));
1964 r->cl = rvc_normal;
1965 r->sign = high < 0 && !unsigned_p;
1966 SET_REAL_EXP (r, 2 * HOST_BITS_PER_WIDE_INT);
1967
1968 if (r->sign)
1969 {
1970 high = ~high;
1971 if (low == 0)
1972 high += 1;
1973 else
1974 low = -low;
1975 }
1976
1977 if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
1978 {
1979 r->sig[SIGSZ-1] = high;
1980 r->sig[SIGSZ-2] = low;
1981 }
1982 else
1983 {
1984 gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
1985 r->sig[SIGSZ-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
1986 r->sig[SIGSZ-2] = high;
1987 r->sig[SIGSZ-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
1988 r->sig[SIGSZ-4] = low;
1989 }
1990
1991 normalize (r);
1992 }
1993
1994 if (mode != VOIDmode)
1995 real_convert (r, mode, r);
1996 }
1997
1998 /* Returns 10**2**N. */
1999
2000 static const REAL_VALUE_TYPE *
2001 ten_to_ptwo (int n)
2002 {
2003 static REAL_VALUE_TYPE tens[EXP_BITS];
2004
2005 gcc_assert (n >= 0);
2006 gcc_assert (n < EXP_BITS);
2007
2008 if (tens[n].cl == rvc_zero)
2009 {
2010 if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
2011 {
2012 HOST_WIDE_INT t = 10;
2013 int i;
2014
2015 for (i = 0; i < n; ++i)
2016 t *= t;
2017
2018 real_from_integer (&tens[n], VOIDmode, t, 0, 1);
2019 }
2020 else
2021 {
2022 const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
2023 do_multiply (&tens[n], t, t);
2024 }
2025 }
2026
2027 return &tens[n];
2028 }
2029
2030 /* Returns 10**(-2**N). */
2031
2032 static const REAL_VALUE_TYPE *
2033 ten_to_mptwo (int n)
2034 {
2035 static REAL_VALUE_TYPE tens[EXP_BITS];
2036
2037 gcc_assert (n >= 0);
2038 gcc_assert (n < EXP_BITS);
2039
2040 if (tens[n].cl == rvc_zero)
2041 do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
2042
2043 return &tens[n];
2044 }
2045
2046 /* Returns N. */
2047
2048 static const REAL_VALUE_TYPE *
2049 real_digit (int n)
2050 {
2051 static REAL_VALUE_TYPE num[10];
2052
2053 gcc_assert (n >= 0);
2054 gcc_assert (n <= 9);
2055
2056 if (n > 0 && num[n].cl == rvc_zero)
2057 real_from_integer (&num[n], VOIDmode, n, 0, 1);
2058
2059 return &num[n];
2060 }
2061
2062 /* Multiply R by 10**EXP. */
2063
2064 static void
2065 times_pten (REAL_VALUE_TYPE *r, int exp)
2066 {
2067 REAL_VALUE_TYPE pten, *rr;
2068 bool negative = (exp < 0);
2069 int i;
2070
2071 if (negative)
2072 {
2073 exp = -exp;
2074 pten = *real_digit (1);
2075 rr = &pten;
2076 }
2077 else
2078 rr = r;
2079
2080 for (i = 0; exp > 0; ++i, exp >>= 1)
2081 if (exp & 1)
2082 do_multiply (rr, rr, ten_to_ptwo (i));
2083
2084 if (negative)
2085 do_divide (r, r, &pten);
2086 }
2087
2088 /* Fills R with +Inf. */
2089
2090 void
2091 real_inf (REAL_VALUE_TYPE *r)
2092 {
2093 get_inf (r, 0);
2094 }
2095
2096 /* Fills R with a NaN whose significand is described by STR. If QUIET,
2097 we force a QNaN, else we force an SNaN. The string, if not empty,
2098 is parsed as a number and placed in the significand. Return true
2099 if the string was successfully parsed. */
2100
2101 bool
2102 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
2103 enum machine_mode mode)
2104 {
2105 const struct real_format *fmt;
2106
2107 fmt = REAL_MODE_FORMAT (mode);
2108 gcc_assert (fmt);
2109
2110 if (*str == 0)
2111 {
2112 if (quiet)
2113 get_canonical_qnan (r, 0);
2114 else
2115 get_canonical_snan (r, 0);
2116 }
2117 else
2118 {
2119 int base = 10, d;
2120
2121 memset (r, 0, sizeof (*r));
2122 r->cl = rvc_nan;
2123
2124 /* Parse akin to strtol into the significand of R. */
2125
2126 while (ISSPACE (*str))
2127 str++;
2128 if (*str == '-')
2129 str++;
2130 else if (*str == '+')
2131 str++;
2132 if (*str == '0')
2133 {
2134 if (*++str == 'x')
2135 str++, base = 16;
2136 else
2137 base = 8;
2138 }
2139
2140 while ((d = hex_value (*str)) < base)
2141 {
2142 REAL_VALUE_TYPE u;
2143
2144 switch (base)
2145 {
2146 case 8:
2147 lshift_significand (r, r, 3);
2148 break;
2149 case 16:
2150 lshift_significand (r, r, 4);
2151 break;
2152 case 10:
2153 lshift_significand_1 (&u, r);
2154 lshift_significand (r, r, 3);
2155 add_significands (r, r, &u);
2156 break;
2157 default:
2158 gcc_unreachable ();
2159 }
2160
2161 get_zero (&u, 0);
2162 u.sig[0] = d;
2163 add_significands (r, r, &u);
2164
2165 str++;
2166 }
2167
2168 /* Must have consumed the entire string for success. */
2169 if (*str != 0)
2170 return false;
2171
2172 /* Shift the significand into place such that the bits
2173 are in the most significant bits for the format. */
2174 lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
2175
2176 /* Our MSB is always unset for NaNs. */
2177 r->sig[SIGSZ-1] &= ~SIG_MSB;
2178
2179 /* Force quiet or signalling NaN. */
2180 r->signalling = !quiet;
2181 }
2182
2183 return true;
2184 }
2185
2186 /* Fills R with the largest finite value representable in mode MODE.
2187 If SIGN is nonzero, R is set to the most negative finite value. */
2188
2189 void
2190 real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
2191 {
2192 const struct real_format *fmt;
2193 int np2;
2194
2195 fmt = REAL_MODE_FORMAT (mode);
2196 gcc_assert (fmt);
2197
2198 r->cl = rvc_normal;
2199 r->sign = sign;
2200 r->signalling = 0;
2201 r->canonical = 0;
2202 SET_REAL_EXP (r, fmt->emax * fmt->log2_b);
2203
2204 np2 = SIGNIFICAND_BITS - fmt->p * fmt->log2_b;
2205 memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
2206 clear_significand_below (r, np2);
2207 }
2208
2209 /* Fills R with 2**N. */
2210
2211 void
2212 real_2expN (REAL_VALUE_TYPE *r, int n)
2213 {
2214 memset (r, 0, sizeof (*r));
2215
2216 n++;
2217 if (n > MAX_EXP)
2218 r->cl = rvc_inf;
2219 else if (n < -MAX_EXP)
2220 ;
2221 else
2222 {
2223 r->cl = rvc_normal;
2224 SET_REAL_EXP (r, n);
2225 r->sig[SIGSZ-1] = SIG_MSB;
2226 }
2227 }
2228
2229 \f
2230 static void
2231 round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
2232 {
2233 int p2, np2, i, w;
2234 unsigned long sticky;
2235 bool guard, lsb;
2236 int emin2m1, emax2;
2237
2238 p2 = fmt->p * fmt->log2_b;
2239 emin2m1 = (fmt->emin - 1) * fmt->log2_b;
2240 emax2 = fmt->emax * fmt->log2_b;
2241
2242 np2 = SIGNIFICAND_BITS - p2;
2243 switch (r->cl)
2244 {
2245 underflow:
2246 get_zero (r, r->sign);
2247 case rvc_zero:
2248 if (!fmt->has_signed_zero)
2249 r->sign = 0;
2250 return;
2251
2252 overflow:
2253 get_inf (r, r->sign);
2254 case rvc_inf:
2255 return;
2256
2257 case rvc_nan:
2258 clear_significand_below (r, np2);
2259 return;
2260
2261 case rvc_normal:
2262 break;
2263
2264 default:
2265 gcc_unreachable ();
2266 }
2267
2268 /* If we're not base2, normalize the exponent to a multiple of
2269 the true base. */
2270 if (fmt->log2_b != 1)
2271 {
2272 int shift = REAL_EXP (r) & (fmt->log2_b - 1);
2273 if (shift)
2274 {
2275 shift = fmt->log2_b - shift;
2276 r->sig[0] |= sticky_rshift_significand (r, r, shift);
2277 SET_REAL_EXP (r, REAL_EXP (r) + shift);
2278 }
2279 }
2280
2281 /* Check the range of the exponent. If we're out of range,
2282 either underflow or overflow. */
2283 if (REAL_EXP (r) > emax2)
2284 goto overflow;
2285 else if (REAL_EXP (r) <= emin2m1)
2286 {
2287 int diff;
2288
2289 if (!fmt->has_denorm)
2290 {
2291 /* Don't underflow completely until we've had a chance to round. */
2292 if (REAL_EXP (r) < emin2m1)
2293 goto underflow;
2294 }
2295 else
2296 {
2297 diff = emin2m1 - REAL_EXP (r) + 1;
2298 if (diff > p2)
2299 goto underflow;
2300
2301 /* De-normalize the significand. */
2302 r->sig[0] |= sticky_rshift_significand (r, r, diff);
2303 SET_REAL_EXP (r, REAL_EXP (r) + diff);
2304 }
2305 }
2306
2307 /* There are P2 true significand bits, followed by one guard bit,
2308 followed by one sticky bit, followed by stuff. Fold nonzero
2309 stuff into the sticky bit. */
2310
2311 sticky = 0;
2312 for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2313 sticky |= r->sig[i];
2314 sticky |=
2315 r->sig[w] & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2316
2317 guard = test_significand_bit (r, np2 - 1);
2318 lsb = test_significand_bit (r, np2);
2319
2320 /* Round to even. */
2321 if (guard && (sticky || lsb))
2322 {
2323 REAL_VALUE_TYPE u;
2324 get_zero (&u, 0);
2325 set_significand_bit (&u, np2);
2326
2327 if (add_significands (r, r, &u))
2328 {
2329 /* Overflow. Means the significand had been all ones, and
2330 is now all zeros. Need to increase the exponent, and
2331 possibly re-normalize it. */
2332 SET_REAL_EXP (r, REAL_EXP (r) + 1);
2333 if (REAL_EXP (r) > emax2)
2334 goto overflow;
2335 r->sig[SIGSZ-1] = SIG_MSB;
2336
2337 if (fmt->log2_b != 1)
2338 {
2339 int shift = REAL_EXP (r) & (fmt->log2_b - 1);
2340 if (shift)
2341 {
2342 shift = fmt->log2_b - shift;
2343 rshift_significand (r, r, shift);
2344 SET_REAL_EXP (r, REAL_EXP (r) + shift);
2345 if (REAL_EXP (r) > emax2)
2346 goto overflow;
2347 }
2348 }
2349 }
2350 }
2351
2352 /* Catch underflow that we deferred until after rounding. */
2353 if (REAL_EXP (r) <= emin2m1)
2354 goto underflow;
2355
2356 /* Clear out trailing garbage. */
2357 clear_significand_below (r, np2);
2358 }
2359
2360 /* Extend or truncate to a new mode. */
2361
2362 void
2363 real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
2364 const REAL_VALUE_TYPE *a)
2365 {
2366 const struct real_format *fmt;
2367
2368 fmt = REAL_MODE_FORMAT (mode);
2369 gcc_assert (fmt);
2370
2371 *r = *a;
2372 round_for_format (fmt, r);
2373
2374 /* round_for_format de-normalizes denormals. Undo just that part. */
2375 if (r->cl == rvc_normal)
2376 normalize (r);
2377 }
2378
2379 /* Legacy. Likewise, except return the struct directly. */
2380
2381 REAL_VALUE_TYPE
2382 real_value_truncate (enum machine_mode mode, REAL_VALUE_TYPE a)
2383 {
2384 REAL_VALUE_TYPE r;
2385 real_convert (&r, mode, &a);
2386 return r;
2387 }
2388
2389 /* Return true if truncating to MODE is exact. */
2390
2391 bool
2392 exact_real_truncate (enum machine_mode mode, const REAL_VALUE_TYPE *a)
2393 {
2394 REAL_VALUE_TYPE t;
2395 real_convert (&t, mode, a);
2396 return real_identical (&t, a);
2397 }
2398
2399 /* Write R to the given target format. Place the words of the result
2400 in target word order in BUF. There are always 32 bits in each
2401 long, no matter the size of the host long.
2402
2403 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2404
2405 long
2406 real_to_target_fmt (long *buf, const REAL_VALUE_TYPE *r_orig,
2407 const struct real_format *fmt)
2408 {
2409 REAL_VALUE_TYPE r;
2410 long buf1;
2411
2412 r = *r_orig;
2413 round_for_format (fmt, &r);
2414
2415 if (!buf)
2416 buf = &buf1;
2417 (*fmt->encode) (fmt, buf, &r);
2418
2419 return *buf;
2420 }
2421
2422 /* Similar, but look up the format from MODE. */
2423
2424 long
2425 real_to_target (long *buf, const REAL_VALUE_TYPE *r, enum machine_mode mode)
2426 {
2427 const struct real_format *fmt;
2428
2429 fmt = REAL_MODE_FORMAT (mode);
2430 gcc_assert (fmt);
2431
2432 return real_to_target_fmt (buf, r, fmt);
2433 }
2434
2435 /* Read R from the given target format. Read the words of the result
2436 in target word order in BUF. There are always 32 bits in each
2437 long, no matter the size of the host long. */
2438
2439 void
2440 real_from_target_fmt (REAL_VALUE_TYPE *r, const long *buf,
2441 const struct real_format *fmt)
2442 {
2443 (*fmt->decode) (fmt, r, buf);
2444 }
2445
2446 /* Similar, but look up the format from MODE. */
2447
2448 void
2449 real_from_target (REAL_VALUE_TYPE *r, const long *buf, enum machine_mode mode)
2450 {
2451 const struct real_format *fmt;
2452
2453 fmt = REAL_MODE_FORMAT (mode);
2454 gcc_assert (fmt);
2455
2456 (*fmt->decode) (fmt, r, buf);
2457 }
2458
2459 /* Return the number of bits in the significand for MODE. */
2460 /* ??? Legacy. Should get access to real_format directly. */
2461
2462 int
2463 significand_size (enum machine_mode mode)
2464 {
2465 const struct real_format *fmt;
2466
2467 fmt = REAL_MODE_FORMAT (mode);
2468 if (fmt == NULL)
2469 return 0;
2470
2471 return fmt->p * fmt->log2_b;
2472 }
2473
2474 /* Return a hash value for the given real value. */
2475 /* ??? The "unsigned int" return value is intended to be hashval_t,
2476 but I didn't want to pull hashtab.h into real.h. */
2477
2478 unsigned int
2479 real_hash (const REAL_VALUE_TYPE *r)
2480 {
2481 unsigned int h;
2482 size_t i;
2483
2484 h = r->cl | (r->sign << 2);
2485 switch (r->cl)
2486 {
2487 case rvc_zero:
2488 case rvc_inf:
2489 return h;
2490
2491 case rvc_normal:
2492 h |= REAL_EXP (r) << 3;
2493 break;
2494
2495 case rvc_nan:
2496 if (r->signalling)
2497 h ^= (unsigned int)-1;
2498 if (r->canonical)
2499 return h;
2500 break;
2501
2502 default:
2503 gcc_unreachable ();
2504 }
2505
2506 if (sizeof(unsigned long) > sizeof(unsigned int))
2507 for (i = 0; i < SIGSZ; ++i)
2508 {
2509 unsigned long s = r->sig[i];
2510 h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2511 }
2512 else
2513 for (i = 0; i < SIGSZ; ++i)
2514 h ^= r->sig[i];
2515
2516 return h;
2517 }
2518 \f
2519 /* IEEE single-precision format. */
2520
2521 static void encode_ieee_single (const struct real_format *fmt,
2522 long *, const REAL_VALUE_TYPE *);
2523 static void decode_ieee_single (const struct real_format *,
2524 REAL_VALUE_TYPE *, const long *);
2525
2526 static void
2527 encode_ieee_single (const struct real_format *fmt, long *buf,
2528 const REAL_VALUE_TYPE *r)
2529 {
2530 unsigned long image, sig, exp;
2531 unsigned long sign = r->sign;
2532 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2533
2534 image = sign << 31;
2535 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2536
2537 switch (r->cl)
2538 {
2539 case rvc_zero:
2540 break;
2541
2542 case rvc_inf:
2543 if (fmt->has_inf)
2544 image |= 255 << 23;
2545 else
2546 image |= 0x7fffffff;
2547 break;
2548
2549 case rvc_nan:
2550 if (fmt->has_nans)
2551 {
2552 if (r->canonical)
2553 sig = 0;
2554 if (r->signalling == fmt->qnan_msb_set)
2555 sig &= ~(1 << 22);
2556 else
2557 sig |= 1 << 22;
2558 /* We overload qnan_msb_set here: it's only clear for
2559 mips_ieee_single, which wants all mantissa bits but the
2560 quiet/signalling one set in canonical NaNs (at least
2561 Quiet ones). */
2562 if (r->canonical && !fmt->qnan_msb_set)
2563 sig |= (1 << 22) - 1;
2564 else if (sig == 0)
2565 sig = 1 << 21;
2566
2567 image |= 255 << 23;
2568 image |= sig;
2569 }
2570 else
2571 image |= 0x7fffffff;
2572 break;
2573
2574 case rvc_normal:
2575 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2576 whereas the intermediate representation is 0.F x 2**exp.
2577 Which means we're off by one. */
2578 if (denormal)
2579 exp = 0;
2580 else
2581 exp = REAL_EXP (r) + 127 - 1;
2582 image |= exp << 23;
2583 image |= sig;
2584 break;
2585
2586 default:
2587 gcc_unreachable ();
2588 }
2589
2590 buf[0] = image;
2591 }
2592
2593 static void
2594 decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2595 const long *buf)
2596 {
2597 unsigned long image = buf[0] & 0xffffffff;
2598 bool sign = (image >> 31) & 1;
2599 int exp = (image >> 23) & 0xff;
2600
2601 memset (r, 0, sizeof (*r));
2602 image <<= HOST_BITS_PER_LONG - 24;
2603 image &= ~SIG_MSB;
2604
2605 if (exp == 0)
2606 {
2607 if (image && fmt->has_denorm)
2608 {
2609 r->cl = rvc_normal;
2610 r->sign = sign;
2611 SET_REAL_EXP (r, -126);
2612 r->sig[SIGSZ-1] = image << 1;
2613 normalize (r);
2614 }
2615 else if (fmt->has_signed_zero)
2616 r->sign = sign;
2617 }
2618 else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
2619 {
2620 if (image)
2621 {
2622 r->cl = rvc_nan;
2623 r->sign = sign;
2624 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
2625 ^ fmt->qnan_msb_set);
2626 r->sig[SIGSZ-1] = image;
2627 }
2628 else
2629 {
2630 r->cl = rvc_inf;
2631 r->sign = sign;
2632 }
2633 }
2634 else
2635 {
2636 r->cl = rvc_normal;
2637 r->sign = sign;
2638 SET_REAL_EXP (r, exp - 127 + 1);
2639 r->sig[SIGSZ-1] = image | SIG_MSB;
2640 }
2641 }
2642
2643 const struct real_format ieee_single_format =
2644 {
2645 encode_ieee_single,
2646 decode_ieee_single,
2647 2,
2648 1,
2649 24,
2650 24,
2651 -125,
2652 128,
2653 31,
2654 31,
2655 true,
2656 true,
2657 true,
2658 true,
2659 true
2660 };
2661
2662 const struct real_format mips_single_format =
2663 {
2664 encode_ieee_single,
2665 decode_ieee_single,
2666 2,
2667 1,
2668 24,
2669 24,
2670 -125,
2671 128,
2672 31,
2673 31,
2674 true,
2675 true,
2676 true,
2677 true,
2678 false
2679 };
2680
2681 \f
2682 /* IEEE double-precision format. */
2683
2684 static void encode_ieee_double (const struct real_format *fmt,
2685 long *, const REAL_VALUE_TYPE *);
2686 static void decode_ieee_double (const struct real_format *,
2687 REAL_VALUE_TYPE *, const long *);
2688
2689 static void
2690 encode_ieee_double (const struct real_format *fmt, long *buf,
2691 const REAL_VALUE_TYPE *r)
2692 {
2693 unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
2694 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2695
2696 image_hi = r->sign << 31;
2697 image_lo = 0;
2698
2699 if (HOST_BITS_PER_LONG == 64)
2700 {
2701 sig_hi = r->sig[SIGSZ-1];
2702 sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
2703 sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
2704 }
2705 else
2706 {
2707 sig_hi = r->sig[SIGSZ-1];
2708 sig_lo = r->sig[SIGSZ-2];
2709 sig_lo = (sig_hi << 21) | (sig_lo >> 11);
2710 sig_hi = (sig_hi >> 11) & 0xfffff;
2711 }
2712
2713 switch (r->cl)
2714 {
2715 case rvc_zero:
2716 break;
2717
2718 case rvc_inf:
2719 if (fmt->has_inf)
2720 image_hi |= 2047 << 20;
2721 else
2722 {
2723 image_hi |= 0x7fffffff;
2724 image_lo = 0xffffffff;
2725 }
2726 break;
2727
2728 case rvc_nan:
2729 if (fmt->has_nans)
2730 {
2731 if (r->canonical)
2732 sig_hi = sig_lo = 0;
2733 if (r->signalling == fmt->qnan_msb_set)
2734 sig_hi &= ~(1 << 19);
2735 else
2736 sig_hi |= 1 << 19;
2737 /* We overload qnan_msb_set here: it's only clear for
2738 mips_ieee_single, which wants all mantissa bits but the
2739 quiet/signalling one set in canonical NaNs (at least
2740 Quiet ones). */
2741 if (r->canonical && !fmt->qnan_msb_set)
2742 {
2743 sig_hi |= (1 << 19) - 1;
2744 sig_lo = 0xffffffff;
2745 }
2746 else if (sig_hi == 0 && sig_lo == 0)
2747 sig_hi = 1 << 18;
2748
2749 image_hi |= 2047 << 20;
2750 image_hi |= sig_hi;
2751 image_lo = sig_lo;
2752 }
2753 else
2754 {
2755 image_hi |= 0x7fffffff;
2756 image_lo = 0xffffffff;
2757 }
2758 break;
2759
2760 case rvc_normal:
2761 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2762 whereas the intermediate representation is 0.F x 2**exp.
2763 Which means we're off by one. */
2764 if (denormal)
2765 exp = 0;
2766 else
2767 exp = REAL_EXP (r) + 1023 - 1;
2768 image_hi |= exp << 20;
2769 image_hi |= sig_hi;
2770 image_lo = sig_lo;
2771 break;
2772
2773 default:
2774 gcc_unreachable ();
2775 }
2776
2777 if (FLOAT_WORDS_BIG_ENDIAN)
2778 buf[0] = image_hi, buf[1] = image_lo;
2779 else
2780 buf[0] = image_lo, buf[1] = image_hi;
2781 }
2782
2783 static void
2784 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
2785 const long *buf)
2786 {
2787 unsigned long image_hi, image_lo;
2788 bool sign;
2789 int exp;
2790
2791 if (FLOAT_WORDS_BIG_ENDIAN)
2792 image_hi = buf[0], image_lo = buf[1];
2793 else
2794 image_lo = buf[0], image_hi = buf[1];
2795 image_lo &= 0xffffffff;
2796 image_hi &= 0xffffffff;
2797
2798 sign = (image_hi >> 31) & 1;
2799 exp = (image_hi >> 20) & 0x7ff;
2800
2801 memset (r, 0, sizeof (*r));
2802
2803 image_hi <<= 32 - 21;
2804 image_hi |= image_lo >> 21;
2805 image_hi &= 0x7fffffff;
2806 image_lo <<= 32 - 21;
2807
2808 if (exp == 0)
2809 {
2810 if ((image_hi || image_lo) && fmt->has_denorm)
2811 {
2812 r->cl = rvc_normal;
2813 r->sign = sign;
2814 SET_REAL_EXP (r, -1022);
2815 if (HOST_BITS_PER_LONG == 32)
2816 {
2817 image_hi = (image_hi << 1) | (image_lo >> 31);
2818 image_lo <<= 1;
2819 r->sig[SIGSZ-1] = image_hi;
2820 r->sig[SIGSZ-2] = image_lo;
2821 }
2822 else
2823 {
2824 image_hi = (image_hi << 31 << 2) | (image_lo << 1);
2825 r->sig[SIGSZ-1] = image_hi;
2826 }
2827 normalize (r);
2828 }
2829 else if (fmt->has_signed_zero)
2830 r->sign = sign;
2831 }
2832 else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
2833 {
2834 if (image_hi || image_lo)
2835 {
2836 r->cl = rvc_nan;
2837 r->sign = sign;
2838 r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
2839 if (HOST_BITS_PER_LONG == 32)
2840 {
2841 r->sig[SIGSZ-1] = image_hi;
2842 r->sig[SIGSZ-2] = image_lo;
2843 }
2844 else
2845 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
2846 }
2847 else
2848 {
2849 r->cl = rvc_inf;
2850 r->sign = sign;
2851 }
2852 }
2853 else
2854 {
2855 r->cl = rvc_normal;
2856 r->sign = sign;
2857 SET_REAL_EXP (r, exp - 1023 + 1);
2858 if (HOST_BITS_PER_LONG == 32)
2859 {
2860 r->sig[SIGSZ-1] = image_hi | SIG_MSB;
2861 r->sig[SIGSZ-2] = image_lo;
2862 }
2863 else
2864 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
2865 }
2866 }
2867
2868 const struct real_format ieee_double_format =
2869 {
2870 encode_ieee_double,
2871 decode_ieee_double,
2872 2,
2873 1,
2874 53,
2875 53,
2876 -1021,
2877 1024,
2878 63,
2879 63,
2880 true,
2881 true,
2882 true,
2883 true,
2884 true
2885 };
2886
2887 const struct real_format mips_double_format =
2888 {
2889 encode_ieee_double,
2890 decode_ieee_double,
2891 2,
2892 1,
2893 53,
2894 53,
2895 -1021,
2896 1024,
2897 63,
2898 63,
2899 true,
2900 true,
2901 true,
2902 true,
2903 false
2904 };
2905
2906 \f
2907 /* IEEE extended real format. This comes in three flavors: Intel's as
2908 a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
2909 12- and 16-byte images may be big- or little endian; Motorola's is
2910 always big endian. */
2911
2912 /* Helper subroutine which converts from the internal format to the
2913 12-byte little-endian Intel format. Functions below adjust this
2914 for the other possible formats. */
2915 static void
2916 encode_ieee_extended (const struct real_format *fmt, long *buf,
2917 const REAL_VALUE_TYPE *r)
2918 {
2919 unsigned long image_hi, sig_hi, sig_lo;
2920 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2921
2922 image_hi = r->sign << 15;
2923 sig_hi = sig_lo = 0;
2924
2925 switch (r->cl)
2926 {
2927 case rvc_zero:
2928 break;
2929
2930 case rvc_inf:
2931 if (fmt->has_inf)
2932 {
2933 image_hi |= 32767;
2934
2935 /* Intel requires the explicit integer bit to be set, otherwise
2936 it considers the value a "pseudo-infinity". Motorola docs
2937 say it doesn't care. */
2938 sig_hi = 0x80000000;
2939 }
2940 else
2941 {
2942 image_hi |= 32767;
2943 sig_lo = sig_hi = 0xffffffff;
2944 }
2945 break;
2946
2947 case rvc_nan:
2948 if (fmt->has_nans)
2949 {
2950 image_hi |= 32767;
2951 if (HOST_BITS_PER_LONG == 32)
2952 {
2953 sig_hi = r->sig[SIGSZ-1];
2954 sig_lo = r->sig[SIGSZ-2];
2955 }
2956 else
2957 {
2958 sig_lo = r->sig[SIGSZ-1];
2959 sig_hi = sig_lo >> 31 >> 1;
2960 sig_lo &= 0xffffffff;
2961 }
2962 if (r->signalling == fmt->qnan_msb_set)
2963 sig_hi &= ~(1 << 30);
2964 else
2965 sig_hi |= 1 << 30;
2966 if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
2967 sig_hi = 1 << 29;
2968
2969 /* Intel requires the explicit integer bit to be set, otherwise
2970 it considers the value a "pseudo-nan". Motorola docs say it
2971 doesn't care. */
2972 sig_hi |= 0x80000000;
2973 }
2974 else
2975 {
2976 image_hi |= 32767;
2977 sig_lo = sig_hi = 0xffffffff;
2978 }
2979 break;
2980
2981 case rvc_normal:
2982 {
2983 int exp = REAL_EXP (r);
2984
2985 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2986 whereas the intermediate representation is 0.F x 2**exp.
2987 Which means we're off by one.
2988
2989 Except for Motorola, which consider exp=0 and explicit
2990 integer bit set to continue to be normalized. In theory
2991 this discrepancy has been taken care of by the difference
2992 in fmt->emin in round_for_format. */
2993
2994 if (denormal)
2995 exp = 0;
2996 else
2997 {
2998 exp += 16383 - 1;
2999 gcc_assert (exp >= 0);
3000 }
3001 image_hi |= exp;
3002
3003 if (HOST_BITS_PER_LONG == 32)
3004 {
3005 sig_hi = r->sig[SIGSZ-1];
3006 sig_lo = r->sig[SIGSZ-2];
3007 }
3008 else
3009 {
3010 sig_lo = r->sig[SIGSZ-1];
3011 sig_hi = sig_lo >> 31 >> 1;
3012 sig_lo &= 0xffffffff;
3013 }
3014 }
3015 break;
3016
3017 default:
3018 gcc_unreachable ();
3019 }
3020
3021 buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
3022 }
3023
3024 /* Convert from the internal format to the 12-byte Motorola format
3025 for an IEEE extended real. */
3026 static void
3027 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
3028 const REAL_VALUE_TYPE *r)
3029 {
3030 long intermed[3];
3031 encode_ieee_extended (fmt, intermed, r);
3032
3033 /* Motorola chips are assumed always to be big-endian. Also, the
3034 padding in a Motorola extended real goes between the exponent and
3035 the mantissa. At this point the mantissa is entirely within
3036 elements 0 and 1 of intermed, and the exponent entirely within
3037 element 2, so all we have to do is swap the order around, and
3038 shift element 2 left 16 bits. */
3039 buf[0] = intermed[2] << 16;
3040 buf[1] = intermed[1];
3041 buf[2] = intermed[0];
3042 }
3043
3044 /* Convert from the internal format to the 12-byte Intel format for
3045 an IEEE extended real. */
3046 static void
3047 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
3048 const REAL_VALUE_TYPE *r)
3049 {
3050 if (FLOAT_WORDS_BIG_ENDIAN)
3051 {
3052 /* All the padding in an Intel-format extended real goes at the high
3053 end, which in this case is after the mantissa, not the exponent.
3054 Therefore we must shift everything down 16 bits. */
3055 long intermed[3];
3056 encode_ieee_extended (fmt, intermed, r);
3057 buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
3058 buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
3059 buf[2] = (intermed[0] << 16);
3060 }
3061 else
3062 /* encode_ieee_extended produces what we want directly. */
3063 encode_ieee_extended (fmt, buf, r);
3064 }
3065
3066 /* Convert from the internal format to the 16-byte Intel format for
3067 an IEEE extended real. */
3068 static void
3069 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
3070 const REAL_VALUE_TYPE *r)
3071 {
3072 /* All the padding in an Intel-format extended real goes at the high end. */
3073 encode_ieee_extended_intel_96 (fmt, buf, r);
3074 buf[3] = 0;
3075 }
3076
3077 /* As above, we have a helper function which converts from 12-byte
3078 little-endian Intel format to internal format. Functions below
3079 adjust for the other possible formats. */
3080 static void
3081 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3082 const long *buf)
3083 {
3084 unsigned long image_hi, sig_hi, sig_lo;
3085 bool sign;
3086 int exp;
3087
3088 sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
3089 sig_lo &= 0xffffffff;
3090 sig_hi &= 0xffffffff;
3091 image_hi &= 0xffffffff;
3092
3093 sign = (image_hi >> 15) & 1;
3094 exp = image_hi & 0x7fff;
3095
3096 memset (r, 0, sizeof (*r));
3097
3098 if (exp == 0)
3099 {
3100 if ((sig_hi || sig_lo) && fmt->has_denorm)
3101 {
3102 r->cl = rvc_normal;
3103 r->sign = sign;
3104
3105 /* When the IEEE format contains a hidden bit, we know that
3106 it's zero at this point, and so shift up the significand
3107 and decrease the exponent to match. In this case, Motorola
3108 defines the explicit integer bit to be valid, so we don't
3109 know whether the msb is set or not. */
3110 SET_REAL_EXP (r, fmt->emin);
3111 if (HOST_BITS_PER_LONG == 32)
3112 {
3113 r->sig[SIGSZ-1] = sig_hi;
3114 r->sig[SIGSZ-2] = sig_lo;
3115 }
3116 else
3117 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3118
3119 normalize (r);
3120 }
3121 else if (fmt->has_signed_zero)
3122 r->sign = sign;
3123 }
3124 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3125 {
3126 /* See above re "pseudo-infinities" and "pseudo-nans".
3127 Short summary is that the MSB will likely always be
3128 set, and that we don't care about it. */
3129 sig_hi &= 0x7fffffff;
3130
3131 if (sig_hi || sig_lo)
3132 {
3133 r->cl = rvc_nan;
3134 r->sign = sign;
3135 r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
3136 if (HOST_BITS_PER_LONG == 32)
3137 {
3138 r->sig[SIGSZ-1] = sig_hi;
3139 r->sig[SIGSZ-2] = sig_lo;
3140 }
3141 else
3142 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3143 }
3144 else
3145 {
3146 r->cl = rvc_inf;
3147 r->sign = sign;
3148 }
3149 }
3150 else
3151 {
3152 r->cl = rvc_normal;
3153 r->sign = sign;
3154 SET_REAL_EXP (r, exp - 16383 + 1);
3155 if (HOST_BITS_PER_LONG == 32)
3156 {
3157 r->sig[SIGSZ-1] = sig_hi;
3158 r->sig[SIGSZ-2] = sig_lo;
3159 }
3160 else
3161 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
3162 }
3163 }
3164
3165 /* Convert from the internal format to the 12-byte Motorola format
3166 for an IEEE extended real. */
3167 static void
3168 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3169 const long *buf)
3170 {
3171 long intermed[3];
3172
3173 /* Motorola chips are assumed always to be big-endian. Also, the
3174 padding in a Motorola extended real goes between the exponent and
3175 the mantissa; remove it. */
3176 intermed[0] = buf[2];
3177 intermed[1] = buf[1];
3178 intermed[2] = (unsigned long)buf[0] >> 16;
3179
3180 decode_ieee_extended (fmt, r, intermed);
3181 }
3182
3183 /* Convert from the internal format to the 12-byte Intel format for
3184 an IEEE extended real. */
3185 static void
3186 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3187 const long *buf)
3188 {
3189 if (FLOAT_WORDS_BIG_ENDIAN)
3190 {
3191 /* All the padding in an Intel-format extended real goes at the high
3192 end, which in this case is after the mantissa, not the exponent.
3193 Therefore we must shift everything up 16 bits. */
3194 long intermed[3];
3195
3196 intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
3197 intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
3198 intermed[2] = ((unsigned long)buf[0] >> 16);
3199
3200 decode_ieee_extended (fmt, r, intermed);
3201 }
3202 else
3203 /* decode_ieee_extended produces what we want directly. */
3204 decode_ieee_extended (fmt, r, buf);
3205 }
3206
3207 /* Convert from the internal format to the 16-byte Intel format for
3208 an IEEE extended real. */
3209 static void
3210 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3211 const long *buf)
3212 {
3213 /* All the padding in an Intel-format extended real goes at the high end. */
3214 decode_ieee_extended_intel_96 (fmt, r, buf);
3215 }
3216
3217 const struct real_format ieee_extended_motorola_format =
3218 {
3219 encode_ieee_extended_motorola,
3220 decode_ieee_extended_motorola,
3221 2,
3222 1,
3223 64,
3224 64,
3225 -16382,
3226 16384,
3227 95,
3228 95,
3229 true,
3230 true,
3231 true,
3232 true,
3233 true
3234 };
3235
3236 const struct real_format ieee_extended_intel_96_format =
3237 {
3238 encode_ieee_extended_intel_96,
3239 decode_ieee_extended_intel_96,
3240 2,
3241 1,
3242 64,
3243 64,
3244 -16381,
3245 16384,
3246 79,
3247 79,
3248 true,
3249 true,
3250 true,
3251 true,
3252 true
3253 };
3254
3255 const struct real_format ieee_extended_intel_128_format =
3256 {
3257 encode_ieee_extended_intel_128,
3258 decode_ieee_extended_intel_128,
3259 2,
3260 1,
3261 64,
3262 64,
3263 -16381,
3264 16384,
3265 79,
3266 79,
3267 true,
3268 true,
3269 true,
3270 true,
3271 true
3272 };
3273
3274 /* The following caters to i386 systems that set the rounding precision
3275 to 53 bits instead of 64, e.g. FreeBSD. */
3276 const struct real_format ieee_extended_intel_96_round_53_format =
3277 {
3278 encode_ieee_extended_intel_96,
3279 decode_ieee_extended_intel_96,
3280 2,
3281 1,
3282 53,
3283 53,
3284 -16381,
3285 16384,
3286 79,
3287 79,
3288 true,
3289 true,
3290 true,
3291 true,
3292 true
3293 };
3294 \f
3295 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3296 numbers whose sum is equal to the extended precision value. The number
3297 with greater magnitude is first. This format has the same magnitude
3298 range as an IEEE double precision value, but effectively 106 bits of
3299 significand precision. Infinity and NaN are represented by their IEEE
3300 double precision value stored in the first number, the second number is
3301 +0.0 or -0.0 for Infinity and don't-care for NaN. */
3302
3303 static void encode_ibm_extended (const struct real_format *fmt,
3304 long *, const REAL_VALUE_TYPE *);
3305 static void decode_ibm_extended (const struct real_format *,
3306 REAL_VALUE_TYPE *, const long *);
3307
3308 static void
3309 encode_ibm_extended (const struct real_format *fmt, long *buf,
3310 const REAL_VALUE_TYPE *r)
3311 {
3312 REAL_VALUE_TYPE u, normr, v;
3313 const struct real_format *base_fmt;
3314
3315 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3316
3317 /* Renormlize R before doing any arithmetic on it. */
3318 normr = *r;
3319 if (normr.cl == rvc_normal)
3320 normalize (&normr);
3321
3322 /* u = IEEE double precision portion of significand. */
3323 u = normr;
3324 round_for_format (base_fmt, &u);
3325 encode_ieee_double (base_fmt, &buf[0], &u);
3326
3327 if (u.cl == rvc_normal)
3328 {
3329 do_add (&v, &normr, &u, 1);
3330 /* Call round_for_format since we might need to denormalize. */
3331 round_for_format (base_fmt, &v);
3332 encode_ieee_double (base_fmt, &buf[2], &v);
3333 }
3334 else
3335 {
3336 /* Inf, NaN, 0 are all representable as doubles, so the
3337 least-significant part can be 0.0. */
3338 buf[2] = 0;
3339 buf[3] = 0;
3340 }
3341 }
3342
3343 static void
3344 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
3345 const long *buf)
3346 {
3347 REAL_VALUE_TYPE u, v;
3348 const struct real_format *base_fmt;
3349
3350 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
3351 decode_ieee_double (base_fmt, &u, &buf[0]);
3352
3353 if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
3354 {
3355 decode_ieee_double (base_fmt, &v, &buf[2]);
3356 do_add (r, &u, &v, 0);
3357 }
3358 else
3359 *r = u;
3360 }
3361
3362 const struct real_format ibm_extended_format =
3363 {
3364 encode_ibm_extended,
3365 decode_ibm_extended,
3366 2,
3367 1,
3368 53 + 53,
3369 53,
3370 -1021 + 53,
3371 1024,
3372 127,
3373 -1,
3374 true,
3375 true,
3376 true,
3377 true,
3378 true
3379 };
3380
3381 const struct real_format mips_extended_format =
3382 {
3383 encode_ibm_extended,
3384 decode_ibm_extended,
3385 2,
3386 1,
3387 53 + 53,
3388 53,
3389 -1021 + 53,
3390 1024,
3391 127,
3392 -1,
3393 true,
3394 true,
3395 true,
3396 true,
3397 false
3398 };
3399
3400 \f
3401 /* IEEE quad precision format. */
3402
3403 static void encode_ieee_quad (const struct real_format *fmt,
3404 long *, const REAL_VALUE_TYPE *);
3405 static void decode_ieee_quad (const struct real_format *,
3406 REAL_VALUE_TYPE *, const long *);
3407
3408 static void
3409 encode_ieee_quad (const struct real_format *fmt, long *buf,
3410 const REAL_VALUE_TYPE *r)
3411 {
3412 unsigned long image3, image2, image1, image0, exp;
3413 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3414 REAL_VALUE_TYPE u;
3415
3416 image3 = r->sign << 31;
3417 image2 = 0;
3418 image1 = 0;
3419 image0 = 0;
3420
3421 rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3422
3423 switch (r->cl)
3424 {
3425 case rvc_zero:
3426 break;
3427
3428 case rvc_inf:
3429 if (fmt->has_inf)
3430 image3 |= 32767 << 16;
3431 else
3432 {
3433 image3 |= 0x7fffffff;
3434 image2 = 0xffffffff;
3435 image1 = 0xffffffff;
3436 image0 = 0xffffffff;
3437 }
3438 break;
3439
3440 case rvc_nan:
3441 if (fmt->has_nans)
3442 {
3443 image3 |= 32767 << 16;
3444
3445 if (r->canonical)
3446 {
3447 /* Don't use bits from the significand. The
3448 initialization above is right. */
3449 }
3450 else if (HOST_BITS_PER_LONG == 32)
3451 {
3452 image0 = u.sig[0];
3453 image1 = u.sig[1];
3454 image2 = u.sig[2];
3455 image3 |= u.sig[3] & 0xffff;
3456 }
3457 else
3458 {
3459 image0 = u.sig[0];
3460 image1 = image0 >> 31 >> 1;
3461 image2 = u.sig[1];
3462 image3 |= (image2 >> 31 >> 1) & 0xffff;
3463 image0 &= 0xffffffff;
3464 image2 &= 0xffffffff;
3465 }
3466 if (r->signalling == fmt->qnan_msb_set)
3467 image3 &= ~0x8000;
3468 else
3469 image3 |= 0x8000;
3470 /* We overload qnan_msb_set here: it's only clear for
3471 mips_ieee_single, which wants all mantissa bits but the
3472 quiet/signalling one set in canonical NaNs (at least
3473 Quiet ones). */
3474 if (r->canonical && !fmt->qnan_msb_set)
3475 {
3476 image3 |= 0x7fff;
3477 image2 = image1 = image0 = 0xffffffff;
3478 }
3479 else if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
3480 image3 |= 0x4000;
3481 }
3482 else
3483 {
3484 image3 |= 0x7fffffff;
3485 image2 = 0xffffffff;
3486 image1 = 0xffffffff;
3487 image0 = 0xffffffff;
3488 }
3489 break;
3490
3491 case rvc_normal:
3492 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3493 whereas the intermediate representation is 0.F x 2**exp.
3494 Which means we're off by one. */
3495 if (denormal)
3496 exp = 0;
3497 else
3498 exp = REAL_EXP (r) + 16383 - 1;
3499 image3 |= exp << 16;
3500
3501 if (HOST_BITS_PER_LONG == 32)
3502 {
3503 image0 = u.sig[0];
3504 image1 = u.sig[1];
3505 image2 = u.sig[2];
3506 image3 |= u.sig[3] & 0xffff;
3507 }
3508 else
3509 {
3510 image0 = u.sig[0];
3511 image1 = image0 >> 31 >> 1;
3512 image2 = u.sig[1];
3513 image3 |= (image2 >> 31 >> 1) & 0xffff;
3514 image0 &= 0xffffffff;
3515 image2 &= 0xffffffff;
3516 }
3517 break;
3518
3519 default:
3520 gcc_unreachable ();
3521 }
3522
3523 if (FLOAT_WORDS_BIG_ENDIAN)
3524 {
3525 buf[0] = image3;
3526 buf[1] = image2;
3527 buf[2] = image1;
3528 buf[3] = image0;
3529 }
3530 else
3531 {
3532 buf[0] = image0;
3533 buf[1] = image1;
3534 buf[2] = image2;
3535 buf[3] = image3;
3536 }
3537 }
3538
3539 static void
3540 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
3541 const long *buf)
3542 {
3543 unsigned long image3, image2, image1, image0;
3544 bool sign;
3545 int exp;
3546
3547 if (FLOAT_WORDS_BIG_ENDIAN)
3548 {
3549 image3 = buf[0];
3550 image2 = buf[1];
3551 image1 = buf[2];
3552 image0 = buf[3];
3553 }
3554 else
3555 {
3556 image0 = buf[0];
3557 image1 = buf[1];
3558 image2 = buf[2];
3559 image3 = buf[3];
3560 }
3561 image0 &= 0xffffffff;
3562 image1 &= 0xffffffff;
3563 image2 &= 0xffffffff;
3564
3565 sign = (image3 >> 31) & 1;
3566 exp = (image3 >> 16) & 0x7fff;
3567 image3 &= 0xffff;
3568
3569 memset (r, 0, sizeof (*r));
3570
3571 if (exp == 0)
3572 {
3573 if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
3574 {
3575 r->cl = rvc_normal;
3576 r->sign = sign;
3577
3578 SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
3579 if (HOST_BITS_PER_LONG == 32)
3580 {
3581 r->sig[0] = image0;
3582 r->sig[1] = image1;
3583 r->sig[2] = image2;
3584 r->sig[3] = image3;
3585 }
3586 else
3587 {
3588 r->sig[0] = (image1 << 31 << 1) | image0;
3589 r->sig[1] = (image3 << 31 << 1) | image2;
3590 }
3591
3592 normalize (r);
3593 }
3594 else if (fmt->has_signed_zero)
3595 r->sign = sign;
3596 }
3597 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3598 {
3599 if (image3 | image2 | image1 | image0)
3600 {
3601 r->cl = rvc_nan;
3602 r->sign = sign;
3603 r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
3604
3605 if (HOST_BITS_PER_LONG == 32)
3606 {
3607 r->sig[0] = image0;
3608 r->sig[1] = image1;
3609 r->sig[2] = image2;
3610 r->sig[3] = image3;
3611 }
3612 else
3613 {
3614 r->sig[0] = (image1 << 31 << 1) | image0;
3615 r->sig[1] = (image3 << 31 << 1) | image2;
3616 }
3617 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3618 }
3619 else
3620 {
3621 r->cl = rvc_inf;
3622 r->sign = sign;
3623 }
3624 }
3625 else
3626 {
3627 r->cl = rvc_normal;
3628 r->sign = sign;
3629 SET_REAL_EXP (r, exp - 16383 + 1);
3630
3631 if (HOST_BITS_PER_LONG == 32)
3632 {
3633 r->sig[0] = image0;
3634 r->sig[1] = image1;
3635 r->sig[2] = image2;
3636 r->sig[3] = image3;
3637 }
3638 else
3639 {
3640 r->sig[0] = (image1 << 31 << 1) | image0;
3641 r->sig[1] = (image3 << 31 << 1) | image2;
3642 }
3643 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3644 r->sig[SIGSZ-1] |= SIG_MSB;
3645 }
3646 }
3647
3648 const struct real_format ieee_quad_format =
3649 {
3650 encode_ieee_quad,
3651 decode_ieee_quad,
3652 2,
3653 1,
3654 113,
3655 113,
3656 -16381,
3657 16384,
3658 127,
3659 127,
3660 true,
3661 true,
3662 true,
3663 true,
3664 true
3665 };
3666
3667 const struct real_format mips_quad_format =
3668 {
3669 encode_ieee_quad,
3670 decode_ieee_quad,
3671 2,
3672 1,
3673 113,
3674 113,
3675 -16381,
3676 16384,
3677 127,
3678 127,
3679 true,
3680 true,
3681 true,
3682 true,
3683 false
3684 };
3685 \f
3686 /* Descriptions of VAX floating point formats can be found beginning at
3687
3688 http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
3689
3690 The thing to remember is that they're almost IEEE, except for word
3691 order, exponent bias, and the lack of infinities, nans, and denormals.
3692
3693 We don't implement the H_floating format here, simply because neither
3694 the VAX or Alpha ports use it. */
3695
3696 static void encode_vax_f (const struct real_format *fmt,
3697 long *, const REAL_VALUE_TYPE *);
3698 static void decode_vax_f (const struct real_format *,
3699 REAL_VALUE_TYPE *, const long *);
3700 static void encode_vax_d (const struct real_format *fmt,
3701 long *, const REAL_VALUE_TYPE *);
3702 static void decode_vax_d (const struct real_format *,
3703 REAL_VALUE_TYPE *, const long *);
3704 static void encode_vax_g (const struct real_format *fmt,
3705 long *, const REAL_VALUE_TYPE *);
3706 static void decode_vax_g (const struct real_format *,
3707 REAL_VALUE_TYPE *, const long *);
3708
3709 static void
3710 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3711 const REAL_VALUE_TYPE *r)
3712 {
3713 unsigned long sign, exp, sig, image;
3714
3715 sign = r->sign << 15;
3716
3717 switch (r->cl)
3718 {
3719 case rvc_zero:
3720 image = 0;
3721 break;
3722
3723 case rvc_inf:
3724 case rvc_nan:
3725 image = 0xffff7fff | sign;
3726 break;
3727
3728 case rvc_normal:
3729 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
3730 exp = REAL_EXP (r) + 128;
3731
3732 image = (sig << 16) & 0xffff0000;
3733 image |= sign;
3734 image |= exp << 7;
3735 image |= sig >> 16;
3736 break;
3737
3738 default:
3739 gcc_unreachable ();
3740 }
3741
3742 buf[0] = image;
3743 }
3744
3745 static void
3746 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
3747 REAL_VALUE_TYPE *r, const long *buf)
3748 {
3749 unsigned long image = buf[0] & 0xffffffff;
3750 int exp = (image >> 7) & 0xff;
3751
3752 memset (r, 0, sizeof (*r));
3753
3754 if (exp != 0)
3755 {
3756 r->cl = rvc_normal;
3757 r->sign = (image >> 15) & 1;
3758 SET_REAL_EXP (r, exp - 128);
3759
3760 image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
3761 r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
3762 }
3763 }
3764
3765 static void
3766 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3767 const REAL_VALUE_TYPE *r)
3768 {
3769 unsigned long image0, image1, sign = r->sign << 15;
3770
3771 switch (r->cl)
3772 {
3773 case rvc_zero:
3774 image0 = image1 = 0;
3775 break;
3776
3777 case rvc_inf:
3778 case rvc_nan:
3779 image0 = 0xffff7fff | sign;
3780 image1 = 0xffffffff;
3781 break;
3782
3783 case rvc_normal:
3784 /* Extract the significand into straight hi:lo. */
3785 if (HOST_BITS_PER_LONG == 64)
3786 {
3787 image0 = r->sig[SIGSZ-1];
3788 image1 = (image0 >> (64 - 56)) & 0xffffffff;
3789 image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
3790 }
3791 else
3792 {
3793 image0 = r->sig[SIGSZ-1];
3794 image1 = r->sig[SIGSZ-2];
3795 image1 = (image0 << 24) | (image1 >> 8);
3796 image0 = (image0 >> 8) & 0xffffff;
3797 }
3798
3799 /* Rearrange the half-words of the significand to match the
3800 external format. */
3801 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
3802 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3803
3804 /* Add the sign and exponent. */
3805 image0 |= sign;
3806 image0 |= (REAL_EXP (r) + 128) << 7;
3807 break;
3808
3809 default:
3810 gcc_unreachable ();
3811 }
3812
3813 if (FLOAT_WORDS_BIG_ENDIAN)
3814 buf[0] = image1, buf[1] = image0;
3815 else
3816 buf[0] = image0, buf[1] = image1;
3817 }
3818
3819 static void
3820 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
3821 REAL_VALUE_TYPE *r, const long *buf)
3822 {
3823 unsigned long image0, image1;
3824 int exp;
3825
3826 if (FLOAT_WORDS_BIG_ENDIAN)
3827 image1 = buf[0], image0 = buf[1];
3828 else
3829 image0 = buf[0], image1 = buf[1];
3830 image0 &= 0xffffffff;
3831 image1 &= 0xffffffff;
3832
3833 exp = (image0 >> 7) & 0xff;
3834
3835 memset (r, 0, sizeof (*r));
3836
3837 if (exp != 0)
3838 {
3839 r->cl = rvc_normal;
3840 r->sign = (image0 >> 15) & 1;
3841 SET_REAL_EXP (r, exp - 128);
3842
3843 /* Rearrange the half-words of the external format into
3844 proper ascending order. */
3845 image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
3846 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3847
3848 if (HOST_BITS_PER_LONG == 64)
3849 {
3850 image0 = (image0 << 31 << 1) | image1;
3851 image0 <<= 64 - 56;
3852 image0 |= SIG_MSB;
3853 r->sig[SIGSZ-1] = image0;
3854 }
3855 else
3856 {
3857 r->sig[SIGSZ-1] = image0;
3858 r->sig[SIGSZ-2] = image1;
3859 lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
3860 r->sig[SIGSZ-1] |= SIG_MSB;
3861 }
3862 }
3863 }
3864
3865 static void
3866 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
3867 const REAL_VALUE_TYPE *r)
3868 {
3869 unsigned long image0, image1, sign = r->sign << 15;
3870
3871 switch (r->cl)
3872 {
3873 case rvc_zero:
3874 image0 = image1 = 0;
3875 break;
3876
3877 case rvc_inf:
3878 case rvc_nan:
3879 image0 = 0xffff7fff | sign;
3880 image1 = 0xffffffff;
3881 break;
3882
3883 case rvc_normal:
3884 /* Extract the significand into straight hi:lo. */
3885 if (HOST_BITS_PER_LONG == 64)
3886 {
3887 image0 = r->sig[SIGSZ-1];
3888 image1 = (image0 >> (64 - 53)) & 0xffffffff;
3889 image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
3890 }
3891 else
3892 {
3893 image0 = r->sig[SIGSZ-1];
3894 image1 = r->sig[SIGSZ-2];
3895 image1 = (image0 << 21) | (image1 >> 11);
3896 image0 = (image0 >> 11) & 0xfffff;
3897 }
3898
3899 /* Rearrange the half-words of the significand to match the
3900 external format. */
3901 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
3902 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3903
3904 /* Add the sign and exponent. */
3905 image0 |= sign;
3906 image0 |= (REAL_EXP (r) + 1024) << 4;
3907 break;
3908
3909 default:
3910 gcc_unreachable ();
3911 }
3912
3913 if (FLOAT_WORDS_BIG_ENDIAN)
3914 buf[0] = image1, buf[1] = image0;
3915 else
3916 buf[0] = image0, buf[1] = image1;
3917 }
3918
3919 static void
3920 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
3921 REAL_VALUE_TYPE *r, const long *buf)
3922 {
3923 unsigned long image0, image1;
3924 int exp;
3925
3926 if (FLOAT_WORDS_BIG_ENDIAN)
3927 image1 = buf[0], image0 = buf[1];
3928 else
3929 image0 = buf[0], image1 = buf[1];
3930 image0 &= 0xffffffff;
3931 image1 &= 0xffffffff;
3932
3933 exp = (image0 >> 4) & 0x7ff;
3934
3935 memset (r, 0, sizeof (*r));
3936
3937 if (exp != 0)
3938 {
3939 r->cl = rvc_normal;
3940 r->sign = (image0 >> 15) & 1;
3941 SET_REAL_EXP (r, exp - 1024);
3942
3943 /* Rearrange the half-words of the external format into
3944 proper ascending order. */
3945 image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
3946 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3947
3948 if (HOST_BITS_PER_LONG == 64)
3949 {
3950 image0 = (image0 << 31 << 1) | image1;
3951 image0 <<= 64 - 53;
3952 image0 |= SIG_MSB;
3953 r->sig[SIGSZ-1] = image0;
3954 }
3955 else
3956 {
3957 r->sig[SIGSZ-1] = image0;
3958 r->sig[SIGSZ-2] = image1;
3959 lshift_significand (r, r, 64 - 53);
3960 r->sig[SIGSZ-1] |= SIG_MSB;
3961 }
3962 }
3963 }
3964
3965 const struct real_format vax_f_format =
3966 {
3967 encode_vax_f,
3968 decode_vax_f,
3969 2,
3970 1,
3971 24,
3972 24,
3973 -127,
3974 127,
3975 15,
3976 15,
3977 false,
3978 false,
3979 false,
3980 false,
3981 false
3982 };
3983
3984 const struct real_format vax_d_format =
3985 {
3986 encode_vax_d,
3987 decode_vax_d,
3988 2,
3989 1,
3990 56,
3991 56,
3992 -127,
3993 127,
3994 15,
3995 15,
3996 false,
3997 false,
3998 false,
3999 false,
4000 false
4001 };
4002
4003 const struct real_format vax_g_format =
4004 {
4005 encode_vax_g,
4006 decode_vax_g,
4007 2,
4008 1,
4009 53,
4010 53,
4011 -1023,
4012 1023,
4013 15,
4014 15,
4015 false,
4016 false,
4017 false,
4018 false,
4019 false
4020 };
4021 \f
4022 /* A good reference for these can be found in chapter 9 of
4023 "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
4024 An on-line version can be found here:
4025
4026 http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
4027 */
4028
4029 static void encode_i370_single (const struct real_format *fmt,
4030 long *, const REAL_VALUE_TYPE *);
4031 static void decode_i370_single (const struct real_format *,
4032 REAL_VALUE_TYPE *, const long *);
4033 static void encode_i370_double (const struct real_format *fmt,
4034 long *, const REAL_VALUE_TYPE *);
4035 static void decode_i370_double (const struct real_format *,
4036 REAL_VALUE_TYPE *, const long *);
4037
4038 static void
4039 encode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4040 long *buf, const REAL_VALUE_TYPE *r)
4041 {
4042 unsigned long sign, exp, sig, image;
4043
4044 sign = r->sign << 31;
4045
4046 switch (r->cl)
4047 {
4048 case rvc_zero:
4049 image = 0;
4050 break;
4051
4052 case rvc_inf:
4053 case rvc_nan:
4054 image = 0x7fffffff | sign;
4055 break;
4056
4057 case rvc_normal:
4058 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
4059 exp = ((REAL_EXP (r) / 4) + 64) << 24;
4060 image = sign | exp | sig;
4061 break;
4062
4063 default:
4064 gcc_unreachable ();
4065 }
4066
4067 buf[0] = image;
4068 }
4069
4070 static void
4071 decode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4072 REAL_VALUE_TYPE *r, const long *buf)
4073 {
4074 unsigned long sign, sig, image = buf[0];
4075 int exp;
4076
4077 sign = (image >> 31) & 1;
4078 exp = (image >> 24) & 0x7f;
4079 sig = image & 0xffffff;
4080
4081 memset (r, 0, sizeof (*r));
4082
4083 if (exp || sig)
4084 {
4085 r->cl = rvc_normal;
4086 r->sign = sign;
4087 SET_REAL_EXP (r, (exp - 64) * 4);
4088 r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
4089 normalize (r);
4090 }
4091 }
4092
4093 static void
4094 encode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4095 long *buf, const REAL_VALUE_TYPE *r)
4096 {
4097 unsigned long sign, exp, image_hi, image_lo;
4098
4099 sign = r->sign << 31;
4100
4101 switch (r->cl)
4102 {
4103 case rvc_zero:
4104 image_hi = image_lo = 0;
4105 break;
4106
4107 case rvc_inf:
4108 case rvc_nan:
4109 image_hi = 0x7fffffff | sign;
4110 image_lo = 0xffffffff;
4111 break;
4112
4113 case rvc_normal:
4114 if (HOST_BITS_PER_LONG == 64)
4115 {
4116 image_hi = r->sig[SIGSZ-1];
4117 image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
4118 image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
4119 }
4120 else
4121 {
4122 image_hi = r->sig[SIGSZ-1];
4123 image_lo = r->sig[SIGSZ-2];
4124 image_lo = (image_lo >> 8) | (image_hi << 24);
4125 image_hi >>= 8;
4126 }
4127
4128 exp = ((REAL_EXP (r) / 4) + 64) << 24;
4129 image_hi |= sign | exp;
4130 break;
4131
4132 default:
4133 gcc_unreachable ();
4134 }
4135
4136 if (FLOAT_WORDS_BIG_ENDIAN)
4137 buf[0] = image_hi, buf[1] = image_lo;
4138 else
4139 buf[0] = image_lo, buf[1] = image_hi;
4140 }
4141
4142 static void
4143 decode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
4144 REAL_VALUE_TYPE *r, const long *buf)
4145 {
4146 unsigned long sign, image_hi, image_lo;
4147 int exp;
4148
4149 if (FLOAT_WORDS_BIG_ENDIAN)
4150 image_hi = buf[0], image_lo = buf[1];
4151 else
4152 image_lo = buf[0], image_hi = buf[1];
4153
4154 sign = (image_hi >> 31) & 1;
4155 exp = (image_hi >> 24) & 0x7f;
4156 image_hi &= 0xffffff;
4157 image_lo &= 0xffffffff;
4158
4159 memset (r, 0, sizeof (*r));
4160
4161 if (exp || image_hi || image_lo)
4162 {
4163 r->cl = rvc_normal;
4164 r->sign = sign;
4165 SET_REAL_EXP (r, (exp - 64) * 4 + (SIGNIFICAND_BITS - 56));
4166
4167 if (HOST_BITS_PER_LONG == 32)
4168 {
4169 r->sig[0] = image_lo;
4170 r->sig[1] = image_hi;
4171 }
4172 else
4173 r->sig[0] = image_lo | (image_hi << 31 << 1);
4174
4175 normalize (r);
4176 }
4177 }
4178
4179 const struct real_format i370_single_format =
4180 {
4181 encode_i370_single,
4182 decode_i370_single,
4183 16,
4184 4,
4185 6,
4186 6,
4187 -64,
4188 63,
4189 31,
4190 31,
4191 false,
4192 false,
4193 false, /* ??? The encoding does allow for "unnormals". */
4194 false, /* ??? The encoding does allow for "unnormals". */
4195 false
4196 };
4197
4198 const struct real_format i370_double_format =
4199 {
4200 encode_i370_double,
4201 decode_i370_double,
4202 16,
4203 4,
4204 14,
4205 14,
4206 -64,
4207 63,
4208 63,
4209 63,
4210 false,
4211 false,
4212 false, /* ??? The encoding does allow for "unnormals". */
4213 false, /* ??? The encoding does allow for "unnormals". */
4214 false
4215 };
4216 \f
4217 /* The "twos-complement" c4x format is officially defined as
4218
4219 x = s(~s).f * 2**e
4220
4221 This is rather misleading. One must remember that F is signed.
4222 A better description would be
4223
4224 x = -1**s * ((s + 1 + .f) * 2**e
4225
4226 So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
4227 that's -1 * (1+1+(-.5)) == -1.5. I think.
4228
4229 The constructions here are taken from Tables 5-1 and 5-2 of the
4230 TMS320C4x User's Guide wherein step-by-step instructions for
4231 conversion from IEEE are presented. That's close enough to our
4232 internal representation so as to make things easy.
4233
4234 See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf */
4235
4236 static void encode_c4x_single (const struct real_format *fmt,
4237 long *, const REAL_VALUE_TYPE *);
4238 static void decode_c4x_single (const struct real_format *,
4239 REAL_VALUE_TYPE *, const long *);
4240 static void encode_c4x_extended (const struct real_format *fmt,
4241 long *, const REAL_VALUE_TYPE *);
4242 static void decode_c4x_extended (const struct real_format *,
4243 REAL_VALUE_TYPE *, const long *);
4244
4245 static void
4246 encode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4247 long *buf, const REAL_VALUE_TYPE *r)
4248 {
4249 unsigned long image, exp, sig;
4250
4251 switch (r->cl)
4252 {
4253 case rvc_zero:
4254 exp = -128;
4255 sig = 0;
4256 break;
4257
4258 case rvc_inf:
4259 case rvc_nan:
4260 exp = 127;
4261 sig = 0x800000 - r->sign;
4262 break;
4263
4264 case rvc_normal:
4265 exp = REAL_EXP (r) - 1;
4266 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
4267 if (r->sign)
4268 {
4269 if (sig)
4270 sig = -sig;
4271 else
4272 exp--;
4273 sig |= 0x800000;
4274 }
4275 break;
4276
4277 default:
4278 gcc_unreachable ();
4279 }
4280
4281 image = ((exp & 0xff) << 24) | (sig & 0xffffff);
4282 buf[0] = image;
4283 }
4284
4285 static void
4286 decode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
4287 REAL_VALUE_TYPE *r, const long *buf)
4288 {
4289 unsigned long image = buf[0];
4290 unsigned long sig;
4291 int exp, sf;
4292
4293 exp = (((image >> 24) & 0xff) ^ 0x80) - 0x80;
4294 sf = ((image & 0xffffff) ^ 0x800000) - 0x800000;
4295
4296 memset (r, 0, sizeof (*r));
4297
4298 if (exp != -128)
4299 {
4300 r->cl = rvc_normal;
4301
4302 sig = sf & 0x7fffff;
4303 if (sf < 0)
4304 {
4305 r->sign = 1;
4306 if (sig)
4307 sig = -sig;
4308 else
4309 exp++;
4310 }
4311 sig = (sig << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
4312
4313 SET_REAL_EXP (r, exp + 1);
4314 r->sig[SIGSZ-1] = sig;
4315 }
4316 }
4317
4318 static void
4319 encode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4320 long *buf, const REAL_VALUE_TYPE *r)
4321 {
4322 unsigned long exp, sig;
4323
4324 switch (r->cl)
4325 {
4326 case rvc_zero:
4327 exp = -128;
4328 sig = 0;
4329 break;
4330
4331 case rvc_inf:
4332 case rvc_nan:
4333 exp = 127;
4334 sig = 0x80000000 - r->sign;
4335 break;
4336
4337 case rvc_normal:
4338 exp = REAL_EXP (r) - 1;
4339
4340 sig = r->sig[SIGSZ-1];
4341 if (HOST_BITS_PER_LONG == 64)
4342 sig = sig >> 1 >> 31;
4343 sig &= 0x7fffffff;
4344
4345 if (r->sign)
4346 {
4347 if (sig)
4348 sig = -sig;
4349 else
4350 exp--;
4351 sig |= 0x80000000;
4352 }
4353 break;
4354
4355 default:
4356 gcc_unreachable ();
4357 }
4358
4359 exp = (exp & 0xff) << 24;
4360 sig &= 0xffffffff;
4361
4362 if (FLOAT_WORDS_BIG_ENDIAN)
4363 buf[0] = exp, buf[1] = sig;
4364 else
4365 buf[0] = sig, buf[0] = exp;
4366 }
4367
4368 static void
4369 decode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
4370 REAL_VALUE_TYPE *r, const long *buf)
4371 {
4372 unsigned long sig;
4373 int exp, sf;
4374
4375 if (FLOAT_WORDS_BIG_ENDIAN)
4376 exp = buf[0], sf = buf[1];
4377 else
4378 sf = buf[0], exp = buf[1];
4379
4380 exp = (((exp >> 24) & 0xff) & 0x80) - 0x80;
4381 sf = ((sf & 0xffffffff) ^ 0x80000000) - 0x80000000;
4382
4383 memset (r, 0, sizeof (*r));
4384
4385 if (exp != -128)
4386 {
4387 r->cl = rvc_normal;
4388
4389 sig = sf & 0x7fffffff;
4390 if (sf < 0)
4391 {
4392 r->sign = 1;
4393 if (sig)
4394 sig = -sig;
4395 else
4396 exp++;
4397 }
4398 if (HOST_BITS_PER_LONG == 64)
4399 sig = sig << 1 << 31;
4400 sig |= SIG_MSB;
4401
4402 SET_REAL_EXP (r, exp + 1);
4403 r->sig[SIGSZ-1] = sig;
4404 }
4405 }
4406
4407 const struct real_format c4x_single_format =
4408 {
4409 encode_c4x_single,
4410 decode_c4x_single,
4411 2,
4412 1,
4413 24,
4414 24,
4415 -126,
4416 128,
4417 23,
4418 -1,
4419 false,
4420 false,
4421 false,
4422 false,
4423 false
4424 };
4425
4426 const struct real_format c4x_extended_format =
4427 {
4428 encode_c4x_extended,
4429 decode_c4x_extended,
4430 2,
4431 1,
4432 32,
4433 32,
4434 -126,
4435 128,
4436 31,
4437 -1,
4438 false,
4439 false,
4440 false,
4441 false,
4442 false
4443 };
4444
4445 \f
4446 /* A synthetic "format" for internal arithmetic. It's the size of the
4447 internal significand minus the two bits needed for proper rounding.
4448 The encode and decode routines exist only to satisfy our paranoia
4449 harness. */
4450
4451 static void encode_internal (const struct real_format *fmt,
4452 long *, const REAL_VALUE_TYPE *);
4453 static void decode_internal (const struct real_format *,
4454 REAL_VALUE_TYPE *, const long *);
4455
4456 static void
4457 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
4458 const REAL_VALUE_TYPE *r)
4459 {
4460 memcpy (buf, r, sizeof (*r));
4461 }
4462
4463 static void
4464 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
4465 REAL_VALUE_TYPE *r, const long *buf)
4466 {
4467 memcpy (r, buf, sizeof (*r));
4468 }
4469
4470 const struct real_format real_internal_format =
4471 {
4472 encode_internal,
4473 decode_internal,
4474 2,
4475 1,
4476 SIGNIFICAND_BITS - 2,
4477 SIGNIFICAND_BITS - 2,
4478 -MAX_EXP,
4479 MAX_EXP,
4480 -1,
4481 -1,
4482 true,
4483 true,
4484 false,
4485 true,
4486 true
4487 };
4488 \f
4489 /* Calculate the square root of X in mode MODE, and store the result
4490 in R. Return TRUE if the operation does not raise an exception.
4491 For details see "High Precision Division and Square Root",
4492 Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June
4493 1993. http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf. */
4494
4495 bool
4496 real_sqrt (REAL_VALUE_TYPE *r, enum machine_mode mode,
4497 const REAL_VALUE_TYPE *x)
4498 {
4499 static REAL_VALUE_TYPE halfthree;
4500 static bool init = false;
4501 REAL_VALUE_TYPE h, t, i;
4502 int iter, exp;
4503
4504 /* sqrt(-0.0) is -0.0. */
4505 if (real_isnegzero (x))
4506 {
4507 *r = *x;
4508 return false;
4509 }
4510
4511 /* Negative arguments return NaN. */
4512 if (real_isneg (x))
4513 {
4514 get_canonical_qnan (r, 0);
4515 return false;
4516 }
4517
4518 /* Infinity and NaN return themselves. */
4519 if (real_isinf (x) || real_isnan (x))
4520 {
4521 *r = *x;
4522 return false;
4523 }
4524
4525 if (!init)
4526 {
4527 do_add (&halfthree, &dconst1, &dconsthalf, 0);
4528 init = true;
4529 }
4530
4531 /* Initial guess for reciprocal sqrt, i. */
4532 exp = real_exponent (x);
4533 real_ldexp (&i, &dconst1, -exp/2);
4534
4535 /* Newton's iteration for reciprocal sqrt, i. */
4536 for (iter = 0; iter < 16; iter++)
4537 {
4538 /* i(n+1) = i(n) * (1.5 - 0.5*i(n)*i(n)*x). */
4539 do_multiply (&t, x, &i);
4540 do_multiply (&h, &t, &i);
4541 do_multiply (&t, &h, &dconsthalf);
4542 do_add (&h, &halfthree, &t, 1);
4543 do_multiply (&t, &i, &h);
4544
4545 /* Check for early convergence. */
4546 if (iter >= 6 && real_identical (&i, &t))
4547 break;
4548
4549 /* ??? Unroll loop to avoid copying. */
4550 i = t;
4551 }
4552
4553 /* Final iteration: r = i*x + 0.5*i*x*(1.0 - i*(i*x)). */
4554 do_multiply (&t, x, &i);
4555 do_multiply (&h, &t, &i);
4556 do_add (&i, &dconst1, &h, 1);
4557 do_multiply (&h, &t, &i);
4558 do_multiply (&i, &dconsthalf, &h);
4559 do_add (&h, &t, &i, 0);
4560
4561 /* ??? We need a Tuckerman test to get the last bit. */
4562
4563 real_convert (r, mode, &h);
4564 return true;
4565 }
4566
4567 /* Calculate X raised to the integer exponent N in mode MODE and store
4568 the result in R. Return true if the result may be inexact due to
4569 loss of precision. The algorithm is the classic "left-to-right binary
4570 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4571 Algorithms", "The Art of Computer Programming", Volume 2. */
4572
4573 bool
4574 real_powi (REAL_VALUE_TYPE *r, enum machine_mode mode,
4575 const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
4576 {
4577 unsigned HOST_WIDE_INT bit;
4578 REAL_VALUE_TYPE t;
4579 bool inexact = false;
4580 bool init = false;
4581 bool neg;
4582 int i;
4583
4584 if (n == 0)
4585 {
4586 *r = dconst1;
4587 return false;
4588 }
4589 else if (n < 0)
4590 {
4591 /* Don't worry about overflow, from now on n is unsigned. */
4592 neg = true;
4593 n = -n;
4594 }
4595 else
4596 neg = false;
4597
4598 t = *x;
4599 bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
4600 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
4601 {
4602 if (init)
4603 {
4604 inexact |= do_multiply (&t, &t, &t);
4605 if (n & bit)
4606 inexact |= do_multiply (&t, &t, x);
4607 }
4608 else if (n & bit)
4609 init = true;
4610 bit >>= 1;
4611 }
4612
4613 if (neg)
4614 inexact |= do_divide (&t, &dconst1, &t);
4615
4616 real_convert (r, mode, &t);
4617 return inexact;
4618 }
4619
4620 /* Round X to the nearest integer not larger in absolute value, i.e.
4621 towards zero, placing the result in R in mode MODE. */
4622
4623 void
4624 real_trunc (REAL_VALUE_TYPE *r, enum machine_mode mode,
4625 const REAL_VALUE_TYPE *x)
4626 {
4627 do_fix_trunc (r, x);
4628 if (mode != VOIDmode)
4629 real_convert (r, mode, r);
4630 }
4631
4632 /* Round X to the largest integer not greater in value, i.e. round
4633 down, placing the result in R in mode MODE. */
4634
4635 void
4636 real_floor (REAL_VALUE_TYPE *r, enum machine_mode mode,
4637 const REAL_VALUE_TYPE *x)
4638 {
4639 REAL_VALUE_TYPE t;
4640
4641 do_fix_trunc (&t, x);
4642 if (! real_identical (&t, x) && x->sign)
4643 do_add (&t, &t, &dconstm1, 0);
4644 if (mode != VOIDmode)
4645 real_convert (r, mode, &t);
4646 else
4647 *r = t;
4648 }
4649
4650 /* Round X to the smallest integer not less then argument, i.e. round
4651 up, placing the result in R in mode MODE. */
4652
4653 void
4654 real_ceil (REAL_VALUE_TYPE *r, enum machine_mode mode,
4655 const REAL_VALUE_TYPE *x)
4656 {
4657 REAL_VALUE_TYPE t;
4658
4659 do_fix_trunc (&t, x);
4660 if (! real_identical (&t, x) && ! x->sign)
4661 do_add (&t, &t, &dconst1, 0);
4662 if (mode != VOIDmode)
4663 real_convert (r, mode, &t);
4664 else
4665 *r = t;
4666 }
4667
4668 /* Round X to the nearest integer, but round halfway cases away from
4669 zero. */
4670
4671 void
4672 real_round (REAL_VALUE_TYPE *r, enum machine_mode mode,
4673 const REAL_VALUE_TYPE *x)
4674 {
4675 do_add (r, x, &dconsthalf, x->sign);
4676 do_fix_trunc (r, r);
4677 if (mode != VOIDmode)
4678 real_convert (r, mode, r);
4679 }
4680
4681 /* Set the sign of R to the sign of X. */
4682
4683 void
4684 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
4685 {
4686 r->sign = x->sign;
4687 }
4688