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>
7 This file is part of GCC.
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
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
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
26 #include "coretypes.h"
34 /* The floating point model used internally is not exactly IEEE 754
35 compliant, and close to the description in the ISO C99 standard,
36 section 5.2.4.2.2 Characteristics of floating types.
40 x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
44 b = base or radix, here always 2
46 p = precision (the number of base-b digits in the significand)
47 f_k = the digits of the significand.
49 We differ from typical IEEE 754 encodings in that the entire
50 significand is fractional. Normalized significands are in the
53 A requirement of the model is that P be larger than the largest
54 supported target floating-point type by at least 2 bits. This gives
55 us proper rounding when we truncate to the target type. In addition,
56 E must be large enough to hold the smallest supported denormal number
59 Both of these requirements are easily satisfied. The largest target
60 significand is 113 bits; we store at least 160. The smallest
61 denormal number fits in 17 exponent bits; we store 27.
63 Note that the decimal string conversion routines are sensitive to
64 rounding errors. Since the raw arithmetic routines do not themselves
65 have guard digits or rounding, the computation of 10**exp can
66 accumulate more than a few digits of error. The previous incarnation
67 of real.c successfully used a 144-bit fraction; given the current
68 layout of REAL_VALUE_TYPE we're forced to expand to at least 160 bits.
70 Target floating point models that use base 16 instead of base 2
71 (i.e. IBM 370), are handled during round_for_format, in which we
72 canonicalize the exponent to be a multiple of 4 (log2(16)), and
73 adjust the significand to match. */
76 /* Used to classify two numbers simultaneously. */
77 #define CLASS2(A, B) ((A) << 2 | (B))
79 #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
80 #error "Some constant folding done by hand to avoid shift count warnings"
83 static void get_zero (REAL_VALUE_TYPE
*, int);
84 static void get_canonical_qnan (REAL_VALUE_TYPE
*, int);
85 static void get_canonical_snan (REAL_VALUE_TYPE
*, int);
86 static void get_inf (REAL_VALUE_TYPE
*, int);
87 static bool sticky_rshift_significand (REAL_VALUE_TYPE
*,
88 const REAL_VALUE_TYPE
*, unsigned int);
89 static void rshift_significand (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
91 static void lshift_significand (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
93 static void lshift_significand_1 (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
94 static bool add_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*,
95 const REAL_VALUE_TYPE
*);
96 static bool sub_significands (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
97 const REAL_VALUE_TYPE
*, int);
98 static void neg_significand (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
99 static int cmp_significands (const REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
100 static int cmp_significand_0 (const REAL_VALUE_TYPE
*);
101 static void set_significand_bit (REAL_VALUE_TYPE
*, unsigned int);
102 static void clear_significand_bit (REAL_VALUE_TYPE
*, unsigned int);
103 static bool test_significand_bit (REAL_VALUE_TYPE
*, unsigned int);
104 static void clear_significand_below (REAL_VALUE_TYPE
*, unsigned int);
105 static bool div_significands (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
106 const REAL_VALUE_TYPE
*);
107 static void normalize (REAL_VALUE_TYPE
*);
109 static bool do_add (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
110 const REAL_VALUE_TYPE
*, int);
111 static bool do_multiply (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
112 const REAL_VALUE_TYPE
*);
113 static bool do_divide (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
114 const REAL_VALUE_TYPE
*);
115 static int do_compare (const REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*, int);
116 static void do_fix_trunc (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
118 static unsigned long rtd_divmod (REAL_VALUE_TYPE
*, REAL_VALUE_TYPE
*);
120 static const REAL_VALUE_TYPE
* ten_to_ptwo (int);
121 static const REAL_VALUE_TYPE
* ten_to_mptwo (int);
122 static const REAL_VALUE_TYPE
* real_digit (int);
123 static void times_pten (REAL_VALUE_TYPE
*, int);
125 static void round_for_format (const struct real_format
*, REAL_VALUE_TYPE
*);
127 /* Initialize R with a positive zero. */
130 get_zero (REAL_VALUE_TYPE
*r
, int sign
)
132 memset (r
, 0, sizeof (*r
));
136 /* Initialize R with the canonical quiet NaN. */
139 get_canonical_qnan (REAL_VALUE_TYPE
*r
, int sign
)
141 memset (r
, 0, sizeof (*r
));
148 get_canonical_snan (REAL_VALUE_TYPE
*r
, int sign
)
150 memset (r
, 0, sizeof (*r
));
158 get_inf (REAL_VALUE_TYPE
*r
, int sign
)
160 memset (r
, 0, sizeof (*r
));
166 /* Right-shift the significand of A by N bits; put the result in the
167 significand of R. If any one bits are shifted out, return true. */
170 sticky_rshift_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
173 unsigned long sticky
= 0;
174 unsigned int i
, ofs
= 0;
176 if (n
>= HOST_BITS_PER_LONG
)
178 for (i
= 0, ofs
= n
/ HOST_BITS_PER_LONG
; i
< ofs
; ++i
)
180 n
&= HOST_BITS_PER_LONG
- 1;
185 sticky
|= a
->sig
[ofs
] & (((unsigned long)1 << n
) - 1);
186 for (i
= 0; i
< SIGSZ
; ++i
)
189 = (((ofs
+ i
>= SIGSZ
? 0 : a
->sig
[ofs
+ i
]) >> n
)
190 | ((ofs
+ i
+ 1 >= SIGSZ
? 0 : a
->sig
[ofs
+ i
+ 1])
191 << (HOST_BITS_PER_LONG
- n
)));
196 for (i
= 0; ofs
+ i
< SIGSZ
; ++i
)
197 r
->sig
[i
] = a
->sig
[ofs
+ i
];
198 for (; i
< SIGSZ
; ++i
)
205 /* Right-shift the significand of A by N bits; put the result in the
209 rshift_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
212 unsigned int i
, ofs
= n
/ HOST_BITS_PER_LONG
;
214 n
&= HOST_BITS_PER_LONG
- 1;
217 for (i
= 0; i
< SIGSZ
; ++i
)
220 = (((ofs
+ i
>= SIGSZ
? 0 : a
->sig
[ofs
+ i
]) >> n
)
221 | ((ofs
+ i
+ 1 >= SIGSZ
? 0 : a
->sig
[ofs
+ i
+ 1])
222 << (HOST_BITS_PER_LONG
- n
)));
227 for (i
= 0; ofs
+ i
< SIGSZ
; ++i
)
228 r
->sig
[i
] = a
->sig
[ofs
+ i
];
229 for (; i
< SIGSZ
; ++i
)
234 /* Left-shift the significand of A by N bits; put the result in the
238 lshift_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
241 unsigned int i
, ofs
= n
/ HOST_BITS_PER_LONG
;
243 n
&= HOST_BITS_PER_LONG
- 1;
246 for (i
= 0; ofs
+ i
< SIGSZ
; ++i
)
247 r
->sig
[SIGSZ
-1-i
] = a
->sig
[SIGSZ
-1-i
-ofs
];
248 for (; i
< SIGSZ
; ++i
)
249 r
->sig
[SIGSZ
-1-i
] = 0;
252 for (i
= 0; i
< SIGSZ
; ++i
)
255 = (((ofs
+ i
>= SIGSZ
? 0 : a
->sig
[SIGSZ
-1-i
-ofs
]) << n
)
256 | ((ofs
+ i
+ 1 >= SIGSZ
? 0 : a
->sig
[SIGSZ
-1-i
-ofs
-1])
257 >> (HOST_BITS_PER_LONG
- n
)));
261 /* Likewise, but N is specialized to 1. */
264 lshift_significand_1 (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
)
268 for (i
= SIGSZ
- 1; i
> 0; --i
)
269 r
->sig
[i
] = (a
->sig
[i
] << 1) | (a
->sig
[i
-1] >> (HOST_BITS_PER_LONG
- 1));
270 r
->sig
[0] = a
->sig
[0] << 1;
273 /* Add the significands of A and B, placing the result in R. Return
274 true if there was carry out of the most significant word. */
277 add_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
278 const REAL_VALUE_TYPE
*b
)
283 for (i
= 0; i
< SIGSZ
; ++i
)
285 unsigned long ai
= a
->sig
[i
];
286 unsigned long ri
= ai
+ b
->sig
[i
];
302 /* Subtract the significands of A and B, placing the result in R. CARRY is
303 true if there's a borrow incoming to the least significant word.
304 Return true if there was borrow out of the most significant word. */
307 sub_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
308 const REAL_VALUE_TYPE
*b
, int carry
)
312 for (i
= 0; i
< SIGSZ
; ++i
)
314 unsigned long ai
= a
->sig
[i
];
315 unsigned long ri
= ai
- b
->sig
[i
];
331 /* Negate the significand A, placing the result in R. */
334 neg_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
)
339 for (i
= 0; i
< SIGSZ
; ++i
)
341 unsigned long ri
, ai
= a
->sig
[i
];
360 /* Compare significands. Return tri-state vs zero. */
363 cmp_significands (const REAL_VALUE_TYPE
*a
, const REAL_VALUE_TYPE
*b
)
367 for (i
= SIGSZ
- 1; i
>= 0; --i
)
369 unsigned long ai
= a
->sig
[i
];
370 unsigned long bi
= b
->sig
[i
];
381 /* Return true if A is nonzero. */
384 cmp_significand_0 (const REAL_VALUE_TYPE
*a
)
388 for (i
= SIGSZ
- 1; i
>= 0; --i
)
395 /* Set bit N of the significand of R. */
398 set_significand_bit (REAL_VALUE_TYPE
*r
, unsigned int n
)
400 r
->sig
[n
/ HOST_BITS_PER_LONG
]
401 |= (unsigned long)1 << (n
% HOST_BITS_PER_LONG
);
404 /* Clear bit N of the significand of R. */
407 clear_significand_bit (REAL_VALUE_TYPE
*r
, unsigned int n
)
409 r
->sig
[n
/ HOST_BITS_PER_LONG
]
410 &= ~((unsigned long)1 << (n
% HOST_BITS_PER_LONG
));
413 /* Test bit N of the significand of R. */
416 test_significand_bit (REAL_VALUE_TYPE
*r
, unsigned int n
)
418 /* ??? Compiler bug here if we return this expression directly.
419 The conversion to bool strips the "&1" and we wind up testing
420 e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */
421 int t
= (r
->sig
[n
/ HOST_BITS_PER_LONG
] >> (n
% HOST_BITS_PER_LONG
)) & 1;
425 /* Clear bits 0..N-1 of the significand of R. */
428 clear_significand_below (REAL_VALUE_TYPE
*r
, unsigned int n
)
430 int i
, w
= n
/ HOST_BITS_PER_LONG
;
432 for (i
= 0; i
< w
; ++i
)
435 r
->sig
[w
] &= ~(((unsigned long)1 << (n
% HOST_BITS_PER_LONG
)) - 1);
438 /* Divide the significands of A and B, placing the result in R. Return
439 true if the division was inexact. */
442 div_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
443 const REAL_VALUE_TYPE
*b
)
446 int i
, bit
= SIGNIFICAND_BITS
- 1;
447 unsigned long msb
, inexact
;
450 memset (r
->sig
, 0, sizeof (r
->sig
));
456 msb
= u
.sig
[SIGSZ
-1] & SIG_MSB
;
457 lshift_significand_1 (&u
, &u
);
459 if (msb
|| cmp_significands (&u
, b
) >= 0)
461 sub_significands (&u
, &u
, b
, 0);
462 set_significand_bit (r
, bit
);
467 for (i
= 0, inexact
= 0; i
< SIGSZ
; i
++)
473 /* Adjust the exponent and significand of R such that the most
474 significant bit is set. We underflow to zero and overflow to
475 infinity here, without denormals. (The intermediate representation
476 exponent is large enough to handle target denormals normalized.) */
479 normalize (REAL_VALUE_TYPE
*r
)
487 /* Find the first word that is nonzero. */
488 for (i
= SIGSZ
- 1; i
>= 0; i
--)
490 shift
+= HOST_BITS_PER_LONG
;
494 /* Zero significand flushes to zero. */
502 /* Find the first bit that is nonzero. */
504 if (r
->sig
[i
] & ((unsigned long)1 << (HOST_BITS_PER_LONG
- 1 - j
)))
510 exp
= REAL_EXP (r
) - shift
;
512 get_inf (r
, r
->sign
);
513 else if (exp
< -MAX_EXP
)
514 get_zero (r
, r
->sign
);
517 SET_REAL_EXP (r
, exp
);
518 lshift_significand (r
, r
, shift
);
523 /* Calculate R = A + (SUBTRACT_P ? -B : B). Return true if the
524 result may be inexact due to a loss of precision. */
527 do_add (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
528 const REAL_VALUE_TYPE
*b
, int subtract_p
)
532 bool inexact
= false;
534 /* Determine if we need to add or subtract. */
536 subtract_p
= (sign
^ b
->sign
) ^ subtract_p
;
538 switch (CLASS2 (a
->cl
, b
->cl
))
540 case CLASS2 (rvc_zero
, rvc_zero
):
541 /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0. */
542 get_zero (r
, sign
& !subtract_p
);
545 case CLASS2 (rvc_zero
, rvc_normal
):
546 case CLASS2 (rvc_zero
, rvc_inf
):
547 case CLASS2 (rvc_zero
, rvc_nan
):
549 case CLASS2 (rvc_normal
, rvc_nan
):
550 case CLASS2 (rvc_inf
, rvc_nan
):
551 case CLASS2 (rvc_nan
, rvc_nan
):
552 /* ANY + NaN = NaN. */
553 case CLASS2 (rvc_normal
, rvc_inf
):
556 r
->sign
= sign
^ subtract_p
;
559 case CLASS2 (rvc_normal
, rvc_zero
):
560 case CLASS2 (rvc_inf
, rvc_zero
):
561 case CLASS2 (rvc_nan
, rvc_zero
):
563 case CLASS2 (rvc_nan
, rvc_normal
):
564 case CLASS2 (rvc_nan
, rvc_inf
):
565 /* NaN + ANY = NaN. */
566 case CLASS2 (rvc_inf
, rvc_normal
):
571 case CLASS2 (rvc_inf
, rvc_inf
):
573 /* Inf - Inf = NaN. */
574 get_canonical_qnan (r
, 0);
576 /* Inf + Inf = Inf. */
580 case CLASS2 (rvc_normal
, rvc_normal
):
587 /* Swap the arguments such that A has the larger exponent. */
588 dexp
= REAL_EXP (a
) - REAL_EXP (b
);
591 const REAL_VALUE_TYPE
*t
;
598 /* If the exponents are not identical, we need to shift the
599 significand of B down. */
602 /* If the exponents are too far apart, the significands
603 do not overlap, which makes the subtraction a noop. */
604 if (dexp
>= SIGNIFICAND_BITS
)
611 inexact
|= sticky_rshift_significand (&t
, b
, dexp
);
617 if (sub_significands (r
, a
, b
, inexact
))
619 /* We got a borrow out of the subtraction. That means that
620 A and B had the same exponent, and B had the larger
621 significand. We need to swap the sign and negate the
624 neg_significand (r
, r
);
629 if (add_significands (r
, a
, b
))
631 /* We got carry out of the addition. This means we need to
632 shift the significand back down one bit and increase the
634 inexact
|= sticky_rshift_significand (r
, r
, 1);
635 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
646 SET_REAL_EXP (r
, exp
);
647 /* Zero out the remaining fields. */
652 /* Re-normalize the result. */
655 /* Special case: if the subtraction results in zero, the result
657 if (r
->cl
== rvc_zero
)
660 r
->sig
[0] |= inexact
;
665 /* Calculate R = A * B. Return true if the result may be inexact. */
668 do_multiply (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
669 const REAL_VALUE_TYPE
*b
)
671 REAL_VALUE_TYPE u
, t
, *rr
;
672 unsigned int i
, j
, k
;
673 int sign
= a
->sign
^ b
->sign
;
674 bool inexact
= false;
676 switch (CLASS2 (a
->cl
, b
->cl
))
678 case CLASS2 (rvc_zero
, rvc_zero
):
679 case CLASS2 (rvc_zero
, rvc_normal
):
680 case CLASS2 (rvc_normal
, rvc_zero
):
681 /* +-0 * ANY = 0 with appropriate sign. */
685 case CLASS2 (rvc_zero
, rvc_nan
):
686 case CLASS2 (rvc_normal
, rvc_nan
):
687 case CLASS2 (rvc_inf
, rvc_nan
):
688 case CLASS2 (rvc_nan
, rvc_nan
):
689 /* ANY * NaN = NaN. */
694 case CLASS2 (rvc_nan
, rvc_zero
):
695 case CLASS2 (rvc_nan
, rvc_normal
):
696 case CLASS2 (rvc_nan
, rvc_inf
):
697 /* NaN * ANY = NaN. */
702 case CLASS2 (rvc_zero
, rvc_inf
):
703 case CLASS2 (rvc_inf
, rvc_zero
):
705 get_canonical_qnan (r
, sign
);
708 case CLASS2 (rvc_inf
, rvc_inf
):
709 case CLASS2 (rvc_normal
, rvc_inf
):
710 case CLASS2 (rvc_inf
, rvc_normal
):
711 /* Inf * Inf = Inf, R * Inf = Inf */
715 case CLASS2 (rvc_normal
, rvc_normal
):
722 if (r
== a
|| r
== b
)
728 /* Collect all the partial products. Since we don't have sure access
729 to a widening multiply, we split each long into two half-words.
731 Consider the long-hand form of a four half-word multiplication:
741 We construct partial products of the widened half-word products
742 that are known to not overlap, e.g. DF+DH. Each such partial
743 product is given its proper exponent, which allows us to sum them
744 and obtain the finished product. */
746 for (i
= 0; i
< SIGSZ
* 2; ++i
)
748 unsigned long ai
= a
->sig
[i
/ 2];
750 ai
>>= HOST_BITS_PER_LONG
/ 2;
752 ai
&= ((unsigned long)1 << (HOST_BITS_PER_LONG
/ 2)) - 1;
757 for (j
= 0; j
< 2; ++j
)
759 int exp
= (REAL_EXP (a
) - (2*SIGSZ
-1-i
)*(HOST_BITS_PER_LONG
/2)
760 + (REAL_EXP (b
) - (1-j
)*(HOST_BITS_PER_LONG
/2)));
769 /* Would underflow to zero, which we shouldn't bother adding. */
774 memset (&u
, 0, sizeof (u
));
776 SET_REAL_EXP (&u
, exp
);
778 for (k
= j
; k
< SIGSZ
* 2; k
+= 2)
780 unsigned long bi
= b
->sig
[k
/ 2];
782 bi
>>= HOST_BITS_PER_LONG
/ 2;
784 bi
&= ((unsigned long)1 << (HOST_BITS_PER_LONG
/ 2)) - 1;
786 u
.sig
[k
/ 2] = ai
* bi
;
790 inexact
|= do_add (rr
, rr
, &u
, 0);
801 /* Calculate R = A / B. Return true if the result may be inexact. */
804 do_divide (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
805 const REAL_VALUE_TYPE
*b
)
807 int exp
, sign
= a
->sign
^ b
->sign
;
808 REAL_VALUE_TYPE t
, *rr
;
811 switch (CLASS2 (a
->cl
, b
->cl
))
813 case CLASS2 (rvc_zero
, rvc_zero
):
815 case CLASS2 (rvc_inf
, rvc_inf
):
816 /* Inf / Inf = NaN. */
817 get_canonical_qnan (r
, sign
);
820 case CLASS2 (rvc_zero
, rvc_normal
):
821 case CLASS2 (rvc_zero
, rvc_inf
):
823 case CLASS2 (rvc_normal
, rvc_inf
):
828 case CLASS2 (rvc_normal
, rvc_zero
):
830 case CLASS2 (rvc_inf
, rvc_zero
):
835 case CLASS2 (rvc_zero
, rvc_nan
):
836 case CLASS2 (rvc_normal
, rvc_nan
):
837 case CLASS2 (rvc_inf
, rvc_nan
):
838 case CLASS2 (rvc_nan
, rvc_nan
):
839 /* ANY / NaN = NaN. */
844 case CLASS2 (rvc_nan
, rvc_zero
):
845 case CLASS2 (rvc_nan
, rvc_normal
):
846 case CLASS2 (rvc_nan
, rvc_inf
):
847 /* NaN / ANY = NaN. */
852 case CLASS2 (rvc_inf
, rvc_normal
):
857 case CLASS2 (rvc_normal
, rvc_normal
):
864 if (r
== a
|| r
== b
)
869 /* Make sure all fields in the result are initialized. */
874 exp
= REAL_EXP (a
) - REAL_EXP (b
) + 1;
885 SET_REAL_EXP (rr
, exp
);
887 inexact
= div_significands (rr
, a
, b
);
889 /* Re-normalize the result. */
891 rr
->sig
[0] |= inexact
;
899 /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
900 one of the two operands is a NaN. */
903 do_compare (const REAL_VALUE_TYPE
*a
, const REAL_VALUE_TYPE
*b
,
908 switch (CLASS2 (a
->cl
, b
->cl
))
910 case CLASS2 (rvc_zero
, rvc_zero
):
911 /* Sign of zero doesn't matter for compares. */
914 case CLASS2 (rvc_inf
, rvc_zero
):
915 case CLASS2 (rvc_inf
, rvc_normal
):
916 case CLASS2 (rvc_normal
, rvc_zero
):
917 return (a
->sign
? -1 : 1);
919 case CLASS2 (rvc_inf
, rvc_inf
):
920 return -a
->sign
- -b
->sign
;
922 case CLASS2 (rvc_zero
, rvc_normal
):
923 case CLASS2 (rvc_zero
, rvc_inf
):
924 case CLASS2 (rvc_normal
, rvc_inf
):
925 return (b
->sign
? 1 : -1);
927 case CLASS2 (rvc_zero
, rvc_nan
):
928 case CLASS2 (rvc_normal
, rvc_nan
):
929 case CLASS2 (rvc_inf
, rvc_nan
):
930 case CLASS2 (rvc_nan
, rvc_nan
):
931 case CLASS2 (rvc_nan
, rvc_zero
):
932 case CLASS2 (rvc_nan
, rvc_normal
):
933 case CLASS2 (rvc_nan
, rvc_inf
):
936 case CLASS2 (rvc_normal
, rvc_normal
):
943 if (a
->sign
!= b
->sign
)
944 return -a
->sign
- -b
->sign
;
946 if (a
->decimal
|| b
->decimal
)
947 return decimal_do_compare (a
, b
, nan_result
);
949 if (REAL_EXP (a
) > REAL_EXP (b
))
951 else if (REAL_EXP (a
) < REAL_EXP (b
))
954 ret
= cmp_significands (a
, b
);
956 return (a
->sign
? -ret
: ret
);
959 /* Return A truncated to an integral value toward zero. */
962 do_fix_trunc (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
)
976 decimal_do_fix_trunc (r
, a
);
979 if (REAL_EXP (r
) <= 0)
980 get_zero (r
, r
->sign
);
981 else if (REAL_EXP (r
) < SIGNIFICAND_BITS
)
982 clear_significand_below (r
, SIGNIFICAND_BITS
- REAL_EXP (r
));
990 /* Perform the binary or unary operation described by CODE.
991 For a unary operation, leave OP1 NULL. This function returns
992 true if the result may be inexact due to loss of precision. */
995 real_arithmetic (REAL_VALUE_TYPE
*r
, int icode
, const REAL_VALUE_TYPE
*op0
,
996 const REAL_VALUE_TYPE
*op1
)
998 enum tree_code code
= icode
;
1000 if (op0
->decimal
|| (op1
&& op1
->decimal
))
1001 return decimal_real_arithmetic (r
, icode
, op0
, op1
);
1006 return do_add (r
, op0
, op1
, 0);
1009 return do_add (r
, op0
, op1
, 1);
1012 return do_multiply (r
, op0
, op1
);
1015 return do_divide (r
, op0
, op1
);
1018 if (op1
->cl
== rvc_nan
)
1020 else if (do_compare (op0
, op1
, -1) < 0)
1027 if (op1
->cl
== rvc_nan
)
1029 else if (do_compare (op0
, op1
, 1) < 0)
1045 case FIX_TRUNC_EXPR
:
1046 do_fix_trunc (r
, op0
);
1055 /* Legacy. Similar, but return the result directly. */
1058 real_arithmetic2 (int icode
, const REAL_VALUE_TYPE
*op0
,
1059 const REAL_VALUE_TYPE
*op1
)
1062 real_arithmetic (&r
, icode
, op0
, op1
);
1067 real_compare (int icode
, const REAL_VALUE_TYPE
*op0
,
1068 const REAL_VALUE_TYPE
*op1
)
1070 enum tree_code code
= icode
;
1075 return do_compare (op0
, op1
, 1) < 0;
1077 return do_compare (op0
, op1
, 1) <= 0;
1079 return do_compare (op0
, op1
, -1) > 0;
1081 return do_compare (op0
, op1
, -1) >= 0;
1083 return do_compare (op0
, op1
, -1) == 0;
1085 return do_compare (op0
, op1
, -1) != 0;
1086 case UNORDERED_EXPR
:
1087 return op0
->cl
== rvc_nan
|| op1
->cl
== rvc_nan
;
1089 return op0
->cl
!= rvc_nan
&& op1
->cl
!= rvc_nan
;
1091 return do_compare (op0
, op1
, -1) < 0;
1093 return do_compare (op0
, op1
, -1) <= 0;
1095 return do_compare (op0
, op1
, 1) > 0;
1097 return do_compare (op0
, op1
, 1) >= 0;
1099 return do_compare (op0
, op1
, 0) == 0;
1101 return do_compare (op0
, op1
, 0) != 0;
1108 /* Return floor log2(R). */
1111 real_exponent (const REAL_VALUE_TYPE
*r
)
1119 return (unsigned int)-1 >> 1;
1121 return REAL_EXP (r
);
1127 /* R = OP0 * 2**EXP. */
1130 real_ldexp (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*op0
, int exp
)
1141 exp
+= REAL_EXP (op0
);
1143 get_inf (r
, r
->sign
);
1144 else if (exp
< -MAX_EXP
)
1145 get_zero (r
, r
->sign
);
1147 SET_REAL_EXP (r
, exp
);
1155 /* Determine whether a floating-point value X is infinite. */
1158 real_isinf (const REAL_VALUE_TYPE
*r
)
1160 return (r
->cl
== rvc_inf
);
1163 /* Determine whether a floating-point value X is a NaN. */
1166 real_isnan (const REAL_VALUE_TYPE
*r
)
1168 return (r
->cl
== rvc_nan
);
1171 /* Determine whether a floating-point value X is negative. */
1174 real_isneg (const REAL_VALUE_TYPE
*r
)
1179 /* Determine whether a floating-point value X is minus zero. */
1182 real_isnegzero (const REAL_VALUE_TYPE
*r
)
1184 return r
->sign
&& r
->cl
== rvc_zero
;
1187 /* Compare two floating-point objects for bitwise identity. */
1190 real_identical (const REAL_VALUE_TYPE
*a
, const REAL_VALUE_TYPE
*b
)
1196 if (a
->sign
!= b
->sign
)
1206 if (a
->decimal
!= b
->decimal
)
1208 if (REAL_EXP (a
) != REAL_EXP (b
))
1213 if (a
->signalling
!= b
->signalling
)
1215 /* The significand is ignored for canonical NaNs. */
1216 if (a
->canonical
|| b
->canonical
)
1217 return a
->canonical
== b
->canonical
;
1224 for (i
= 0; i
< SIGSZ
; ++i
)
1225 if (a
->sig
[i
] != b
->sig
[i
])
1231 /* Try to change R into its exact multiplicative inverse in machine
1232 mode MODE. Return true if successful. */
1235 exact_real_inverse (enum machine_mode mode
, REAL_VALUE_TYPE
*r
)
1237 const REAL_VALUE_TYPE
*one
= real_digit (1);
1241 if (r
->cl
!= rvc_normal
)
1244 /* Check for a power of two: all significand bits zero except the MSB. */
1245 for (i
= 0; i
< SIGSZ
-1; ++i
)
1248 if (r
->sig
[SIGSZ
-1] != SIG_MSB
)
1251 /* Find the inverse and truncate to the required mode. */
1252 do_divide (&u
, one
, r
);
1253 real_convert (&u
, mode
, &u
);
1255 /* The rounding may have overflowed. */
1256 if (u
.cl
!= rvc_normal
)
1258 for (i
= 0; i
< SIGSZ
-1; ++i
)
1261 if (u
.sig
[SIGSZ
-1] != SIG_MSB
)
1268 /* Render R as an integer. */
1271 real_to_integer (const REAL_VALUE_TYPE
*r
)
1273 unsigned HOST_WIDE_INT i
;
1284 i
= (unsigned HOST_WIDE_INT
) 1 << (HOST_BITS_PER_WIDE_INT
- 1);
1291 return decimal_real_to_integer (r
);
1293 if (REAL_EXP (r
) <= 0)
1295 /* Only force overflow for unsigned overflow. Signed overflow is
1296 undefined, so it doesn't matter what we return, and some callers
1297 expect to be able to use this routine for both signed and
1298 unsigned conversions. */
1299 if (REAL_EXP (r
) > HOST_BITS_PER_WIDE_INT
)
1302 if (HOST_BITS_PER_WIDE_INT
== HOST_BITS_PER_LONG
)
1303 i
= r
->sig
[SIGSZ
-1];
1306 gcc_assert (HOST_BITS_PER_WIDE_INT
== 2 * HOST_BITS_PER_LONG
);
1307 i
= r
->sig
[SIGSZ
-1];
1308 i
= i
<< (HOST_BITS_PER_LONG
- 1) << 1;
1309 i
|= r
->sig
[SIGSZ
-2];
1312 i
>>= HOST_BITS_PER_WIDE_INT
- REAL_EXP (r
);
1323 /* Likewise, but to an integer pair, HI+LOW. */
1326 real_to_integer2 (HOST_WIDE_INT
*plow
, HOST_WIDE_INT
*phigh
,
1327 const REAL_VALUE_TYPE
*r
)
1330 HOST_WIDE_INT low
, high
;
1343 high
= (unsigned HOST_WIDE_INT
) 1 << (HOST_BITS_PER_WIDE_INT
- 1);
1356 decimal_real_to_integer2 (plow
, phigh
, r
);
1363 /* Only force overflow for unsigned overflow. Signed overflow is
1364 undefined, so it doesn't matter what we return, and some callers
1365 expect to be able to use this routine for both signed and
1366 unsigned conversions. */
1367 if (exp
> 2*HOST_BITS_PER_WIDE_INT
)
1370 rshift_significand (&t
, r
, 2*HOST_BITS_PER_WIDE_INT
- exp
);
1371 if (HOST_BITS_PER_WIDE_INT
== HOST_BITS_PER_LONG
)
1373 high
= t
.sig
[SIGSZ
-1];
1374 low
= t
.sig
[SIGSZ
-2];
1378 gcc_assert (HOST_BITS_PER_WIDE_INT
== 2*HOST_BITS_PER_LONG
);
1379 high
= t
.sig
[SIGSZ
-1];
1380 high
= high
<< (HOST_BITS_PER_LONG
- 1) << 1;
1381 high
|= t
.sig
[SIGSZ
-2];
1383 low
= t
.sig
[SIGSZ
-3];
1384 low
= low
<< (HOST_BITS_PER_LONG
- 1) << 1;
1385 low
|= t
.sig
[SIGSZ
-4];
1393 low
= -low
, high
= ~high
;
1405 /* A subroutine of real_to_decimal. Compute the quotient and remainder
1406 of NUM / DEN. Return the quotient and place the remainder in NUM.
1407 It is expected that NUM / DEN are close enough that the quotient is
1410 static unsigned long
1411 rtd_divmod (REAL_VALUE_TYPE
*num
, REAL_VALUE_TYPE
*den
)
1413 unsigned long q
, msb
;
1414 int expn
= REAL_EXP (num
), expd
= REAL_EXP (den
);
1423 msb
= num
->sig
[SIGSZ
-1] & SIG_MSB
;
1425 lshift_significand_1 (num
, num
);
1427 if (msb
|| cmp_significands (num
, den
) >= 0)
1429 sub_significands (num
, num
, den
, 0);
1433 while (--expn
>= expd
);
1435 SET_REAL_EXP (num
, expd
);
1441 /* Render R as a decimal floating point constant. Emit DIGITS significant
1442 digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the
1443 maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing
1446 #define M_LOG10_2 0.30102999566398119521
1449 real_to_decimal (char *str
, const REAL_VALUE_TYPE
*r_orig
, size_t buf_size
,
1450 size_t digits
, int crop_trailing_zeros
)
1452 const REAL_VALUE_TYPE
*one
, *ten
;
1453 REAL_VALUE_TYPE r
, pten
, u
, v
;
1454 int dec_exp
, cmp_one
, digit
;
1456 char *p
, *first
, *last
;
1463 strcpy (str
, (r
.sign
? "-0.0" : "0.0"));
1468 strcpy (str
, (r
.sign
? "-Inf" : "+Inf"));
1471 /* ??? Print the significand as well, if not canonical? */
1472 strcpy (str
, (r
.sign
? "-NaN" : "+NaN"));
1480 decimal_real_to_decimal (str
, &r
, buf_size
, digits
, crop_trailing_zeros
);
1484 /* Bound the number of digits printed by the size of the representation. */
1485 max_digits
= SIGNIFICAND_BITS
* M_LOG10_2
;
1486 if (digits
== 0 || digits
> max_digits
)
1487 digits
= max_digits
;
1489 /* Estimate the decimal exponent, and compute the length of the string it
1490 will print as. Be conservative and add one to account for possible
1491 overflow or rounding error. */
1492 dec_exp
= REAL_EXP (&r
) * M_LOG10_2
;
1493 for (max_digits
= 1; dec_exp
; max_digits
++)
1496 /* Bound the number of digits printed by the size of the output buffer. */
1497 max_digits
= buf_size
- 1 - 1 - 2 - max_digits
- 1;
1498 gcc_assert (max_digits
<= buf_size
);
1499 if (digits
> max_digits
)
1500 digits
= max_digits
;
1502 one
= real_digit (1);
1503 ten
= ten_to_ptwo (0);
1511 cmp_one
= do_compare (&r
, one
, 0);
1516 /* Number is greater than one. Convert significand to an integer
1517 and strip trailing decimal zeros. */
1520 SET_REAL_EXP (&u
, SIGNIFICAND_BITS
- 1);
1522 /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
1523 m
= floor_log2 (max_digits
);
1525 /* Iterate over the bits of the possible powers of 10 that might
1526 be present in U and eliminate them. That is, if we find that
1527 10**2**M divides U evenly, keep the division and increase
1533 do_divide (&t
, &u
, ten_to_ptwo (m
));
1534 do_fix_trunc (&v
, &t
);
1535 if (cmp_significands (&v
, &t
) == 0)
1543 /* Revert the scaling to integer that we performed earlier. */
1544 SET_REAL_EXP (&u
, REAL_EXP (&u
) + REAL_EXP (&r
)
1545 - (SIGNIFICAND_BITS
- 1));
1548 /* Find power of 10. Do this by dividing out 10**2**M when
1549 this is larger than the current remainder. Fill PTEN with
1550 the power of 10 that we compute. */
1551 if (REAL_EXP (&r
) > 0)
1553 m
= floor_log2 ((int)(REAL_EXP (&r
) * M_LOG10_2
)) + 1;
1556 const REAL_VALUE_TYPE
*ptentwo
= ten_to_ptwo (m
);
1557 if (do_compare (&u
, ptentwo
, 0) >= 0)
1559 do_divide (&u
, &u
, ptentwo
);
1560 do_multiply (&pten
, &pten
, ptentwo
);
1567 /* We managed to divide off enough tens in the above reduction
1568 loop that we've now got a negative exponent. Fall into the
1569 less-than-one code to compute the proper value for PTEN. */
1576 /* Number is less than one. Pad significand with leading
1582 /* Stop if we'd shift bits off the bottom. */
1586 do_multiply (&u
, &v
, ten
);
1588 /* Stop if we're now >= 1. */
1589 if (REAL_EXP (&u
) > 0)
1597 /* Find power of 10. Do this by multiplying in P=10**2**M when
1598 the current remainder is smaller than 1/P. Fill PTEN with the
1599 power of 10 that we compute. */
1600 m
= floor_log2 ((int)(-REAL_EXP (&r
) * M_LOG10_2
)) + 1;
1603 const REAL_VALUE_TYPE
*ptentwo
= ten_to_ptwo (m
);
1604 const REAL_VALUE_TYPE
*ptenmtwo
= ten_to_mptwo (m
);
1606 if (do_compare (&v
, ptenmtwo
, 0) <= 0)
1608 do_multiply (&v
, &v
, ptentwo
);
1609 do_multiply (&pten
, &pten
, ptentwo
);
1615 /* Invert the positive power of 10 that we've collected so far. */
1616 do_divide (&pten
, one
, &pten
);
1624 /* At this point, PTEN should contain the nearest power of 10 smaller
1625 than R, such that this division produces the first digit.
1627 Using a divide-step primitive that returns the complete integral
1628 remainder avoids the rounding error that would be produced if
1629 we were to use do_divide here and then simply multiply by 10 for
1630 each subsequent digit. */
1632 digit
= rtd_divmod (&r
, &pten
);
1634 /* Be prepared for error in that division via underflow ... */
1635 if (digit
== 0 && cmp_significand_0 (&r
))
1637 /* Multiply by 10 and try again. */
1638 do_multiply (&r
, &r
, ten
);
1639 digit
= rtd_divmod (&r
, &pten
);
1641 gcc_assert (digit
!= 0);
1644 /* ... or overflow. */
1654 gcc_assert (digit
<= 10);
1658 /* Generate subsequent digits. */
1659 while (--digits
> 0)
1661 do_multiply (&r
, &r
, ten
);
1662 digit
= rtd_divmod (&r
, &pten
);
1667 /* Generate one more digit with which to do rounding. */
1668 do_multiply (&r
, &r
, ten
);
1669 digit
= rtd_divmod (&r
, &pten
);
1671 /* Round the result. */
1674 /* Round to nearest. If R is nonzero there are additional
1675 nonzero digits to be extracted. */
1676 if (cmp_significand_0 (&r
))
1678 /* Round to even. */
1679 else if ((p
[-1] - '0') & 1)
1696 /* Carry out of the first digit. This means we had all 9's and
1697 now have all 0's. "Prepend" a 1 by overwriting the first 0. */
1705 /* Insert the decimal point. */
1706 first
[0] = first
[1];
1709 /* If requested, drop trailing zeros. Never crop past "1.0". */
1710 if (crop_trailing_zeros
)
1711 while (last
> first
+ 3 && last
[-1] == '0')
1714 /* Append the exponent. */
1715 sprintf (last
, "e%+d", dec_exp
);
1718 /* Render R as a hexadecimal floating point constant. Emit DIGITS
1719 significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0,
1720 choose the maximum for the representation. If CROP_TRAILING_ZEROS,
1721 strip trailing zeros. */
1724 real_to_hexadecimal (char *str
, const REAL_VALUE_TYPE
*r
, size_t buf_size
,
1725 size_t digits
, int crop_trailing_zeros
)
1727 int i
, j
, exp
= REAL_EXP (r
);
1740 strcpy (str
, (r
->sign
? "-Inf" : "+Inf"));
1743 /* ??? Print the significand as well, if not canonical? */
1744 strcpy (str
, (r
->sign
? "-NaN" : "+NaN"));
1752 /* Hexadecimal format for decimal floats is not interesting. */
1753 strcpy (str
, "N/A");
1758 digits
= SIGNIFICAND_BITS
/ 4;
1760 /* Bound the number of digits printed by the size of the output buffer. */
1762 sprintf (exp_buf
, "p%+d", exp
);
1763 max_digits
= buf_size
- strlen (exp_buf
) - r
->sign
- 4 - 1;
1764 gcc_assert (max_digits
<= buf_size
);
1765 if (digits
> max_digits
)
1766 digits
= max_digits
;
1777 for (i
= SIGSZ
- 1; i
>= 0; --i
)
1778 for (j
= HOST_BITS_PER_LONG
- 4; j
>= 0; j
-= 4)
1780 *p
++ = "0123456789abcdef"[(r
->sig
[i
] >> j
) & 15];
1786 if (crop_trailing_zeros
)
1787 while (p
> first
+ 1 && p
[-1] == '0')
1790 sprintf (p
, "p%+d", exp
);
1793 /* Initialize R from a decimal or hexadecimal string. The string is
1794 assumed to have been syntax checked already. */
1797 real_from_string (REAL_VALUE_TYPE
*r
, const char *str
)
1809 else if (*str
== '+')
1812 if (str
[0] == '0' && (str
[1] == 'x' || str
[1] == 'X'))
1814 /* Hexadecimal floating point. */
1815 int pos
= SIGNIFICAND_BITS
- 4, d
;
1823 d
= hex_value (*str
);
1828 r
->sig
[pos
/ HOST_BITS_PER_LONG
]
1829 |= (unsigned long) d
<< (pos
% HOST_BITS_PER_LONG
);
1833 /* Ensure correct rounding by setting last bit if there is
1834 a subsequent nonzero digit. */
1842 if (pos
== SIGNIFICAND_BITS
- 4)
1849 d
= hex_value (*str
);
1854 r
->sig
[pos
/ HOST_BITS_PER_LONG
]
1855 |= (unsigned long) d
<< (pos
% HOST_BITS_PER_LONG
);
1859 /* Ensure correct rounding by setting last bit if there is
1860 a subsequent nonzero digit. */
1865 if (*str
== 'p' || *str
== 'P')
1867 bool exp_neg
= false;
1875 else if (*str
== '+')
1879 while (ISDIGIT (*str
))
1885 /* Overflowed the exponent. */
1900 SET_REAL_EXP (r
, exp
);
1906 /* Decimal floating point. */
1907 const REAL_VALUE_TYPE
*ten
= ten_to_ptwo (0);
1912 while (ISDIGIT (*str
))
1915 do_multiply (r
, r
, ten
);
1917 do_add (r
, r
, real_digit (d
), 0);
1922 if (r
->cl
== rvc_zero
)
1927 while (ISDIGIT (*str
))
1930 do_multiply (r
, r
, ten
);
1932 do_add (r
, r
, real_digit (d
), 0);
1937 if (*str
== 'e' || *str
== 'E')
1939 bool exp_neg
= false;
1947 else if (*str
== '+')
1951 while (ISDIGIT (*str
))
1957 /* Overflowed the exponent. */
1971 times_pten (r
, exp
);
1986 /* Legacy. Similar, but return the result directly. */
1989 real_from_string2 (const char *s
, enum machine_mode mode
)
1993 real_from_string (&r
, s
);
1994 if (mode
!= VOIDmode
)
1995 real_convert (&r
, mode
, &r
);
2000 /* Initialize R from string S and desired MODE. */
2003 real_from_string3 (REAL_VALUE_TYPE
*r
, const char *s
, enum machine_mode mode
)
2005 if (DECIMAL_FLOAT_MODE_P (mode
))
2006 decimal_real_from_string (r
, s
);
2008 real_from_string (r
, s
);
2010 if (mode
!= VOIDmode
)
2011 real_convert (r
, mode
, r
);
2014 /* Initialize R from the integer pair HIGH+LOW. */
2017 real_from_integer (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
2018 unsigned HOST_WIDE_INT low
, HOST_WIDE_INT high
,
2021 if (low
== 0 && high
== 0)
2025 memset (r
, 0, sizeof (*r
));
2027 r
->sign
= high
< 0 && !unsigned_p
;
2028 SET_REAL_EXP (r
, 2 * HOST_BITS_PER_WIDE_INT
);
2039 if (HOST_BITS_PER_LONG
== HOST_BITS_PER_WIDE_INT
)
2041 r
->sig
[SIGSZ
-1] = high
;
2042 r
->sig
[SIGSZ
-2] = low
;
2046 gcc_assert (HOST_BITS_PER_LONG
*2 == HOST_BITS_PER_WIDE_INT
);
2047 r
->sig
[SIGSZ
-1] = high
>> (HOST_BITS_PER_LONG
- 1) >> 1;
2048 r
->sig
[SIGSZ
-2] = high
;
2049 r
->sig
[SIGSZ
-3] = low
>> (HOST_BITS_PER_LONG
- 1) >> 1;
2050 r
->sig
[SIGSZ
-4] = low
;
2056 if (mode
!= VOIDmode
)
2057 real_convert (r
, mode
, r
);
2060 /* Returns 10**2**N. */
2062 static const REAL_VALUE_TYPE
*
2065 static REAL_VALUE_TYPE tens
[EXP_BITS
];
2067 gcc_assert (n
>= 0);
2068 gcc_assert (n
< EXP_BITS
);
2070 if (tens
[n
].cl
== rvc_zero
)
2072 if (n
< (HOST_BITS_PER_WIDE_INT
== 64 ? 5 : 4))
2074 HOST_WIDE_INT t
= 10;
2077 for (i
= 0; i
< n
; ++i
)
2080 real_from_integer (&tens
[n
], VOIDmode
, t
, 0, 1);
2084 const REAL_VALUE_TYPE
*t
= ten_to_ptwo (n
- 1);
2085 do_multiply (&tens
[n
], t
, t
);
2092 /* Returns 10**(-2**N). */
2094 static const REAL_VALUE_TYPE
*
2095 ten_to_mptwo (int n
)
2097 static REAL_VALUE_TYPE tens
[EXP_BITS
];
2099 gcc_assert (n
>= 0);
2100 gcc_assert (n
< EXP_BITS
);
2102 if (tens
[n
].cl
== rvc_zero
)
2103 do_divide (&tens
[n
], real_digit (1), ten_to_ptwo (n
));
2110 static const REAL_VALUE_TYPE
*
2113 static REAL_VALUE_TYPE num
[10];
2115 gcc_assert (n
>= 0);
2116 gcc_assert (n
<= 9);
2118 if (n
> 0 && num
[n
].cl
== rvc_zero
)
2119 real_from_integer (&num
[n
], VOIDmode
, n
, 0, 1);
2124 /* Multiply R by 10**EXP. */
2127 times_pten (REAL_VALUE_TYPE
*r
, int exp
)
2129 REAL_VALUE_TYPE pten
, *rr
;
2130 bool negative
= (exp
< 0);
2136 pten
= *real_digit (1);
2142 for (i
= 0; exp
> 0; ++i
, exp
>>= 1)
2144 do_multiply (rr
, rr
, ten_to_ptwo (i
));
2147 do_divide (r
, r
, &pten
);
2150 /* Fills R with +Inf. */
2153 real_inf (REAL_VALUE_TYPE
*r
)
2158 /* Fills R with a NaN whose significand is described by STR. If QUIET,
2159 we force a QNaN, else we force an SNaN. The string, if not empty,
2160 is parsed as a number and placed in the significand. Return true
2161 if the string was successfully parsed. */
2164 real_nan (REAL_VALUE_TYPE
*r
, const char *str
, int quiet
,
2165 enum machine_mode mode
)
2167 const struct real_format
*fmt
;
2169 fmt
= REAL_MODE_FORMAT (mode
);
2175 get_canonical_qnan (r
, 0);
2177 get_canonical_snan (r
, 0);
2183 memset (r
, 0, sizeof (*r
));
2186 /* Parse akin to strtol into the significand of R. */
2188 while (ISSPACE (*str
))
2192 else if (*str
== '+')
2202 while ((d
= hex_value (*str
)) < base
)
2209 lshift_significand (r
, r
, 3);
2212 lshift_significand (r
, r
, 4);
2215 lshift_significand_1 (&u
, r
);
2216 lshift_significand (r
, r
, 3);
2217 add_significands (r
, r
, &u
);
2225 add_significands (r
, r
, &u
);
2230 /* Must have consumed the entire string for success. */
2234 /* Shift the significand into place such that the bits
2235 are in the most significant bits for the format. */
2236 lshift_significand (r
, r
, SIGNIFICAND_BITS
- fmt
->pnan
);
2238 /* Our MSB is always unset for NaNs. */
2239 r
->sig
[SIGSZ
-1] &= ~SIG_MSB
;
2241 /* Force quiet or signalling NaN. */
2242 r
->signalling
= !quiet
;
2248 /* Fills R with the largest finite value representable in mode MODE.
2249 If SIGN is nonzero, R is set to the most negative finite value. */
2252 real_maxval (REAL_VALUE_TYPE
*r
, int sign
, enum machine_mode mode
)
2254 const struct real_format
*fmt
;
2257 fmt
= REAL_MODE_FORMAT (mode
);
2259 memset (r
, 0, sizeof (*r
));
2262 decimal_real_maxval (r
, sign
, mode
);
2267 SET_REAL_EXP (r
, fmt
->emax
* fmt
->log2_b
);
2269 np2
= SIGNIFICAND_BITS
- fmt
->p
* fmt
->log2_b
;
2270 memset (r
->sig
, -1, SIGSZ
* sizeof (unsigned long));
2271 clear_significand_below (r
, np2
);
2275 /* Fills R with 2**N. */
2278 real_2expN (REAL_VALUE_TYPE
*r
, int n
)
2280 memset (r
, 0, sizeof (*r
));
2285 else if (n
< -MAX_EXP
)
2290 SET_REAL_EXP (r
, n
);
2291 r
->sig
[SIGSZ
-1] = SIG_MSB
;
2297 round_for_format (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
)
2300 unsigned long sticky
;
2308 decimal_round_for_format (fmt
, r
);
2311 /* FIXME. We can come here via fp_easy_constant
2312 (e.g. -O0 on '_Decimal32 x = 1.0 + 2.0dd'), but have not
2313 investigated whether this convert needs to be here, or
2314 something else is missing. */
2315 decimal_real_convert (r
, DFmode
, r
);
2318 p2
= fmt
->p
* fmt
->log2_b
;
2319 emin2m1
= (fmt
->emin
- 1) * fmt
->log2_b
;
2320 emax2
= fmt
->emax
* fmt
->log2_b
;
2322 np2
= SIGNIFICAND_BITS
- p2
;
2326 get_zero (r
, r
->sign
);
2328 if (!fmt
->has_signed_zero
)
2333 get_inf (r
, r
->sign
);
2338 clear_significand_below (r
, np2
);
2348 /* If we're not base2, normalize the exponent to a multiple of
2350 if (fmt
->log2_b
!= 1)
2354 gcc_assert (fmt
->b
!= 10);
2355 shift
= REAL_EXP (r
) & (fmt
->log2_b
- 1);
2358 shift
= fmt
->log2_b
- shift
;
2359 r
->sig
[0] |= sticky_rshift_significand (r
, r
, shift
);
2360 SET_REAL_EXP (r
, REAL_EXP (r
) + shift
);
2364 /* Check the range of the exponent. If we're out of range,
2365 either underflow or overflow. */
2366 if (REAL_EXP (r
) > emax2
)
2368 else if (REAL_EXP (r
) <= emin2m1
)
2372 if (!fmt
->has_denorm
)
2374 /* Don't underflow completely until we've had a chance to round. */
2375 if (REAL_EXP (r
) < emin2m1
)
2380 diff
= emin2m1
- REAL_EXP (r
) + 1;
2384 /* De-normalize the significand. */
2385 r
->sig
[0] |= sticky_rshift_significand (r
, r
, diff
);
2386 SET_REAL_EXP (r
, REAL_EXP (r
) + diff
);
2390 /* There are P2 true significand bits, followed by one guard bit,
2391 followed by one sticky bit, followed by stuff. Fold nonzero
2392 stuff into the sticky bit. */
2395 for (i
= 0, w
= (np2
- 1) / HOST_BITS_PER_LONG
; i
< w
; ++i
)
2396 sticky
|= r
->sig
[i
];
2398 r
->sig
[w
] & (((unsigned long)1 << ((np2
- 1) % HOST_BITS_PER_LONG
)) - 1);
2400 guard
= test_significand_bit (r
, np2
- 1);
2401 lsb
= test_significand_bit (r
, np2
);
2403 /* Round to even. */
2404 if (guard
&& (sticky
|| lsb
))
2408 set_significand_bit (&u
, np2
);
2410 if (add_significands (r
, r
, &u
))
2412 /* Overflow. Means the significand had been all ones, and
2413 is now all zeros. Need to increase the exponent, and
2414 possibly re-normalize it. */
2415 SET_REAL_EXP (r
, REAL_EXP (r
) + 1);
2416 if (REAL_EXP (r
) > emax2
)
2418 r
->sig
[SIGSZ
-1] = SIG_MSB
;
2420 if (fmt
->log2_b
!= 1)
2422 int shift
= REAL_EXP (r
) & (fmt
->log2_b
- 1);
2425 shift
= fmt
->log2_b
- shift
;
2426 rshift_significand (r
, r
, shift
);
2427 SET_REAL_EXP (r
, REAL_EXP (r
) + shift
);
2428 if (REAL_EXP (r
) > emax2
)
2435 /* Catch underflow that we deferred until after rounding. */
2436 if (REAL_EXP (r
) <= emin2m1
)
2439 /* Clear out trailing garbage. */
2440 clear_significand_below (r
, np2
);
2443 /* Extend or truncate to a new mode. */
2446 real_convert (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
2447 const REAL_VALUE_TYPE
*a
)
2449 const struct real_format
*fmt
;
2451 fmt
= REAL_MODE_FORMAT (mode
);
2456 if (a
->decimal
|| fmt
->b
== 10)
2457 decimal_real_convert (r
, mode
, a
);
2459 round_for_format (fmt
, r
);
2461 /* round_for_format de-normalizes denormals. Undo just that part. */
2462 if (r
->cl
== rvc_normal
)
2466 /* Legacy. Likewise, except return the struct directly. */
2469 real_value_truncate (enum machine_mode mode
, REAL_VALUE_TYPE a
)
2472 real_convert (&r
, mode
, &a
);
2476 /* Return true if truncating to MODE is exact. */
2479 exact_real_truncate (enum machine_mode mode
, const REAL_VALUE_TYPE
*a
)
2481 const struct real_format
*fmt
;
2485 fmt
= REAL_MODE_FORMAT (mode
);
2488 /* Don't allow conversion to denormals. */
2489 emin2m1
= (fmt
->emin
- 1) * fmt
->log2_b
;
2490 if (REAL_EXP (a
) <= emin2m1
)
2493 /* After conversion to the new mode, the value must be identical. */
2494 real_convert (&t
, mode
, a
);
2495 return real_identical (&t
, a
);
2498 /* Write R to the given target format. Place the words of the result
2499 in target word order in BUF. There are always 32 bits in each
2500 long, no matter the size of the host long.
2502 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2505 real_to_target_fmt (long *buf
, const REAL_VALUE_TYPE
*r_orig
,
2506 const struct real_format
*fmt
)
2512 round_for_format (fmt
, &r
);
2516 (*fmt
->encode
) (fmt
, buf
, &r
);
2521 /* Similar, but look up the format from MODE. */
2524 real_to_target (long *buf
, const REAL_VALUE_TYPE
*r
, enum machine_mode mode
)
2526 const struct real_format
*fmt
;
2528 fmt
= REAL_MODE_FORMAT (mode
);
2531 return real_to_target_fmt (buf
, r
, fmt
);
2534 /* Read R from the given target format. Read the words of the result
2535 in target word order in BUF. There are always 32 bits in each
2536 long, no matter the size of the host long. */
2539 real_from_target_fmt (REAL_VALUE_TYPE
*r
, const long *buf
,
2540 const struct real_format
*fmt
)
2542 (*fmt
->decode
) (fmt
, r
, buf
);
2545 /* Similar, but look up the format from MODE. */
2548 real_from_target (REAL_VALUE_TYPE
*r
, const long *buf
, enum machine_mode mode
)
2550 const struct real_format
*fmt
;
2552 fmt
= REAL_MODE_FORMAT (mode
);
2555 (*fmt
->decode
) (fmt
, r
, buf
);
2558 /* Return the number of bits of the largest binary value that the
2559 significand of MODE will hold. */
2560 /* ??? Legacy. Should get access to real_format directly. */
2563 significand_size (enum machine_mode mode
)
2565 const struct real_format
*fmt
;
2567 fmt
= REAL_MODE_FORMAT (mode
);
2573 /* Return the size in bits of the largest binary value that can be
2574 held by the decimal coefficient for this mode. This is one more
2575 than the number of bits required to hold the largest coefficient
2577 double log2_10
= 3.3219281;
2578 return fmt
->p
* log2_10
;
2580 return fmt
->p
* fmt
->log2_b
;
2583 /* Return a hash value for the given real value. */
2584 /* ??? The "unsigned int" return value is intended to be hashval_t,
2585 but I didn't want to pull hashtab.h into real.h. */
2588 real_hash (const REAL_VALUE_TYPE
*r
)
2593 h
= r
->cl
| (r
->sign
<< 2);
2601 h
|= REAL_EXP (r
) << 3;
2606 h
^= (unsigned int)-1;
2615 if (sizeof(unsigned long) > sizeof(unsigned int))
2616 for (i
= 0; i
< SIGSZ
; ++i
)
2618 unsigned long s
= r
->sig
[i
];
2619 h
^= s
^ (s
>> (HOST_BITS_PER_LONG
/ 2));
2622 for (i
= 0; i
< SIGSZ
; ++i
)
2628 /* IEEE single-precision format. */
2630 static void encode_ieee_single (const struct real_format
*fmt
,
2631 long *, const REAL_VALUE_TYPE
*);
2632 static void decode_ieee_single (const struct real_format
*,
2633 REAL_VALUE_TYPE
*, const long *);
2636 encode_ieee_single (const struct real_format
*fmt
, long *buf
,
2637 const REAL_VALUE_TYPE
*r
)
2639 unsigned long image
, sig
, exp
;
2640 unsigned long sign
= r
->sign
;
2641 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
2644 sig
= (r
->sig
[SIGSZ
-1] >> (HOST_BITS_PER_LONG
- 24)) & 0x7fffff;
2655 image
|= 0x7fffffff;
2663 if (r
->signalling
== fmt
->qnan_msb_set
)
2667 /* We overload qnan_msb_set here: it's only clear for
2668 mips_ieee_single, which wants all mantissa bits but the
2669 quiet/signalling one set in canonical NaNs (at least
2671 if (r
->canonical
&& !fmt
->qnan_msb_set
)
2672 sig
|= (1 << 22) - 1;
2680 image
|= 0x7fffffff;
2684 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2685 whereas the intermediate representation is 0.F x 2**exp.
2686 Which means we're off by one. */
2690 exp
= REAL_EXP (r
) + 127 - 1;
2703 decode_ieee_single (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
2706 unsigned long image
= buf
[0] & 0xffffffff;
2707 bool sign
= (image
>> 31) & 1;
2708 int exp
= (image
>> 23) & 0xff;
2710 memset (r
, 0, sizeof (*r
));
2711 image
<<= HOST_BITS_PER_LONG
- 24;
2716 if (image
&& fmt
->has_denorm
)
2720 SET_REAL_EXP (r
, -126);
2721 r
->sig
[SIGSZ
-1] = image
<< 1;
2724 else if (fmt
->has_signed_zero
)
2727 else if (exp
== 255 && (fmt
->has_nans
|| fmt
->has_inf
))
2733 r
->signalling
= (((image
>> (HOST_BITS_PER_LONG
- 2)) & 1)
2734 ^ fmt
->qnan_msb_set
);
2735 r
->sig
[SIGSZ
-1] = image
;
2747 SET_REAL_EXP (r
, exp
- 127 + 1);
2748 r
->sig
[SIGSZ
-1] = image
| SIG_MSB
;
2752 const struct real_format ieee_single_format
=
2771 const struct real_format mips_single_format
=
2791 /* IEEE double-precision format. */
2793 static void encode_ieee_double (const struct real_format
*fmt
,
2794 long *, const REAL_VALUE_TYPE
*);
2795 static void decode_ieee_double (const struct real_format
*,
2796 REAL_VALUE_TYPE
*, const long *);
2799 encode_ieee_double (const struct real_format
*fmt
, long *buf
,
2800 const REAL_VALUE_TYPE
*r
)
2802 unsigned long image_lo
, image_hi
, sig_lo
, sig_hi
, exp
;
2803 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
2805 image_hi
= r
->sign
<< 31;
2808 if (HOST_BITS_PER_LONG
== 64)
2810 sig_hi
= r
->sig
[SIGSZ
-1];
2811 sig_lo
= (sig_hi
>> (64 - 53)) & 0xffffffff;
2812 sig_hi
= (sig_hi
>> (64 - 53 + 1) >> 31) & 0xfffff;
2816 sig_hi
= r
->sig
[SIGSZ
-1];
2817 sig_lo
= r
->sig
[SIGSZ
-2];
2818 sig_lo
= (sig_hi
<< 21) | (sig_lo
>> 11);
2819 sig_hi
= (sig_hi
>> 11) & 0xfffff;
2829 image_hi
|= 2047 << 20;
2832 image_hi
|= 0x7fffffff;
2833 image_lo
= 0xffffffff;
2841 sig_hi
= sig_lo
= 0;
2842 if (r
->signalling
== fmt
->qnan_msb_set
)
2843 sig_hi
&= ~(1 << 19);
2846 /* We overload qnan_msb_set here: it's only clear for
2847 mips_ieee_single, which wants all mantissa bits but the
2848 quiet/signalling one set in canonical NaNs (at least
2850 if (r
->canonical
&& !fmt
->qnan_msb_set
)
2852 sig_hi
|= (1 << 19) - 1;
2853 sig_lo
= 0xffffffff;
2855 else if (sig_hi
== 0 && sig_lo
== 0)
2858 image_hi
|= 2047 << 20;
2864 image_hi
|= 0x7fffffff;
2865 image_lo
= 0xffffffff;
2870 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2871 whereas the intermediate representation is 0.F x 2**exp.
2872 Which means we're off by one. */
2876 exp
= REAL_EXP (r
) + 1023 - 1;
2877 image_hi
|= exp
<< 20;
2886 if (FLOAT_WORDS_BIG_ENDIAN
)
2887 buf
[0] = image_hi
, buf
[1] = image_lo
;
2889 buf
[0] = image_lo
, buf
[1] = image_hi
;
2893 decode_ieee_double (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
2896 unsigned long image_hi
, image_lo
;
2900 if (FLOAT_WORDS_BIG_ENDIAN
)
2901 image_hi
= buf
[0], image_lo
= buf
[1];
2903 image_lo
= buf
[0], image_hi
= buf
[1];
2904 image_lo
&= 0xffffffff;
2905 image_hi
&= 0xffffffff;
2907 sign
= (image_hi
>> 31) & 1;
2908 exp
= (image_hi
>> 20) & 0x7ff;
2910 memset (r
, 0, sizeof (*r
));
2912 image_hi
<<= 32 - 21;
2913 image_hi
|= image_lo
>> 21;
2914 image_hi
&= 0x7fffffff;
2915 image_lo
<<= 32 - 21;
2919 if ((image_hi
|| image_lo
) && fmt
->has_denorm
)
2923 SET_REAL_EXP (r
, -1022);
2924 if (HOST_BITS_PER_LONG
== 32)
2926 image_hi
= (image_hi
<< 1) | (image_lo
>> 31);
2928 r
->sig
[SIGSZ
-1] = image_hi
;
2929 r
->sig
[SIGSZ
-2] = image_lo
;
2933 image_hi
= (image_hi
<< 31 << 2) | (image_lo
<< 1);
2934 r
->sig
[SIGSZ
-1] = image_hi
;
2938 else if (fmt
->has_signed_zero
)
2941 else if (exp
== 2047 && (fmt
->has_nans
|| fmt
->has_inf
))
2943 if (image_hi
|| image_lo
)
2947 r
->signalling
= ((image_hi
>> 30) & 1) ^ fmt
->qnan_msb_set
;
2948 if (HOST_BITS_PER_LONG
== 32)
2950 r
->sig
[SIGSZ
-1] = image_hi
;
2951 r
->sig
[SIGSZ
-2] = image_lo
;
2954 r
->sig
[SIGSZ
-1] = (image_hi
<< 31 << 1) | image_lo
;
2966 SET_REAL_EXP (r
, exp
- 1023 + 1);
2967 if (HOST_BITS_PER_LONG
== 32)
2969 r
->sig
[SIGSZ
-1] = image_hi
| SIG_MSB
;
2970 r
->sig
[SIGSZ
-2] = image_lo
;
2973 r
->sig
[SIGSZ
-1] = (image_hi
<< 31 << 1) | image_lo
| SIG_MSB
;
2977 const struct real_format ieee_double_format
=
2996 const struct real_format mips_double_format
=
3016 /* IEEE extended real format. This comes in three flavors: Intel's as
3017 a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
3018 12- and 16-byte images may be big- or little endian; Motorola's is
3019 always big endian. */
3021 /* Helper subroutine which converts from the internal format to the
3022 12-byte little-endian Intel format. Functions below adjust this
3023 for the other possible formats. */
3025 encode_ieee_extended (const struct real_format
*fmt
, long *buf
,
3026 const REAL_VALUE_TYPE
*r
)
3028 unsigned long image_hi
, sig_hi
, sig_lo
;
3029 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
3031 image_hi
= r
->sign
<< 15;
3032 sig_hi
= sig_lo
= 0;
3044 /* Intel requires the explicit integer bit to be set, otherwise
3045 it considers the value a "pseudo-infinity". Motorola docs
3046 say it doesn't care. */
3047 sig_hi
= 0x80000000;
3052 sig_lo
= sig_hi
= 0xffffffff;
3060 if (HOST_BITS_PER_LONG
== 32)
3062 sig_hi
= r
->sig
[SIGSZ
-1];
3063 sig_lo
= r
->sig
[SIGSZ
-2];
3067 sig_lo
= r
->sig
[SIGSZ
-1];
3068 sig_hi
= sig_lo
>> 31 >> 1;
3069 sig_lo
&= 0xffffffff;
3071 if (r
->signalling
== fmt
->qnan_msb_set
)
3072 sig_hi
&= ~(1 << 30);
3075 if ((sig_hi
& 0x7fffffff) == 0 && sig_lo
== 0)
3078 /* Intel requires the explicit integer bit to be set, otherwise
3079 it considers the value a "pseudo-nan". Motorola docs say it
3081 sig_hi
|= 0x80000000;
3086 sig_lo
= sig_hi
= 0xffffffff;
3092 int exp
= REAL_EXP (r
);
3094 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3095 whereas the intermediate representation is 0.F x 2**exp.
3096 Which means we're off by one.
3098 Except for Motorola, which consider exp=0 and explicit
3099 integer bit set to continue to be normalized. In theory
3100 this discrepancy has been taken care of by the difference
3101 in fmt->emin in round_for_format. */
3108 gcc_assert (exp
>= 0);
3112 if (HOST_BITS_PER_LONG
== 32)
3114 sig_hi
= r
->sig
[SIGSZ
-1];
3115 sig_lo
= r
->sig
[SIGSZ
-2];
3119 sig_lo
= r
->sig
[SIGSZ
-1];
3120 sig_hi
= sig_lo
>> 31 >> 1;
3121 sig_lo
&= 0xffffffff;
3130 buf
[0] = sig_lo
, buf
[1] = sig_hi
, buf
[2] = image_hi
;
3133 /* Convert from the internal format to the 12-byte Motorola format
3134 for an IEEE extended real. */
3136 encode_ieee_extended_motorola (const struct real_format
*fmt
, long *buf
,
3137 const REAL_VALUE_TYPE
*r
)
3140 encode_ieee_extended (fmt
, intermed
, r
);
3142 /* Motorola chips are assumed always to be big-endian. Also, the
3143 padding in a Motorola extended real goes between the exponent and
3144 the mantissa. At this point the mantissa is entirely within
3145 elements 0 and 1 of intermed, and the exponent entirely within
3146 element 2, so all we have to do is swap the order around, and
3147 shift element 2 left 16 bits. */
3148 buf
[0] = intermed
[2] << 16;
3149 buf
[1] = intermed
[1];
3150 buf
[2] = intermed
[0];
3153 /* Convert from the internal format to the 12-byte Intel format for
3154 an IEEE extended real. */
3156 encode_ieee_extended_intel_96 (const struct real_format
*fmt
, long *buf
,
3157 const REAL_VALUE_TYPE
*r
)
3159 if (FLOAT_WORDS_BIG_ENDIAN
)
3161 /* All the padding in an Intel-format extended real goes at the high
3162 end, which in this case is after the mantissa, not the exponent.
3163 Therefore we must shift everything down 16 bits. */
3165 encode_ieee_extended (fmt
, intermed
, r
);
3166 buf
[0] = ((intermed
[2] << 16) | ((unsigned long)(intermed
[1] & 0xFFFF0000) >> 16));
3167 buf
[1] = ((intermed
[1] << 16) | ((unsigned long)(intermed
[0] & 0xFFFF0000) >> 16));
3168 buf
[2] = (intermed
[0] << 16);
3171 /* encode_ieee_extended produces what we want directly. */
3172 encode_ieee_extended (fmt
, buf
, r
);
3175 /* Convert from the internal format to the 16-byte Intel format for
3176 an IEEE extended real. */
3178 encode_ieee_extended_intel_128 (const struct real_format
*fmt
, long *buf
,
3179 const REAL_VALUE_TYPE
*r
)
3181 /* All the padding in an Intel-format extended real goes at the high end. */
3182 encode_ieee_extended_intel_96 (fmt
, buf
, r
);
3186 /* As above, we have a helper function which converts from 12-byte
3187 little-endian Intel format to internal format. Functions below
3188 adjust for the other possible formats. */
3190 decode_ieee_extended (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3193 unsigned long image_hi
, sig_hi
, sig_lo
;
3197 sig_lo
= buf
[0], sig_hi
= buf
[1], image_hi
= buf
[2];
3198 sig_lo
&= 0xffffffff;
3199 sig_hi
&= 0xffffffff;
3200 image_hi
&= 0xffffffff;
3202 sign
= (image_hi
>> 15) & 1;
3203 exp
= image_hi
& 0x7fff;
3205 memset (r
, 0, sizeof (*r
));
3209 if ((sig_hi
|| sig_lo
) && fmt
->has_denorm
)
3214 /* When the IEEE format contains a hidden bit, we know that
3215 it's zero at this point, and so shift up the significand
3216 and decrease the exponent to match. In this case, Motorola
3217 defines the explicit integer bit to be valid, so we don't
3218 know whether the msb is set or not. */
3219 SET_REAL_EXP (r
, fmt
->emin
);
3220 if (HOST_BITS_PER_LONG
== 32)
3222 r
->sig
[SIGSZ
-1] = sig_hi
;
3223 r
->sig
[SIGSZ
-2] = sig_lo
;
3226 r
->sig
[SIGSZ
-1] = (sig_hi
<< 31 << 1) | sig_lo
;
3230 else if (fmt
->has_signed_zero
)
3233 else if (exp
== 32767 && (fmt
->has_nans
|| fmt
->has_inf
))
3235 /* See above re "pseudo-infinities" and "pseudo-nans".
3236 Short summary is that the MSB will likely always be
3237 set, and that we don't care about it. */
3238 sig_hi
&= 0x7fffffff;
3240 if (sig_hi
|| sig_lo
)
3244 r
->signalling
= ((sig_hi
>> 30) & 1) ^ fmt
->qnan_msb_set
;
3245 if (HOST_BITS_PER_LONG
== 32)
3247 r
->sig
[SIGSZ
-1] = sig_hi
;
3248 r
->sig
[SIGSZ
-2] = sig_lo
;
3251 r
->sig
[SIGSZ
-1] = (sig_hi
<< 31 << 1) | sig_lo
;
3263 SET_REAL_EXP (r
, exp
- 16383 + 1);
3264 if (HOST_BITS_PER_LONG
== 32)
3266 r
->sig
[SIGSZ
-1] = sig_hi
;
3267 r
->sig
[SIGSZ
-2] = sig_lo
;
3270 r
->sig
[SIGSZ
-1] = (sig_hi
<< 31 << 1) | sig_lo
;
3274 /* Convert from the internal format to the 12-byte Motorola format
3275 for an IEEE extended real. */
3277 decode_ieee_extended_motorola (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3282 /* Motorola chips are assumed always to be big-endian. Also, the
3283 padding in a Motorola extended real goes between the exponent and
3284 the mantissa; remove it. */
3285 intermed
[0] = buf
[2];
3286 intermed
[1] = buf
[1];
3287 intermed
[2] = (unsigned long)buf
[0] >> 16;
3289 decode_ieee_extended (fmt
, r
, intermed
);
3292 /* Convert from the internal format to the 12-byte Intel format for
3293 an IEEE extended real. */
3295 decode_ieee_extended_intel_96 (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3298 if (FLOAT_WORDS_BIG_ENDIAN
)
3300 /* All the padding in an Intel-format extended real goes at the high
3301 end, which in this case is after the mantissa, not the exponent.
3302 Therefore we must shift everything up 16 bits. */
3305 intermed
[0] = (((unsigned long)buf
[2] >> 16) | (buf
[1] << 16));
3306 intermed
[1] = (((unsigned long)buf
[1] >> 16) | (buf
[0] << 16));
3307 intermed
[2] = ((unsigned long)buf
[0] >> 16);
3309 decode_ieee_extended (fmt
, r
, intermed
);
3312 /* decode_ieee_extended produces what we want directly. */
3313 decode_ieee_extended (fmt
, r
, buf
);
3316 /* Convert from the internal format to the 16-byte Intel format for
3317 an IEEE extended real. */
3319 decode_ieee_extended_intel_128 (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3322 /* All the padding in an Intel-format extended real goes at the high end. */
3323 decode_ieee_extended_intel_96 (fmt
, r
, buf
);
3326 const struct real_format ieee_extended_motorola_format
=
3328 encode_ieee_extended_motorola
,
3329 decode_ieee_extended_motorola
,
3345 const struct real_format ieee_extended_intel_96_format
=
3347 encode_ieee_extended_intel_96
,
3348 decode_ieee_extended_intel_96
,
3364 const struct real_format ieee_extended_intel_128_format
=
3366 encode_ieee_extended_intel_128
,
3367 decode_ieee_extended_intel_128
,
3383 /* The following caters to i386 systems that set the rounding precision
3384 to 53 bits instead of 64, e.g. FreeBSD. */
3385 const struct real_format ieee_extended_intel_96_round_53_format
=
3387 encode_ieee_extended_intel_96
,
3388 decode_ieee_extended_intel_96
,
3404 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3405 numbers whose sum is equal to the extended precision value. The number
3406 with greater magnitude is first. This format has the same magnitude
3407 range as an IEEE double precision value, but effectively 106 bits of
3408 significand precision. Infinity and NaN are represented by their IEEE
3409 double precision value stored in the first number, the second number is
3410 +0.0 or -0.0 for Infinity and don't-care for NaN. */
3412 static void encode_ibm_extended (const struct real_format
*fmt
,
3413 long *, const REAL_VALUE_TYPE
*);
3414 static void decode_ibm_extended (const struct real_format
*,
3415 REAL_VALUE_TYPE
*, const long *);
3418 encode_ibm_extended (const struct real_format
*fmt
, long *buf
,
3419 const REAL_VALUE_TYPE
*r
)
3421 REAL_VALUE_TYPE u
, normr
, v
;
3422 const struct real_format
*base_fmt
;
3424 base_fmt
= fmt
->qnan_msb_set
? &ieee_double_format
: &mips_double_format
;
3426 /* Renormlize R before doing any arithmetic on it. */
3428 if (normr
.cl
== rvc_normal
)
3431 /* u = IEEE double precision portion of significand. */
3433 round_for_format (base_fmt
, &u
);
3434 encode_ieee_double (base_fmt
, &buf
[0], &u
);
3436 if (u
.cl
== rvc_normal
)
3438 do_add (&v
, &normr
, &u
, 1);
3439 /* Call round_for_format since we might need to denormalize. */
3440 round_for_format (base_fmt
, &v
);
3441 encode_ieee_double (base_fmt
, &buf
[2], &v
);
3445 /* Inf, NaN, 0 are all representable as doubles, so the
3446 least-significant part can be 0.0. */
3453 decode_ibm_extended (const struct real_format
*fmt ATTRIBUTE_UNUSED
, REAL_VALUE_TYPE
*r
,
3456 REAL_VALUE_TYPE u
, v
;
3457 const struct real_format
*base_fmt
;
3459 base_fmt
= fmt
->qnan_msb_set
? &ieee_double_format
: &mips_double_format
;
3460 decode_ieee_double (base_fmt
, &u
, &buf
[0]);
3462 if (u
.cl
!= rvc_zero
&& u
.cl
!= rvc_inf
&& u
.cl
!= rvc_nan
)
3464 decode_ieee_double (base_fmt
, &v
, &buf
[2]);
3465 do_add (r
, &u
, &v
, 0);
3471 const struct real_format ibm_extended_format
=
3473 encode_ibm_extended
,
3474 decode_ibm_extended
,
3490 const struct real_format mips_extended_format
=
3492 encode_ibm_extended
,
3493 decode_ibm_extended
,
3510 /* IEEE quad precision format. */
3512 static void encode_ieee_quad (const struct real_format
*fmt
,
3513 long *, const REAL_VALUE_TYPE
*);
3514 static void decode_ieee_quad (const struct real_format
*,
3515 REAL_VALUE_TYPE
*, const long *);
3518 encode_ieee_quad (const struct real_format
*fmt
, long *buf
,
3519 const REAL_VALUE_TYPE
*r
)
3521 unsigned long image3
, image2
, image1
, image0
, exp
;
3522 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
3525 image3
= r
->sign
<< 31;
3530 rshift_significand (&u
, r
, SIGNIFICAND_BITS
- 113);
3539 image3
|= 32767 << 16;
3542 image3
|= 0x7fffffff;
3543 image2
= 0xffffffff;
3544 image1
= 0xffffffff;
3545 image0
= 0xffffffff;
3552 image3
|= 32767 << 16;
3556 /* Don't use bits from the significand. The
3557 initialization above is right. */
3559 else if (HOST_BITS_PER_LONG
== 32)
3564 image3
|= u
.sig
[3] & 0xffff;
3569 image1
= image0
>> 31 >> 1;
3571 image3
|= (image2
>> 31 >> 1) & 0xffff;
3572 image0
&= 0xffffffff;
3573 image2
&= 0xffffffff;
3575 if (r
->signalling
== fmt
->qnan_msb_set
)
3579 /* We overload qnan_msb_set here: it's only clear for
3580 mips_ieee_single, which wants all mantissa bits but the
3581 quiet/signalling one set in canonical NaNs (at least
3583 if (r
->canonical
&& !fmt
->qnan_msb_set
)
3586 image2
= image1
= image0
= 0xffffffff;
3588 else if (((image3
& 0xffff) | image2
| image1
| image0
) == 0)
3593 image3
|= 0x7fffffff;
3594 image2
= 0xffffffff;
3595 image1
= 0xffffffff;
3596 image0
= 0xffffffff;
3601 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3602 whereas the intermediate representation is 0.F x 2**exp.
3603 Which means we're off by one. */
3607 exp
= REAL_EXP (r
) + 16383 - 1;
3608 image3
|= exp
<< 16;
3610 if (HOST_BITS_PER_LONG
== 32)
3615 image3
|= u
.sig
[3] & 0xffff;
3620 image1
= image0
>> 31 >> 1;
3622 image3
|= (image2
>> 31 >> 1) & 0xffff;
3623 image0
&= 0xffffffff;
3624 image2
&= 0xffffffff;
3632 if (FLOAT_WORDS_BIG_ENDIAN
)
3649 decode_ieee_quad (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3652 unsigned long image3
, image2
, image1
, image0
;
3656 if (FLOAT_WORDS_BIG_ENDIAN
)
3670 image0
&= 0xffffffff;
3671 image1
&= 0xffffffff;
3672 image2
&= 0xffffffff;
3674 sign
= (image3
>> 31) & 1;
3675 exp
= (image3
>> 16) & 0x7fff;
3678 memset (r
, 0, sizeof (*r
));
3682 if ((image3
| image2
| image1
| image0
) && fmt
->has_denorm
)
3687 SET_REAL_EXP (r
, -16382 + (SIGNIFICAND_BITS
- 112));
3688 if (HOST_BITS_PER_LONG
== 32)
3697 r
->sig
[0] = (image1
<< 31 << 1) | image0
;
3698 r
->sig
[1] = (image3
<< 31 << 1) | image2
;
3703 else if (fmt
->has_signed_zero
)
3706 else if (exp
== 32767 && (fmt
->has_nans
|| fmt
->has_inf
))
3708 if (image3
| image2
| image1
| image0
)
3712 r
->signalling
= ((image3
>> 15) & 1) ^ fmt
->qnan_msb_set
;
3714 if (HOST_BITS_PER_LONG
== 32)
3723 r
->sig
[0] = (image1
<< 31 << 1) | image0
;
3724 r
->sig
[1] = (image3
<< 31 << 1) | image2
;
3726 lshift_significand (r
, r
, SIGNIFICAND_BITS
- 113);
3738 SET_REAL_EXP (r
, exp
- 16383 + 1);
3740 if (HOST_BITS_PER_LONG
== 32)
3749 r
->sig
[0] = (image1
<< 31 << 1) | image0
;
3750 r
->sig
[1] = (image3
<< 31 << 1) | image2
;
3752 lshift_significand (r
, r
, SIGNIFICAND_BITS
- 113);
3753 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
3757 const struct real_format ieee_quad_format
=
3776 const struct real_format mips_quad_format
=
3795 /* Descriptions of VAX floating point formats can be found beginning at
3797 http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
3799 The thing to remember is that they're almost IEEE, except for word
3800 order, exponent bias, and the lack of infinities, nans, and denormals.
3802 We don't implement the H_floating format here, simply because neither
3803 the VAX or Alpha ports use it. */
3805 static void encode_vax_f (const struct real_format
*fmt
,
3806 long *, const REAL_VALUE_TYPE
*);
3807 static void decode_vax_f (const struct real_format
*,
3808 REAL_VALUE_TYPE
*, const long *);
3809 static void encode_vax_d (const struct real_format
*fmt
,
3810 long *, const REAL_VALUE_TYPE
*);
3811 static void decode_vax_d (const struct real_format
*,
3812 REAL_VALUE_TYPE
*, const long *);
3813 static void encode_vax_g (const struct real_format
*fmt
,
3814 long *, const REAL_VALUE_TYPE
*);
3815 static void decode_vax_g (const struct real_format
*,
3816 REAL_VALUE_TYPE
*, const long *);
3819 encode_vax_f (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
3820 const REAL_VALUE_TYPE
*r
)
3822 unsigned long sign
, exp
, sig
, image
;
3824 sign
= r
->sign
<< 15;
3834 image
= 0xffff7fff | sign
;
3838 sig
= (r
->sig
[SIGSZ
-1] >> (HOST_BITS_PER_LONG
- 24)) & 0x7fffff;
3839 exp
= REAL_EXP (r
) + 128;
3841 image
= (sig
<< 16) & 0xffff0000;
3855 decode_vax_f (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
3856 REAL_VALUE_TYPE
*r
, const long *buf
)
3858 unsigned long image
= buf
[0] & 0xffffffff;
3859 int exp
= (image
>> 7) & 0xff;
3861 memset (r
, 0, sizeof (*r
));
3866 r
->sign
= (image
>> 15) & 1;
3867 SET_REAL_EXP (r
, exp
- 128);
3869 image
= ((image
& 0x7f) << 16) | ((image
>> 16) & 0xffff);
3870 r
->sig
[SIGSZ
-1] = (image
<< (HOST_BITS_PER_LONG
- 24)) | SIG_MSB
;
3875 encode_vax_d (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
3876 const REAL_VALUE_TYPE
*r
)
3878 unsigned long image0
, image1
, sign
= r
->sign
<< 15;
3883 image0
= image1
= 0;
3888 image0
= 0xffff7fff | sign
;
3889 image1
= 0xffffffff;
3893 /* Extract the significand into straight hi:lo. */
3894 if (HOST_BITS_PER_LONG
== 64)
3896 image0
= r
->sig
[SIGSZ
-1];
3897 image1
= (image0
>> (64 - 56)) & 0xffffffff;
3898 image0
= (image0
>> (64 - 56 + 1) >> 31) & 0x7fffff;
3902 image0
= r
->sig
[SIGSZ
-1];
3903 image1
= r
->sig
[SIGSZ
-2];
3904 image1
= (image0
<< 24) | (image1
>> 8);
3905 image0
= (image0
>> 8) & 0xffffff;
3908 /* Rearrange the half-words of the significand to match the
3910 image0
= ((image0
<< 16) | (image0
>> 16)) & 0xffff007f;
3911 image1
= ((image1
<< 16) | (image1
>> 16)) & 0xffffffff;
3913 /* Add the sign and exponent. */
3915 image0
|= (REAL_EXP (r
) + 128) << 7;
3922 if (FLOAT_WORDS_BIG_ENDIAN
)
3923 buf
[0] = image1
, buf
[1] = image0
;
3925 buf
[0] = image0
, buf
[1] = image1
;
3929 decode_vax_d (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
3930 REAL_VALUE_TYPE
*r
, const long *buf
)
3932 unsigned long image0
, image1
;
3935 if (FLOAT_WORDS_BIG_ENDIAN
)
3936 image1
= buf
[0], image0
= buf
[1];
3938 image0
= buf
[0], image1
= buf
[1];
3939 image0
&= 0xffffffff;
3940 image1
&= 0xffffffff;
3942 exp
= (image0
>> 7) & 0xff;
3944 memset (r
, 0, sizeof (*r
));
3949 r
->sign
= (image0
>> 15) & 1;
3950 SET_REAL_EXP (r
, exp
- 128);
3952 /* Rearrange the half-words of the external format into
3953 proper ascending order. */
3954 image0
= ((image0
& 0x7f) << 16) | ((image0
>> 16) & 0xffff);
3955 image1
= ((image1
& 0xffff) << 16) | ((image1
>> 16) & 0xffff);
3957 if (HOST_BITS_PER_LONG
== 64)
3959 image0
= (image0
<< 31 << 1) | image1
;
3962 r
->sig
[SIGSZ
-1] = image0
;
3966 r
->sig
[SIGSZ
-1] = image0
;
3967 r
->sig
[SIGSZ
-2] = image1
;
3968 lshift_significand (r
, r
, 2*HOST_BITS_PER_LONG
- 56);
3969 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
3975 encode_vax_g (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
3976 const REAL_VALUE_TYPE
*r
)
3978 unsigned long image0
, image1
, sign
= r
->sign
<< 15;
3983 image0
= image1
= 0;
3988 image0
= 0xffff7fff | sign
;
3989 image1
= 0xffffffff;
3993 /* Extract the significand into straight hi:lo. */
3994 if (HOST_BITS_PER_LONG
== 64)
3996 image0
= r
->sig
[SIGSZ
-1];
3997 image1
= (image0
>> (64 - 53)) & 0xffffffff;
3998 image0
= (image0
>> (64 - 53 + 1) >> 31) & 0xfffff;
4002 image0
= r
->sig
[SIGSZ
-1];
4003 image1
= r
->sig
[SIGSZ
-2];
4004 image1
= (image0
<< 21) | (image1
>> 11);
4005 image0
= (image0
>> 11) & 0xfffff;
4008 /* Rearrange the half-words of the significand to match the
4010 image0
= ((image0
<< 16) | (image0
>> 16)) & 0xffff000f;
4011 image1
= ((image1
<< 16) | (image1
>> 16)) & 0xffffffff;
4013 /* Add the sign and exponent. */
4015 image0
|= (REAL_EXP (r
) + 1024) << 4;
4022 if (FLOAT_WORDS_BIG_ENDIAN
)
4023 buf
[0] = image1
, buf
[1] = image0
;
4025 buf
[0] = image0
, buf
[1] = image1
;
4029 decode_vax_g (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4030 REAL_VALUE_TYPE
*r
, const long *buf
)
4032 unsigned long image0
, image1
;
4035 if (FLOAT_WORDS_BIG_ENDIAN
)
4036 image1
= buf
[0], image0
= buf
[1];
4038 image0
= buf
[0], image1
= buf
[1];
4039 image0
&= 0xffffffff;
4040 image1
&= 0xffffffff;
4042 exp
= (image0
>> 4) & 0x7ff;
4044 memset (r
, 0, sizeof (*r
));
4049 r
->sign
= (image0
>> 15) & 1;
4050 SET_REAL_EXP (r
, exp
- 1024);
4052 /* Rearrange the half-words of the external format into
4053 proper ascending order. */
4054 image0
= ((image0
& 0xf) << 16) | ((image0
>> 16) & 0xffff);
4055 image1
= ((image1
& 0xffff) << 16) | ((image1
>> 16) & 0xffff);
4057 if (HOST_BITS_PER_LONG
== 64)
4059 image0
= (image0
<< 31 << 1) | image1
;
4062 r
->sig
[SIGSZ
-1] = image0
;
4066 r
->sig
[SIGSZ
-1] = image0
;
4067 r
->sig
[SIGSZ
-2] = image1
;
4068 lshift_significand (r
, r
, 64 - 53);
4069 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
4074 const struct real_format vax_f_format
=
4093 const struct real_format vax_d_format
=
4112 const struct real_format vax_g_format
=
4131 /* A good reference for these can be found in chapter 9 of
4132 "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
4133 An on-line version can be found here:
4135 http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
4138 static void encode_i370_single (const struct real_format
*fmt
,
4139 long *, const REAL_VALUE_TYPE
*);
4140 static void decode_i370_single (const struct real_format
*,
4141 REAL_VALUE_TYPE
*, const long *);
4142 static void encode_i370_double (const struct real_format
*fmt
,
4143 long *, const REAL_VALUE_TYPE
*);
4144 static void decode_i370_double (const struct real_format
*,
4145 REAL_VALUE_TYPE
*, const long *);
4148 encode_i370_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4149 long *buf
, const REAL_VALUE_TYPE
*r
)
4151 unsigned long sign
, exp
, sig
, image
;
4153 sign
= r
->sign
<< 31;
4163 image
= 0x7fffffff | sign
;
4167 sig
= (r
->sig
[SIGSZ
-1] >> (HOST_BITS_PER_LONG
- 24)) & 0xffffff;
4168 exp
= ((REAL_EXP (r
) / 4) + 64) << 24;
4169 image
= sign
| exp
| sig
;
4180 decode_i370_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4181 REAL_VALUE_TYPE
*r
, const long *buf
)
4183 unsigned long sign
, sig
, image
= buf
[0];
4186 sign
= (image
>> 31) & 1;
4187 exp
= (image
>> 24) & 0x7f;
4188 sig
= image
& 0xffffff;
4190 memset (r
, 0, sizeof (*r
));
4196 SET_REAL_EXP (r
, (exp
- 64) * 4);
4197 r
->sig
[SIGSZ
-1] = sig
<< (HOST_BITS_PER_LONG
- 24);
4203 encode_i370_double (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4204 long *buf
, const REAL_VALUE_TYPE
*r
)
4206 unsigned long sign
, exp
, image_hi
, image_lo
;
4208 sign
= r
->sign
<< 31;
4213 image_hi
= image_lo
= 0;
4218 image_hi
= 0x7fffffff | sign
;
4219 image_lo
= 0xffffffff;
4223 if (HOST_BITS_PER_LONG
== 64)
4225 image_hi
= r
->sig
[SIGSZ
-1];
4226 image_lo
= (image_hi
>> (64 - 56)) & 0xffffffff;
4227 image_hi
= (image_hi
>> (64 - 56 + 1) >> 31) & 0xffffff;
4231 image_hi
= r
->sig
[SIGSZ
-1];
4232 image_lo
= r
->sig
[SIGSZ
-2];
4233 image_lo
= (image_lo
>> 8) | (image_hi
<< 24);
4237 exp
= ((REAL_EXP (r
) / 4) + 64) << 24;
4238 image_hi
|= sign
| exp
;
4245 if (FLOAT_WORDS_BIG_ENDIAN
)
4246 buf
[0] = image_hi
, buf
[1] = image_lo
;
4248 buf
[0] = image_lo
, buf
[1] = image_hi
;
4252 decode_i370_double (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4253 REAL_VALUE_TYPE
*r
, const long *buf
)
4255 unsigned long sign
, image_hi
, image_lo
;
4258 if (FLOAT_WORDS_BIG_ENDIAN
)
4259 image_hi
= buf
[0], image_lo
= buf
[1];
4261 image_lo
= buf
[0], image_hi
= buf
[1];
4263 sign
= (image_hi
>> 31) & 1;
4264 exp
= (image_hi
>> 24) & 0x7f;
4265 image_hi
&= 0xffffff;
4266 image_lo
&= 0xffffffff;
4268 memset (r
, 0, sizeof (*r
));
4270 if (exp
|| image_hi
|| image_lo
)
4274 SET_REAL_EXP (r
, (exp
- 64) * 4 + (SIGNIFICAND_BITS
- 56));
4276 if (HOST_BITS_PER_LONG
== 32)
4278 r
->sig
[0] = image_lo
;
4279 r
->sig
[1] = image_hi
;
4282 r
->sig
[0] = image_lo
| (image_hi
<< 31 << 1);
4288 const struct real_format i370_single_format
=
4302 false, /* ??? The encoding does allow for "unnormals". */
4303 false, /* ??? The encoding does allow for "unnormals". */
4307 const struct real_format i370_double_format
=
4321 false, /* ??? The encoding does allow for "unnormals". */
4322 false, /* ??? The encoding does allow for "unnormals". */
4326 /* Encode real R into a single precision DFP value in BUF. */
4328 encode_decimal_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4329 long *buf ATTRIBUTE_UNUSED
,
4330 const REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
)
4332 encode_decimal32 (fmt
, buf
, r
);
4335 /* Decode a single precision DFP value in BUF into a real R. */
4337 decode_decimal_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4338 REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
,
4339 const long *buf ATTRIBUTE_UNUSED
)
4341 decode_decimal32 (fmt
, r
, buf
);
4344 /* Encode real R into a double precision DFP value in BUF. */
4346 encode_decimal_double (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4347 long *buf ATTRIBUTE_UNUSED
,
4348 const REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
)
4350 encode_decimal64 (fmt
, buf
, r
);
4353 /* Decode a double precision DFP value in BUF into a real R. */
4355 decode_decimal_double (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4356 REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
,
4357 const long *buf ATTRIBUTE_UNUSED
)
4359 decode_decimal64 (fmt
, r
, buf
);
4362 /* Encode real R into a quad precision DFP value in BUF. */
4364 encode_decimal_quad (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4365 long *buf ATTRIBUTE_UNUSED
,
4366 const REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
)
4368 encode_decimal128 (fmt
, buf
, r
);
4371 /* Decode a quad precision DFP value in BUF into a real R. */
4373 decode_decimal_quad (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4374 REAL_VALUE_TYPE
*r ATTRIBUTE_UNUSED
,
4375 const long *buf ATTRIBUTE_UNUSED
)
4377 decode_decimal128 (fmt
, r
, buf
);
4380 /* Single precision decimal floating point (IEEE 754R). */
4381 const struct real_format decimal_single_format
=
4383 encode_decimal_single
,
4384 decode_decimal_single
,
4400 /* Double precision decimal floating point (IEEE 754R). */
4401 const struct real_format decimal_double_format
=
4403 encode_decimal_double
,
4404 decode_decimal_double
,
4420 /* Quad precision decimal floating point (IEEE 754R). */
4421 const struct real_format decimal_quad_format
=
4423 encode_decimal_quad
,
4424 decode_decimal_quad
,
4440 /* The "twos-complement" c4x format is officially defined as
4444 This is rather misleading. One must remember that F is signed.
4445 A better description would be
4447 x = -1**s * ((s + 1 + .f) * 2**e
4449 So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
4450 that's -1 * (1+1+(-.5)) == -1.5. I think.
4452 The constructions here are taken from Tables 5-1 and 5-2 of the
4453 TMS320C4x User's Guide wherein step-by-step instructions for
4454 conversion from IEEE are presented. That's close enough to our
4455 internal representation so as to make things easy.
4457 See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf */
4459 static void encode_c4x_single (const struct real_format
*fmt
,
4460 long *, const REAL_VALUE_TYPE
*);
4461 static void decode_c4x_single (const struct real_format
*,
4462 REAL_VALUE_TYPE
*, const long *);
4463 static void encode_c4x_extended (const struct real_format
*fmt
,
4464 long *, const REAL_VALUE_TYPE
*);
4465 static void decode_c4x_extended (const struct real_format
*,
4466 REAL_VALUE_TYPE
*, const long *);
4469 encode_c4x_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4470 long *buf
, const REAL_VALUE_TYPE
*r
)
4472 unsigned long image
, exp
, sig
;
4484 sig
= 0x800000 - r
->sign
;
4488 exp
= REAL_EXP (r
) - 1;
4489 sig
= (r
->sig
[SIGSZ
-1] >> (HOST_BITS_PER_LONG
- 24)) & 0x7fffff;
4504 image
= ((exp
& 0xff) << 24) | (sig
& 0xffffff);
4509 decode_c4x_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4510 REAL_VALUE_TYPE
*r
, const long *buf
)
4512 unsigned long image
= buf
[0];
4516 exp
= (((image
>> 24) & 0xff) ^ 0x80) - 0x80;
4517 sf
= ((image
& 0xffffff) ^ 0x800000) - 0x800000;
4519 memset (r
, 0, sizeof (*r
));
4525 sig
= sf
& 0x7fffff;
4534 sig
= (sig
<< (HOST_BITS_PER_LONG
- 24)) | SIG_MSB
;
4536 SET_REAL_EXP (r
, exp
+ 1);
4537 r
->sig
[SIGSZ
-1] = sig
;
4542 encode_c4x_extended (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4543 long *buf
, const REAL_VALUE_TYPE
*r
)
4545 unsigned long exp
, sig
;
4557 sig
= 0x80000000 - r
->sign
;
4561 exp
= REAL_EXP (r
) - 1;
4563 sig
= r
->sig
[SIGSZ
-1];
4564 if (HOST_BITS_PER_LONG
== 64)
4565 sig
= sig
>> 1 >> 31;
4582 exp
= (exp
& 0xff) << 24;
4585 if (FLOAT_WORDS_BIG_ENDIAN
)
4586 buf
[0] = exp
, buf
[1] = sig
;
4588 buf
[0] = sig
, buf
[0] = exp
;
4592 decode_c4x_extended (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4593 REAL_VALUE_TYPE
*r
, const long *buf
)
4598 if (FLOAT_WORDS_BIG_ENDIAN
)
4599 exp
= buf
[0], sf
= buf
[1];
4601 sf
= buf
[0], exp
= buf
[1];
4603 exp
= (((exp
>> 24) & 0xff) & 0x80) - 0x80;
4604 sf
= ((sf
& 0xffffffff) ^ 0x80000000) - 0x80000000;
4606 memset (r
, 0, sizeof (*r
));
4612 sig
= sf
& 0x7fffffff;
4621 if (HOST_BITS_PER_LONG
== 64)
4622 sig
= sig
<< 1 << 31;
4625 SET_REAL_EXP (r
, exp
+ 1);
4626 r
->sig
[SIGSZ
-1] = sig
;
4630 const struct real_format c4x_single_format
=
4649 const struct real_format c4x_extended_format
=
4651 encode_c4x_extended
,
4652 decode_c4x_extended
,
4669 /* A synthetic "format" for internal arithmetic. It's the size of the
4670 internal significand minus the two bits needed for proper rounding.
4671 The encode and decode routines exist only to satisfy our paranoia
4674 static void encode_internal (const struct real_format
*fmt
,
4675 long *, const REAL_VALUE_TYPE
*);
4676 static void decode_internal (const struct real_format
*,
4677 REAL_VALUE_TYPE
*, const long *);
4680 encode_internal (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
4681 const REAL_VALUE_TYPE
*r
)
4683 memcpy (buf
, r
, sizeof (*r
));
4687 decode_internal (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4688 REAL_VALUE_TYPE
*r
, const long *buf
)
4690 memcpy (r
, buf
, sizeof (*r
));
4693 const struct real_format real_internal_format
=
4699 SIGNIFICAND_BITS
- 2,
4700 SIGNIFICAND_BITS
- 2,
4712 /* Calculate the square root of X in mode MODE, and store the result
4713 in R. Return TRUE if the operation does not raise an exception.
4714 For details see "High Precision Division and Square Root",
4715 Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June
4716 1993. http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf. */
4719 real_sqrt (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
4720 const REAL_VALUE_TYPE
*x
)
4722 static REAL_VALUE_TYPE halfthree
;
4723 static bool init
= false;
4724 REAL_VALUE_TYPE h
, t
, i
;
4727 /* sqrt(-0.0) is -0.0. */
4728 if (real_isnegzero (x
))
4734 /* Negative arguments return NaN. */
4737 get_canonical_qnan (r
, 0);
4741 /* Infinity and NaN return themselves. */
4742 if (real_isinf (x
) || real_isnan (x
))
4750 do_add (&halfthree
, &dconst1
, &dconsthalf
, 0);
4754 /* Initial guess for reciprocal sqrt, i. */
4755 exp
= real_exponent (x
);
4756 real_ldexp (&i
, &dconst1
, -exp
/2);
4758 /* Newton's iteration for reciprocal sqrt, i. */
4759 for (iter
= 0; iter
< 16; iter
++)
4761 /* i(n+1) = i(n) * (1.5 - 0.5*i(n)*i(n)*x). */
4762 do_multiply (&t
, x
, &i
);
4763 do_multiply (&h
, &t
, &i
);
4764 do_multiply (&t
, &h
, &dconsthalf
);
4765 do_add (&h
, &halfthree
, &t
, 1);
4766 do_multiply (&t
, &i
, &h
);
4768 /* Check for early convergence. */
4769 if (iter
>= 6 && real_identical (&i
, &t
))
4772 /* ??? Unroll loop to avoid copying. */
4776 /* Final iteration: r = i*x + 0.5*i*x*(1.0 - i*(i*x)). */
4777 do_multiply (&t
, x
, &i
);
4778 do_multiply (&h
, &t
, &i
);
4779 do_add (&i
, &dconst1
, &h
, 1);
4780 do_multiply (&h
, &t
, &i
);
4781 do_multiply (&i
, &dconsthalf
, &h
);
4782 do_add (&h
, &t
, &i
, 0);
4784 /* ??? We need a Tuckerman test to get the last bit. */
4786 real_convert (r
, mode
, &h
);
4790 /* Calculate X raised to the integer exponent N in mode MODE and store
4791 the result in R. Return true if the result may be inexact due to
4792 loss of precision. The algorithm is the classic "left-to-right binary
4793 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4794 Algorithms", "The Art of Computer Programming", Volume 2. */
4797 real_powi (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
4798 const REAL_VALUE_TYPE
*x
, HOST_WIDE_INT n
)
4800 unsigned HOST_WIDE_INT bit
;
4802 bool inexact
= false;
4814 /* Don't worry about overflow, from now on n is unsigned. */
4822 bit
= (unsigned HOST_WIDE_INT
) 1 << (HOST_BITS_PER_WIDE_INT
- 1);
4823 for (i
= 0; i
< HOST_BITS_PER_WIDE_INT
; i
++)
4827 inexact
|= do_multiply (&t
, &t
, &t
);
4829 inexact
|= do_multiply (&t
, &t
, x
);
4837 inexact
|= do_divide (&t
, &dconst1
, &t
);
4839 real_convert (r
, mode
, &t
);
4843 /* Round X to the nearest integer not larger in absolute value, i.e.
4844 towards zero, placing the result in R in mode MODE. */
4847 real_trunc (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
4848 const REAL_VALUE_TYPE
*x
)
4850 do_fix_trunc (r
, x
);
4851 if (mode
!= VOIDmode
)
4852 real_convert (r
, mode
, r
);
4855 /* Round X to the largest integer not greater in value, i.e. round
4856 down, placing the result in R in mode MODE. */
4859 real_floor (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
4860 const REAL_VALUE_TYPE
*x
)
4864 do_fix_trunc (&t
, x
);
4865 if (! real_identical (&t
, x
) && x
->sign
)
4866 do_add (&t
, &t
, &dconstm1
, 0);
4867 if (mode
!= VOIDmode
)
4868 real_convert (r
, mode
, &t
);
4873 /* Round X to the smallest integer not less then argument, i.e. round
4874 up, placing the result in R in mode MODE. */
4877 real_ceil (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
4878 const REAL_VALUE_TYPE
*x
)
4882 do_fix_trunc (&t
, x
);
4883 if (! real_identical (&t
, x
) && ! x
->sign
)
4884 do_add (&t
, &t
, &dconst1
, 0);
4885 if (mode
!= VOIDmode
)
4886 real_convert (r
, mode
, &t
);
4891 /* Round X to the nearest integer, but round halfway cases away from
4895 real_round (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
4896 const REAL_VALUE_TYPE
*x
)
4898 do_add (r
, x
, &dconsthalf
, x
->sign
);
4899 do_fix_trunc (r
, r
);
4900 if (mode
!= VOIDmode
)
4901 real_convert (r
, mode
, r
);
4904 /* Set the sign of R to the sign of X. */
4907 real_copysign (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*x
)