1 /* real.c - software floating point emulation.
2 Copyright (C) 1993-2015 Free Software Foundation, Inc.
3 Contributed by Stephen L. Moshier (moshier@world.std.com).
4 Re-written by Richard Henderson <rth@redhat.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
31 /* The floating point model used internally is not exactly IEEE 754
32 compliant, and close to the description in the ISO C99 standard,
33 section 5.2.4.2.2 Characteristics of floating types.
37 x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
41 b = base or radix, here always 2
43 p = precision (the number of base-b digits in the significand)
44 f_k = the digits of the significand.
46 We differ from typical IEEE 754 encodings in that the entire
47 significand is fractional. Normalized significands are in the
50 A requirement of the model is that P be larger than the largest
51 supported target floating-point type by at least 2 bits. This gives
52 us proper rounding when we truncate to the target type. In addition,
53 E must be large enough to hold the smallest supported denormal number
56 Both of these requirements are easily satisfied. The largest target
57 significand is 113 bits; we store at least 160. The smallest
58 denormal number fits in 17 exponent bits; we store 26. */
61 /* Used to classify two numbers simultaneously. */
62 #define CLASS2(A, B) ((A) << 2 | (B))
64 #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
65 #error "Some constant folding done by hand to avoid shift count warnings"
68 static void get_zero (REAL_VALUE_TYPE
*, int);
69 static void get_canonical_qnan (REAL_VALUE_TYPE
*, int);
70 static void get_canonical_snan (REAL_VALUE_TYPE
*, int);
71 static void get_inf (REAL_VALUE_TYPE
*, int);
72 static bool sticky_rshift_significand (REAL_VALUE_TYPE
*,
73 const REAL_VALUE_TYPE
*, unsigned int);
74 static void rshift_significand (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
76 static void lshift_significand (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
78 static void lshift_significand_1 (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
79 static bool add_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*,
80 const REAL_VALUE_TYPE
*);
81 static bool sub_significands (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
82 const REAL_VALUE_TYPE
*, int);
83 static void neg_significand (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
84 static int cmp_significands (const REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
85 static int cmp_significand_0 (const REAL_VALUE_TYPE
*);
86 static void set_significand_bit (REAL_VALUE_TYPE
*, unsigned int);
87 static void clear_significand_bit (REAL_VALUE_TYPE
*, unsigned int);
88 static bool test_significand_bit (REAL_VALUE_TYPE
*, unsigned int);
89 static void clear_significand_below (REAL_VALUE_TYPE
*, unsigned int);
90 static bool div_significands (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
91 const REAL_VALUE_TYPE
*);
92 static void normalize (REAL_VALUE_TYPE
*);
94 static bool do_add (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
95 const REAL_VALUE_TYPE
*, int);
96 static bool do_multiply (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
97 const REAL_VALUE_TYPE
*);
98 static bool do_divide (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
99 const REAL_VALUE_TYPE
*);
100 static int do_compare (const REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*, int);
101 static void do_fix_trunc (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
103 static unsigned long rtd_divmod (REAL_VALUE_TYPE
*, REAL_VALUE_TYPE
*);
104 static void decimal_from_integer (REAL_VALUE_TYPE
*);
105 static void decimal_integer_string (char *, const REAL_VALUE_TYPE
*,
108 static const REAL_VALUE_TYPE
* ten_to_ptwo (int);
109 static const REAL_VALUE_TYPE
* ten_to_mptwo (int);
110 static const REAL_VALUE_TYPE
* real_digit (int);
111 static void times_pten (REAL_VALUE_TYPE
*, int);
113 static void round_for_format (const struct real_format
*, REAL_VALUE_TYPE
*);
115 /* Initialize R with a positive zero. */
118 get_zero (REAL_VALUE_TYPE
*r
, int sign
)
120 memset (r
, 0, sizeof (*r
));
124 /* Initialize R with the canonical quiet NaN. */
127 get_canonical_qnan (REAL_VALUE_TYPE
*r
, int sign
)
129 memset (r
, 0, sizeof (*r
));
136 get_canonical_snan (REAL_VALUE_TYPE
*r
, int sign
)
138 memset (r
, 0, sizeof (*r
));
146 get_inf (REAL_VALUE_TYPE
*r
, int sign
)
148 memset (r
, 0, sizeof (*r
));
154 /* Right-shift the significand of A by N bits; put the result in the
155 significand of R. If any one bits are shifted out, return true. */
158 sticky_rshift_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
161 unsigned long sticky
= 0;
162 unsigned int i
, ofs
= 0;
164 if (n
>= HOST_BITS_PER_LONG
)
166 for (i
= 0, ofs
= n
/ HOST_BITS_PER_LONG
; i
< ofs
; ++i
)
168 n
&= HOST_BITS_PER_LONG
- 1;
173 sticky
|= a
->sig
[ofs
] & (((unsigned long)1 << n
) - 1);
174 for (i
= 0; i
< SIGSZ
; ++i
)
177 = (((ofs
+ i
>= SIGSZ
? 0 : a
->sig
[ofs
+ i
]) >> n
)
178 | ((ofs
+ i
+ 1 >= SIGSZ
? 0 : a
->sig
[ofs
+ i
+ 1])
179 << (HOST_BITS_PER_LONG
- n
)));
184 for (i
= 0; ofs
+ i
< SIGSZ
; ++i
)
185 r
->sig
[i
] = a
->sig
[ofs
+ i
];
186 for (; i
< SIGSZ
; ++i
)
193 /* Right-shift the significand of A by N bits; put the result in the
197 rshift_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
200 unsigned int i
, ofs
= n
/ HOST_BITS_PER_LONG
;
202 n
&= HOST_BITS_PER_LONG
- 1;
205 for (i
= 0; i
< SIGSZ
; ++i
)
208 = (((ofs
+ i
>= SIGSZ
? 0 : a
->sig
[ofs
+ i
]) >> n
)
209 | ((ofs
+ i
+ 1 >= SIGSZ
? 0 : a
->sig
[ofs
+ i
+ 1])
210 << (HOST_BITS_PER_LONG
- n
)));
215 for (i
= 0; ofs
+ i
< SIGSZ
; ++i
)
216 r
->sig
[i
] = a
->sig
[ofs
+ i
];
217 for (; i
< SIGSZ
; ++i
)
222 /* Left-shift the significand of A by N bits; put the result in the
226 lshift_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
229 unsigned int i
, ofs
= n
/ HOST_BITS_PER_LONG
;
231 n
&= HOST_BITS_PER_LONG
- 1;
234 for (i
= 0; ofs
+ i
< SIGSZ
; ++i
)
235 r
->sig
[SIGSZ
-1-i
] = a
->sig
[SIGSZ
-1-i
-ofs
];
236 for (; i
< SIGSZ
; ++i
)
237 r
->sig
[SIGSZ
-1-i
] = 0;
240 for (i
= 0; i
< SIGSZ
; ++i
)
243 = (((ofs
+ i
>= SIGSZ
? 0 : a
->sig
[SIGSZ
-1-i
-ofs
]) << n
)
244 | ((ofs
+ i
+ 1 >= SIGSZ
? 0 : a
->sig
[SIGSZ
-1-i
-ofs
-1])
245 >> (HOST_BITS_PER_LONG
- n
)));
249 /* Likewise, but N is specialized to 1. */
252 lshift_significand_1 (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
)
256 for (i
= SIGSZ
- 1; i
> 0; --i
)
257 r
->sig
[i
] = (a
->sig
[i
] << 1) | (a
->sig
[i
-1] >> (HOST_BITS_PER_LONG
- 1));
258 r
->sig
[0] = a
->sig
[0] << 1;
261 /* Add the significands of A and B, placing the result in R. Return
262 true if there was carry out of the most significant word. */
265 add_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
266 const REAL_VALUE_TYPE
*b
)
271 for (i
= 0; i
< SIGSZ
; ++i
)
273 unsigned long ai
= a
->sig
[i
];
274 unsigned long ri
= ai
+ b
->sig
[i
];
290 /* Subtract the significands of A and B, placing the result in R. CARRY is
291 true if there's a borrow incoming to the least significant word.
292 Return true if there was borrow out of the most significant word. */
295 sub_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
296 const REAL_VALUE_TYPE
*b
, int carry
)
300 for (i
= 0; i
< SIGSZ
; ++i
)
302 unsigned long ai
= a
->sig
[i
];
303 unsigned long ri
= ai
- b
->sig
[i
];
319 /* Negate the significand A, placing the result in R. */
322 neg_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
)
327 for (i
= 0; i
< SIGSZ
; ++i
)
329 unsigned long ri
, ai
= a
->sig
[i
];
348 /* Compare significands. Return tri-state vs zero. */
351 cmp_significands (const REAL_VALUE_TYPE
*a
, const REAL_VALUE_TYPE
*b
)
355 for (i
= SIGSZ
- 1; i
>= 0; --i
)
357 unsigned long ai
= a
->sig
[i
];
358 unsigned long bi
= b
->sig
[i
];
369 /* Return true if A is nonzero. */
372 cmp_significand_0 (const REAL_VALUE_TYPE
*a
)
376 for (i
= SIGSZ
- 1; i
>= 0; --i
)
383 /* Set bit N of the significand of R. */
386 set_significand_bit (REAL_VALUE_TYPE
*r
, unsigned int n
)
388 r
->sig
[n
/ HOST_BITS_PER_LONG
]
389 |= (unsigned long)1 << (n
% HOST_BITS_PER_LONG
);
392 /* Clear bit N of the significand of R. */
395 clear_significand_bit (REAL_VALUE_TYPE
*r
, unsigned int n
)
397 r
->sig
[n
/ HOST_BITS_PER_LONG
]
398 &= ~((unsigned long)1 << (n
% HOST_BITS_PER_LONG
));
401 /* Test bit N of the significand of R. */
404 test_significand_bit (REAL_VALUE_TYPE
*r
, unsigned int n
)
406 /* ??? Compiler bug here if we return this expression directly.
407 The conversion to bool strips the "&1" and we wind up testing
408 e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */
409 int t
= (r
->sig
[n
/ HOST_BITS_PER_LONG
] >> (n
% HOST_BITS_PER_LONG
)) & 1;
413 /* Clear bits 0..N-1 of the significand of R. */
416 clear_significand_below (REAL_VALUE_TYPE
*r
, unsigned int n
)
418 int i
, w
= n
/ HOST_BITS_PER_LONG
;
420 for (i
= 0; i
< w
; ++i
)
423 r
->sig
[w
] &= ~(((unsigned long)1 << (n
% HOST_BITS_PER_LONG
)) - 1);
426 /* Divide the significands of A and B, placing the result in R. Return
427 true if the division was inexact. */
430 div_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
431 const REAL_VALUE_TYPE
*b
)
434 int i
, bit
= SIGNIFICAND_BITS
- 1;
435 unsigned long msb
, inexact
;
438 memset (r
->sig
, 0, sizeof (r
->sig
));
444 msb
= u
.sig
[SIGSZ
-1] & SIG_MSB
;
445 lshift_significand_1 (&u
, &u
);
447 if (msb
|| cmp_significands (&u
, b
) >= 0)
449 sub_significands (&u
, &u
, b
, 0);
450 set_significand_bit (r
, bit
);
455 for (i
= 0, inexact
= 0; i
< SIGSZ
; i
++)
461 /* Adjust the exponent and significand of R such that the most
462 significant bit is set. We underflow to zero and overflow to
463 infinity here, without denormals. (The intermediate representation
464 exponent is large enough to handle target denormals normalized.) */
467 normalize (REAL_VALUE_TYPE
*r
)
475 /* Find the first word that is nonzero. */
476 for (i
= SIGSZ
- 1; i
>= 0; i
--)
478 shift
+= HOST_BITS_PER_LONG
;
482 /* Zero significand flushes to zero. */
490 /* Find the first bit that is nonzero. */
492 if (r
->sig
[i
] & ((unsigned long)1 << (HOST_BITS_PER_LONG
- 1 - j
)))
498 exp
= REAL_EXP (r
) - shift
;
500 get_inf (r
, r
->sign
);
501 else if (exp
< -MAX_EXP
)
502 get_zero (r
, r
->sign
);
505 SET_REAL_EXP (r
, exp
);
506 lshift_significand (r
, r
, shift
);
511 /* Calculate R = A + (SUBTRACT_P ? -B : B). Return true if the
512 result may be inexact due to a loss of precision. */
515 do_add (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
516 const REAL_VALUE_TYPE
*b
, int subtract_p
)
520 bool inexact
= false;
522 /* Determine if we need to add or subtract. */
524 subtract_p
= (sign
^ b
->sign
) ^ subtract_p
;
526 switch (CLASS2 (a
->cl
, b
->cl
))
528 case CLASS2 (rvc_zero
, rvc_zero
):
529 /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0. */
530 get_zero (r
, sign
& !subtract_p
);
533 case CLASS2 (rvc_zero
, rvc_normal
):
534 case CLASS2 (rvc_zero
, rvc_inf
):
535 case CLASS2 (rvc_zero
, rvc_nan
):
537 case CLASS2 (rvc_normal
, rvc_nan
):
538 case CLASS2 (rvc_inf
, rvc_nan
):
539 case CLASS2 (rvc_nan
, rvc_nan
):
540 /* ANY + NaN = NaN. */
541 case CLASS2 (rvc_normal
, rvc_inf
):
544 r
->sign
= sign
^ subtract_p
;
547 case CLASS2 (rvc_normal
, rvc_zero
):
548 case CLASS2 (rvc_inf
, rvc_zero
):
549 case CLASS2 (rvc_nan
, rvc_zero
):
551 case CLASS2 (rvc_nan
, rvc_normal
):
552 case CLASS2 (rvc_nan
, rvc_inf
):
553 /* NaN + ANY = NaN. */
554 case CLASS2 (rvc_inf
, rvc_normal
):
559 case CLASS2 (rvc_inf
, rvc_inf
):
561 /* Inf - Inf = NaN. */
562 get_canonical_qnan (r
, 0);
564 /* Inf + Inf = Inf. */
568 case CLASS2 (rvc_normal
, rvc_normal
):
575 /* Swap the arguments such that A has the larger exponent. */
576 dexp
= REAL_EXP (a
) - REAL_EXP (b
);
579 const REAL_VALUE_TYPE
*t
;
586 /* If the exponents are not identical, we need to shift the
587 significand of B down. */
590 /* If the exponents are too far apart, the significands
591 do not overlap, which makes the subtraction a noop. */
592 if (dexp
>= SIGNIFICAND_BITS
)
599 inexact
|= sticky_rshift_significand (&t
, b
, dexp
);
605 if (sub_significands (r
, a
, b
, inexact
))
607 /* We got a borrow out of the subtraction. That means that
608 A and B had the same exponent, and B had the larger
609 significand. We need to swap the sign and negate the
612 neg_significand (r
, r
);
617 if (add_significands (r
, a
, b
))
619 /* We got carry out of the addition. This means we need to
620 shift the significand back down one bit and increase the
622 inexact
|= sticky_rshift_significand (r
, r
, 1);
623 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
634 SET_REAL_EXP (r
, exp
);
635 /* Zero out the remaining fields. */
640 /* Re-normalize the result. */
643 /* Special case: if the subtraction results in zero, the result
645 if (r
->cl
== rvc_zero
)
648 r
->sig
[0] |= inexact
;
653 /* Calculate R = A * B. Return true if the result may be inexact. */
656 do_multiply (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
657 const REAL_VALUE_TYPE
*b
)
659 REAL_VALUE_TYPE u
, t
, *rr
;
660 unsigned int i
, j
, k
;
661 int sign
= a
->sign
^ b
->sign
;
662 bool inexact
= false;
664 switch (CLASS2 (a
->cl
, b
->cl
))
666 case CLASS2 (rvc_zero
, rvc_zero
):
667 case CLASS2 (rvc_zero
, rvc_normal
):
668 case CLASS2 (rvc_normal
, rvc_zero
):
669 /* +-0 * ANY = 0 with appropriate sign. */
673 case CLASS2 (rvc_zero
, rvc_nan
):
674 case CLASS2 (rvc_normal
, rvc_nan
):
675 case CLASS2 (rvc_inf
, rvc_nan
):
676 case CLASS2 (rvc_nan
, rvc_nan
):
677 /* ANY * NaN = NaN. */
682 case CLASS2 (rvc_nan
, rvc_zero
):
683 case CLASS2 (rvc_nan
, rvc_normal
):
684 case CLASS2 (rvc_nan
, rvc_inf
):
685 /* NaN * ANY = NaN. */
690 case CLASS2 (rvc_zero
, rvc_inf
):
691 case CLASS2 (rvc_inf
, rvc_zero
):
693 get_canonical_qnan (r
, sign
);
696 case CLASS2 (rvc_inf
, rvc_inf
):
697 case CLASS2 (rvc_normal
, rvc_inf
):
698 case CLASS2 (rvc_inf
, rvc_normal
):
699 /* Inf * Inf = Inf, R * Inf = Inf */
703 case CLASS2 (rvc_normal
, rvc_normal
):
710 if (r
== a
|| r
== b
)
716 /* Collect all the partial products. Since we don't have sure access
717 to a widening multiply, we split each long into two half-words.
719 Consider the long-hand form of a four half-word multiplication:
729 We construct partial products of the widened half-word products
730 that are known to not overlap, e.g. DF+DH. Each such partial
731 product is given its proper exponent, which allows us to sum them
732 and obtain the finished product. */
734 for (i
= 0; i
< SIGSZ
* 2; ++i
)
736 unsigned long ai
= a
->sig
[i
/ 2];
738 ai
>>= HOST_BITS_PER_LONG
/ 2;
740 ai
&= ((unsigned long)1 << (HOST_BITS_PER_LONG
/ 2)) - 1;
745 for (j
= 0; j
< 2; ++j
)
747 int exp
= (REAL_EXP (a
) - (2*SIGSZ
-1-i
)*(HOST_BITS_PER_LONG
/2)
748 + (REAL_EXP (b
) - (1-j
)*(HOST_BITS_PER_LONG
/2)));
757 /* Would underflow to zero, which we shouldn't bother adding. */
762 memset (&u
, 0, sizeof (u
));
764 SET_REAL_EXP (&u
, exp
);
766 for (k
= j
; k
< SIGSZ
* 2; k
+= 2)
768 unsigned long bi
= b
->sig
[k
/ 2];
770 bi
>>= HOST_BITS_PER_LONG
/ 2;
772 bi
&= ((unsigned long)1 << (HOST_BITS_PER_LONG
/ 2)) - 1;
774 u
.sig
[k
/ 2] = ai
* bi
;
778 inexact
|= do_add (rr
, rr
, &u
, 0);
789 /* Calculate R = A / B. Return true if the result may be inexact. */
792 do_divide (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
793 const REAL_VALUE_TYPE
*b
)
795 int exp
, sign
= a
->sign
^ b
->sign
;
796 REAL_VALUE_TYPE t
, *rr
;
799 switch (CLASS2 (a
->cl
, b
->cl
))
801 case CLASS2 (rvc_zero
, rvc_zero
):
803 case CLASS2 (rvc_inf
, rvc_inf
):
804 /* Inf / Inf = NaN. */
805 get_canonical_qnan (r
, sign
);
808 case CLASS2 (rvc_zero
, rvc_normal
):
809 case CLASS2 (rvc_zero
, rvc_inf
):
811 case CLASS2 (rvc_normal
, rvc_inf
):
816 case CLASS2 (rvc_normal
, rvc_zero
):
818 case CLASS2 (rvc_inf
, rvc_zero
):
823 case CLASS2 (rvc_zero
, rvc_nan
):
824 case CLASS2 (rvc_normal
, rvc_nan
):
825 case CLASS2 (rvc_inf
, rvc_nan
):
826 case CLASS2 (rvc_nan
, rvc_nan
):
827 /* ANY / NaN = NaN. */
832 case CLASS2 (rvc_nan
, rvc_zero
):
833 case CLASS2 (rvc_nan
, rvc_normal
):
834 case CLASS2 (rvc_nan
, rvc_inf
):
835 /* NaN / ANY = NaN. */
840 case CLASS2 (rvc_inf
, rvc_normal
):
845 case CLASS2 (rvc_normal
, rvc_normal
):
852 if (r
== a
|| r
== b
)
857 /* Make sure all fields in the result are initialized. */
862 exp
= REAL_EXP (a
) - REAL_EXP (b
) + 1;
873 SET_REAL_EXP (rr
, exp
);
875 inexact
= div_significands (rr
, a
, b
);
877 /* Re-normalize the result. */
879 rr
->sig
[0] |= inexact
;
887 /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
888 one of the two operands is a NaN. */
891 do_compare (const REAL_VALUE_TYPE
*a
, const REAL_VALUE_TYPE
*b
,
896 switch (CLASS2 (a
->cl
, b
->cl
))
898 case CLASS2 (rvc_zero
, rvc_zero
):
899 /* Sign of zero doesn't matter for compares. */
902 case CLASS2 (rvc_normal
, rvc_zero
):
903 /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */
905 return decimal_do_compare (a
, b
, nan_result
);
907 case CLASS2 (rvc_inf
, rvc_zero
):
908 case CLASS2 (rvc_inf
, rvc_normal
):
909 return (a
->sign
? -1 : 1);
911 case CLASS2 (rvc_inf
, rvc_inf
):
912 return -a
->sign
- -b
->sign
;
914 case CLASS2 (rvc_zero
, rvc_normal
):
915 /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */
917 return decimal_do_compare (a
, b
, nan_result
);
919 case CLASS2 (rvc_zero
, rvc_inf
):
920 case CLASS2 (rvc_normal
, rvc_inf
):
921 return (b
->sign
? 1 : -1);
923 case CLASS2 (rvc_zero
, rvc_nan
):
924 case CLASS2 (rvc_normal
, rvc_nan
):
925 case CLASS2 (rvc_inf
, rvc_nan
):
926 case CLASS2 (rvc_nan
, rvc_nan
):
927 case CLASS2 (rvc_nan
, rvc_zero
):
928 case CLASS2 (rvc_nan
, rvc_normal
):
929 case CLASS2 (rvc_nan
, rvc_inf
):
932 case CLASS2 (rvc_normal
, rvc_normal
):
939 if (a
->sign
!= b
->sign
)
940 return -a
->sign
- -b
->sign
;
942 if (a
->decimal
|| b
->decimal
)
943 return decimal_do_compare (a
, b
, nan_result
);
945 if (REAL_EXP (a
) > REAL_EXP (b
))
947 else if (REAL_EXP (a
) < REAL_EXP (b
))
950 ret
= cmp_significands (a
, b
);
952 return (a
->sign
? -ret
: ret
);
955 /* Return A truncated to an integral value toward zero. */
958 do_fix_trunc (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
)
972 decimal_do_fix_trunc (r
, a
);
975 if (REAL_EXP (r
) <= 0)
976 get_zero (r
, r
->sign
);
977 else if (REAL_EXP (r
) < SIGNIFICAND_BITS
)
978 clear_significand_below (r
, SIGNIFICAND_BITS
- REAL_EXP (r
));
986 /* Perform the binary or unary operation described by CODE.
987 For a unary operation, leave OP1 NULL. This function returns
988 true if the result may be inexact due to loss of precision. */
991 real_arithmetic (REAL_VALUE_TYPE
*r
, int icode
, const REAL_VALUE_TYPE
*op0
,
992 const REAL_VALUE_TYPE
*op1
)
994 enum tree_code code
= (enum tree_code
) icode
;
996 if (op0
->decimal
|| (op1
&& op1
->decimal
))
997 return decimal_real_arithmetic (r
, code
, op0
, op1
);
1002 /* Clear any padding areas in *r if it isn't equal to one of the
1003 operands so that we can later do bitwise comparisons later on. */
1004 if (r
!= op0
&& r
!= op1
)
1005 memset (r
, '\0', sizeof (*r
));
1006 return do_add (r
, op0
, op1
, 0);
1009 if (r
!= op0
&& r
!= op1
)
1010 memset (r
, '\0', sizeof (*r
));
1011 return do_add (r
, op0
, op1
, 1);
1014 if (r
!= op0
&& r
!= op1
)
1015 memset (r
, '\0', sizeof (*r
));
1016 return do_multiply (r
, op0
, op1
);
1019 if (r
!= op0
&& r
!= op1
)
1020 memset (r
, '\0', sizeof (*r
));
1021 return do_divide (r
, op0
, op1
);
1024 if (op1
->cl
== rvc_nan
)
1026 else if (do_compare (op0
, op1
, -1) < 0)
1033 if (op1
->cl
== rvc_nan
)
1035 else if (do_compare (op0
, op1
, 1) < 0)
1051 case FIX_TRUNC_EXPR
:
1052 do_fix_trunc (r
, op0
);
1062 real_value_negate (const REAL_VALUE_TYPE
*op0
)
1065 real_arithmetic (&r
, NEGATE_EXPR
, op0
, NULL
);
1070 real_value_abs (const REAL_VALUE_TYPE
*op0
)
1073 real_arithmetic (&r
, ABS_EXPR
, op0
, NULL
);
1077 /* Return whether OP0 == OP1. */
1080 real_equal (const REAL_VALUE_TYPE
*op0
, const REAL_VALUE_TYPE
*op1
)
1082 return do_compare (op0
, op1
, -1) == 0;
1085 /* Return whether OP0 < OP1. */
1088 real_less (const REAL_VALUE_TYPE
*op0
, const REAL_VALUE_TYPE
*op1
)
1090 return do_compare (op0
, op1
, 1) < 0;
1094 real_compare (int icode
, const REAL_VALUE_TYPE
*op0
,
1095 const REAL_VALUE_TYPE
*op1
)
1097 enum tree_code code
= (enum tree_code
) icode
;
1102 return real_less (op0
, op1
);
1104 return do_compare (op0
, op1
, 1) <= 0;
1106 return do_compare (op0
, op1
, -1) > 0;
1108 return do_compare (op0
, op1
, -1) >= 0;
1110 return real_equal (op0
, op1
);
1112 return do_compare (op0
, op1
, -1) != 0;
1113 case UNORDERED_EXPR
:
1114 return op0
->cl
== rvc_nan
|| op1
->cl
== rvc_nan
;
1116 return op0
->cl
!= rvc_nan
&& op1
->cl
!= rvc_nan
;
1118 return do_compare (op0
, op1
, -1) < 0;
1120 return do_compare (op0
, op1
, -1) <= 0;
1122 return do_compare (op0
, op1
, 1) > 0;
1124 return do_compare (op0
, op1
, 1) >= 0;
1126 return do_compare (op0
, op1
, 0) == 0;
1128 return do_compare (op0
, op1
, 0) != 0;
1135 /* Return floor log2(R). */
1138 real_exponent (const REAL_VALUE_TYPE
*r
)
1146 return (unsigned int)-1 >> 1;
1148 return REAL_EXP (r
);
1154 /* R = OP0 * 2**EXP. */
1157 real_ldexp (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*op0
, int exp
)
1168 exp
+= REAL_EXP (op0
);
1170 get_inf (r
, r
->sign
);
1171 else if (exp
< -MAX_EXP
)
1172 get_zero (r
, r
->sign
);
1174 SET_REAL_EXP (r
, exp
);
1182 /* Determine whether a floating-point value X is infinite. */
1185 real_isinf (const REAL_VALUE_TYPE
*r
)
1187 return (r
->cl
== rvc_inf
);
1190 /* Determine whether a floating-point value X is a NaN. */
1193 real_isnan (const REAL_VALUE_TYPE
*r
)
1195 return (r
->cl
== rvc_nan
);
1198 /* Determine whether a floating-point value X is finite. */
1201 real_isfinite (const REAL_VALUE_TYPE
*r
)
1203 return (r
->cl
!= rvc_nan
) && (r
->cl
!= rvc_inf
);
1206 /* Determine whether a floating-point value X is negative. */
1209 real_isneg (const REAL_VALUE_TYPE
*r
)
1214 /* Determine whether a floating-point value X is minus zero. */
1217 real_isnegzero (const REAL_VALUE_TYPE
*r
)
1219 return r
->sign
&& r
->cl
== rvc_zero
;
1222 /* Compare two floating-point objects for bitwise identity. */
1225 real_identical (const REAL_VALUE_TYPE
*a
, const REAL_VALUE_TYPE
*b
)
1231 if (a
->sign
!= b
->sign
)
1241 if (a
->decimal
!= b
->decimal
)
1243 if (REAL_EXP (a
) != REAL_EXP (b
))
1248 if (a
->signalling
!= b
->signalling
)
1250 /* The significand is ignored for canonical NaNs. */
1251 if (a
->canonical
|| b
->canonical
)
1252 return a
->canonical
== b
->canonical
;
1259 for (i
= 0; i
< SIGSZ
; ++i
)
1260 if (a
->sig
[i
] != b
->sig
[i
])
1266 /* Try to change R into its exact multiplicative inverse in format FMT.
1267 Return true if successful. */
1270 exact_real_inverse (format_helper fmt
, REAL_VALUE_TYPE
*r
)
1272 const REAL_VALUE_TYPE
*one
= real_digit (1);
1276 if (r
->cl
!= rvc_normal
)
1279 /* Check for a power of two: all significand bits zero except the MSB. */
1280 for (i
= 0; i
< SIGSZ
-1; ++i
)
1283 if (r
->sig
[SIGSZ
-1] != SIG_MSB
)
1286 /* Find the inverse and truncate to the required format. */
1287 do_divide (&u
, one
, r
);
1288 real_convert (&u
, fmt
, &u
);
1290 /* The rounding may have overflowed. */
1291 if (u
.cl
!= rvc_normal
)
1293 for (i
= 0; i
< SIGSZ
-1; ++i
)
1296 if (u
.sig
[SIGSZ
-1] != SIG_MSB
)
1303 /* Return true if arithmetic on values in IMODE that were promoted
1304 from values in TMODE is equivalent to direct arithmetic on values
1308 real_can_shorten_arithmetic (machine_mode imode
, machine_mode tmode
)
1310 const struct real_format
*tfmt
, *ifmt
;
1311 tfmt
= REAL_MODE_FORMAT (tmode
);
1312 ifmt
= REAL_MODE_FORMAT (imode
);
1313 /* These conditions are conservative rather than trying to catch the
1314 exact boundary conditions; the main case to allow is IEEE float
1316 return (ifmt
->b
== tfmt
->b
1317 && ifmt
->p
> 2 * tfmt
->p
1318 && ifmt
->emin
< 2 * tfmt
->emin
- tfmt
->p
- 2
1319 && ifmt
->emin
< tfmt
->emin
- tfmt
->emax
- tfmt
->p
- 2
1320 && ifmt
->emax
> 2 * tfmt
->emax
+ 2
1321 && ifmt
->emax
> tfmt
->emax
- tfmt
->emin
+ tfmt
->p
+ 2
1322 && ifmt
->round_towards_zero
== tfmt
->round_towards_zero
1323 && (ifmt
->has_sign_dependent_rounding
1324 == tfmt
->has_sign_dependent_rounding
)
1325 && ifmt
->has_nans
>= tfmt
->has_nans
1326 && ifmt
->has_inf
>= tfmt
->has_inf
1327 && ifmt
->has_signed_zero
>= tfmt
->has_signed_zero
1328 && !MODE_COMPOSITE_P (tmode
)
1329 && !MODE_COMPOSITE_P (imode
));
1332 /* Render R as an integer. */
1335 real_to_integer (const REAL_VALUE_TYPE
*r
)
1337 unsigned HOST_WIDE_INT i
;
1348 i
= (unsigned HOST_WIDE_INT
) 1 << (HOST_BITS_PER_WIDE_INT
- 1);
1355 return decimal_real_to_integer (r
);
1357 if (REAL_EXP (r
) <= 0)
1359 /* Only force overflow for unsigned overflow. Signed overflow is
1360 undefined, so it doesn't matter what we return, and some callers
1361 expect to be able to use this routine for both signed and
1362 unsigned conversions. */
1363 if (REAL_EXP (r
) > HOST_BITS_PER_WIDE_INT
)
1366 if (HOST_BITS_PER_WIDE_INT
== HOST_BITS_PER_LONG
)
1367 i
= r
->sig
[SIGSZ
-1];
1370 gcc_assert (HOST_BITS_PER_WIDE_INT
== 2 * HOST_BITS_PER_LONG
);
1371 i
= r
->sig
[SIGSZ
-1];
1372 i
= i
<< (HOST_BITS_PER_LONG
- 1) << 1;
1373 i
|= r
->sig
[SIGSZ
-2];
1376 i
>>= HOST_BITS_PER_WIDE_INT
- REAL_EXP (r
);
1387 /* Likewise, but producing a wide-int of PRECISION. If the value cannot
1388 be represented in precision, *FAIL is set to TRUE. */
1391 real_to_integer (const REAL_VALUE_TYPE
*r
, bool *fail
, int precision
)
1393 HOST_WIDE_INT val
[2 * WIDE_INT_MAX_ELTS
];
1402 return wi::zero (precision
);
1410 return wi::set_bit_in_zero (precision
- 1, precision
);
1412 return ~wi::set_bit_in_zero (precision
- 1, precision
);
1416 return decimal_real_to_integer (r
, fail
, precision
);
1421 /* Only force overflow for unsigned overflow. Signed overflow is
1422 undefined, so it doesn't matter what we return, and some callers
1423 expect to be able to use this routine for both signed and
1424 unsigned conversions. */
1425 if (exp
> precision
)
1428 /* Put the significand into a wide_int that has precision W, which
1429 is the smallest HWI-multiple that has at least PRECISION bits.
1430 This ensures that the top bit of the significand is in the
1431 top bit of the wide_int. */
1432 words
= (precision
+ HOST_BITS_PER_WIDE_INT
- 1) / HOST_BITS_PER_WIDE_INT
;
1433 w
= words
* HOST_BITS_PER_WIDE_INT
;
1435 #if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1436 for (int i
= 0; i
< words
; i
++)
1438 int j
= SIGSZ
- words
+ i
;
1439 val
[i
] = (j
< 0) ? 0 : r
->sig
[j
];
1442 gcc_assert (HOST_BITS_PER_WIDE_INT
== 2 * HOST_BITS_PER_LONG
);
1443 for (int i
= 0; i
< words
; i
++)
1445 int j
= SIGSZ
- (words
* 2) + (i
* 2);
1452 val
[i
] |= (unsigned HOST_WIDE_INT
) r
->sig
[j
] << HOST_BITS_PER_LONG
;
1455 /* Shift the value into place and truncate to the desired precision. */
1456 result
= wide_int::from_array (val
, words
, w
);
1457 result
= wi::lrshift (result
, w
- exp
);
1458 result
= wide_int::from (result
, precision
, UNSIGNED
);
1470 /* A subroutine of real_to_decimal. Compute the quotient and remainder
1471 of NUM / DEN. Return the quotient and place the remainder in NUM.
1472 It is expected that NUM / DEN are close enough that the quotient is
1475 static unsigned long
1476 rtd_divmod (REAL_VALUE_TYPE
*num
, REAL_VALUE_TYPE
*den
)
1478 unsigned long q
, msb
;
1479 int expn
= REAL_EXP (num
), expd
= REAL_EXP (den
);
1488 msb
= num
->sig
[SIGSZ
-1] & SIG_MSB
;
1490 lshift_significand_1 (num
, num
);
1492 if (msb
|| cmp_significands (num
, den
) >= 0)
1494 sub_significands (num
, num
, den
, 0);
1498 while (--expn
>= expd
);
1500 SET_REAL_EXP (num
, expd
);
1506 /* Render R as a decimal floating point constant. Emit DIGITS significant
1507 digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the
1508 maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing
1509 zeros. If MODE is VOIDmode, round to nearest value. Otherwise, round
1510 to a string that, when parsed back in mode MODE, yields the same value. */
1512 #define M_LOG10_2 0.30102999566398119521
1515 real_to_decimal_for_mode (char *str
, const REAL_VALUE_TYPE
*r_orig
,
1516 size_t buf_size
, size_t digits
,
1517 int crop_trailing_zeros
, machine_mode mode
)
1519 const struct real_format
*fmt
= NULL
;
1520 const REAL_VALUE_TYPE
*one
, *ten
;
1521 REAL_VALUE_TYPE r
, pten
, u
, v
;
1522 int dec_exp
, cmp_one
, digit
;
1524 char *p
, *first
, *last
;
1528 if (mode
!= VOIDmode
)
1530 fmt
= REAL_MODE_FORMAT (mode
);
1538 strcpy (str
, (r
.sign
? "-0.0" : "0.0"));
1543 strcpy (str
, (r
.sign
? "-Inf" : "+Inf"));
1546 /* ??? Print the significand as well, if not canonical? */
1547 sprintf (str
, "%c%cNaN", (r_orig
->sign
? '-' : '+'),
1548 (r_orig
->signalling
? 'S' : 'Q'));
1556 decimal_real_to_decimal (str
, &r
, buf_size
, digits
, crop_trailing_zeros
);
1560 /* Bound the number of digits printed by the size of the representation. */
1561 max_digits
= SIGNIFICAND_BITS
* M_LOG10_2
;
1562 if (digits
== 0 || digits
> max_digits
)
1563 digits
= max_digits
;
1565 /* Estimate the decimal exponent, and compute the length of the string it
1566 will print as. Be conservative and add one to account for possible
1567 overflow or rounding error. */
1568 dec_exp
= REAL_EXP (&r
) * M_LOG10_2
;
1569 for (max_digits
= 1; dec_exp
; max_digits
++)
1572 /* Bound the number of digits printed by the size of the output buffer. */
1573 max_digits
= buf_size
- 1 - 1 - 2 - max_digits
- 1;
1574 gcc_assert (max_digits
<= buf_size
);
1575 if (digits
> max_digits
)
1576 digits
= max_digits
;
1578 one
= real_digit (1);
1579 ten
= ten_to_ptwo (0);
1587 cmp_one
= do_compare (&r
, one
, 0);
1592 /* Number is greater than one. Convert significand to an integer
1593 and strip trailing decimal zeros. */
1596 SET_REAL_EXP (&u
, SIGNIFICAND_BITS
- 1);
1598 /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
1599 m
= floor_log2 (max_digits
);
1601 /* Iterate over the bits of the possible powers of 10 that might
1602 be present in U and eliminate them. That is, if we find that
1603 10**2**M divides U evenly, keep the division and increase
1609 do_divide (&t
, &u
, ten_to_ptwo (m
));
1610 do_fix_trunc (&v
, &t
);
1611 if (cmp_significands (&v
, &t
) == 0)
1619 /* Revert the scaling to integer that we performed earlier. */
1620 SET_REAL_EXP (&u
, REAL_EXP (&u
) + REAL_EXP (&r
)
1621 - (SIGNIFICAND_BITS
- 1));
1624 /* Find power of 10. Do this by dividing out 10**2**M when
1625 this is larger than the current remainder. Fill PTEN with
1626 the power of 10 that we compute. */
1627 if (REAL_EXP (&r
) > 0)
1629 m
= floor_log2 ((int)(REAL_EXP (&r
) * M_LOG10_2
)) + 1;
1632 const REAL_VALUE_TYPE
*ptentwo
= ten_to_ptwo (m
);
1633 if (do_compare (&u
, ptentwo
, 0) >= 0)
1635 do_divide (&u
, &u
, ptentwo
);
1636 do_multiply (&pten
, &pten
, ptentwo
);
1643 /* We managed to divide off enough tens in the above reduction
1644 loop that we've now got a negative exponent. Fall into the
1645 less-than-one code to compute the proper value for PTEN. */
1652 /* Number is less than one. Pad significand with leading
1658 /* Stop if we'd shift bits off the bottom. */
1662 do_multiply (&u
, &v
, ten
);
1664 /* Stop if we're now >= 1. */
1665 if (REAL_EXP (&u
) > 0)
1673 /* Find power of 10. Do this by multiplying in P=10**2**M when
1674 the current remainder is smaller than 1/P. Fill PTEN with the
1675 power of 10 that we compute. */
1676 m
= floor_log2 ((int)(-REAL_EXP (&r
) * M_LOG10_2
)) + 1;
1679 const REAL_VALUE_TYPE
*ptentwo
= ten_to_ptwo (m
);
1680 const REAL_VALUE_TYPE
*ptenmtwo
= ten_to_mptwo (m
);
1682 if (do_compare (&v
, ptenmtwo
, 0) <= 0)
1684 do_multiply (&v
, &v
, ptentwo
);
1685 do_multiply (&pten
, &pten
, ptentwo
);
1691 /* Invert the positive power of 10 that we've collected so far. */
1692 do_divide (&pten
, one
, &pten
);
1700 /* At this point, PTEN should contain the nearest power of 10 smaller
1701 than R, such that this division produces the first digit.
1703 Using a divide-step primitive that returns the complete integral
1704 remainder avoids the rounding error that would be produced if
1705 we were to use do_divide here and then simply multiply by 10 for
1706 each subsequent digit. */
1708 digit
= rtd_divmod (&r
, &pten
);
1710 /* Be prepared for error in that division via underflow ... */
1711 if (digit
== 0 && cmp_significand_0 (&r
))
1713 /* Multiply by 10 and try again. */
1714 do_multiply (&r
, &r
, ten
);
1715 digit
= rtd_divmod (&r
, &pten
);
1717 gcc_assert (digit
!= 0);
1720 /* ... or overflow. */
1730 gcc_assert (digit
<= 10);
1734 /* Generate subsequent digits. */
1735 while (--digits
> 0)
1737 do_multiply (&r
, &r
, ten
);
1738 digit
= rtd_divmod (&r
, &pten
);
1743 /* Generate one more digit with which to do rounding. */
1744 do_multiply (&r
, &r
, ten
);
1745 digit
= rtd_divmod (&r
, &pten
);
1747 /* Round the result. */
1748 if (fmt
&& fmt
->round_towards_zero
)
1750 /* If the format uses round towards zero when parsing the string
1751 back in, we need to always round away from zero here. */
1752 if (cmp_significand_0 (&r
))
1754 round_up
= digit
> 0;
1760 /* Round to nearest. If R is nonzero there are additional
1761 nonzero digits to be extracted. */
1762 if (cmp_significand_0 (&r
))
1764 /* Round to even. */
1765 else if ((p
[-1] - '0') & 1)
1769 round_up
= digit
> 5;
1786 /* Carry out of the first digit. This means we had all 9's and
1787 now have all 0's. "Prepend" a 1 by overwriting the first 0. */
1795 /* Insert the decimal point. */
1796 first
[0] = first
[1];
1799 /* If requested, drop trailing zeros. Never crop past "1.0". */
1800 if (crop_trailing_zeros
)
1801 while (last
> first
+ 3 && last
[-1] == '0')
1804 /* Append the exponent. */
1805 sprintf (last
, "e%+d", dec_exp
);
1807 /* Verify that we can read the original value back in. */
1808 if (flag_checking
&& mode
!= VOIDmode
)
1810 real_from_string (&r
, str
);
1811 real_convert (&r
, mode
, &r
);
1812 gcc_assert (real_identical (&r
, r_orig
));
1816 /* Likewise, except always uses round-to-nearest. */
1819 real_to_decimal (char *str
, const REAL_VALUE_TYPE
*r_orig
, size_t buf_size
,
1820 size_t digits
, int crop_trailing_zeros
)
1822 real_to_decimal_for_mode (str
, r_orig
, buf_size
,
1823 digits
, crop_trailing_zeros
, VOIDmode
);
1826 /* Render R as a hexadecimal floating point constant. Emit DIGITS
1827 significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0,
1828 choose the maximum for the representation. If CROP_TRAILING_ZEROS,
1829 strip trailing zeros. */
1832 real_to_hexadecimal (char *str
, const REAL_VALUE_TYPE
*r
, size_t buf_size
,
1833 size_t digits
, int crop_trailing_zeros
)
1835 int i
, j
, exp
= REAL_EXP (r
);
1848 strcpy (str
, (r
->sign
? "-Inf" : "+Inf"));
1851 /* ??? Print the significand as well, if not canonical? */
1852 sprintf (str
, "%c%cNaN", (r
->sign
? '-' : '+'),
1853 (r
->signalling
? 'S' : 'Q'));
1861 /* Hexadecimal format for decimal floats is not interesting. */
1862 strcpy (str
, "N/A");
1867 digits
= SIGNIFICAND_BITS
/ 4;
1869 /* Bound the number of digits printed by the size of the output buffer. */
1871 sprintf (exp_buf
, "p%+d", exp
);
1872 max_digits
= buf_size
- strlen (exp_buf
) - r
->sign
- 4 - 1;
1873 gcc_assert (max_digits
<= buf_size
);
1874 if (digits
> max_digits
)
1875 digits
= max_digits
;
1886 for (i
= SIGSZ
- 1; i
>= 0; --i
)
1887 for (j
= HOST_BITS_PER_LONG
- 4; j
>= 0; j
-= 4)
1889 *p
++ = "0123456789abcdef"[(r
->sig
[i
] >> j
) & 15];
1895 if (crop_trailing_zeros
)
1896 while (p
> first
+ 1 && p
[-1] == '0')
1899 sprintf (p
, "p%+d", exp
);
1902 /* Initialize R from a decimal or hexadecimal string. The string is
1903 assumed to have been syntax checked already. Return -1 if the
1904 value underflows, +1 if overflows, and 0 otherwise. */
1907 real_from_string (REAL_VALUE_TYPE
*r
, const char *str
)
1919 else if (*str
== '+')
1922 if (!strncmp (str
, "QNaN", 4))
1924 get_canonical_qnan (r
, sign
);
1927 else if (!strncmp (str
, "SNaN", 4))
1929 get_canonical_snan (r
, sign
);
1932 else if (!strncmp (str
, "Inf", 3))
1938 if (str
[0] == '0' && (str
[1] == 'x' || str
[1] == 'X'))
1940 /* Hexadecimal floating point. */
1941 int pos
= SIGNIFICAND_BITS
- 4, d
;
1949 d
= hex_value (*str
);
1954 r
->sig
[pos
/ HOST_BITS_PER_LONG
]
1955 |= (unsigned long) d
<< (pos
% HOST_BITS_PER_LONG
);
1959 /* Ensure correct rounding by setting last bit if there is
1960 a subsequent nonzero digit. */
1968 if (pos
== SIGNIFICAND_BITS
- 4)
1975 d
= hex_value (*str
);
1980 r
->sig
[pos
/ HOST_BITS_PER_LONG
]
1981 |= (unsigned long) d
<< (pos
% HOST_BITS_PER_LONG
);
1985 /* Ensure correct rounding by setting last bit if there is
1986 a subsequent nonzero digit. */
1992 /* If the mantissa is zero, ignore the exponent. */
1993 if (!cmp_significand_0 (r
))
1996 if (*str
== 'p' || *str
== 'P')
1998 bool exp_neg
= false;
2006 else if (*str
== '+')
2010 while (ISDIGIT (*str
))
2016 /* Overflowed the exponent. */
2031 SET_REAL_EXP (r
, exp
);
2037 /* Decimal floating point. */
2038 const char *cstr
= str
;
2042 while (*cstr
== '0')
2047 while (*cstr
== '0')
2051 /* If the mantissa is zero, ignore the exponent. */
2052 if (!ISDIGIT (*cstr
))
2055 /* Nonzero value, possibly overflowing or underflowing. */
2056 mpfr_init2 (m
, SIGNIFICAND_BITS
);
2057 inexact
= mpfr_strtofr (m
, str
, NULL
, 10, GMP_RNDZ
);
2058 /* The result should never be a NaN, and because the rounding is
2059 toward zero should never be an infinity. */
2060 gcc_assert (!mpfr_nan_p (m
) && !mpfr_inf_p (m
));
2061 if (mpfr_zero_p (m
) || mpfr_get_exp (m
) < -MAX_EXP
+ 4)
2066 else if (mpfr_get_exp (m
) > MAX_EXP
- 4)
2073 real_from_mpfr (r
, m
, NULL_TREE
, GMP_RNDZ
);
2074 /* 1 to 3 bits may have been shifted off (with a sticky bit)
2075 because the hex digits used in real_from_mpfr did not
2076 start with a digit 8 to f, but the exponent bounds above
2077 should have avoided underflow or overflow. */
2078 gcc_assert (r
->cl
== rvc_normal
);
2079 /* Set a sticky bit if mpfr_strtofr was inexact. */
2080 r
->sig
[0] |= inexact
;
2101 /* Legacy. Similar, but return the result directly. */
2104 real_from_string2 (const char *s
, format_helper fmt
)
2108 real_from_string (&r
, s
);
2110 real_convert (&r
, fmt
, &r
);
2115 /* Initialize R from string S and desired format FMT. */
2118 real_from_string3 (REAL_VALUE_TYPE
*r
, const char *s
, format_helper fmt
)
2120 if (fmt
.decimal_p ())
2121 decimal_real_from_string (r
, s
);
2123 real_from_string (r
, s
);
2126 real_convert (r
, fmt
, r
);
2129 /* Initialize R from the wide_int VAL_IN. Round it to format FMT if
2133 real_from_integer (REAL_VALUE_TYPE
*r
, format_helper fmt
,
2134 const wide_int_ref
&val_in
, signop sgn
)
2140 unsigned int len
= val_in
.get_precision ();
2142 int maxbitlen
= MAX_BITSIZE_MODE_ANY_INT
+ HOST_BITS_PER_WIDE_INT
;
2143 const unsigned int realmax
= (SIGNIFICAND_BITS
/ HOST_BITS_PER_WIDE_INT
2144 * HOST_BITS_PER_WIDE_INT
);
2146 memset (r
, 0, sizeof (*r
));
2148 r
->sign
= wi::neg_p (val_in
, sgn
);
2150 /* We have to ensure we can negate the largest negative number. */
2151 wide_int val
= wide_int::from (val_in
, maxbitlen
, sgn
);
2156 /* Ensure a multiple of HOST_BITS_PER_WIDE_INT, ceiling, as elt
2157 won't work with precisions that are not a multiple of
2158 HOST_BITS_PER_WIDE_INT. */
2159 len
+= HOST_BITS_PER_WIDE_INT
- 1;
2161 /* Ensure we can represent the largest negative number. */
2164 len
= len
/HOST_BITS_PER_WIDE_INT
* HOST_BITS_PER_WIDE_INT
;
2166 /* Cap the size to the size allowed by real.h. */
2169 HOST_WIDE_INT cnt_l_z
;
2170 cnt_l_z
= wi::clz (val
);
2172 if (maxbitlen
- cnt_l_z
> realmax
)
2174 e
= maxbitlen
- cnt_l_z
- realmax
;
2176 /* This value is too large, we must shift it right to
2177 preserve all the bits we can, and then bump the
2178 exponent up by that amount. */
2179 val
= wi::lrshift (val
, e
);
2184 /* Clear out top bits so elt will work with precisions that aren't
2185 a multiple of HOST_BITS_PER_WIDE_INT. */
2186 val
= wide_int::from (val
, len
, sgn
);
2187 len
= len
/ HOST_BITS_PER_WIDE_INT
;
2189 SET_REAL_EXP (r
, len
* HOST_BITS_PER_WIDE_INT
+ e
);
2192 if (HOST_BITS_PER_LONG
== HOST_BITS_PER_WIDE_INT
)
2193 for (i
= len
- 1; i
>= 0; i
--)
2195 r
->sig
[j
--] = val
.elt (i
);
2201 gcc_assert (HOST_BITS_PER_LONG
*2 == HOST_BITS_PER_WIDE_INT
);
2202 for (i
= len
- 1; i
>= 0; i
--)
2204 HOST_WIDE_INT e
= val
.elt (i
);
2205 r
->sig
[j
--] = e
>> (HOST_BITS_PER_LONG
- 1) >> 1;
2217 if (fmt
.decimal_p ())
2218 decimal_from_integer (r
);
2220 real_convert (r
, fmt
, r
);
2223 /* Render R, an integral value, as a floating point constant with no
2224 specified exponent. */
2227 decimal_integer_string (char *str
, const REAL_VALUE_TYPE
*r_orig
,
2230 int dec_exp
, digit
, digits
;
2231 REAL_VALUE_TYPE r
, pten
;
2237 if (r
.cl
== rvc_zero
)
2246 dec_exp
= REAL_EXP (&r
) * M_LOG10_2
;
2247 digits
= dec_exp
+ 1;
2248 gcc_assert ((digits
+ 2) < (int)buf_size
);
2250 pten
= *real_digit (1);
2251 times_pten (&pten
, dec_exp
);
2257 digit
= rtd_divmod (&r
, &pten
);
2258 gcc_assert (digit
>= 0 && digit
<= 9);
2260 while (--digits
> 0)
2263 digit
= rtd_divmod (&r
, &pten
);
2270 /* Convert a real with an integral value to decimal float. */
2273 decimal_from_integer (REAL_VALUE_TYPE
*r
)
2277 decimal_integer_string (str
, r
, sizeof (str
) - 1);
2278 decimal_real_from_string (r
, str
);
2281 /* Returns 10**2**N. */
2283 static const REAL_VALUE_TYPE
*
2286 static REAL_VALUE_TYPE tens
[EXP_BITS
];
2288 gcc_assert (n
>= 0);
2289 gcc_assert (n
< EXP_BITS
);
2291 if (tens
[n
].cl
== rvc_zero
)
2293 if (n
< (HOST_BITS_PER_WIDE_INT
== 64 ? 5 : 4))
2295 HOST_WIDE_INT t
= 10;
2298 for (i
= 0; i
< n
; ++i
)
2301 real_from_integer (&tens
[n
], VOIDmode
, t
, UNSIGNED
);
2305 const REAL_VALUE_TYPE
*t
= ten_to_ptwo (n
- 1);
2306 do_multiply (&tens
[n
], t
, t
);
2313 /* Returns 10**(-2**N). */
2315 static const REAL_VALUE_TYPE
*
2316 ten_to_mptwo (int n
)
2318 static REAL_VALUE_TYPE tens
[EXP_BITS
];
2320 gcc_assert (n
>= 0);
2321 gcc_assert (n
< EXP_BITS
);
2323 if (tens
[n
].cl
== rvc_zero
)
2324 do_divide (&tens
[n
], real_digit (1), ten_to_ptwo (n
));
2331 static const REAL_VALUE_TYPE
*
2334 static REAL_VALUE_TYPE num
[10];
2336 gcc_assert (n
>= 0);
2337 gcc_assert (n
<= 9);
2339 if (n
> 0 && num
[n
].cl
== rvc_zero
)
2340 real_from_integer (&num
[n
], VOIDmode
, n
, UNSIGNED
);
2345 /* Multiply R by 10**EXP. */
2348 times_pten (REAL_VALUE_TYPE
*r
, int exp
)
2350 REAL_VALUE_TYPE pten
, *rr
;
2351 bool negative
= (exp
< 0);
2357 pten
= *real_digit (1);
2363 for (i
= 0; exp
> 0; ++i
, exp
>>= 1)
2365 do_multiply (rr
, rr
, ten_to_ptwo (i
));
2368 do_divide (r
, r
, &pten
);
2371 /* Returns the special REAL_VALUE_TYPE corresponding to 'e'. */
2373 const REAL_VALUE_TYPE
*
2376 static REAL_VALUE_TYPE value
;
2378 /* Initialize mathematical constants for constant folding builtins.
2379 These constants need to be given to at least 160 bits precision. */
2380 if (value
.cl
== rvc_zero
)
2383 mpfr_init2 (m
, SIGNIFICAND_BITS
);
2384 mpfr_set_ui (m
, 1, GMP_RNDN
);
2385 mpfr_exp (m
, m
, GMP_RNDN
);
2386 real_from_mpfr (&value
, m
, NULL_TREE
, GMP_RNDN
);
2393 /* Returns a cached REAL_VALUE_TYPE corresponding to 1/n, for various n. */
2395 #define CACHED_FRACTION(NAME, N) \
2396 const REAL_VALUE_TYPE * \
2399 static REAL_VALUE_TYPE value; \
2401 /* Initialize mathematical constants for constant folding builtins. \
2402 These constants need to be given to at least 160 bits \
2404 if (value.cl == rvc_zero) \
2405 real_arithmetic (&value, RDIV_EXPR, &dconst1, real_digit (N)); \
2409 CACHED_FRACTION (dconst_third_ptr
, 3)
2410 CACHED_FRACTION (dconst_quarter_ptr
, 4)
2411 CACHED_FRACTION (dconst_sixth_ptr
, 6)
2412 CACHED_FRACTION (dconst_ninth_ptr
, 9)
2414 /* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2). */
2416 const REAL_VALUE_TYPE
*
2417 dconst_sqrt2_ptr (void)
2419 static REAL_VALUE_TYPE value
;
2421 /* Initialize mathematical constants for constant folding builtins.
2422 These constants need to be given to at least 160 bits precision. */
2423 if (value
.cl
== rvc_zero
)
2426 mpfr_init2 (m
, SIGNIFICAND_BITS
);
2427 mpfr_sqrt_ui (m
, 2, GMP_RNDN
);
2428 real_from_mpfr (&value
, m
, NULL_TREE
, GMP_RNDN
);
2434 /* Fills R with +Inf. */
2437 real_inf (REAL_VALUE_TYPE
*r
)
2442 /* Fills R with a NaN whose significand is described by STR. If QUIET,
2443 we force a QNaN, else we force an SNaN. The string, if not empty,
2444 is parsed as a number and placed in the significand. Return true
2445 if the string was successfully parsed. */
2448 real_nan (REAL_VALUE_TYPE
*r
, const char *str
, int quiet
,
2454 get_canonical_qnan (r
, 0);
2456 get_canonical_snan (r
, 0);
2462 memset (r
, 0, sizeof (*r
));
2465 /* Parse akin to strtol into the significand of R. */
2467 while (ISSPACE (*str
))
2471 else if (*str
== '+')
2476 if (*str
== 'x' || *str
== 'X')
2485 while ((d
= hex_value (*str
)) < base
)
2492 lshift_significand (r
, r
, 3);
2495 lshift_significand (r
, r
, 4);
2498 lshift_significand_1 (&u
, r
);
2499 lshift_significand (r
, r
, 3);
2500 add_significands (r
, r
, &u
);
2508 add_significands (r
, r
, &u
);
2513 /* Must have consumed the entire string for success. */
2517 /* Shift the significand into place such that the bits
2518 are in the most significant bits for the format. */
2519 lshift_significand (r
, r
, SIGNIFICAND_BITS
- fmt
->pnan
);
2521 /* Our MSB is always unset for NaNs. */
2522 r
->sig
[SIGSZ
-1] &= ~SIG_MSB
;
2524 /* Force quiet or signalling NaN. */
2525 r
->signalling
= !quiet
;
2531 /* Fills R with the largest finite value representable in mode MODE.
2532 If SIGN is nonzero, R is set to the most negative finite value. */
2535 real_maxval (REAL_VALUE_TYPE
*r
, int sign
, machine_mode mode
)
2537 const struct real_format
*fmt
;
2540 fmt
= REAL_MODE_FORMAT (mode
);
2542 memset (r
, 0, sizeof (*r
));
2545 decimal_real_maxval (r
, sign
, mode
);
2550 SET_REAL_EXP (r
, fmt
->emax
);
2552 np2
= SIGNIFICAND_BITS
- fmt
->p
;
2553 memset (r
->sig
, -1, SIGSZ
* sizeof (unsigned long));
2554 clear_significand_below (r
, np2
);
2556 if (fmt
->pnan
< fmt
->p
)
2557 /* This is an IBM extended double format made up of two IEEE
2558 doubles. The value of the long double is the sum of the
2559 values of the two parts. The most significant part is
2560 required to be the value of the long double rounded to the
2561 nearest double. Rounding means we need a slightly smaller
2562 value for LDBL_MAX. */
2563 clear_significand_bit (r
, SIGNIFICAND_BITS
- fmt
->pnan
- 1);
2567 /* Fills R with 2**N. */
2570 real_2expN (REAL_VALUE_TYPE
*r
, int n
, format_helper fmt
)
2572 memset (r
, 0, sizeof (*r
));
2577 else if (n
< -MAX_EXP
)
2582 SET_REAL_EXP (r
, n
);
2583 r
->sig
[SIGSZ
-1] = SIG_MSB
;
2585 if (fmt
.decimal_p ())
2586 decimal_real_convert (r
, fmt
, r
);
2591 round_for_format (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
)
2595 bool round_up
= false;
2601 decimal_round_for_format (fmt
, r
);
2604 /* FIXME. We can come here via fp_easy_constant
2605 (e.g. -O0 on '_Decimal32 x = 1.0 + 2.0dd'), but have not
2606 investigated whether this convert needs to be here, or
2607 something else is missing. */
2608 decimal_real_convert (r
, REAL_MODE_FORMAT (DFmode
), r
);
2612 emin2m1
= fmt
->emin
- 1;
2615 np2
= SIGNIFICAND_BITS
- p2
;
2619 get_zero (r
, r
->sign
);
2621 if (!fmt
->has_signed_zero
)
2626 get_inf (r
, r
->sign
);
2631 clear_significand_below (r
, np2
);
2641 /* Check the range of the exponent. If we're out of range,
2642 either underflow or overflow. */
2643 if (REAL_EXP (r
) > emax2
)
2645 else if (REAL_EXP (r
) <= emin2m1
)
2649 if (!fmt
->has_denorm
)
2651 /* Don't underflow completely until we've had a chance to round. */
2652 if (REAL_EXP (r
) < emin2m1
)
2657 diff
= emin2m1
- REAL_EXP (r
) + 1;
2661 /* De-normalize the significand. */
2662 r
->sig
[0] |= sticky_rshift_significand (r
, r
, diff
);
2663 SET_REAL_EXP (r
, REAL_EXP (r
) + diff
);
2667 if (!fmt
->round_towards_zero
)
2669 /* There are P2 true significand bits, followed by one guard bit,
2670 followed by one sticky bit, followed by stuff. Fold nonzero
2671 stuff into the sticky bit. */
2672 unsigned long sticky
;
2676 for (i
= 0, w
= (np2
- 1) / HOST_BITS_PER_LONG
; i
< w
; ++i
)
2677 sticky
|= r
->sig
[i
];
2679 & (((unsigned long)1 << ((np2
- 1) % HOST_BITS_PER_LONG
)) - 1);
2681 guard
= test_significand_bit (r
, np2
- 1);
2682 lsb
= test_significand_bit (r
, np2
);
2684 /* Round to even. */
2685 round_up
= guard
&& (sticky
|| lsb
);
2692 set_significand_bit (&u
, np2
);
2694 if (add_significands (r
, r
, &u
))
2696 /* Overflow. Means the significand had been all ones, and
2697 is now all zeros. Need to increase the exponent, and
2698 possibly re-normalize it. */
2699 SET_REAL_EXP (r
, REAL_EXP (r
) + 1);
2700 if (REAL_EXP (r
) > emax2
)
2702 r
->sig
[SIGSZ
-1] = SIG_MSB
;
2706 /* Catch underflow that we deferred until after rounding. */
2707 if (REAL_EXP (r
) <= emin2m1
)
2710 /* Clear out trailing garbage. */
2711 clear_significand_below (r
, np2
);
2714 /* Extend or truncate to a new format. */
2717 real_convert (REAL_VALUE_TYPE
*r
, format_helper fmt
,
2718 const REAL_VALUE_TYPE
*a
)
2722 if (a
->decimal
|| fmt
->b
== 10)
2723 decimal_real_convert (r
, fmt
, a
);
2725 round_for_format (fmt
, r
);
2727 /* round_for_format de-normalizes denormals. Undo just that part. */
2728 if (r
->cl
== rvc_normal
)
2732 /* Legacy. Likewise, except return the struct directly. */
2735 real_value_truncate (format_helper fmt
, REAL_VALUE_TYPE a
)
2738 real_convert (&r
, fmt
, &a
);
2742 /* Return true if truncating to FMT is exact. */
2745 exact_real_truncate (format_helper fmt
, const REAL_VALUE_TYPE
*a
)
2750 /* Don't allow conversion to denormals. */
2751 emin2m1
= fmt
->emin
- 1;
2752 if (REAL_EXP (a
) <= emin2m1
)
2755 /* After conversion to the new format, the value must be identical. */
2756 real_convert (&t
, fmt
, a
);
2757 return real_identical (&t
, a
);
2760 /* Write R to the given target format. Place the words of the result
2761 in target word order in BUF. There are always 32 bits in each
2762 long, no matter the size of the host long.
2764 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2767 real_to_target (long *buf
, const REAL_VALUE_TYPE
*r_orig
,
2774 round_for_format (fmt
, &r
);
2778 (*fmt
->encode
) (fmt
, buf
, &r
);
2783 /* Read R from the given target format. Read the words of the result
2784 in target word order in BUF. There are always 32 bits in each
2785 long, no matter the size of the host long. */
2788 real_from_target (REAL_VALUE_TYPE
*r
, const long *buf
, format_helper fmt
)
2790 (*fmt
->decode
) (fmt
, r
, buf
);
2793 /* Return the number of bits of the largest binary value that the
2794 significand of FMT will hold. */
2795 /* ??? Legacy. Should get access to real_format directly. */
2798 significand_size (format_helper fmt
)
2805 /* Return the size in bits of the largest binary value that can be
2806 held by the decimal coefficient for this format. This is one more
2807 than the number of bits required to hold the largest coefficient
2809 double log2_10
= 3.3219281;
2810 return fmt
->p
* log2_10
;
2815 /* Return a hash value for the given real value. */
2816 /* ??? The "unsigned int" return value is intended to be hashval_t,
2817 but I didn't want to pull hashtab.h into real.h. */
2820 real_hash (const REAL_VALUE_TYPE
*r
)
2825 h
= r
->cl
| (r
->sign
<< 2);
2833 h
|= REAL_EXP (r
) << 3;
2838 h
^= (unsigned int)-1;
2847 if (sizeof (unsigned long) > sizeof (unsigned int))
2848 for (i
= 0; i
< SIGSZ
; ++i
)
2850 unsigned long s
= r
->sig
[i
];
2851 h
^= s
^ (s
>> (HOST_BITS_PER_LONG
/ 2));
2854 for (i
= 0; i
< SIGSZ
; ++i
)
2860 /* IEEE single-precision format. */
2862 static void encode_ieee_single (const struct real_format
*fmt
,
2863 long *, const REAL_VALUE_TYPE
*);
2864 static void decode_ieee_single (const struct real_format
*,
2865 REAL_VALUE_TYPE
*, const long *);
2868 encode_ieee_single (const struct real_format
*fmt
, long *buf
,
2869 const REAL_VALUE_TYPE
*r
)
2871 unsigned long image
, sig
, exp
;
2872 unsigned long sign
= r
->sign
;
2873 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
2876 sig
= (r
->sig
[SIGSZ
-1] >> (HOST_BITS_PER_LONG
- 24)) & 0x7fffff;
2887 image
|= 0x7fffffff;
2894 sig
= (fmt
->canonical_nan_lsbs_set
? (1 << 22) - 1 : 0);
2895 if (r
->signalling
== fmt
->qnan_msb_set
)
2906 image
|= 0x7fffffff;
2910 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2911 whereas the intermediate representation is 0.F x 2**exp.
2912 Which means we're off by one. */
2916 exp
= REAL_EXP (r
) + 127 - 1;
2929 decode_ieee_single (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
2932 unsigned long image
= buf
[0] & 0xffffffff;
2933 bool sign
= (image
>> 31) & 1;
2934 int exp
= (image
>> 23) & 0xff;
2936 memset (r
, 0, sizeof (*r
));
2937 image
<<= HOST_BITS_PER_LONG
- 24;
2942 if (image
&& fmt
->has_denorm
)
2946 SET_REAL_EXP (r
, -126);
2947 r
->sig
[SIGSZ
-1] = image
<< 1;
2950 else if (fmt
->has_signed_zero
)
2953 else if (exp
== 255 && (fmt
->has_nans
|| fmt
->has_inf
))
2959 r
->signalling
= (((image
>> (HOST_BITS_PER_LONG
- 2)) & 1)
2960 ^ fmt
->qnan_msb_set
);
2961 r
->sig
[SIGSZ
-1] = image
;
2973 SET_REAL_EXP (r
, exp
- 127 + 1);
2974 r
->sig
[SIGSZ
-1] = image
| SIG_MSB
;
2978 const struct real_format ieee_single_format
=
3000 const struct real_format mips_single_format
=
3022 const struct real_format motorola_single_format
=
3044 /* SPU Single Precision (Extended-Range Mode) format is the same as IEEE
3045 single precision with the following differences:
3046 - Infinities are not supported. Instead MAX_FLOAT or MIN_FLOAT
3048 - NaNs are not supported.
3049 - The range of non-zero numbers in binary is
3050 (001)[1.]000...000 to (255)[1.]111...111.
3051 - Denormals can be represented, but are treated as +0.0 when
3052 used as an operand and are never generated as a result.
3053 - -0.0 can be represented, but a zero result is always +0.0.
3054 - the only supported rounding mode is trunction (towards zero). */
3055 const struct real_format spu_single_format
=
3077 /* IEEE double-precision format. */
3079 static void encode_ieee_double (const struct real_format
*fmt
,
3080 long *, const REAL_VALUE_TYPE
*);
3081 static void decode_ieee_double (const struct real_format
*,
3082 REAL_VALUE_TYPE
*, const long *);
3085 encode_ieee_double (const struct real_format
*fmt
, long *buf
,
3086 const REAL_VALUE_TYPE
*r
)
3088 unsigned long image_lo
, image_hi
, sig_lo
, sig_hi
, exp
;
3089 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
3091 image_hi
= r
->sign
<< 31;
3094 if (HOST_BITS_PER_LONG
== 64)
3096 sig_hi
= r
->sig
[SIGSZ
-1];
3097 sig_lo
= (sig_hi
>> (64 - 53)) & 0xffffffff;
3098 sig_hi
= (sig_hi
>> (64 - 53 + 1) >> 31) & 0xfffff;
3102 sig_hi
= r
->sig
[SIGSZ
-1];
3103 sig_lo
= r
->sig
[SIGSZ
-2];
3104 sig_lo
= (sig_hi
<< 21) | (sig_lo
>> 11);
3105 sig_hi
= (sig_hi
>> 11) & 0xfffff;
3115 image_hi
|= 2047 << 20;
3118 image_hi
|= 0x7fffffff;
3119 image_lo
= 0xffffffff;
3128 if (fmt
->canonical_nan_lsbs_set
)
3130 sig_hi
= (1 << 19) - 1;
3131 sig_lo
= 0xffffffff;
3139 if (r
->signalling
== fmt
->qnan_msb_set
)
3140 sig_hi
&= ~(1 << 19);
3143 if (sig_hi
== 0 && sig_lo
== 0)
3146 image_hi
|= 2047 << 20;
3152 image_hi
|= 0x7fffffff;
3153 image_lo
= 0xffffffff;
3158 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3159 whereas the intermediate representation is 0.F x 2**exp.
3160 Which means we're off by one. */
3164 exp
= REAL_EXP (r
) + 1023 - 1;
3165 image_hi
|= exp
<< 20;
3174 if (FLOAT_WORDS_BIG_ENDIAN
)
3175 buf
[0] = image_hi
, buf
[1] = image_lo
;
3177 buf
[0] = image_lo
, buf
[1] = image_hi
;
3181 decode_ieee_double (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3184 unsigned long image_hi
, image_lo
;
3188 if (FLOAT_WORDS_BIG_ENDIAN
)
3189 image_hi
= buf
[0], image_lo
= buf
[1];
3191 image_lo
= buf
[0], image_hi
= buf
[1];
3192 image_lo
&= 0xffffffff;
3193 image_hi
&= 0xffffffff;
3195 sign
= (image_hi
>> 31) & 1;
3196 exp
= (image_hi
>> 20) & 0x7ff;
3198 memset (r
, 0, sizeof (*r
));
3200 image_hi
<<= 32 - 21;
3201 image_hi
|= image_lo
>> 21;
3202 image_hi
&= 0x7fffffff;
3203 image_lo
<<= 32 - 21;
3207 if ((image_hi
|| image_lo
) && fmt
->has_denorm
)
3211 SET_REAL_EXP (r
, -1022);
3212 if (HOST_BITS_PER_LONG
== 32)
3214 image_hi
= (image_hi
<< 1) | (image_lo
>> 31);
3216 r
->sig
[SIGSZ
-1] = image_hi
;
3217 r
->sig
[SIGSZ
-2] = image_lo
;
3221 image_hi
= (image_hi
<< 31 << 2) | (image_lo
<< 1);
3222 r
->sig
[SIGSZ
-1] = image_hi
;
3226 else if (fmt
->has_signed_zero
)
3229 else if (exp
== 2047 && (fmt
->has_nans
|| fmt
->has_inf
))
3231 if (image_hi
|| image_lo
)
3235 r
->signalling
= ((image_hi
>> 30) & 1) ^ fmt
->qnan_msb_set
;
3236 if (HOST_BITS_PER_LONG
== 32)
3238 r
->sig
[SIGSZ
-1] = image_hi
;
3239 r
->sig
[SIGSZ
-2] = image_lo
;
3242 r
->sig
[SIGSZ
-1] = (image_hi
<< 31 << 1) | image_lo
;
3254 SET_REAL_EXP (r
, exp
- 1023 + 1);
3255 if (HOST_BITS_PER_LONG
== 32)
3257 r
->sig
[SIGSZ
-1] = image_hi
| SIG_MSB
;
3258 r
->sig
[SIGSZ
-2] = image_lo
;
3261 r
->sig
[SIGSZ
-1] = (image_hi
<< 31 << 1) | image_lo
| SIG_MSB
;
3265 const struct real_format ieee_double_format
=
3287 const struct real_format mips_double_format
=
3309 const struct real_format motorola_double_format
=
3331 /* IEEE extended real format. This comes in three flavors: Intel's as
3332 a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
3333 12- and 16-byte images may be big- or little endian; Motorola's is
3334 always big endian. */
3336 /* Helper subroutine which converts from the internal format to the
3337 12-byte little-endian Intel format. Functions below adjust this
3338 for the other possible formats. */
3340 encode_ieee_extended (const struct real_format
*fmt
, long *buf
,
3341 const REAL_VALUE_TYPE
*r
)
3343 unsigned long image_hi
, sig_hi
, sig_lo
;
3344 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
3346 image_hi
= r
->sign
<< 15;
3347 sig_hi
= sig_lo
= 0;
3359 /* Intel requires the explicit integer bit to be set, otherwise
3360 it considers the value a "pseudo-infinity". Motorola docs
3361 say it doesn't care. */
3362 sig_hi
= 0x80000000;
3367 sig_lo
= sig_hi
= 0xffffffff;
3377 if (fmt
->canonical_nan_lsbs_set
)
3379 sig_hi
= (1 << 30) - 1;
3380 sig_lo
= 0xffffffff;
3383 else if (HOST_BITS_PER_LONG
== 32)
3385 sig_hi
= r
->sig
[SIGSZ
-1];
3386 sig_lo
= r
->sig
[SIGSZ
-2];
3390 sig_lo
= r
->sig
[SIGSZ
-1];
3391 sig_hi
= sig_lo
>> 31 >> 1;
3392 sig_lo
&= 0xffffffff;
3394 if (r
->signalling
== fmt
->qnan_msb_set
)
3395 sig_hi
&= ~(1 << 30);
3398 if ((sig_hi
& 0x7fffffff) == 0 && sig_lo
== 0)
3401 /* Intel requires the explicit integer bit to be set, otherwise
3402 it considers the value a "pseudo-nan". Motorola docs say it
3404 sig_hi
|= 0x80000000;
3409 sig_lo
= sig_hi
= 0xffffffff;
3415 int exp
= REAL_EXP (r
);
3417 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3418 whereas the intermediate representation is 0.F x 2**exp.
3419 Which means we're off by one.
3421 Except for Motorola, which consider exp=0 and explicit
3422 integer bit set to continue to be normalized. In theory
3423 this discrepancy has been taken care of by the difference
3424 in fmt->emin in round_for_format. */
3431 gcc_assert (exp
>= 0);
3435 if (HOST_BITS_PER_LONG
== 32)
3437 sig_hi
= r
->sig
[SIGSZ
-1];
3438 sig_lo
= r
->sig
[SIGSZ
-2];
3442 sig_lo
= r
->sig
[SIGSZ
-1];
3443 sig_hi
= sig_lo
>> 31 >> 1;
3444 sig_lo
&= 0xffffffff;
3453 buf
[0] = sig_lo
, buf
[1] = sig_hi
, buf
[2] = image_hi
;
3456 /* Convert from the internal format to the 12-byte Motorola format
3457 for an IEEE extended real. */
3459 encode_ieee_extended_motorola (const struct real_format
*fmt
, long *buf
,
3460 const REAL_VALUE_TYPE
*r
)
3463 encode_ieee_extended (fmt
, intermed
, r
);
3465 if (r
->cl
== rvc_inf
)
3466 /* For infinity clear the explicit integer bit again, so that the
3467 format matches the canonical infinity generated by the FPU. */
3470 /* Motorola chips are assumed always to be big-endian. Also, the
3471 padding in a Motorola extended real goes between the exponent and
3472 the mantissa. At this point the mantissa is entirely within
3473 elements 0 and 1 of intermed, and the exponent entirely within
3474 element 2, so all we have to do is swap the order around, and
3475 shift element 2 left 16 bits. */
3476 buf
[0] = intermed
[2] << 16;
3477 buf
[1] = intermed
[1];
3478 buf
[2] = intermed
[0];
3481 /* Convert from the internal format to the 12-byte Intel format for
3482 an IEEE extended real. */
3484 encode_ieee_extended_intel_96 (const struct real_format
*fmt
, long *buf
,
3485 const REAL_VALUE_TYPE
*r
)
3487 if (FLOAT_WORDS_BIG_ENDIAN
)
3489 /* All the padding in an Intel-format extended real goes at the high
3490 end, which in this case is after the mantissa, not the exponent.
3491 Therefore we must shift everything down 16 bits. */
3493 encode_ieee_extended (fmt
, intermed
, r
);
3494 buf
[0] = ((intermed
[2] << 16) | ((unsigned long)(intermed
[1] & 0xFFFF0000) >> 16));
3495 buf
[1] = ((intermed
[1] << 16) | ((unsigned long)(intermed
[0] & 0xFFFF0000) >> 16));
3496 buf
[2] = (intermed
[0] << 16);
3499 /* encode_ieee_extended produces what we want directly. */
3500 encode_ieee_extended (fmt
, buf
, r
);
3503 /* Convert from the internal format to the 16-byte Intel format for
3504 an IEEE extended real. */
3506 encode_ieee_extended_intel_128 (const struct real_format
*fmt
, long *buf
,
3507 const REAL_VALUE_TYPE
*r
)
3509 /* All the padding in an Intel-format extended real goes at the high end. */
3510 encode_ieee_extended_intel_96 (fmt
, buf
, r
);
3514 /* As above, we have a helper function which converts from 12-byte
3515 little-endian Intel format to internal format. Functions below
3516 adjust for the other possible formats. */
3518 decode_ieee_extended (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3521 unsigned long image_hi
, sig_hi
, sig_lo
;
3525 sig_lo
= buf
[0], sig_hi
= buf
[1], image_hi
= buf
[2];
3526 sig_lo
&= 0xffffffff;
3527 sig_hi
&= 0xffffffff;
3528 image_hi
&= 0xffffffff;
3530 sign
= (image_hi
>> 15) & 1;
3531 exp
= image_hi
& 0x7fff;
3533 memset (r
, 0, sizeof (*r
));
3537 if ((sig_hi
|| sig_lo
) && fmt
->has_denorm
)
3542 /* When the IEEE format contains a hidden bit, we know that
3543 it's zero at this point, and so shift up the significand
3544 and decrease the exponent to match. In this case, Motorola
3545 defines the explicit integer bit to be valid, so we don't
3546 know whether the msb is set or not. */
3547 SET_REAL_EXP (r
, fmt
->emin
);
3548 if (HOST_BITS_PER_LONG
== 32)
3550 r
->sig
[SIGSZ
-1] = sig_hi
;
3551 r
->sig
[SIGSZ
-2] = sig_lo
;
3554 r
->sig
[SIGSZ
-1] = (sig_hi
<< 31 << 1) | sig_lo
;
3558 else if (fmt
->has_signed_zero
)
3561 else if (exp
== 32767 && (fmt
->has_nans
|| fmt
->has_inf
))
3563 /* See above re "pseudo-infinities" and "pseudo-nans".
3564 Short summary is that the MSB will likely always be
3565 set, and that we don't care about it. */
3566 sig_hi
&= 0x7fffffff;
3568 if (sig_hi
|| sig_lo
)
3572 r
->signalling
= ((sig_hi
>> 30) & 1) ^ fmt
->qnan_msb_set
;
3573 if (HOST_BITS_PER_LONG
== 32)
3575 r
->sig
[SIGSZ
-1] = sig_hi
;
3576 r
->sig
[SIGSZ
-2] = sig_lo
;
3579 r
->sig
[SIGSZ
-1] = (sig_hi
<< 31 << 1) | sig_lo
;
3591 SET_REAL_EXP (r
, exp
- 16383 + 1);
3592 if (HOST_BITS_PER_LONG
== 32)
3594 r
->sig
[SIGSZ
-1] = sig_hi
;
3595 r
->sig
[SIGSZ
-2] = sig_lo
;
3598 r
->sig
[SIGSZ
-1] = (sig_hi
<< 31 << 1) | sig_lo
;
3602 /* Convert from the internal format to the 12-byte Motorola format
3603 for an IEEE extended real. */
3605 decode_ieee_extended_motorola (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3610 /* Motorola chips are assumed always to be big-endian. Also, the
3611 padding in a Motorola extended real goes between the exponent and
3612 the mantissa; remove it. */
3613 intermed
[0] = buf
[2];
3614 intermed
[1] = buf
[1];
3615 intermed
[2] = (unsigned long)buf
[0] >> 16;
3617 decode_ieee_extended (fmt
, r
, intermed
);
3620 /* Convert from the internal format to the 12-byte Intel format for
3621 an IEEE extended real. */
3623 decode_ieee_extended_intel_96 (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3626 if (FLOAT_WORDS_BIG_ENDIAN
)
3628 /* All the padding in an Intel-format extended real goes at the high
3629 end, which in this case is after the mantissa, not the exponent.
3630 Therefore we must shift everything up 16 bits. */
3633 intermed
[0] = (((unsigned long)buf
[2] >> 16) | (buf
[1] << 16));
3634 intermed
[1] = (((unsigned long)buf
[1] >> 16) | (buf
[0] << 16));
3635 intermed
[2] = ((unsigned long)buf
[0] >> 16);
3637 decode_ieee_extended (fmt
, r
, intermed
);
3640 /* decode_ieee_extended produces what we want directly. */
3641 decode_ieee_extended (fmt
, r
, buf
);
3644 /* Convert from the internal format to the 16-byte Intel format for
3645 an IEEE extended real. */
3647 decode_ieee_extended_intel_128 (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3650 /* All the padding in an Intel-format extended real goes at the high end. */
3651 decode_ieee_extended_intel_96 (fmt
, r
, buf
);
3654 const struct real_format ieee_extended_motorola_format
=
3656 encode_ieee_extended_motorola
,
3657 decode_ieee_extended_motorola
,
3673 "ieee_extended_motorola"
3676 const struct real_format ieee_extended_intel_96_format
=
3678 encode_ieee_extended_intel_96
,
3679 decode_ieee_extended_intel_96
,
3695 "ieee_extended_intel_96"
3698 const struct real_format ieee_extended_intel_128_format
=
3700 encode_ieee_extended_intel_128
,
3701 decode_ieee_extended_intel_128
,
3717 "ieee_extended_intel_128"
3720 /* The following caters to i386 systems that set the rounding precision
3721 to 53 bits instead of 64, e.g. FreeBSD. */
3722 const struct real_format ieee_extended_intel_96_round_53_format
=
3724 encode_ieee_extended_intel_96
,
3725 decode_ieee_extended_intel_96
,
3741 "ieee_extended_intel_96_round_53"
3744 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3745 numbers whose sum is equal to the extended precision value. The number
3746 with greater magnitude is first. This format has the same magnitude
3747 range as an IEEE double precision value, but effectively 106 bits of
3748 significand precision. Infinity and NaN are represented by their IEEE
3749 double precision value stored in the first number, the second number is
3750 +0.0 or -0.0 for Infinity and don't-care for NaN. */
3752 static void encode_ibm_extended (const struct real_format
*fmt
,
3753 long *, const REAL_VALUE_TYPE
*);
3754 static void decode_ibm_extended (const struct real_format
*,
3755 REAL_VALUE_TYPE
*, const long *);
3758 encode_ibm_extended (const struct real_format
*fmt
, long *buf
,
3759 const REAL_VALUE_TYPE
*r
)
3761 REAL_VALUE_TYPE u
, normr
, v
;
3762 const struct real_format
*base_fmt
;
3764 base_fmt
= fmt
->qnan_msb_set
? &ieee_double_format
: &mips_double_format
;
3766 /* Renormalize R before doing any arithmetic on it. */
3768 if (normr
.cl
== rvc_normal
)
3771 /* u = IEEE double precision portion of significand. */
3773 round_for_format (base_fmt
, &u
);
3774 encode_ieee_double (base_fmt
, &buf
[0], &u
);
3776 if (u
.cl
== rvc_normal
)
3778 do_add (&v
, &normr
, &u
, 1);
3779 /* Call round_for_format since we might need to denormalize. */
3780 round_for_format (base_fmt
, &v
);
3781 encode_ieee_double (base_fmt
, &buf
[2], &v
);
3785 /* Inf, NaN, 0 are all representable as doubles, so the
3786 least-significant part can be 0.0. */
3793 decode_ibm_extended (const struct real_format
*fmt ATTRIBUTE_UNUSED
, REAL_VALUE_TYPE
*r
,
3796 REAL_VALUE_TYPE u
, v
;
3797 const struct real_format
*base_fmt
;
3799 base_fmt
= fmt
->qnan_msb_set
? &ieee_double_format
: &mips_double_format
;
3800 decode_ieee_double (base_fmt
, &u
, &buf
[0]);
3802 if (u
.cl
!= rvc_zero
&& u
.cl
!= rvc_inf
&& u
.cl
!= rvc_nan
)
3804 decode_ieee_double (base_fmt
, &v
, &buf
[2]);
3805 do_add (r
, &u
, &v
, 0);
3811 const struct real_format ibm_extended_format
=
3813 encode_ibm_extended
,
3814 decode_ibm_extended
,
3833 const struct real_format mips_extended_format
=
3835 encode_ibm_extended
,
3836 decode_ibm_extended
,
3856 /* IEEE quad precision format. */
3858 static void encode_ieee_quad (const struct real_format
*fmt
,
3859 long *, const REAL_VALUE_TYPE
*);
3860 static void decode_ieee_quad (const struct real_format
*,
3861 REAL_VALUE_TYPE
*, const long *);
3864 encode_ieee_quad (const struct real_format
*fmt
, long *buf
,
3865 const REAL_VALUE_TYPE
*r
)
3867 unsigned long image3
, image2
, image1
, image0
, exp
;
3868 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
3871 image3
= r
->sign
<< 31;
3876 rshift_significand (&u
, r
, SIGNIFICAND_BITS
- 113);
3885 image3
|= 32767 << 16;
3888 image3
|= 0x7fffffff;
3889 image2
= 0xffffffff;
3890 image1
= 0xffffffff;
3891 image0
= 0xffffffff;
3898 image3
|= 32767 << 16;
3902 if (fmt
->canonical_nan_lsbs_set
)
3905 image2
= image1
= image0
= 0xffffffff;
3908 else if (HOST_BITS_PER_LONG
== 32)
3913 image3
|= u
.sig
[3] & 0xffff;
3918 image1
= image0
>> 31 >> 1;
3920 image3
|= (image2
>> 31 >> 1) & 0xffff;
3921 image0
&= 0xffffffff;
3922 image2
&= 0xffffffff;
3924 if (r
->signalling
== fmt
->qnan_msb_set
)
3928 if (((image3
& 0xffff) | image2
| image1
| image0
) == 0)
3933 image3
|= 0x7fffffff;
3934 image2
= 0xffffffff;
3935 image1
= 0xffffffff;
3936 image0
= 0xffffffff;
3941 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3942 whereas the intermediate representation is 0.F x 2**exp.
3943 Which means we're off by one. */
3947 exp
= REAL_EXP (r
) + 16383 - 1;
3948 image3
|= exp
<< 16;
3950 if (HOST_BITS_PER_LONG
== 32)
3955 image3
|= u
.sig
[3] & 0xffff;
3960 image1
= image0
>> 31 >> 1;
3962 image3
|= (image2
>> 31 >> 1) & 0xffff;
3963 image0
&= 0xffffffff;
3964 image2
&= 0xffffffff;
3972 if (FLOAT_WORDS_BIG_ENDIAN
)
3989 decode_ieee_quad (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3992 unsigned long image3
, image2
, image1
, image0
;
3996 if (FLOAT_WORDS_BIG_ENDIAN
)
4010 image0
&= 0xffffffff;
4011 image1
&= 0xffffffff;
4012 image2
&= 0xffffffff;
4014 sign
= (image3
>> 31) & 1;
4015 exp
= (image3
>> 16) & 0x7fff;
4018 memset (r
, 0, sizeof (*r
));
4022 if ((image3
| image2
| image1
| image0
) && fmt
->has_denorm
)
4027 SET_REAL_EXP (r
, -16382 + (SIGNIFICAND_BITS
- 112));
4028 if (HOST_BITS_PER_LONG
== 32)
4037 r
->sig
[0] = (image1
<< 31 << 1) | image0
;
4038 r
->sig
[1] = (image3
<< 31 << 1) | image2
;
4043 else if (fmt
->has_signed_zero
)
4046 else if (exp
== 32767 && (fmt
->has_nans
|| fmt
->has_inf
))
4048 if (image3
| image2
| image1
| image0
)
4052 r
->signalling
= ((image3
>> 15) & 1) ^ fmt
->qnan_msb_set
;
4054 if (HOST_BITS_PER_LONG
== 32)
4063 r
->sig
[0] = (image1
<< 31 << 1) | image0
;
4064 r
->sig
[1] = (image3
<< 31 << 1) | image2
;
4066 lshift_significand (r
, r
, SIGNIFICAND_BITS
- 113);
4078 SET_REAL_EXP (r
, exp
- 16383 + 1);
4080 if (HOST_BITS_PER_LONG
== 32)
4089 r
->sig
[0] = (image1
<< 31 << 1) | image0
;
4090 r
->sig
[1] = (image3
<< 31 << 1) | image2
;
4092 lshift_significand (r
, r
, SIGNIFICAND_BITS
- 113);
4093 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
4097 const struct real_format ieee_quad_format
=
4119 const struct real_format mips_quad_format
=
4141 /* Descriptions of VAX floating point formats can be found beginning at
4143 http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
4145 The thing to remember is that they're almost IEEE, except for word
4146 order, exponent bias, and the lack of infinities, nans, and denormals.
4148 We don't implement the H_floating format here, simply because neither
4149 the VAX or Alpha ports use it. */
4151 static void encode_vax_f (const struct real_format
*fmt
,
4152 long *, const REAL_VALUE_TYPE
*);
4153 static void decode_vax_f (const struct real_format
*,
4154 REAL_VALUE_TYPE
*, const long *);
4155 static void encode_vax_d (const struct real_format
*fmt
,
4156 long *, const REAL_VALUE_TYPE
*);
4157 static void decode_vax_d (const struct real_format
*,
4158 REAL_VALUE_TYPE
*, const long *);
4159 static void encode_vax_g (const struct real_format
*fmt
,
4160 long *, const REAL_VALUE_TYPE
*);
4161 static void decode_vax_g (const struct real_format
*,
4162 REAL_VALUE_TYPE
*, const long *);
4165 encode_vax_f (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
4166 const REAL_VALUE_TYPE
*r
)
4168 unsigned long sign
, exp
, sig
, image
;
4170 sign
= r
->sign
<< 15;
4180 image
= 0xffff7fff | sign
;
4184 sig
= (r
->sig
[SIGSZ
-1] >> (HOST_BITS_PER_LONG
- 24)) & 0x7fffff;
4185 exp
= REAL_EXP (r
) + 128;
4187 image
= (sig
<< 16) & 0xffff0000;
4201 decode_vax_f (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4202 REAL_VALUE_TYPE
*r
, const long *buf
)
4204 unsigned long image
= buf
[0] & 0xffffffff;
4205 int exp
= (image
>> 7) & 0xff;
4207 memset (r
, 0, sizeof (*r
));
4212 r
->sign
= (image
>> 15) & 1;
4213 SET_REAL_EXP (r
, exp
- 128);
4215 image
= ((image
& 0x7f) << 16) | ((image
>> 16) & 0xffff);
4216 r
->sig
[SIGSZ
-1] = (image
<< (HOST_BITS_PER_LONG
- 24)) | SIG_MSB
;
4221 encode_vax_d (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
4222 const REAL_VALUE_TYPE
*r
)
4224 unsigned long image0
, image1
, sign
= r
->sign
<< 15;
4229 image0
= image1
= 0;
4234 image0
= 0xffff7fff | sign
;
4235 image1
= 0xffffffff;
4239 /* Extract the significand into straight hi:lo. */
4240 if (HOST_BITS_PER_LONG
== 64)
4242 image0
= r
->sig
[SIGSZ
-1];
4243 image1
= (image0
>> (64 - 56)) & 0xffffffff;
4244 image0
= (image0
>> (64 - 56 + 1) >> 31) & 0x7fffff;
4248 image0
= r
->sig
[SIGSZ
-1];
4249 image1
= r
->sig
[SIGSZ
-2];
4250 image1
= (image0
<< 24) | (image1
>> 8);
4251 image0
= (image0
>> 8) & 0xffffff;
4254 /* Rearrange the half-words of the significand to match the
4256 image0
= ((image0
<< 16) | (image0
>> 16)) & 0xffff007f;
4257 image1
= ((image1
<< 16) | (image1
>> 16)) & 0xffffffff;
4259 /* Add the sign and exponent. */
4261 image0
|= (REAL_EXP (r
) + 128) << 7;
4268 if (FLOAT_WORDS_BIG_ENDIAN
)
4269 buf
[0] = image1
, buf
[1] = image0
;
4271 buf
[0] = image0
, buf
[1] = image1
;
4275 decode_vax_d (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4276 REAL_VALUE_TYPE
*r
, const long *buf
)
4278 unsigned long image0
, image1
;
4281 if (FLOAT_WORDS_BIG_ENDIAN
)
4282 image1
= buf
[0], image0
= buf
[1];
4284 image0
= buf
[0], image1
= buf
[1];
4285 image0
&= 0xffffffff;
4286 image1
&= 0xffffffff;
4288 exp
= (image0
>> 7) & 0xff;
4290 memset (r
, 0, sizeof (*r
));
4295 r
->sign
= (image0
>> 15) & 1;
4296 SET_REAL_EXP (r
, exp
- 128);
4298 /* Rearrange the half-words of the external format into
4299 proper ascending order. */
4300 image0
= ((image0
& 0x7f) << 16) | ((image0
>> 16) & 0xffff);
4301 image1
= ((image1
& 0xffff) << 16) | ((image1
>> 16) & 0xffff);
4303 if (HOST_BITS_PER_LONG
== 64)
4305 image0
= (image0
<< 31 << 1) | image1
;
4308 r
->sig
[SIGSZ
-1] = image0
;
4312 r
->sig
[SIGSZ
-1] = image0
;
4313 r
->sig
[SIGSZ
-2] = image1
;
4314 lshift_significand (r
, r
, 2*HOST_BITS_PER_LONG
- 56);
4315 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
4321 encode_vax_g (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
4322 const REAL_VALUE_TYPE
*r
)
4324 unsigned long image0
, image1
, sign
= r
->sign
<< 15;
4329 image0
= image1
= 0;
4334 image0
= 0xffff7fff | sign
;
4335 image1
= 0xffffffff;
4339 /* Extract the significand into straight hi:lo. */
4340 if (HOST_BITS_PER_LONG
== 64)
4342 image0
= r
->sig
[SIGSZ
-1];
4343 image1
= (image0
>> (64 - 53)) & 0xffffffff;
4344 image0
= (image0
>> (64 - 53 + 1) >> 31) & 0xfffff;
4348 image0
= r
->sig
[SIGSZ
-1];
4349 image1
= r
->sig
[SIGSZ
-2];
4350 image1
= (image0
<< 21) | (image1
>> 11);
4351 image0
= (image0
>> 11) & 0xfffff;
4354 /* Rearrange the half-words of the significand to match the
4356 image0
= ((image0
<< 16) | (image0
>> 16)) & 0xffff000f;
4357 image1
= ((image1
<< 16) | (image1
>> 16)) & 0xffffffff;
4359 /* Add the sign and exponent. */
4361 image0
|= (REAL_EXP (r
) + 1024) << 4;
4368 if (FLOAT_WORDS_BIG_ENDIAN
)
4369 buf
[0] = image1
, buf
[1] = image0
;
4371 buf
[0] = image0
, buf
[1] = image1
;
4375 decode_vax_g (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4376 REAL_VALUE_TYPE
*r
, const long *buf
)
4378 unsigned long image0
, image1
;
4381 if (FLOAT_WORDS_BIG_ENDIAN
)
4382 image1
= buf
[0], image0
= buf
[1];
4384 image0
= buf
[0], image1
= buf
[1];
4385 image0
&= 0xffffffff;
4386 image1
&= 0xffffffff;
4388 exp
= (image0
>> 4) & 0x7ff;
4390 memset (r
, 0, sizeof (*r
));
4395 r
->sign
= (image0
>> 15) & 1;
4396 SET_REAL_EXP (r
, exp
- 1024);
4398 /* Rearrange the half-words of the external format into
4399 proper ascending order. */
4400 image0
= ((image0
& 0xf) << 16) | ((image0
>> 16) & 0xffff);
4401 image1
= ((image1
& 0xffff) << 16) | ((image1
>> 16) & 0xffff);
4403 if (HOST_BITS_PER_LONG
== 64)
4405 image0
= (image0
<< 31 << 1) | image1
;
4408 r
->sig
[SIGSZ
-1] = image0
;
4412 r
->sig
[SIGSZ
-1] = image0
;
4413 r
->sig
[SIGSZ
-2] = image1
;
4414 lshift_significand (r
, r
, 64 - 53);
4415 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
4420 const struct real_format vax_f_format
=
4442 const struct real_format vax_d_format
=
4464 const struct real_format vax_g_format
=
4486 /* Encode real R into a single precision DFP value in BUF. */
4488 encode_decimal_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4489 long *buf ATTRIBUTE_UNUSED
,
4490 const REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
)
4492 encode_decimal32 (fmt
, buf
, r
);
4495 /* Decode a single precision DFP value in BUF into a real R. */
4497 decode_decimal_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4498 REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
,
4499 const long *buf ATTRIBUTE_UNUSED
)
4501 decode_decimal32 (fmt
, r
, buf
);
4504 /* Encode real R into a double precision DFP value in BUF. */
4506 encode_decimal_double (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4507 long *buf ATTRIBUTE_UNUSED
,
4508 const REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
)
4510 encode_decimal64 (fmt
, buf
, r
);
4513 /* Decode a double precision DFP value in BUF into a real R. */
4515 decode_decimal_double (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4516 REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
,
4517 const long *buf ATTRIBUTE_UNUSED
)
4519 decode_decimal64 (fmt
, r
, buf
);
4522 /* Encode real R into a quad precision DFP value in BUF. */
4524 encode_decimal_quad (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4525 long *buf ATTRIBUTE_UNUSED
,
4526 const REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
)
4528 encode_decimal128 (fmt
, buf
, r
);
4531 /* Decode a quad precision DFP value in BUF into a real R. */
4533 decode_decimal_quad (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4534 REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
,
4535 const long *buf ATTRIBUTE_UNUSED
)
4537 decode_decimal128 (fmt
, r
, buf
);
4540 /* Single precision decimal floating point (IEEE 754). */
4541 const struct real_format decimal_single_format
=
4543 encode_decimal_single
,
4544 decode_decimal_single
,
4563 /* Double precision decimal floating point (IEEE 754). */
4564 const struct real_format decimal_double_format
=
4566 encode_decimal_double
,
4567 decode_decimal_double
,
4586 /* Quad precision decimal floating point (IEEE 754). */
4587 const struct real_format decimal_quad_format
=
4589 encode_decimal_quad
,
4590 decode_decimal_quad
,
4609 /* Encode half-precision floats. This routine is used both for the IEEE
4610 ARM alternative encodings. */
4612 encode_ieee_half (const struct real_format
*fmt
, long *buf
,
4613 const REAL_VALUE_TYPE
*r
)
4615 unsigned long image
, sig
, exp
;
4616 unsigned long sign
= r
->sign
;
4617 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
4620 sig
= (r
->sig
[SIGSZ
-1] >> (HOST_BITS_PER_LONG
- 11)) & 0x3ff;
4638 sig
= (fmt
->canonical_nan_lsbs_set
? (1 << 9) - 1 : 0);
4639 if (r
->signalling
== fmt
->qnan_msb_set
)
4654 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
4655 whereas the intermediate representation is 0.F x 2**exp.
4656 Which means we're off by one. */
4660 exp
= REAL_EXP (r
) + 15 - 1;
4672 /* Decode half-precision floats. This routine is used both for the IEEE
4673 ARM alternative encodings. */
4675 decode_ieee_half (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
4678 unsigned long image
= buf
[0] & 0xffff;
4679 bool sign
= (image
>> 15) & 1;
4680 int exp
= (image
>> 10) & 0x1f;
4682 memset (r
, 0, sizeof (*r
));
4683 image
<<= HOST_BITS_PER_LONG
- 11;
4688 if (image
&& fmt
->has_denorm
)
4692 SET_REAL_EXP (r
, -14);
4693 r
->sig
[SIGSZ
-1] = image
<< 1;
4696 else if (fmt
->has_signed_zero
)
4699 else if (exp
== 31 && (fmt
->has_nans
|| fmt
->has_inf
))
4705 r
->signalling
= (((image
>> (HOST_BITS_PER_LONG
- 2)) & 1)
4706 ^ fmt
->qnan_msb_set
);
4707 r
->sig
[SIGSZ
-1] = image
;
4719 SET_REAL_EXP (r
, exp
- 15 + 1);
4720 r
->sig
[SIGSZ
-1] = image
| SIG_MSB
;
4724 /* Half-precision format, as specified in IEEE 754R. */
4725 const struct real_format ieee_half_format
=
4747 /* ARM's alternative half-precision format, similar to IEEE but with
4748 no reserved exponent value for NaNs and infinities; rather, it just
4749 extends the range of exponents by one. */
4750 const struct real_format arm_half_format
=
4772 /* A synthetic "format" for internal arithmetic. It's the size of the
4773 internal significand minus the two bits needed for proper rounding.
4774 The encode and decode routines exist only to satisfy our paranoia
4777 static void encode_internal (const struct real_format
*fmt
,
4778 long *, const REAL_VALUE_TYPE
*);
4779 static void decode_internal (const struct real_format
*,
4780 REAL_VALUE_TYPE
*, const long *);
4783 encode_internal (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
4784 const REAL_VALUE_TYPE
*r
)
4786 memcpy (buf
, r
, sizeof (*r
));
4790 decode_internal (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4791 REAL_VALUE_TYPE
*r
, const long *buf
)
4793 memcpy (r
, buf
, sizeof (*r
));
4796 const struct real_format real_internal_format
=
4801 SIGNIFICAND_BITS
- 2,
4802 SIGNIFICAND_BITS
- 2,
4818 /* Calculate X raised to the integer exponent N in format FMT and store
4819 the result in R. Return true if the result may be inexact due to
4820 loss of precision. The algorithm is the classic "left-to-right binary
4821 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4822 Algorithms", "The Art of Computer Programming", Volume 2. */
4825 real_powi (REAL_VALUE_TYPE
*r
, format_helper fmt
,
4826 const REAL_VALUE_TYPE
*x
, HOST_WIDE_INT n
)
4828 unsigned HOST_WIDE_INT bit
;
4830 bool inexact
= false;
4842 /* Don't worry about overflow, from now on n is unsigned. */
4850 bit
= (unsigned HOST_WIDE_INT
) 1 << (HOST_BITS_PER_WIDE_INT
- 1);
4851 for (i
= 0; i
< HOST_BITS_PER_WIDE_INT
; i
++)
4855 inexact
|= do_multiply (&t
, &t
, &t
);
4857 inexact
|= do_multiply (&t
, &t
, x
);
4865 inexact
|= do_divide (&t
, &dconst1
, &t
);
4867 real_convert (r
, fmt
, &t
);
4871 /* Round X to the nearest integer not larger in absolute value, i.e.
4872 towards zero, placing the result in R in format FMT. */
4875 real_trunc (REAL_VALUE_TYPE
*r
, format_helper fmt
,
4876 const REAL_VALUE_TYPE
*x
)
4878 do_fix_trunc (r
, x
);
4880 real_convert (r
, fmt
, r
);
4883 /* Round X to the largest integer not greater in value, i.e. round
4884 down, placing the result in R in format FMT. */
4887 real_floor (REAL_VALUE_TYPE
*r
, format_helper fmt
,
4888 const REAL_VALUE_TYPE
*x
)
4892 do_fix_trunc (&t
, x
);
4893 if (! real_identical (&t
, x
) && x
->sign
)
4894 do_add (&t
, &t
, &dconstm1
, 0);
4896 real_convert (r
, fmt
, &t
);
4901 /* Round X to the smallest integer not less then argument, i.e. round
4902 up, placing the result in R in format FMT. */
4905 real_ceil (REAL_VALUE_TYPE
*r
, format_helper fmt
,
4906 const REAL_VALUE_TYPE
*x
)
4910 do_fix_trunc (&t
, x
);
4911 if (! real_identical (&t
, x
) && ! x
->sign
)
4912 do_add (&t
, &t
, &dconst1
, 0);
4914 real_convert (r
, fmt
, &t
);
4919 /* Round X to the nearest integer, but round halfway cases away from
4923 real_round (REAL_VALUE_TYPE
*r
, format_helper fmt
,
4924 const REAL_VALUE_TYPE
*x
)
4926 do_add (r
, x
, &dconsthalf
, x
->sign
);
4927 do_fix_trunc (r
, r
);
4929 real_convert (r
, fmt
, r
);
4932 /* Set the sign of R to the sign of X. */
4935 real_copysign (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*x
)
4940 /* Check whether the real constant value given is an integer. */
4943 real_isinteger (const REAL_VALUE_TYPE
*c
, format_helper fmt
)
4945 REAL_VALUE_TYPE cint
;
4947 real_trunc (&cint
, fmt
, c
);
4948 return real_identical (c
, &cint
);
4951 /* Check whether C is an integer that fits in a HOST_WIDE_INT,
4952 storing it in *INT_OUT if so. */
4955 real_isinteger (const REAL_VALUE_TYPE
*c
, HOST_WIDE_INT
*int_out
)
4957 REAL_VALUE_TYPE cint
;
4959 HOST_WIDE_INT n
= real_to_integer (c
);
4960 real_from_integer (&cint
, VOIDmode
, n
, SIGNED
);
4961 if (real_identical (c
, &cint
))
4969 /* Write into BUF the maximum representable finite floating-point
4970 number, (1 - b**-p) * b**emax for a given FP format FMT as a hex
4971 float string. LEN is the size of BUF, and the buffer must be large
4972 enough to contain the resulting string. */
4975 get_max_float (const struct real_format
*fmt
, char *buf
, size_t len
)
4980 strcpy (buf
, "0x0.");
4982 for (i
= 0, p
= buf
+ 4; i
+ 3 < n
; i
+= 4)
4985 *p
++ = "08ce"[n
- i
];
4986 sprintf (p
, "p%d", fmt
->emax
);
4987 if (fmt
->pnan
< fmt
->p
)
4989 /* This is an IBM extended double format made up of two IEEE
4990 doubles. The value of the long double is the sum of the
4991 values of the two parts. The most significant part is
4992 required to be the value of the long double rounded to the
4993 nearest double. Rounding means we need a slightly smaller
4994 value for LDBL_MAX. */
4995 buf
[4 + fmt
->pnan
/ 4] = "7bde"[fmt
->pnan
% 4];
4998 gcc_assert (strlen (buf
) < len
);
5001 /* True if mode M has a NaN representation and
5002 the treatment of NaN operands is important. */
5005 HONOR_NANS (machine_mode m
)
5007 return MODE_HAS_NANS (m
) && !flag_finite_math_only
;
5011 HONOR_NANS (const_tree t
)
5013 return HONOR_NANS (element_mode (t
));
5017 HONOR_NANS (const_rtx x
)
5019 return HONOR_NANS (GET_MODE (x
));
5022 /* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs). */
5025 HONOR_SNANS (machine_mode m
)
5027 return flag_signaling_nans
&& HONOR_NANS (m
);
5031 HONOR_SNANS (const_tree t
)
5033 return HONOR_SNANS (element_mode (t
));
5037 HONOR_SNANS (const_rtx x
)
5039 return HONOR_SNANS (GET_MODE (x
));
5042 /* As for HONOR_NANS, but true if the mode can represent infinity and
5043 the treatment of infinite values is important. */
5046 HONOR_INFINITIES (machine_mode m
)
5048 return MODE_HAS_INFINITIES (m
) && !flag_finite_math_only
;
5052 HONOR_INFINITIES (const_tree t
)
5054 return HONOR_INFINITIES (element_mode (t
));
5058 HONOR_INFINITIES (const_rtx x
)
5060 return HONOR_INFINITIES (GET_MODE (x
));
5063 /* Like HONOR_NANS, but true if the given mode distinguishes between
5064 positive and negative zero, and the sign of zero is important. */
5067 HONOR_SIGNED_ZEROS (machine_mode m
)
5069 return MODE_HAS_SIGNED_ZEROS (m
) && flag_signed_zeros
;
5073 HONOR_SIGNED_ZEROS (const_tree t
)
5075 return HONOR_SIGNED_ZEROS (element_mode (t
));
5079 HONOR_SIGNED_ZEROS (const_rtx x
)
5081 return HONOR_SIGNED_ZEROS (GET_MODE (x
));
5084 /* Like HONOR_NANS, but true if given mode supports sign-dependent rounding,
5085 and the rounding mode is important. */
5088 HONOR_SIGN_DEPENDENT_ROUNDING (machine_mode m
)
5090 return MODE_HAS_SIGN_DEPENDENT_ROUNDING (m
) && flag_rounding_math
;
5094 HONOR_SIGN_DEPENDENT_ROUNDING (const_tree t
)
5096 return HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (t
));
5100 HONOR_SIGN_DEPENDENT_ROUNDING (const_rtx x
)
5102 return HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (x
));