1 /* real.c - software floating point emulation.
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2002, 2003 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, 59 Temple Place - Suite 330, Boston, MA
26 #include "coretypes.h"
33 /* The floating point model used internally is not exactly IEEE 754
34 compliant, and close to the description in the ISO C standard,
35 section 5.2.4.2.2 Characteristics of floating types.
39 x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
43 b = base or radix, here always 2
45 p = precision (the number of base-b digits in the significand)
46 f_k = the digits of the significand.
48 We differ from typical IEEE 754 encodings in that the entire
49 significand is fractional. Normalized significands are in the
52 A requirement of the model is that P be larger than than the
53 largest supported target floating-point type by at least 2 bits.
54 This gives us proper rounding when we truncate to the target type.
55 In addition, E must be large enough to hold the smallest supported
56 denormal number in a normalized form.
58 Both of these requirements are easily satisfied. The largest target
59 significand is 113 bits; we store at least 160. The smallest
60 denormal number fits in 17 exponent bits; we store 29.
62 Note that the decimal string conversion routines are sensitive to
63 rounding error. Since the raw arithmetic routines do not themselves
64 have guard digits or rounding, the computation of 10**exp can
65 accumulate more than a few digits of error. The previous incarnation
66 of real.c successfully used a 144 bit fraction; given the current
67 layout of REAL_VALUE_TYPE we're forced to expand to at least 160 bits.
69 Target floating point models that use base 16 instead of base 2
70 (i.e. IBM 370), are handled during round_for_format, in which we
71 canonicalize the exponent to be a multiple of 4 (log2(16)), and
72 adjust the significand to match. */
75 /* Used to classify two numbers simultaneously. */
76 #define CLASS2(A, B) ((A) << 2 | (B))
78 #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
79 #error "Some constant folding done by hand to avoid shift count warnings"
82 static void get_zero (REAL_VALUE_TYPE
*, int);
83 static void get_canonical_qnan (REAL_VALUE_TYPE
*, int);
84 static void get_canonical_snan (REAL_VALUE_TYPE
*, int);
85 static void get_inf (REAL_VALUE_TYPE
*, int);
86 static bool sticky_rshift_significand (REAL_VALUE_TYPE
*,
87 const REAL_VALUE_TYPE
*, unsigned int);
88 static void rshift_significand (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
90 static void lshift_significand (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
92 static void lshift_significand_1 (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
93 static bool add_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*,
94 const REAL_VALUE_TYPE
*);
95 static bool sub_significands (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
96 const REAL_VALUE_TYPE
*, int);
97 static void neg_significand (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
98 static int cmp_significands (const REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
99 static int cmp_significand_0 (const REAL_VALUE_TYPE
*);
100 static void set_significand_bit (REAL_VALUE_TYPE
*, unsigned int);
101 static void clear_significand_bit (REAL_VALUE_TYPE
*, unsigned int);
102 static bool test_significand_bit (REAL_VALUE_TYPE
*, unsigned int);
103 static void clear_significand_below (REAL_VALUE_TYPE
*, unsigned int);
104 static bool div_significands (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
105 const REAL_VALUE_TYPE
*);
106 static void normalize (REAL_VALUE_TYPE
*);
108 static bool do_add (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
109 const REAL_VALUE_TYPE
*, int);
110 static bool do_multiply (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
111 const REAL_VALUE_TYPE
*);
112 static bool do_divide (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*,
113 const REAL_VALUE_TYPE
*);
114 static int do_compare (const REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*, int);
115 static void do_fix_trunc (REAL_VALUE_TYPE
*, const REAL_VALUE_TYPE
*);
117 static unsigned long rtd_divmod (REAL_VALUE_TYPE
*, REAL_VALUE_TYPE
*);
119 static const REAL_VALUE_TYPE
* ten_to_ptwo (int);
120 static const REAL_VALUE_TYPE
* ten_to_mptwo (int);
121 static const REAL_VALUE_TYPE
* real_digit (int);
122 static void times_pten (REAL_VALUE_TYPE
*, int);
124 static void round_for_format (const struct real_format
*, REAL_VALUE_TYPE
*);
126 /* Initialize R with a positive zero. */
129 get_zero (REAL_VALUE_TYPE
*r
, int sign
)
131 memset (r
, 0, sizeof (*r
));
135 /* Initialize R with the canonical quiet NaN. */
138 get_canonical_qnan (REAL_VALUE_TYPE
*r
, int sign
)
140 memset (r
, 0, sizeof (*r
));
147 get_canonical_snan (REAL_VALUE_TYPE
*r
, int sign
)
149 memset (r
, 0, sizeof (*r
));
157 get_inf (REAL_VALUE_TYPE
*r
, int sign
)
159 memset (r
, 0, sizeof (*r
));
165 /* Right-shift the significand of A by N bits; put the result in the
166 significand of R. If any one bits are shifted out, return true. */
169 sticky_rshift_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
172 unsigned long sticky
= 0;
173 unsigned int i
, ofs
= 0;
175 if (n
>= HOST_BITS_PER_LONG
)
177 for (i
= 0, ofs
= n
/ HOST_BITS_PER_LONG
; i
< ofs
; ++i
)
179 n
&= HOST_BITS_PER_LONG
- 1;
184 sticky
|= a
->sig
[ofs
] & (((unsigned long)1 << n
) - 1);
185 for (i
= 0; i
< SIGSZ
; ++i
)
188 = (((ofs
+ i
>= SIGSZ
? 0 : a
->sig
[ofs
+ i
]) >> n
)
189 | ((ofs
+ i
+ 1 >= SIGSZ
? 0 : a
->sig
[ofs
+ i
+ 1])
190 << (HOST_BITS_PER_LONG
- n
)));
195 for (i
= 0; ofs
+ i
< SIGSZ
; ++i
)
196 r
->sig
[i
] = a
->sig
[ofs
+ i
];
197 for (; i
< SIGSZ
; ++i
)
204 /* Right-shift the significand of A by N bits; put the result in the
208 rshift_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
211 unsigned int i
, ofs
= n
/ HOST_BITS_PER_LONG
;
213 n
&= HOST_BITS_PER_LONG
- 1;
216 for (i
= 0; i
< SIGSZ
; ++i
)
219 = (((ofs
+ i
>= SIGSZ
? 0 : a
->sig
[ofs
+ i
]) >> n
)
220 | ((ofs
+ i
+ 1 >= SIGSZ
? 0 : a
->sig
[ofs
+ i
+ 1])
221 << (HOST_BITS_PER_LONG
- n
)));
226 for (i
= 0; ofs
+ i
< SIGSZ
; ++i
)
227 r
->sig
[i
] = a
->sig
[ofs
+ i
];
228 for (; i
< SIGSZ
; ++i
)
233 /* Left-shift the significand of A by N bits; put the result in the
237 lshift_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
240 unsigned int i
, ofs
= n
/ HOST_BITS_PER_LONG
;
242 n
&= HOST_BITS_PER_LONG
- 1;
245 for (i
= 0; ofs
+ i
< SIGSZ
; ++i
)
246 r
->sig
[SIGSZ
-1-i
] = a
->sig
[SIGSZ
-1-i
-ofs
];
247 for (; i
< SIGSZ
; ++i
)
248 r
->sig
[SIGSZ
-1-i
] = 0;
251 for (i
= 0; i
< SIGSZ
; ++i
)
254 = (((ofs
+ i
>= SIGSZ
? 0 : a
->sig
[SIGSZ
-1-i
-ofs
]) << n
)
255 | ((ofs
+ i
+ 1 >= SIGSZ
? 0 : a
->sig
[SIGSZ
-1-i
-ofs
-1])
256 >> (HOST_BITS_PER_LONG
- n
)));
260 /* Likewise, but N is specialized to 1. */
263 lshift_significand_1 (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
)
267 for (i
= SIGSZ
- 1; i
> 0; --i
)
268 r
->sig
[i
] = (a
->sig
[i
] << 1) | (a
->sig
[i
-1] >> (HOST_BITS_PER_LONG
- 1));
269 r
->sig
[0] = a
->sig
[0] << 1;
272 /* Add the significands of A and B, placing the result in R. Return
273 true if there was carry out of the most significant word. */
276 add_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
277 const REAL_VALUE_TYPE
*b
)
282 for (i
= 0; i
< SIGSZ
; ++i
)
284 unsigned long ai
= a
->sig
[i
];
285 unsigned long ri
= ai
+ b
->sig
[i
];
301 /* Subtract the significands of A and B, placing the result in R. CARRY is
302 true if there's a borrow incoming to the least significant word.
303 Return true if there was borrow out of the most significant word. */
306 sub_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
307 const REAL_VALUE_TYPE
*b
, int carry
)
311 for (i
= 0; i
< SIGSZ
; ++i
)
313 unsigned long ai
= a
->sig
[i
];
314 unsigned long ri
= ai
- b
->sig
[i
];
330 /* Negate the significand A, placing the result in R. */
333 neg_significand (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
)
338 for (i
= 0; i
< SIGSZ
; ++i
)
340 unsigned long ri
, ai
= a
->sig
[i
];
359 /* Compare significands. Return tri-state vs zero. */
362 cmp_significands (const REAL_VALUE_TYPE
*a
, const REAL_VALUE_TYPE
*b
)
366 for (i
= SIGSZ
- 1; i
>= 0; --i
)
368 unsigned long ai
= a
->sig
[i
];
369 unsigned long bi
= b
->sig
[i
];
380 /* Return true if A is nonzero. */
383 cmp_significand_0 (const REAL_VALUE_TYPE
*a
)
387 for (i
= SIGSZ
- 1; i
>= 0; --i
)
394 /* Set bit N of the significand of R. */
397 set_significand_bit (REAL_VALUE_TYPE
*r
, unsigned int n
)
399 r
->sig
[n
/ HOST_BITS_PER_LONG
]
400 |= (unsigned long)1 << (n
% HOST_BITS_PER_LONG
);
403 /* Clear bit N of the significand of R. */
406 clear_significand_bit (REAL_VALUE_TYPE
*r
, unsigned int n
)
408 r
->sig
[n
/ HOST_BITS_PER_LONG
]
409 &= ~((unsigned long)1 << (n
% HOST_BITS_PER_LONG
));
412 /* Test bit N of the significand of R. */
415 test_significand_bit (REAL_VALUE_TYPE
*r
, unsigned int n
)
417 /* ??? Compiler bug here if we return this expression directly.
418 The conversion to bool strips the "&1" and we wind up testing
419 e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */
420 int t
= (r
->sig
[n
/ HOST_BITS_PER_LONG
] >> (n
% HOST_BITS_PER_LONG
)) & 1;
424 /* Clear bits 0..N-1 of the significand of R. */
427 clear_significand_below (REAL_VALUE_TYPE
*r
, unsigned int n
)
429 int i
, w
= n
/ HOST_BITS_PER_LONG
;
431 for (i
= 0; i
< w
; ++i
)
434 r
->sig
[w
] &= ~(((unsigned long)1 << (n
% HOST_BITS_PER_LONG
)) - 1);
437 /* Divide the significands of A and B, placing the result in R. Return
438 true if the division was inexact. */
441 div_significands (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
442 const REAL_VALUE_TYPE
*b
)
445 int i
, bit
= SIGNIFICAND_BITS
- 1;
446 unsigned long msb
, inexact
;
449 memset (r
->sig
, 0, sizeof (r
->sig
));
455 msb
= u
.sig
[SIGSZ
-1] & SIG_MSB
;
456 lshift_significand_1 (&u
, &u
);
458 if (msb
|| cmp_significands (&u
, b
) >= 0)
460 sub_significands (&u
, &u
, b
, 0);
461 set_significand_bit (r
, bit
);
466 for (i
= 0, inexact
= 0; i
< SIGSZ
; i
++)
472 /* Adjust the exponent and significand of R such that the most
473 significant bit is set. We underflow to zero and overflow to
474 infinity here, without denormals. (The intermediate representation
475 exponent is large enough to handle target denormals normalized.) */
478 normalize (REAL_VALUE_TYPE
*r
)
483 /* Find the first word that is nonzero. */
484 for (i
= SIGSZ
- 1; i
>= 0; i
--)
486 shift
+= HOST_BITS_PER_LONG
;
490 /* Zero significand flushes to zero. */
498 /* Find the first bit that is nonzero. */
500 if (r
->sig
[i
] & ((unsigned long)1 << (HOST_BITS_PER_LONG
- 1 - j
)))
506 exp
= r
->exp
- shift
;
508 get_inf (r
, r
->sign
);
509 else if (exp
< -MAX_EXP
)
510 get_zero (r
, r
->sign
);
514 lshift_significand (r
, r
, shift
);
519 /* Calculate R = A + (SUBTRACT_P ? -B : B). Return true if the
520 result may be inexact due to a loss of precision. */
523 do_add (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
524 const REAL_VALUE_TYPE
*b
, int subtract_p
)
528 bool inexact
= false;
530 /* Determine if we need to add or subtract. */
532 subtract_p
= (sign
^ b
->sign
) ^ subtract_p
;
534 switch (CLASS2 (a
->class, b
->class))
536 case CLASS2 (rvc_zero
, rvc_zero
):
537 /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0. */
538 get_zero (r
, sign
& !subtract_p
);
541 case CLASS2 (rvc_zero
, rvc_normal
):
542 case CLASS2 (rvc_zero
, rvc_inf
):
543 case CLASS2 (rvc_zero
, rvc_nan
):
545 case CLASS2 (rvc_normal
, rvc_nan
):
546 case CLASS2 (rvc_inf
, rvc_nan
):
547 case CLASS2 (rvc_nan
, rvc_nan
):
548 /* ANY + NaN = NaN. */
549 case CLASS2 (rvc_normal
, rvc_inf
):
552 r
->sign
= sign
^ subtract_p
;
555 case CLASS2 (rvc_normal
, rvc_zero
):
556 case CLASS2 (rvc_inf
, rvc_zero
):
557 case CLASS2 (rvc_nan
, rvc_zero
):
559 case CLASS2 (rvc_nan
, rvc_normal
):
560 case CLASS2 (rvc_nan
, rvc_inf
):
561 /* NaN + ANY = NaN. */
562 case CLASS2 (rvc_inf
, rvc_normal
):
567 case CLASS2 (rvc_inf
, rvc_inf
):
569 /* Inf - Inf = NaN. */
570 get_canonical_qnan (r
, 0);
572 /* Inf + Inf = Inf. */
576 case CLASS2 (rvc_normal
, rvc_normal
):
583 /* Swap the arguments such that A has the larger exponent. */
584 dexp
= a
->exp
- b
->exp
;
587 const REAL_VALUE_TYPE
*t
;
594 /* If the exponents are not identical, we need to shift the
595 significand of B down. */
598 /* If the exponents are too far apart, the significands
599 do not overlap, which makes the subtraction a noop. */
600 if (dexp
>= SIGNIFICAND_BITS
)
607 inexact
|= sticky_rshift_significand (&t
, b
, dexp
);
613 if (sub_significands (r
, a
, b
, inexact
))
615 /* We got a borrow out of the subtraction. That means that
616 A and B had the same exponent, and B had the larger
617 significand. We need to swap the sign and negate the
620 neg_significand (r
, r
);
625 if (add_significands (r
, a
, b
))
627 /* We got carry out of the addition. This means we need to
628 shift the significand back down one bit and increase the
630 inexact
|= sticky_rshift_significand (r
, r
, 1);
631 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
640 r
->class = rvc_normal
;
644 /* Re-normalize the result. */
647 /* Special case: if the subtraction results in zero, the result
649 if (r
->class == rvc_zero
)
652 r
->sig
[0] |= inexact
;
657 /* Calculate R = A * B. Return true if the result may be inexact. */
660 do_multiply (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
661 const REAL_VALUE_TYPE
*b
)
663 REAL_VALUE_TYPE u
, t
, *rr
;
664 unsigned int i
, j
, k
;
665 int sign
= a
->sign
^ b
->sign
;
666 bool inexact
= false;
668 switch (CLASS2 (a
->class, b
->class))
670 case CLASS2 (rvc_zero
, rvc_zero
):
671 case CLASS2 (rvc_zero
, rvc_normal
):
672 case CLASS2 (rvc_normal
, rvc_zero
):
673 /* +-0 * ANY = 0 with appropriate sign. */
677 case CLASS2 (rvc_zero
, rvc_nan
):
678 case CLASS2 (rvc_normal
, rvc_nan
):
679 case CLASS2 (rvc_inf
, rvc_nan
):
680 case CLASS2 (rvc_nan
, rvc_nan
):
681 /* ANY * NaN = NaN. */
686 case CLASS2 (rvc_nan
, rvc_zero
):
687 case CLASS2 (rvc_nan
, rvc_normal
):
688 case CLASS2 (rvc_nan
, rvc_inf
):
689 /* NaN * ANY = NaN. */
694 case CLASS2 (rvc_zero
, rvc_inf
):
695 case CLASS2 (rvc_inf
, rvc_zero
):
697 get_canonical_qnan (r
, sign
);
700 case CLASS2 (rvc_inf
, rvc_inf
):
701 case CLASS2 (rvc_normal
, rvc_inf
):
702 case CLASS2 (rvc_inf
, rvc_normal
):
703 /* Inf * Inf = Inf, R * Inf = Inf */
707 case CLASS2 (rvc_normal
, rvc_normal
):
714 if (r
== a
|| r
== b
)
720 /* Collect all the partial products. Since we don't have sure access
721 to a widening multiply, we split each long into two half-words.
723 Consider the long-hand form of a four half-word multiplication:
733 We construct partial products of the widened half-word products
734 that are known to not overlap, e.g. DF+DH. Each such partial
735 product is given its proper exponent, which allows us to sum them
736 and obtain the finished product. */
738 for (i
= 0; i
< SIGSZ
* 2; ++i
)
740 unsigned long ai
= a
->sig
[i
/ 2];
742 ai
>>= HOST_BITS_PER_LONG
/ 2;
744 ai
&= ((unsigned long)1 << (HOST_BITS_PER_LONG
/ 2)) - 1;
749 for (j
= 0; j
< 2; ++j
)
751 int exp
= (a
->exp
- (2*SIGSZ
-1-i
)*(HOST_BITS_PER_LONG
/2)
752 + (b
->exp
- (1-j
)*(HOST_BITS_PER_LONG
/2)));
761 /* Would underflow to zero, which we shouldn't bother adding. */
766 u
.class = rvc_normal
;
770 for (k
= j
; k
< SIGSZ
* 2; k
+= 2)
772 unsigned long bi
= b
->sig
[k
/ 2];
774 bi
>>= HOST_BITS_PER_LONG
/ 2;
776 bi
&= ((unsigned long)1 << (HOST_BITS_PER_LONG
/ 2)) - 1;
778 u
.sig
[k
/ 2] = ai
* bi
;
782 inexact
|= do_add (rr
, rr
, &u
, 0);
793 /* Calculate R = A / B. Return true if the result may be inexact. */
796 do_divide (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
,
797 const REAL_VALUE_TYPE
*b
)
799 int exp
, sign
= a
->sign
^ b
->sign
;
800 REAL_VALUE_TYPE t
, *rr
;
803 switch (CLASS2 (a
->class, b
->class))
805 case CLASS2 (rvc_zero
, rvc_zero
):
807 case CLASS2 (rvc_inf
, rvc_inf
):
808 /* Inf / Inf = NaN. */
809 get_canonical_qnan (r
, sign
);
812 case CLASS2 (rvc_zero
, rvc_normal
):
813 case CLASS2 (rvc_zero
, rvc_inf
):
815 case CLASS2 (rvc_normal
, rvc_inf
):
820 case CLASS2 (rvc_normal
, rvc_zero
):
822 case CLASS2 (rvc_inf
, rvc_zero
):
827 case CLASS2 (rvc_zero
, rvc_nan
):
828 case CLASS2 (rvc_normal
, rvc_nan
):
829 case CLASS2 (rvc_inf
, rvc_nan
):
830 case CLASS2 (rvc_nan
, rvc_nan
):
831 /* ANY / NaN = NaN. */
836 case CLASS2 (rvc_nan
, rvc_zero
):
837 case CLASS2 (rvc_nan
, rvc_normal
):
838 case CLASS2 (rvc_nan
, rvc_inf
):
839 /* NaN / ANY = NaN. */
844 case CLASS2 (rvc_inf
, rvc_normal
):
849 case CLASS2 (rvc_normal
, rvc_normal
):
856 if (r
== a
|| r
== b
)
861 rr
->class = rvc_normal
;
864 exp
= a
->exp
- b
->exp
+ 1;
877 inexact
= div_significands (rr
, a
, b
);
879 /* Re-normalize the result. */
881 rr
->sig
[0] |= inexact
;
889 /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
890 one of the two operands is a NaN. */
893 do_compare (const REAL_VALUE_TYPE
*a
, const REAL_VALUE_TYPE
*b
,
898 switch (CLASS2 (a
->class, b
->class))
900 case CLASS2 (rvc_zero
, rvc_zero
):
901 /* Sign of zero doesn't matter for compares. */
904 case CLASS2 (rvc_inf
, rvc_zero
):
905 case CLASS2 (rvc_inf
, rvc_normal
):
906 case CLASS2 (rvc_normal
, rvc_zero
):
907 return (a
->sign
? -1 : 1);
909 case CLASS2 (rvc_inf
, rvc_inf
):
910 return -a
->sign
- -b
->sign
;
912 case CLASS2 (rvc_zero
, rvc_normal
):
913 case CLASS2 (rvc_zero
, rvc_inf
):
914 case CLASS2 (rvc_normal
, rvc_inf
):
915 return (b
->sign
? 1 : -1);
917 case CLASS2 (rvc_zero
, rvc_nan
):
918 case CLASS2 (rvc_normal
, rvc_nan
):
919 case CLASS2 (rvc_inf
, rvc_nan
):
920 case CLASS2 (rvc_nan
, rvc_nan
):
921 case CLASS2 (rvc_nan
, rvc_zero
):
922 case CLASS2 (rvc_nan
, rvc_normal
):
923 case CLASS2 (rvc_nan
, rvc_inf
):
926 case CLASS2 (rvc_normal
, rvc_normal
):
933 if (a
->sign
!= b
->sign
)
934 return -a
->sign
- -b
->sign
;
938 else if (a
->exp
< b
->exp
)
941 ret
= cmp_significands (a
, b
);
943 return (a
->sign
? -ret
: ret
);
946 /* Return A truncated to an integral value toward zero. */
949 do_fix_trunc (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*a
)
962 get_zero (r
, r
->sign
);
963 else if (r
->exp
< SIGNIFICAND_BITS
)
964 clear_significand_below (r
, SIGNIFICAND_BITS
- r
->exp
);
972 /* Perform the binary or unary operation described by CODE.
973 For a unary operation, leave OP1 NULL. */
976 real_arithmetic (REAL_VALUE_TYPE
*r
, int icode
, const REAL_VALUE_TYPE
*op0
,
977 const REAL_VALUE_TYPE
*op1
)
979 enum tree_code code
= icode
;
984 do_add (r
, op0
, op1
, 0);
988 do_add (r
, op0
, op1
, 1);
992 do_multiply (r
, op0
, op1
);
996 do_divide (r
, op0
, op1
);
1000 if (op1
->class == rvc_nan
)
1002 else if (do_compare (op0
, op1
, -1) < 0)
1009 if (op1
->class == rvc_nan
)
1011 else if (do_compare (op0
, op1
, 1) < 0)
1027 case FIX_TRUNC_EXPR
:
1028 do_fix_trunc (r
, op0
);
1036 /* Legacy. Similar, but return the result directly. */
1039 real_arithmetic2 (int icode
, const REAL_VALUE_TYPE
*op0
,
1040 const REAL_VALUE_TYPE
*op1
)
1043 real_arithmetic (&r
, icode
, op0
, op1
);
1048 real_compare (int icode
, const REAL_VALUE_TYPE
*op0
,
1049 const REAL_VALUE_TYPE
*op1
)
1051 enum tree_code code
= icode
;
1056 return do_compare (op0
, op1
, 1) < 0;
1058 return do_compare (op0
, op1
, 1) <= 0;
1060 return do_compare (op0
, op1
, -1) > 0;
1062 return do_compare (op0
, op1
, -1) >= 0;
1064 return do_compare (op0
, op1
, -1) == 0;
1066 return do_compare (op0
, op1
, -1) != 0;
1067 case UNORDERED_EXPR
:
1068 return op0
->class == rvc_nan
|| op1
->class == rvc_nan
;
1070 return op0
->class != rvc_nan
&& op1
->class != rvc_nan
;
1072 return do_compare (op0
, op1
, -1) < 0;
1074 return do_compare (op0
, op1
, -1) <= 0;
1076 return do_compare (op0
, op1
, 1) > 0;
1078 return do_compare (op0
, op1
, 1) >= 0;
1080 return do_compare (op0
, op1
, 0) == 0;
1087 /* Return floor log2(R). */
1090 real_exponent (const REAL_VALUE_TYPE
*r
)
1098 return (unsigned int)-1 >> 1;
1106 /* R = OP0 * 2**EXP. */
1109 real_ldexp (REAL_VALUE_TYPE
*r
, const REAL_VALUE_TYPE
*op0
, int exp
)
1122 get_inf (r
, r
->sign
);
1123 else if (exp
< -MAX_EXP
)
1124 get_zero (r
, r
->sign
);
1134 /* Determine whether a floating-point value X is infinite. */
1137 real_isinf (const REAL_VALUE_TYPE
*r
)
1139 return (r
->class == rvc_inf
);
1142 /* Determine whether a floating-point value X is a NaN. */
1145 real_isnan (const REAL_VALUE_TYPE
*r
)
1147 return (r
->class == rvc_nan
);
1150 /* Determine whether a floating-point value X is negative. */
1153 real_isneg (const REAL_VALUE_TYPE
*r
)
1158 /* Determine whether a floating-point value X is minus zero. */
1161 real_isnegzero (const REAL_VALUE_TYPE
*r
)
1163 return r
->sign
&& r
->class == rvc_zero
;
1166 /* Compare two floating-point objects for bitwise identity. */
1169 real_identical (const REAL_VALUE_TYPE
*a
, const REAL_VALUE_TYPE
*b
)
1173 if (a
->class != b
->class)
1175 if (a
->sign
!= b
->sign
)
1185 if (a
->exp
!= b
->exp
)
1190 if (a
->signalling
!= b
->signalling
)
1192 /* The significand is ignored for canonical NaNs. */
1193 if (a
->canonical
|| b
->canonical
)
1194 return a
->canonical
== b
->canonical
;
1201 for (i
= 0; i
< SIGSZ
; ++i
)
1202 if (a
->sig
[i
] != b
->sig
[i
])
1208 /* Try to change R into its exact multiplicative inverse in machine
1209 mode MODE. Return true if successful. */
1212 exact_real_inverse (enum machine_mode mode
, REAL_VALUE_TYPE
*r
)
1214 const REAL_VALUE_TYPE
*one
= real_digit (1);
1218 if (r
->class != rvc_normal
)
1221 /* Check for a power of two: all significand bits zero except the MSB. */
1222 for (i
= 0; i
< SIGSZ
-1; ++i
)
1225 if (r
->sig
[SIGSZ
-1] != SIG_MSB
)
1228 /* Find the inverse and truncate to the required mode. */
1229 do_divide (&u
, one
, r
);
1230 real_convert (&u
, mode
, &u
);
1232 /* The rounding may have overflowed. */
1233 if (u
.class != rvc_normal
)
1235 for (i
= 0; i
< SIGSZ
-1; ++i
)
1238 if (u
.sig
[SIGSZ
-1] != SIG_MSB
)
1245 /* Render R as an integer. */
1248 real_to_integer (const REAL_VALUE_TYPE
*r
)
1250 unsigned HOST_WIDE_INT i
;
1261 i
= (unsigned HOST_WIDE_INT
) 1 << (HOST_BITS_PER_WIDE_INT
- 1);
1269 /* Only force overflow for unsigned overflow. Signed overflow is
1270 undefined, so it doesn't matter what we return, and some callers
1271 expect to be able to use this routine for both signed and
1272 unsigned conversions. */
1273 if (r
->exp
> HOST_BITS_PER_WIDE_INT
)
1276 if (HOST_BITS_PER_WIDE_INT
== HOST_BITS_PER_LONG
)
1277 i
= r
->sig
[SIGSZ
-1];
1278 else if (HOST_BITS_PER_WIDE_INT
== 2*HOST_BITS_PER_LONG
)
1280 i
= r
->sig
[SIGSZ
-1];
1281 i
= i
<< (HOST_BITS_PER_LONG
- 1) << 1;
1282 i
|= r
->sig
[SIGSZ
-2];
1287 i
>>= HOST_BITS_PER_WIDE_INT
- r
->exp
;
1298 /* Likewise, but to an integer pair, HI+LOW. */
1301 real_to_integer2 (HOST_WIDE_INT
*plow
, HOST_WIDE_INT
*phigh
,
1302 const REAL_VALUE_TYPE
*r
)
1305 HOST_WIDE_INT low
, high
;
1318 high
= (unsigned HOST_WIDE_INT
) 1 << (HOST_BITS_PER_WIDE_INT
- 1);
1332 /* Only force overflow for unsigned overflow. Signed overflow is
1333 undefined, so it doesn't matter what we return, and some callers
1334 expect to be able to use this routine for both signed and
1335 unsigned conversions. */
1336 if (exp
> 2*HOST_BITS_PER_WIDE_INT
)
1339 rshift_significand (&t
, r
, 2*HOST_BITS_PER_WIDE_INT
- exp
);
1340 if (HOST_BITS_PER_WIDE_INT
== HOST_BITS_PER_LONG
)
1342 high
= t
.sig
[SIGSZ
-1];
1343 low
= t
.sig
[SIGSZ
-2];
1345 else if (HOST_BITS_PER_WIDE_INT
== 2*HOST_BITS_PER_LONG
)
1347 high
= t
.sig
[SIGSZ
-1];
1348 high
= high
<< (HOST_BITS_PER_LONG
- 1) << 1;
1349 high
|= t
.sig
[SIGSZ
-2];
1351 low
= t
.sig
[SIGSZ
-3];
1352 low
= low
<< (HOST_BITS_PER_LONG
- 1) << 1;
1353 low
|= t
.sig
[SIGSZ
-4];
1363 low
= -low
, high
= ~high
;
1375 /* A subroutine of real_to_decimal. Compute the quotient and remainder
1376 of NUM / DEN. Return the quotient and place the remainder in NUM.
1377 It is expected that NUM / DEN are close enough that the quotient is
1380 static unsigned long
1381 rtd_divmod (REAL_VALUE_TYPE
*num
, REAL_VALUE_TYPE
*den
)
1383 unsigned long q
, msb
;
1384 int expn
= num
->exp
, expd
= den
->exp
;
1393 msb
= num
->sig
[SIGSZ
-1] & SIG_MSB
;
1395 lshift_significand_1 (num
, num
);
1397 if (msb
|| cmp_significands (num
, den
) >= 0)
1399 sub_significands (num
, num
, den
, 0);
1403 while (--expn
>= expd
);
1411 /* Render R as a decimal floating point constant. Emit DIGITS significant
1412 digits in the result, bounded by BUF_SIZE. If DIGITS is 0, choose the
1413 maximum for the representation. If CROP_TRAILING_ZEROS, strip trailing
1416 #define M_LOG10_2 0.30102999566398119521
1419 real_to_decimal (char *str
, const REAL_VALUE_TYPE
*r_orig
, size_t buf_size
,
1420 size_t digits
, int crop_trailing_zeros
)
1422 const REAL_VALUE_TYPE
*one
, *ten
;
1423 REAL_VALUE_TYPE r
, pten
, u
, v
;
1424 int dec_exp
, cmp_one
, digit
;
1426 char *p
, *first
, *last
;
1433 strcpy (str
, (r
.sign
? "-0.0" : "0.0"));
1438 strcpy (str
, (r
.sign
? "-Inf" : "+Inf"));
1441 /* ??? Print the significand as well, if not canonical? */
1442 strcpy (str
, (r
.sign
? "-NaN" : "+NaN"));
1448 /* Bound the number of digits printed by the size of the representation. */
1449 max_digits
= SIGNIFICAND_BITS
* M_LOG10_2
;
1450 if (digits
== 0 || digits
> max_digits
)
1451 digits
= max_digits
;
1453 /* Estimate the decimal exponent, and compute the length of the string it
1454 will print as. Be conservative and add one to account for possible
1455 overflow or rounding error. */
1456 dec_exp
= r
.exp
* M_LOG10_2
;
1457 for (max_digits
= 1; dec_exp
; max_digits
++)
1460 /* Bound the number of digits printed by the size of the output buffer. */
1461 max_digits
= buf_size
- 1 - 1 - 2 - max_digits
- 1;
1462 if (max_digits
> buf_size
)
1464 if (digits
> max_digits
)
1465 digits
= max_digits
;
1467 one
= real_digit (1);
1468 ten
= ten_to_ptwo (0);
1476 cmp_one
= do_compare (&r
, one
, 0);
1481 /* Number is greater than one. Convert significand to an integer
1482 and strip trailing decimal zeros. */
1485 u
.exp
= SIGNIFICAND_BITS
- 1;
1487 /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS. */
1488 m
= floor_log2 (max_digits
);
1490 /* Iterate over the bits of the possible powers of 10 that might
1491 be present in U and eliminate them. That is, if we find that
1492 10**2**M divides U evenly, keep the division and increase
1498 do_divide (&t
, &u
, ten_to_ptwo (m
));
1499 do_fix_trunc (&v
, &t
);
1500 if (cmp_significands (&v
, &t
) == 0)
1508 /* Revert the scaling to integer that we performed earlier. */
1509 u
.exp
+= r
.exp
- (SIGNIFICAND_BITS
- 1);
1512 /* Find power of 10. Do this by dividing out 10**2**M when
1513 this is larger than the current remainder. Fill PTEN with
1514 the power of 10 that we compute. */
1517 m
= floor_log2 ((int)(r
.exp
* M_LOG10_2
)) + 1;
1520 const REAL_VALUE_TYPE
*ptentwo
= ten_to_ptwo (m
);
1521 if (do_compare (&u
, ptentwo
, 0) >= 0)
1523 do_divide (&u
, &u
, ptentwo
);
1524 do_multiply (&pten
, &pten
, ptentwo
);
1531 /* We managed to divide off enough tens in the above reduction
1532 loop that we've now got a negative exponent. Fall into the
1533 less-than-one code to compute the proper value for PTEN. */
1540 /* Number is less than one. Pad significand with leading
1546 /* Stop if we'd shift bits off the bottom. */
1550 do_multiply (&u
, &v
, ten
);
1552 /* Stop if we're now >= 1. */
1561 /* Find power of 10. Do this by multiplying in P=10**2**M when
1562 the current remainder is smaller than 1/P. Fill PTEN with the
1563 power of 10 that we compute. */
1564 m
= floor_log2 ((int)(-r
.exp
* M_LOG10_2
)) + 1;
1567 const REAL_VALUE_TYPE
*ptentwo
= ten_to_ptwo (m
);
1568 const REAL_VALUE_TYPE
*ptenmtwo
= ten_to_mptwo (m
);
1570 if (do_compare (&v
, ptenmtwo
, 0) <= 0)
1572 do_multiply (&v
, &v
, ptentwo
);
1573 do_multiply (&pten
, &pten
, ptentwo
);
1579 /* Invert the positive power of 10 that we've collected so far. */
1580 do_divide (&pten
, one
, &pten
);
1588 /* At this point, PTEN should contain the nearest power of 10 smaller
1589 than R, such that this division produces the first digit.
1591 Using a divide-step primitive that returns the complete integral
1592 remainder avoids the rounding error that would be produced if
1593 we were to use do_divide here and then simply multiply by 10 for
1594 each subsequent digit. */
1596 digit
= rtd_divmod (&r
, &pten
);
1598 /* Be prepared for error in that division via underflow ... */
1599 if (digit
== 0 && cmp_significand_0 (&r
))
1601 /* Multiply by 10 and try again. */
1602 do_multiply (&r
, &r
, ten
);
1603 digit
= rtd_divmod (&r
, &pten
);
1609 /* ... or overflow. */
1617 else if (digit
> 10)
1622 /* Generate subsequent digits. */
1623 while (--digits
> 0)
1625 do_multiply (&r
, &r
, ten
);
1626 digit
= rtd_divmod (&r
, &pten
);
1631 /* Generate one more digit with which to do rounding. */
1632 do_multiply (&r
, &r
, ten
);
1633 digit
= rtd_divmod (&r
, &pten
);
1635 /* Round the result. */
1638 /* Round to nearest. If R is nonzero there are additional
1639 nonzero digits to be extracted. */
1640 if (cmp_significand_0 (&r
))
1642 /* Round to even. */
1643 else if ((p
[-1] - '0') & 1)
1660 /* Carry out of the first digit. This means we had all 9's and
1661 now have all 0's. "Prepend" a 1 by overwriting the first 0. */
1669 /* Insert the decimal point. */
1670 first
[0] = first
[1];
1673 /* If requested, drop trailing zeros. Never crop past "1.0". */
1674 if (crop_trailing_zeros
)
1675 while (last
> first
+ 3 && last
[-1] == '0')
1678 /* Append the exponent. */
1679 sprintf (last
, "e%+d", dec_exp
);
1682 /* Render R as a hexadecimal floating point constant. Emit DIGITS
1683 significant digits in the result, bounded by BUF_SIZE. If DIGITS is 0,
1684 choose the maximum for the representation. If CROP_TRAILING_ZEROS,
1685 strip trailing zeros. */
1688 real_to_hexadecimal (char *str
, const REAL_VALUE_TYPE
*r
, size_t buf_size
,
1689 size_t digits
, int crop_trailing_zeros
)
1691 int i
, j
, exp
= r
->exp
;
1704 strcpy (str
, (r
->sign
? "-Inf" : "+Inf"));
1707 /* ??? Print the significand as well, if not canonical? */
1708 strcpy (str
, (r
->sign
? "-NaN" : "+NaN"));
1715 digits
= SIGNIFICAND_BITS
/ 4;
1717 /* Bound the number of digits printed by the size of the output buffer. */
1719 sprintf (exp_buf
, "p%+d", exp
);
1720 max_digits
= buf_size
- strlen (exp_buf
) - r
->sign
- 4 - 1;
1721 if (max_digits
> buf_size
)
1723 if (digits
> max_digits
)
1724 digits
= max_digits
;
1735 for (i
= SIGSZ
- 1; i
>= 0; --i
)
1736 for (j
= HOST_BITS_PER_LONG
- 4; j
>= 0; j
-= 4)
1738 *p
++ = "0123456789abcdef"[(r
->sig
[i
] >> j
) & 15];
1744 if (crop_trailing_zeros
)
1745 while (p
> first
+ 1 && p
[-1] == '0')
1748 sprintf (p
, "p%+d", exp
);
1751 /* Initialize R from a decimal or hexadecimal string. The string is
1752 assumed to have been syntax checked already. */
1755 real_from_string (REAL_VALUE_TYPE
*r
, const char *str
)
1767 else if (*str
== '+')
1770 if (str
[0] == '0' && str
[1] == 'x')
1772 /* Hexadecimal floating point. */
1773 int pos
= SIGNIFICAND_BITS
- 4, d
;
1781 d
= hex_value (*str
);
1786 r
->sig
[pos
/ HOST_BITS_PER_LONG
]
1787 |= (unsigned long) d
<< (pos
% HOST_BITS_PER_LONG
);
1796 if (pos
== SIGNIFICAND_BITS
- 4)
1803 d
= hex_value (*str
);
1808 r
->sig
[pos
/ HOST_BITS_PER_LONG
]
1809 |= (unsigned long) d
<< (pos
% HOST_BITS_PER_LONG
);
1815 if (*str
== 'p' || *str
== 'P')
1817 bool exp_neg
= false;
1825 else if (*str
== '+')
1829 while (ISDIGIT (*str
))
1835 /* Overflowed the exponent. */
1849 r
->class = rvc_normal
;
1856 /* Decimal floating point. */
1857 const REAL_VALUE_TYPE
*ten
= ten_to_ptwo (0);
1862 while (ISDIGIT (*str
))
1865 do_multiply (r
, r
, ten
);
1867 do_add (r
, r
, real_digit (d
), 0);
1872 if (r
->class == rvc_zero
)
1877 while (ISDIGIT (*str
))
1880 do_multiply (r
, r
, ten
);
1882 do_add (r
, r
, real_digit (d
), 0);
1887 if (*str
== 'e' || *str
== 'E')
1889 bool exp_neg
= false;
1897 else if (*str
== '+')
1901 while (ISDIGIT (*str
))
1907 /* Overflowed the exponent. */
1921 times_pten (r
, exp
);
1936 /* Legacy. Similar, but return the result directly. */
1939 real_from_string2 (const char *s
, enum machine_mode mode
)
1943 real_from_string (&r
, s
);
1944 if (mode
!= VOIDmode
)
1945 real_convert (&r
, mode
, &r
);
1950 /* Initialize R from the integer pair HIGH+LOW. */
1953 real_from_integer (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
1954 unsigned HOST_WIDE_INT low
, HOST_WIDE_INT high
,
1957 if (low
== 0 && high
== 0)
1961 r
->class = rvc_normal
;
1962 r
->sign
= high
< 0 && !unsigned_p
;
1963 r
->exp
= 2 * HOST_BITS_PER_WIDE_INT
;
1974 if (HOST_BITS_PER_LONG
== HOST_BITS_PER_WIDE_INT
)
1976 r
->sig
[SIGSZ
-1] = high
;
1977 r
->sig
[SIGSZ
-2] = low
;
1978 memset (r
->sig
, 0, sizeof(long)*(SIGSZ
-2));
1980 else if (HOST_BITS_PER_LONG
*2 == HOST_BITS_PER_WIDE_INT
)
1982 r
->sig
[SIGSZ
-1] = high
>> (HOST_BITS_PER_LONG
- 1) >> 1;
1983 r
->sig
[SIGSZ
-2] = high
;
1984 r
->sig
[SIGSZ
-3] = low
>> (HOST_BITS_PER_LONG
- 1) >> 1;
1985 r
->sig
[SIGSZ
-4] = low
;
1987 memset (r
->sig
, 0, sizeof(long)*(SIGSZ
-4));
1995 if (mode
!= VOIDmode
)
1996 real_convert (r
, mode
, r
);
1999 /* Returns 10**2**N. */
2001 static const REAL_VALUE_TYPE
*
2004 static REAL_VALUE_TYPE tens
[EXP_BITS
];
2006 if (n
< 0 || n
>= EXP_BITS
)
2009 if (tens
[n
].class == rvc_zero
)
2011 if (n
< (HOST_BITS_PER_WIDE_INT
== 64 ? 5 : 4))
2013 HOST_WIDE_INT t
= 10;
2016 for (i
= 0; i
< n
; ++i
)
2019 real_from_integer (&tens
[n
], VOIDmode
, t
, 0, 1);
2023 const REAL_VALUE_TYPE
*t
= ten_to_ptwo (n
- 1);
2024 do_multiply (&tens
[n
], t
, t
);
2031 /* Returns 10**(-2**N). */
2033 static const REAL_VALUE_TYPE
*
2034 ten_to_mptwo (int n
)
2036 static REAL_VALUE_TYPE tens
[EXP_BITS
];
2038 if (n
< 0 || n
>= EXP_BITS
)
2041 if (tens
[n
].class == rvc_zero
)
2042 do_divide (&tens
[n
], real_digit (1), ten_to_ptwo (n
));
2049 static const REAL_VALUE_TYPE
*
2052 static REAL_VALUE_TYPE num
[10];
2057 if (n
> 0 && num
[n
].class == rvc_zero
)
2058 real_from_integer (&num
[n
], VOIDmode
, n
, 0, 1);
2063 /* Multiply R by 10**EXP. */
2066 times_pten (REAL_VALUE_TYPE
*r
, int exp
)
2068 REAL_VALUE_TYPE pten
, *rr
;
2069 bool negative
= (exp
< 0);
2075 pten
= *real_digit (1);
2081 for (i
= 0; exp
> 0; ++i
, exp
>>= 1)
2083 do_multiply (rr
, rr
, ten_to_ptwo (i
));
2086 do_divide (r
, r
, &pten
);
2089 /* Fills R with +Inf. */
2092 real_inf (REAL_VALUE_TYPE
*r
)
2097 /* Fills R with a NaN whose significand is described by STR. If QUIET,
2098 we force a QNaN, else we force an SNaN. The string, if not empty,
2099 is parsed as a number and placed in the significand. Return true
2100 if the string was successfully parsed. */
2103 real_nan (REAL_VALUE_TYPE
*r
, const char *str
, int quiet
,
2104 enum machine_mode mode
)
2106 const struct real_format
*fmt
;
2108 fmt
= real_format_for_mode
[mode
- QFmode
];
2115 get_canonical_qnan (r
, 0);
2117 get_canonical_snan (r
, 0);
2124 memset (r
, 0, sizeof (*r
));
2127 /* Parse akin to strtol into the significand of R. */
2129 while (ISSPACE (*str
))
2133 else if (*str
== '+')
2143 while ((d
= hex_value (*str
)) < base
)
2150 lshift_significand (r
, r
, 3);
2153 lshift_significand (r
, r
, 4);
2156 lshift_significand_1 (&u
, r
);
2157 lshift_significand (r
, r
, 3);
2158 add_significands (r
, r
, &u
);
2166 add_significands (r
, r
, &u
);
2171 /* Must have consumed the entire string for success. */
2175 /* Shift the significand into place such that the bits
2176 are in the most significant bits for the format. */
2177 lshift_significand (r
, r
, SIGNIFICAND_BITS
- fmt
->pnan
);
2179 /* Our MSB is always unset for NaNs. */
2180 r
->sig
[SIGSZ
-1] &= ~SIG_MSB
;
2182 /* Force quiet or signalling NaN. */
2183 r
->signalling
= !quiet
;
2189 /* Fills R with the largest finite value representable in mode MODE.
2190 If SIGN is nonzero, R is set to the most negative finite value. */
2193 real_maxval (REAL_VALUE_TYPE
*r
, int sign
, enum machine_mode mode
)
2195 const struct real_format
*fmt
;
2198 fmt
= real_format_for_mode
[mode
- QFmode
];
2202 r
->class = rvc_normal
;
2206 r
->exp
= fmt
->emax
* fmt
->log2_b
;
2208 np2
= SIGNIFICAND_BITS
- fmt
->p
* fmt
->log2_b
;
2209 memset (r
->sig
, -1, SIGSZ
* sizeof (unsigned long));
2210 clear_significand_below (r
, np2
);
2213 /* Fills R with 2**N. */
2216 real_2expN (REAL_VALUE_TYPE
*r
, int n
)
2218 memset (r
, 0, sizeof (*r
));
2223 else if (n
< -MAX_EXP
)
2227 r
->class = rvc_normal
;
2229 r
->sig
[SIGSZ
-1] = SIG_MSB
;
2235 round_for_format (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
)
2238 unsigned long sticky
;
2242 p2
= fmt
->p
* fmt
->log2_b
;
2243 emin2m1
= (fmt
->emin
- 1) * fmt
->log2_b
;
2244 emax2
= fmt
->emax
* fmt
->log2_b
;
2246 np2
= SIGNIFICAND_BITS
- p2
;
2250 get_zero (r
, r
->sign
);
2252 if (!fmt
->has_signed_zero
)
2257 get_inf (r
, r
->sign
);
2262 clear_significand_below (r
, np2
);
2272 /* If we're not base2, normalize the exponent to a multiple of
2274 if (fmt
->log2_b
!= 1)
2276 int shift
= r
->exp
& (fmt
->log2_b
- 1);
2279 shift
= fmt
->log2_b
- shift
;
2280 r
->sig
[0] |= sticky_rshift_significand (r
, r
, shift
);
2285 /* Check the range of the exponent. If we're out of range,
2286 either underflow or overflow. */
2289 else if (r
->exp
<= emin2m1
)
2293 if (!fmt
->has_denorm
)
2295 /* Don't underflow completely until we've had a chance to round. */
2296 if (r
->exp
< emin2m1
)
2301 diff
= emin2m1
- r
->exp
+ 1;
2305 /* De-normalize the significand. */
2306 r
->sig
[0] |= sticky_rshift_significand (r
, r
, diff
);
2311 /* There are P2 true significand bits, followed by one guard bit,
2312 followed by one sticky bit, followed by stuff. Fold nonzero
2313 stuff into the sticky bit. */
2316 for (i
= 0, w
= (np2
- 1) / HOST_BITS_PER_LONG
; i
< w
; ++i
)
2317 sticky
|= r
->sig
[i
];
2319 r
->sig
[w
] & (((unsigned long)1 << ((np2
- 1) % HOST_BITS_PER_LONG
)) - 1);
2321 guard
= test_significand_bit (r
, np2
- 1);
2322 lsb
= test_significand_bit (r
, np2
);
2324 /* Round to even. */
2325 if (guard
&& (sticky
|| lsb
))
2329 set_significand_bit (&u
, np2
);
2331 if (add_significands (r
, r
, &u
))
2333 /* Overflow. Means the significand had been all ones, and
2334 is now all zeros. Need to increase the exponent, and
2335 possibly re-normalize it. */
2336 if (++r
->exp
> emax2
)
2338 r
->sig
[SIGSZ
-1] = SIG_MSB
;
2340 if (fmt
->log2_b
!= 1)
2342 int shift
= r
->exp
& (fmt
->log2_b
- 1);
2345 shift
= fmt
->log2_b
- shift
;
2346 rshift_significand (r
, r
, shift
);
2355 /* Catch underflow that we deferred until after rounding. */
2356 if (r
->exp
<= emin2m1
)
2359 /* Clear out trailing garbage. */
2360 clear_significand_below (r
, np2
);
2363 /* Extend or truncate to a new mode. */
2366 real_convert (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
2367 const REAL_VALUE_TYPE
*a
)
2369 const struct real_format
*fmt
;
2371 fmt
= real_format_for_mode
[mode
- QFmode
];
2376 round_for_format (fmt
, r
);
2378 /* round_for_format de-normalizes denormals. Undo just that part. */
2379 if (r
->class == rvc_normal
)
2383 /* Legacy. Likewise, except return the struct directly. */
2386 real_value_truncate (enum machine_mode mode
, REAL_VALUE_TYPE a
)
2389 real_convert (&r
, mode
, &a
);
2393 /* Return true if truncating to MODE is exact. */
2396 exact_real_truncate (enum machine_mode mode
, const REAL_VALUE_TYPE
*a
)
2399 real_convert (&t
, mode
, a
);
2400 return real_identical (&t
, a
);
2403 /* Write R to the given target format. Place the words of the result
2404 in target word order in BUF. There are always 32 bits in each
2405 long, no matter the size of the host long.
2407 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2410 real_to_target_fmt (long *buf
, const REAL_VALUE_TYPE
*r_orig
,
2411 const struct real_format
*fmt
)
2417 round_for_format (fmt
, &r
);
2421 (*fmt
->encode
) (fmt
, buf
, &r
);
2426 /* Similar, but look up the format from MODE. */
2429 real_to_target (long *buf
, const REAL_VALUE_TYPE
*r
, enum machine_mode mode
)
2431 const struct real_format
*fmt
;
2433 fmt
= real_format_for_mode
[mode
- QFmode
];
2437 return real_to_target_fmt (buf
, r
, fmt
);
2440 /* Read R from the given target format. Read the words of the result
2441 in target word order in BUF. There are always 32 bits in each
2442 long, no matter the size of the host long. */
2445 real_from_target_fmt (REAL_VALUE_TYPE
*r
, const long *buf
,
2446 const struct real_format
*fmt
)
2448 (*fmt
->decode
) (fmt
, r
, buf
);
2451 /* Similar, but look up the format from MODE. */
2454 real_from_target (REAL_VALUE_TYPE
*r
, const long *buf
, enum machine_mode mode
)
2456 const struct real_format
*fmt
;
2458 fmt
= real_format_for_mode
[mode
- QFmode
];
2462 (*fmt
->decode
) (fmt
, r
, buf
);
2465 /* Return the number of bits in the significand for MODE. */
2466 /* ??? Legacy. Should get access to real_format directly. */
2469 significand_size (enum machine_mode mode
)
2471 const struct real_format
*fmt
;
2473 fmt
= real_format_for_mode
[mode
- QFmode
];
2477 return fmt
->p
* fmt
->log2_b
;
2480 /* Return a hash value for the given real value. */
2481 /* ??? The "unsigned int" return value is intended to be hashval_t,
2482 but I didn't want to pull hashtab.h into real.h. */
2485 real_hash (const REAL_VALUE_TYPE
*r
)
2490 h
= r
->class | (r
->sign
<< 2);
2503 h
^= (unsigned int)-1;
2512 if (sizeof(unsigned long) > sizeof(unsigned int))
2513 for (i
= 0; i
< SIGSZ
; ++i
)
2515 unsigned long s
= r
->sig
[i
];
2516 h
^= s
^ (s
>> (HOST_BITS_PER_LONG
/ 2));
2519 for (i
= 0; i
< SIGSZ
; ++i
)
2525 /* IEEE single-precision format. */
2527 static void encode_ieee_single (const struct real_format
*fmt
,
2528 long *, const REAL_VALUE_TYPE
*);
2529 static void decode_ieee_single (const struct real_format
*,
2530 REAL_VALUE_TYPE
*, const long *);
2533 encode_ieee_single (const struct real_format
*fmt
, long *buf
,
2534 const REAL_VALUE_TYPE
*r
)
2536 unsigned long image
, sig
, exp
;
2537 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
2539 image
= r
->sign
<< 31;
2540 sig
= (r
->sig
[SIGSZ
-1] >> (HOST_BITS_PER_LONG
- 24)) & 0x7fffff;
2551 image
|= 0x7fffffff;
2559 if (r
->signalling
== fmt
->qnan_msb_set
)
2563 /* We overload qnan_msb_set here: it's only clear for
2564 mips_ieee_single, which wants all mantissa bits but the
2565 quiet/signalling one set in canonical NaNs (at least
2567 if (r
->canonical
&& !fmt
->qnan_msb_set
)
2568 sig
|= (1 << 22) - 1;
2576 image
|= 0x7fffffff;
2580 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2581 whereas the intermediate representation is 0.F x 2**exp.
2582 Which means we're off by one. */
2586 exp
= r
->exp
+ 127 - 1;
2599 decode_ieee_single (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
2602 unsigned long image
= buf
[0] & 0xffffffff;
2603 bool sign
= (image
>> 31) & 1;
2604 int exp
= (image
>> 23) & 0xff;
2606 memset (r
, 0, sizeof (*r
));
2607 image
<<= HOST_BITS_PER_LONG
- 24;
2612 if (image
&& fmt
->has_denorm
)
2614 r
->class = rvc_normal
;
2617 r
->sig
[SIGSZ
-1] = image
<< 1;
2620 else if (fmt
->has_signed_zero
)
2623 else if (exp
== 255 && (fmt
->has_nans
|| fmt
->has_inf
))
2629 r
->signalling
= (((image
>> (HOST_BITS_PER_LONG
- 2)) & 1)
2630 ^ fmt
->qnan_msb_set
);
2631 r
->sig
[SIGSZ
-1] = image
;
2641 r
->class = rvc_normal
;
2643 r
->exp
= exp
- 127 + 1;
2644 r
->sig
[SIGSZ
-1] = image
| SIG_MSB
;
2648 const struct real_format ieee_single_format
=
2666 const struct real_format mips_single_format
=
2685 /* IEEE double-precision format. */
2687 static void encode_ieee_double (const struct real_format
*fmt
,
2688 long *, const REAL_VALUE_TYPE
*);
2689 static void decode_ieee_double (const struct real_format
*,
2690 REAL_VALUE_TYPE
*, const long *);
2693 encode_ieee_double (const struct real_format
*fmt
, long *buf
,
2694 const REAL_VALUE_TYPE
*r
)
2696 unsigned long image_lo
, image_hi
, sig_lo
, sig_hi
, exp
;
2697 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
2699 image_hi
= r
->sign
<< 31;
2702 if (HOST_BITS_PER_LONG
== 64)
2704 sig_hi
= r
->sig
[SIGSZ
-1];
2705 sig_lo
= (sig_hi
>> (64 - 53)) & 0xffffffff;
2706 sig_hi
= (sig_hi
>> (64 - 53 + 1) >> 31) & 0xfffff;
2710 sig_hi
= r
->sig
[SIGSZ
-1];
2711 sig_lo
= r
->sig
[SIGSZ
-2];
2712 sig_lo
= (sig_hi
<< 21) | (sig_lo
>> 11);
2713 sig_hi
= (sig_hi
>> 11) & 0xfffff;
2723 image_hi
|= 2047 << 20;
2726 image_hi
|= 0x7fffffff;
2727 image_lo
= 0xffffffff;
2735 sig_hi
= sig_lo
= 0;
2736 if (r
->signalling
== fmt
->qnan_msb_set
)
2737 sig_hi
&= ~(1 << 19);
2740 /* We overload qnan_msb_set here: it's only clear for
2741 mips_ieee_single, which wants all mantissa bits but the
2742 quiet/signalling one set in canonical NaNs (at least
2744 if (r
->canonical
&& !fmt
->qnan_msb_set
)
2746 sig_hi
|= (1 << 19) - 1;
2747 sig_lo
= 0xffffffff;
2749 else if (sig_hi
== 0 && sig_lo
== 0)
2752 image_hi
|= 2047 << 20;
2758 image_hi
|= 0x7fffffff;
2759 image_lo
= 0xffffffff;
2764 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2765 whereas the intermediate representation is 0.F x 2**exp.
2766 Which means we're off by one. */
2770 exp
= r
->exp
+ 1023 - 1;
2771 image_hi
|= exp
<< 20;
2780 if (FLOAT_WORDS_BIG_ENDIAN
)
2781 buf
[0] = image_hi
, buf
[1] = image_lo
;
2783 buf
[0] = image_lo
, buf
[1] = image_hi
;
2787 decode_ieee_double (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
2790 unsigned long image_hi
, image_lo
;
2794 if (FLOAT_WORDS_BIG_ENDIAN
)
2795 image_hi
= buf
[0], image_lo
= buf
[1];
2797 image_lo
= buf
[0], image_hi
= buf
[1];
2798 image_lo
&= 0xffffffff;
2799 image_hi
&= 0xffffffff;
2801 sign
= (image_hi
>> 31) & 1;
2802 exp
= (image_hi
>> 20) & 0x7ff;
2804 memset (r
, 0, sizeof (*r
));
2806 image_hi
<<= 32 - 21;
2807 image_hi
|= image_lo
>> 21;
2808 image_hi
&= 0x7fffffff;
2809 image_lo
<<= 32 - 21;
2813 if ((image_hi
|| image_lo
) && fmt
->has_denorm
)
2815 r
->class = rvc_normal
;
2818 if (HOST_BITS_PER_LONG
== 32)
2820 image_hi
= (image_hi
<< 1) | (image_lo
>> 31);
2822 r
->sig
[SIGSZ
-1] = image_hi
;
2823 r
->sig
[SIGSZ
-2] = image_lo
;
2827 image_hi
= (image_hi
<< 31 << 2) | (image_lo
<< 1);
2828 r
->sig
[SIGSZ
-1] = image_hi
;
2832 else if (fmt
->has_signed_zero
)
2835 else if (exp
== 2047 && (fmt
->has_nans
|| fmt
->has_inf
))
2837 if (image_hi
|| image_lo
)
2841 r
->signalling
= ((image_hi
>> 30) & 1) ^ fmt
->qnan_msb_set
;
2842 if (HOST_BITS_PER_LONG
== 32)
2844 r
->sig
[SIGSZ
-1] = image_hi
;
2845 r
->sig
[SIGSZ
-2] = image_lo
;
2848 r
->sig
[SIGSZ
-1] = (image_hi
<< 31 << 1) | image_lo
;
2858 r
->class = rvc_normal
;
2860 r
->exp
= exp
- 1023 + 1;
2861 if (HOST_BITS_PER_LONG
== 32)
2863 r
->sig
[SIGSZ
-1] = image_hi
| SIG_MSB
;
2864 r
->sig
[SIGSZ
-2] = image_lo
;
2867 r
->sig
[SIGSZ
-1] = (image_hi
<< 31 << 1) | image_lo
| SIG_MSB
;
2871 const struct real_format ieee_double_format
=
2889 const struct real_format mips_double_format
=
2908 /* IEEE extended double precision format. This comes in three
2909 flavors: Intel's as a 12 byte image, Intel's as a 16 byte image,
2912 static void encode_ieee_extended (const struct real_format
*fmt
,
2913 long *, const REAL_VALUE_TYPE
*);
2914 static void decode_ieee_extended (const struct real_format
*,
2915 REAL_VALUE_TYPE
*, const long *);
2917 static void encode_ieee_extended_128 (const struct real_format
*fmt
,
2918 long *, const REAL_VALUE_TYPE
*);
2919 static void decode_ieee_extended_128 (const struct real_format
*,
2920 REAL_VALUE_TYPE
*, const long *);
2923 encode_ieee_extended (const struct real_format
*fmt
, long *buf
,
2924 const REAL_VALUE_TYPE
*r
)
2926 unsigned long image_hi
, sig_hi
, sig_lo
;
2927 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
2929 image_hi
= r
->sign
<< 15;
2930 sig_hi
= sig_lo
= 0;
2942 /* Intel requires the explicit integer bit to be set, otherwise
2943 it considers the value a "pseudo-infinity". Motorola docs
2944 say it doesn't care. */
2945 sig_hi
= 0x80000000;
2950 sig_lo
= sig_hi
= 0xffffffff;
2958 if (HOST_BITS_PER_LONG
== 32)
2960 sig_hi
= r
->sig
[SIGSZ
-1];
2961 sig_lo
= r
->sig
[SIGSZ
-2];
2965 sig_lo
= r
->sig
[SIGSZ
-1];
2966 sig_hi
= sig_lo
>> 31 >> 1;
2967 sig_lo
&= 0xffffffff;
2969 if (r
->signalling
== fmt
->qnan_msb_set
)
2970 sig_hi
&= ~(1 << 30);
2973 if ((sig_hi
& 0x7fffffff) == 0 && sig_lo
== 0)
2976 /* Intel requires the explicit integer bit to be set, otherwise
2977 it considers the value a "pseudo-nan". Motorola docs say it
2979 sig_hi
|= 0x80000000;
2984 sig_lo
= sig_hi
= 0xffffffff;
2992 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2993 whereas the intermediate representation is 0.F x 2**exp.
2994 Which means we're off by one.
2996 Except for Motorola, which consider exp=0 and explicit
2997 integer bit set to continue to be normalized. In theory
2998 this discrepancy has been taken care of by the difference
2999 in fmt->emin in round_for_format. */
3011 if (HOST_BITS_PER_LONG
== 32)
3013 sig_hi
= r
->sig
[SIGSZ
-1];
3014 sig_lo
= r
->sig
[SIGSZ
-2];
3018 sig_lo
= r
->sig
[SIGSZ
-1];
3019 sig_hi
= sig_lo
>> 31 >> 1;
3020 sig_lo
&= 0xffffffff;
3029 if (FLOAT_WORDS_BIG_ENDIAN
)
3030 buf
[0] = image_hi
<< 16, buf
[1] = sig_hi
, buf
[2] = sig_lo
;
3032 buf
[0] = sig_lo
, buf
[1] = sig_hi
, buf
[2] = image_hi
;
3036 encode_ieee_extended_128 (const struct real_format
*fmt
, long *buf
,
3037 const REAL_VALUE_TYPE
*r
)
3039 buf
[3 * !FLOAT_WORDS_BIG_ENDIAN
] = 0;
3040 encode_ieee_extended (fmt
, buf
+!!FLOAT_WORDS_BIG_ENDIAN
, r
);
3044 decode_ieee_extended (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3047 unsigned long image_hi
, sig_hi
, sig_lo
;
3051 if (FLOAT_WORDS_BIG_ENDIAN
)
3052 image_hi
= buf
[0] >> 16, sig_hi
= buf
[1], sig_lo
= buf
[2];
3054 sig_lo
= buf
[0], sig_hi
= buf
[1], image_hi
= buf
[2];
3055 sig_lo
&= 0xffffffff;
3056 sig_hi
&= 0xffffffff;
3057 image_hi
&= 0xffffffff;
3059 sign
= (image_hi
>> 15) & 1;
3060 exp
= image_hi
& 0x7fff;
3062 memset (r
, 0, sizeof (*r
));
3066 if ((sig_hi
|| sig_lo
) && fmt
->has_denorm
)
3068 r
->class = rvc_normal
;
3071 /* When the IEEE format contains a hidden bit, we know that
3072 it's zero at this point, and so shift up the significand
3073 and decrease the exponent to match. In this case, Motorola
3074 defines the explicit integer bit to be valid, so we don't
3075 know whether the msb is set or not. */
3077 if (HOST_BITS_PER_LONG
== 32)
3079 r
->sig
[SIGSZ
-1] = sig_hi
;
3080 r
->sig
[SIGSZ
-2] = sig_lo
;
3083 r
->sig
[SIGSZ
-1] = (sig_hi
<< 31 << 1) | sig_lo
;
3087 else if (fmt
->has_signed_zero
)
3090 else if (exp
== 32767 && (fmt
->has_nans
|| fmt
->has_inf
))
3092 /* See above re "pseudo-infinities" and "pseudo-nans".
3093 Short summary is that the MSB will likely always be
3094 set, and that we don't care about it. */
3095 sig_hi
&= 0x7fffffff;
3097 if (sig_hi
|| sig_lo
)
3101 r
->signalling
= ((sig_hi
>> 30) & 1) ^ fmt
->qnan_msb_set
;
3102 if (HOST_BITS_PER_LONG
== 32)
3104 r
->sig
[SIGSZ
-1] = sig_hi
;
3105 r
->sig
[SIGSZ
-2] = sig_lo
;
3108 r
->sig
[SIGSZ
-1] = (sig_hi
<< 31 << 1) | sig_lo
;
3118 r
->class = rvc_normal
;
3120 r
->exp
= exp
- 16383 + 1;
3121 if (HOST_BITS_PER_LONG
== 32)
3123 r
->sig
[SIGSZ
-1] = sig_hi
;
3124 r
->sig
[SIGSZ
-2] = sig_lo
;
3127 r
->sig
[SIGSZ
-1] = (sig_hi
<< 31 << 1) | sig_lo
;
3132 decode_ieee_extended_128 (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3135 decode_ieee_extended (fmt
, r
, buf
+!!FLOAT_WORDS_BIG_ENDIAN
);
3138 const struct real_format ieee_extended_motorola_format
=
3140 encode_ieee_extended
,
3141 decode_ieee_extended
,
3156 const struct real_format ieee_extended_intel_96_format
=
3158 encode_ieee_extended
,
3159 decode_ieee_extended
,
3174 const struct real_format ieee_extended_intel_128_format
=
3176 encode_ieee_extended_128
,
3177 decode_ieee_extended_128
,
3192 /* The following caters to i386 systems that set the rounding precision
3193 to 53 bits instead of 64, e.g. FreeBSD. */
3194 const struct real_format ieee_extended_intel_96_round_53_format
=
3196 encode_ieee_extended
,
3197 decode_ieee_extended
,
3212 /* IBM 128-bit extended precision format: a pair of IEEE double precision
3213 numbers whose sum is equal to the extended precision value. The number
3214 with greater magnitude is first. This format has the same magnitude
3215 range as an IEEE double precision value, but effectively 106 bits of
3216 significand precision. Infinity and NaN are represented by their IEEE
3217 double precision value stored in the first number, the second number is
3218 ignored. Zeroes, Infinities, and NaNs are set in both doubles
3219 due to precedent. */
3221 static void encode_ibm_extended (const struct real_format
*fmt
,
3222 long *, const REAL_VALUE_TYPE
*);
3223 static void decode_ibm_extended (const struct real_format
*,
3224 REAL_VALUE_TYPE
*, const long *);
3227 encode_ibm_extended (const struct real_format
*fmt
, long *buf
,
3228 const REAL_VALUE_TYPE
*r
)
3230 REAL_VALUE_TYPE u
, v
;
3231 const struct real_format
*base_fmt
;
3233 base_fmt
= fmt
->qnan_msb_set
? &ieee_double_format
: &mips_double_format
;
3238 /* Both doubles have sign bit set. */
3239 buf
[0] = FLOAT_WORDS_BIG_ENDIAN
? r
->sign
<< 31 : 0;
3240 buf
[1] = FLOAT_WORDS_BIG_ENDIAN
? 0 : r
->sign
<< 31;
3247 /* Both doubles set to Inf / NaN. */
3248 encode_ieee_double (base_fmt
, &buf
[0], r
);
3254 /* u = IEEE double precision portion of significand. */
3256 clear_significand_below (&u
, SIGNIFICAND_BITS
- 53);
3259 /* If the upper double is zero, we have a denormal double, so
3260 move it to the first double and leave the second as zero. */
3261 if (u
.class == rvc_zero
)
3269 /* v = remainder containing additional 53 bits of significand. */
3270 do_add (&v
, r
, &u
, 1);
3271 round_for_format (base_fmt
, &v
);
3274 round_for_format (base_fmt
, &u
);
3276 encode_ieee_double (base_fmt
, &buf
[0], &u
);
3277 encode_ieee_double (base_fmt
, &buf
[2], &v
);
3286 decode_ibm_extended (const struct real_format
*fmt ATTRIBUTE_UNUSED
, REAL_VALUE_TYPE
*r
,
3289 REAL_VALUE_TYPE u
, v
;
3290 const struct real_format
*base_fmt
;
3292 base_fmt
= fmt
->qnan_msb_set
? &ieee_double_format
: &mips_double_format
;
3293 decode_ieee_double (base_fmt
, &u
, &buf
[0]);
3295 if (u
.class != rvc_zero
&& u
.class != rvc_inf
&& u
.class != rvc_nan
)
3297 decode_ieee_double (base_fmt
, &v
, &buf
[2]);
3298 do_add (r
, &u
, &v
, 0);
3304 const struct real_format ibm_extended_format
=
3306 encode_ibm_extended
,
3307 decode_ibm_extended
,
3322 const struct real_format mips_extended_format
=
3324 encode_ibm_extended
,
3325 decode_ibm_extended
,
3341 /* IEEE quad precision format. */
3343 static void encode_ieee_quad (const struct real_format
*fmt
,
3344 long *, const REAL_VALUE_TYPE
*);
3345 static void decode_ieee_quad (const struct real_format
*,
3346 REAL_VALUE_TYPE
*, const long *);
3349 encode_ieee_quad (const struct real_format
*fmt
, long *buf
,
3350 const REAL_VALUE_TYPE
*r
)
3352 unsigned long image3
, image2
, image1
, image0
, exp
;
3353 bool denormal
= (r
->sig
[SIGSZ
-1] & SIG_MSB
) == 0;
3356 image3
= r
->sign
<< 31;
3361 rshift_significand (&u
, r
, SIGNIFICAND_BITS
- 113);
3370 image3
|= 32767 << 16;
3373 image3
|= 0x7fffffff;
3374 image2
= 0xffffffff;
3375 image1
= 0xffffffff;
3376 image0
= 0xffffffff;
3383 image3
|= 32767 << 16;
3387 /* Don't use bits from the significand. The
3388 initialization above is right. */
3390 else if (HOST_BITS_PER_LONG
== 32)
3395 image3
|= u
.sig
[3] & 0xffff;
3400 image1
= image0
>> 31 >> 1;
3402 image3
|= (image2
>> 31 >> 1) & 0xffff;
3403 image0
&= 0xffffffff;
3404 image2
&= 0xffffffff;
3406 if (r
->signalling
== fmt
->qnan_msb_set
)
3410 /* We overload qnan_msb_set here: it's only clear for
3411 mips_ieee_single, which wants all mantissa bits but the
3412 quiet/signalling one set in canonical NaNs (at least
3414 if (r
->canonical
&& !fmt
->qnan_msb_set
)
3417 image2
= image1
= image0
= 0xffffffff;
3419 else if (((image3
& 0xffff) | image2
| image1
| image0
) == 0)
3424 image3
|= 0x7fffffff;
3425 image2
= 0xffffffff;
3426 image1
= 0xffffffff;
3427 image0
= 0xffffffff;
3432 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3433 whereas the intermediate representation is 0.F x 2**exp.
3434 Which means we're off by one. */
3438 exp
= r
->exp
+ 16383 - 1;
3439 image3
|= exp
<< 16;
3441 if (HOST_BITS_PER_LONG
== 32)
3446 image3
|= u
.sig
[3] & 0xffff;
3451 image1
= image0
>> 31 >> 1;
3453 image3
|= (image2
>> 31 >> 1) & 0xffff;
3454 image0
&= 0xffffffff;
3455 image2
&= 0xffffffff;
3463 if (FLOAT_WORDS_BIG_ENDIAN
)
3480 decode_ieee_quad (const struct real_format
*fmt
, REAL_VALUE_TYPE
*r
,
3483 unsigned long image3
, image2
, image1
, image0
;
3487 if (FLOAT_WORDS_BIG_ENDIAN
)
3501 image0
&= 0xffffffff;
3502 image1
&= 0xffffffff;
3503 image2
&= 0xffffffff;
3505 sign
= (image3
>> 31) & 1;
3506 exp
= (image3
>> 16) & 0x7fff;
3509 memset (r
, 0, sizeof (*r
));
3513 if ((image3
| image2
| image1
| image0
) && fmt
->has_denorm
)
3515 r
->class = rvc_normal
;
3518 r
->exp
= -16382 + (SIGNIFICAND_BITS
- 112);
3519 if (HOST_BITS_PER_LONG
== 32)
3528 r
->sig
[0] = (image1
<< 31 << 1) | image0
;
3529 r
->sig
[1] = (image3
<< 31 << 1) | image2
;
3534 else if (fmt
->has_signed_zero
)
3537 else if (exp
== 32767 && (fmt
->has_nans
|| fmt
->has_inf
))
3539 if (image3
| image2
| image1
| image0
)
3543 r
->signalling
= ((image3
>> 15) & 1) ^ fmt
->qnan_msb_set
;
3545 if (HOST_BITS_PER_LONG
== 32)
3554 r
->sig
[0] = (image1
<< 31 << 1) | image0
;
3555 r
->sig
[1] = (image3
<< 31 << 1) | image2
;
3557 lshift_significand (r
, r
, SIGNIFICAND_BITS
- 113);
3567 r
->class = rvc_normal
;
3569 r
->exp
= exp
- 16383 + 1;
3571 if (HOST_BITS_PER_LONG
== 32)
3580 r
->sig
[0] = (image1
<< 31 << 1) | image0
;
3581 r
->sig
[1] = (image3
<< 31 << 1) | image2
;
3583 lshift_significand (r
, r
, SIGNIFICAND_BITS
- 113);
3584 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
3588 const struct real_format ieee_quad_format
=
3606 const struct real_format mips_quad_format
=
3624 /* Descriptions of VAX floating point formats can be found beginning at
3626 http://www.openvms.compaq.com:8000/73final/4515/4515pro_013.html#f_floating_point_format
3628 The thing to remember is that they're almost IEEE, except for word
3629 order, exponent bias, and the lack of infinities, nans, and denormals.
3631 We don't implement the H_floating format here, simply because neither
3632 the VAX or Alpha ports use it. */
3634 static void encode_vax_f (const struct real_format
*fmt
,
3635 long *, const REAL_VALUE_TYPE
*);
3636 static void decode_vax_f (const struct real_format
*,
3637 REAL_VALUE_TYPE
*, const long *);
3638 static void encode_vax_d (const struct real_format
*fmt
,
3639 long *, const REAL_VALUE_TYPE
*);
3640 static void decode_vax_d (const struct real_format
*,
3641 REAL_VALUE_TYPE
*, const long *);
3642 static void encode_vax_g (const struct real_format
*fmt
,
3643 long *, const REAL_VALUE_TYPE
*);
3644 static void decode_vax_g (const struct real_format
*,
3645 REAL_VALUE_TYPE
*, const long *);
3648 encode_vax_f (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
3649 const REAL_VALUE_TYPE
*r
)
3651 unsigned long sign
, exp
, sig
, image
;
3653 sign
= r
->sign
<< 15;
3663 image
= 0xffff7fff | sign
;
3667 sig
= (r
->sig
[SIGSZ
-1] >> (HOST_BITS_PER_LONG
- 24)) & 0x7fffff;
3670 image
= (sig
<< 16) & 0xffff0000;
3684 decode_vax_f (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
3685 REAL_VALUE_TYPE
*r
, const long *buf
)
3687 unsigned long image
= buf
[0] & 0xffffffff;
3688 int exp
= (image
>> 7) & 0xff;
3690 memset (r
, 0, sizeof (*r
));
3694 r
->class = rvc_normal
;
3695 r
->sign
= (image
>> 15) & 1;
3698 image
= ((image
& 0x7f) << 16) | ((image
>> 16) & 0xffff);
3699 r
->sig
[SIGSZ
-1] = (image
<< (HOST_BITS_PER_LONG
- 24)) | SIG_MSB
;
3704 encode_vax_d (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
3705 const REAL_VALUE_TYPE
*r
)
3707 unsigned long image0
, image1
, sign
= r
->sign
<< 15;
3712 image0
= image1
= 0;
3717 image0
= 0xffff7fff | sign
;
3718 image1
= 0xffffffff;
3722 /* Extract the significand into straight hi:lo. */
3723 if (HOST_BITS_PER_LONG
== 64)
3725 image0
= r
->sig
[SIGSZ
-1];
3726 image1
= (image0
>> (64 - 56)) & 0xffffffff;
3727 image0
= (image0
>> (64 - 56 + 1) >> 31) & 0x7fffff;
3731 image0
= r
->sig
[SIGSZ
-1];
3732 image1
= r
->sig
[SIGSZ
-2];
3733 image1
= (image0
<< 24) | (image1
>> 8);
3734 image0
= (image0
>> 8) & 0xffffff;
3737 /* Rearrange the half-words of the significand to match the
3739 image0
= ((image0
<< 16) | (image0
>> 16)) & 0xffff007f;
3740 image1
= ((image1
<< 16) | (image1
>> 16)) & 0xffffffff;
3742 /* Add the sign and exponent. */
3744 image0
|= (r
->exp
+ 128) << 7;
3751 if (FLOAT_WORDS_BIG_ENDIAN
)
3752 buf
[0] = image1
, buf
[1] = image0
;
3754 buf
[0] = image0
, buf
[1] = image1
;
3758 decode_vax_d (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
3759 REAL_VALUE_TYPE
*r
, const long *buf
)
3761 unsigned long image0
, image1
;
3764 if (FLOAT_WORDS_BIG_ENDIAN
)
3765 image1
= buf
[0], image0
= buf
[1];
3767 image0
= buf
[0], image1
= buf
[1];
3768 image0
&= 0xffffffff;
3769 image1
&= 0xffffffff;
3771 exp
= (image0
>> 7) & 0x7f;
3773 memset (r
, 0, sizeof (*r
));
3777 r
->class = rvc_normal
;
3778 r
->sign
= (image0
>> 15) & 1;
3781 /* Rearrange the half-words of the external format into
3782 proper ascending order. */
3783 image0
= ((image0
& 0x7f) << 16) | ((image0
>> 16) & 0xffff);
3784 image1
= ((image1
& 0xffff) << 16) | ((image1
>> 16) & 0xffff);
3786 if (HOST_BITS_PER_LONG
== 64)
3788 image0
= (image0
<< 31 << 1) | image1
;
3791 r
->sig
[SIGSZ
-1] = image0
;
3795 r
->sig
[SIGSZ
-1] = image0
;
3796 r
->sig
[SIGSZ
-2] = image1
;
3797 lshift_significand (r
, r
, 2*HOST_BITS_PER_LONG
- 56);
3798 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
3804 encode_vax_g (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
3805 const REAL_VALUE_TYPE
*r
)
3807 unsigned long image0
, image1
, sign
= r
->sign
<< 15;
3812 image0
= image1
= 0;
3817 image0
= 0xffff7fff | sign
;
3818 image1
= 0xffffffff;
3822 /* Extract the significand into straight hi:lo. */
3823 if (HOST_BITS_PER_LONG
== 64)
3825 image0
= r
->sig
[SIGSZ
-1];
3826 image1
= (image0
>> (64 - 53)) & 0xffffffff;
3827 image0
= (image0
>> (64 - 53 + 1) >> 31) & 0xfffff;
3831 image0
= r
->sig
[SIGSZ
-1];
3832 image1
= r
->sig
[SIGSZ
-2];
3833 image1
= (image0
<< 21) | (image1
>> 11);
3834 image0
= (image0
>> 11) & 0xfffff;
3837 /* Rearrange the half-words of the significand to match the
3839 image0
= ((image0
<< 16) | (image0
>> 16)) & 0xffff000f;
3840 image1
= ((image1
<< 16) | (image1
>> 16)) & 0xffffffff;
3842 /* Add the sign and exponent. */
3844 image0
|= (r
->exp
+ 1024) << 4;
3851 if (FLOAT_WORDS_BIG_ENDIAN
)
3852 buf
[0] = image1
, buf
[1] = image0
;
3854 buf
[0] = image0
, buf
[1] = image1
;
3858 decode_vax_g (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
3859 REAL_VALUE_TYPE
*r
, const long *buf
)
3861 unsigned long image0
, image1
;
3864 if (FLOAT_WORDS_BIG_ENDIAN
)
3865 image1
= buf
[0], image0
= buf
[1];
3867 image0
= buf
[0], image1
= buf
[1];
3868 image0
&= 0xffffffff;
3869 image1
&= 0xffffffff;
3871 exp
= (image0
>> 4) & 0x7ff;
3873 memset (r
, 0, sizeof (*r
));
3877 r
->class = rvc_normal
;
3878 r
->sign
= (image0
>> 15) & 1;
3879 r
->exp
= exp
- 1024;
3881 /* Rearrange the half-words of the external format into
3882 proper ascending order. */
3883 image0
= ((image0
& 0xf) << 16) | ((image0
>> 16) & 0xffff);
3884 image1
= ((image1
& 0xffff) << 16) | ((image1
>> 16) & 0xffff);
3886 if (HOST_BITS_PER_LONG
== 64)
3888 image0
= (image0
<< 31 << 1) | image1
;
3891 r
->sig
[SIGSZ
-1] = image0
;
3895 r
->sig
[SIGSZ
-1] = image0
;
3896 r
->sig
[SIGSZ
-2] = image1
;
3897 lshift_significand (r
, r
, 64 - 53);
3898 r
->sig
[SIGSZ
-1] |= SIG_MSB
;
3903 const struct real_format vax_f_format
=
3921 const struct real_format vax_d_format
=
3939 const struct real_format vax_g_format
=
3957 /* A good reference for these can be found in chapter 9 of
3958 "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
3959 An on-line version can be found here:
3961 http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
3964 static void encode_i370_single (const struct real_format
*fmt
,
3965 long *, const REAL_VALUE_TYPE
*);
3966 static void decode_i370_single (const struct real_format
*,
3967 REAL_VALUE_TYPE
*, const long *);
3968 static void encode_i370_double (const struct real_format
*fmt
,
3969 long *, const REAL_VALUE_TYPE
*);
3970 static void decode_i370_double (const struct real_format
*,
3971 REAL_VALUE_TYPE
*, const long *);
3974 encode_i370_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
3975 long *buf
, const REAL_VALUE_TYPE
*r
)
3977 unsigned long sign
, exp
, sig
, image
;
3979 sign
= r
->sign
<< 31;
3989 image
= 0x7fffffff | sign
;
3993 sig
= (r
->sig
[SIGSZ
-1] >> (HOST_BITS_PER_LONG
- 24)) & 0xffffff;
3994 exp
= ((r
->exp
/ 4) + 64) << 24;
3995 image
= sign
| exp
| sig
;
4006 decode_i370_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4007 REAL_VALUE_TYPE
*r
, const long *buf
)
4009 unsigned long sign
, sig
, image
= buf
[0];
4012 sign
= (image
>> 31) & 1;
4013 exp
= (image
>> 24) & 0x7f;
4014 sig
= image
& 0xffffff;
4016 memset (r
, 0, sizeof (*r
));
4020 r
->class = rvc_normal
;
4022 r
->exp
= (exp
- 64) * 4;
4023 r
->sig
[SIGSZ
-1] = sig
<< (HOST_BITS_PER_LONG
- 24);
4029 encode_i370_double (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4030 long *buf
, const REAL_VALUE_TYPE
*r
)
4032 unsigned long sign
, exp
, image_hi
, image_lo
;
4034 sign
= r
->sign
<< 31;
4039 image_hi
= image_lo
= 0;
4044 image_hi
= 0x7fffffff | sign
;
4045 image_lo
= 0xffffffff;
4049 if (HOST_BITS_PER_LONG
== 64)
4051 image_hi
= r
->sig
[SIGSZ
-1];
4052 image_lo
= (image_hi
>> (64 - 56)) & 0xffffffff;
4053 image_hi
= (image_hi
>> (64 - 56 + 1) >> 31) & 0xffffff;
4057 image_hi
= r
->sig
[SIGSZ
-1];
4058 image_lo
= r
->sig
[SIGSZ
-2];
4059 image_lo
= (image_lo
>> 8) | (image_hi
<< 24);
4063 exp
= ((r
->exp
/ 4) + 64) << 24;
4064 image_hi
|= sign
| exp
;
4071 if (FLOAT_WORDS_BIG_ENDIAN
)
4072 buf
[0] = image_hi
, buf
[1] = image_lo
;
4074 buf
[0] = image_lo
, buf
[1] = image_hi
;
4078 decode_i370_double (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4079 REAL_VALUE_TYPE
*r
, const long *buf
)
4081 unsigned long sign
, image_hi
, image_lo
;
4084 if (FLOAT_WORDS_BIG_ENDIAN
)
4085 image_hi
= buf
[0], image_lo
= buf
[1];
4087 image_lo
= buf
[0], image_hi
= buf
[1];
4089 sign
= (image_hi
>> 31) & 1;
4090 exp
= (image_hi
>> 24) & 0x7f;
4091 image_hi
&= 0xffffff;
4092 image_lo
&= 0xffffffff;
4094 memset (r
, 0, sizeof (*r
));
4096 if (exp
|| image_hi
|| image_lo
)
4098 r
->class = rvc_normal
;
4100 r
->exp
= (exp
- 64) * 4 + (SIGNIFICAND_BITS
- 56);
4102 if (HOST_BITS_PER_LONG
== 32)
4104 r
->sig
[0] = image_lo
;
4105 r
->sig
[1] = image_hi
;
4108 r
->sig
[0] = image_lo
| (image_hi
<< 31 << 1);
4114 const struct real_format i370_single_format
=
4127 false, /* ??? The encoding does allow for "unnormals". */
4128 false, /* ??? The encoding does allow for "unnormals". */
4132 const struct real_format i370_double_format
=
4145 false, /* ??? The encoding does allow for "unnormals". */
4146 false, /* ??? The encoding does allow for "unnormals". */
4150 /* The "twos-complement" c4x format is officially defined as
4154 This is rather misleading. One must remember that F is signed.
4155 A better description would be
4157 x = -1**s * ((s + 1 + .f) * 2**e
4159 So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
4160 that's -1 * (1+1+(-.5)) == -1.5. I think.
4162 The constructions here are taken from Tables 5-1 and 5-2 of the
4163 TMS320C4x User's Guide wherein step-by-step instructions for
4164 conversion from IEEE are presented. That's close enough to our
4165 internal representation so as to make things easy.
4167 See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf */
4169 static void encode_c4x_single (const struct real_format
*fmt
,
4170 long *, const REAL_VALUE_TYPE
*);
4171 static void decode_c4x_single (const struct real_format
*,
4172 REAL_VALUE_TYPE
*, const long *);
4173 static void encode_c4x_extended (const struct real_format
*fmt
,
4174 long *, const REAL_VALUE_TYPE
*);
4175 static void decode_c4x_extended (const struct real_format
*,
4176 REAL_VALUE_TYPE
*, const long *);
4179 encode_c4x_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4180 long *buf
, const REAL_VALUE_TYPE
*r
)
4182 unsigned long image
, exp
, sig
;
4194 sig
= 0x800000 - r
->sign
;
4199 sig
= (r
->sig
[SIGSZ
-1] >> (HOST_BITS_PER_LONG
- 24)) & 0x7fffff;
4214 image
= ((exp
& 0xff) << 24) | (sig
& 0xffffff);
4219 decode_c4x_single (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4220 REAL_VALUE_TYPE
*r
, const long *buf
)
4222 unsigned long image
= buf
[0];
4226 exp
= (((image
>> 24) & 0xff) ^ 0x80) - 0x80;
4227 sf
= ((image
& 0xffffff) ^ 0x800000) - 0x800000;
4229 memset (r
, 0, sizeof (*r
));
4233 r
->class = rvc_normal
;
4235 sig
= sf
& 0x7fffff;
4244 sig
= (sig
<< (HOST_BITS_PER_LONG
- 24)) | SIG_MSB
;
4247 r
->sig
[SIGSZ
-1] = sig
;
4252 encode_c4x_extended (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4253 long *buf
, const REAL_VALUE_TYPE
*r
)
4255 unsigned long exp
, sig
;
4267 sig
= 0x80000000 - r
->sign
;
4273 sig
= r
->sig
[SIGSZ
-1];
4274 if (HOST_BITS_PER_LONG
== 64)
4275 sig
= sig
>> 1 >> 31;
4292 exp
= (exp
& 0xff) << 24;
4295 if (FLOAT_WORDS_BIG_ENDIAN
)
4296 buf
[0] = exp
, buf
[1] = sig
;
4298 buf
[0] = sig
, buf
[0] = exp
;
4302 decode_c4x_extended (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4303 REAL_VALUE_TYPE
*r
, const long *buf
)
4308 if (FLOAT_WORDS_BIG_ENDIAN
)
4309 exp
= buf
[0], sf
= buf
[1];
4311 sf
= buf
[0], exp
= buf
[1];
4313 exp
= (((exp
>> 24) & 0xff) & 0x80) - 0x80;
4314 sf
= ((sf
& 0xffffffff) ^ 0x80000000) - 0x80000000;
4316 memset (r
, 0, sizeof (*r
));
4320 r
->class = rvc_normal
;
4322 sig
= sf
& 0x7fffffff;
4331 if (HOST_BITS_PER_LONG
== 64)
4332 sig
= sig
<< 1 << 31;
4336 r
->sig
[SIGSZ
-1] = sig
;
4340 const struct real_format c4x_single_format
=
4358 const struct real_format c4x_extended_format
=
4360 encode_c4x_extended
,
4361 decode_c4x_extended
,
4377 /* A synthetic "format" for internal arithmetic. It's the size of the
4378 internal significand minus the two bits needed for proper rounding.
4379 The encode and decode routines exist only to satisfy our paranoia
4382 static void encode_internal (const struct real_format
*fmt
,
4383 long *, const REAL_VALUE_TYPE
*);
4384 static void decode_internal (const struct real_format
*,
4385 REAL_VALUE_TYPE
*, const long *);
4388 encode_internal (const struct real_format
*fmt ATTRIBUTE_UNUSED
, long *buf
,
4389 const REAL_VALUE_TYPE
*r
)
4391 memcpy (buf
, r
, sizeof (*r
));
4395 decode_internal (const struct real_format
*fmt ATTRIBUTE_UNUSED
,
4396 REAL_VALUE_TYPE
*r
, const long *buf
)
4398 memcpy (r
, buf
, sizeof (*r
));
4401 const struct real_format real_internal_format
=
4407 SIGNIFICAND_BITS
- 2,
4408 SIGNIFICAND_BITS
- 2,
4419 /* Set up default mode to format mapping for IEEE. Everyone else has
4420 to set these values in OVERRIDE_OPTIONS. */
4422 const struct real_format
*real_format_for_mode
[TFmode
- QFmode
+ 1] =
4427 &ieee_single_format
, /* SFmode */
4428 &ieee_double_format
, /* DFmode */
4430 /* We explicitly don't handle XFmode. There are two formats,
4431 pretty much equally common. Choose one in OVERRIDE_OPTIONS. */
4433 &ieee_quad_format
/* TFmode */
4437 /* Calculate the square root of X in mode MODE, and store the result
4438 in R. Return TRUE if the operation does not raise an exception.
4439 For details see "High Precision Division and Square Root",
4440 Alan H. Karp and Peter Markstein, HP Lab Report 93-93-42, June
4441 1993. http://www.hpl.hp.com/techreports/93/HPL-93-42.pdf. */
4444 real_sqrt (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
4445 const REAL_VALUE_TYPE
*x
)
4447 static REAL_VALUE_TYPE halfthree
;
4448 static bool init
= false;
4449 REAL_VALUE_TYPE h
, t
, i
;
4452 /* sqrt(-0.0) is -0.0. */
4453 if (real_isnegzero (x
))
4459 /* Negative arguments return NaN. */
4462 /* Mode is ignored for canonical NaN. */
4463 real_nan (r
, "", 1, SFmode
);
4467 /* Infinity and NaN return themselves. */
4468 if (real_isinf (x
) || real_isnan (x
))
4476 do_add (&halfthree
, &dconst1
, &dconsthalf
, 0);
4480 /* Initial guess for reciprocal sqrt, i. */
4481 exp
= real_exponent (x
);
4482 real_ldexp (&i
, &dconst1
, -exp
/2);
4484 /* Newton's iteration for reciprocal sqrt, i. */
4485 for (iter
= 0; iter
< 16; iter
++)
4487 /* i(n+1) = i(n) * (1.5 - 0.5*i(n)*i(n)*x). */
4488 do_multiply (&t
, x
, &i
);
4489 do_multiply (&h
, &t
, &i
);
4490 do_multiply (&t
, &h
, &dconsthalf
);
4491 do_add (&h
, &halfthree
, &t
, 1);
4492 do_multiply (&t
, &i
, &h
);
4494 /* Check for early convergence. */
4495 if (iter
>= 6 && real_identical (&i
, &t
))
4498 /* ??? Unroll loop to avoid copying. */
4502 /* Final iteration: r = i*x + 0.5*i*x*(1.0 - i*(i*x)). */
4503 do_multiply (&t
, x
, &i
);
4504 do_multiply (&h
, &t
, &i
);
4505 do_add (&i
, &dconst1
, &h
, 1);
4506 do_multiply (&h
, &t
, &i
);
4507 do_multiply (&i
, &dconsthalf
, &h
);
4508 do_add (&h
, &t
, &i
, 0);
4510 /* ??? We need a Tuckerman test to get the last bit. */
4512 real_convert (r
, mode
, &h
);
4516 /* Calculate X raised to the integer exponent N in mode MODE and store
4517 the result in R. Return true if the result may be inexact due to
4518 loss of precision. The algorithm is the classic "left-to-right binary
4519 method" described in section 4.6.3 of Donald Knuth's "Seminumerical
4520 Algorithms", "The Art of Computer Programming", Volume 2. */
4523 real_powi (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
4524 const REAL_VALUE_TYPE
*x
, HOST_WIDE_INT n
)
4526 unsigned HOST_WIDE_INT bit
;
4528 bool inexact
= false;
4540 /* Don't worry about overflow, from now on n is unsigned. */
4548 bit
= (unsigned HOST_WIDE_INT
) 1 << (HOST_BITS_PER_WIDE_INT
- 1);
4549 for (i
= 0; i
< HOST_BITS_PER_WIDE_INT
; i
++)
4553 inexact
|= do_multiply (&t
, &t
, &t
);
4555 inexact
|= do_multiply (&t
, &t
, x
);
4563 inexact
|= do_divide (&t
, &dconst1
, &t
);
4565 real_convert (r
, mode
, &t
);
4569 /* Round X to the nearest integer not larger in absolute value, i.e.
4570 towards zero, placing the result in R in mode MODE. */
4573 real_trunc (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
4574 const REAL_VALUE_TYPE
*x
)
4576 do_fix_trunc (r
, x
);
4577 if (mode
!= VOIDmode
)
4578 real_convert (r
, mode
, r
);
4581 /* Round X to the largest integer not greater in value, i.e. round
4582 down, placing the result in R in mode MODE. */
4585 real_floor (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
4586 const REAL_VALUE_TYPE
*x
)
4588 do_fix_trunc (r
, x
);
4589 if (! real_identical (r
, x
) && r
->sign
)
4590 do_add (r
, r
, &dconstm1
, 0);
4591 if (mode
!= VOIDmode
)
4592 real_convert (r
, mode
, r
);
4595 /* Round X to the smallest integer not less then argument, i.e. round
4596 up, placing the result in R in mode MODE. */
4599 real_ceil (REAL_VALUE_TYPE
*r
, enum machine_mode mode
,
4600 const REAL_VALUE_TYPE
*x
)
4602 do_fix_trunc (r
, x
);
4603 if (! real_identical (r
, x
) && ! r
->sign
)
4604 do_add (r
, r
, &dconst1
, 0);
4605 if (mode
!= VOIDmode
)
4606 real_convert (r
, mode
, r
);