1 /* real.c - software floating point emulation.
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2002 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
31 /* The floating point model used internally is not exactly IEEE 754
32 compliant, and close to the description in the ISO C standard,
33 section 5.2.4.2.2 Characteristics of floating types.
37 x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
41 b = base or radix, here always 2
43 p = precision (the number of base-b digits in the significand)
44 f_k = the digits of the significand.
46 We differ from typical IEEE 754 encodings in that the entire
47 significand is fractional. Normalized significands are in the
50 A requirement of the model is that P be larger than than the
51 largest supported target floating-point type by at least 2 bits.
52 This gives us proper rounding when we truncate to the target type.
53 In addition, E must be large enough to hold the smallest supported
54 denormal number in a normalized form.
56 Both of these requirements are easily satisfied. The largest
57 target significand is 113 bits; we store 128. The smallest
58 denormal number fits in 17 exponent bits; we store 29.
60 Target floating point models that use base 16 instead of base 2
61 (i.e. IBM 370), are handled during round_for_format, in which we
62 canonicalize the exponent to be a multiple of 4 (log2(16)), and
63 adjust the significand to match. */
66 /* Used to classify two numbers simultaneously. */
67 #define CLASS2(A, B) ((A) << 2 | (B))
69 #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
70 #error "Some constant folding done by hand to avoid shift count warnings"
73 static void get_zero PARAMS ((REAL_VALUE_TYPE *, int));
74 static void get_canonical_qnan PARAMS ((REAL_VALUE_TYPE *, int));
75 static void get_canonical_snan PARAMS ((REAL_VALUE_TYPE *, int));
76 static void get_inf PARAMS ((REAL_VALUE_TYPE *, int));
77 static void sticky_rshift_significand PARAMS ((REAL_VALUE_TYPE *,
78 const REAL_VALUE_TYPE *,
80 static void rshift_significand PARAMS ((REAL_VALUE_TYPE *,
81 const REAL_VALUE_TYPE *,
83 static void lshift_significand PARAMS ((REAL_VALUE_TYPE *,
84 const REAL_VALUE_TYPE *,
86 static void lshift_significand_1 PARAMS ((REAL_VALUE_TYPE *,
87 const REAL_VALUE_TYPE *));
88 static bool add_significands PARAMS ((REAL_VALUE_TYPE *r,
89 const REAL_VALUE_TYPE *,
90 const REAL_VALUE_TYPE *));
91 static bool sub_significands PARAMS ((REAL_VALUE_TYPE *,
92 const REAL_VALUE_TYPE *,
93 const REAL_VALUE_TYPE *));
94 static void neg_significand PARAMS ((REAL_VALUE_TYPE *,
95 const REAL_VALUE_TYPE *));
96 static int cmp_significands PARAMS ((const REAL_VALUE_TYPE *,
97 const REAL_VALUE_TYPE *));
98 static void set_significand_bit PARAMS ((REAL_VALUE_TYPE *, unsigned int));
99 static void clear_significand_bit PARAMS ((REAL_VALUE_TYPE *, unsigned int));
100 static bool test_significand_bit PARAMS ((REAL_VALUE_TYPE *, unsigned int));
101 static void clear_significand_below PARAMS ((REAL_VALUE_TYPE *,
103 static bool div_significands PARAMS ((REAL_VALUE_TYPE *,
104 const REAL_VALUE_TYPE *,
105 const REAL_VALUE_TYPE *));
106 static void normalize PARAMS ((REAL_VALUE_TYPE *));
108 static void do_add PARAMS ((REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
109 const REAL_VALUE_TYPE *, int));
110 static void do_multiply PARAMS ((REAL_VALUE_TYPE *,
111 const REAL_VALUE_TYPE *,
112 const REAL_VALUE_TYPE *));
113 static void do_divide PARAMS ((REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
114 const REAL_VALUE_TYPE *));
115 static int do_compare PARAMS ((const REAL_VALUE_TYPE *,
116 const REAL_VALUE_TYPE *, int));
117 static void do_fix_trunc PARAMS ((REAL_VALUE_TYPE *,
118 const REAL_VALUE_TYPE *));
120 static const REAL_VALUE_TYPE * ten_to_ptwo PARAMS ((int));
121 static const REAL_VALUE_TYPE * real_digit PARAMS ((int));
123 static void round_for_format PARAMS ((const struct real_format *,
126 /* Initialize R with a positive zero. */
133 memset (r, 0, sizeof (*r));
137 /* Initialize R with the canonical quiet NaN. */
140 get_canonical_qnan (r, sign)
144 memset (r, 0, sizeof (*r));
147 r->sig[SIGSZ-1] = SIG_MSB >> 1;
151 get_canonical_snan (r, sign)
155 memset (r, 0, sizeof (*r));
158 r->sig[SIGSZ-1] = SIG_MSB >> 2;
166 memset (r, 0, sizeof (*r));
172 /* Right-shift the significand of A by N bits; put the result in the
173 significand of R. If any one bits are shifted out, set the least
174 significant bit of R. */
177 sticky_rshift_significand (r, a, n)
179 const REAL_VALUE_TYPE *a;
182 unsigned long sticky = 0;
183 unsigned int i, ofs = 0;
185 if (n >= HOST_BITS_PER_LONG)
187 for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i)
189 n -= ofs * HOST_BITS_PER_LONG;
194 sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1);
195 for (i = 0; i < SIGSZ; ++i)
198 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
199 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
200 << (HOST_BITS_PER_LONG - n)));
205 for (i = 0; ofs + i < SIGSZ; ++i)
206 r->sig[i] = a->sig[ofs + i];
207 for (; i < SIGSZ; ++i)
211 r->sig[0] |= (sticky != 0);
214 /* Right-shift the significand of A by N bits; put the result in the
218 rshift_significand (r, a, n)
220 const REAL_VALUE_TYPE *a;
223 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
225 n -= ofs * HOST_BITS_PER_LONG;
228 for (i = 0; i < SIGSZ; ++i)
231 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
232 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
233 << (HOST_BITS_PER_LONG - n)));
238 for (i = 0; ofs + i < SIGSZ; ++i)
239 r->sig[i] = a->sig[ofs + i];
240 for (; i < SIGSZ; ++i)
245 /* Left-shift the significand of A by N bits; put the result in the
249 lshift_significand (r, a, n)
251 const REAL_VALUE_TYPE *a;
254 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
256 n -= ofs * HOST_BITS_PER_LONG;
259 for (i = 0; ofs + i < SIGSZ; ++i)
260 r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs];
261 for (; i < SIGSZ; ++i)
262 r->sig[SIGSZ-1-i] = 0;
265 for (i = 0; i < SIGSZ; ++i)
268 = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n)
269 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1])
270 >> (HOST_BITS_PER_LONG - n)));
274 /* Likewise, but N is specialized to 1. */
277 lshift_significand_1 (r, a)
279 const REAL_VALUE_TYPE *a;
283 for (i = SIGSZ - 1; i > 0; --i)
284 r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1));
285 r->sig[0] = a->sig[0] << 1;
288 /* Add the significands of A and B, placing the result in R. Return
289 true if there was carry out of the most significant word. */
292 add_significands (r, a, b)
294 const REAL_VALUE_TYPE *a, *b;
299 for (i = 0; i < SIGSZ; ++i)
301 unsigned long ai = a->sig[i];
302 unsigned long ri = ai + b->sig[i];
318 /* Subtract the significands of A and B, placing the result in R.
319 Return true if there was carry out of the most significant word. */
322 sub_significands (r, a, b)
324 const REAL_VALUE_TYPE *a, *b;
329 for (i = 0; i < SIGSZ; ++i)
331 unsigned long ai = a->sig[i];
332 unsigned long ri = ai - b->sig[i];
348 /* Negate the significand A, placing the result in R. */
351 neg_significand (r, a)
353 const REAL_VALUE_TYPE *a;
358 for (i = 0; i < SIGSZ; ++i)
360 unsigned long ri, ai = a->sig[i];
379 /* Compare significands. Return tri-state vs zero. */
382 cmp_significands (a, b)
383 const REAL_VALUE_TYPE *a, *b;
387 for (i = SIGSZ - 1; i >= 0; --i)
389 unsigned long ai = a->sig[i];
390 unsigned long bi = b->sig[i];
401 /* Set bit N of the significand of R. */
404 set_significand_bit (r, n)
408 r->sig[n / HOST_BITS_PER_LONG]
409 |= (unsigned long)1 << (n % HOST_BITS_PER_LONG);
412 /* Clear bit N of the significand of R. */
415 clear_significand_bit (r, n)
419 r->sig[n / HOST_BITS_PER_LONG]
420 &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG));
423 /* Test bit N of the significand of R. */
426 test_significand_bit (r, n)
430 /* ??? Compiler bug here if we return this expression directly.
431 The conversion to bool strips the "&1" and we wind up testing
432 e.g. 2 != 0 -> true. Seen in gcc version 3.2 20020520. */
433 int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1;
437 /* Clear bits 0..N-1 of the significand of R. */
440 clear_significand_below (r, n)
444 int i, w = n / HOST_BITS_PER_LONG;
446 for (i = 0; i < w; ++i)
449 r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1);
452 /* Divide the significands of A and B, placing the result in R. Return
453 true if the division was inexact. */
456 div_significands (r, a, b)
458 const REAL_VALUE_TYPE *a, *b;
461 int bit = SIGNIFICAND_BITS - 1;
466 memset (r->sig, 0, sizeof (r->sig));
471 if ((u.sig[SIGSZ-1] & SIG_MSB) == 0)
473 lshift_significand_1 (&u, &u);
475 if (cmp_significands (&u, b) >= 0)
477 sub_significands (&u, &u, b);
478 set_significand_bit (r, bit);
483 /* We lose a bit here, and thus know the next quotient bit
485 lshift_significand_1 (&u, &u);
486 sub_significands (&u, &u, b);
487 set_significand_bit (r, bit);
492 for (i = 0, inexact = 0; i < SIGSZ; i++)
498 /* Adjust the exponent and significand of R such that the most
499 significant bit is set. We underflow to zero and overflow to
500 infinity here, without denormals. (The intermediate representation
501 exponent is large enough to handle target denormals normalized.) */
510 /* Find the first word that is nonzero. */
511 for (i = SIGSZ - 1; i >= 0; i--)
513 shift += HOST_BITS_PER_LONG;
517 /* Zero significand flushes to zero. */
525 /* Find the first bit that is nonzero. */
527 if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j)))
533 exp = r->exp - shift;
535 get_inf (r, r->sign);
536 else if (exp < -MAX_EXP)
537 get_zero (r, r->sign);
541 lshift_significand (r, r, shift);
546 /* Return R = A + (SUBTRACT_P ? -B : B). */
549 do_add (r, a, b, subtract_p)
551 const REAL_VALUE_TYPE *a, *b;
557 /* Determine if we need to add or subtract. */
559 subtract_p = (sign ^ b->sign) ^ subtract_p;
561 switch (CLASS2 (a->class, b->class))
563 case CLASS2 (rvc_zero, rvc_zero):
564 /* +-0 +/- +-0 = +0. */
568 case CLASS2 (rvc_zero, rvc_normal):
569 case CLASS2 (rvc_zero, rvc_inf):
570 case CLASS2 (rvc_zero, rvc_nan):
572 case CLASS2 (rvc_normal, rvc_nan):
573 case CLASS2 (rvc_inf, rvc_nan):
574 case CLASS2 (rvc_nan, rvc_nan):
575 /* ANY + NaN = NaN. */
576 case CLASS2 (rvc_normal, rvc_inf):
579 r->sign = sign ^ subtract_p;
582 case CLASS2 (rvc_normal, rvc_zero):
583 case CLASS2 (rvc_inf, rvc_zero):
584 case CLASS2 (rvc_nan, rvc_zero):
586 case CLASS2 (rvc_nan, rvc_normal):
587 case CLASS2 (rvc_nan, rvc_inf):
588 /* NaN + ANY = NaN. */
589 case CLASS2 (rvc_inf, rvc_normal):
594 case CLASS2 (rvc_inf, rvc_inf):
596 /* Inf - Inf = NaN. */
597 get_canonical_qnan (r, 0);
599 /* Inf + Inf = Inf. */
603 case CLASS2 (rvc_normal, rvc_normal):
610 /* Swap the arguments such that A has the larger exponent. */
611 dexp = a->exp - b->exp;
614 const REAL_VALUE_TYPE *t;
621 /* If the exponents are not identical, we need to shift the
622 significand of B down. */
625 /* If the exponents are too far apart, the significands
626 do not overlap, which makes the subtraction a noop. */
627 if (dexp >= SIGNIFICAND_BITS)
634 sticky_rshift_significand (&t, b, dexp);
640 if (sub_significands (r, a, b))
642 /* We got a borrow out of the subtraction. That means that
643 A and B had the same exponent, and B had the larger
644 significand. We need to swap the sign and negate the
647 neg_significand (r, r);
652 if (add_significands (r, a, b))
654 /* We got carry out of the addition. This means we need to
655 shift the significand back down one bit and increase the
657 sticky_rshift_significand (r, r, 1);
658 r->sig[SIGSZ-1] |= SIG_MSB;
667 r->class = rvc_normal;
671 /* Re-normalize the result. */
674 /* Special case: if the subtraction results in zero, the result
676 if (r->class == rvc_zero)
680 /* Return R = A * B. */
683 do_multiply (r, a, b)
685 const REAL_VALUE_TYPE *a, *b;
687 REAL_VALUE_TYPE u, t, *rr;
688 unsigned int i, j, k;
689 int sign = a->sign ^ b->sign;
691 switch (CLASS2 (a->class, b->class))
693 case CLASS2 (rvc_zero, rvc_zero):
694 case CLASS2 (rvc_zero, rvc_normal):
695 case CLASS2 (rvc_normal, rvc_zero):
696 /* +-0 * ANY = 0 with appropriate sign. */
700 case CLASS2 (rvc_zero, rvc_nan):
701 case CLASS2 (rvc_normal, rvc_nan):
702 case CLASS2 (rvc_inf, rvc_nan):
703 case CLASS2 (rvc_nan, rvc_nan):
704 /* ANY * NaN = NaN. */
709 case CLASS2 (rvc_nan, rvc_zero):
710 case CLASS2 (rvc_nan, rvc_normal):
711 case CLASS2 (rvc_nan, rvc_inf):
712 /* NaN * ANY = NaN. */
717 case CLASS2 (rvc_zero, rvc_inf):
718 case CLASS2 (rvc_inf, rvc_zero):
720 get_canonical_qnan (r, sign);
723 case CLASS2 (rvc_inf, rvc_inf):
724 case CLASS2 (rvc_normal, rvc_inf):
725 case CLASS2 (rvc_inf, rvc_normal):
726 /* Inf * Inf = Inf, R * Inf = Inf */
731 case CLASS2 (rvc_normal, rvc_normal):
738 if (r == a || r == b)
744 /* Collect all the partial products. Since we don't have sure access
745 to a widening multiply, we split each long into two half-words.
747 Consider the long-hand form of a four half-word multiplication:
757 We construct partial products of the widened half-word products
758 that are known to not overlap, e.g. DF+DH. Each such partial
759 product is given its proper exponent, which allows us to sum them
760 and obtain the finished product. */
762 for (i = 0; i < SIGSZ * 2; ++i)
764 unsigned long ai = a->sig[i / 2];
766 ai >>= HOST_BITS_PER_LONG / 2;
768 ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
773 for (j = 0; j < 2; ++j)
775 int exp = (a->exp - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
776 + (b->exp - (1-j)*(HOST_BITS_PER_LONG/2)));
781 /* Would underflow to zero, which we shouldn't bother adding. */
784 u.class = rvc_normal;
788 for (k = j; k < SIGSZ * 2; k += 2)
790 unsigned long bi = b->sig[k / 2];
792 bi >>= HOST_BITS_PER_LONG / 2;
794 bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
796 u.sig[k / 2] = ai * bi;
800 do_add (rr, rr, &u, 0);
809 /* Return R = A / B. */
814 const REAL_VALUE_TYPE *a, *b;
816 int exp, sign = a->sign ^ b->sign;
817 REAL_VALUE_TYPE t, *rr;
820 switch (CLASS2 (a->class, b->class))
822 case CLASS2 (rvc_zero, rvc_zero):
824 case CLASS2 (rvc_inf, rvc_zero):
826 case CLASS2 (rvc_inf, rvc_inf):
827 /* Inf / Inf = NaN. */
828 get_canonical_qnan (r, sign);
831 case CLASS2 (rvc_zero, rvc_normal):
832 case CLASS2 (rvc_zero, rvc_inf):
834 case CLASS2 (rvc_normal, rvc_inf):
840 case CLASS2 (rvc_normal, rvc_zero):
845 case CLASS2 (rvc_zero, rvc_nan):
846 case CLASS2 (rvc_normal, rvc_nan):
847 case CLASS2 (rvc_inf, rvc_nan):
848 case CLASS2 (rvc_nan, rvc_nan):
849 /* ANY / NaN = NaN. */
854 case CLASS2 (rvc_nan, rvc_zero):
855 case CLASS2 (rvc_nan, rvc_normal):
856 case CLASS2 (rvc_nan, rvc_inf):
857 /* NaN / ANY = NaN. */
862 case CLASS2 (rvc_inf, rvc_normal):
868 case CLASS2 (rvc_normal, rvc_normal):
875 if (r == a || r == b)
880 rr->class = rvc_normal;
883 exp = a->exp - b->exp + 1;
890 inexact = div_significands (rr, a, b);
891 rr->sig[0] |= inexact;
893 /* Re-normalize the result. */
900 /* Return a tri-state comparison of A vs B. Return NAN_RESULT if
901 one of the two operands is a NaN. */
904 do_compare (a, b, nan_result)
905 const REAL_VALUE_TYPE *a, *b;
910 switch (CLASS2 (a->class, b->class))
912 case CLASS2 (rvc_zero, rvc_zero):
913 /* Sign of zero doesn't matter for compares. */
916 case CLASS2 (rvc_inf, rvc_zero):
917 case CLASS2 (rvc_inf, rvc_normal):
918 case CLASS2 (rvc_normal, rvc_zero):
919 return (a->sign ? -1 : 1);
921 case CLASS2 (rvc_inf, rvc_inf):
922 return -a->sign - -b->sign;
924 case CLASS2 (rvc_zero, rvc_normal):
925 case CLASS2 (rvc_zero, rvc_inf):
926 case CLASS2 (rvc_normal, rvc_inf):
927 return (b->sign ? 1 : -1);
929 case CLASS2 (rvc_zero, rvc_nan):
930 case CLASS2 (rvc_normal, rvc_nan):
931 case CLASS2 (rvc_inf, rvc_nan):
932 case CLASS2 (rvc_nan, rvc_nan):
933 case CLASS2 (rvc_nan, rvc_zero):
934 case CLASS2 (rvc_nan, rvc_normal):
935 case CLASS2 (rvc_nan, rvc_inf):
938 case CLASS2 (rvc_normal, rvc_normal):
945 if (a->sign != b->sign)
946 return -a->sign - -b->sign;
950 else if (a->exp < b->exp)
953 ret = cmp_significands (a, b);
955 return (a->sign ? -ret : ret);
958 /* Return A truncated to an integral value toward zero. */
963 const REAL_VALUE_TYPE *a;
976 get_zero (r, r->sign);
977 else if (r->exp < SIGNIFICAND_BITS)
978 clear_significand_below (r, SIGNIFICAND_BITS - r->exp);
986 /* Perform the binary or unary operation described by CODE.
987 For a unary operation, leave OP1 NULL. */
990 real_arithmetic (r, icode, op0, op1)
993 const REAL_VALUE_TYPE *op0, *op1;
995 enum tree_code code = icode;
1000 do_add (r, op0, op1, 0);
1004 do_add (r, op0, op1, 1);
1008 do_multiply (r, op0, op1);
1012 do_divide (r, op0, op1);
1016 if (op1->class == rvc_nan)
1018 else if (do_compare (op0, op1, -1) < 0)
1025 if (op1->class == rvc_nan)
1027 else if (do_compare (op0, op1, 1) < 0)
1043 case FIX_TRUNC_EXPR:
1044 do_fix_trunc (r, op0);
1052 /* Legacy. Similar, but return the result directly. */
1055 real_arithmetic2 (icode, op0, op1)
1057 const REAL_VALUE_TYPE *op0, *op1;
1060 real_arithmetic (&r, icode, op0, op1);
1065 real_compare (icode, op0, op1)
1067 const REAL_VALUE_TYPE *op0, *op1;
1069 enum tree_code code = icode;
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, -1) >= 0;
1082 return do_compare (op0, op1, -1) == 0;
1084 return do_compare (op0, op1, -1) != 0;
1085 case UNORDERED_EXPR:
1086 return op0->class == rvc_nan || op1->class == rvc_nan;
1088 return op0->class != rvc_nan && op1->class != rvc_nan;
1090 return do_compare (op0, op1, -1) < 0;
1092 return do_compare (op0, op1, -1) <= 0;
1094 return do_compare (op0, op1, 1) > 0;
1096 return do_compare (op0, op1, 1) >= 0;
1098 return do_compare (op0, op1, 0) == 0;
1105 /* Return floor log2(R). */
1109 const REAL_VALUE_TYPE *r;
1117 return (unsigned int)-1 >> 1;
1125 /* R = OP0 * 2**EXP. */
1128 real_ldexp (r, op0, exp)
1130 const REAL_VALUE_TYPE *op0;
1144 get_inf (r, r->sign);
1145 else if (exp < -MAX_EXP)
1146 get_zero (r, r->sign);
1156 /* Determine whether a floating-point value X is infinite. */
1160 const REAL_VALUE_TYPE *r;
1162 return (r->class == rvc_inf);
1165 /* Determine whether a floating-point value X is a NaN. */
1169 const REAL_VALUE_TYPE *r;
1171 return (r->class == rvc_nan);
1174 /* Determine whether a floating-point value X is negative. */
1178 const REAL_VALUE_TYPE *r;
1183 /* Determine whether a floating-point value X is minus zero. */
1187 const REAL_VALUE_TYPE *r;
1189 return r->sign && r->class == rvc_zero;
1192 /* Compare two floating-point objects for bitwise identity. */
1195 real_identical (a, b)
1196 const REAL_VALUE_TYPE *a, *b;
1200 if (a->class != b->class)
1202 if (a->sign != b->sign)
1212 if (a->exp != b->exp)
1216 for (i = 0; i < SIGSZ; ++i)
1217 if (a->sig[i] != b->sig[i])
1228 /* Try to change R into its exact multiplicative inverse in machine
1229 mode MODE. Return true if successful. */
1232 exact_real_inverse (mode, r)
1233 enum machine_mode mode;
1236 const REAL_VALUE_TYPE *one = real_digit (1);
1240 if (r->class != rvc_normal)
1243 /* Check for a power of two: all significand bits zero except the MSB. */
1244 for (i = 0; i < SIGSZ-1; ++i)
1247 if (r->sig[SIGSZ-1] != SIG_MSB)
1250 /* Find the inverse and truncate to the required mode. */
1251 do_divide (&u, one, r);
1252 real_convert (&u, mode, &u);
1254 /* The rounding may have overflowed. */
1255 if (u.class != rvc_normal)
1257 for (i = 0; i < SIGSZ-1; ++i)
1260 if (u.sig[SIGSZ-1] != SIG_MSB)
1267 /* Render R as an integer. */
1271 const REAL_VALUE_TYPE *r;
1273 unsigned HOST_WIDE_INT i;
1284 i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1292 if (r->exp > HOST_BITS_PER_WIDE_INT)
1295 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1296 i = r->sig[SIGSZ-1];
1297 else if (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG)
1299 i = r->sig[SIGSZ-1];
1300 i = i << (HOST_BITS_PER_LONG - 1) << 1;
1301 i |= r->sig[SIGSZ-2];
1306 i >>= HOST_BITS_PER_WIDE_INT - r->exp;
1317 /* Likewise, but to an integer pair, HI+LOW. */
1320 real_to_integer2 (plow, phigh, r)
1321 HOST_WIDE_INT *plow, *phigh;
1322 const REAL_VALUE_TYPE *r;
1325 HOST_WIDE_INT low, high;
1338 high = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
1352 if (exp >= 2*HOST_BITS_PER_WIDE_INT)
1355 rshift_significand (&t, r, 2*HOST_BITS_PER_WIDE_INT - exp);
1356 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
1358 high = t.sig[SIGSZ-1];
1359 low = t.sig[SIGSZ-2];
1361 else if (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG)
1363 high = t.sig[SIGSZ-1];
1364 high = high << (HOST_BITS_PER_LONG - 1) << 1;
1365 high |= t.sig[SIGSZ-2];
1367 low = t.sig[SIGSZ-3];
1368 low = low << (HOST_BITS_PER_LONG - 1) << 1;
1369 low |= t.sig[SIGSZ-4];
1379 low = -low, high = ~high;
1391 /* Render R as a decimal floating point constant. Emit DIGITS
1392 significant digits in the result. If DIGITS <= 0, choose the
1393 maximum for the representation. */
1395 #define M_LOG10_2 0.30102999566398119521
1398 real_to_decimal (str, r_orig, digits)
1400 const REAL_VALUE_TYPE *r_orig;
1404 const REAL_VALUE_TYPE *one, *ten;
1405 int dec_exp, max_digits, d, cmp_half;
1406 char *p, *first, *last;
1413 strcpy (str, (r.sign ? "-0.0" : "0.0"));
1418 strcpy (str, (r.sign ? "+Inf" : "-Inf"));
1421 /* ??? Print the significand as well, if not canonical? */
1422 strcpy (str, (r.sign ? "+NaN" : "-NaN"));
1428 max_digits = SIGNIFICAND_BITS * M_LOG10_2;
1429 if (digits <= 0 || digits > max_digits)
1430 digits = max_digits;
1432 one = real_digit (1);
1433 ten = ten_to_ptwo (0);
1438 /* Estimate the decimal exponent. */
1439 dec_exp = r.exp * M_LOG10_2;
1441 /* Scale the number such that it is in [1, 10). */
1445 for (i = EXP_BITS - 1; i >= 0; --i)
1446 if (dec_exp & (1 << i))
1447 do_divide (&r, &r, ten_to_ptwo (i));
1449 else if (dec_exp < 0)
1451 int i, pos_exp = -(--dec_exp);
1453 for (i = EXP_BITS - 1; i >= 0; --i)
1454 if (pos_exp & (1 << i))
1455 do_multiply (&r, &r, ten_to_ptwo (i));
1458 /* Assert that the number is in the proper range. Round-off can
1459 prevent the above from working exactly. */
1460 if (do_compare (&r, one, -1) < 0)
1462 do_multiply (&r, &r, ten);
1465 else if (do_compare (&r, ten, 1) >= 0)
1467 do_divide (&r, &r, ten);
1477 d = real_to_integer ((const REAL_VALUE_TYPE *) &r);
1478 do_add (&r, &r, real_digit (d), 1);
1483 do_multiply (&r, &r, ten);
1487 /* Round the result. Compare R vs 0.5 by doing R*2 vs 1.0. */
1489 cmp_half = do_compare (&r, one, -1);
1491 /* Round to even. */
1514 first[0] = first[1];
1517 sprintf (last, "e%+d", dec_exp);
1520 /* Render R as a hexadecimal floating point constant. Emit DIGITS
1521 significant digits in the result. If DIGITS <= 0, choose the maximum
1522 for the representation. */
1525 real_to_hexadecimal (str, r, digits)
1527 const REAL_VALUE_TYPE *r;
1530 int i, j, exp = r->exp;
1541 strcpy (str, (r->sign ? "+Inf" : "-Inf"));
1544 /* ??? Print the significand as well, if not canonical? */
1545 strcpy (str, (r->sign ? "+NaN" : "-NaN"));
1552 digits = SIGNIFICAND_BITS / 4;
1562 for (i = SIGSZ - 1; i >= 0; --i)
1563 for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
1565 *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
1570 sprintf (p, "p%+d", exp);
1573 /* Initialize R from a decimal or hexadecimal string. The string is
1574 assumed to have been syntax checked already. */
1577 real_from_string (r, str)
1591 else if (*str == '+')
1594 if (str[0] == '0' && str[1] == 'x')
1596 /* Hexadecimal floating point. */
1597 int pos = SIGNIFICAND_BITS - 4, d;
1605 d = hex_value (*str);
1610 r->sig[pos / HOST_BITS_PER_LONG]
1611 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1620 if (pos == SIGNIFICAND_BITS - 4)
1627 d = hex_value (*str);
1632 r->sig[pos / HOST_BITS_PER_LONG]
1633 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
1639 if (*str == 'p' || *str == 'P')
1641 bool exp_neg = false;
1649 else if (*str == '+')
1653 while (ISDIGIT (*str))
1659 /* Overflowed the exponent. */
1673 r->class = rvc_normal;
1680 /* Decimal floating point. */
1681 const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
1686 while (ISDIGIT (*str))
1689 do_multiply (r, r, ten);
1691 do_add (r, r, real_digit (d), 0);
1696 if (r->class == rvc_zero)
1701 while (ISDIGIT (*str))
1704 do_multiply (r, r, ten);
1706 do_add (r, r, real_digit (d), 0);
1711 if (*str == 'e' || *str == 'E')
1713 bool exp_neg = false;
1721 else if (*str == '+')
1725 while (ISDIGIT (*str))
1731 /* Overflowed the exponent. */
1747 for (d = 0; d < EXP_BITS; ++d)
1749 do_divide (r, r, ten_to_ptwo (d));
1753 for (d = 0; d < EXP_BITS; ++d)
1755 do_multiply (r, r, ten_to_ptwo (d));
1771 /* Legacy. Similar, but return the result directly. */
1774 real_from_string2 (s, mode)
1776 enum machine_mode mode;
1780 real_from_string (&r, s);
1781 if (mode != VOIDmode)
1782 real_convert (&r, mode, &r);
1787 /* Initialize R from the integer pair HIGH+LOW. */
1790 real_from_integer (r, mode, low, high, unsigned_p)
1792 enum machine_mode mode;
1793 unsigned HOST_WIDE_INT low;
1797 if (low == 0 && high == 0)
1801 r->class = rvc_normal;
1802 r->sign = high < 0 && !unsigned_p;
1803 r->exp = 2 * HOST_BITS_PER_WIDE_INT;
1814 if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
1816 r->sig[SIGSZ-1] = high;
1817 r->sig[SIGSZ-2] = low;
1818 memset (r->sig, 0, sizeof(long)*(SIGSZ-2));
1820 else if (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT)
1822 r->sig[SIGSZ-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
1823 r->sig[SIGSZ-2] = high;
1824 r->sig[SIGSZ-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
1825 r->sig[SIGSZ-4] = low;
1827 memset (r->sig, 0, sizeof(long)*(SIGSZ-4));
1835 if (mode != VOIDmode)
1836 real_convert (r, mode, r);
1839 /* Returns 10**2**n. */
1841 static const REAL_VALUE_TYPE *
1845 static REAL_VALUE_TYPE tens[EXP_BITS];
1847 if (n < 0 || n >= EXP_BITS)
1850 if (tens[n].class == rvc_zero)
1852 if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
1854 HOST_WIDE_INT t = 10;
1857 for (i = 0; i < n; ++i)
1860 real_from_integer (&tens[n], VOIDmode, t, 0, 1);
1864 const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
1865 do_multiply (&tens[n], t, t);
1874 static const REAL_VALUE_TYPE *
1878 static REAL_VALUE_TYPE num[10];
1883 if (n > 0 && num[n].class == rvc_zero)
1884 real_from_integer (&num[n], VOIDmode, n, 0, 1);
1889 /* Fills R with +Inf. */
1898 /* Fills R with a NaN whose significand is described by STR. If QUIET,
1899 we force a QNaN, else we force an SNaN. The string, if not empty,
1900 is parsed as a number and placed in the significand. Return true
1901 if the string was successfully parsed. */
1904 real_nan (r, str, quiet, mode)
1908 enum machine_mode mode;
1910 const struct real_format *fmt;
1912 fmt = real_format_for_mode[mode - QFmode];
1919 get_canonical_qnan (r, 0);
1921 get_canonical_snan (r, 0);
1928 memset (r, 0, sizeof (*r));
1931 /* Parse akin to strtol into the significand of R. */
1933 while (ISSPACE (*str))
1937 else if (*str == '+')
1947 while ((d = hex_value (*str)) < base)
1954 lshift_significand (r, r, 3);
1957 lshift_significand (r, r, 4);
1960 lshift_significand_1 (&u, r);
1961 lshift_significand (r, r, 3);
1962 add_significands (r, r, &u);
1970 add_significands (r, r, &u);
1975 /* Must have consumed the entire string for success. */
1979 /* Shift the significand into place such that the bits
1980 are in the most significant bits for the format. */
1981 lshift_significand (r, r, SIGNIFICAND_BITS - fmt->p);
1983 /* Our MSB is always unset for NaNs. */
1984 r->sig[SIGSZ-1] &= ~SIG_MSB;
1986 /* Force quiet or signalling NaN. */
1988 r->sig[SIGSZ-1] |= SIG_MSB >> 1;
1990 r->sig[SIGSZ-1] &= ~(SIG_MSB >> 1);
1992 /* Force at least one bit of the significand set. */
1993 for (d = 0; d < SIGSZ; ++d)
1997 r->sig[SIGSZ-1] |= SIG_MSB >> 2;
1999 /* Our intermediate format forces QNaNs to have MSB-1 set.
2000 If the target format has QNaNs with the top bit unset,
2001 mirror the output routines and invert the top two bits. */
2002 if (!fmt->qnan_msb_set)
2003 r->sig[SIGSZ-1] ^= (SIG_MSB >> 1) | (SIG_MSB >> 2);
2009 /* Fills R with 2**N. */
2016 memset (r, 0, sizeof (*r));
2021 else if (n < -MAX_EXP)
2025 r->class = rvc_normal;
2027 r->sig[SIGSZ-1] = SIG_MSB;
2033 round_for_format (fmt, r)
2034 const struct real_format *fmt;
2038 unsigned long sticky;
2042 p2 = fmt->p * fmt->log2_b;
2043 emin2m1 = (fmt->emin - 1) * fmt->log2_b;
2044 emax2 = fmt->emax * fmt->log2_b;
2046 np2 = SIGNIFICAND_BITS - p2;
2050 get_zero (r, r->sign);
2052 if (!fmt->has_signed_zero)
2057 get_inf (r, r->sign);
2062 clear_significand_below (r, np2);
2064 /* If we've cleared the entire significand, we need one bit
2065 set for this to continue to be a NaN. */
2066 for (i = 0; i < SIGSZ; ++i)
2070 r->sig[SIGSZ-1] = SIG_MSB >> 2;
2080 /* If we're not base2, normalize the exponent to a multiple of
2082 if (fmt->log2_b != 1)
2084 int shift = r->exp & (fmt->log2_b - 1);
2087 shift = fmt->log2_b - shift;
2088 sticky_rshift_significand (r, r, shift);
2093 /* Check the range of the exponent. If we're out of range,
2094 either underflow or overflow. */
2097 else if (r->exp <= emin2m1)
2101 if (!fmt->has_denorm)
2103 /* Don't underflow completely until we've had a chance to round. */
2104 if (r->exp < emin2m1)
2109 diff = emin2m1 - r->exp + 1;
2113 /* De-normalize the significand. */
2114 sticky_rshift_significand (r, r, diff);
2119 /* There are P2 true significand bits, followed by one guard bit,
2120 followed by one sticky bit, followed by stuff. Fold nonzero
2121 stuff into the sticky bit. */
2124 for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
2125 sticky |= r->sig[i];
2127 r->sig[w] & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
2129 guard = test_significand_bit (r, np2 - 1);
2130 lsb = test_significand_bit (r, np2);
2132 /* Round to even. */
2133 if (guard && (sticky || lsb))
2137 set_significand_bit (&u, np2);
2139 if (add_significands (r, r, &u))
2141 /* Overflow. Means the significand had been all ones, and
2142 is now all zeros. Need to increase the exponent, and
2143 possibly re-normalize it. */
2144 if (++r->exp > emax2)
2146 r->sig[SIGSZ-1] = SIG_MSB;
2148 if (fmt->log2_b != 1)
2150 int shift = r->exp & (fmt->log2_b - 1);
2153 shift = fmt->log2_b - shift;
2154 sticky_rshift_significand (r, r, shift);
2163 /* Catch underflow that we deferred until after rounding. */
2164 if (r->exp <= emin2m1)
2167 /* Clear out trailing garbage. */
2168 clear_significand_below (r, np2);
2171 /* Extend or truncate to a new mode. */
2174 real_convert (r, mode, a)
2176 enum machine_mode mode;
2177 const REAL_VALUE_TYPE *a;
2179 const struct real_format *fmt;
2181 fmt = real_format_for_mode[mode - QFmode];
2186 round_for_format (fmt, r);
2188 /* round_for_format de-normalizes denormals. Undo just that part. */
2189 if (r->class == rvc_normal)
2193 /* Legacy. Likewise, except return the struct directly. */
2196 real_value_truncate (mode, a)
2197 enum machine_mode mode;
2201 real_convert (&r, mode, &a);
2205 /* Return true if truncating to MODE is exact. */
2208 exact_real_truncate (mode, a)
2209 enum machine_mode mode;
2210 const REAL_VALUE_TYPE *a;
2213 real_convert (&t, mode, a);
2214 return real_identical (&t, a);
2217 /* Write R to the given target format. Place the words of the result
2218 in target word order in BUF. There are always 32 bits in each
2219 long, no matter the size of the host long.
2221 Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE. */
2224 real_to_target_fmt (buf, r_orig, fmt)
2226 const REAL_VALUE_TYPE *r_orig;
2227 const struct real_format *fmt;
2233 round_for_format (fmt, &r);
2237 (*fmt->encode) (fmt, buf, &r);
2242 /* Similar, but look up the format from MODE. */
2245 real_to_target (buf, r, mode)
2247 const REAL_VALUE_TYPE *r;
2248 enum machine_mode mode;
2250 const struct real_format *fmt;
2252 fmt = real_format_for_mode[mode - QFmode];
2256 return real_to_target_fmt (buf, r, fmt);
2259 /* Read R from the given target format. Read the words of the result
2260 in target word order in BUF. There are always 32 bits in each
2261 long, no matter the size of the host long. */
2264 real_from_target_fmt (r, buf, fmt)
2267 const struct real_format *fmt;
2269 (*fmt->decode) (fmt, r, buf);
2272 /* Similar, but look up the format from MODE. */
2275 real_from_target (r, buf, mode)
2278 enum machine_mode mode;
2280 const struct real_format *fmt;
2282 fmt = real_format_for_mode[mode - QFmode];
2286 (*fmt->decode) (fmt, r, buf);
2289 /* Return the number of bits in the significand for MODE. */
2290 /* ??? Legacy. Should get access to real_format directly. */
2293 significand_size (mode)
2294 enum machine_mode mode;
2296 const struct real_format *fmt;
2298 fmt = real_format_for_mode[mode - QFmode];
2302 return fmt->p * fmt->log2_b;
2305 /* Return a hash value for the given real value. */
2306 /* ??? The "unsigned int" return value is intended to be hashval_t,
2307 but I didn't want to pull hashtab.h into real.h. */
2311 const REAL_VALUE_TYPE *r;
2316 h = r->class | (r->sign << 2);
2328 if (sizeof(unsigned long) > sizeof(unsigned int))
2329 for (i = 0; i < SIGSZ; ++i)
2331 unsigned long s = r->sig[i];
2332 h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
2335 for (i = 0; i < SIGSZ; ++i)
2346 /* IEEE single-precision format. */
2348 static void encode_ieee_single PARAMS ((const struct real_format *fmt,
2349 long *, const REAL_VALUE_TYPE *));
2350 static void decode_ieee_single PARAMS ((const struct real_format *,
2351 REAL_VALUE_TYPE *, const long *));
2354 encode_ieee_single (fmt, buf, r)
2355 const struct real_format *fmt;
2357 const REAL_VALUE_TYPE *r;
2359 unsigned long image, sig, exp;
2360 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2362 image = r->sign << 31;
2363 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
2374 image |= 0x7fffffff;
2382 if (!fmt->qnan_msb_set)
2383 image ^= 1 << 23 | 1 << 22;
2386 image |= 0x7fffffff;
2390 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2391 whereas the intermediate representation is 0.F x 2**exp.
2392 Which means we're off by one. */
2396 exp = r->exp + 127 - 1;
2409 decode_ieee_single (fmt, r, buf)
2410 const struct real_format *fmt;
2414 unsigned long image = buf[0] & 0xffffffff;
2415 bool sign = (image >> 31) & 1;
2416 int exp = (image >> 23) & 0xff;
2418 memset (r, 0, sizeof (*r));
2419 image <<= HOST_BITS_PER_LONG - 24;
2424 if (image && fmt->has_denorm)
2426 r->class = rvc_normal;
2429 r->sig[SIGSZ-1] = image << 1;
2432 else if (fmt->has_signed_zero)
2435 else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
2441 if (!fmt->qnan_msb_set)
2442 image ^= (SIG_MSB >> 1 | SIG_MSB >> 2);
2443 r->sig[SIGSZ-1] = image;
2453 r->class = rvc_normal;
2455 r->exp = exp - 127 + 1;
2456 r->sig[SIGSZ-1] = image | SIG_MSB;
2460 const struct real_format ieee_single_format =
2477 /* IEEE double-precision format. */
2479 static void encode_ieee_double PARAMS ((const struct real_format *fmt,
2480 long *, const REAL_VALUE_TYPE *));
2481 static void decode_ieee_double PARAMS ((const struct real_format *,
2482 REAL_VALUE_TYPE *, const long *));
2485 encode_ieee_double (fmt, buf, r)
2486 const struct real_format *fmt;
2488 const REAL_VALUE_TYPE *r;
2490 unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
2491 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2493 image_hi = r->sign << 31;
2496 if (HOST_BITS_PER_LONG == 64)
2498 sig_hi = r->sig[SIGSZ-1];
2499 sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
2500 sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
2504 sig_hi = r->sig[SIGSZ-1];
2505 sig_lo = r->sig[SIGSZ-2];
2506 sig_lo = (sig_hi << 21) | (sig_lo >> 11);
2507 sig_hi = (sig_hi >> 11) & 0xfffff;
2517 image_hi |= 2047 << 20;
2520 image_hi |= 0x7fffffff;
2521 image_lo = 0xffffffff;
2528 image_hi |= 2047 << 20;
2530 if (!fmt->qnan_msb_set)
2531 image_hi ^= 1 << 19 | 1 << 18;
2536 image_hi |= 0x7fffffff;
2537 image_lo = 0xffffffff;
2542 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2543 whereas the intermediate representation is 0.F x 2**exp.
2544 Which means we're off by one. */
2548 exp = r->exp + 1023 - 1;
2549 image_hi |= exp << 20;
2558 if (FLOAT_WORDS_BIG_ENDIAN)
2559 buf[0] = image_hi, buf[1] = image_lo;
2561 buf[0] = image_lo, buf[1] = image_hi;
2565 decode_ieee_double (fmt, r, buf)
2566 const struct real_format *fmt;
2570 unsigned long image_hi, image_lo;
2574 if (FLOAT_WORDS_BIG_ENDIAN)
2575 image_hi = buf[0], image_lo = buf[1];
2577 image_lo = buf[0], image_hi = buf[1];
2578 image_lo &= 0xffffffff;
2579 image_hi &= 0xffffffff;
2581 sign = (image_hi >> 31) & 1;
2582 exp = (image_hi >> 20) & 0x7ff;
2584 memset (r, 0, sizeof (*r));
2586 image_hi <<= 32 - 21;
2587 image_hi |= image_lo >> 21;
2588 image_hi &= 0x7fffffff;
2589 image_lo <<= 32 - 21;
2593 if ((image_hi || image_lo) && fmt->has_denorm)
2595 r->class = rvc_normal;
2598 if (HOST_BITS_PER_LONG == 32)
2600 image_hi = (image_hi << 1) | (image_lo >> 31);
2602 r->sig[SIGSZ-1] = image_hi;
2603 r->sig[SIGSZ-2] = image_lo;
2607 image_hi = (image_hi << 31 << 2) | (image_lo << 1);
2608 r->sig[SIGSZ-1] = image_hi;
2612 else if (fmt->has_signed_zero)
2615 else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
2617 if (image_hi || image_lo)
2621 if (HOST_BITS_PER_LONG == 32)
2623 r->sig[SIGSZ-1] = image_hi;
2624 r->sig[SIGSZ-2] = image_lo;
2627 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
2629 if (!fmt->qnan_msb_set)
2630 r->sig[SIGSZ-1] ^= (SIG_MSB >> 1 | SIG_MSB >> 2);
2640 r->class = rvc_normal;
2642 r->exp = exp - 1023 + 1;
2643 if (HOST_BITS_PER_LONG == 32)
2645 r->sig[SIGSZ-1] = image_hi | SIG_MSB;
2646 r->sig[SIGSZ-2] = image_lo;
2649 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
2653 const struct real_format ieee_double_format =
2670 /* IEEE extended double precision format. This comes in three
2671 flavours: Intel's as a 12 byte image, Intel's as a 16 byte image,
2674 static void encode_ieee_extended PARAMS ((const struct real_format *fmt,
2675 long *, const REAL_VALUE_TYPE *));
2676 static void decode_ieee_extended PARAMS ((const struct real_format *,
2677 REAL_VALUE_TYPE *, const long *));
2679 static void encode_ieee_extended_128 PARAMS ((const struct real_format *fmt,
2681 const REAL_VALUE_TYPE *));
2682 static void decode_ieee_extended_128 PARAMS ((const struct real_format *,
2687 encode_ieee_extended (fmt, buf, r)
2688 const struct real_format *fmt;
2690 const REAL_VALUE_TYPE *r;
2692 unsigned long image_hi, sig_hi, sig_lo;
2693 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
2695 image_hi = r->sign << 15;
2696 sig_hi = sig_lo = 0;
2708 /* Intel requires the explicit integer bit to be set, otherwise
2709 it considers the value a "pseudo-infinity". Motorola docs
2710 say it doesn't care. */
2711 sig_hi = 0x80000000;
2716 sig_lo = sig_hi = 0xffffffff;
2724 if (HOST_BITS_PER_LONG == 32)
2726 sig_hi = r->sig[SIGSZ-1];
2727 sig_lo = r->sig[SIGSZ-2];
2731 sig_lo = r->sig[SIGSZ-1];
2732 sig_hi = sig_lo >> 31 >> 1;
2733 sig_lo &= 0xffffffff;
2735 if (!fmt->qnan_msb_set)
2736 sig_hi ^= 1 << 30 | 1 << 29;
2738 /* Intel requires the explicit integer bit to be set, otherwise
2739 it considers the value a "pseudo-nan". Motorola docs say it
2741 sig_hi |= 0x80000000;
2746 sig_lo = sig_hi = 0xffffffff;
2754 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
2755 whereas the intermediate representation is 0.F x 2**exp.
2756 Which means we're off by one.
2758 Except for Motorola, which consider exp=0 and explicit
2759 integer bit set to continue to be normalized. In theory
2760 this descrepency has been taken care of by the difference
2761 in fmt->emin in round_for_format. */
2773 if (HOST_BITS_PER_LONG == 32)
2775 sig_hi = r->sig[SIGSZ-1];
2776 sig_lo = r->sig[SIGSZ-2];
2780 sig_lo = r->sig[SIGSZ-1];
2781 sig_hi = sig_lo >> 31 >> 1;
2782 sig_lo &= 0xffffffff;
2791 if (FLOAT_WORDS_BIG_ENDIAN)
2792 buf[0] = image_hi << 16, buf[1] = sig_hi, buf[2] = sig_lo;
2794 buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
2798 encode_ieee_extended_128 (fmt, buf, r)
2799 const struct real_format *fmt;
2801 const REAL_VALUE_TYPE *r;
2803 buf[3 * !FLOAT_WORDS_BIG_ENDIAN] = 0;
2804 encode_ieee_extended (fmt, buf+!!FLOAT_WORDS_BIG_ENDIAN, r);
2808 decode_ieee_extended (fmt, r, buf)
2809 const struct real_format *fmt;
2813 unsigned long image_hi, sig_hi, sig_lo;
2817 if (FLOAT_WORDS_BIG_ENDIAN)
2818 image_hi = buf[0] >> 16, sig_hi = buf[1], sig_lo = buf[2];
2820 sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
2821 sig_lo &= 0xffffffff;
2822 sig_hi &= 0xffffffff;
2823 image_hi &= 0xffffffff;
2825 sign = (image_hi >> 15) & 1;
2826 exp = image_hi & 0x7fff;
2828 memset (r, 0, sizeof (*r));
2832 if ((sig_hi || sig_lo) && fmt->has_denorm)
2834 r->class = rvc_normal;
2837 /* When the IEEE format contains a hidden bit, we know that
2838 it's zero at this point, and so shift up the significand
2839 and decrease the exponent to match. In this case, Motorola
2840 defines the explicit integer bit to be valid, so we don't
2841 know whether the msb is set or not. */
2843 if (HOST_BITS_PER_LONG == 32)
2845 r->sig[SIGSZ-1] = sig_hi;
2846 r->sig[SIGSZ-2] = sig_lo;
2849 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
2853 else if (fmt->has_signed_zero)
2856 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
2858 /* See above re "pseudo-infinities" and "pseudo-nans".
2859 Short summary is that the MSB will likely always be
2860 set, and that we don't care about it. */
2861 sig_hi &= 0x7fffffff;
2863 if (sig_hi || sig_lo)
2867 if (HOST_BITS_PER_LONG == 32)
2869 r->sig[SIGSZ-1] = sig_hi;
2870 r->sig[SIGSZ-2] = sig_lo;
2873 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
2875 if (!fmt->qnan_msb_set)
2876 r->sig[SIGSZ-1] ^= (SIG_MSB >> 1 | SIG_MSB >> 2);
2886 r->class = rvc_normal;
2888 r->exp = exp - 16383 + 1;
2889 if (HOST_BITS_PER_LONG == 32)
2891 r->sig[SIGSZ-1] = sig_hi;
2892 r->sig[SIGSZ-2] = sig_lo;
2895 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
2900 decode_ieee_extended_128 (fmt, r, buf)
2901 const struct real_format *fmt;
2905 decode_ieee_extended (fmt, r, buf+!!FLOAT_WORDS_BIG_ENDIAN);
2908 const struct real_format ieee_extended_motorola_format =
2910 encode_ieee_extended,
2911 decode_ieee_extended,
2924 const struct real_format ieee_extended_intel_96_format =
2926 encode_ieee_extended,
2927 decode_ieee_extended,
2940 const struct real_format ieee_extended_intel_128_format =
2942 encode_ieee_extended_128,
2943 decode_ieee_extended_128,
2957 /* IBM 128-bit extended precision format: a pair of IEEE double precision
2958 numbers whose sum is equal to the extended precision value. The number
2959 with greater magnitude is first. This format has the same magnitude
2960 range as an IEEE double precision value, but effectively 106 bits of
2961 significand precision. Infinity and NaN are represented by their IEEE
2962 double precision value stored in the first number, the second number is
2963 ignored. Zeroes, Infinities, and NaNs are set in both doubles
2964 due to precedent. */
2966 static void encode_ibm_extended PARAMS ((const struct real_format *fmt,
2967 long *, const REAL_VALUE_TYPE *));
2968 static void decode_ibm_extended PARAMS ((const struct real_format *,
2969 REAL_VALUE_TYPE *, const long *));
2972 encode_ibm_extended (fmt, buf, r)
2973 const struct real_format *fmt ATTRIBUTE_UNUSED;
2975 const REAL_VALUE_TYPE *r;
2977 REAL_VALUE_TYPE u, v;
2982 /* Both doubles have sign bit set. */
2983 buf[0] = FLOAT_WORDS_BIG_ENDIAN ? r->sign << 31 : 0;
2984 buf[1] = FLOAT_WORDS_BIG_ENDIAN ? 0 : r->sign << 31;
2991 /* Both doubles set to Inf / NaN. */
2992 encode_ieee_double (&ieee_double_format, &buf[0], r);
2998 /* u = IEEE double precision portion of significand. */
3000 clear_significand_below (&u, SIGNIFICAND_BITS - 53);
3002 /* v = remainder containing additional 53 bits of significand. */
3003 do_add (&v, r, &u, 1);
3005 encode_ieee_double (&ieee_double_format, &buf[0], &u);
3006 encode_ieee_double (&ieee_double_format, &buf[2], &v);
3015 decode_ibm_extended (fmt, r, buf)
3016 const struct real_format *fmt ATTRIBUTE_UNUSED;
3020 REAL_VALUE_TYPE u, v;
3022 decode_ieee_double (&ieee_double_format, &u, &buf[0]);
3024 if (u.class != rvc_zero && u.class != rvc_inf && u.class != rvc_nan)
3026 decode_ieee_double (&ieee_double_format, &v, &buf[2]);
3027 do_add (r, &u, &v, 0);
3033 const struct real_format ibm_extended_format =
3035 encode_ibm_extended,
3036 decode_ibm_extended,
3050 /* IEEE quad precision format. */
3052 static void encode_ieee_quad PARAMS ((const struct real_format *fmt,
3053 long *, const REAL_VALUE_TYPE *));
3054 static void decode_ieee_quad PARAMS ((const struct real_format *,
3055 REAL_VALUE_TYPE *, const long *));
3058 encode_ieee_quad (fmt, buf, r)
3059 const struct real_format *fmt;
3061 const REAL_VALUE_TYPE *r;
3063 unsigned long image3, image2, image1, image0, exp;
3064 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
3067 image3 = r->sign << 31;
3072 rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
3081 image3 |= 32767 << 16;
3084 image3 |= 0x7fffffff;
3085 image2 = 0xffffffff;
3086 image1 = 0xffffffff;
3087 image0 = 0xffffffff;
3094 image3 |= 32767 << 16;
3096 if (HOST_BITS_PER_LONG == 32)
3101 image3 |= u.sig[3] & 0xffff;
3106 image1 = image0 >> 31 >> 1;
3108 image3 |= (image2 >> 31 >> 1) & 0xffff;
3109 image0 &= 0xffffffff;
3110 image2 &= 0xffffffff;
3113 if (!fmt->qnan_msb_set)
3114 image3 ^= 1 << 15 | 1 << 14;
3118 image3 |= 0x7fffffff;
3119 image2 = 0xffffffff;
3120 image1 = 0xffffffff;
3121 image0 = 0xffffffff;
3126 /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
3127 whereas the intermediate representation is 0.F x 2**exp.
3128 Which means we're off by one. */
3132 exp = r->exp + 16383 - 1;
3133 image3 |= exp << 16;
3135 if (HOST_BITS_PER_LONG == 32)
3140 image3 |= u.sig[3] & 0xffff;
3145 image1 = image0 >> 31 >> 1;
3147 image3 |= (image2 >> 31 >> 1) & 0xffff;
3148 image0 &= 0xffffffff;
3149 image2 &= 0xffffffff;
3157 if (FLOAT_WORDS_BIG_ENDIAN)
3174 decode_ieee_quad (fmt, r, buf)
3175 const struct real_format *fmt;
3179 unsigned long image3, image2, image1, image0;
3183 if (FLOAT_WORDS_BIG_ENDIAN)
3197 image0 &= 0xffffffff;
3198 image1 &= 0xffffffff;
3199 image2 &= 0xffffffff;
3201 sign = (image3 >> 31) & 1;
3202 exp = (image3 >> 16) & 0x7fff;
3205 memset (r, 0, sizeof (*r));
3209 if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
3211 r->class = rvc_normal;
3214 r->exp = -16382 + (SIGNIFICAND_BITS - 112);
3215 if (HOST_BITS_PER_LONG == 32)
3224 r->sig[0] = (image1 << 31 << 1) | image0;
3225 r->sig[1] = (image3 << 31 << 1) | image2;
3230 else if (fmt->has_signed_zero)
3233 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
3235 if (image3 | image2 | image1 | image0)
3240 if (HOST_BITS_PER_LONG == 32)
3249 r->sig[0] = (image1 << 31 << 1) | image0;
3250 r->sig[1] = (image3 << 31 << 1) | image2;
3252 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3254 if (!fmt->qnan_msb_set)
3255 r->sig[SIGSZ-1] ^= (SIG_MSB >> 1 | SIG_MSB >> 2);
3265 r->class = rvc_normal;
3267 r->exp = exp - 16383 + 1;
3269 if (HOST_BITS_PER_LONG == 32)
3278 r->sig[0] = (image1 << 31 << 1) | image0;
3279 r->sig[1] = (image3 << 31 << 1) | image2;
3281 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
3282 r->sig[SIGSZ-1] |= SIG_MSB;
3286 const struct real_format ieee_quad_format =
3302 /* Descriptions of VAX floating point formats can be found beginning at
3304 http://www.openvms.compaq.com:8000/73final/4515/4515pro_013.html#f_floating_point_format
3306 The thing to remember is that they're almost IEEE, except for word
3307 order, exponent bias, and the lack of infinities, nans, and denormals.
3309 We don't implement the H_floating format here, simply because neither
3310 the VAX or Alpha ports use it. */
3312 static void encode_vax_f PARAMS ((const struct real_format *fmt,
3313 long *, const REAL_VALUE_TYPE *));
3314 static void decode_vax_f PARAMS ((const struct real_format *,
3315 REAL_VALUE_TYPE *, const long *));
3316 static void encode_vax_d PARAMS ((const struct real_format *fmt,
3317 long *, const REAL_VALUE_TYPE *));
3318 static void decode_vax_d PARAMS ((const struct real_format *,
3319 REAL_VALUE_TYPE *, const long *));
3320 static void encode_vax_g PARAMS ((const struct real_format *fmt,
3321 long *, const REAL_VALUE_TYPE *));
3322 static void decode_vax_g PARAMS ((const struct real_format *,
3323 REAL_VALUE_TYPE *, const long *));
3326 encode_vax_f (fmt, buf, r)
3327 const struct real_format *fmt ATTRIBUTE_UNUSED;
3329 const REAL_VALUE_TYPE *r;
3331 unsigned long sign, exp, sig, image;
3333 sign = r->sign << 15;
3343 image = 0xffff7fff | sign;
3347 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
3350 image = (sig << 16) & 0xffff0000;
3364 decode_vax_f (fmt, r, buf)
3365 const struct real_format *fmt ATTRIBUTE_UNUSED;
3369 unsigned long image = buf[0] & 0xffffffff;
3370 int exp = (image >> 7) & 0xff;
3372 memset (r, 0, sizeof (*r));
3376 r->class = rvc_normal;
3377 r->sign = (image >> 15) & 1;
3380 image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
3381 r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
3386 encode_vax_d (fmt, buf, r)
3387 const struct real_format *fmt ATTRIBUTE_UNUSED;
3389 const REAL_VALUE_TYPE *r;
3391 unsigned long image0, image1, sign = r->sign << 15;
3396 image0 = image1 = 0;
3401 image0 = 0xffff7fff | sign;
3402 image1 = 0xffffffff;
3406 /* Extract the significand into straight hi:lo. */
3407 if (HOST_BITS_PER_LONG == 64)
3409 image0 = r->sig[SIGSZ-1];
3410 image1 = (image0 >> (64 - 56)) & 0xffffffff;
3411 image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
3415 image0 = r->sig[SIGSZ-1];
3416 image1 = r->sig[SIGSZ-2];
3417 image1 = (image0 << 24) | (image1 >> 8);
3418 image0 = (image0 >> 8) & 0xffffff;
3421 /* Rearrange the half-words of the significand to match the
3423 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
3424 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3426 /* Add the sign and exponent. */
3428 image0 |= (r->exp + 128) << 7;
3435 if (FLOAT_WORDS_BIG_ENDIAN)
3436 buf[0] = image1, buf[1] = image0;
3438 buf[0] = image0, buf[1] = image1;
3442 decode_vax_d (fmt, r, buf)
3443 const struct real_format *fmt ATTRIBUTE_UNUSED;
3447 unsigned long image0, image1;
3450 if (FLOAT_WORDS_BIG_ENDIAN)
3451 image1 = buf[0], image0 = buf[1];
3453 image0 = buf[0], image1 = buf[1];
3454 image0 &= 0xffffffff;
3455 image1 &= 0xffffffff;
3457 exp = (image0 >> 7) & 0x7f;
3459 memset (r, 0, sizeof (*r));
3463 r->class = rvc_normal;
3464 r->sign = (image0 >> 15) & 1;
3467 /* Rearrange the half-words of the external format into
3468 proper ascending order. */
3469 image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
3470 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3472 if (HOST_BITS_PER_LONG == 64)
3474 image0 = (image0 << 31 << 1) | image1;
3477 r->sig[SIGSZ-1] = image0;
3481 r->sig[SIGSZ-1] = image0;
3482 r->sig[SIGSZ-2] = image1;
3483 lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
3484 r->sig[SIGSZ-1] |= SIG_MSB;
3490 encode_vax_g (fmt, buf, r)
3491 const struct real_format *fmt ATTRIBUTE_UNUSED;
3493 const REAL_VALUE_TYPE *r;
3495 unsigned long image0, image1, sign = r->sign << 15;
3500 image0 = image1 = 0;
3505 image0 = 0xffff7fff | sign;
3506 image1 = 0xffffffff;
3510 /* Extract the significand into straight hi:lo. */
3511 if (HOST_BITS_PER_LONG == 64)
3513 image0 = r->sig[SIGSZ-1];
3514 image1 = (image0 >> (64 - 53)) & 0xffffffff;
3515 image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
3519 image0 = r->sig[SIGSZ-1];
3520 image1 = r->sig[SIGSZ-2];
3521 image1 = (image0 << 21) | (image1 >> 11);
3522 image0 = (image0 >> 11) & 0xfffff;
3525 /* Rearrange the half-words of the significand to match the
3527 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
3528 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
3530 /* Add the sign and exponent. */
3532 image0 |= (r->exp + 1024) << 4;
3539 if (FLOAT_WORDS_BIG_ENDIAN)
3540 buf[0] = image1, buf[1] = image0;
3542 buf[0] = image0, buf[1] = image1;
3546 decode_vax_g (fmt, r, buf)
3547 const struct real_format *fmt ATTRIBUTE_UNUSED;
3551 unsigned long image0, image1;
3554 if (FLOAT_WORDS_BIG_ENDIAN)
3555 image1 = buf[0], image0 = buf[1];
3557 image0 = buf[0], image1 = buf[1];
3558 image0 &= 0xffffffff;
3559 image1 &= 0xffffffff;
3561 exp = (image0 >> 4) & 0x7ff;
3563 memset (r, 0, sizeof (*r));
3567 r->class = rvc_normal;
3568 r->sign = (image0 >> 15) & 1;
3569 r->exp = exp - 1024;
3571 /* Rearrange the half-words of the external format into
3572 proper ascending order. */
3573 image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
3574 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
3576 if (HOST_BITS_PER_LONG == 64)
3578 image0 = (image0 << 31 << 1) | image1;
3581 r->sig[SIGSZ-1] = image0;
3585 r->sig[SIGSZ-1] = image0;
3586 r->sig[SIGSZ-2] = image1;
3587 lshift_significand (r, r, 64 - 53);
3588 r->sig[SIGSZ-1] |= SIG_MSB;
3593 const struct real_format vax_f_format =
3609 const struct real_format vax_d_format =
3625 const struct real_format vax_g_format =
3641 /* A good reference for these can be found in chapter 9 of
3642 "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
3643 An on-line version can be found here:
3645 http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
3648 static void encode_i370_single PARAMS ((const struct real_format *fmt,
3649 long *, const REAL_VALUE_TYPE *));
3650 static void decode_i370_single PARAMS ((const struct real_format *,
3651 REAL_VALUE_TYPE *, const long *));
3652 static void encode_i370_double PARAMS ((const struct real_format *fmt,
3653 long *, const REAL_VALUE_TYPE *));
3654 static void decode_i370_double PARAMS ((const struct real_format *,
3655 REAL_VALUE_TYPE *, const long *));
3658 encode_i370_single (fmt, buf, r)
3659 const struct real_format *fmt ATTRIBUTE_UNUSED;
3661 const REAL_VALUE_TYPE *r;
3663 unsigned long sign, exp, sig, image;
3665 sign = r->sign << 31;
3675 image = 0x7fffffff | sign;
3679 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
3680 exp = ((r->exp / 4) + 64) << 24;
3681 image = sign | exp | sig;
3692 decode_i370_single (fmt, r, buf)
3693 const struct real_format *fmt ATTRIBUTE_UNUSED;
3697 unsigned long sign, sig, image = buf[0];
3700 sign = (image >> 31) & 1;
3701 exp = (image >> 24) & 0x7f;
3702 sig = image & 0xffffff;
3704 memset (r, 0, sizeof (*r));
3708 r->class = rvc_normal;
3710 r->exp = (exp - 64) * 4;
3711 r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
3717 encode_i370_double (fmt, buf, r)
3718 const struct real_format *fmt ATTRIBUTE_UNUSED;
3720 const REAL_VALUE_TYPE *r;
3722 unsigned long sign, exp, image_hi, image_lo;
3724 sign = r->sign << 31;
3729 image_hi = image_lo = 0;
3734 image_hi = 0x7fffffff | sign;
3735 image_lo = 0xffffffff;
3739 if (HOST_BITS_PER_LONG == 64)
3741 image_hi = r->sig[SIGSZ-1];
3742 image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
3743 image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
3747 image_hi = r->sig[SIGSZ-1];
3748 image_lo = r->sig[SIGSZ-2];
3749 image_lo = (image_lo >> 8) | (image_hi << 24);
3753 exp = ((r->exp / 4) + 64) << 24;
3754 image_hi |= sign | exp;
3761 if (FLOAT_WORDS_BIG_ENDIAN)
3762 buf[0] = image_hi, buf[1] = image_lo;
3764 buf[0] = image_lo, buf[1] = image_hi;
3768 decode_i370_double (fmt, r, buf)
3769 const struct real_format *fmt ATTRIBUTE_UNUSED;
3773 unsigned long sign, image_hi, image_lo;
3776 if (FLOAT_WORDS_BIG_ENDIAN)
3777 image_hi = buf[0], image_lo = buf[1];
3779 image_lo = buf[0], image_hi = buf[1];
3781 sign = (image_hi >> 31) & 1;
3782 exp = (image_hi >> 24) & 0x7f;
3783 image_hi &= 0xffffff;
3784 image_lo &= 0xffffffff;
3786 memset (r, 0, sizeof (*r));
3788 if (exp || image_hi || image_lo)
3790 r->class = rvc_normal;
3792 r->exp = (exp - 64) * 4 + (SIGNIFICAND_BITS - 56);
3794 if (HOST_BITS_PER_LONG == 32)
3796 r->sig[0] = image_lo;
3797 r->sig[1] = image_hi;
3800 r->sig[0] = image_lo | (image_hi << 31 << 1);
3806 const struct real_format i370_single_format =
3817 false, /* ??? The encoding does allow for "unnormals". */
3818 false, /* ??? The encoding does allow for "unnormals". */
3822 const struct real_format i370_double_format =
3833 false, /* ??? The encoding does allow for "unnormals". */
3834 false, /* ??? The encoding does allow for "unnormals". */
3838 /* The "twos-complement" c4x format is officially defined as
3842 This is rather misleading. One must remember that F is signed.
3843 A better description would be
3845 x = -1**s * ((s + 1 + .f) * 2**e
3847 So if we have a (4 bit) fraction of .1000 with a sign bit of 1,
3848 that's -1 * (1+1+(-.5)) == -1.5. I think.
3850 The constructions here are taken from Tables 5-1 and 5-2 of the
3851 TMS320C4x User's Guide wherein step-by-step instructions for
3852 conversion from IEEE are presented. That's close enough to our
3853 internal representation so as to make things easy.
3855 See http://www-s.ti.com/sc/psheets/spru063c/spru063c.pdf */
3857 static void encode_c4x_single PARAMS ((const struct real_format *fmt,
3858 long *, const REAL_VALUE_TYPE *));
3859 static void decode_c4x_single PARAMS ((const struct real_format *,
3860 REAL_VALUE_TYPE *, const long *));
3861 static void encode_c4x_extended PARAMS ((const struct real_format *fmt,
3862 long *, const REAL_VALUE_TYPE *));
3863 static void decode_c4x_extended PARAMS ((const struct real_format *,
3864 REAL_VALUE_TYPE *, const long *));
3867 encode_c4x_single (fmt, buf, r)
3868 const struct real_format *fmt ATTRIBUTE_UNUSED;
3870 const REAL_VALUE_TYPE *r;
3872 unsigned long image, exp, sig;
3884 sig = 0x800000 - r->sign;
3889 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
3904 image = ((exp & 0xff) << 24) | (sig & 0xffffff);
3909 decode_c4x_single (fmt, r, buf)
3910 const struct real_format *fmt ATTRIBUTE_UNUSED;
3914 unsigned long image = buf[0];
3918 exp = (((image >> 24) & 0xff) ^ 0x80) - 0x80;
3919 sf = ((image & 0xffffff) ^ 0x800000) - 0x800000;
3921 memset (r, 0, sizeof (*r));
3925 r->class = rvc_normal;
3927 sig = sf & 0x7fffff;
3936 sig = (sig << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
3939 r->sig[SIGSZ-1] = sig;
3944 encode_c4x_extended (fmt, buf, r)
3945 const struct real_format *fmt ATTRIBUTE_UNUSED;
3947 const REAL_VALUE_TYPE *r;
3949 unsigned long exp, sig;
3961 sig = 0x80000000 - r->sign;
3967 sig = r->sig[SIGSZ-1];
3968 if (HOST_BITS_PER_LONG == 64)
3969 sig = sig >> 1 >> 31;
3986 exp = (exp & 0xff) << 24;
3989 if (FLOAT_WORDS_BIG_ENDIAN)
3990 buf[0] = exp, buf[1] = sig;
3992 buf[0] = sig, buf[0] = exp;
3996 decode_c4x_extended (fmt, r, buf)
3997 const struct real_format *fmt ATTRIBUTE_UNUSED;
4004 if (FLOAT_WORDS_BIG_ENDIAN)
4005 exp = buf[0], sf = buf[1];
4007 sf = buf[0], exp = buf[1];
4009 exp = (((exp >> 24) & 0xff) & 0x80) - 0x80;
4010 sf = ((sf & 0xffffffff) ^ 0x80000000) - 0x80000000;
4012 memset (r, 0, sizeof (*r));
4016 r->class = rvc_normal;
4018 sig = sf & 0x7fffffff;
4027 if (HOST_BITS_PER_LONG == 64)
4028 sig = sig << 1 << 31;
4032 r->sig[SIGSZ-1] = sig;
4036 const struct real_format c4x_single_format =
4052 const struct real_format c4x_extended_format =
4054 encode_c4x_extended,
4055 decode_c4x_extended,
4068 /* Set up default mode to format mapping for IEEE. Everyone else has
4069 to set these values in OVERRIDE_OPTIONS. */
4071 const struct real_format *real_format_for_mode[TFmode - QFmode + 1] =
4076 &ieee_single_format, /* SFmode */
4077 &ieee_double_format, /* DFmode */
4079 /* We explicitly don't handle XFmode. There are two formats,
4080 pretty much equally common. Choose one in OVERRIDE_OPTIONS. */
4082 &ieee_quad_format /* TFmode */