00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "config.h"
00025 #include "system.h"
00026 #include "coretypes.h"
00027 #include "tm.h"
00028 #include "tree.h"
00029 #include "toplev.h"
00030 #include "real.h"
00031 #include "tm_p.h"
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 #define CLASS2(A, B) ((A) << 2 | (B))
00077
00078 #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
00079 #error "Some constant folding done by hand to avoid shift count warnings"
00080 #endif
00081
00082 static void get_zero (REAL_VALUE_TYPE *, int);
00083 static void get_canonical_qnan (REAL_VALUE_TYPE *, int);
00084 static void get_canonical_snan (REAL_VALUE_TYPE *, int);
00085 static void get_inf (REAL_VALUE_TYPE *, int);
00086 static bool sticky_rshift_significand (REAL_VALUE_TYPE *,
00087 const REAL_VALUE_TYPE *, unsigned int);
00088 static void rshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
00089 unsigned int);
00090 static void lshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
00091 unsigned int);
00092 static void lshift_significand_1 (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
00093 static bool add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *,
00094 const REAL_VALUE_TYPE *);
00095 static bool sub_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
00096 const REAL_VALUE_TYPE *, int);
00097 static void neg_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
00098 static int cmp_significands (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
00099 static int cmp_significand_0 (const REAL_VALUE_TYPE *);
00100 static void set_significand_bit (REAL_VALUE_TYPE *, unsigned int);
00101 static void clear_significand_bit (REAL_VALUE_TYPE *, unsigned int);
00102 static bool test_significand_bit (REAL_VALUE_TYPE *, unsigned int);
00103 static void clear_significand_below (REAL_VALUE_TYPE *, unsigned int);
00104 static bool div_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
00105 const REAL_VALUE_TYPE *);
00106 static void normalize (REAL_VALUE_TYPE *);
00107
00108 static bool do_add (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
00109 const REAL_VALUE_TYPE *, int);
00110 static bool do_multiply (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
00111 const REAL_VALUE_TYPE *);
00112 static bool do_divide (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
00113 const REAL_VALUE_TYPE *);
00114 static int do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
00115 static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
00116
00117 static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *);
00118
00119 static const REAL_VALUE_TYPE * ten_to_ptwo (int);
00120 static const REAL_VALUE_TYPE * ten_to_mptwo (int);
00121 static const REAL_VALUE_TYPE * real_digit (int);
00122 static void times_pten (REAL_VALUE_TYPE *, int);
00123
00124 static void round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
00125
00126
00127
00128 static inline void
00129 get_zero (REAL_VALUE_TYPE *r, int sign)
00130 {
00131 memset (r, 0, sizeof (*r));
00132 r->sign = sign;
00133 }
00134
00135
00136
00137 static inline void
00138 get_canonical_qnan (REAL_VALUE_TYPE *r, int sign)
00139 {
00140 memset (r, 0, sizeof (*r));
00141 r->cl = rvc_nan;
00142 r->sign = sign;
00143 r->canonical = 1;
00144 }
00145
00146 static inline void
00147 get_canonical_snan (REAL_VALUE_TYPE *r, int sign)
00148 {
00149 memset (r, 0, sizeof (*r));
00150 r->cl = rvc_nan;
00151 r->sign = sign;
00152 r->signalling = 1;
00153 r->canonical = 1;
00154 }
00155
00156 static inline void
00157 get_inf (REAL_VALUE_TYPE *r, int sign)
00158 {
00159 memset (r, 0, sizeof (*r));
00160 r->cl = rvc_inf;
00161 r->sign = sign;
00162 }
00163
00164
00165
00166
00167
00168 static bool
00169 sticky_rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
00170 unsigned int n)
00171 {
00172 unsigned long sticky = 0;
00173 unsigned int i, ofs = 0;
00174
00175 if (n >= HOST_BITS_PER_LONG)
00176 {
00177 for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i)
00178 sticky |= a->sig[i];
00179 n &= HOST_BITS_PER_LONG - 1;
00180 }
00181
00182 if (n != 0)
00183 {
00184 sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1);
00185 for (i = 0; i < SIGSZ; ++i)
00186 {
00187 r->sig[i]
00188 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
00189 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
00190 << (HOST_BITS_PER_LONG - n)));
00191 }
00192 }
00193 else
00194 {
00195 for (i = 0; ofs + i < SIGSZ; ++i)
00196 r->sig[i] = a->sig[ofs + i];
00197 for (; i < SIGSZ; ++i)
00198 r->sig[i] = 0;
00199 }
00200
00201 return sticky != 0;
00202 }
00203
00204
00205
00206
00207 static void
00208 rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
00209 unsigned int n)
00210 {
00211 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
00212
00213 n &= HOST_BITS_PER_LONG - 1;
00214 if (n != 0)
00215 {
00216 for (i = 0; i < SIGSZ; ++i)
00217 {
00218 r->sig[i]
00219 = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
00220 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
00221 << (HOST_BITS_PER_LONG - n)));
00222 }
00223 }
00224 else
00225 {
00226 for (i = 0; ofs + i < SIGSZ; ++i)
00227 r->sig[i] = a->sig[ofs + i];
00228 for (; i < SIGSZ; ++i)
00229 r->sig[i] = 0;
00230 }
00231 }
00232
00233
00234
00235
00236 static void
00237 lshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
00238 unsigned int n)
00239 {
00240 unsigned int i, ofs = n / HOST_BITS_PER_LONG;
00241
00242 n &= HOST_BITS_PER_LONG - 1;
00243 if (n == 0)
00244 {
00245 for (i = 0; ofs + i < SIGSZ; ++i)
00246 r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs];
00247 for (; i < SIGSZ; ++i)
00248 r->sig[SIGSZ-1-i] = 0;
00249 }
00250 else
00251 for (i = 0; i < SIGSZ; ++i)
00252 {
00253 r->sig[SIGSZ-1-i]
00254 = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n)
00255 | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1])
00256 >> (HOST_BITS_PER_LONG - n)));
00257 }
00258 }
00259
00260
00261
00262 static inline void
00263 lshift_significand_1 (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
00264 {
00265 unsigned int i;
00266
00267 for (i = SIGSZ - 1; i > 0; --i)
00268 r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1));
00269 r->sig[0] = a->sig[0] << 1;
00270 }
00271
00272
00273
00274
00275 static inline bool
00276 add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
00277 const REAL_VALUE_TYPE *b)
00278 {
00279 bool carry = false;
00280 int i;
00281
00282 for (i = 0; i < SIGSZ; ++i)
00283 {
00284 unsigned long ai = a->sig[i];
00285 unsigned long ri = ai + b->sig[i];
00286
00287 if (carry)
00288 {
00289 carry = ri < ai;
00290 carry |= ++ri == 0;
00291 }
00292 else
00293 carry = ri < ai;
00294
00295 r->sig[i] = ri;
00296 }
00297
00298 return carry;
00299 }
00300
00301
00302
00303
00304
00305 static inline bool
00306 sub_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
00307 const REAL_VALUE_TYPE *b, int carry)
00308 {
00309 int i;
00310
00311 for (i = 0; i < SIGSZ; ++i)
00312 {
00313 unsigned long ai = a->sig[i];
00314 unsigned long ri = ai - b->sig[i];
00315
00316 if (carry)
00317 {
00318 carry = ri > ai;
00319 carry |= ~--ri == 0;
00320 }
00321 else
00322 carry = ri > ai;
00323
00324 r->sig[i] = ri;
00325 }
00326
00327 return carry;
00328 }
00329
00330
00331
00332 static inline void
00333 neg_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
00334 {
00335 bool carry = true;
00336 int i;
00337
00338 for (i = 0; i < SIGSZ; ++i)
00339 {
00340 unsigned long ri, ai = a->sig[i];
00341
00342 if (carry)
00343 {
00344 if (ai)
00345 {
00346 ri = -ai;
00347 carry = false;
00348 }
00349 else
00350 ri = ai;
00351 }
00352 else
00353 ri = ~ai;
00354
00355 r->sig[i] = ri;
00356 }
00357 }
00358
00359
00360
00361 static inline int
00362 cmp_significands (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
00363 {
00364 int i;
00365
00366 for (i = SIGSZ - 1; i >= 0; --i)
00367 {
00368 unsigned long ai = a->sig[i];
00369 unsigned long bi = b->sig[i];
00370
00371 if (ai > bi)
00372 return 1;
00373 if (ai < bi)
00374 return -1;
00375 }
00376
00377 return 0;
00378 }
00379
00380
00381
00382 static inline int
00383 cmp_significand_0 (const REAL_VALUE_TYPE *a)
00384 {
00385 int i;
00386
00387 for (i = SIGSZ - 1; i >= 0; --i)
00388 if (a->sig[i])
00389 return 1;
00390
00391 return 0;
00392 }
00393
00394
00395
00396 static inline void
00397 set_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
00398 {
00399 r->sig[n / HOST_BITS_PER_LONG]
00400 |= (unsigned long)1 << (n % HOST_BITS_PER_LONG);
00401 }
00402
00403
00404
00405 static inline void
00406 clear_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
00407 {
00408 r->sig[n / HOST_BITS_PER_LONG]
00409 &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG));
00410 }
00411
00412
00413
00414 static inline bool
00415 test_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
00416 {
00417
00418
00419
00420 int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1;
00421 return t;
00422 }
00423
00424
00425
00426 static void
00427 clear_significand_below (REAL_VALUE_TYPE *r, unsigned int n)
00428 {
00429 int i, w = n / HOST_BITS_PER_LONG;
00430
00431 for (i = 0; i < w; ++i)
00432 r->sig[i] = 0;
00433
00434 r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1);
00435 }
00436
00437
00438
00439
00440 static inline bool
00441 div_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
00442 const REAL_VALUE_TYPE *b)
00443 {
00444 REAL_VALUE_TYPE u;
00445 int i, bit = SIGNIFICAND_BITS - 1;
00446 unsigned long msb, inexact;
00447
00448 u = *a;
00449 memset (r->sig, 0, sizeof (r->sig));
00450
00451 msb = 0;
00452 goto start;
00453 do
00454 {
00455 msb = u.sig[SIGSZ-1] & SIG_MSB;
00456 lshift_significand_1 (&u, &u);
00457 start:
00458 if (msb || cmp_significands (&u, b) >= 0)
00459 {
00460 sub_significands (&u, &u, b, 0);
00461 set_significand_bit (r, bit);
00462 }
00463 }
00464 while (--bit >= 0);
00465
00466 for (i = 0, inexact = 0; i < SIGSZ; i++)
00467 inexact |= u.sig[i];
00468
00469 return inexact != 0;
00470 }
00471
00472
00473
00474
00475
00476
00477 static void
00478 normalize (REAL_VALUE_TYPE *r)
00479 {
00480 int shift = 0, exp;
00481 int i, j;
00482
00483
00484 for (i = SIGSZ - 1; i >= 0; i--)
00485 if (r->sig[i] == 0)
00486 shift += HOST_BITS_PER_LONG;
00487 else
00488 break;
00489
00490
00491 if (i < 0)
00492 {
00493 r->cl = rvc_zero;
00494 SET_REAL_EXP (r, 0);
00495 return;
00496 }
00497
00498
00499 for (j = 0; ; j++)
00500 if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j)))
00501 break;
00502 shift += j;
00503
00504 if (shift > 0)
00505 {
00506 exp = REAL_EXP (r) - shift;
00507 if (exp > MAX_EXP)
00508 get_inf (r, r->sign);
00509 else if (exp < -MAX_EXP)
00510 get_zero (r, r->sign);
00511 else
00512 {
00513 SET_REAL_EXP (r, exp);
00514 lshift_significand (r, r, shift);
00515 }
00516 }
00517 }
00518
00519
00520
00521
00522 static bool
00523 do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
00524 const REAL_VALUE_TYPE *b, int subtract_p)
00525 {
00526 int dexp, sign, exp;
00527 REAL_VALUE_TYPE t;
00528 bool inexact = false;
00529
00530
00531 sign = a->sign;
00532 subtract_p = (sign ^ b->sign) ^ subtract_p;
00533
00534 switch (CLASS2 (a->cl, b->cl))
00535 {
00536 case CLASS2 (rvc_zero, rvc_zero):
00537
00538 get_zero (r, sign & !subtract_p);
00539 return false;
00540
00541 case CLASS2 (rvc_zero, rvc_normal):
00542 case CLASS2 (rvc_zero, rvc_inf):
00543 case CLASS2 (rvc_zero, rvc_nan):
00544
00545 case CLASS2 (rvc_normal, rvc_nan):
00546 case CLASS2 (rvc_inf, rvc_nan):
00547 case CLASS2 (rvc_nan, rvc_nan):
00548
00549 case CLASS2 (rvc_normal, rvc_inf):
00550
00551 *r = *b;
00552 r->sign = sign ^ subtract_p;
00553 return false;
00554
00555 case CLASS2 (rvc_normal, rvc_zero):
00556 case CLASS2 (rvc_inf, rvc_zero):
00557 case CLASS2 (rvc_nan, rvc_zero):
00558
00559 case CLASS2 (rvc_nan, rvc_normal):
00560 case CLASS2 (rvc_nan, rvc_inf):
00561
00562 case CLASS2 (rvc_inf, rvc_normal):
00563
00564 *r = *a;
00565 return false;
00566
00567 case CLASS2 (rvc_inf, rvc_inf):
00568 if (subtract_p)
00569
00570 get_canonical_qnan (r, 0);
00571 else
00572
00573 *r = *a;
00574 return false;
00575
00576 case CLASS2 (rvc_normal, rvc_normal):
00577 break;
00578
00579 default:
00580 gcc_unreachable ();
00581 }
00582
00583
00584 dexp = REAL_EXP (a) - REAL_EXP (b);
00585 if (dexp < 0)
00586 {
00587 const REAL_VALUE_TYPE *t;
00588 t = a, a = b, b = t;
00589 dexp = -dexp;
00590 sign ^= subtract_p;
00591 }
00592 exp = REAL_EXP (a);
00593
00594
00595
00596 if (dexp > 0)
00597 {
00598
00599
00600 if (dexp >= SIGNIFICAND_BITS)
00601 {
00602 *r = *a;
00603 r->sign = sign;
00604 return true;
00605 }
00606
00607 inexact |= sticky_rshift_significand (&t, b, dexp);
00608 b = &t;
00609 }
00610
00611 if (subtract_p)
00612 {
00613 if (sub_significands (r, a, b, inexact))
00614 {
00615
00616
00617
00618
00619 sign ^= 1;
00620 neg_significand (r, r);
00621 }
00622 }
00623 else
00624 {
00625 if (add_significands (r, a, b))
00626 {
00627
00628
00629
00630 inexact |= sticky_rshift_significand (r, r, 1);
00631 r->sig[SIGSZ-1] |= SIG_MSB;
00632 if (++exp > MAX_EXP)
00633 {
00634 get_inf (r, sign);
00635 return true;
00636 }
00637 }
00638 }
00639
00640 r->cl = rvc_normal;
00641 r->sign = sign;
00642 SET_REAL_EXP (r, exp);
00643
00644 r->signalling = 0;
00645 r->canonical = 0;
00646
00647
00648 normalize (r);
00649
00650
00651
00652 if (r->cl == rvc_zero)
00653 r->sign = 0;
00654 else
00655 r->sig[0] |= inexact;
00656
00657 return inexact;
00658 }
00659
00660
00661
00662 static bool
00663 do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
00664 const REAL_VALUE_TYPE *b)
00665 {
00666 REAL_VALUE_TYPE u, t, *rr;
00667 unsigned int i, j, k;
00668 int sign = a->sign ^ b->sign;
00669 bool inexact = false;
00670
00671 switch (CLASS2 (a->cl, b->cl))
00672 {
00673 case CLASS2 (rvc_zero, rvc_zero):
00674 case CLASS2 (rvc_zero, rvc_normal):
00675 case CLASS2 (rvc_normal, rvc_zero):
00676
00677 get_zero (r, sign);
00678 return false;
00679
00680 case CLASS2 (rvc_zero, rvc_nan):
00681 case CLASS2 (rvc_normal, rvc_nan):
00682 case CLASS2 (rvc_inf, rvc_nan):
00683 case CLASS2 (rvc_nan, rvc_nan):
00684
00685 *r = *b;
00686 r->sign = sign;
00687 return false;
00688
00689 case CLASS2 (rvc_nan, rvc_zero):
00690 case CLASS2 (rvc_nan, rvc_normal):
00691 case CLASS2 (rvc_nan, rvc_inf):
00692
00693 *r = *a;
00694 r->sign = sign;
00695 return false;
00696
00697 case CLASS2 (rvc_zero, rvc_inf):
00698 case CLASS2 (rvc_inf, rvc_zero):
00699
00700 get_canonical_qnan (r, sign);
00701 return false;
00702
00703 case CLASS2 (rvc_inf, rvc_inf):
00704 case CLASS2 (rvc_normal, rvc_inf):
00705 case CLASS2 (rvc_inf, rvc_normal):
00706
00707 get_inf (r, sign);
00708 return false;
00709
00710 case CLASS2 (rvc_normal, rvc_normal):
00711 break;
00712
00713 default:
00714 gcc_unreachable ();
00715 }
00716
00717 if (r == a || r == b)
00718 rr = &t;
00719 else
00720 rr = r;
00721 get_zero (rr, 0);
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741 for (i = 0; i < SIGSZ * 2; ++i)
00742 {
00743 unsigned long ai = a->sig[i / 2];
00744 if (i & 1)
00745 ai >>= HOST_BITS_PER_LONG / 2;
00746 else
00747 ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
00748
00749 if (ai == 0)
00750 continue;
00751
00752 for (j = 0; j < 2; ++j)
00753 {
00754 int exp = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
00755 + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2)));
00756
00757 if (exp > MAX_EXP)
00758 {
00759 get_inf (r, sign);
00760 return true;
00761 }
00762 if (exp < -MAX_EXP)
00763 {
00764
00765 inexact = true;
00766 continue;
00767 }
00768
00769 memset (&u, 0, sizeof (u));
00770 u.cl = rvc_normal;
00771 SET_REAL_EXP (&u, exp);
00772
00773 for (k = j; k < SIGSZ * 2; k += 2)
00774 {
00775 unsigned long bi = b->sig[k / 2];
00776 if (k & 1)
00777 bi >>= HOST_BITS_PER_LONG / 2;
00778 else
00779 bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
00780
00781 u.sig[k / 2] = ai * bi;
00782 }
00783
00784 normalize (&u);
00785 inexact |= do_add (rr, rr, &u, 0);
00786 }
00787 }
00788
00789 rr->sign = sign;
00790 if (rr != r)
00791 *r = t;
00792
00793 return inexact;
00794 }
00795
00796
00797
00798 static bool
00799 do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
00800 const REAL_VALUE_TYPE *b)
00801 {
00802 int exp, sign = a->sign ^ b->sign;
00803 REAL_VALUE_TYPE t, *rr;
00804 bool inexact;
00805
00806 switch (CLASS2 (a->cl, b->cl))
00807 {
00808 case CLASS2 (rvc_zero, rvc_zero):
00809
00810 case CLASS2 (rvc_inf, rvc_inf):
00811
00812 get_canonical_qnan (r, sign);
00813 return false;
00814
00815 case CLASS2 (rvc_zero, rvc_normal):
00816 case CLASS2 (rvc_zero, rvc_inf):
00817
00818 case CLASS2 (rvc_normal, rvc_inf):
00819
00820 get_zero (r, sign);
00821 return false;
00822
00823 case CLASS2 (rvc_normal, rvc_zero):
00824
00825 case CLASS2 (rvc_inf, rvc_zero):
00826
00827 get_inf (r, sign);
00828 return false;
00829
00830 case CLASS2 (rvc_zero, rvc_nan):
00831 case CLASS2 (rvc_normal, rvc_nan):
00832 case CLASS2 (rvc_inf, rvc_nan):
00833 case CLASS2 (rvc_nan, rvc_nan):
00834
00835 *r = *b;
00836 r->sign = sign;
00837 return false;
00838
00839 case CLASS2 (rvc_nan, rvc_zero):
00840 case CLASS2 (rvc_nan, rvc_normal):
00841 case CLASS2 (rvc_nan, rvc_inf):
00842
00843 *r = *a;
00844 r->sign = sign;
00845 return false;
00846
00847 case CLASS2 (rvc_inf, rvc_normal):
00848
00849 get_inf (r, sign);
00850 return false;
00851
00852 case CLASS2 (rvc_normal, rvc_normal):
00853 break;
00854
00855 default:
00856 gcc_unreachable ();
00857 }
00858
00859 if (r == a || r == b)
00860 rr = &t;
00861 else
00862 rr = r;
00863
00864
00865 get_zero (rr, 0);
00866 rr->cl = rvc_normal;
00867 rr->sign = sign;
00868
00869 exp = REAL_EXP (a) - REAL_EXP (b) + 1;
00870 if (exp > MAX_EXP)
00871 {
00872 get_inf (r, sign);
00873 return true;
00874 }
00875 if (exp < -MAX_EXP)
00876 {
00877 get_zero (r, sign);
00878 return true;
00879 }
00880 SET_REAL_EXP (rr, exp);
00881
00882 inexact = div_significands (rr, a, b);
00883
00884
00885 normalize (rr);
00886 rr->sig[0] |= inexact;
00887
00888 if (rr != r)
00889 *r = t;
00890
00891 return inexact;
00892 }
00893
00894
00895
00896
00897 static int
00898 do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
00899 int nan_result)
00900 {
00901 int ret;
00902
00903 switch (CLASS2 (a->cl, b->cl))
00904 {
00905 case CLASS2 (rvc_zero, rvc_zero):
00906
00907 return 0;
00908
00909 case CLASS2 (rvc_inf, rvc_zero):
00910 case CLASS2 (rvc_inf, rvc_normal):
00911 case CLASS2 (rvc_normal, rvc_zero):
00912 return (a->sign ? -1 : 1);
00913
00914 case CLASS2 (rvc_inf, rvc_inf):
00915 return -a->sign - -b->sign;
00916
00917 case CLASS2 (rvc_zero, rvc_normal):
00918 case CLASS2 (rvc_zero, rvc_inf):
00919 case CLASS2 (rvc_normal, rvc_inf):
00920 return (b->sign ? 1 : -1);
00921
00922 case CLASS2 (rvc_zero, rvc_nan):
00923 case CLASS2 (rvc_normal, rvc_nan):
00924 case CLASS2 (rvc_inf, rvc_nan):
00925 case CLASS2 (rvc_nan, rvc_nan):
00926 case CLASS2 (rvc_nan, rvc_zero):
00927 case CLASS2 (rvc_nan, rvc_normal):
00928 case CLASS2 (rvc_nan, rvc_inf):
00929 return nan_result;
00930
00931 case CLASS2 (rvc_normal, rvc_normal):
00932 break;
00933
00934 default:
00935 gcc_unreachable ();
00936 }
00937
00938 if (a->sign != b->sign)
00939 return -a->sign - -b->sign;
00940
00941 if (REAL_EXP (a) > REAL_EXP (b))
00942 ret = 1;
00943 else if (REAL_EXP (a) < REAL_EXP (b))
00944 ret = -1;
00945 else
00946 ret = cmp_significands (a, b);
00947
00948 return (a->sign ? -ret : ret);
00949 }
00950
00951
00952
00953 static void
00954 do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
00955 {
00956 *r = *a;
00957
00958 switch (r->cl)
00959 {
00960 case rvc_zero:
00961 case rvc_inf:
00962 case rvc_nan:
00963 break;
00964
00965 case rvc_normal:
00966 if (REAL_EXP (r) <= 0)
00967 get_zero (r, r->sign);
00968 else if (REAL_EXP (r) < SIGNIFICAND_BITS)
00969 clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r));
00970 break;
00971
00972 default:
00973 gcc_unreachable ();
00974 }
00975 }
00976
00977
00978
00979
00980
00981 bool
00982 real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
00983 const REAL_VALUE_TYPE *op1)
00984 {
00985 enum tree_code code = icode;
00986
00987 switch (code)
00988 {
00989 case PLUS_EXPR:
00990 return do_add (r, op0, op1, 0);
00991
00992 case MINUS_EXPR:
00993 return do_add (r, op0, op1, 1);
00994
00995 case MULT_EXPR:
00996 return do_multiply (r, op0, op1);
00997
00998 case RDIV_EXPR:
00999 return do_divide (r, op0, op1);
01000
01001 case MIN_EXPR:
01002 if (op1->cl == rvc_nan)
01003 *r = *op1;
01004 else if (do_compare (op0, op1, -1) < 0)
01005 *r = *op0;
01006 else
01007 *r = *op1;
01008 break;
01009
01010 case MAX_EXPR:
01011 if (op1->cl == rvc_nan)
01012 *r = *op1;
01013 else if (do_compare (op0, op1, 1) < 0)
01014 *r = *op1;
01015 else
01016 *r = *op0;
01017 break;
01018
01019 case NEGATE_EXPR:
01020 *r = *op0;
01021 r->sign ^= 1;
01022 break;
01023
01024 case ABS_EXPR:
01025 *r = *op0;
01026 r->sign = 0;
01027 break;
01028
01029 case FIX_TRUNC_EXPR:
01030 do_fix_trunc (r, op0);
01031 break;
01032
01033 default:
01034 gcc_unreachable ();
01035 }
01036 return false;
01037 }
01038
01039
01040
01041 REAL_VALUE_TYPE
01042 real_arithmetic2 (int icode, const REAL_VALUE_TYPE *op0,
01043 const REAL_VALUE_TYPE *op1)
01044 {
01045 REAL_VALUE_TYPE r;
01046 real_arithmetic (&r, icode, op0, op1);
01047 return r;
01048 }
01049
01050 bool
01051 real_compare (int icode, const REAL_VALUE_TYPE *op0,
01052 const REAL_VALUE_TYPE *op1)
01053 {
01054 enum tree_code code = icode;
01055
01056 switch (code)
01057 {
01058 case LT_EXPR:
01059 return do_compare (op0, op1, 1) < 0;
01060 case LE_EXPR:
01061 return do_compare (op0, op1, 1) <= 0;
01062 case GT_EXPR:
01063 return do_compare (op0, op1, -1) > 0;
01064 case GE_EXPR:
01065 return do_compare (op0, op1, -1) >= 0;
01066 case EQ_EXPR:
01067 return do_compare (op0, op1, -1) == 0;
01068 case NE_EXPR:
01069 return do_compare (op0, op1, -1) != 0;
01070 case UNORDERED_EXPR:
01071 return op0->cl == rvc_nan || op1->cl == rvc_nan;
01072 case ORDERED_EXPR:
01073 return op0->cl != rvc_nan && op1->cl != rvc_nan;
01074 case UNLT_EXPR:
01075 return do_compare (op0, op1, -1) < 0;
01076 case UNLE_EXPR:
01077 return do_compare (op0, op1, -1) <= 0;
01078 case UNGT_EXPR:
01079 return do_compare (op0, op1, 1) > 0;
01080 case UNGE_EXPR:
01081 return do_compare (op0, op1, 1) >= 0;
01082 case UNEQ_EXPR:
01083 return do_compare (op0, op1, 0) == 0;
01084 case LTGT_EXPR:
01085 return do_compare (op0, op1, 0) != 0;
01086
01087 default:
01088 gcc_unreachable ();
01089 }
01090 }
01091
01092
01093
01094 int
01095 real_exponent (const REAL_VALUE_TYPE *r)
01096 {
01097 switch (r->cl)
01098 {
01099 case rvc_zero:
01100 return 0;
01101 case rvc_inf:
01102 case rvc_nan:
01103 return (unsigned int)-1 >> 1;
01104 case rvc_normal:
01105 return REAL_EXP (r);
01106 default:
01107 gcc_unreachable ();
01108 }
01109 }
01110
01111
01112
01113 void
01114 real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
01115 {
01116 *r = *op0;
01117 switch (r->cl)
01118 {
01119 case rvc_zero:
01120 case rvc_inf:
01121 case rvc_nan:
01122 break;
01123
01124 case rvc_normal:
01125 exp += REAL_EXP (op0);
01126 if (exp > MAX_EXP)
01127 get_inf (r, r->sign);
01128 else if (exp < -MAX_EXP)
01129 get_zero (r, r->sign);
01130 else
01131 SET_REAL_EXP (r, exp);
01132 break;
01133
01134 default:
01135 gcc_unreachable ();
01136 }
01137 }
01138
01139
01140
01141 bool
01142 real_isinf (const REAL_VALUE_TYPE *r)
01143 {
01144 return (r->cl == rvc_inf);
01145 }
01146
01147
01148
01149 bool
01150 real_isnan (const REAL_VALUE_TYPE *r)
01151 {
01152 return (r->cl == rvc_nan);
01153 }
01154
01155
01156
01157 bool
01158 real_isneg (const REAL_VALUE_TYPE *r)
01159 {
01160 return r->sign;
01161 }
01162
01163
01164
01165 bool
01166 real_isnegzero (const REAL_VALUE_TYPE *r)
01167 {
01168 return r->sign && r->cl == rvc_zero;
01169 }
01170
01171
01172
01173 bool
01174 real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
01175 {
01176 int i;
01177
01178 if (a->cl != b->cl)
01179 return false;
01180 if (a->sign != b->sign)
01181 return false;
01182
01183 switch (a->cl)
01184 {
01185 case rvc_zero:
01186 case rvc_inf:
01187 return true;
01188
01189 case rvc_normal:
01190 if (REAL_EXP (a) != REAL_EXP (b))
01191 return false;
01192 break;
01193
01194 case rvc_nan:
01195 if (a->signalling != b->signalling)
01196 return false;
01197
01198 if (a->canonical || b->canonical)
01199 return a->canonical == b->canonical;
01200 break;
01201
01202 default:
01203 gcc_unreachable ();
01204 }
01205
01206 for (i = 0; i < SIGSZ; ++i)
01207 if (a->sig[i] != b->sig[i])
01208 return false;
01209
01210 return true;
01211 }
01212
01213
01214
01215
01216 bool
01217 exact_real_inverse (enum machine_mode mode, REAL_VALUE_TYPE *r)
01218 {
01219 const REAL_VALUE_TYPE *one = real_digit (1);
01220 REAL_VALUE_TYPE u;
01221 int i;
01222
01223 if (r->cl != rvc_normal)
01224 return false;
01225
01226
01227 for (i = 0; i < SIGSZ-1; ++i)
01228 if (r->sig[i] != 0)
01229 return false;
01230 if (r->sig[SIGSZ-1] != SIG_MSB)
01231 return false;
01232
01233
01234 do_divide (&u, one, r);
01235 real_convert (&u, mode, &u);
01236
01237
01238 if (u.cl != rvc_normal)
01239 return false;
01240 for (i = 0; i < SIGSZ-1; ++i)
01241 if (u.sig[i] != 0)
01242 return false;
01243 if (u.sig[SIGSZ-1] != SIG_MSB)
01244 return false;
01245
01246 *r = u;
01247 return true;
01248 }
01249
01250
01251
01252 HOST_WIDE_INT
01253 real_to_integer (const REAL_VALUE_TYPE *r)
01254 {
01255 unsigned HOST_WIDE_INT i;
01256
01257 switch (r->cl)
01258 {
01259 case rvc_zero:
01260 underflow:
01261 return 0;
01262
01263 case rvc_inf:
01264 case rvc_nan:
01265 overflow:
01266 i = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
01267 if (!r->sign)
01268 i--;
01269 return i;
01270
01271 case rvc_normal:
01272 if (REAL_EXP (r) <= 0)
01273 goto underflow;
01274
01275
01276
01277
01278 if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT)
01279 goto overflow;
01280
01281 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
01282 i = r->sig[SIGSZ-1];
01283 else
01284 {
01285 gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
01286 i = r->sig[SIGSZ-1];
01287 i = i << (HOST_BITS_PER_LONG - 1) << 1;
01288 i |= r->sig[SIGSZ-2];
01289 }
01290
01291 i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r);
01292
01293 if (r->sign)
01294 i = -i;
01295 return i;
01296
01297 default:
01298 gcc_unreachable ();
01299 }
01300 }
01301
01302
01303
01304 void
01305 real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
01306 const REAL_VALUE_TYPE *r)
01307 {
01308 REAL_VALUE_TYPE t;
01309 HOST_WIDE_INT low, high;
01310 int exp;
01311
01312 switch (r->cl)
01313 {
01314 case rvc_zero:
01315 underflow:
01316 low = high = 0;
01317 break;
01318
01319 case rvc_inf:
01320 case rvc_nan:
01321 overflow:
01322 high = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
01323 if (r->sign)
01324 low = 0;
01325 else
01326 {
01327 high--;
01328 low = -1;
01329 }
01330 break;
01331
01332 case rvc_normal:
01333 exp = REAL_EXP (r);
01334 if (exp <= 0)
01335 goto underflow;
01336
01337
01338
01339
01340 if (exp > 2*HOST_BITS_PER_WIDE_INT)
01341 goto overflow;
01342
01343 rshift_significand (&t, r, 2*HOST_BITS_PER_WIDE_INT - exp);
01344 if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
01345 {
01346 high = t.sig[SIGSZ-1];
01347 low = t.sig[SIGSZ-2];
01348 }
01349 else
01350 {
01351 gcc_assert (HOST_BITS_PER_WIDE_INT == 2*HOST_BITS_PER_LONG);
01352 high = t.sig[SIGSZ-1];
01353 high = high << (HOST_BITS_PER_LONG - 1) << 1;
01354 high |= t.sig[SIGSZ-2];
01355
01356 low = t.sig[SIGSZ-3];
01357 low = low << (HOST_BITS_PER_LONG - 1) << 1;
01358 low |= t.sig[SIGSZ-4];
01359 }
01360
01361 if (r->sign)
01362 {
01363 if (low == 0)
01364 high = -high;
01365 else
01366 low = -low, high = ~high;
01367 }
01368 break;
01369
01370 default:
01371 gcc_unreachable ();
01372 }
01373
01374 *plow = low;
01375 *phigh = high;
01376 }
01377
01378
01379
01380
01381
01382
01383 static unsigned long
01384 rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den)
01385 {
01386 unsigned long q, msb;
01387 int expn = REAL_EXP (num), expd = REAL_EXP (den);
01388
01389 if (expn < expd)
01390 return 0;
01391
01392 q = msb = 0;
01393 goto start;
01394 do
01395 {
01396 msb = num->sig[SIGSZ-1] & SIG_MSB;
01397 q <<= 1;
01398 lshift_significand_1 (num, num);
01399 start:
01400 if (msb || cmp_significands (num, den) >= 0)
01401 {
01402 sub_significands (num, num, den, 0);
01403 q |= 1;
01404 }
01405 }
01406 while (--expn >= expd);
01407
01408 SET_REAL_EXP (num, expd);
01409 normalize (num);
01410
01411 return q;
01412 }
01413
01414
01415
01416
01417
01418
01419 #define M_LOG10_2 0.30102999566398119521
01420
01421 void
01422 real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
01423 size_t digits, int crop_trailing_zeros)
01424 {
01425 const REAL_VALUE_TYPE *one, *ten;
01426 REAL_VALUE_TYPE r, pten, u, v;
01427 int dec_exp, cmp_one, digit;
01428 size_t max_digits;
01429 char *p, *first, *last;
01430 bool sign;
01431
01432 r = *r_orig;
01433 switch (r.cl)
01434 {
01435 case rvc_zero:
01436 strcpy (str, (r.sign ? "-0.0" : "0.0"));
01437 return;
01438 case rvc_normal:
01439 break;
01440 case rvc_inf:
01441 strcpy (str, (r.sign ? "-Inf" : "+Inf"));
01442 return;
01443 case rvc_nan:
01444
01445 strcpy (str, (r.sign ? "-NaN" : "+NaN"));
01446 return;
01447 default:
01448 gcc_unreachable ();
01449 }
01450
01451
01452 max_digits = SIGNIFICAND_BITS * M_LOG10_2;
01453 if (digits == 0 || digits > max_digits)
01454 digits = max_digits;
01455
01456
01457
01458
01459 dec_exp = REAL_EXP (&r) * M_LOG10_2;
01460 for (max_digits = 1; dec_exp ; max_digits++)
01461 dec_exp /= 10;
01462
01463
01464 max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
01465 gcc_assert (max_digits <= buf_size);
01466 if (digits > max_digits)
01467 digits = max_digits;
01468
01469 one = real_digit (1);
01470 ten = ten_to_ptwo (0);
01471
01472 sign = r.sign;
01473 r.sign = 0;
01474
01475 dec_exp = 0;
01476 pten = *one;
01477
01478 cmp_one = do_compare (&r, one, 0);
01479 if (cmp_one > 0)
01480 {
01481 int m;
01482
01483
01484
01485
01486 u = r;
01487 SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1);
01488
01489
01490 m = floor_log2 (max_digits);
01491
01492
01493
01494
01495
01496 do
01497 {
01498 REAL_VALUE_TYPE t;
01499
01500 do_divide (&t, &u, ten_to_ptwo (m));
01501 do_fix_trunc (&v, &t);
01502 if (cmp_significands (&v, &t) == 0)
01503 {
01504 u = t;
01505 dec_exp += 1 << m;
01506 }
01507 }
01508 while (--m >= 0);
01509
01510
01511 SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r)
01512 - (SIGNIFICAND_BITS - 1));
01513 r = u;
01514
01515
01516
01517
01518 if (REAL_EXP (&r) > 0)
01519 {
01520 m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1;
01521 do
01522 {
01523 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
01524 if (do_compare (&u, ptentwo, 0) >= 0)
01525 {
01526 do_divide (&u, &u, ptentwo);
01527 do_multiply (&pten, &pten, ptentwo);
01528 dec_exp += 1 << m;
01529 }
01530 }
01531 while (--m >= 0);
01532 }
01533 else
01534
01535
01536
01537 cmp_one = -1;
01538 }
01539 if (cmp_one < 0)
01540 {
01541 int m;
01542
01543
01544
01545
01546 v = r;
01547 while (1)
01548 {
01549
01550 if (v.sig[0] & 7)
01551 break;
01552
01553 do_multiply (&u, &v, ten);
01554
01555
01556 if (REAL_EXP (&u) > 0)
01557 break;
01558
01559 v = u;
01560 dec_exp -= 1;
01561 }
01562 r = v;
01563
01564
01565
01566
01567 m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1;
01568 do
01569 {
01570 const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
01571 const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
01572
01573 if (do_compare (&v, ptenmtwo, 0) <= 0)
01574 {
01575 do_multiply (&v, &v, ptentwo);
01576 do_multiply (&pten, &pten, ptentwo);
01577 dec_exp -= 1 << m;
01578 }
01579 }
01580 while (--m >= 0);
01581
01582
01583 do_divide (&pten, one, &pten);
01584 }
01585
01586 p = str;
01587 if (sign)
01588 *p++ = '-';
01589 first = p++;
01590
01591
01592
01593
01594
01595
01596
01597
01598
01599 digit = rtd_divmod (&r, &pten);
01600
01601
01602 if (digit == 0 && cmp_significand_0 (&r))
01603 {
01604
01605 do_multiply (&r, &r, ten);
01606 digit = rtd_divmod (&r, &pten);
01607 dec_exp -= 1;
01608 gcc_assert (digit != 0);
01609 }
01610
01611
01612 if (digit == 10)
01613 {
01614 *p++ = '1';
01615 if (--digits > 0)
01616 *p++ = '0';
01617 dec_exp += 1;
01618 }
01619 else
01620 {
01621 gcc_assert (digit <= 10);
01622 *p++ = digit + '0';
01623 }
01624
01625
01626 while (--digits > 0)
01627 {
01628 do_multiply (&r, &r, ten);
01629 digit = rtd_divmod (&r, &pten);
01630 *p++ = digit + '0';
01631 }
01632 last = p;
01633
01634
01635 do_multiply (&r, &r, ten);
01636 digit = rtd_divmod (&r, &pten);
01637
01638
01639 if (digit == 5)
01640 {
01641
01642
01643 if (cmp_significand_0 (&r))
01644 digit++;
01645
01646 else if ((p[-1] - '0') & 1)
01647 digit++;
01648 }
01649 if (digit > 5)
01650 {
01651 while (p > first)
01652 {
01653 digit = *--p;
01654 if (digit == '9')
01655 *p = '0';
01656 else
01657 {
01658 *p = digit + 1;
01659 break;
01660 }
01661 }
01662
01663
01664
01665 if (p == first)
01666 {
01667 first[1] = '1';
01668 dec_exp++;
01669 }
01670 }
01671
01672
01673 first[0] = first[1];
01674 first[1] = '.';
01675
01676
01677 if (crop_trailing_zeros)
01678 while (last > first + 3 && last[-1] == '0')
01679 last--;
01680
01681
01682 sprintf (last, "e%+d", dec_exp);
01683 }
01684
01685
01686
01687
01688
01689
01690 void
01691 real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
01692 size_t digits, int crop_trailing_zeros)
01693 {
01694 int i, j, exp = REAL_EXP (r);
01695 char *p, *first;
01696 char exp_buf[16];
01697 size_t max_digits;
01698
01699 switch (r->cl)
01700 {
01701 case rvc_zero:
01702 exp = 0;
01703 break;
01704 case rvc_normal:
01705 break;
01706 case rvc_inf:
01707 strcpy (str, (r->sign ? "-Inf" : "+Inf"));
01708 return;
01709 case rvc_nan:
01710
01711 strcpy (str, (r->sign ? "-NaN" : "+NaN"));
01712 return;
01713 default:
01714 gcc_unreachable ();
01715 }
01716
01717 if (digits == 0)
01718 digits = SIGNIFICAND_BITS / 4;
01719
01720
01721
01722 sprintf (exp_buf, "p%+d", exp);
01723 max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
01724 gcc_assert (max_digits <= buf_size);
01725 if (digits > max_digits)
01726 digits = max_digits;
01727
01728 p = str;
01729 if (r->sign)
01730 *p++ = '-';
01731 *p++ = '0';
01732 *p++ = 'x';
01733 *p++ = '0';
01734 *p++ = '.';
01735 first = p;
01736
01737 for (i = SIGSZ - 1; i >= 0; --i)
01738 for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
01739 {
01740 *p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
01741 if (--digits == 0)
01742 goto out;
01743 }
01744
01745 out:
01746 if (crop_trailing_zeros)
01747 while (p > first + 1 && p[-1] == '0')
01748 p--;
01749
01750 sprintf (p, "p%+d", exp);
01751 }
01752
01753
01754
01755
01756 void
01757 real_from_string (REAL_VALUE_TYPE *r, const char *str)
01758 {
01759 int exp = 0;
01760 bool sign = false;
01761
01762 get_zero (r, 0);
01763
01764 if (*str == '-')
01765 {
01766 sign = true;
01767 str++;
01768 }
01769 else if (*str == '+')
01770 str++;
01771
01772 if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
01773 {
01774
01775 int pos = SIGNIFICAND_BITS - 4, d;
01776
01777 str += 2;
01778
01779 while (*str == '0')
01780 str++;
01781 while (1)
01782 {
01783 d = hex_value (*str);
01784 if (d == _hex_bad)
01785 break;
01786 if (pos >= 0)
01787 {
01788 r->sig[pos / HOST_BITS_PER_LONG]
01789 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
01790 pos -= 4;
01791 }
01792 exp += 4;
01793 str++;
01794 }
01795 if (*str == '.')
01796 {
01797 str++;
01798 if (pos == SIGNIFICAND_BITS - 4)
01799 {
01800 while (*str == '0')
01801 str++, exp -= 4;
01802 }
01803 while (1)
01804 {
01805 d = hex_value (*str);
01806 if (d == _hex_bad)
01807 break;
01808 if (pos >= 0)
01809 {
01810 r->sig[pos / HOST_BITS_PER_LONG]
01811 |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
01812 pos -= 4;
01813 }
01814 str++;
01815 }
01816 }
01817 if (*str == 'p' || *str == 'P')
01818 {
01819 bool exp_neg = false;
01820
01821 str++;
01822 if (*str == '-')
01823 {
01824 exp_neg = true;
01825 str++;
01826 }
01827 else if (*str == '+')
01828 str++;
01829
01830 d = 0;
01831 while (ISDIGIT (*str))
01832 {
01833 d *= 10;
01834 d += *str - '0';
01835 if (d > MAX_EXP)
01836 {
01837
01838 if (exp_neg)
01839 goto underflow;
01840 else
01841 goto overflow;
01842 }
01843 str++;
01844 }
01845 if (exp_neg)
01846 d = -d;
01847
01848 exp += d;
01849 }
01850
01851 r->cl = rvc_normal;
01852 SET_REAL_EXP (r, exp);
01853
01854 normalize (r);
01855 }
01856 else
01857 {
01858
01859 const REAL_VALUE_TYPE *ten = ten_to_ptwo (0);
01860 int d;
01861
01862 while (*str == '0')
01863 str++;
01864 while (ISDIGIT (*str))
01865 {
01866 d = *str++ - '0';
01867 do_multiply (r, r, ten);
01868 if (d)
01869 do_add (r, r, real_digit (d), 0);
01870 }
01871 if (*str == '.')
01872 {
01873 str++;
01874 if (r->cl == rvc_zero)
01875 {
01876 while (*str == '0')
01877 str++, exp--;
01878 }
01879 while (ISDIGIT (*str))
01880 {
01881 d = *str++ - '0';
01882 do_multiply (r, r, ten);
01883 if (d)
01884 do_add (r, r, real_digit (d), 0);
01885 exp--;
01886 }
01887 }
01888
01889 if (*str == 'e' || *str == 'E')
01890 {
01891 bool exp_neg = false;
01892
01893 str++;
01894 if (*str == '-')
01895 {
01896 exp_neg = true;
01897 str++;
01898 }
01899 else if (*str == '+')
01900 str++;
01901
01902 d = 0;
01903 while (ISDIGIT (*str))
01904 {
01905 d *= 10;
01906 d += *str - '0';
01907 if (d > MAX_EXP)
01908 {
01909
01910 if (exp_neg)
01911 goto underflow;
01912 else
01913 goto overflow;
01914 }
01915 str++;
01916 }
01917 if (exp_neg)
01918 d = -d;
01919 exp += d;
01920 }
01921
01922 if (exp)
01923 times_pten (r, exp);
01924 }
01925
01926 r->sign = sign;
01927 return;
01928
01929 underflow:
01930 get_zero (r, sign);
01931 return;
01932
01933 overflow:
01934 get_inf (r, sign);
01935 return;
01936 }
01937
01938
01939
01940 REAL_VALUE_TYPE
01941 real_from_string2 (const char *s, enum machine_mode mode)
01942 {
01943 REAL_VALUE_TYPE r;
01944
01945 real_from_string (&r, s);
01946 if (mode != VOIDmode)
01947 real_convert (&r, mode, &r);
01948
01949 return r;
01950 }
01951
01952
01953
01954 void
01955 real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
01956 unsigned HOST_WIDE_INT low, HOST_WIDE_INT high,
01957 int unsigned_p)
01958 {
01959 if (low == 0 && high == 0)
01960 get_zero (r, 0);
01961 else
01962 {
01963 memset (r, 0, sizeof (*r));
01964 r->cl = rvc_normal;
01965 r->sign = high < 0 && !unsigned_p;
01966 SET_REAL_EXP (r, 2 * HOST_BITS_PER_WIDE_INT);
01967
01968 if (r->sign)
01969 {
01970 high = ~high;
01971 if (low == 0)
01972 high += 1;
01973 else
01974 low = -low;
01975 }
01976
01977 if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
01978 {
01979 r->sig[SIGSZ-1] = high;
01980 r->sig[SIGSZ-2] = low;
01981 }
01982 else
01983 {
01984 gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
01985 r->sig[SIGSZ-1] = high >> (HOST_BITS_PER_LONG - 1) >> 1;
01986 r->sig[SIGSZ-2] = high;
01987 r->sig[SIGSZ-3] = low >> (HOST_BITS_PER_LONG - 1) >> 1;
01988 r->sig[SIGSZ-4] = low;
01989 }
01990
01991 normalize (r);
01992 }
01993
01994 if (mode != VOIDmode)
01995 real_convert (r, mode, r);
01996 }
01997
01998
01999
02000 static const REAL_VALUE_TYPE *
02001 ten_to_ptwo (int n)
02002 {
02003 static REAL_VALUE_TYPE tens[EXP_BITS];
02004
02005 gcc_assert (n >= 0);
02006 gcc_assert (n < EXP_BITS);
02007
02008 if (tens[n].cl == rvc_zero)
02009 {
02010 if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
02011 {
02012 HOST_WIDE_INT t = 10;
02013 int i;
02014
02015 for (i = 0; i < n; ++i)
02016 t *= t;
02017
02018 real_from_integer (&tens[n], VOIDmode, t, 0, 1);
02019 }
02020 else
02021 {
02022 const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
02023 do_multiply (&tens[n], t, t);
02024 }
02025 }
02026
02027 return &tens[n];
02028 }
02029
02030
02031
02032 static const REAL_VALUE_TYPE *
02033 ten_to_mptwo (int n)
02034 {
02035 static REAL_VALUE_TYPE tens[EXP_BITS];
02036
02037 gcc_assert (n >= 0);
02038 gcc_assert (n < EXP_BITS);
02039
02040 if (tens[n].cl == rvc_zero)
02041 do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
02042
02043 return &tens[n];
02044 }
02045
02046
02047
02048 static const REAL_VALUE_TYPE *
02049 real_digit (int n)
02050 {
02051 static REAL_VALUE_TYPE num[10];
02052
02053 gcc_assert (n >= 0);
02054 gcc_assert (n <= 9);
02055
02056 if (n > 0 && num[n].cl == rvc_zero)
02057 real_from_integer (&num[n], VOIDmode, n, 0, 1);
02058
02059 return &num[n];
02060 }
02061
02062
02063
02064 static void
02065 times_pten (REAL_VALUE_TYPE *r, int exp)
02066 {
02067 REAL_VALUE_TYPE pten, *rr;
02068 bool negative = (exp < 0);
02069 int i;
02070
02071 if (negative)
02072 {
02073 exp = -exp;
02074 pten = *real_digit (1);
02075 rr = &pten;
02076 }
02077 else
02078 rr = r;
02079
02080 for (i = 0; exp > 0; ++i, exp >>= 1)
02081 if (exp & 1)
02082 do_multiply (rr, rr, ten_to_ptwo (i));
02083
02084 if (negative)
02085 do_divide (r, r, &pten);
02086 }
02087
02088
02089
02090 void
02091 real_inf (REAL_VALUE_TYPE *r)
02092 {
02093 get_inf (r, 0);
02094 }
02095
02096
02097
02098
02099
02100
02101 bool
02102 real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
02103 enum machine_mode mode)
02104 {
02105 const struct real_format *fmt;
02106
02107 fmt = REAL_MODE_FORMAT (mode);
02108 gcc_assert (fmt);
02109
02110 if (*str == 0)
02111 {
02112 if (quiet)
02113 get_canonical_qnan (r, 0);
02114 else
02115 get_canonical_snan (r, 0);
02116 }
02117 else
02118 {
02119 int base = 10, d;
02120 bool neg = false;
02121
02122 memset (r, 0, sizeof (*r));
02123 r->cl = rvc_nan;
02124
02125
02126
02127 while (ISSPACE (*str))
02128 str++;
02129 if (*str == '-')
02130 str++, neg = true;
02131 else if (*str == '+')
02132 str++;
02133 if (*str == '0')
02134 {
02135 if (*++str == 'x')
02136 str++, base = 16;
02137 else
02138 base = 8;
02139 }
02140
02141 while ((d = hex_value (*str)) < base)
02142 {
02143 REAL_VALUE_TYPE u;
02144
02145 switch (base)
02146 {
02147 case 8:
02148 lshift_significand (r, r, 3);
02149 break;
02150 case 16:
02151 lshift_significand (r, r, 4);
02152 break;
02153 case 10:
02154 lshift_significand_1 (&u, r);
02155 lshift_significand (r, r, 3);
02156 add_significands (r, r, &u);
02157 break;
02158 default:
02159 gcc_unreachable ();
02160 }
02161
02162 get_zero (&u, 0);
02163 u.sig[0] = d;
02164 add_significands (r, r, &u);
02165
02166 str++;
02167 }
02168
02169
02170 if (*str != 0)
02171 return false;
02172
02173
02174
02175 lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
02176
02177
02178 r->sig[SIGSZ-1] &= ~SIG_MSB;
02179
02180
02181 r->signalling = !quiet;
02182 }
02183
02184 return true;
02185 }
02186
02187
02188
02189
02190 void
02191 real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
02192 {
02193 const struct real_format *fmt;
02194 int np2;
02195
02196 fmt = REAL_MODE_FORMAT (mode);
02197 gcc_assert (fmt);
02198
02199 r->cl = rvc_normal;
02200 r->sign = sign;
02201 r->signalling = 0;
02202 r->canonical = 0;
02203 SET_REAL_EXP (r, fmt->emax * fmt->log2_b);
02204
02205 np2 = SIGNIFICAND_BITS - fmt->p * fmt->log2_b;
02206 memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
02207 clear_significand_below (r, np2);
02208 }
02209
02210
02211
02212 void
02213 real_2expN (REAL_VALUE_TYPE *r, int n)
02214 {
02215 memset (r, 0, sizeof (*r));
02216
02217 n++;
02218 if (n > MAX_EXP)
02219 r->cl = rvc_inf;
02220 else if (n < -MAX_EXP)
02221 ;
02222 else
02223 {
02224 r->cl = rvc_normal;
02225 SET_REAL_EXP (r, n);
02226 r->sig[SIGSZ-1] = SIG_MSB;
02227 }
02228 }
02229
02230
02231 static void
02232 round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
02233 {
02234 int p2, np2, i, w;
02235 unsigned long sticky;
02236 bool guard, lsb;
02237 int emin2m1, emax2;
02238
02239 p2 = fmt->p * fmt->log2_b;
02240 emin2m1 = (fmt->emin - 1) * fmt->log2_b;
02241 emax2 = fmt->emax * fmt->log2_b;
02242
02243 np2 = SIGNIFICAND_BITS - p2;
02244 switch (r->cl)
02245 {
02246 underflow:
02247 get_zero (r, r->sign);
02248 case rvc_zero:
02249 if (!fmt->has_signed_zero)
02250 r->sign = 0;
02251 return;
02252
02253 overflow:
02254 get_inf (r, r->sign);
02255 case rvc_inf:
02256 return;
02257
02258 case rvc_nan:
02259 clear_significand_below (r, np2);
02260 return;
02261
02262 case rvc_normal:
02263 break;
02264
02265 default:
02266 gcc_unreachable ();
02267 }
02268
02269
02270
02271 if (fmt->log2_b != 1)
02272 {
02273 int shift = REAL_EXP (r) & (fmt->log2_b - 1);
02274 if (shift)
02275 {
02276 shift = fmt->log2_b - shift;
02277 r->sig[0] |= sticky_rshift_significand (r, r, shift);
02278 SET_REAL_EXP (r, REAL_EXP (r) + shift);
02279 }
02280 }
02281
02282
02283
02284 if (REAL_EXP (r) > emax2)
02285 goto overflow;
02286 else if (REAL_EXP (r) <= emin2m1)
02287 {
02288 int diff;
02289
02290 if (!fmt->has_denorm)
02291 {
02292
02293 if (REAL_EXP (r) < emin2m1)
02294 goto underflow;
02295 }
02296 else
02297 {
02298 diff = emin2m1 - REAL_EXP (r) + 1;
02299 if (diff > p2)
02300 goto underflow;
02301
02302
02303 r->sig[0] |= sticky_rshift_significand (r, r, diff);
02304 SET_REAL_EXP (r, REAL_EXP (r) + diff);
02305 }
02306 }
02307
02308
02309
02310
02311
02312 sticky = 0;
02313 for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
02314 sticky |= r->sig[i];
02315 sticky |=
02316 r->sig[w] & (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
02317
02318 guard = test_significand_bit (r, np2 - 1);
02319 lsb = test_significand_bit (r, np2);
02320
02321
02322 if (guard && (sticky || lsb))
02323 {
02324 REAL_VALUE_TYPE u;
02325 get_zero (&u, 0);
02326 set_significand_bit (&u, np2);
02327
02328 if (add_significands (r, r, &u))
02329 {
02330
02331
02332
02333 SET_REAL_EXP (r, REAL_EXP (r) + 1);
02334 if (REAL_EXP (r) > emax2)
02335 goto overflow;
02336 r->sig[SIGSZ-1] = SIG_MSB;
02337
02338 if (fmt->log2_b != 1)
02339 {
02340 int shift = REAL_EXP (r) & (fmt->log2_b - 1);
02341 if (shift)
02342 {
02343 shift = fmt->log2_b - shift;
02344 rshift_significand (r, r, shift);
02345 SET_REAL_EXP (r, REAL_EXP (r) + shift);
02346 if (REAL_EXP (r) > emax2)
02347 goto overflow;
02348 }
02349 }
02350 }
02351 }
02352
02353
02354 if (REAL_EXP (r) <= emin2m1)
02355 goto underflow;
02356
02357
02358 clear_significand_below (r, np2);
02359 }
02360
02361
02362
02363 void
02364 real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
02365 const REAL_VALUE_TYPE *a)
02366 {
02367 const struct real_format *fmt;
02368
02369 fmt = REAL_MODE_FORMAT (mode);
02370 gcc_assert (fmt);
02371
02372 *r = *a;
02373 round_for_format (fmt, r);
02374
02375
02376 if (r->cl == rvc_normal)
02377 normalize (r);
02378 }
02379
02380
02381
02382 REAL_VALUE_TYPE
02383 real_value_truncate (enum machine_mode mode, REAL_VALUE_TYPE a)
02384 {
02385 REAL_VALUE_TYPE r;
02386 real_convert (&r, mode, &a);
02387 return r;
02388 }
02389
02390
02391
02392 bool
02393 exact_real_truncate (enum machine_mode mode, const REAL_VALUE_TYPE *a)
02394 {
02395 const struct real_format *fmt;
02396 REAL_VALUE_TYPE t;
02397 int emin2m1;
02398
02399 fmt = REAL_MODE_FORMAT (mode);
02400 gcc_assert (fmt);
02401
02402
02403 emin2m1 = (fmt->emin - 1) * fmt->log2_b;
02404 if (REAL_EXP (a) <= emin2m1)
02405 return false;
02406
02407
02408 real_convert (&t, mode, a);
02409 return real_identical (&t, a);
02410 }
02411
02412
02413
02414
02415
02416
02417
02418 long
02419 real_to_target_fmt (long *buf, const REAL_VALUE_TYPE *r_orig,
02420 const struct real_format *fmt)
02421 {
02422 REAL_VALUE_TYPE r;
02423 long buf1;
02424
02425 r = *r_orig;
02426 round_for_format (fmt, &r);
02427
02428 if (!buf)
02429 buf = &buf1;
02430 (*fmt->encode) (fmt, buf, &r);
02431
02432 return *buf;
02433 }
02434
02435
02436
02437 long
02438 real_to_target (long *buf, const REAL_VALUE_TYPE *r, enum machine_mode mode)
02439 {
02440 const struct real_format *fmt;
02441
02442 fmt = REAL_MODE_FORMAT (mode);
02443 gcc_assert (fmt);
02444
02445 return real_to_target_fmt (buf, r, fmt);
02446 }
02447
02448
02449
02450
02451
02452 void
02453 real_from_target_fmt (REAL_VALUE_TYPE *r, const long *buf,
02454 const struct real_format *fmt)
02455 {
02456 (*fmt->decode) (fmt, r, buf);
02457 }
02458
02459
02460
02461 void
02462 real_from_target (REAL_VALUE_TYPE *r, const long *buf, enum machine_mode mode)
02463 {
02464 const struct real_format *fmt;
02465
02466 fmt = REAL_MODE_FORMAT (mode);
02467 gcc_assert (fmt);
02468
02469 (*fmt->decode) (fmt, r, buf);
02470 }
02471
02472
02473
02474
02475 int
02476 significand_size (enum machine_mode mode)
02477 {
02478 const struct real_format *fmt;
02479
02480 fmt = REAL_MODE_FORMAT (mode);
02481 if (fmt == NULL)
02482 return 0;
02483
02484 return fmt->p * fmt->log2_b;
02485 }
02486
02487
02488
02489
02490
02491 unsigned int
02492 real_hash (const REAL_VALUE_TYPE *r)
02493 {
02494 unsigned int h;
02495 size_t i;
02496
02497 h = r->cl | (r->sign << 2);
02498 switch (r->cl)
02499 {
02500 case rvc_zero:
02501 case rvc_inf:
02502 return h;
02503
02504 case rvc_normal:
02505 h |= REAL_EXP (r) << 3;
02506 break;
02507
02508 case rvc_nan:
02509 if (r->signalling)
02510 h ^= (unsigned int)-1;
02511 if (r->canonical)
02512 return h;
02513 break;
02514
02515 default:
02516 gcc_unreachable ();
02517 }
02518
02519 if (sizeof(unsigned long) > sizeof(unsigned int))
02520 for (i = 0; i < SIGSZ; ++i)
02521 {
02522 unsigned long s = r->sig[i];
02523 h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
02524 }
02525 else
02526 for (i = 0; i < SIGSZ; ++i)
02527 h ^= r->sig[i];
02528
02529 return h;
02530 }
02531
02532
02533
02534 static void encode_ieee_single (const struct real_format *fmt,
02535 long *, const REAL_VALUE_TYPE *);
02536 static void decode_ieee_single (const struct real_format *,
02537 REAL_VALUE_TYPE *, const long *);
02538
02539 static void
02540 encode_ieee_single (const struct real_format *fmt, long *buf,
02541 const REAL_VALUE_TYPE *r)
02542 {
02543 unsigned long image, sig, exp;
02544 unsigned long sign = r->sign;
02545 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
02546
02547 image = sign << 31;
02548 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
02549
02550 switch (r->cl)
02551 {
02552 case rvc_zero:
02553 break;
02554
02555 case rvc_inf:
02556 if (fmt->has_inf)
02557 image |= 255 << 23;
02558 else
02559 image |= 0x7fffffff;
02560 break;
02561
02562 case rvc_nan:
02563 if (fmt->has_nans)
02564 {
02565 if (r->canonical)
02566 sig = 0;
02567 if (r->signalling == fmt->qnan_msb_set)
02568 sig &= ~(1 << 22);
02569 else
02570 sig |= 1 << 22;
02571
02572
02573
02574
02575 if (r->canonical && !fmt->qnan_msb_set)
02576 sig |= (1 << 22) - 1;
02577 else if (sig == 0)
02578 sig = 1 << 21;
02579
02580 image |= 255 << 23;
02581 image |= sig;
02582 }
02583 else
02584 image |= 0x7fffffff;
02585 break;
02586
02587 case rvc_normal:
02588
02589
02590
02591 if (denormal)
02592 exp = 0;
02593 else
02594 exp = REAL_EXP (r) + 127 - 1;
02595 image |= exp << 23;
02596 image |= sig;
02597 break;
02598
02599 default:
02600 gcc_unreachable ();
02601 }
02602
02603 buf[0] = image;
02604 }
02605
02606 static void
02607 decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
02608 const long *buf)
02609 {
02610 unsigned long image = buf[0] & 0xffffffff;
02611 bool sign = (image >> 31) & 1;
02612 int exp = (image >> 23) & 0xff;
02613
02614 memset (r, 0, sizeof (*r));
02615 image <<= HOST_BITS_PER_LONG - 24;
02616 image &= ~SIG_MSB;
02617
02618 if (exp == 0)
02619 {
02620 if (image && fmt->has_denorm)
02621 {
02622 r->cl = rvc_normal;
02623 r->sign = sign;
02624 SET_REAL_EXP (r, -126);
02625 r->sig[SIGSZ-1] = image << 1;
02626 normalize (r);
02627 }
02628 else if (fmt->has_signed_zero)
02629 r->sign = sign;
02630 }
02631 else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
02632 {
02633 if (image)
02634 {
02635 r->cl = rvc_nan;
02636 r->sign = sign;
02637 r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
02638 ^ fmt->qnan_msb_set);
02639 r->sig[SIGSZ-1] = image;
02640 }
02641 else
02642 {
02643 r->cl = rvc_inf;
02644 r->sign = sign;
02645 }
02646 }
02647 else
02648 {
02649 r->cl = rvc_normal;
02650 r->sign = sign;
02651 SET_REAL_EXP (r, exp - 127 + 1);
02652 r->sig[SIGSZ-1] = image | SIG_MSB;
02653 }
02654 }
02655
02656 const struct real_format ieee_single_format =
02657 {
02658 encode_ieee_single,
02659 decode_ieee_single,
02660 2,
02661 1,
02662 24,
02663 24,
02664 -125,
02665 128,
02666 31,
02667 true,
02668 true,
02669 true,
02670 true,
02671 true
02672 };
02673
02674 const struct real_format mips_single_format =
02675 {
02676 encode_ieee_single,
02677 decode_ieee_single,
02678 2,
02679 1,
02680 24,
02681 24,
02682 -125,
02683 128,
02684 31,
02685 true,
02686 true,
02687 true,
02688 true,
02689 false
02690 };
02691
02692
02693
02694
02695 static void encode_ieee_double (const struct real_format *fmt,
02696 long *, const REAL_VALUE_TYPE *);
02697 static void decode_ieee_double (const struct real_format *,
02698 REAL_VALUE_TYPE *, const long *);
02699
02700 static void
02701 encode_ieee_double (const struct real_format *fmt, long *buf,
02702 const REAL_VALUE_TYPE *r)
02703 {
02704 unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
02705 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
02706
02707 image_hi = r->sign << 31;
02708 image_lo = 0;
02709
02710 if (HOST_BITS_PER_LONG == 64)
02711 {
02712 sig_hi = r->sig[SIGSZ-1];
02713 sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
02714 sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
02715 }
02716 else
02717 {
02718 sig_hi = r->sig[SIGSZ-1];
02719 sig_lo = r->sig[SIGSZ-2];
02720 sig_lo = (sig_hi << 21) | (sig_lo >> 11);
02721 sig_hi = (sig_hi >> 11) & 0xfffff;
02722 }
02723
02724 switch (r->cl)
02725 {
02726 case rvc_zero:
02727 break;
02728
02729 case rvc_inf:
02730 if (fmt->has_inf)
02731 image_hi |= 2047 << 20;
02732 else
02733 {
02734 image_hi |= 0x7fffffff;
02735 image_lo = 0xffffffff;
02736 }
02737 break;
02738
02739 case rvc_nan:
02740 if (fmt->has_nans)
02741 {
02742 if (r->canonical)
02743 sig_hi = sig_lo = 0;
02744 if (r->signalling == fmt->qnan_msb_set)
02745 sig_hi &= ~(1 << 19);
02746 else
02747 sig_hi |= 1 << 19;
02748
02749
02750
02751
02752 if (r->canonical && !fmt->qnan_msb_set)
02753 {
02754 sig_hi |= (1 << 19) - 1;
02755 sig_lo = 0xffffffff;
02756 }
02757 else if (sig_hi == 0 && sig_lo == 0)
02758 sig_hi = 1 << 18;
02759
02760 image_hi |= 2047 << 20;
02761 image_hi |= sig_hi;
02762 image_lo = sig_lo;
02763 }
02764 else
02765 {
02766 image_hi |= 0x7fffffff;
02767 image_lo = 0xffffffff;
02768 }
02769 break;
02770
02771 case rvc_normal:
02772
02773
02774
02775 if (denormal)
02776 exp = 0;
02777 else
02778 exp = REAL_EXP (r) + 1023 - 1;
02779 image_hi |= exp << 20;
02780 image_hi |= sig_hi;
02781 image_lo = sig_lo;
02782 break;
02783
02784 default:
02785 gcc_unreachable ();
02786 }
02787
02788 if (FLOAT_WORDS_BIG_ENDIAN)
02789 buf[0] = image_hi, buf[1] = image_lo;
02790 else
02791 buf[0] = image_lo, buf[1] = image_hi;
02792 }
02793
02794 static void
02795 decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
02796 const long *buf)
02797 {
02798 unsigned long image_hi, image_lo;
02799 bool sign;
02800 int exp;
02801
02802 if (FLOAT_WORDS_BIG_ENDIAN)
02803 image_hi = buf[0], image_lo = buf[1];
02804 else
02805 image_lo = buf[0], image_hi = buf[1];
02806 image_lo &= 0xffffffff;
02807 image_hi &= 0xffffffff;
02808
02809 sign = (image_hi >> 31) & 1;
02810 exp = (image_hi >> 20) & 0x7ff;
02811
02812 memset (r, 0, sizeof (*r));
02813
02814 image_hi <<= 32 - 21;
02815 image_hi |= image_lo >> 21;
02816 image_hi &= 0x7fffffff;
02817 image_lo <<= 32 - 21;
02818
02819 if (exp == 0)
02820 {
02821 if ((image_hi || image_lo) && fmt->has_denorm)
02822 {
02823 r->cl = rvc_normal;
02824 r->sign = sign;
02825 SET_REAL_EXP (r, -1022);
02826 if (HOST_BITS_PER_LONG == 32)
02827 {
02828 image_hi = (image_hi << 1) | (image_lo >> 31);
02829 image_lo <<= 1;
02830 r->sig[SIGSZ-1] = image_hi;
02831 r->sig[SIGSZ-2] = image_lo;
02832 }
02833 else
02834 {
02835 image_hi = (image_hi << 31 << 2) | (image_lo << 1);
02836 r->sig[SIGSZ-1] = image_hi;
02837 }
02838 normalize (r);
02839 }
02840 else if (fmt->has_signed_zero)
02841 r->sign = sign;
02842 }
02843 else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
02844 {
02845 if (image_hi || image_lo)
02846 {
02847 r->cl = rvc_nan;
02848 r->sign = sign;
02849 r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
02850 if (HOST_BITS_PER_LONG == 32)
02851 {
02852 r->sig[SIGSZ-1] = image_hi;
02853 r->sig[SIGSZ-2] = image_lo;
02854 }
02855 else
02856 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
02857 }
02858 else
02859 {
02860 r->cl = rvc_inf;
02861 r->sign = sign;
02862 }
02863 }
02864 else
02865 {
02866 r->cl = rvc_normal;
02867 r->sign = sign;
02868 SET_REAL_EXP (r, exp - 1023 + 1);
02869 if (HOST_BITS_PER_LONG == 32)
02870 {
02871 r->sig[SIGSZ-1] = image_hi | SIG_MSB;
02872 r->sig[SIGSZ-2] = image_lo;
02873 }
02874 else
02875 r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
02876 }
02877 }
02878
02879 const struct real_format ieee_double_format =
02880 {
02881 encode_ieee_double,
02882 decode_ieee_double,
02883 2,
02884 1,
02885 53,
02886 53,
02887 -1021,
02888 1024,
02889 63,
02890 true,
02891 true,
02892 true,
02893 true,
02894 true
02895 };
02896
02897 const struct real_format mips_double_format =
02898 {
02899 encode_ieee_double,
02900 decode_ieee_double,
02901 2,
02902 1,
02903 53,
02904 53,
02905 -1021,
02906 1024,
02907 63,
02908 true,
02909 true,
02910 true,
02911 true,
02912 false
02913 };
02914
02915
02916
02917
02918
02919
02920
02921
02922
02923
02924 static void
02925 encode_ieee_extended (const struct real_format *fmt, long *buf,
02926 const REAL_VALUE_TYPE *r)
02927 {
02928 unsigned long image_hi, sig_hi, sig_lo;
02929 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
02930
02931 image_hi = r->sign << 15;
02932 sig_hi = sig_lo = 0;
02933
02934 switch (r->cl)
02935 {
02936 case rvc_zero:
02937 break;
02938
02939 case rvc_inf:
02940 if (fmt->has_inf)
02941 {
02942 image_hi |= 32767;
02943
02944
02945
02946
02947 sig_hi = 0x80000000;
02948 }
02949 else
02950 {
02951 image_hi |= 32767;
02952 sig_lo = sig_hi = 0xffffffff;
02953 }
02954 break;
02955
02956 case rvc_nan:
02957 if (fmt->has_nans)
02958 {
02959 image_hi |= 32767;
02960 if (HOST_BITS_PER_LONG == 32)
02961 {
02962 sig_hi = r->sig[SIGSZ-1];
02963 sig_lo = r->sig[SIGSZ-2];
02964 }
02965 else
02966 {
02967 sig_lo = r->sig[SIGSZ-1];
02968 sig_hi = sig_lo >> 31 >> 1;
02969 sig_lo &= 0xffffffff;
02970 }
02971 if (r->signalling == fmt->qnan_msb_set)
02972 sig_hi &= ~(1 << 30);
02973 else
02974 sig_hi |= 1 << 30;
02975 if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
02976 sig_hi = 1 << 29;
02977
02978
02979
02980
02981 sig_hi |= 0x80000000;
02982 }
02983 else
02984 {
02985 image_hi |= 32767;
02986 sig_lo = sig_hi = 0xffffffff;
02987 }
02988 break;
02989
02990 case rvc_normal:
02991 {
02992 int exp = REAL_EXP (r);
02993
02994
02995
02996
02997
02998
02999
03000
03001
03002
03003 if (denormal)
03004 exp = 0;
03005 else
03006 {
03007 exp += 16383 - 1;
03008 gcc_assert (exp >= 0);
03009 }
03010 image_hi |= exp;
03011
03012 if (HOST_BITS_PER_LONG == 32)
03013 {
03014 sig_hi = r->sig[SIGSZ-1];
03015 sig_lo = r->sig[SIGSZ-2];
03016 }
03017 else
03018 {
03019 sig_lo = r->sig[SIGSZ-1];
03020 sig_hi = sig_lo >> 31 >> 1;
03021 sig_lo &= 0xffffffff;
03022 }
03023 }
03024 break;
03025
03026 default:
03027 gcc_unreachable ();
03028 }
03029
03030 buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
03031 }
03032
03033
03034
03035 static void
03036 encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
03037 const REAL_VALUE_TYPE *r)
03038 {
03039 long intermed[3];
03040 encode_ieee_extended (fmt, intermed, r);
03041
03042
03043
03044
03045
03046
03047
03048 buf[0] = intermed[2] << 16;
03049 buf[1] = intermed[1];
03050 buf[2] = intermed[0];
03051 }
03052
03053
03054
03055 static void
03056 encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
03057 const REAL_VALUE_TYPE *r)
03058 {
03059 if (FLOAT_WORDS_BIG_ENDIAN)
03060 {
03061
03062
03063
03064 long intermed[3];
03065 encode_ieee_extended (fmt, intermed, r);
03066 buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
03067 buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
03068 buf[2] = (intermed[0] << 16);
03069 }
03070 else
03071
03072 encode_ieee_extended (fmt, buf, r);
03073 }
03074
03075
03076
03077 static void
03078 encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
03079 const REAL_VALUE_TYPE *r)
03080 {
03081
03082 encode_ieee_extended_intel_96 (fmt, buf, r);
03083 buf[3] = 0;
03084 }
03085
03086
03087
03088
03089 static void
03090 decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
03091 const long *buf)
03092 {
03093 unsigned long image_hi, sig_hi, sig_lo;
03094 bool sign;
03095 int exp;
03096
03097 sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
03098 sig_lo &= 0xffffffff;
03099 sig_hi &= 0xffffffff;
03100 image_hi &= 0xffffffff;
03101
03102 sign = (image_hi >> 15) & 1;
03103 exp = image_hi & 0x7fff;
03104
03105 memset (r, 0, sizeof (*r));
03106
03107 if (exp == 0)
03108 {
03109 if ((sig_hi || sig_lo) && fmt->has_denorm)
03110 {
03111 r->cl = rvc_normal;
03112 r->sign = sign;
03113
03114
03115
03116
03117
03118
03119 SET_REAL_EXP (r, fmt->emin);
03120 if (HOST_BITS_PER_LONG == 32)
03121 {
03122 r->sig[SIGSZ-1] = sig_hi;
03123 r->sig[SIGSZ-2] = sig_lo;
03124 }
03125 else
03126 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
03127
03128 normalize (r);
03129 }
03130 else if (fmt->has_signed_zero)
03131 r->sign = sign;
03132 }
03133 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
03134 {
03135
03136
03137
03138 sig_hi &= 0x7fffffff;
03139
03140 if (sig_hi || sig_lo)
03141 {
03142 r->cl = rvc_nan;
03143 r->sign = sign;
03144 r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
03145 if (HOST_BITS_PER_LONG == 32)
03146 {
03147 r->sig[SIGSZ-1] = sig_hi;
03148 r->sig[SIGSZ-2] = sig_lo;
03149 }
03150 else
03151 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
03152 }
03153 else
03154 {
03155 r->cl = rvc_inf;
03156 r->sign = sign;
03157 }
03158 }
03159 else
03160 {
03161 r->cl = rvc_normal;
03162 r->sign = sign;
03163 SET_REAL_EXP (r, exp - 16383 + 1);
03164 if (HOST_BITS_PER_LONG == 32)
03165 {
03166 r->sig[SIGSZ-1] = sig_hi;
03167 r->sig[SIGSZ-2] = sig_lo;
03168 }
03169 else
03170 r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
03171 }
03172 }
03173
03174
03175
03176 static void
03177 decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
03178 const long *buf)
03179 {
03180 long intermed[3];
03181
03182
03183
03184
03185 intermed[0] = buf[2];
03186 intermed[1] = buf[1];
03187 intermed[2] = (unsigned long)buf[0] >> 16;
03188
03189 decode_ieee_extended (fmt, r, intermed);
03190 }
03191
03192
03193
03194 static void
03195 decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
03196 const long *buf)
03197 {
03198 if (FLOAT_WORDS_BIG_ENDIAN)
03199 {
03200
03201
03202
03203 long intermed[3];
03204
03205 intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
03206 intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
03207 intermed[2] = ((unsigned long)buf[0] >> 16);
03208
03209 decode_ieee_extended (fmt, r, intermed);
03210 }
03211 else
03212
03213 decode_ieee_extended (fmt, r, buf);
03214 }
03215
03216
03217
03218 static void
03219 decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
03220 const long *buf)
03221 {
03222
03223 decode_ieee_extended_intel_96 (fmt, r, buf);
03224 }
03225
03226 const struct real_format ieee_extended_motorola_format =
03227 {
03228 encode_ieee_extended_motorola,
03229 decode_ieee_extended_motorola,
03230 2,
03231 1,
03232 64,
03233 64,
03234 -16382,
03235 16384,
03236 95,
03237 true,
03238 true,
03239 true,
03240 true,
03241 true
03242 };
03243
03244 const struct real_format ieee_extended_intel_96_format =
03245 {
03246 encode_ieee_extended_intel_96,
03247 decode_ieee_extended_intel_96,
03248 2,
03249 1,
03250 64,
03251 64,
03252 -16381,
03253 16384,
03254 79,
03255 true,
03256 true,
03257 true,
03258 true,
03259 true
03260 };
03261
03262 const struct real_format ieee_extended_intel_128_format =
03263 {
03264 encode_ieee_extended_intel_128,
03265 decode_ieee_extended_intel_128,
03266 2,
03267 1,
03268 64,
03269 64,
03270 -16381,
03271 16384,
03272 79,
03273 true,
03274 true,
03275 true,
03276 true,
03277 true
03278 };
03279
03280
03281
03282 const struct real_format ieee_extended_intel_96_round_53_format =
03283 {
03284 encode_ieee_extended_intel_96,
03285 decode_ieee_extended_intel_96,
03286 2,
03287 1,
03288 53,
03289 53,
03290 -16381,
03291 16384,
03292 79,
03293 true,
03294 true,
03295 true,
03296 true,
03297 true
03298 };
03299
03300
03301
03302
03303
03304
03305
03306
03307
03308 static void encode_ibm_extended (const struct real_format *fmt,
03309 long *, const REAL_VALUE_TYPE *);
03310 static void decode_ibm_extended (const struct real_format *,
03311 REAL_VALUE_TYPE *, const long *);
03312
03313 static void
03314 encode_ibm_extended (const struct real_format *fmt, long *buf,
03315 const REAL_VALUE_TYPE *r)
03316 {
03317 REAL_VALUE_TYPE u, normr, v;
03318 const struct real_format *base_fmt;
03319
03320 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
03321
03322
03323 normr = *r;
03324 if (normr.cl == rvc_normal)
03325 normalize (&normr);
03326
03327
03328 u = normr;
03329 round_for_format (base_fmt, &u);
03330 encode_ieee_double (base_fmt, &buf[0], &u);
03331
03332 if (u.cl == rvc_normal)
03333 {
03334 do_add (&v, &normr, &u, 1);
03335
03336 round_for_format (base_fmt, &v);
03337 encode_ieee_double (base_fmt, &buf[2], &v);
03338 }
03339 else
03340 {
03341
03342
03343 buf[2] = 0;
03344 buf[3] = 0;
03345 }
03346 }
03347
03348 static void
03349 decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
03350 const long *buf)
03351 {
03352 REAL_VALUE_TYPE u, v;
03353 const struct real_format *base_fmt;
03354
03355 base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
03356 decode_ieee_double (base_fmt, &u, &buf[0]);
03357
03358 if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
03359 {
03360 decode_ieee_double (base_fmt, &v, &buf[2]);
03361 do_add (r, &u, &v, 0);
03362 }
03363 else
03364 *r = u;
03365 }
03366
03367 const struct real_format ibm_extended_format =
03368 {
03369 encode_ibm_extended,
03370 decode_ibm_extended,
03371 2,
03372 1,
03373 53 + 53,
03374 53,
03375 -1021 + 53,
03376 1024,
03377 -1,
03378 true,
03379 true,
03380 true,
03381 true,
03382 true
03383 };
03384
03385 const struct real_format mips_extended_format =
03386 {
03387 encode_ibm_extended,
03388 decode_ibm_extended,
03389 2,
03390 1,
03391 53 + 53,
03392 53,
03393 -1021 + 53,
03394 1024,
03395 -1,
03396 true,
03397 true,
03398 true,
03399 true,
03400 false
03401 };
03402
03403
03404
03405
03406 static void encode_ieee_quad (const struct real_format *fmt,
03407 long *, const REAL_VALUE_TYPE *);
03408 static void decode_ieee_quad (const struct real_format *,
03409 REAL_VALUE_TYPE *, const long *);
03410
03411 static void
03412 encode_ieee_quad (const struct real_format *fmt, long *buf,
03413 const REAL_VALUE_TYPE *r)
03414 {
03415 unsigned long image3, image2, image1, image0, exp;
03416 bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
03417 REAL_VALUE_TYPE u;
03418
03419 image3 = r->sign << 31;
03420 image2 = 0;
03421 image1 = 0;
03422 image0 = 0;
03423
03424 rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
03425
03426 switch (r->cl)
03427 {
03428 case rvc_zero:
03429 break;
03430
03431 case rvc_inf:
03432 if (fmt->has_inf)
03433 image3 |= 32767 << 16;
03434 else
03435 {
03436 image3 |= 0x7fffffff;
03437 image2 = 0xffffffff;
03438 image1 = 0xffffffff;
03439 image0 = 0xffffffff;
03440 }
03441 break;
03442
03443 case rvc_nan:
03444 if (fmt->has_nans)
03445 {
03446 image3 |= 32767 << 16;
03447
03448 if (r->canonical)
03449 {
03450
03451
03452 }
03453 else if (HOST_BITS_PER_LONG == 32)
03454 {
03455 image0 = u.sig[0];
03456 image1 = u.sig[1];
03457 image2 = u.sig[2];
03458 image3 |= u.sig[3] & 0xffff;
03459 }
03460 else
03461 {
03462 image0 = u.sig[0];
03463 image1 = image0 >> 31 >> 1;
03464 image2 = u.sig[1];
03465 image3 |= (image2 >> 31 >> 1) & 0xffff;
03466 image0 &= 0xffffffff;
03467 image2 &= 0xffffffff;
03468 }
03469 if (r->signalling == fmt->qnan_msb_set)
03470 image3 &= ~0x8000;
03471 else
03472 image3 |= 0x8000;
03473
03474
03475
03476
03477 if (r->canonical && !fmt->qnan_msb_set)
03478 {
03479 image3 |= 0x7fff;
03480 image2 = image1 = image0 = 0xffffffff;
03481 }
03482 else if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
03483 image3 |= 0x4000;
03484 }
03485 else
03486 {
03487 image3 |= 0x7fffffff;
03488 image2 = 0xffffffff;
03489 image1 = 0xffffffff;
03490 image0 = 0xffffffff;
03491 }
03492 break;
03493
03494 case rvc_normal:
03495
03496
03497
03498 if (denormal)
03499 exp = 0;
03500 else
03501 exp = REAL_EXP (r) + 16383 - 1;
03502 image3 |= exp << 16;
03503
03504 if (HOST_BITS_PER_LONG == 32)
03505 {
03506 image0 = u.sig[0];
03507 image1 = u.sig[1];
03508 image2 = u.sig[2];
03509 image3 |= u.sig[3] & 0xffff;
03510 }
03511 else
03512 {
03513 image0 = u.sig[0];
03514 image1 = image0 >> 31 >> 1;
03515 image2 = u.sig[1];
03516 image3 |= (image2 >> 31 >> 1) & 0xffff;
03517 image0 &= 0xffffffff;
03518 image2 &= 0xffffffff;
03519 }
03520 break;
03521
03522 default:
03523 gcc_unreachable ();
03524 }
03525
03526 if (FLOAT_WORDS_BIG_ENDIAN)
03527 {
03528 buf[0] = image3;
03529 buf[1] = image2;
03530 buf[2] = image1;
03531 buf[3] = image0;
03532 }
03533 else
03534 {
03535 buf[0] = image0;
03536 buf[1] = image1;
03537 buf[2] = image2;
03538 buf[3] = image3;
03539 }
03540 }
03541
03542 static void
03543 decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
03544 const long *buf)
03545 {
03546 unsigned long image3, image2, image1, image0;
03547 bool sign;
03548 int exp;
03549
03550 if (FLOAT_WORDS_BIG_ENDIAN)
03551 {
03552 image3 = buf[0];
03553 image2 = buf[1];
03554 image1 = buf[2];
03555 image0 = buf[3];
03556 }
03557 else
03558 {
03559 image0 = buf[0];
03560 image1 = buf[1];
03561 image2 = buf[2];
03562 image3 = buf[3];
03563 }
03564 image0 &= 0xffffffff;
03565 image1 &= 0xffffffff;
03566 image2 &= 0xffffffff;
03567
03568 sign = (image3 >> 31) & 1;
03569 exp = (image3 >> 16) & 0x7fff;
03570 image3 &= 0xffff;
03571
03572 memset (r, 0, sizeof (*r));
03573
03574 if (exp == 0)
03575 {
03576 if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
03577 {
03578 r->cl = rvc_normal;
03579 r->sign = sign;
03580
03581 SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
03582 if (HOST_BITS_PER_LONG == 32)
03583 {
03584 r->sig[0] = image0;
03585 r->sig[1] = image1;
03586 r->sig[2] = image2;
03587 r->sig[3] = image3;
03588 }
03589 else
03590 {
03591 r->sig[0] = (image1 << 31 << 1) | image0;
03592 r->sig[1] = (image3 << 31 << 1) | image2;
03593 }
03594
03595 normalize (r);
03596 }
03597 else if (fmt->has_signed_zero)
03598 r->sign = sign;
03599 }
03600 else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
03601 {
03602 if (image3 | image2 | image1 | image0)
03603 {
03604 r->cl = rvc_nan;
03605 r->sign = sign;
03606 r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
03607
03608 if (HOST_BITS_PER_LONG == 32)
03609 {
03610 r->sig[0] = image0;
03611 r->sig[1] = image1;
03612 r->sig[2] = image2;
03613 r->sig[3] = image3;
03614 }
03615 else
03616 {
03617 r->sig[0] = (image1 << 31 << 1) | image0;
03618 r->sig[1] = (image3 << 31 << 1) | image2;
03619 }
03620 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
03621 }
03622 else
03623 {
03624 r->cl = rvc_inf;
03625 r->sign = sign;
03626 }
03627 }
03628 else
03629 {
03630 r->cl = rvc_normal;
03631 r->sign = sign;
03632 SET_REAL_EXP (r, exp - 16383 + 1);
03633
03634 if (HOST_BITS_PER_LONG == 32)
03635 {
03636 r->sig[0] = image0;
03637 r->sig[1] = image1;
03638 r->sig[2] = image2;
03639 r->sig[3] = image3;
03640 }
03641 else
03642 {
03643 r->sig[0] = (image1 << 31 << 1) | image0;
03644 r->sig[1] = (image3 << 31 << 1) | image2;
03645 }
03646 lshift_significand (r, r, SIGNIFICAND_BITS - 113);
03647 r->sig[SIGSZ-1] |= SIG_MSB;
03648 }
03649 }
03650
03651 const struct real_format ieee_quad_format =
03652 {
03653 encode_ieee_quad,
03654 decode_ieee_quad,
03655 2,
03656 1,
03657 113,
03658 113,
03659 -16381,
03660 16384,
03661 127,
03662 true,
03663 true,
03664 true,
03665 true,
03666 true
03667 };
03668
03669 const struct real_format mips_quad_format =
03670 {
03671 encode_ieee_quad,
03672 decode_ieee_quad,
03673 2,
03674 1,
03675 113,
03676 113,
03677 -16381,
03678 16384,
03679 127,
03680 true,
03681 true,
03682 true,
03683 true,
03684 false
03685 };
03686
03687
03688
03689
03690
03691
03692
03693
03694
03695
03696
03697 static void encode_vax_f (const struct real_format *fmt,
03698 long *, const REAL_VALUE_TYPE *);
03699 static void decode_vax_f (const struct real_format *,
03700 REAL_VALUE_TYPE *, const long *);
03701 static void encode_vax_d (const struct real_format *fmt,
03702 long *, const REAL_VALUE_TYPE *);
03703 static void decode_vax_d (const struct real_format *,
03704 REAL_VALUE_TYPE *, const long *);
03705 static void encode_vax_g (const struct real_format *fmt,
03706 long *, const REAL_VALUE_TYPE *);
03707 static void decode_vax_g (const struct real_format *,
03708 REAL_VALUE_TYPE *, const long *);
03709
03710 static void
03711 encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
03712 const REAL_VALUE_TYPE *r)
03713 {
03714 unsigned long sign, exp, sig, image;
03715
03716 sign = r->sign << 15;
03717
03718 switch (r->cl)
03719 {
03720 case rvc_zero:
03721 image = 0;
03722 break;
03723
03724 case rvc_inf:
03725 case rvc_nan:
03726 image = 0xffff7fff | sign;
03727 break;
03728
03729 case rvc_normal:
03730 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
03731 exp = REAL_EXP (r) + 128;
03732
03733 image = (sig << 16) & 0xffff0000;
03734 image |= sign;
03735 image |= exp << 7;
03736 image |= sig >> 16;
03737 break;
03738
03739 default:
03740 gcc_unreachable ();
03741 }
03742
03743 buf[0] = image;
03744 }
03745
03746 static void
03747 decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
03748 REAL_VALUE_TYPE *r, const long *buf)
03749 {
03750 unsigned long image = buf[0] & 0xffffffff;
03751 int exp = (image >> 7) & 0xff;
03752
03753 memset (r, 0, sizeof (*r));
03754
03755 if (exp != 0)
03756 {
03757 r->cl = rvc_normal;
03758 r->sign = (image >> 15) & 1;
03759 SET_REAL_EXP (r, exp - 128);
03760
03761 image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
03762 r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
03763 }
03764 }
03765
03766 static void
03767 encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
03768 const REAL_VALUE_TYPE *r)
03769 {
03770 unsigned long image0, image1, sign = r->sign << 15;
03771
03772 switch (r->cl)
03773 {
03774 case rvc_zero:
03775 image0 = image1 = 0;
03776 break;
03777
03778 case rvc_inf:
03779 case rvc_nan:
03780 image0 = 0xffff7fff | sign;
03781 image1 = 0xffffffff;
03782 break;
03783
03784 case rvc_normal:
03785
03786 if (HOST_BITS_PER_LONG == 64)
03787 {
03788 image0 = r->sig[SIGSZ-1];
03789 image1 = (image0 >> (64 - 56)) & 0xffffffff;
03790 image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
03791 }
03792 else
03793 {
03794 image0 = r->sig[SIGSZ-1];
03795 image1 = r->sig[SIGSZ-2];
03796 image1 = (image0 << 24) | (image1 >> 8);
03797 image0 = (image0 >> 8) & 0xffffff;
03798 }
03799
03800
03801
03802 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
03803 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
03804
03805
03806 image0 |= sign;
03807 image0 |= (REAL_EXP (r) + 128) << 7;
03808 break;
03809
03810 default:
03811 gcc_unreachable ();
03812 }
03813
03814 if (FLOAT_WORDS_BIG_ENDIAN)
03815 buf[0] = image1, buf[1] = image0;
03816 else
03817 buf[0] = image0, buf[1] = image1;
03818 }
03819
03820 static void
03821 decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
03822 REAL_VALUE_TYPE *r, const long *buf)
03823 {
03824 unsigned long image0, image1;
03825 int exp;
03826
03827 if (FLOAT_WORDS_BIG_ENDIAN)
03828 image1 = buf[0], image0 = buf[1];
03829 else
03830 image0 = buf[0], image1 = buf[1];
03831 image0 &= 0xffffffff;
03832 image1 &= 0xffffffff;
03833
03834 exp = (image0 >> 7) & 0xff;
03835
03836 memset (r, 0, sizeof (*r));
03837
03838 if (exp != 0)
03839 {
03840 r->cl = rvc_normal;
03841 r->sign = (image0 >> 15) & 1;
03842 SET_REAL_EXP (r, exp - 128);
03843
03844
03845
03846 image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
03847 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
03848
03849 if (HOST_BITS_PER_LONG == 64)
03850 {
03851 image0 = (image0 << 31 << 1) | image1;
03852 image0 <<= 64 - 56;
03853 image0 |= SIG_MSB;
03854 r->sig[SIGSZ-1] = image0;
03855 }
03856 else
03857 {
03858 r->sig[SIGSZ-1] = image0;
03859 r->sig[SIGSZ-2] = image1;
03860 lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
03861 r->sig[SIGSZ-1] |= SIG_MSB;
03862 }
03863 }
03864 }
03865
03866 static void
03867 encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
03868 const REAL_VALUE_TYPE *r)
03869 {
03870 unsigned long image0, image1, sign = r->sign << 15;
03871
03872 switch (r->cl)
03873 {
03874 case rvc_zero:
03875 image0 = image1 = 0;
03876 break;
03877
03878 case rvc_inf:
03879 case rvc_nan:
03880 image0 = 0xffff7fff | sign;
03881 image1 = 0xffffffff;
03882 break;
03883
03884 case rvc_normal:
03885
03886 if (HOST_BITS_PER_LONG == 64)
03887 {
03888 image0 = r->sig[SIGSZ-1];
03889 image1 = (image0 >> (64 - 53)) & 0xffffffff;
03890 image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
03891 }
03892 else
03893 {
03894 image0 = r->sig[SIGSZ-1];
03895 image1 = r->sig[SIGSZ-2];
03896 image1 = (image0 << 21) | (image1 >> 11);
03897 image0 = (image0 >> 11) & 0xfffff;
03898 }
03899
03900
03901
03902 image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
03903 image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
03904
03905
03906 image0 |= sign;
03907 image0 |= (REAL_EXP (r) + 1024) << 4;
03908 break;
03909
03910 default:
03911 gcc_unreachable ();
03912 }
03913
03914 if (FLOAT_WORDS_BIG_ENDIAN)
03915 buf[0] = image1, buf[1] = image0;
03916 else
03917 buf[0] = image0, buf[1] = image1;
03918 }
03919
03920 static void
03921 decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
03922 REAL_VALUE_TYPE *r, const long *buf)
03923 {
03924 unsigned long image0, image1;
03925 int exp;
03926
03927 if (FLOAT_WORDS_BIG_ENDIAN)
03928 image1 = buf[0], image0 = buf[1];
03929 else
03930 image0 = buf[0], image1 = buf[1];
03931 image0 &= 0xffffffff;
03932 image1 &= 0xffffffff;
03933
03934 exp = (image0 >> 4) & 0x7ff;
03935
03936 memset (r, 0, sizeof (*r));
03937
03938 if (exp != 0)
03939 {
03940 r->cl = rvc_normal;
03941 r->sign = (image0 >> 15) & 1;
03942 SET_REAL_EXP (r, exp - 1024);
03943
03944
03945
03946 image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
03947 image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
03948
03949 if (HOST_BITS_PER_LONG == 64)
03950 {
03951 image0 = (image0 << 31 << 1) | image1;
03952 image0 <<= 64 - 53;
03953 image0 |= SIG_MSB;
03954 r->sig[SIGSZ-1] = image0;
03955 }
03956 else
03957 {
03958 r->sig[SIGSZ-1] = image0;
03959 r->sig[SIGSZ-2] = image1;
03960 lshift_significand (r, r, 64 - 53);
03961 r->sig[SIGSZ-1] |= SIG_MSB;
03962 }
03963 }
03964 }
03965
03966 const struct real_format vax_f_format =
03967 {
03968 encode_vax_f,
03969 decode_vax_f,
03970 2,
03971 1,
03972 24,
03973 24,
03974 -127,
03975 127,
03976 15,
03977 false,
03978 false,
03979 false,
03980 false,
03981 false
03982 };
03983
03984 const struct real_format vax_d_format =
03985 {
03986 encode_vax_d,
03987 decode_vax_d,
03988 2,
03989 1,
03990 56,
03991 56,
03992 -127,
03993 127,
03994 15,
03995 false,
03996 false,
03997 false,
03998 false,
03999 false
04000 };
04001
04002 const struct real_format vax_g_format =
04003 {
04004 encode_vax_g,
04005 decode_vax_g,
04006 2,
04007 1,
04008 53,
04009 53,
04010 -1023,
04011 1023,
04012 15,
04013 false,
04014 false,
04015 false,
04016 false,
04017 false
04018 };
04019
04020
04021
04022
04023
04024
04025
04026
04027 static void encode_i370_single (const struct real_format *fmt,
04028 long *, const REAL_VALUE_TYPE *);
04029 static void decode_i370_single (const struct real_format *,
04030 REAL_VALUE_TYPE *, const long *);
04031 static void encode_i370_double (const struct real_format *fmt,
04032 long *, const REAL_VALUE_TYPE *);
04033 static void decode_i370_double (const struct real_format *,
04034 REAL_VALUE_TYPE *, const long *);
04035
04036 static void
04037 encode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
04038 long *buf, const REAL_VALUE_TYPE *r)
04039 {
04040 unsigned long sign, exp, sig, image;
04041
04042 sign = r->sign << 31;
04043
04044 switch (r->cl)
04045 {
04046 case rvc_zero:
04047 image = 0;
04048 break;
04049
04050 case rvc_inf:
04051 case rvc_nan:
04052 image = 0x7fffffff | sign;
04053 break;
04054
04055 case rvc_normal:
04056 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
04057 exp = ((REAL_EXP (r) / 4) + 64) << 24;
04058 image = sign | exp | sig;
04059 break;
04060
04061 default:
04062 gcc_unreachable ();
04063 }
04064
04065 buf[0] = image;
04066 }
04067
04068 static void
04069 decode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
04070 REAL_VALUE_TYPE *r, const long *buf)
04071 {
04072 unsigned long sign, sig, image = buf[0];
04073 int exp;
04074
04075 sign = (image >> 31) & 1;
04076 exp = (image >> 24) & 0x7f;
04077 sig = image & 0xffffff;
04078
04079 memset (r, 0, sizeof (*r));
04080
04081 if (exp || sig)
04082 {
04083 r->cl = rvc_normal;
04084 r->sign = sign;
04085 SET_REAL_EXP (r, (exp - 64) * 4);
04086 r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
04087 normalize (r);
04088 }
04089 }
04090
04091 static void
04092 encode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
04093 long *buf, const REAL_VALUE_TYPE *r)
04094 {
04095 unsigned long sign, exp, image_hi, image_lo;
04096
04097 sign = r->sign << 31;
04098
04099 switch (r->cl)
04100 {
04101 case rvc_zero:
04102 image_hi = image_lo = 0;
04103 break;
04104
04105 case rvc_inf:
04106 case rvc_nan:
04107 image_hi = 0x7fffffff | sign;
04108 image_lo = 0xffffffff;
04109 break;
04110
04111 case rvc_normal:
04112 if (HOST_BITS_PER_LONG == 64)
04113 {
04114 image_hi = r->sig[SIGSZ-1];
04115 image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
04116 image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
04117 }
04118 else
04119 {
04120 image_hi = r->sig[SIGSZ-1];
04121 image_lo = r->sig[SIGSZ-2];
04122 image_lo = (image_lo >> 8) | (image_hi << 24);
04123 image_hi >>= 8;
04124 }
04125
04126 exp = ((REAL_EXP (r) / 4) + 64) << 24;
04127 image_hi |= sign | exp;
04128 break;
04129
04130 default:
04131 gcc_unreachable ();
04132 }
04133
04134 if (FLOAT_WORDS_BIG_ENDIAN)
04135 buf[0] = image_hi, buf[1] = image_lo;
04136 else
04137 buf[0] = image_lo, buf[1] = image_hi;
04138 }
04139
04140 static void
04141 decode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
04142 REAL_VALUE_TYPE *r, const long *buf)
04143 {
04144 unsigned long sign, image_hi, image_lo;
04145 int exp;
04146
04147 if (FLOAT_WORDS_BIG_ENDIAN)
04148 image_hi = buf[0], image_lo = buf[1];
04149 else
04150 image_lo = buf[0], image_hi = buf[1];
04151
04152 sign = (image_hi >> 31) & 1;
04153 exp = (image_hi >> 24) & 0x7f;
04154 image_hi &= 0xffffff;
04155 image_lo &= 0xffffffff;
04156
04157 memset (r, 0, sizeof (*r));
04158
04159 if (exp || image_hi || image_lo)
04160 {
04161 r->cl = rvc_normal;
04162 r->sign = sign;
04163 SET_REAL_EXP (r, (exp - 64) * 4 + (SIGNIFICAND_BITS - 56));
04164
04165 if (HOST_BITS_PER_LONG == 32)
04166 {
04167 r->sig[0] = image_lo;
04168 r->sig[1] = image_hi;
04169 }
04170 else
04171 r->sig[0] = image_lo | (image_hi << 31 << 1);
04172
04173 normalize (r);
04174 }
04175 }
04176
04177 const struct real_format i370_single_format =
04178 {
04179 encode_i370_single,
04180 decode_i370_single,
04181 16,
04182 4,
04183 6,
04184 6,
04185 -64,
04186 63,
04187 31,
04188 false,
04189 false,
04190 false,
04191 false,
04192 false
04193 };
04194
04195 const struct real_format i370_double_format =
04196 {
04197 encode_i370_double,
04198 decode_i370_double,
04199 16,
04200 4,
04201 14,
04202 14,
04203 -64,
04204 63,
04205 63,
04206 false,
04207 false,
04208 false,
04209 false,
04210 false
04211 };
04212
04213
04214
04215
04216
04217
04218
04219
04220
04221
04222
04223
04224
04225
04226
04227
04228
04229
04230
04231
04232 static void encode_c4x_single (const struct real_format *fmt,
04233 long *, const REAL_VALUE_TYPE *);
04234 static void decode_c4x_single (const struct real_format *,
04235 REAL_VALUE_TYPE *, const long *);
04236 static void encode_c4x_extended (const struct real_format *fmt,
04237 long *, const REAL_VALUE_TYPE *);
04238 static void decode_c4x_extended (const struct real_format *,
04239 REAL_VALUE_TYPE *, const long *);
04240
04241 static void
04242 encode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
04243 long *buf, const REAL_VALUE_TYPE *r)
04244 {
04245 unsigned long image, exp, sig;
04246
04247 switch (r->cl)
04248 {
04249 case rvc_zero:
04250 exp = -128;
04251 sig = 0;
04252 break;
04253
04254 case rvc_inf:
04255 case rvc_nan:
04256 exp = 127;
04257 sig = 0x800000 - r->sign;
04258 break;
04259
04260 case rvc_normal:
04261 exp = REAL_EXP (r) - 1;
04262 sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
04263 if (r->sign)
04264 {
04265 if (sig)
04266 sig = -sig;
04267 else
04268 exp--;
04269 sig |= 0x800000;
04270 }
04271 break;
04272
04273 default:
04274 gcc_unreachable ();
04275 }
04276
04277 image = ((exp & 0xff) << 24) | (sig & 0xffffff);
04278 buf[0] = image;
04279 }
04280
04281 static void
04282 decode_c4x_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
04283 REAL_VALUE_TYPE *r, const long *buf)
04284 {
04285 unsigned long image = buf[0];
04286 unsigned long sig;
04287 int exp, sf;
04288
04289 exp = (((image >> 24) & 0xff) ^ 0x80) - 0x80;
04290 sf = ((image & 0xffffff) ^ 0x800000) - 0x800000;
04291
04292 memset (r, 0, sizeof (*r));
04293
04294 if (exp != -128)
04295 {
04296 r->cl = rvc_normal;
04297
04298 sig = sf & 0x7fffff;
04299 if (sf < 0)
04300 {
04301 r->sign = 1;
04302 if (sig)
04303 sig = -sig;
04304 else
04305 exp++;
04306 }
04307 sig = (sig << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
04308
04309 SET_REAL_EXP (r, exp + 1);
04310 r->sig[SIGSZ-1] = sig;
04311 }
04312 }
04313
04314 static void
04315 encode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
04316 long *buf, const REAL_VALUE_TYPE *r)
04317 {
04318 unsigned long exp, sig;
04319
04320 switch (r->cl)
04321 {
04322 case rvc_zero:
04323 exp = -128;
04324 sig = 0;
04325 break;
04326
04327 case rvc_inf:
04328 case rvc_nan:
04329 exp = 127;
04330 sig = 0x80000000 - r->sign;
04331 break;
04332
04333 case rvc_normal:
04334 exp = REAL_EXP (r) - 1;
04335
04336 sig = r->sig[SIGSZ-1];
04337 if (HOST_BITS_PER_LONG == 64)
04338 sig = sig >> 1 >> 31;
04339 sig &= 0x7fffffff;
04340
04341 if (r->sign)
04342 {
04343 if (sig)
04344 sig = -sig;
04345 else
04346 exp--;
04347 sig |= 0x80000000;
04348 }
04349 break;
04350
04351 default:
04352 gcc_unreachable ();
04353 }
04354
04355 exp = (exp & 0xff) << 24;
04356 sig &= 0xffffffff;
04357
04358 if (FLOAT_WORDS_BIG_ENDIAN)
04359 buf[0] = exp, buf[1] = sig;
04360 else
04361 buf[0] = sig, buf[0] = exp;
04362 }
04363
04364 static void
04365 decode_c4x_extended (const struct real_format *fmt ATTRIBUTE_UNUSED,
04366 REAL_VALUE_TYPE *r, const long *buf)
04367 {
04368 unsigned long sig;
04369 int exp, sf;
04370
04371 if (FLOAT_WORDS_BIG_ENDIAN)
04372 exp = buf[0], sf = buf[1];
04373 else
04374 sf = buf[0], exp = buf[1];
04375
04376 exp = (((exp >> 24) & 0xff) & 0x80) - 0x80;
04377 sf = ((sf & 0xffffffff) ^ 0x80000000) - 0x80000000;
04378
04379 memset (r, 0, sizeof (*r));
04380
04381 if (exp != -128)
04382 {
04383 r->cl = rvc_normal;
04384
04385 sig = sf & 0x7fffffff;
04386 if (sf < 0)
04387 {
04388 r->sign = 1;
04389 if (sig)
04390 sig = -sig;
04391 else
04392 exp++;
04393 }
04394 if (HOST_BITS_PER_LONG == 64)
04395 sig = sig << 1 << 31;
04396 sig |= SIG_MSB;
04397
04398 SET_REAL_EXP (r, exp + 1);
04399 r->sig[SIGSZ-1] = sig;
04400 }
04401 }
04402
04403 const struct real_format c4x_single_format =
04404 {
04405 encode_c4x_single,
04406 decode_c4x_single,
04407 2,
04408 1,
04409 24,
04410 24,
04411 -126,
04412 128,
04413 -1,
04414 false,
04415 false,
04416 false,
04417 false,
04418 false
04419 };
04420
04421 const struct real_format c4x_extended_format =
04422 {
04423 encode_c4x_extended,
04424 decode_c4x_extended,
04425 2,
04426 1,
04427 32,
04428 32,
04429 -126,
04430 128,
04431 -1,
04432 false,
04433 false,
04434 false,
04435 false,
04436 false
04437 };
04438
04439
04440
04441
04442
04443
04444
04445 static void encode_internal (const struct real_format *fmt,
04446 long *, const REAL_VALUE_TYPE *);
04447 static void decode_internal (const struct real_format *,
04448 REAL_VALUE_TYPE *, const long *);
04449
04450 static void
04451 encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
04452 const REAL_VALUE_TYPE *r)
04453 {
04454 memcpy (buf, r, sizeof (*r));
04455 }
04456
04457 static void
04458 decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
04459 REAL_VALUE_TYPE *r, const long *buf)
04460 {
04461 memcpy (r, buf, sizeof (*r));
04462 }
04463
04464 const struct real_format real_internal_format =
04465 {
04466 encode_internal,
04467 decode_internal,
04468 2,
04469 1,
04470 SIGNIFICAND_BITS - 2,
04471 SIGNIFICAND_BITS - 2,
04472 -MAX_EXP,
04473 MAX_EXP,
04474 -1,
04475 true,
04476 true,
04477 false,
04478 true,
04479 true
04480 };
04481
04482
04483
04484
04485
04486
04487
04488 bool
04489 real_sqrt (REAL_VALUE_TYPE *r, enum machine_mode mode,
04490 const REAL_VALUE_TYPE *x)
04491 {
04492 static REAL_VALUE_TYPE halfthree;
04493 static bool init = false;
04494 REAL_VALUE_TYPE h, t, i;
04495 int iter, exp;
04496
04497
04498 if (real_isnegzero (x))
04499 {
04500 *r = *x;
04501 return false;
04502 }
04503
04504
04505 if (real_isneg (x))
04506 {
04507 get_canonical_qnan (r, 0);
04508 return false;
04509 }
04510
04511
04512 if (real_isinf (x) || real_isnan (x))
04513 {
04514 *r = *x;
04515 return false;
04516 }
04517
04518 if (!init)
04519 {
04520 do_add (&halfthree, &dconst1, &dconsthalf, 0);
04521 init = true;
04522 }
04523
04524
04525 exp = real_exponent (x);
04526 real_ldexp (&i, &dconst1, -exp/2);
04527
04528
04529 for (iter = 0; iter < 16; iter++)
04530 {
04531
04532 do_multiply (&t, x, &i);
04533 do_multiply (&h, &t, &i);
04534 do_multiply (&t, &h, &dconsthalf);
04535 do_add (&h, &halfthree, &t, 1);
04536 do_multiply (&t, &i, &h);
04537
04538
04539 if (iter >= 6 && real_identical (&i, &t))
04540 break;
04541
04542
04543 i = t;
04544 }
04545
04546
04547 do_multiply (&t, x, &i);
04548 do_multiply (&h, &t, &i);
04549 do_add (&i, &dconst1, &h, 1);
04550 do_multiply (&h, &t, &i);
04551 do_multiply (&i, &dconsthalf, &h);
04552 do_add (&h, &t, &i, 0);
04553
04554
04555
04556 real_convert (r, mode, &h);
04557 return true;
04558 }
04559
04560
04561
04562
04563
04564
04565
04566 bool
04567 real_powi (REAL_VALUE_TYPE *r, enum machine_mode mode,
04568 const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
04569 {
04570 unsigned HOST_WIDE_INT bit;
04571 REAL_VALUE_TYPE t;
04572 bool inexact = false;
04573 bool init = false;
04574 bool neg;
04575 int i;
04576
04577 if (n == 0)
04578 {
04579 *r = dconst1;
04580 return false;
04581 }
04582 else if (n < 0)
04583 {
04584
04585 neg = true;
04586 n = -n;
04587 }
04588 else
04589 neg = false;
04590
04591 t = *x;
04592 bit = (unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1);
04593 for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
04594 {
04595 if (init)
04596 {
04597 inexact |= do_multiply (&t, &t, &t);
04598 if (n & bit)
04599 inexact |= do_multiply (&t, &t, x);
04600 }
04601 else if (n & bit)
04602 init = true;
04603 bit >>= 1;
04604 }
04605
04606 if (neg)
04607 inexact |= do_divide (&t, &dconst1, &t);
04608
04609 real_convert (r, mode, &t);
04610 return inexact;
04611 }
04612
04613
04614
04615
04616 void
04617 real_trunc (REAL_VALUE_TYPE *r, enum machine_mode mode,
04618 const REAL_VALUE_TYPE *x)
04619 {
04620 do_fix_trunc (r, x);
04621 if (mode != VOIDmode)
04622 real_convert (r, mode, r);
04623 }
04624
04625
04626
04627
04628 void
04629 real_floor (REAL_VALUE_TYPE *r, enum machine_mode mode,
04630 const REAL_VALUE_TYPE *x)
04631 {
04632 REAL_VALUE_TYPE t;
04633
04634 do_fix_trunc (&t, x);
04635 if (! real_identical (&t, x) && x->sign)
04636 do_add (&t, &t, &dconstm1, 0);
04637 if (mode != VOIDmode)
04638 real_convert (r, mode, &t);
04639 else
04640 *r = t;
04641 }
04642
04643
04644
04645
04646 void
04647 real_ceil (REAL_VALUE_TYPE *r, enum machine_mode mode,
04648 const REAL_VALUE_TYPE *x)
04649 {
04650 REAL_VALUE_TYPE t;
04651
04652 do_fix_trunc (&t, x);
04653 if (! real_identical (&t, x) && ! x->sign)
04654 do_add (&t, &t, &dconst1, 0);
04655 if (mode != VOIDmode)
04656 real_convert (r, mode, &t);
04657 else
04658 *r = t;
04659 }
04660
04661
04662
04663
04664 void
04665 real_round (REAL_VALUE_TYPE *r, enum machine_mode mode,
04666 const REAL_VALUE_TYPE *x)
04667 {
04668 do_add (r, x, &dconsthalf, x->sign);
04669 do_fix_trunc (r, r);
04670 if (mode != VOIDmode)
04671 real_convert (r, mode, r);
04672 }
04673
04674
04675
04676 void
04677 real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
04678 {
04679 r->sign = x->sign;
04680 }
04681