Home | History | Annotate | Line # | Download | only in gcc
real.cc revision 1.1
      1  1.1  mrg /* real.cc - software floating point emulation.
      2  1.1  mrg    Copyright (C) 1993-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Stephen L. Moshier (moshier (at) world.std.com).
      4  1.1  mrg    Re-written by Richard Henderson <rth (at) redhat.com>
      5  1.1  mrg 
      6  1.1  mrg    This file is part of GCC.
      7  1.1  mrg 
      8  1.1  mrg    GCC is free software; you can redistribute it and/or modify it under
      9  1.1  mrg    the terms of the GNU General Public License as published by the Free
     10  1.1  mrg    Software Foundation; either version 3, or (at your option) any later
     11  1.1  mrg    version.
     12  1.1  mrg 
     13  1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     14  1.1  mrg    WARRANTY; without even the implied warranty of MERCHANTABILITY or
     15  1.1  mrg    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     16  1.1  mrg    for more details.
     17  1.1  mrg 
     18  1.1  mrg    You should have received a copy of the GNU General Public License
     19  1.1  mrg    along with GCC; see the file COPYING3.  If not see
     20  1.1  mrg    <http://www.gnu.org/licenses/>.  */
     21  1.1  mrg 
     22  1.1  mrg #include "config.h"
     23  1.1  mrg #include "system.h"
     24  1.1  mrg #include "coretypes.h"
     25  1.1  mrg #include "tm.h"
     26  1.1  mrg #include "rtl.h"
     27  1.1  mrg #include "tree.h"
     28  1.1  mrg #include "realmpfr.h"
     29  1.1  mrg #include "dfp.h"
     30  1.1  mrg 
     31  1.1  mrg /* The floating point model used internally is not exactly IEEE 754
     32  1.1  mrg    compliant, and close to the description in the ISO C99 standard,
     33  1.1  mrg    section 5.2.4.2.2 Characteristics of floating types.
     34  1.1  mrg 
     35  1.1  mrg    Specifically
     36  1.1  mrg 
     37  1.1  mrg 	x = s * b^e * \sum_{k=1}^p f_k * b^{-k}
     38  1.1  mrg 
     39  1.1  mrg 	where
     40  1.1  mrg 		s = sign (+- 1)
     41  1.1  mrg 		b = base or radix, here always 2
     42  1.1  mrg 		e = exponent
     43  1.1  mrg 		p = precision (the number of base-b digits in the significand)
     44  1.1  mrg 		f_k = the digits of the significand.
     45  1.1  mrg 
     46  1.1  mrg    We differ from typical IEEE 754 encodings in that the entire
     47  1.1  mrg    significand is fractional.  Normalized significands are in the
     48  1.1  mrg    range [0.5, 1.0).
     49  1.1  mrg 
     50  1.1  mrg    A requirement of the model is that P be larger than the largest
     51  1.1  mrg    supported target floating-point type by at least 2 bits.  This gives
     52  1.1  mrg    us proper rounding when we truncate to the target type.  In addition,
     53  1.1  mrg    E must be large enough to hold the smallest supported denormal number
     54  1.1  mrg    in a normalized form.
     55  1.1  mrg 
     56  1.1  mrg    Both of these requirements are easily satisfied.  The largest target
     57  1.1  mrg    significand is 113 bits; we store at least 160.  The smallest
     58  1.1  mrg    denormal number fits in 17 exponent bits; we store 26.  */
     59  1.1  mrg 
     60  1.1  mrg 
     61  1.1  mrg /* Used to classify two numbers simultaneously.  */
     62  1.1  mrg #define CLASS2(A, B)  ((A) << 2 | (B))
     63  1.1  mrg 
     64  1.1  mrg #if HOST_BITS_PER_LONG != 64 && HOST_BITS_PER_LONG != 32
     65  1.1  mrg  #error "Some constant folding done by hand to avoid shift count warnings"
     66  1.1  mrg #endif
     67  1.1  mrg 
     68  1.1  mrg static void get_zero (REAL_VALUE_TYPE *, int);
     69  1.1  mrg static void get_canonical_qnan (REAL_VALUE_TYPE *, int);
     70  1.1  mrg static void get_canonical_snan (REAL_VALUE_TYPE *, int);
     71  1.1  mrg static void get_inf (REAL_VALUE_TYPE *, int);
     72  1.1  mrg static bool sticky_rshift_significand (REAL_VALUE_TYPE *,
     73  1.1  mrg 				       const REAL_VALUE_TYPE *, unsigned int);
     74  1.1  mrg static void rshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
     75  1.1  mrg 				unsigned int);
     76  1.1  mrg static void lshift_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
     77  1.1  mrg 				unsigned int);
     78  1.1  mrg static void lshift_significand_1 (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
     79  1.1  mrg static bool add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *,
     80  1.1  mrg 			      const REAL_VALUE_TYPE *);
     81  1.1  mrg static bool sub_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
     82  1.1  mrg 			      const REAL_VALUE_TYPE *, int);
     83  1.1  mrg static void neg_significand (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
     84  1.1  mrg static int cmp_significands (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
     85  1.1  mrg static int cmp_significand_0 (const REAL_VALUE_TYPE *);
     86  1.1  mrg static void set_significand_bit (REAL_VALUE_TYPE *, unsigned int);
     87  1.1  mrg static void clear_significand_bit (REAL_VALUE_TYPE *, unsigned int);
     88  1.1  mrg static bool test_significand_bit (REAL_VALUE_TYPE *, unsigned int);
     89  1.1  mrg static void clear_significand_below (REAL_VALUE_TYPE *, unsigned int);
     90  1.1  mrg static bool div_significands (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
     91  1.1  mrg 			      const REAL_VALUE_TYPE *);
     92  1.1  mrg static void normalize (REAL_VALUE_TYPE *);
     93  1.1  mrg 
     94  1.1  mrg static bool do_add (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
     95  1.1  mrg 		    const REAL_VALUE_TYPE *, int);
     96  1.1  mrg static bool do_multiply (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
     97  1.1  mrg 			 const REAL_VALUE_TYPE *);
     98  1.1  mrg static bool do_divide (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *,
     99  1.1  mrg 		       const REAL_VALUE_TYPE *);
    100  1.1  mrg static int do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
    101  1.1  mrg static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
    102  1.1  mrg 
    103  1.1  mrg static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *);
    104  1.1  mrg static void decimal_from_integer (REAL_VALUE_TYPE *);
    105  1.1  mrg static void decimal_integer_string (char *, const REAL_VALUE_TYPE *,
    106  1.1  mrg 				    size_t);
    107  1.1  mrg 
    108  1.1  mrg static const REAL_VALUE_TYPE * ten_to_ptwo (int);
    109  1.1  mrg static const REAL_VALUE_TYPE * ten_to_mptwo (int);
    110  1.1  mrg static const REAL_VALUE_TYPE * real_digit (int);
    111  1.1  mrg static void times_pten (REAL_VALUE_TYPE *, int);
    112  1.1  mrg 
    113  1.1  mrg static void round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
    114  1.1  mrg 
    115  1.1  mrg /* Initialize R with a positive zero.  */
    117  1.1  mrg 
    118  1.1  mrg static inline void
    119  1.1  mrg get_zero (REAL_VALUE_TYPE *r, int sign)
    120  1.1  mrg {
    121  1.1  mrg   memset (r, 0, sizeof (*r));
    122  1.1  mrg   r->sign = sign;
    123  1.1  mrg }
    124  1.1  mrg 
    125  1.1  mrg /* Initialize R with the canonical quiet NaN.  */
    126  1.1  mrg 
    127  1.1  mrg static inline void
    128  1.1  mrg get_canonical_qnan (REAL_VALUE_TYPE *r, int sign)
    129  1.1  mrg {
    130  1.1  mrg   memset (r, 0, sizeof (*r));
    131  1.1  mrg   r->cl = rvc_nan;
    132  1.1  mrg   r->sign = sign;
    133  1.1  mrg   r->canonical = 1;
    134  1.1  mrg }
    135  1.1  mrg 
    136  1.1  mrg static inline void
    137  1.1  mrg get_canonical_snan (REAL_VALUE_TYPE *r, int sign)
    138  1.1  mrg {
    139  1.1  mrg   memset (r, 0, sizeof (*r));
    140  1.1  mrg   r->cl = rvc_nan;
    141  1.1  mrg   r->sign = sign;
    142  1.1  mrg   r->signalling = 1;
    143  1.1  mrg   r->canonical = 1;
    144  1.1  mrg }
    145  1.1  mrg 
    146  1.1  mrg static inline void
    147  1.1  mrg get_inf (REAL_VALUE_TYPE *r, int sign)
    148  1.1  mrg {
    149  1.1  mrg   memset (r, 0, sizeof (*r));
    150  1.1  mrg   r->cl = rvc_inf;
    151  1.1  mrg   r->sign = sign;
    152  1.1  mrg }
    153  1.1  mrg 
    154  1.1  mrg 
    155  1.1  mrg /* Right-shift the significand of A by N bits; put the result in the
    157  1.1  mrg    significand of R.  If any one bits are shifted out, return true.  */
    158  1.1  mrg 
    159  1.1  mrg static bool
    160  1.1  mrg sticky_rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
    161  1.1  mrg 			   unsigned int n)
    162  1.1  mrg {
    163  1.1  mrg   unsigned long sticky = 0;
    164  1.1  mrg   unsigned int i, ofs = 0;
    165  1.1  mrg 
    166  1.1  mrg   if (n >= HOST_BITS_PER_LONG)
    167  1.1  mrg     {
    168  1.1  mrg       for (i = 0, ofs = n / HOST_BITS_PER_LONG; i < ofs; ++i)
    169  1.1  mrg 	sticky |= a->sig[i];
    170  1.1  mrg       n &= HOST_BITS_PER_LONG - 1;
    171  1.1  mrg     }
    172  1.1  mrg 
    173  1.1  mrg   if (n != 0)
    174  1.1  mrg     {
    175  1.1  mrg       sticky |= a->sig[ofs] & (((unsigned long)1 << n) - 1);
    176  1.1  mrg       for (i = 0; i < SIGSZ; ++i)
    177  1.1  mrg 	{
    178  1.1  mrg 	  r->sig[i]
    179  1.1  mrg 	    = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
    180  1.1  mrg 	       | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
    181  1.1  mrg 		  << (HOST_BITS_PER_LONG - n)));
    182  1.1  mrg 	}
    183  1.1  mrg     }
    184  1.1  mrg   else
    185  1.1  mrg     {
    186  1.1  mrg       for (i = 0; ofs + i < SIGSZ; ++i)
    187  1.1  mrg 	r->sig[i] = a->sig[ofs + i];
    188  1.1  mrg       for (; i < SIGSZ; ++i)
    189  1.1  mrg 	r->sig[i] = 0;
    190  1.1  mrg     }
    191  1.1  mrg 
    192  1.1  mrg   return sticky != 0;
    193  1.1  mrg }
    194  1.1  mrg 
    195  1.1  mrg /* Right-shift the significand of A by N bits; put the result in the
    196  1.1  mrg    significand of R.  */
    197  1.1  mrg 
    198  1.1  mrg static void
    199  1.1  mrg rshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
    200  1.1  mrg 		    unsigned int n)
    201  1.1  mrg {
    202  1.1  mrg   unsigned int i, ofs = n / HOST_BITS_PER_LONG;
    203  1.1  mrg 
    204  1.1  mrg   n &= HOST_BITS_PER_LONG - 1;
    205  1.1  mrg   if (n != 0)
    206  1.1  mrg     {
    207  1.1  mrg       for (i = 0; i < SIGSZ; ++i)
    208  1.1  mrg 	{
    209  1.1  mrg 	  r->sig[i]
    210  1.1  mrg 	    = (((ofs + i >= SIGSZ ? 0 : a->sig[ofs + i]) >> n)
    211  1.1  mrg 	       | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[ofs + i + 1])
    212  1.1  mrg 		  << (HOST_BITS_PER_LONG - n)));
    213  1.1  mrg 	}
    214  1.1  mrg     }
    215  1.1  mrg   else
    216  1.1  mrg     {
    217  1.1  mrg       for (i = 0; ofs + i < SIGSZ; ++i)
    218  1.1  mrg 	r->sig[i] = a->sig[ofs + i];
    219  1.1  mrg       for (; i < SIGSZ; ++i)
    220  1.1  mrg 	r->sig[i] = 0;
    221  1.1  mrg     }
    222  1.1  mrg }
    223  1.1  mrg 
    224  1.1  mrg /* Left-shift the significand of A by N bits; put the result in the
    225  1.1  mrg    significand of R.  */
    226  1.1  mrg 
    227  1.1  mrg static void
    228  1.1  mrg lshift_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
    229  1.1  mrg 		    unsigned int n)
    230  1.1  mrg {
    231  1.1  mrg   unsigned int i, ofs = n / HOST_BITS_PER_LONG;
    232  1.1  mrg 
    233  1.1  mrg   n &= HOST_BITS_PER_LONG - 1;
    234  1.1  mrg   if (n == 0)
    235  1.1  mrg     {
    236  1.1  mrg       for (i = 0; ofs + i < SIGSZ; ++i)
    237  1.1  mrg 	r->sig[SIGSZ-1-i] = a->sig[SIGSZ-1-i-ofs];
    238  1.1  mrg       for (; i < SIGSZ; ++i)
    239  1.1  mrg 	r->sig[SIGSZ-1-i] = 0;
    240  1.1  mrg     }
    241  1.1  mrg   else
    242  1.1  mrg     for (i = 0; i < SIGSZ; ++i)
    243  1.1  mrg       {
    244  1.1  mrg 	r->sig[SIGSZ-1-i]
    245  1.1  mrg 	  = (((ofs + i >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs]) << n)
    246  1.1  mrg 	     | ((ofs + i + 1 >= SIGSZ ? 0 : a->sig[SIGSZ-1-i-ofs-1])
    247  1.1  mrg 		>> (HOST_BITS_PER_LONG - n)));
    248  1.1  mrg       }
    249  1.1  mrg }
    250  1.1  mrg 
    251  1.1  mrg /* Likewise, but N is specialized to 1.  */
    252  1.1  mrg 
    253  1.1  mrg static inline void
    254  1.1  mrg lshift_significand_1 (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
    255  1.1  mrg {
    256  1.1  mrg   unsigned int i;
    257  1.1  mrg 
    258  1.1  mrg   for (i = SIGSZ - 1; i > 0; --i)
    259  1.1  mrg     r->sig[i] = (a->sig[i] << 1) | (a->sig[i-1] >> (HOST_BITS_PER_LONG - 1));
    260  1.1  mrg   r->sig[0] = a->sig[0] << 1;
    261  1.1  mrg }
    262  1.1  mrg 
    263  1.1  mrg /* Add the significands of A and B, placing the result in R.  Return
    264  1.1  mrg    true if there was carry out of the most significant word.  */
    265  1.1  mrg 
    266  1.1  mrg static inline bool
    267  1.1  mrg add_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
    268  1.1  mrg 		  const REAL_VALUE_TYPE *b)
    269  1.1  mrg {
    270  1.1  mrg   bool carry = false;
    271  1.1  mrg   int i;
    272  1.1  mrg 
    273  1.1  mrg   for (i = 0; i < SIGSZ; ++i)
    274  1.1  mrg     {
    275  1.1  mrg       unsigned long ai = a->sig[i];
    276  1.1  mrg       unsigned long ri = ai + b->sig[i];
    277  1.1  mrg 
    278  1.1  mrg       if (carry)
    279  1.1  mrg 	{
    280  1.1  mrg 	  carry = ri < ai;
    281  1.1  mrg 	  carry |= ++ri == 0;
    282  1.1  mrg 	}
    283  1.1  mrg       else
    284  1.1  mrg 	carry = ri < ai;
    285  1.1  mrg 
    286  1.1  mrg       r->sig[i] = ri;
    287  1.1  mrg     }
    288  1.1  mrg 
    289  1.1  mrg   return carry;
    290  1.1  mrg }
    291  1.1  mrg 
    292  1.1  mrg /* Subtract the significands of A and B, placing the result in R.  CARRY is
    293  1.1  mrg    true if there's a borrow incoming to the least significant word.
    294  1.1  mrg    Return true if there was borrow out of the most significant word.  */
    295  1.1  mrg 
    296  1.1  mrg static inline bool
    297  1.1  mrg sub_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
    298  1.1  mrg 		  const REAL_VALUE_TYPE *b, int carry)
    299  1.1  mrg {
    300  1.1  mrg   int i;
    301  1.1  mrg 
    302  1.1  mrg   for (i = 0; i < SIGSZ; ++i)
    303  1.1  mrg     {
    304  1.1  mrg       unsigned long ai = a->sig[i];
    305  1.1  mrg       unsigned long ri = ai - b->sig[i];
    306  1.1  mrg 
    307  1.1  mrg       if (carry)
    308  1.1  mrg 	{
    309  1.1  mrg 	  carry = ri > ai;
    310  1.1  mrg 	  carry |= ~--ri == 0;
    311  1.1  mrg 	}
    312  1.1  mrg       else
    313  1.1  mrg 	carry = ri > ai;
    314  1.1  mrg 
    315  1.1  mrg       r->sig[i] = ri;
    316  1.1  mrg     }
    317  1.1  mrg 
    318  1.1  mrg   return carry;
    319  1.1  mrg }
    320  1.1  mrg 
    321  1.1  mrg /* Negate the significand A, placing the result in R.  */
    322  1.1  mrg 
    323  1.1  mrg static inline void
    324  1.1  mrg neg_significand (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
    325  1.1  mrg {
    326  1.1  mrg   bool carry = true;
    327  1.1  mrg   int i;
    328  1.1  mrg 
    329  1.1  mrg   for (i = 0; i < SIGSZ; ++i)
    330  1.1  mrg     {
    331  1.1  mrg       unsigned long ri, ai = a->sig[i];
    332  1.1  mrg 
    333  1.1  mrg       if (carry)
    334  1.1  mrg 	{
    335  1.1  mrg 	  if (ai)
    336  1.1  mrg 	    {
    337  1.1  mrg 	      ri = -ai;
    338  1.1  mrg 	      carry = false;
    339  1.1  mrg 	    }
    340  1.1  mrg 	  else
    341  1.1  mrg 	    ri = ai;
    342  1.1  mrg 	}
    343  1.1  mrg       else
    344  1.1  mrg 	ri = ~ai;
    345  1.1  mrg 
    346  1.1  mrg       r->sig[i] = ri;
    347  1.1  mrg     }
    348  1.1  mrg }
    349  1.1  mrg 
    350  1.1  mrg /* Compare significands.  Return tri-state vs zero.  */
    351  1.1  mrg 
    352  1.1  mrg static inline int
    353  1.1  mrg cmp_significands (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
    354  1.1  mrg {
    355  1.1  mrg   int i;
    356  1.1  mrg 
    357  1.1  mrg   for (i = SIGSZ - 1; i >= 0; --i)
    358  1.1  mrg     {
    359  1.1  mrg       unsigned long ai = a->sig[i];
    360  1.1  mrg       unsigned long bi = b->sig[i];
    361  1.1  mrg 
    362  1.1  mrg       if (ai > bi)
    363  1.1  mrg 	return 1;
    364  1.1  mrg       if (ai < bi)
    365  1.1  mrg 	return -1;
    366  1.1  mrg     }
    367  1.1  mrg 
    368  1.1  mrg   return 0;
    369  1.1  mrg }
    370  1.1  mrg 
    371  1.1  mrg /* Return true if A is nonzero.  */
    372  1.1  mrg 
    373  1.1  mrg static inline int
    374  1.1  mrg cmp_significand_0 (const REAL_VALUE_TYPE *a)
    375  1.1  mrg {
    376  1.1  mrg   int i;
    377  1.1  mrg 
    378  1.1  mrg   for (i = SIGSZ - 1; i >= 0; --i)
    379  1.1  mrg     if (a->sig[i])
    380  1.1  mrg       return 1;
    381  1.1  mrg 
    382  1.1  mrg   return 0;
    383  1.1  mrg }
    384  1.1  mrg 
    385  1.1  mrg /* Set bit N of the significand of R.  */
    386  1.1  mrg 
    387  1.1  mrg static inline void
    388  1.1  mrg set_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
    389  1.1  mrg {
    390  1.1  mrg   r->sig[n / HOST_BITS_PER_LONG]
    391  1.1  mrg     |= (unsigned long)1 << (n % HOST_BITS_PER_LONG);
    392  1.1  mrg }
    393  1.1  mrg 
    394  1.1  mrg /* Clear bit N of the significand of R.  */
    395  1.1  mrg 
    396  1.1  mrg static inline void
    397  1.1  mrg clear_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
    398  1.1  mrg {
    399  1.1  mrg   r->sig[n / HOST_BITS_PER_LONG]
    400  1.1  mrg     &= ~((unsigned long)1 << (n % HOST_BITS_PER_LONG));
    401  1.1  mrg }
    402  1.1  mrg 
    403  1.1  mrg /* Test bit N of the significand of R.  */
    404  1.1  mrg 
    405  1.1  mrg static inline bool
    406  1.1  mrg test_significand_bit (REAL_VALUE_TYPE *r, unsigned int n)
    407  1.1  mrg {
    408  1.1  mrg   /* ??? Compiler bug here if we return this expression directly.
    409  1.1  mrg      The conversion to bool strips the "&1" and we wind up testing
    410  1.1  mrg      e.g. 2 != 0 -> true.  Seen in gcc version 3.2 20020520.  */
    411  1.1  mrg   int t = (r->sig[n / HOST_BITS_PER_LONG] >> (n % HOST_BITS_PER_LONG)) & 1;
    412  1.1  mrg   return t;
    413  1.1  mrg }
    414  1.1  mrg 
    415  1.1  mrg /* Clear bits 0..N-1 of the significand of R.  */
    416  1.1  mrg 
    417  1.1  mrg static void
    418  1.1  mrg clear_significand_below (REAL_VALUE_TYPE *r, unsigned int n)
    419  1.1  mrg {
    420  1.1  mrg   int i, w = n / HOST_BITS_PER_LONG;
    421  1.1  mrg 
    422  1.1  mrg   for (i = 0; i < w; ++i)
    423  1.1  mrg     r->sig[i] = 0;
    424  1.1  mrg 
    425  1.1  mrg   /* We are actually passing N == SIGNIFICAND_BITS which would result
    426  1.1  mrg      in an out-of-bound access below.  */
    427  1.1  mrg   if (n % HOST_BITS_PER_LONG != 0)
    428  1.1  mrg     r->sig[w] &= ~(((unsigned long)1 << (n % HOST_BITS_PER_LONG)) - 1);
    429  1.1  mrg }
    430  1.1  mrg 
    431  1.1  mrg /* Divide the significands of A and B, placing the result in R.  Return
    432  1.1  mrg    true if the division was inexact.  */
    433  1.1  mrg 
    434  1.1  mrg static inline bool
    435  1.1  mrg div_significands (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
    436  1.1  mrg 		  const REAL_VALUE_TYPE *b)
    437  1.1  mrg {
    438  1.1  mrg   REAL_VALUE_TYPE u;
    439  1.1  mrg   int i, bit = SIGNIFICAND_BITS - 1;
    440  1.1  mrg   unsigned long msb, inexact;
    441  1.1  mrg 
    442  1.1  mrg   u = *a;
    443  1.1  mrg   memset (r->sig, 0, sizeof (r->sig));
    444  1.1  mrg 
    445  1.1  mrg   msb = 0;
    446  1.1  mrg   goto start;
    447  1.1  mrg   do
    448  1.1  mrg     {
    449  1.1  mrg       msb = u.sig[SIGSZ-1] & SIG_MSB;
    450  1.1  mrg       lshift_significand_1 (&u, &u);
    451  1.1  mrg     start:
    452  1.1  mrg       if (msb || cmp_significands (&u, b) >= 0)
    453  1.1  mrg 	{
    454  1.1  mrg 	  sub_significands (&u, &u, b, 0);
    455  1.1  mrg 	  set_significand_bit (r, bit);
    456  1.1  mrg 	}
    457  1.1  mrg     }
    458  1.1  mrg   while (--bit >= 0);
    459  1.1  mrg 
    460  1.1  mrg   for (i = 0, inexact = 0; i < SIGSZ; i++)
    461  1.1  mrg     inexact |= u.sig[i];
    462  1.1  mrg 
    463  1.1  mrg   return inexact != 0;
    464  1.1  mrg }
    465  1.1  mrg 
    466  1.1  mrg /* Adjust the exponent and significand of R such that the most
    467  1.1  mrg    significant bit is set.  We underflow to zero and overflow to
    468  1.1  mrg    infinity here, without denormals.  (The intermediate representation
    469  1.1  mrg    exponent is large enough to handle target denormals normalized.)  */
    470  1.1  mrg 
    471  1.1  mrg static void
    472  1.1  mrg normalize (REAL_VALUE_TYPE *r)
    473  1.1  mrg {
    474  1.1  mrg   int shift = 0, exp;
    475  1.1  mrg   int i, j;
    476  1.1  mrg 
    477  1.1  mrg   if (r->decimal)
    478  1.1  mrg     return;
    479  1.1  mrg 
    480  1.1  mrg   /* Find the first word that is nonzero.  */
    481  1.1  mrg   for (i = SIGSZ - 1; i >= 0; i--)
    482  1.1  mrg     if (r->sig[i] == 0)
    483  1.1  mrg       shift += HOST_BITS_PER_LONG;
    484  1.1  mrg     else
    485  1.1  mrg       break;
    486  1.1  mrg 
    487  1.1  mrg   /* Zero significand flushes to zero.  */
    488  1.1  mrg   if (i < 0)
    489  1.1  mrg     {
    490  1.1  mrg       r->cl = rvc_zero;
    491  1.1  mrg       SET_REAL_EXP (r, 0);
    492  1.1  mrg       return;
    493  1.1  mrg     }
    494  1.1  mrg 
    495  1.1  mrg   /* Find the first bit that is nonzero.  */
    496  1.1  mrg   for (j = 0; ; j++)
    497  1.1  mrg     if (r->sig[i] & ((unsigned long)1 << (HOST_BITS_PER_LONG - 1 - j)))
    498  1.1  mrg       break;
    499  1.1  mrg   shift += j;
    500  1.1  mrg 
    501  1.1  mrg   if (shift > 0)
    502  1.1  mrg     {
    503  1.1  mrg       exp = REAL_EXP (r) - shift;
    504  1.1  mrg       if (exp > MAX_EXP)
    505  1.1  mrg 	get_inf (r, r->sign);
    506  1.1  mrg       else if (exp < -MAX_EXP)
    507  1.1  mrg 	get_zero (r, r->sign);
    508  1.1  mrg       else
    509  1.1  mrg 	{
    510  1.1  mrg 	  SET_REAL_EXP (r, exp);
    511  1.1  mrg 	  lshift_significand (r, r, shift);
    512  1.1  mrg 	}
    513  1.1  mrg     }
    514  1.1  mrg }
    515  1.1  mrg 
    516  1.1  mrg /* Calculate R = A + (SUBTRACT_P ? -B : B).  Return true if the
    518  1.1  mrg    result may be inexact due to a loss of precision.  */
    519  1.1  mrg 
    520  1.1  mrg static bool
    521  1.1  mrg do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
    522  1.1  mrg 	const REAL_VALUE_TYPE *b, int subtract_p)
    523  1.1  mrg {
    524  1.1  mrg   int dexp, sign, exp;
    525  1.1  mrg   REAL_VALUE_TYPE t;
    526  1.1  mrg   bool inexact = false;
    527  1.1  mrg 
    528  1.1  mrg   /* Determine if we need to add or subtract.  */
    529  1.1  mrg   sign = a->sign;
    530  1.1  mrg   subtract_p = (sign ^ b->sign) ^ subtract_p;
    531  1.1  mrg 
    532  1.1  mrg   switch (CLASS2 (a->cl, b->cl))
    533  1.1  mrg     {
    534  1.1  mrg     case CLASS2 (rvc_zero, rvc_zero):
    535  1.1  mrg       /* -0 + -0 = -0, -0 - +0 = -0; all other cases yield +0.  */
    536  1.1  mrg       get_zero (r, sign & !subtract_p);
    537  1.1  mrg       return false;
    538  1.1  mrg 
    539  1.1  mrg     case CLASS2 (rvc_zero, rvc_normal):
    540  1.1  mrg     case CLASS2 (rvc_zero, rvc_inf):
    541  1.1  mrg     case CLASS2 (rvc_zero, rvc_nan):
    542  1.1  mrg       /* 0 + ANY = ANY.  */
    543  1.1  mrg     case CLASS2 (rvc_normal, rvc_nan):
    544  1.1  mrg     case CLASS2 (rvc_inf, rvc_nan):
    545  1.1  mrg     case CLASS2 (rvc_nan, rvc_nan):
    546  1.1  mrg       /* ANY + NaN = NaN.  */
    547  1.1  mrg     case CLASS2 (rvc_normal, rvc_inf):
    548  1.1  mrg       /* R + Inf = Inf.  */
    549  1.1  mrg       *r = *b;
    550  1.1  mrg       /* Make resulting NaN value to be qNaN. The caller has the
    551  1.1  mrg          responsibility to avoid the operation if flag_signaling_nans
    552  1.1  mrg          is on.  */
    553  1.1  mrg       r->signalling = 0;
    554  1.1  mrg       r->sign = sign ^ subtract_p;
    555  1.1  mrg       return false;
    556  1.1  mrg 
    557  1.1  mrg     case CLASS2 (rvc_normal, rvc_zero):
    558  1.1  mrg     case CLASS2 (rvc_inf, rvc_zero):
    559  1.1  mrg     case CLASS2 (rvc_nan, rvc_zero):
    560  1.1  mrg       /* ANY + 0 = ANY.  */
    561  1.1  mrg     case CLASS2 (rvc_nan, rvc_normal):
    562  1.1  mrg     case CLASS2 (rvc_nan, rvc_inf):
    563  1.1  mrg       /* NaN + ANY = NaN.  */
    564  1.1  mrg     case CLASS2 (rvc_inf, rvc_normal):
    565  1.1  mrg       /* Inf + R = Inf.  */
    566  1.1  mrg       *r = *a;
    567  1.1  mrg       /* Make resulting NaN value to be qNaN. The caller has the
    568  1.1  mrg          responsibility to avoid the operation if flag_signaling_nans
    569  1.1  mrg          is on.  */
    570  1.1  mrg       r->signalling = 0;
    571  1.1  mrg       return false;
    572  1.1  mrg 
    573  1.1  mrg     case CLASS2 (rvc_inf, rvc_inf):
    574  1.1  mrg       if (subtract_p)
    575  1.1  mrg 	/* Inf - Inf = NaN.  */
    576  1.1  mrg 	get_canonical_qnan (r, 0);
    577  1.1  mrg       else
    578  1.1  mrg 	/* Inf + Inf = Inf.  */
    579  1.1  mrg 	*r = *a;
    580  1.1  mrg       return false;
    581  1.1  mrg 
    582  1.1  mrg     case CLASS2 (rvc_normal, rvc_normal):
    583  1.1  mrg       break;
    584  1.1  mrg 
    585  1.1  mrg     default:
    586  1.1  mrg       gcc_unreachable ();
    587  1.1  mrg     }
    588  1.1  mrg 
    589  1.1  mrg   /* Swap the arguments such that A has the larger exponent.  */
    590  1.1  mrg   dexp = REAL_EXP (a) - REAL_EXP (b);
    591  1.1  mrg   if (dexp < 0)
    592  1.1  mrg     {
    593  1.1  mrg       const REAL_VALUE_TYPE *t;
    594  1.1  mrg       t = a, a = b, b = t;
    595  1.1  mrg       dexp = -dexp;
    596  1.1  mrg       sign ^= subtract_p;
    597  1.1  mrg     }
    598  1.1  mrg   exp = REAL_EXP (a);
    599  1.1  mrg 
    600  1.1  mrg   /* If the exponents are not identical, we need to shift the
    601  1.1  mrg      significand of B down.  */
    602  1.1  mrg   if (dexp > 0)
    603  1.1  mrg     {
    604  1.1  mrg       /* If the exponents are too far apart, the significands
    605  1.1  mrg 	 do not overlap, which makes the subtraction a noop.  */
    606  1.1  mrg       if (dexp >= SIGNIFICAND_BITS)
    607  1.1  mrg 	{
    608  1.1  mrg 	  *r = *a;
    609  1.1  mrg 	  r->sign = sign;
    610  1.1  mrg 	  return true;
    611  1.1  mrg 	}
    612  1.1  mrg 
    613  1.1  mrg       inexact |= sticky_rshift_significand (&t, b, dexp);
    614  1.1  mrg       b = &t;
    615  1.1  mrg     }
    616  1.1  mrg 
    617  1.1  mrg   if (subtract_p)
    618  1.1  mrg     {
    619  1.1  mrg       if (sub_significands (r, a, b, inexact))
    620  1.1  mrg 	{
    621  1.1  mrg 	  /* We got a borrow out of the subtraction.  That means that
    622  1.1  mrg 	     A and B had the same exponent, and B had the larger
    623  1.1  mrg 	     significand.  We need to swap the sign and negate the
    624  1.1  mrg 	     significand.  */
    625  1.1  mrg 	  sign ^= 1;
    626  1.1  mrg 	  neg_significand (r, r);
    627  1.1  mrg 	}
    628  1.1  mrg     }
    629  1.1  mrg   else
    630  1.1  mrg     {
    631  1.1  mrg       if (add_significands (r, a, b))
    632  1.1  mrg 	{
    633  1.1  mrg 	  /* We got carry out of the addition.  This means we need to
    634  1.1  mrg 	     shift the significand back down one bit and increase the
    635  1.1  mrg 	     exponent.  */
    636  1.1  mrg 	  inexact |= sticky_rshift_significand (r, r, 1);
    637  1.1  mrg 	  r->sig[SIGSZ-1] |= SIG_MSB;
    638  1.1  mrg 	  if (++exp > MAX_EXP)
    639  1.1  mrg 	    {
    640  1.1  mrg 	      get_inf (r, sign);
    641  1.1  mrg 	      return true;
    642  1.1  mrg 	    }
    643  1.1  mrg 	}
    644  1.1  mrg     }
    645  1.1  mrg 
    646  1.1  mrg   r->cl = rvc_normal;
    647  1.1  mrg   r->sign = sign;
    648  1.1  mrg   SET_REAL_EXP (r, exp);
    649  1.1  mrg   /* Zero out the remaining fields.  */
    650  1.1  mrg   r->signalling = 0;
    651  1.1  mrg   r->canonical = 0;
    652  1.1  mrg   r->decimal = 0;
    653  1.1  mrg 
    654  1.1  mrg   /* Re-normalize the result.  */
    655  1.1  mrg   normalize (r);
    656  1.1  mrg 
    657  1.1  mrg   /* Special case: if the subtraction results in zero, the result
    658  1.1  mrg      is positive.  */
    659  1.1  mrg   if (r->cl == rvc_zero)
    660  1.1  mrg     r->sign = 0;
    661  1.1  mrg   else
    662  1.1  mrg     r->sig[0] |= inexact;
    663  1.1  mrg 
    664  1.1  mrg   return inexact;
    665  1.1  mrg }
    666  1.1  mrg 
    667  1.1  mrg /* Calculate R = A * B.  Return true if the result may be inexact.  */
    668  1.1  mrg 
    669  1.1  mrg static bool
    670  1.1  mrg do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
    671  1.1  mrg 	     const REAL_VALUE_TYPE *b)
    672  1.1  mrg {
    673  1.1  mrg   REAL_VALUE_TYPE u, t, *rr;
    674  1.1  mrg   unsigned int i, j, k;
    675  1.1  mrg   int sign = a->sign ^ b->sign;
    676  1.1  mrg   bool inexact = false;
    677  1.1  mrg 
    678  1.1  mrg   switch (CLASS2 (a->cl, b->cl))
    679  1.1  mrg     {
    680  1.1  mrg     case CLASS2 (rvc_zero, rvc_zero):
    681  1.1  mrg     case CLASS2 (rvc_zero, rvc_normal):
    682  1.1  mrg     case CLASS2 (rvc_normal, rvc_zero):
    683  1.1  mrg       /* +-0 * ANY = 0 with appropriate sign.  */
    684  1.1  mrg       get_zero (r, sign);
    685  1.1  mrg       return false;
    686  1.1  mrg 
    687  1.1  mrg     case CLASS2 (rvc_zero, rvc_nan):
    688  1.1  mrg     case CLASS2 (rvc_normal, rvc_nan):
    689  1.1  mrg     case CLASS2 (rvc_inf, rvc_nan):
    690  1.1  mrg     case CLASS2 (rvc_nan, rvc_nan):
    691  1.1  mrg       /* ANY * NaN = NaN.  */
    692  1.1  mrg       *r = *b;
    693  1.1  mrg       /* Make resulting NaN value to be qNaN. The caller has the
    694  1.1  mrg          responsibility to avoid the operation if flag_signaling_nans
    695  1.1  mrg          is on.  */
    696  1.1  mrg       r->signalling = 0;
    697  1.1  mrg       r->sign = sign;
    698  1.1  mrg       return false;
    699  1.1  mrg 
    700  1.1  mrg     case CLASS2 (rvc_nan, rvc_zero):
    701  1.1  mrg     case CLASS2 (rvc_nan, rvc_normal):
    702  1.1  mrg     case CLASS2 (rvc_nan, rvc_inf):
    703  1.1  mrg       /* NaN * ANY = NaN.  */
    704  1.1  mrg       *r = *a;
    705  1.1  mrg       /* Make resulting NaN value to be qNaN. The caller has the
    706  1.1  mrg          responsibility to avoid the operation if flag_signaling_nans
    707  1.1  mrg          is on.  */
    708  1.1  mrg       r->signalling = 0;
    709  1.1  mrg       r->sign = sign;
    710  1.1  mrg       return false;
    711  1.1  mrg 
    712  1.1  mrg     case CLASS2 (rvc_zero, rvc_inf):
    713  1.1  mrg     case CLASS2 (rvc_inf, rvc_zero):
    714  1.1  mrg       /* 0 * Inf = NaN */
    715  1.1  mrg       get_canonical_qnan (r, sign);
    716  1.1  mrg       return false;
    717  1.1  mrg 
    718  1.1  mrg     case CLASS2 (rvc_inf, rvc_inf):
    719  1.1  mrg     case CLASS2 (rvc_normal, rvc_inf):
    720  1.1  mrg     case CLASS2 (rvc_inf, rvc_normal):
    721  1.1  mrg       /* Inf * Inf = Inf, R * Inf = Inf */
    722  1.1  mrg       get_inf (r, sign);
    723  1.1  mrg       return false;
    724  1.1  mrg 
    725  1.1  mrg     case CLASS2 (rvc_normal, rvc_normal):
    726  1.1  mrg       break;
    727  1.1  mrg 
    728  1.1  mrg     default:
    729  1.1  mrg       gcc_unreachable ();
    730  1.1  mrg     }
    731  1.1  mrg 
    732  1.1  mrg   if (r == a || r == b)
    733  1.1  mrg     rr = &t;
    734  1.1  mrg   else
    735  1.1  mrg     rr = r;
    736  1.1  mrg   get_zero (rr, 0);
    737  1.1  mrg 
    738  1.1  mrg   /* Collect all the partial products.  Since we don't have sure access
    739  1.1  mrg      to a widening multiply, we split each long into two half-words.
    740  1.1  mrg 
    741  1.1  mrg      Consider the long-hand form of a four half-word multiplication:
    742  1.1  mrg 
    743  1.1  mrg 		 A  B  C  D
    744  1.1  mrg 	      *  E  F  G  H
    745  1.1  mrg 	     --------------
    746  1.1  mrg 	        DE DF DG DH
    747  1.1  mrg 	     CE CF CG CH
    748  1.1  mrg 	  BE BF BG BH
    749  1.1  mrg        AE AF AG AH
    750  1.1  mrg 
    751  1.1  mrg      We construct partial products of the widened half-word products
    752  1.1  mrg      that are known to not overlap, e.g. DF+DH.  Each such partial
    753  1.1  mrg      product is given its proper exponent, which allows us to sum them
    754  1.1  mrg      and obtain the finished product.  */
    755  1.1  mrg 
    756  1.1  mrg   for (i = 0; i < SIGSZ * 2; ++i)
    757  1.1  mrg     {
    758  1.1  mrg       unsigned long ai = a->sig[i / 2];
    759  1.1  mrg       if (i & 1)
    760  1.1  mrg 	ai >>= HOST_BITS_PER_LONG / 2;
    761  1.1  mrg       else
    762  1.1  mrg 	ai &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
    763  1.1  mrg 
    764  1.1  mrg       if (ai == 0)
    765  1.1  mrg 	continue;
    766  1.1  mrg 
    767  1.1  mrg       for (j = 0; j < 2; ++j)
    768  1.1  mrg 	{
    769  1.1  mrg 	  int exp = (REAL_EXP (a) - (2*SIGSZ-1-i)*(HOST_BITS_PER_LONG/2)
    770  1.1  mrg 		     + (REAL_EXP (b) - (1-j)*(HOST_BITS_PER_LONG/2)));
    771  1.1  mrg 
    772  1.1  mrg 	  if (exp > MAX_EXP)
    773  1.1  mrg 	    {
    774  1.1  mrg 	      get_inf (r, sign);
    775  1.1  mrg 	      return true;
    776  1.1  mrg 	    }
    777  1.1  mrg 	  if (exp < -MAX_EXP)
    778  1.1  mrg 	    {
    779  1.1  mrg 	      /* Would underflow to zero, which we shouldn't bother adding.  */
    780  1.1  mrg 	      inexact = true;
    781  1.1  mrg 	      continue;
    782  1.1  mrg 	    }
    783  1.1  mrg 
    784  1.1  mrg 	  memset (&u, 0, sizeof (u));
    785  1.1  mrg 	  u.cl = rvc_normal;
    786  1.1  mrg 	  SET_REAL_EXP (&u, exp);
    787  1.1  mrg 
    788  1.1  mrg 	  for (k = j; k < SIGSZ * 2; k += 2)
    789  1.1  mrg 	    {
    790  1.1  mrg 	      unsigned long bi = b->sig[k / 2];
    791  1.1  mrg 	      if (k & 1)
    792  1.1  mrg 		bi >>= HOST_BITS_PER_LONG / 2;
    793  1.1  mrg 	      else
    794  1.1  mrg 		bi &= ((unsigned long)1 << (HOST_BITS_PER_LONG / 2)) - 1;
    795  1.1  mrg 
    796  1.1  mrg 	      u.sig[k / 2] = ai * bi;
    797  1.1  mrg 	    }
    798  1.1  mrg 
    799  1.1  mrg 	  normalize (&u);
    800  1.1  mrg 	  inexact |= do_add (rr, rr, &u, 0);
    801  1.1  mrg 	}
    802  1.1  mrg     }
    803  1.1  mrg 
    804  1.1  mrg   rr->sign = sign;
    805  1.1  mrg   if (rr != r)
    806  1.1  mrg     *r = t;
    807  1.1  mrg 
    808  1.1  mrg   return inexact;
    809  1.1  mrg }
    810  1.1  mrg 
    811  1.1  mrg /* Calculate R = A / B.  Return true if the result may be inexact.  */
    812  1.1  mrg 
    813  1.1  mrg static bool
    814  1.1  mrg do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a,
    815  1.1  mrg 	   const REAL_VALUE_TYPE *b)
    816  1.1  mrg {
    817  1.1  mrg   int exp, sign = a->sign ^ b->sign;
    818  1.1  mrg   REAL_VALUE_TYPE t, *rr;
    819  1.1  mrg   bool inexact;
    820  1.1  mrg 
    821  1.1  mrg   switch (CLASS2 (a->cl, b->cl))
    822  1.1  mrg     {
    823  1.1  mrg     case CLASS2 (rvc_zero, rvc_zero):
    824  1.1  mrg       /* 0 / 0 = NaN.  */
    825  1.1  mrg     case CLASS2 (rvc_inf, rvc_inf):
    826  1.1  mrg       /* Inf / Inf = NaN.  */
    827  1.1  mrg       get_canonical_qnan (r, sign);
    828  1.1  mrg       return false;
    829  1.1  mrg 
    830  1.1  mrg     case CLASS2 (rvc_zero, rvc_normal):
    831  1.1  mrg     case CLASS2 (rvc_zero, rvc_inf):
    832  1.1  mrg       /* 0 / ANY = 0.  */
    833  1.1  mrg     case CLASS2 (rvc_normal, rvc_inf):
    834  1.1  mrg       /* R / Inf = 0.  */
    835  1.1  mrg       get_zero (r, sign);
    836  1.1  mrg       return false;
    837  1.1  mrg 
    838  1.1  mrg     case CLASS2 (rvc_normal, rvc_zero):
    839  1.1  mrg       /* R / 0 = Inf.  */
    840  1.1  mrg     case CLASS2 (rvc_inf, rvc_zero):
    841  1.1  mrg       /* Inf / 0 = Inf.  */
    842  1.1  mrg       get_inf (r, sign);
    843  1.1  mrg       return false;
    844  1.1  mrg 
    845  1.1  mrg     case CLASS2 (rvc_zero, rvc_nan):
    846  1.1  mrg     case CLASS2 (rvc_normal, rvc_nan):
    847  1.1  mrg     case CLASS2 (rvc_inf, rvc_nan):
    848  1.1  mrg     case CLASS2 (rvc_nan, rvc_nan):
    849  1.1  mrg       /* ANY / NaN = NaN.  */
    850  1.1  mrg       *r = *b;
    851  1.1  mrg       /* Make resulting NaN value to be qNaN. The caller has the
    852  1.1  mrg          responsibility to avoid the operation if flag_signaling_nans
    853  1.1  mrg          is on.  */
    854  1.1  mrg       r->signalling = 0;
    855  1.1  mrg       r->sign = sign;
    856  1.1  mrg       return false;
    857  1.1  mrg 
    858  1.1  mrg     case CLASS2 (rvc_nan, rvc_zero):
    859  1.1  mrg     case CLASS2 (rvc_nan, rvc_normal):
    860  1.1  mrg     case CLASS2 (rvc_nan, rvc_inf):
    861  1.1  mrg       /* NaN / ANY = NaN.  */
    862  1.1  mrg       *r = *a;
    863  1.1  mrg       /* Make resulting NaN value to be qNaN. The caller has the
    864  1.1  mrg          responsibility to avoid the operation if flag_signaling_nans
    865  1.1  mrg          is on.  */
    866  1.1  mrg       r->signalling = 0;
    867  1.1  mrg       r->sign = sign;
    868  1.1  mrg       return false;
    869  1.1  mrg 
    870  1.1  mrg     case CLASS2 (rvc_inf, rvc_normal):
    871  1.1  mrg       /* Inf / R = Inf.  */
    872  1.1  mrg       get_inf (r, sign);
    873  1.1  mrg       return false;
    874  1.1  mrg 
    875  1.1  mrg     case CLASS2 (rvc_normal, rvc_normal):
    876  1.1  mrg       break;
    877  1.1  mrg 
    878  1.1  mrg     default:
    879  1.1  mrg       gcc_unreachable ();
    880  1.1  mrg     }
    881  1.1  mrg 
    882  1.1  mrg   if (r == a || r == b)
    883  1.1  mrg     rr = &t;
    884  1.1  mrg   else
    885  1.1  mrg     rr = r;
    886  1.1  mrg 
    887  1.1  mrg   /* Make sure all fields in the result are initialized.  */
    888  1.1  mrg   get_zero (rr, 0);
    889  1.1  mrg   rr->cl = rvc_normal;
    890  1.1  mrg   rr->sign = sign;
    891  1.1  mrg 
    892  1.1  mrg   exp = REAL_EXP (a) - REAL_EXP (b) + 1;
    893  1.1  mrg   if (exp > MAX_EXP)
    894  1.1  mrg     {
    895  1.1  mrg       get_inf (r, sign);
    896  1.1  mrg       return true;
    897  1.1  mrg     }
    898  1.1  mrg   if (exp < -MAX_EXP)
    899  1.1  mrg     {
    900  1.1  mrg       get_zero (r, sign);
    901  1.1  mrg       return true;
    902  1.1  mrg     }
    903  1.1  mrg   SET_REAL_EXP (rr, exp);
    904  1.1  mrg 
    905  1.1  mrg   inexact = div_significands (rr, a, b);
    906  1.1  mrg 
    907  1.1  mrg   /* Re-normalize the result.  */
    908  1.1  mrg   normalize (rr);
    909  1.1  mrg   rr->sig[0] |= inexact;
    910  1.1  mrg 
    911  1.1  mrg   if (rr != r)
    912  1.1  mrg     *r = t;
    913  1.1  mrg 
    914  1.1  mrg   return inexact;
    915  1.1  mrg }
    916  1.1  mrg 
    917  1.1  mrg /* Return a tri-state comparison of A vs B.  Return NAN_RESULT if
    918  1.1  mrg    one of the two operands is a NaN.  */
    919  1.1  mrg 
    920  1.1  mrg static int
    921  1.1  mrg do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
    922  1.1  mrg 	    int nan_result)
    923  1.1  mrg {
    924  1.1  mrg   int ret;
    925  1.1  mrg 
    926  1.1  mrg   switch (CLASS2 (a->cl, b->cl))
    927  1.1  mrg     {
    928  1.1  mrg     case CLASS2 (rvc_zero, rvc_zero):
    929  1.1  mrg       /* Sign of zero doesn't matter for compares.  */
    930  1.1  mrg       return 0;
    931  1.1  mrg 
    932  1.1  mrg     case CLASS2 (rvc_normal, rvc_zero):
    933  1.1  mrg       /* Decimal float zero is special and uses rvc_normal, not rvc_zero.  */
    934  1.1  mrg       if (a->decimal)
    935  1.1  mrg 	return decimal_do_compare (a, b, nan_result);
    936  1.1  mrg       /* Fall through.  */
    937  1.1  mrg     case CLASS2 (rvc_inf, rvc_zero):
    938  1.1  mrg     case CLASS2 (rvc_inf, rvc_normal):
    939  1.1  mrg       return (a->sign ? -1 : 1);
    940  1.1  mrg 
    941  1.1  mrg     case CLASS2 (rvc_inf, rvc_inf):
    942  1.1  mrg       return -a->sign - -b->sign;
    943  1.1  mrg 
    944  1.1  mrg     case CLASS2 (rvc_zero, rvc_normal):
    945  1.1  mrg       /* Decimal float zero is special and uses rvc_normal, not rvc_zero.  */
    946  1.1  mrg       if (b->decimal)
    947  1.1  mrg 	return decimal_do_compare (a, b, nan_result);
    948  1.1  mrg       /* Fall through.  */
    949  1.1  mrg     case CLASS2 (rvc_zero, rvc_inf):
    950  1.1  mrg     case CLASS2 (rvc_normal, rvc_inf):
    951  1.1  mrg       return (b->sign ? 1 : -1);
    952  1.1  mrg 
    953  1.1  mrg     case CLASS2 (rvc_zero, rvc_nan):
    954  1.1  mrg     case CLASS2 (rvc_normal, rvc_nan):
    955  1.1  mrg     case CLASS2 (rvc_inf, rvc_nan):
    956  1.1  mrg     case CLASS2 (rvc_nan, rvc_nan):
    957  1.1  mrg     case CLASS2 (rvc_nan, rvc_zero):
    958  1.1  mrg     case CLASS2 (rvc_nan, rvc_normal):
    959  1.1  mrg     case CLASS2 (rvc_nan, rvc_inf):
    960  1.1  mrg       return nan_result;
    961  1.1  mrg 
    962  1.1  mrg     case CLASS2 (rvc_normal, rvc_normal):
    963  1.1  mrg       break;
    964  1.1  mrg 
    965  1.1  mrg     default:
    966  1.1  mrg       gcc_unreachable ();
    967  1.1  mrg     }
    968  1.1  mrg 
    969  1.1  mrg   if (a->decimal || b->decimal)
    970  1.1  mrg     return decimal_do_compare (a, b, nan_result);
    971  1.1  mrg 
    972  1.1  mrg   if (a->sign != b->sign)
    973  1.1  mrg     return -a->sign - -b->sign;
    974  1.1  mrg 
    975  1.1  mrg   if (REAL_EXP (a) > REAL_EXP (b))
    976  1.1  mrg     ret = 1;
    977  1.1  mrg   else if (REAL_EXP (a) < REAL_EXP (b))
    978  1.1  mrg     ret = -1;
    979  1.1  mrg   else
    980  1.1  mrg     ret = cmp_significands (a, b);
    981  1.1  mrg 
    982  1.1  mrg   return (a->sign ? -ret : ret);
    983  1.1  mrg }
    984  1.1  mrg 
    985  1.1  mrg /* Return A truncated to an integral value toward zero.  */
    986  1.1  mrg 
    987  1.1  mrg static void
    988  1.1  mrg do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
    989  1.1  mrg {
    990  1.1  mrg   *r = *a;
    991  1.1  mrg 
    992  1.1  mrg   switch (r->cl)
    993  1.1  mrg     {
    994  1.1  mrg     case rvc_zero:
    995  1.1  mrg     case rvc_inf:
    996  1.1  mrg     case rvc_nan:
    997  1.1  mrg       /* Make resulting NaN value to be qNaN. The caller has the
    998  1.1  mrg          responsibility to avoid the operation if flag_signaling_nans
    999  1.1  mrg          is on.  */
   1000  1.1  mrg       r->signalling = 0;
   1001  1.1  mrg       break;
   1002  1.1  mrg 
   1003  1.1  mrg     case rvc_normal:
   1004  1.1  mrg       if (r->decimal)
   1005  1.1  mrg 	{
   1006  1.1  mrg 	  decimal_do_fix_trunc (r, a);
   1007  1.1  mrg 	  return;
   1008  1.1  mrg 	}
   1009  1.1  mrg       if (REAL_EXP (r) <= 0)
   1010  1.1  mrg 	get_zero (r, r->sign);
   1011  1.1  mrg       else if (REAL_EXP (r) < SIGNIFICAND_BITS)
   1012  1.1  mrg 	clear_significand_below (r, SIGNIFICAND_BITS - REAL_EXP (r));
   1013  1.1  mrg       break;
   1014  1.1  mrg 
   1015  1.1  mrg     default:
   1016  1.1  mrg       gcc_unreachable ();
   1017  1.1  mrg     }
   1018  1.1  mrg }
   1019  1.1  mrg 
   1020  1.1  mrg /* Perform the binary or unary operation described by CODE.
   1021  1.1  mrg    For a unary operation, leave OP1 NULL.  This function returns
   1022  1.1  mrg    true if the result may be inexact due to loss of precision.  */
   1023  1.1  mrg 
   1024  1.1  mrg bool
   1025  1.1  mrg real_arithmetic (REAL_VALUE_TYPE *r, int icode, const REAL_VALUE_TYPE *op0,
   1026  1.1  mrg 		 const REAL_VALUE_TYPE *op1)
   1027  1.1  mrg {
   1028  1.1  mrg   enum tree_code code = (enum tree_code) icode;
   1029  1.1  mrg 
   1030  1.1  mrg   if (op0->decimal || (op1 && op1->decimal))
   1031  1.1  mrg     return decimal_real_arithmetic (r, code, op0, op1);
   1032  1.1  mrg 
   1033  1.1  mrg   switch (code)
   1034  1.1  mrg     {
   1035  1.1  mrg     case PLUS_EXPR:
   1036  1.1  mrg       /* Clear any padding areas in *r if it isn't equal to one of the
   1037  1.1  mrg 	 operands so that we can later do bitwise comparisons later on.  */
   1038  1.1  mrg       if (r != op0 && r != op1)
   1039  1.1  mrg 	memset (r, '\0', sizeof (*r));
   1040  1.1  mrg       return do_add (r, op0, op1, 0);
   1041  1.1  mrg 
   1042  1.1  mrg     case MINUS_EXPR:
   1043  1.1  mrg       if (r != op0 && r != op1)
   1044  1.1  mrg 	memset (r, '\0', sizeof (*r));
   1045  1.1  mrg       return do_add (r, op0, op1, 1);
   1046  1.1  mrg 
   1047  1.1  mrg     case MULT_EXPR:
   1048  1.1  mrg       if (r != op0 && r != op1)
   1049  1.1  mrg 	memset (r, '\0', sizeof (*r));
   1050  1.1  mrg       return do_multiply (r, op0, op1);
   1051  1.1  mrg 
   1052  1.1  mrg     case RDIV_EXPR:
   1053  1.1  mrg       if (r != op0 && r != op1)
   1054  1.1  mrg 	memset (r, '\0', sizeof (*r));
   1055  1.1  mrg       return do_divide (r, op0, op1);
   1056  1.1  mrg 
   1057  1.1  mrg     case MIN_EXPR:
   1058  1.1  mrg       if (op1->cl == rvc_nan)
   1059  1.1  mrg       {
   1060  1.1  mrg 	*r = *op1;
   1061  1.1  mrg 	/* Make resulting NaN value to be qNaN. The caller has the
   1062  1.1  mrg 	   responsibility to avoid the operation if flag_signaling_nans
   1063  1.1  mrg            is on.  */
   1064  1.1  mrg 	r->signalling = 0;
   1065  1.1  mrg       }
   1066  1.1  mrg       else if (do_compare (op0, op1, -1) < 0)
   1067  1.1  mrg 	*r = *op0;
   1068  1.1  mrg       else
   1069  1.1  mrg 	*r = *op1;
   1070  1.1  mrg       break;
   1071  1.1  mrg 
   1072  1.1  mrg     case MAX_EXPR:
   1073  1.1  mrg       if (op1->cl == rvc_nan)
   1074  1.1  mrg       {
   1075  1.1  mrg 	*r = *op1;
   1076  1.1  mrg 	/* Make resulting NaN value to be qNaN. The caller has the
   1077  1.1  mrg 	   responsibility to avoid the operation if flag_signaling_nans
   1078  1.1  mrg            is on.  */
   1079  1.1  mrg 	r->signalling = 0;
   1080  1.1  mrg       }
   1081  1.1  mrg       else if (do_compare (op0, op1, 1) < 0)
   1082  1.1  mrg 	*r = *op1;
   1083  1.1  mrg       else
   1084  1.1  mrg 	*r = *op0;
   1085  1.1  mrg       break;
   1086  1.1  mrg 
   1087  1.1  mrg     case NEGATE_EXPR:
   1088  1.1  mrg       *r = *op0;
   1089  1.1  mrg       r->sign ^= 1;
   1090  1.1  mrg       break;
   1091  1.1  mrg 
   1092  1.1  mrg     case ABS_EXPR:
   1093  1.1  mrg       *r = *op0;
   1094  1.1  mrg       r->sign = 0;
   1095  1.1  mrg       break;
   1096  1.1  mrg 
   1097  1.1  mrg     case FIX_TRUNC_EXPR:
   1098  1.1  mrg       do_fix_trunc (r, op0);
   1099  1.1  mrg       break;
   1100  1.1  mrg 
   1101  1.1  mrg     default:
   1102  1.1  mrg       gcc_unreachable ();
   1103  1.1  mrg     }
   1104  1.1  mrg   return false;
   1105  1.1  mrg }
   1106  1.1  mrg 
   1107  1.1  mrg REAL_VALUE_TYPE
   1108  1.1  mrg real_value_negate (const REAL_VALUE_TYPE *op0)
   1109  1.1  mrg {
   1110  1.1  mrg   REAL_VALUE_TYPE r;
   1111  1.1  mrg   real_arithmetic (&r, NEGATE_EXPR, op0, NULL);
   1112  1.1  mrg   return r;
   1113  1.1  mrg }
   1114  1.1  mrg 
   1115  1.1  mrg REAL_VALUE_TYPE
   1116  1.1  mrg real_value_abs (const REAL_VALUE_TYPE *op0)
   1117  1.1  mrg {
   1118  1.1  mrg   REAL_VALUE_TYPE r;
   1119  1.1  mrg   real_arithmetic (&r, ABS_EXPR, op0, NULL);
   1120  1.1  mrg   return r;
   1121  1.1  mrg }
   1122  1.1  mrg 
   1123  1.1  mrg /* Return whether OP0 == OP1.  */
   1124  1.1  mrg 
   1125  1.1  mrg bool
   1126  1.1  mrg real_equal (const REAL_VALUE_TYPE *op0, const REAL_VALUE_TYPE *op1)
   1127  1.1  mrg {
   1128  1.1  mrg   return do_compare (op0, op1, -1) == 0;
   1129  1.1  mrg }
   1130  1.1  mrg 
   1131  1.1  mrg /* Return whether OP0 < OP1.  */
   1132  1.1  mrg 
   1133  1.1  mrg bool
   1134  1.1  mrg real_less (const REAL_VALUE_TYPE *op0, const REAL_VALUE_TYPE *op1)
   1135  1.1  mrg {
   1136  1.1  mrg   return do_compare (op0, op1, 1) < 0;
   1137  1.1  mrg }
   1138  1.1  mrg 
   1139  1.1  mrg bool
   1140  1.1  mrg real_compare (int icode, const REAL_VALUE_TYPE *op0,
   1141  1.1  mrg 	      const REAL_VALUE_TYPE *op1)
   1142  1.1  mrg {
   1143  1.1  mrg   enum tree_code code = (enum tree_code) icode;
   1144  1.1  mrg 
   1145  1.1  mrg   switch (code)
   1146  1.1  mrg     {
   1147  1.1  mrg     case LT_EXPR:
   1148  1.1  mrg       return real_less (op0, op1);
   1149  1.1  mrg     case LE_EXPR:
   1150  1.1  mrg       return do_compare (op0, op1, 1) <= 0;
   1151  1.1  mrg     case GT_EXPR:
   1152  1.1  mrg       return do_compare (op0, op1, -1) > 0;
   1153  1.1  mrg     case GE_EXPR:
   1154  1.1  mrg       return do_compare (op0, op1, -1) >= 0;
   1155  1.1  mrg     case EQ_EXPR:
   1156  1.1  mrg       return real_equal (op0, op1);
   1157  1.1  mrg     case NE_EXPR:
   1158  1.1  mrg       return do_compare (op0, op1, -1) != 0;
   1159  1.1  mrg     case UNORDERED_EXPR:
   1160  1.1  mrg       return op0->cl == rvc_nan || op1->cl == rvc_nan;
   1161  1.1  mrg     case ORDERED_EXPR:
   1162  1.1  mrg       return op0->cl != rvc_nan && op1->cl != rvc_nan;
   1163  1.1  mrg     case UNLT_EXPR:
   1164  1.1  mrg       return do_compare (op0, op1, -1) < 0;
   1165  1.1  mrg     case UNLE_EXPR:
   1166  1.1  mrg       return do_compare (op0, op1, -1) <= 0;
   1167  1.1  mrg     case UNGT_EXPR:
   1168  1.1  mrg       return do_compare (op0, op1, 1) > 0;
   1169  1.1  mrg     case UNGE_EXPR:
   1170  1.1  mrg       return do_compare (op0, op1, 1) >= 0;
   1171  1.1  mrg     case UNEQ_EXPR:
   1172  1.1  mrg       return do_compare (op0, op1, 0) == 0;
   1173  1.1  mrg     case LTGT_EXPR:
   1174  1.1  mrg       return do_compare (op0, op1, 0) != 0;
   1175  1.1  mrg 
   1176  1.1  mrg     default:
   1177  1.1  mrg       gcc_unreachable ();
   1178  1.1  mrg     }
   1179  1.1  mrg }
   1180  1.1  mrg 
   1181  1.1  mrg /* Return floor log2(R).  */
   1182  1.1  mrg 
   1183  1.1  mrg int
   1184  1.1  mrg real_exponent (const REAL_VALUE_TYPE *r)
   1185  1.1  mrg {
   1186  1.1  mrg   switch (r->cl)
   1187  1.1  mrg     {
   1188  1.1  mrg     case rvc_zero:
   1189  1.1  mrg       return 0;
   1190  1.1  mrg     case rvc_inf:
   1191  1.1  mrg     case rvc_nan:
   1192  1.1  mrg       return (unsigned int)-1 >> 1;
   1193  1.1  mrg     case rvc_normal:
   1194  1.1  mrg       return REAL_EXP (r);
   1195  1.1  mrg     default:
   1196  1.1  mrg       gcc_unreachable ();
   1197  1.1  mrg     }
   1198  1.1  mrg }
   1199  1.1  mrg 
   1200  1.1  mrg /* R = OP0 * 2**EXP.  */
   1201  1.1  mrg 
   1202  1.1  mrg void
   1203  1.1  mrg real_ldexp (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0, int exp)
   1204  1.1  mrg {
   1205  1.1  mrg   *r = *op0;
   1206  1.1  mrg   switch (r->cl)
   1207  1.1  mrg     {
   1208  1.1  mrg     case rvc_zero:
   1209  1.1  mrg     case rvc_inf:
   1210  1.1  mrg     case rvc_nan:
   1211  1.1  mrg       /* Make resulting NaN value to be qNaN. The caller has the
   1212  1.1  mrg          responsibility to avoid the operation if flag_signaling_nans
   1213  1.1  mrg          is on.  */
   1214  1.1  mrg       r->signalling = 0;
   1215  1.1  mrg       break;
   1216  1.1  mrg 
   1217  1.1  mrg     case rvc_normal:
   1218  1.1  mrg       exp += REAL_EXP (op0);
   1219  1.1  mrg       if (exp > MAX_EXP)
   1220  1.1  mrg 	get_inf (r, r->sign);
   1221  1.1  mrg       else if (exp < -MAX_EXP)
   1222  1.1  mrg 	get_zero (r, r->sign);
   1223  1.1  mrg       else
   1224  1.1  mrg 	SET_REAL_EXP (r, exp);
   1225  1.1  mrg       break;
   1226  1.1  mrg 
   1227  1.1  mrg     default:
   1228  1.1  mrg       gcc_unreachable ();
   1229  1.1  mrg     }
   1230  1.1  mrg }
   1231  1.1  mrg 
   1232  1.1  mrg /* Determine whether a floating-point value X is infinite.  */
   1233  1.1  mrg 
   1234  1.1  mrg bool
   1235  1.1  mrg real_isinf (const REAL_VALUE_TYPE *r)
   1236  1.1  mrg {
   1237  1.1  mrg   return (r->cl == rvc_inf);
   1238  1.1  mrg }
   1239  1.1  mrg 
   1240  1.1  mrg /* Determine whether a floating-point value X is a NaN.  */
   1241  1.1  mrg 
   1242  1.1  mrg bool
   1243  1.1  mrg real_isnan (const REAL_VALUE_TYPE *r)
   1244  1.1  mrg {
   1245  1.1  mrg   return (r->cl == rvc_nan);
   1246  1.1  mrg }
   1247  1.1  mrg 
   1248  1.1  mrg /* Determine whether a floating-point value X is a signaling NaN.  */
   1249  1.1  mrg bool real_issignaling_nan (const REAL_VALUE_TYPE *r)
   1250  1.1  mrg {
   1251  1.1  mrg   return real_isnan (r) && r->signalling;
   1252  1.1  mrg }
   1253  1.1  mrg 
   1254  1.1  mrg /* Determine whether a floating-point value X is finite.  */
   1255  1.1  mrg 
   1256  1.1  mrg bool
   1257  1.1  mrg real_isfinite (const REAL_VALUE_TYPE *r)
   1258  1.1  mrg {
   1259  1.1  mrg   return (r->cl != rvc_nan) && (r->cl != rvc_inf);
   1260  1.1  mrg }
   1261  1.1  mrg 
   1262  1.1  mrg /* Determine whether a floating-point value X is negative.  */
   1263  1.1  mrg 
   1264  1.1  mrg bool
   1265  1.1  mrg real_isneg (const REAL_VALUE_TYPE *r)
   1266  1.1  mrg {
   1267  1.1  mrg   return r->sign;
   1268  1.1  mrg }
   1269  1.1  mrg 
   1270  1.1  mrg /* Determine whether a floating-point value X is minus zero.  */
   1271  1.1  mrg 
   1272  1.1  mrg bool
   1273  1.1  mrg real_isnegzero (const REAL_VALUE_TYPE *r)
   1274  1.1  mrg {
   1275  1.1  mrg   return r->sign && r->cl == rvc_zero;
   1276  1.1  mrg }
   1277  1.1  mrg 
   1278  1.1  mrg /* Compare two floating-point objects for bitwise identity.  */
   1279  1.1  mrg 
   1280  1.1  mrg bool
   1281  1.1  mrg real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
   1282  1.1  mrg {
   1283  1.1  mrg   int i;
   1284  1.1  mrg 
   1285  1.1  mrg   if (a->cl != b->cl)
   1286  1.1  mrg     return false;
   1287  1.1  mrg   if (a->sign != b->sign)
   1288  1.1  mrg     return false;
   1289  1.1  mrg 
   1290  1.1  mrg   switch (a->cl)
   1291  1.1  mrg     {
   1292  1.1  mrg     case rvc_zero:
   1293  1.1  mrg     case rvc_inf:
   1294  1.1  mrg       return true;
   1295  1.1  mrg 
   1296  1.1  mrg     case rvc_normal:
   1297  1.1  mrg       if (a->decimal != b->decimal)
   1298  1.1  mrg         return false;
   1299  1.1  mrg       if (REAL_EXP (a) != REAL_EXP (b))
   1300  1.1  mrg 	return false;
   1301  1.1  mrg       break;
   1302  1.1  mrg 
   1303  1.1  mrg     case rvc_nan:
   1304  1.1  mrg       if (a->signalling != b->signalling)
   1305  1.1  mrg 	return false;
   1306  1.1  mrg       /* The significand is ignored for canonical NaNs.  */
   1307  1.1  mrg       if (a->canonical || b->canonical)
   1308  1.1  mrg 	return a->canonical == b->canonical;
   1309  1.1  mrg       break;
   1310  1.1  mrg 
   1311  1.1  mrg     default:
   1312  1.1  mrg       gcc_unreachable ();
   1313  1.1  mrg     }
   1314  1.1  mrg 
   1315  1.1  mrg   for (i = 0; i < SIGSZ; ++i)
   1316  1.1  mrg     if (a->sig[i] != b->sig[i])
   1317  1.1  mrg       return false;
   1318  1.1  mrg 
   1319  1.1  mrg   return true;
   1320  1.1  mrg }
   1321  1.1  mrg 
   1322  1.1  mrg /* Try to change R into its exact multiplicative inverse in format FMT.
   1323  1.1  mrg    Return true if successful.  */
   1324  1.1  mrg 
   1325  1.1  mrg bool
   1326  1.1  mrg exact_real_inverse (format_helper fmt, REAL_VALUE_TYPE *r)
   1327  1.1  mrg {
   1328  1.1  mrg   const REAL_VALUE_TYPE *one = real_digit (1);
   1329  1.1  mrg   REAL_VALUE_TYPE u;
   1330  1.1  mrg   int i;
   1331  1.1  mrg 
   1332  1.1  mrg   if (r->cl != rvc_normal)
   1333  1.1  mrg     return false;
   1334  1.1  mrg 
   1335  1.1  mrg   /* Check for a power of two: all significand bits zero except the MSB.  */
   1336  1.1  mrg   for (i = 0; i < SIGSZ-1; ++i)
   1337  1.1  mrg     if (r->sig[i] != 0)
   1338  1.1  mrg       return false;
   1339  1.1  mrg   if (r->sig[SIGSZ-1] != SIG_MSB)
   1340  1.1  mrg     return false;
   1341  1.1  mrg 
   1342  1.1  mrg   /* Find the inverse and truncate to the required format.  */
   1343  1.1  mrg   do_divide (&u, one, r);
   1344  1.1  mrg   real_convert (&u, fmt, &u);
   1345  1.1  mrg 
   1346  1.1  mrg   /* The rounding may have overflowed.  */
   1347  1.1  mrg   if (u.cl != rvc_normal)
   1348  1.1  mrg     return false;
   1349  1.1  mrg   for (i = 0; i < SIGSZ-1; ++i)
   1350  1.1  mrg     if (u.sig[i] != 0)
   1351  1.1  mrg       return false;
   1352  1.1  mrg   if (u.sig[SIGSZ-1] != SIG_MSB)
   1353  1.1  mrg     return false;
   1354  1.1  mrg 
   1355  1.1  mrg   *r = u;
   1356  1.1  mrg   return true;
   1357  1.1  mrg }
   1358  1.1  mrg 
   1359  1.1  mrg /* Return true if arithmetic on values in IMODE that were promoted
   1360  1.1  mrg    from values in TMODE is equivalent to direct arithmetic on values
   1361  1.1  mrg    in TMODE.  */
   1362  1.1  mrg 
   1363  1.1  mrg bool
   1364  1.1  mrg real_can_shorten_arithmetic (machine_mode imode, machine_mode tmode)
   1365  1.1  mrg {
   1366  1.1  mrg   const struct real_format *tfmt, *ifmt;
   1367  1.1  mrg   tfmt = REAL_MODE_FORMAT (tmode);
   1368  1.1  mrg   ifmt = REAL_MODE_FORMAT (imode);
   1369  1.1  mrg   /* These conditions are conservative rather than trying to catch the
   1370  1.1  mrg      exact boundary conditions; the main case to allow is IEEE float
   1371  1.1  mrg      and double.  */
   1372  1.1  mrg   return (ifmt->b == tfmt->b
   1373  1.1  mrg 	  && ifmt->p > 2 * tfmt->p
   1374  1.1  mrg 	  && ifmt->emin < 2 * tfmt->emin - tfmt->p - 2
   1375  1.1  mrg 	  && ifmt->emin < tfmt->emin - tfmt->emax - tfmt->p - 2
   1376  1.1  mrg 	  && ifmt->emax > 2 * tfmt->emax + 2
   1377  1.1  mrg 	  && ifmt->emax > tfmt->emax - tfmt->emin + tfmt->p + 2
   1378  1.1  mrg 	  && ifmt->round_towards_zero == tfmt->round_towards_zero
   1379  1.1  mrg 	  && (ifmt->has_sign_dependent_rounding
   1380  1.1  mrg 	      == tfmt->has_sign_dependent_rounding)
   1381  1.1  mrg 	  && ifmt->has_nans >= tfmt->has_nans
   1382  1.1  mrg 	  && ifmt->has_inf >= tfmt->has_inf
   1383  1.1  mrg 	  && ifmt->has_signed_zero >= tfmt->has_signed_zero
   1384  1.1  mrg 	  && !MODE_COMPOSITE_P (tmode)
   1385  1.1  mrg 	  && !MODE_COMPOSITE_P (imode));
   1386  1.1  mrg }
   1387  1.1  mrg 
   1388  1.1  mrg /* Render R as an integer.  */
   1390  1.1  mrg 
   1391  1.1  mrg HOST_WIDE_INT
   1392  1.1  mrg real_to_integer (const REAL_VALUE_TYPE *r)
   1393  1.1  mrg {
   1394  1.1  mrg   unsigned HOST_WIDE_INT i;
   1395  1.1  mrg 
   1396  1.1  mrg   switch (r->cl)
   1397  1.1  mrg     {
   1398  1.1  mrg     case rvc_zero:
   1399  1.1  mrg     underflow:
   1400  1.1  mrg       return 0;
   1401  1.1  mrg 
   1402  1.1  mrg     case rvc_inf:
   1403  1.1  mrg     case rvc_nan:
   1404  1.1  mrg     overflow:
   1405  1.1  mrg       i = HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1);
   1406  1.1  mrg       if (!r->sign)
   1407  1.1  mrg 	i--;
   1408  1.1  mrg       return i;
   1409  1.1  mrg 
   1410  1.1  mrg     case rvc_normal:
   1411  1.1  mrg       if (r->decimal)
   1412  1.1  mrg 	return decimal_real_to_integer (r);
   1413  1.1  mrg 
   1414  1.1  mrg       if (REAL_EXP (r) <= 0)
   1415  1.1  mrg 	goto underflow;
   1416  1.1  mrg       /* Only force overflow for unsigned overflow.  Signed overflow is
   1417  1.1  mrg 	 undefined, so it doesn't matter what we return, and some callers
   1418  1.1  mrg 	 expect to be able to use this routine for both signed and
   1419  1.1  mrg 	 unsigned conversions.  */
   1420  1.1  mrg       if (REAL_EXP (r) > HOST_BITS_PER_WIDE_INT)
   1421  1.1  mrg 	goto overflow;
   1422  1.1  mrg 
   1423  1.1  mrg       if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
   1424  1.1  mrg 	i = r->sig[SIGSZ-1];
   1425  1.1  mrg       else
   1426  1.1  mrg 	{
   1427  1.1  mrg 	  gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
   1428  1.1  mrg 	  i = r->sig[SIGSZ-1];
   1429  1.1  mrg 	  i = i << (HOST_BITS_PER_LONG - 1) << 1;
   1430  1.1  mrg 	  i |= r->sig[SIGSZ-2];
   1431  1.1  mrg 	}
   1432  1.1  mrg 
   1433  1.1  mrg       i >>= HOST_BITS_PER_WIDE_INT - REAL_EXP (r);
   1434  1.1  mrg 
   1435  1.1  mrg       if (r->sign)
   1436  1.1  mrg 	i = -i;
   1437  1.1  mrg       return i;
   1438  1.1  mrg 
   1439  1.1  mrg     default:
   1440  1.1  mrg       gcc_unreachable ();
   1441  1.1  mrg     }
   1442  1.1  mrg }
   1443  1.1  mrg 
   1444  1.1  mrg /* Likewise, but producing a wide-int of PRECISION.  If the value cannot
   1445  1.1  mrg    be represented in precision, *FAIL is set to TRUE.  */
   1446  1.1  mrg 
   1447  1.1  mrg wide_int
   1448  1.1  mrg real_to_integer (const REAL_VALUE_TYPE *r, bool *fail, int precision)
   1449  1.1  mrg {
   1450  1.1  mrg   HOST_WIDE_INT val[2 * WIDE_INT_MAX_ELTS];
   1451  1.1  mrg   int exp;
   1452  1.1  mrg   int words, w;
   1453  1.1  mrg   wide_int result;
   1454  1.1  mrg 
   1455  1.1  mrg   switch (r->cl)
   1456  1.1  mrg     {
   1457  1.1  mrg     case rvc_zero:
   1458  1.1  mrg     underflow:
   1459  1.1  mrg       return wi::zero (precision);
   1460  1.1  mrg 
   1461  1.1  mrg     case rvc_inf:
   1462  1.1  mrg     case rvc_nan:
   1463  1.1  mrg     overflow:
   1464  1.1  mrg       *fail = true;
   1465  1.1  mrg 
   1466  1.1  mrg       if (r->sign)
   1467  1.1  mrg 	return wi::set_bit_in_zero (precision - 1, precision);
   1468  1.1  mrg       else
   1469  1.1  mrg 	return ~wi::set_bit_in_zero (precision - 1, precision);
   1470  1.1  mrg 
   1471  1.1  mrg     case rvc_normal:
   1472  1.1  mrg       if (r->decimal)
   1473  1.1  mrg 	return decimal_real_to_integer (r, fail, precision);
   1474  1.1  mrg 
   1475  1.1  mrg       exp = REAL_EXP (r);
   1476  1.1  mrg       if (exp <= 0)
   1477  1.1  mrg 	goto underflow;
   1478  1.1  mrg       /* Only force overflow for unsigned overflow.  Signed overflow is
   1479  1.1  mrg 	 undefined, so it doesn't matter what we return, and some callers
   1480  1.1  mrg 	 expect to be able to use this routine for both signed and
   1481  1.1  mrg 	 unsigned conversions.  */
   1482  1.1  mrg       if (exp > precision)
   1483  1.1  mrg 	goto overflow;
   1484  1.1  mrg 
   1485  1.1  mrg       /* Put the significand into a wide_int that has precision W, which
   1486  1.1  mrg 	 is the smallest HWI-multiple that has at least PRECISION bits.
   1487  1.1  mrg 	 This ensures that the top bit of the significand is in the
   1488  1.1  mrg 	 top bit of the wide_int.  */
   1489  1.1  mrg       words = (precision + HOST_BITS_PER_WIDE_INT - 1) / HOST_BITS_PER_WIDE_INT;
   1490  1.1  mrg       w = words * HOST_BITS_PER_WIDE_INT;
   1491  1.1  mrg 
   1492  1.1  mrg #if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
   1493  1.1  mrg       for (int i = 0; i < words; i++)
   1494  1.1  mrg 	{
   1495  1.1  mrg 	  int j = SIGSZ - words + i;
   1496  1.1  mrg 	  val[i] = (j < 0) ? 0 : r->sig[j];
   1497  1.1  mrg 	}
   1498  1.1  mrg #else
   1499  1.1  mrg       gcc_assert (HOST_BITS_PER_WIDE_INT == 2 * HOST_BITS_PER_LONG);
   1500  1.1  mrg       for (int i = 0; i < words; i++)
   1501  1.1  mrg 	{
   1502  1.1  mrg 	  int j = SIGSZ - (words * 2) + (i * 2);
   1503  1.1  mrg 	  if (j < 0)
   1504  1.1  mrg 	    val[i] = 0;
   1505  1.1  mrg 	  else
   1506  1.1  mrg 	    val[i] = r->sig[j];
   1507  1.1  mrg 	  j += 1;
   1508  1.1  mrg 	  if (j >= 0)
   1509  1.1  mrg 	    val[i] |= (unsigned HOST_WIDE_INT) r->sig[j] << HOST_BITS_PER_LONG;
   1510  1.1  mrg 	}
   1511  1.1  mrg #endif
   1512  1.1  mrg       /* Shift the value into place and truncate to the desired precision.  */
   1513  1.1  mrg       result = wide_int::from_array (val, words, w);
   1514  1.1  mrg       result = wi::lrshift (result, w - exp);
   1515  1.1  mrg       result = wide_int::from (result, precision, UNSIGNED);
   1516  1.1  mrg 
   1517  1.1  mrg       if (r->sign)
   1518  1.1  mrg 	return -result;
   1519  1.1  mrg       else
   1520  1.1  mrg 	return result;
   1521  1.1  mrg 
   1522  1.1  mrg     default:
   1523  1.1  mrg       gcc_unreachable ();
   1524  1.1  mrg     }
   1525  1.1  mrg }
   1526  1.1  mrg 
   1527  1.1  mrg /* A subroutine of real_to_decimal.  Compute the quotient and remainder
   1528  1.1  mrg    of NUM / DEN.  Return the quotient and place the remainder in NUM.
   1529  1.1  mrg    It is expected that NUM / DEN are close enough that the quotient is
   1530  1.1  mrg    small.  */
   1531  1.1  mrg 
   1532  1.1  mrg static unsigned long
   1533  1.1  mrg rtd_divmod (REAL_VALUE_TYPE *num, REAL_VALUE_TYPE *den)
   1534  1.1  mrg {
   1535  1.1  mrg   unsigned long q, msb;
   1536  1.1  mrg   int expn = REAL_EXP (num), expd = REAL_EXP (den);
   1537  1.1  mrg 
   1538  1.1  mrg   if (expn < expd)
   1539  1.1  mrg     return 0;
   1540  1.1  mrg 
   1541  1.1  mrg   q = msb = 0;
   1542  1.1  mrg   goto start;
   1543  1.1  mrg   do
   1544  1.1  mrg     {
   1545  1.1  mrg       msb = num->sig[SIGSZ-1] & SIG_MSB;
   1546  1.1  mrg       q <<= 1;
   1547  1.1  mrg       lshift_significand_1 (num, num);
   1548  1.1  mrg     start:
   1549  1.1  mrg       if (msb || cmp_significands (num, den) >= 0)
   1550  1.1  mrg 	{
   1551  1.1  mrg 	  sub_significands (num, num, den, 0);
   1552  1.1  mrg 	  q |= 1;
   1553  1.1  mrg 	}
   1554  1.1  mrg     }
   1555  1.1  mrg   while (--expn >= expd);
   1556  1.1  mrg 
   1557  1.1  mrg   SET_REAL_EXP (num, expd);
   1558  1.1  mrg   normalize (num);
   1559  1.1  mrg 
   1560  1.1  mrg   return q;
   1561  1.1  mrg }
   1562  1.1  mrg 
   1563  1.1  mrg /* Render R as a decimal floating point constant.  Emit DIGITS significant
   1564  1.1  mrg    digits in the result, bounded by BUF_SIZE.  If DIGITS is 0, choose the
   1565  1.1  mrg    maximum for the representation.  If CROP_TRAILING_ZEROS, strip trailing
   1566  1.1  mrg    zeros.  If MODE is VOIDmode, round to nearest value.  Otherwise, round
   1567  1.1  mrg    to a string that, when parsed back in mode MODE, yields the same value.  */
   1568  1.1  mrg 
   1569  1.1  mrg #define M_LOG10_2	0.30102999566398119521
   1570  1.1  mrg 
   1571  1.1  mrg void
   1572  1.1  mrg real_to_decimal_for_mode (char *str, const REAL_VALUE_TYPE *r_orig,
   1573  1.1  mrg 			  size_t buf_size, size_t digits,
   1574  1.1  mrg 			  int crop_trailing_zeros, machine_mode mode)
   1575  1.1  mrg {
   1576  1.1  mrg   const struct real_format *fmt = NULL;
   1577  1.1  mrg   const REAL_VALUE_TYPE *one, *ten;
   1578  1.1  mrg   REAL_VALUE_TYPE r, pten, u, v;
   1579  1.1  mrg   int dec_exp, cmp_one, digit;
   1580  1.1  mrg   size_t max_digits;
   1581  1.1  mrg   char *p, *first, *last;
   1582  1.1  mrg   bool sign;
   1583  1.1  mrg   bool round_up;
   1584  1.1  mrg 
   1585  1.1  mrg   if (mode != VOIDmode)
   1586  1.1  mrg    {
   1587  1.1  mrg      fmt = REAL_MODE_FORMAT (mode);
   1588  1.1  mrg      gcc_assert (fmt);
   1589  1.1  mrg    }
   1590  1.1  mrg 
   1591  1.1  mrg   r = *r_orig;
   1592  1.1  mrg   switch (r.cl)
   1593  1.1  mrg     {
   1594  1.1  mrg     case rvc_zero:
   1595  1.1  mrg       strcpy (str, (r.sign ? "-0.0" : "0.0"));
   1596  1.1  mrg       return;
   1597  1.1  mrg     case rvc_normal:
   1598  1.1  mrg       break;
   1599  1.1  mrg     case rvc_inf:
   1600  1.1  mrg       strcpy (str, (r.sign ? "-Inf" : "+Inf"));
   1601  1.1  mrg       return;
   1602  1.1  mrg     case rvc_nan:
   1603  1.1  mrg       /* ??? Print the significand as well, if not canonical?  */
   1604  1.1  mrg       sprintf (str, "%c%cNaN", (r_orig->sign ? '-' : '+'),
   1605  1.1  mrg 	       (r_orig->signalling ? 'S' : 'Q'));
   1606  1.1  mrg       return;
   1607  1.1  mrg     default:
   1608  1.1  mrg       gcc_unreachable ();
   1609  1.1  mrg     }
   1610  1.1  mrg 
   1611  1.1  mrg   if (r.decimal)
   1612  1.1  mrg     {
   1613  1.1  mrg       decimal_real_to_decimal (str, &r, buf_size, digits, crop_trailing_zeros);
   1614  1.1  mrg       return;
   1615  1.1  mrg     }
   1616  1.1  mrg 
   1617  1.1  mrg   /* Bound the number of digits printed by the size of the representation.  */
   1618  1.1  mrg   max_digits = SIGNIFICAND_BITS * M_LOG10_2;
   1619  1.1  mrg   if (digits == 0 || digits > max_digits)
   1620  1.1  mrg     digits = max_digits;
   1621  1.1  mrg 
   1622  1.1  mrg   /* Estimate the decimal exponent, and compute the length of the string it
   1623  1.1  mrg      will print as.  Be conservative and add one to account for possible
   1624  1.1  mrg      overflow or rounding error.  */
   1625  1.1  mrg   dec_exp = REAL_EXP (&r) * M_LOG10_2;
   1626  1.1  mrg   for (max_digits = 1; dec_exp ; max_digits++)
   1627  1.1  mrg     dec_exp /= 10;
   1628  1.1  mrg 
   1629  1.1  mrg   /* Bound the number of digits printed by the size of the output buffer.  */
   1630  1.1  mrg   max_digits = buf_size - 1 - 1 - 2 - max_digits - 1;
   1631  1.1  mrg   gcc_assert (max_digits <= buf_size);
   1632  1.1  mrg   if (digits > max_digits)
   1633  1.1  mrg     digits = max_digits;
   1634  1.1  mrg 
   1635  1.1  mrg   one = real_digit (1);
   1636  1.1  mrg   ten = ten_to_ptwo (0);
   1637  1.1  mrg 
   1638  1.1  mrg   sign = r.sign;
   1639  1.1  mrg   r.sign = 0;
   1640  1.1  mrg 
   1641  1.1  mrg   dec_exp = 0;
   1642  1.1  mrg   pten = *one;
   1643  1.1  mrg 
   1644  1.1  mrg   cmp_one = do_compare (&r, one, 0);
   1645  1.1  mrg   if (cmp_one > 0)
   1646  1.1  mrg     {
   1647  1.1  mrg       int m;
   1648  1.1  mrg 
   1649  1.1  mrg       /* Number is greater than one.  Convert significand to an integer
   1650  1.1  mrg 	 and strip trailing decimal zeros.  */
   1651  1.1  mrg 
   1652  1.1  mrg       u = r;
   1653  1.1  mrg       SET_REAL_EXP (&u, SIGNIFICAND_BITS - 1);
   1654  1.1  mrg 
   1655  1.1  mrg       /* Largest M, such that 10**2**M fits within SIGNIFICAND_BITS.  */
   1656  1.1  mrg       m = floor_log2 (max_digits);
   1657  1.1  mrg 
   1658  1.1  mrg       /* Iterate over the bits of the possible powers of 10 that might
   1659  1.1  mrg 	 be present in U and eliminate them.  That is, if we find that
   1660  1.1  mrg 	 10**2**M divides U evenly, keep the division and increase
   1661  1.1  mrg 	 DEC_EXP by 2**M.  */
   1662  1.1  mrg       do
   1663  1.1  mrg 	{
   1664  1.1  mrg 	  REAL_VALUE_TYPE t;
   1665  1.1  mrg 
   1666  1.1  mrg 	  do_divide (&t, &u, ten_to_ptwo (m));
   1667  1.1  mrg 	  do_fix_trunc (&v, &t);
   1668  1.1  mrg 	  if (cmp_significands (&v, &t) == 0)
   1669  1.1  mrg 	    {
   1670  1.1  mrg 	      u = t;
   1671  1.1  mrg 	      dec_exp += 1 << m;
   1672  1.1  mrg 	    }
   1673  1.1  mrg 	}
   1674  1.1  mrg       while (--m >= 0);
   1675  1.1  mrg 
   1676  1.1  mrg       /* Revert the scaling to integer that we performed earlier.  */
   1677  1.1  mrg       SET_REAL_EXP (&u, REAL_EXP (&u) + REAL_EXP (&r)
   1678  1.1  mrg 		    - (SIGNIFICAND_BITS - 1));
   1679  1.1  mrg       r = u;
   1680  1.1  mrg 
   1681  1.1  mrg       /* Find power of 10.  Do this by dividing out 10**2**M when
   1682  1.1  mrg 	 this is larger than the current remainder.  Fill PTEN with
   1683  1.1  mrg 	 the power of 10 that we compute.  */
   1684  1.1  mrg       if (REAL_EXP (&r) > 0)
   1685  1.1  mrg 	{
   1686  1.1  mrg 	  m = floor_log2 ((int)(REAL_EXP (&r) * M_LOG10_2)) + 1;
   1687  1.1  mrg 	  do
   1688  1.1  mrg 	    {
   1689  1.1  mrg 	      const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
   1690  1.1  mrg 	      if (do_compare (&u, ptentwo, 0) >= 0)
   1691  1.1  mrg 	        {
   1692  1.1  mrg 	          do_divide (&u, &u, ptentwo);
   1693  1.1  mrg 	          do_multiply (&pten, &pten, ptentwo);
   1694  1.1  mrg 	          dec_exp += 1 << m;
   1695  1.1  mrg 	        }
   1696  1.1  mrg 	    }
   1697  1.1  mrg           while (--m >= 0);
   1698  1.1  mrg 	}
   1699  1.1  mrg       else
   1700  1.1  mrg 	/* We managed to divide off enough tens in the above reduction
   1701  1.1  mrg 	   loop that we've now got a negative exponent.  Fall into the
   1702  1.1  mrg 	   less-than-one code to compute the proper value for PTEN.  */
   1703  1.1  mrg 	cmp_one = -1;
   1704  1.1  mrg     }
   1705  1.1  mrg   if (cmp_one < 0)
   1706  1.1  mrg     {
   1707  1.1  mrg       int m;
   1708  1.1  mrg 
   1709  1.1  mrg       /* Number is less than one.  Pad significand with leading
   1710  1.1  mrg 	 decimal zeros.  */
   1711  1.1  mrg 
   1712  1.1  mrg       v = r;
   1713  1.1  mrg       while (1)
   1714  1.1  mrg 	{
   1715  1.1  mrg 	  /* Stop if we'd shift bits off the bottom.  */
   1716  1.1  mrg 	  if (v.sig[0] & 7)
   1717  1.1  mrg 	    break;
   1718  1.1  mrg 
   1719  1.1  mrg 	  do_multiply (&u, &v, ten);
   1720  1.1  mrg 
   1721  1.1  mrg 	  /* Stop if we're now >= 1 or zero.  */
   1722  1.1  mrg 	  if (REAL_EXP (&u) > 0 || u.cl == rvc_zero)
   1723  1.1  mrg 	    break;
   1724  1.1  mrg 
   1725  1.1  mrg 	  v = u;
   1726  1.1  mrg 	  dec_exp -= 1;
   1727  1.1  mrg 	}
   1728  1.1  mrg       r = v;
   1729  1.1  mrg 
   1730  1.1  mrg       /* Find power of 10.  Do this by multiplying in P=10**2**M when
   1731  1.1  mrg 	 the current remainder is smaller than 1/P.  Fill PTEN with the
   1732  1.1  mrg 	 power of 10 that we compute.  */
   1733  1.1  mrg       m = floor_log2 ((int)(-REAL_EXP (&r) * M_LOG10_2)) + 1;
   1734  1.1  mrg       do
   1735  1.1  mrg 	{
   1736  1.1  mrg 	  const REAL_VALUE_TYPE *ptentwo = ten_to_ptwo (m);
   1737  1.1  mrg 	  const REAL_VALUE_TYPE *ptenmtwo = ten_to_mptwo (m);
   1738  1.1  mrg 
   1739  1.1  mrg 	  if (do_compare (&v, ptenmtwo, 0) <= 0)
   1740  1.1  mrg 	    {
   1741  1.1  mrg 	      do_multiply (&v, &v, ptentwo);
   1742  1.1  mrg 	      do_multiply (&pten, &pten, ptentwo);
   1743  1.1  mrg 	      dec_exp -= 1 << m;
   1744  1.1  mrg 	    }
   1745  1.1  mrg 	}
   1746  1.1  mrg       while (--m >= 0);
   1747  1.1  mrg 
   1748  1.1  mrg       /* Invert the positive power of 10 that we've collected so far.  */
   1749  1.1  mrg       do_divide (&pten, one, &pten);
   1750  1.1  mrg     }
   1751  1.1  mrg 
   1752  1.1  mrg   p = str;
   1753  1.1  mrg   if (sign)
   1754  1.1  mrg     *p++ = '-';
   1755  1.1  mrg   first = p++;
   1756  1.1  mrg 
   1757  1.1  mrg   /* At this point, PTEN should contain the nearest power of 10 smaller
   1758  1.1  mrg      than R, such that this division produces the first digit.
   1759  1.1  mrg 
   1760  1.1  mrg      Using a divide-step primitive that returns the complete integral
   1761  1.1  mrg      remainder avoids the rounding error that would be produced if
   1762  1.1  mrg      we were to use do_divide here and then simply multiply by 10 for
   1763  1.1  mrg      each subsequent digit.  */
   1764  1.1  mrg 
   1765  1.1  mrg   digit = rtd_divmod (&r, &pten);
   1766  1.1  mrg 
   1767  1.1  mrg   /* Be prepared for error in that division via underflow ...  */
   1768  1.1  mrg   if (digit == 0 && cmp_significand_0 (&r))
   1769  1.1  mrg     {
   1770  1.1  mrg       /* Multiply by 10 and try again.  */
   1771  1.1  mrg       do_multiply (&r, &r, ten);
   1772  1.1  mrg       digit = rtd_divmod (&r, &pten);
   1773  1.1  mrg       dec_exp -= 1;
   1774  1.1  mrg       gcc_assert (digit != 0);
   1775  1.1  mrg     }
   1776  1.1  mrg 
   1777  1.1  mrg   /* ... or overflow.  */
   1778  1.1  mrg   if (digit == 10)
   1779  1.1  mrg     {
   1780  1.1  mrg       *p++ = '1';
   1781  1.1  mrg       if (--digits > 0)
   1782  1.1  mrg 	*p++ = '0';
   1783  1.1  mrg       dec_exp += 1;
   1784  1.1  mrg     }
   1785  1.1  mrg   else
   1786  1.1  mrg     {
   1787  1.1  mrg       gcc_assert (digit <= 10);
   1788  1.1  mrg       *p++ = digit + '0';
   1789  1.1  mrg     }
   1790  1.1  mrg 
   1791  1.1  mrg   /* Generate subsequent digits.  */
   1792  1.1  mrg   while (--digits > 0)
   1793  1.1  mrg     {
   1794  1.1  mrg       do_multiply (&r, &r, ten);
   1795  1.1  mrg       digit = rtd_divmod (&r, &pten);
   1796  1.1  mrg       *p++ = digit + '0';
   1797  1.1  mrg     }
   1798  1.1  mrg   last = p;
   1799  1.1  mrg 
   1800  1.1  mrg   /* Generate one more digit with which to do rounding.  */
   1801  1.1  mrg   do_multiply (&r, &r, ten);
   1802  1.1  mrg   digit = rtd_divmod (&r, &pten);
   1803  1.1  mrg 
   1804  1.1  mrg   /* Round the result.  */
   1805  1.1  mrg   if (fmt && fmt->round_towards_zero)
   1806  1.1  mrg     {
   1807  1.1  mrg       /* If the format uses round towards zero when parsing the string
   1808  1.1  mrg 	 back in, we need to always round away from zero here.  */
   1809  1.1  mrg       if (cmp_significand_0 (&r))
   1810  1.1  mrg 	digit++;
   1811  1.1  mrg       round_up = digit > 0;
   1812  1.1  mrg     }
   1813  1.1  mrg   else
   1814  1.1  mrg     {
   1815  1.1  mrg       if (digit == 5)
   1816  1.1  mrg 	{
   1817  1.1  mrg 	  /* Round to nearest.  If R is nonzero there are additional
   1818  1.1  mrg 	     nonzero digits to be extracted.  */
   1819  1.1  mrg 	  if (cmp_significand_0 (&r))
   1820  1.1  mrg 	    digit++;
   1821  1.1  mrg 	  /* Round to even.  */
   1822  1.1  mrg 	  else if ((p[-1] - '0') & 1)
   1823  1.1  mrg 	    digit++;
   1824  1.1  mrg 	}
   1825  1.1  mrg 
   1826  1.1  mrg       round_up = digit > 5;
   1827  1.1  mrg     }
   1828  1.1  mrg 
   1829  1.1  mrg   if (round_up)
   1830  1.1  mrg     {
   1831  1.1  mrg       while (p > first)
   1832  1.1  mrg 	{
   1833  1.1  mrg 	  digit = *--p;
   1834  1.1  mrg 	  if (digit == '9')
   1835  1.1  mrg 	    *p = '0';
   1836  1.1  mrg 	  else
   1837  1.1  mrg 	    {
   1838  1.1  mrg 	      *p = digit + 1;
   1839  1.1  mrg 	      break;
   1840  1.1  mrg 	    }
   1841  1.1  mrg 	}
   1842  1.1  mrg 
   1843  1.1  mrg       /* Carry out of the first digit.  This means we had all 9's and
   1844  1.1  mrg 	 now have all 0's.  "Prepend" a 1 by overwriting the first 0.  */
   1845  1.1  mrg       if (p == first)
   1846  1.1  mrg 	{
   1847  1.1  mrg 	  first[1] = '1';
   1848  1.1  mrg 	  dec_exp++;
   1849  1.1  mrg 	}
   1850  1.1  mrg     }
   1851  1.1  mrg 
   1852  1.1  mrg   /* Insert the decimal point.  */
   1853  1.1  mrg   first[0] = first[1];
   1854  1.1  mrg   first[1] = '.';
   1855  1.1  mrg 
   1856  1.1  mrg   /* If requested, drop trailing zeros.  Never crop past "1.0".  */
   1857  1.1  mrg   if (crop_trailing_zeros)
   1858  1.1  mrg     while (last > first + 3 && last[-1] == '0')
   1859  1.1  mrg       last--;
   1860  1.1  mrg 
   1861  1.1  mrg   /* Append the exponent.  */
   1862  1.1  mrg   sprintf (last, "e%+d", dec_exp);
   1863  1.1  mrg 
   1864  1.1  mrg   /* Verify that we can read the original value back in.  */
   1865  1.1  mrg   if (flag_checking && mode != VOIDmode)
   1866  1.1  mrg     {
   1867  1.1  mrg       real_from_string (&r, str);
   1868  1.1  mrg       real_convert (&r, mode, &r);
   1869  1.1  mrg       gcc_assert (real_identical (&r, r_orig));
   1870  1.1  mrg     }
   1871  1.1  mrg }
   1872  1.1  mrg 
   1873  1.1  mrg /* Likewise, except always uses round-to-nearest.  */
   1874  1.1  mrg 
   1875  1.1  mrg void
   1876  1.1  mrg real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig, size_t buf_size,
   1877  1.1  mrg 		 size_t digits, int crop_trailing_zeros)
   1878  1.1  mrg {
   1879  1.1  mrg   real_to_decimal_for_mode (str, r_orig, buf_size,
   1880  1.1  mrg 			    digits, crop_trailing_zeros, VOIDmode);
   1881  1.1  mrg }
   1882  1.1  mrg 
   1883  1.1  mrg /* Render R as a hexadecimal floating point constant.  Emit DIGITS
   1884  1.1  mrg    significant digits in the result, bounded by BUF_SIZE.  If DIGITS is 0,
   1885  1.1  mrg    choose the maximum for the representation.  If CROP_TRAILING_ZEROS,
   1886  1.1  mrg    strip trailing zeros.  */
   1887  1.1  mrg 
   1888  1.1  mrg void
   1889  1.1  mrg real_to_hexadecimal (char *str, const REAL_VALUE_TYPE *r, size_t buf_size,
   1890  1.1  mrg 		     size_t digits, int crop_trailing_zeros)
   1891  1.1  mrg {
   1892  1.1  mrg   int i, j, exp = REAL_EXP (r);
   1893  1.1  mrg   char *p, *first;
   1894  1.1  mrg   char exp_buf[16];
   1895  1.1  mrg   size_t max_digits;
   1896  1.1  mrg 
   1897  1.1  mrg   switch (r->cl)
   1898  1.1  mrg     {
   1899  1.1  mrg     case rvc_zero:
   1900  1.1  mrg       exp = 0;
   1901  1.1  mrg       break;
   1902  1.1  mrg     case rvc_normal:
   1903  1.1  mrg       break;
   1904  1.1  mrg     case rvc_inf:
   1905  1.1  mrg       strcpy (str, (r->sign ? "-Inf" : "+Inf"));
   1906  1.1  mrg       return;
   1907  1.1  mrg     case rvc_nan:
   1908  1.1  mrg       /* ??? Print the significand as well, if not canonical?  */
   1909  1.1  mrg       sprintf (str, "%c%cNaN", (r->sign ? '-' : '+'),
   1910  1.1  mrg 	       (r->signalling ? 'S' : 'Q'));
   1911  1.1  mrg       return;
   1912  1.1  mrg     default:
   1913  1.1  mrg       gcc_unreachable ();
   1914  1.1  mrg     }
   1915  1.1  mrg 
   1916  1.1  mrg   if (r->decimal)
   1917  1.1  mrg     {
   1918  1.1  mrg       /* Hexadecimal format for decimal floats is not interesting. */
   1919  1.1  mrg       strcpy (str, "N/A");
   1920  1.1  mrg       return;
   1921  1.1  mrg     }
   1922  1.1  mrg 
   1923  1.1  mrg   if (digits == 0)
   1924  1.1  mrg     digits = SIGNIFICAND_BITS / 4;
   1925  1.1  mrg 
   1926  1.1  mrg   /* Bound the number of digits printed by the size of the output buffer.  */
   1927  1.1  mrg 
   1928  1.1  mrg   sprintf (exp_buf, "p%+d", exp);
   1929  1.1  mrg   max_digits = buf_size - strlen (exp_buf) - r->sign - 4 - 1;
   1930  1.1  mrg   gcc_assert (max_digits <= buf_size);
   1931  1.1  mrg   if (digits > max_digits)
   1932  1.1  mrg     digits = max_digits;
   1933  1.1  mrg 
   1934  1.1  mrg   p = str;
   1935  1.1  mrg   if (r->sign)
   1936  1.1  mrg     *p++ = '-';
   1937  1.1  mrg   *p++ = '0';
   1938  1.1  mrg   *p++ = 'x';
   1939  1.1  mrg   *p++ = '0';
   1940  1.1  mrg   *p++ = '.';
   1941  1.1  mrg   first = p;
   1942  1.1  mrg 
   1943  1.1  mrg   for (i = SIGSZ - 1; i >= 0; --i)
   1944  1.1  mrg     for (j = HOST_BITS_PER_LONG - 4; j >= 0; j -= 4)
   1945  1.1  mrg       {
   1946  1.1  mrg 	*p++ = "0123456789abcdef"[(r->sig[i] >> j) & 15];
   1947  1.1  mrg 	if (--digits == 0)
   1948  1.1  mrg 	  goto out;
   1949  1.1  mrg       }
   1950  1.1  mrg 
   1951  1.1  mrg  out:
   1952  1.1  mrg   if (crop_trailing_zeros)
   1953  1.1  mrg     while (p > first + 1 && p[-1] == '0')
   1954  1.1  mrg       p--;
   1955  1.1  mrg 
   1956  1.1  mrg   sprintf (p, "p%+d", exp);
   1957  1.1  mrg }
   1958  1.1  mrg 
   1959  1.1  mrg /* Initialize R from a decimal or hexadecimal string.  The string is
   1960  1.1  mrg    assumed to have been syntax checked already.  Return -1 if the
   1961  1.1  mrg    value underflows, +1 if overflows, and 0 otherwise. */
   1962  1.1  mrg 
   1963  1.1  mrg int
   1964  1.1  mrg real_from_string (REAL_VALUE_TYPE *r, const char *str)
   1965  1.1  mrg {
   1966  1.1  mrg   int exp = 0;
   1967  1.1  mrg   bool sign = false;
   1968  1.1  mrg 
   1969  1.1  mrg   get_zero (r, 0);
   1970  1.1  mrg 
   1971  1.1  mrg   if (*str == '-')
   1972  1.1  mrg     {
   1973  1.1  mrg       sign = true;
   1974  1.1  mrg       str++;
   1975  1.1  mrg     }
   1976  1.1  mrg   else if (*str == '+')
   1977  1.1  mrg     str++;
   1978  1.1  mrg 
   1979  1.1  mrg   if (startswith (str, "QNaN"))
   1980  1.1  mrg     {
   1981  1.1  mrg       get_canonical_qnan (r, sign);
   1982  1.1  mrg       return 0;
   1983  1.1  mrg     }
   1984  1.1  mrg   else if (startswith (str, "SNaN"))
   1985  1.1  mrg     {
   1986  1.1  mrg       get_canonical_snan (r, sign);
   1987  1.1  mrg       return 0;
   1988  1.1  mrg     }
   1989  1.1  mrg   else if (startswith (str, "Inf"))
   1990  1.1  mrg     {
   1991  1.1  mrg       get_inf (r, sign);
   1992  1.1  mrg       return 0;
   1993  1.1  mrg     }
   1994  1.1  mrg 
   1995  1.1  mrg   if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
   1996  1.1  mrg     {
   1997  1.1  mrg       /* Hexadecimal floating point.  */
   1998  1.1  mrg       int pos = SIGNIFICAND_BITS - 4, d;
   1999  1.1  mrg 
   2000  1.1  mrg       str += 2;
   2001  1.1  mrg 
   2002  1.1  mrg       while (*str == '0')
   2003  1.1  mrg 	str++;
   2004  1.1  mrg       while (1)
   2005  1.1  mrg 	{
   2006  1.1  mrg 	  d = hex_value (*str);
   2007  1.1  mrg 	  if (d == _hex_bad)
   2008  1.1  mrg 	    break;
   2009  1.1  mrg 	  if (pos >= 0)
   2010  1.1  mrg 	    {
   2011  1.1  mrg 	      r->sig[pos / HOST_BITS_PER_LONG]
   2012  1.1  mrg 		|= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
   2013  1.1  mrg 	      pos -= 4;
   2014  1.1  mrg 	    }
   2015  1.1  mrg 	  else if (d)
   2016  1.1  mrg 	    /* Ensure correct rounding by setting last bit if there is
   2017  1.1  mrg 	       a subsequent nonzero digit.  */
   2018  1.1  mrg 	    r->sig[0] |= 1;
   2019  1.1  mrg 	  exp += 4;
   2020  1.1  mrg 	  str++;
   2021  1.1  mrg 	}
   2022  1.1  mrg       if (*str == '.')
   2023  1.1  mrg 	{
   2024  1.1  mrg 	  str++;
   2025  1.1  mrg 	  if (pos == SIGNIFICAND_BITS - 4)
   2026  1.1  mrg 	    {
   2027  1.1  mrg 	      while (*str == '0')
   2028  1.1  mrg 		str++, exp -= 4;
   2029  1.1  mrg 	    }
   2030  1.1  mrg 	  while (1)
   2031  1.1  mrg 	    {
   2032  1.1  mrg 	      d = hex_value (*str);
   2033  1.1  mrg 	      if (d == _hex_bad)
   2034  1.1  mrg 		break;
   2035  1.1  mrg 	      if (pos >= 0)
   2036  1.1  mrg 		{
   2037  1.1  mrg 		  r->sig[pos / HOST_BITS_PER_LONG]
   2038  1.1  mrg 		    |= (unsigned long) d << (pos % HOST_BITS_PER_LONG);
   2039  1.1  mrg 		  pos -= 4;
   2040  1.1  mrg 		}
   2041  1.1  mrg 	      else if (d)
   2042  1.1  mrg 		/* Ensure correct rounding by setting last bit if there is
   2043  1.1  mrg 		   a subsequent nonzero digit.  */
   2044  1.1  mrg 		r->sig[0] |= 1;
   2045  1.1  mrg 	      str++;
   2046  1.1  mrg 	    }
   2047  1.1  mrg 	}
   2048  1.1  mrg 
   2049  1.1  mrg       /* If the mantissa is zero, ignore the exponent.  */
   2050  1.1  mrg       if (!cmp_significand_0 (r))
   2051  1.1  mrg 	goto is_a_zero;
   2052  1.1  mrg 
   2053  1.1  mrg       if (*str == 'p' || *str == 'P')
   2054  1.1  mrg 	{
   2055  1.1  mrg 	  bool exp_neg = false;
   2056  1.1  mrg 
   2057  1.1  mrg 	  str++;
   2058  1.1  mrg 	  if (*str == '-')
   2059  1.1  mrg 	    {
   2060  1.1  mrg 	      exp_neg = true;
   2061  1.1  mrg 	      str++;
   2062  1.1  mrg 	    }
   2063  1.1  mrg 	  else if (*str == '+')
   2064  1.1  mrg 	    str++;
   2065  1.1  mrg 
   2066  1.1  mrg 	  d = 0;
   2067  1.1  mrg 	  while (ISDIGIT (*str))
   2068  1.1  mrg 	    {
   2069  1.1  mrg 	      d *= 10;
   2070  1.1  mrg 	      d += *str - '0';
   2071  1.1  mrg 	      if (d > MAX_EXP)
   2072  1.1  mrg 		{
   2073  1.1  mrg 		  /* Overflowed the exponent.  */
   2074  1.1  mrg 		  if (exp_neg)
   2075  1.1  mrg 		    goto underflow;
   2076  1.1  mrg 		  else
   2077  1.1  mrg 		    goto overflow;
   2078  1.1  mrg 		}
   2079  1.1  mrg 	      str++;
   2080  1.1  mrg 	    }
   2081  1.1  mrg 	  if (exp_neg)
   2082  1.1  mrg 	    d = -d;
   2083  1.1  mrg 
   2084  1.1  mrg 	  exp += d;
   2085  1.1  mrg 	}
   2086  1.1  mrg 
   2087  1.1  mrg       r->cl = rvc_normal;
   2088  1.1  mrg       SET_REAL_EXP (r, exp);
   2089  1.1  mrg 
   2090  1.1  mrg       normalize (r);
   2091  1.1  mrg     }
   2092  1.1  mrg   else
   2093  1.1  mrg     {
   2094  1.1  mrg       /* Decimal floating point.  */
   2095  1.1  mrg       const char *cstr = str;
   2096  1.1  mrg       mpfr_t m;
   2097  1.1  mrg       bool inexact;
   2098  1.1  mrg 
   2099  1.1  mrg       while (*cstr == '0')
   2100  1.1  mrg 	cstr++;
   2101  1.1  mrg       if (*cstr == '.')
   2102  1.1  mrg 	{
   2103  1.1  mrg 	  cstr++;
   2104  1.1  mrg 	  while (*cstr == '0')
   2105  1.1  mrg 	    cstr++;
   2106  1.1  mrg 	}
   2107  1.1  mrg 
   2108  1.1  mrg       /* If the mantissa is zero, ignore the exponent.  */
   2109  1.1  mrg       if (!ISDIGIT (*cstr))
   2110  1.1  mrg 	goto is_a_zero;
   2111  1.1  mrg 
   2112  1.1  mrg       /* Nonzero value, possibly overflowing or underflowing.  */
   2113  1.1  mrg       mpfr_init2 (m, SIGNIFICAND_BITS);
   2114  1.1  mrg       inexact = mpfr_strtofr (m, str, NULL, 10, MPFR_RNDZ);
   2115  1.1  mrg       /* The result should never be a NaN, and because the rounding is
   2116  1.1  mrg 	 toward zero should never be an infinity.  */
   2117  1.1  mrg       gcc_assert (!mpfr_nan_p (m) && !mpfr_inf_p (m));
   2118  1.1  mrg       if (mpfr_zero_p (m) || mpfr_get_exp (m) < -MAX_EXP + 4)
   2119  1.1  mrg 	{
   2120  1.1  mrg 	  mpfr_clear (m);
   2121  1.1  mrg 	  goto underflow;
   2122  1.1  mrg 	}
   2123  1.1  mrg       else if (mpfr_get_exp (m) > MAX_EXP - 4)
   2124  1.1  mrg 	{
   2125  1.1  mrg 	  mpfr_clear (m);
   2126  1.1  mrg 	  goto overflow;
   2127  1.1  mrg 	}
   2128  1.1  mrg       else
   2129  1.1  mrg 	{
   2130  1.1  mrg 	  real_from_mpfr (r, m, NULL_TREE, MPFR_RNDZ);
   2131  1.1  mrg 	  /* 1 to 3 bits may have been shifted off (with a sticky bit)
   2132  1.1  mrg 	     because the hex digits used in real_from_mpfr did not
   2133  1.1  mrg 	     start with a digit 8 to f, but the exponent bounds above
   2134  1.1  mrg 	     should have avoided underflow or overflow.  */
   2135  1.1  mrg 	  gcc_assert (r->cl == rvc_normal);
   2136  1.1  mrg 	  /* Set a sticky bit if mpfr_strtofr was inexact.  */
   2137  1.1  mrg 	  r->sig[0] |= inexact;
   2138  1.1  mrg 	  mpfr_clear (m);
   2139  1.1  mrg 	}
   2140  1.1  mrg     }
   2141  1.1  mrg 
   2142  1.1  mrg   r->sign = sign;
   2143  1.1  mrg   return 0;
   2144  1.1  mrg 
   2145  1.1  mrg  is_a_zero:
   2146  1.1  mrg   get_zero (r, sign);
   2147  1.1  mrg   return 0;
   2148  1.1  mrg 
   2149  1.1  mrg  underflow:
   2150  1.1  mrg   get_zero (r, sign);
   2151  1.1  mrg   return -1;
   2152  1.1  mrg 
   2153  1.1  mrg  overflow:
   2154  1.1  mrg   get_inf (r, sign);
   2155  1.1  mrg   return 1;
   2156  1.1  mrg }
   2157  1.1  mrg 
   2158  1.1  mrg /* Legacy.  Similar, but return the result directly.  */
   2159  1.1  mrg 
   2160  1.1  mrg REAL_VALUE_TYPE
   2161  1.1  mrg real_from_string2 (const char *s, format_helper fmt)
   2162  1.1  mrg {
   2163  1.1  mrg   REAL_VALUE_TYPE r;
   2164  1.1  mrg 
   2165  1.1  mrg   real_from_string (&r, s);
   2166  1.1  mrg   if (fmt)
   2167  1.1  mrg     real_convert (&r, fmt, &r);
   2168  1.1  mrg 
   2169  1.1  mrg   return r;
   2170  1.1  mrg }
   2171  1.1  mrg 
   2172  1.1  mrg /* Initialize R from string S and desired format FMT. */
   2173  1.1  mrg 
   2174  1.1  mrg void
   2175  1.1  mrg real_from_string3 (REAL_VALUE_TYPE *r, const char *s, format_helper fmt)
   2176  1.1  mrg {
   2177  1.1  mrg   if (fmt.decimal_p ())
   2178  1.1  mrg     decimal_real_from_string (r, s);
   2179  1.1  mrg   else
   2180  1.1  mrg     real_from_string (r, s);
   2181  1.1  mrg 
   2182  1.1  mrg   if (fmt)
   2183  1.1  mrg     real_convert (r, fmt, r);
   2184  1.1  mrg }
   2185  1.1  mrg 
   2186  1.1  mrg /* Initialize R from the wide_int VAL_IN.  Round it to format FMT if
   2187  1.1  mrg    FMT is nonnull.  */
   2188  1.1  mrg 
   2189  1.1  mrg void
   2190  1.1  mrg real_from_integer (REAL_VALUE_TYPE *r, format_helper fmt,
   2191  1.1  mrg 		   const wide_int_ref &val_in, signop sgn)
   2192  1.1  mrg {
   2193  1.1  mrg   if (val_in == 0)
   2194  1.1  mrg     get_zero (r, 0);
   2195  1.1  mrg   else
   2196  1.1  mrg     {
   2197  1.1  mrg       unsigned int len = val_in.get_precision ();
   2198  1.1  mrg       int i, j, e = 0;
   2199  1.1  mrg       int maxbitlen = MAX_BITSIZE_MODE_ANY_INT + HOST_BITS_PER_WIDE_INT;
   2200  1.1  mrg       const unsigned int realmax = (SIGNIFICAND_BITS / HOST_BITS_PER_WIDE_INT
   2201  1.1  mrg 				    * HOST_BITS_PER_WIDE_INT);
   2202  1.1  mrg 
   2203  1.1  mrg       memset (r, 0, sizeof (*r));
   2204  1.1  mrg       r->cl = rvc_normal;
   2205  1.1  mrg       r->sign = wi::neg_p (val_in, sgn);
   2206  1.1  mrg 
   2207  1.1  mrg       /* We have to ensure we can negate the largest negative number.  */
   2208  1.1  mrg       wide_int val = wide_int::from (val_in, maxbitlen, sgn);
   2209  1.1  mrg 
   2210  1.1  mrg       if (r->sign)
   2211  1.1  mrg 	val = -val;
   2212  1.1  mrg 
   2213  1.1  mrg       /* Ensure a multiple of HOST_BITS_PER_WIDE_INT, ceiling, as elt
   2214  1.1  mrg 	 won't work with precisions that are not a multiple of
   2215  1.1  mrg 	 HOST_BITS_PER_WIDE_INT.  */
   2216  1.1  mrg       len += HOST_BITS_PER_WIDE_INT - 1;
   2217  1.1  mrg 
   2218  1.1  mrg       /* Ensure we can represent the largest negative number.  */
   2219  1.1  mrg       len += 1;
   2220  1.1  mrg 
   2221  1.1  mrg       len = len/HOST_BITS_PER_WIDE_INT * HOST_BITS_PER_WIDE_INT;
   2222  1.1  mrg 
   2223  1.1  mrg       /* Cap the size to the size allowed by real.h.  */
   2224  1.1  mrg       if (len > realmax)
   2225  1.1  mrg 	{
   2226  1.1  mrg 	  HOST_WIDE_INT cnt_l_z;
   2227  1.1  mrg 	  cnt_l_z = wi::clz (val);
   2228  1.1  mrg 
   2229  1.1  mrg 	  if (maxbitlen - cnt_l_z > realmax)
   2230  1.1  mrg 	    {
   2231  1.1  mrg 	      e = maxbitlen - cnt_l_z - realmax;
   2232  1.1  mrg 
   2233  1.1  mrg 	      /* This value is too large, we must shift it right to
   2234  1.1  mrg 		 preserve all the bits we can, and then bump the
   2235  1.1  mrg 		 exponent up by that amount.  */
   2236  1.1  mrg 	      val = wi::lrshift (val, e);
   2237  1.1  mrg 	    }
   2238  1.1  mrg 	  len = realmax;
   2239  1.1  mrg 	}
   2240  1.1  mrg 
   2241  1.1  mrg       /* Clear out top bits so elt will work with precisions that aren't
   2242  1.1  mrg 	 a multiple of HOST_BITS_PER_WIDE_INT.  */
   2243  1.1  mrg       val = wide_int::from (val, len, sgn);
   2244  1.1  mrg       len = len / HOST_BITS_PER_WIDE_INT;
   2245  1.1  mrg 
   2246  1.1  mrg       SET_REAL_EXP (r, len * HOST_BITS_PER_WIDE_INT + e);
   2247  1.1  mrg 
   2248  1.1  mrg       j = SIGSZ - 1;
   2249  1.1  mrg       if (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT)
   2250  1.1  mrg 	for (i = len - 1; i >= 0; i--)
   2251  1.1  mrg 	  {
   2252  1.1  mrg 	    r->sig[j--] = val.elt (i);
   2253  1.1  mrg 	    if (j < 0)
   2254  1.1  mrg 	      break;
   2255  1.1  mrg 	  }
   2256  1.1  mrg       else
   2257  1.1  mrg 	{
   2258  1.1  mrg 	  gcc_assert (HOST_BITS_PER_LONG*2 == HOST_BITS_PER_WIDE_INT);
   2259  1.1  mrg 	  for (i = len - 1; i >= 0; i--)
   2260  1.1  mrg 	    {
   2261  1.1  mrg 	      HOST_WIDE_INT e = val.elt (i);
   2262  1.1  mrg 	      r->sig[j--] = e >> (HOST_BITS_PER_LONG - 1) >> 1;
   2263  1.1  mrg 	      if (j < 0)
   2264  1.1  mrg 		break;
   2265  1.1  mrg 	      r->sig[j--] = e;
   2266  1.1  mrg 	      if (j < 0)
   2267  1.1  mrg 		break;
   2268  1.1  mrg 	    }
   2269  1.1  mrg 	}
   2270  1.1  mrg 
   2271  1.1  mrg       normalize (r);
   2272  1.1  mrg     }
   2273  1.1  mrg 
   2274  1.1  mrg   if (fmt.decimal_p ())
   2275  1.1  mrg     decimal_from_integer (r);
   2276  1.1  mrg   if (fmt)
   2277  1.1  mrg     real_convert (r, fmt, r);
   2278  1.1  mrg }
   2279  1.1  mrg 
   2280  1.1  mrg /* Render R, an integral value, as a floating point constant with no
   2281  1.1  mrg    specified exponent.  */
   2282  1.1  mrg 
   2283  1.1  mrg static void
   2284  1.1  mrg decimal_integer_string (char *str, const REAL_VALUE_TYPE *r_orig,
   2285  1.1  mrg 			size_t buf_size)
   2286  1.1  mrg {
   2287  1.1  mrg   int dec_exp, digit, digits;
   2288  1.1  mrg   REAL_VALUE_TYPE r, pten;
   2289  1.1  mrg   char *p;
   2290  1.1  mrg   bool sign;
   2291  1.1  mrg 
   2292  1.1  mrg   r = *r_orig;
   2293  1.1  mrg 
   2294  1.1  mrg   if (r.cl == rvc_zero)
   2295  1.1  mrg     {
   2296  1.1  mrg       strcpy (str, "0.");
   2297  1.1  mrg       return;
   2298  1.1  mrg     }
   2299  1.1  mrg 
   2300  1.1  mrg   sign = r.sign;
   2301  1.1  mrg   r.sign = 0;
   2302  1.1  mrg 
   2303  1.1  mrg   dec_exp = REAL_EXP (&r) * M_LOG10_2;
   2304  1.1  mrg   digits = dec_exp + 1;
   2305  1.1  mrg   gcc_assert ((digits + 2) < (int)buf_size);
   2306  1.1  mrg 
   2307  1.1  mrg   pten = *real_digit (1);
   2308  1.1  mrg   times_pten (&pten, dec_exp);
   2309  1.1  mrg 
   2310  1.1  mrg   p = str;
   2311  1.1  mrg   if (sign)
   2312  1.1  mrg     *p++ = '-';
   2313  1.1  mrg 
   2314  1.1  mrg   digit = rtd_divmod (&r, &pten);
   2315  1.1  mrg   gcc_assert (digit >= 0 && digit <= 9);
   2316  1.1  mrg   *p++ = digit + '0';
   2317  1.1  mrg   while (--digits > 0)
   2318  1.1  mrg     {
   2319  1.1  mrg       times_pten (&r, 1);
   2320  1.1  mrg       digit = rtd_divmod (&r, &pten);
   2321  1.1  mrg       *p++ = digit + '0';
   2322  1.1  mrg     }
   2323  1.1  mrg   *p++ = '.';
   2324  1.1  mrg   *p++ = '\0';
   2325  1.1  mrg }
   2326  1.1  mrg 
   2327  1.1  mrg /* Convert a real with an integral value to decimal float.  */
   2328  1.1  mrg 
   2329  1.1  mrg static void
   2330  1.1  mrg decimal_from_integer (REAL_VALUE_TYPE *r)
   2331  1.1  mrg {
   2332  1.1  mrg   char str[256];
   2333  1.1  mrg 
   2334  1.1  mrg   decimal_integer_string (str, r, sizeof (str) - 1);
   2335  1.1  mrg   decimal_real_from_string (r, str);
   2336  1.1  mrg }
   2337  1.1  mrg 
   2338  1.1  mrg /* Returns 10**2**N.  */
   2339  1.1  mrg 
   2340  1.1  mrg static const REAL_VALUE_TYPE *
   2341  1.1  mrg ten_to_ptwo (int n)
   2342  1.1  mrg {
   2343  1.1  mrg   static REAL_VALUE_TYPE tens[EXP_BITS];
   2344  1.1  mrg 
   2345  1.1  mrg   gcc_assert (n >= 0);
   2346  1.1  mrg   gcc_assert (n < EXP_BITS);
   2347  1.1  mrg 
   2348  1.1  mrg   if (tens[n].cl == rvc_zero)
   2349  1.1  mrg     {
   2350  1.1  mrg       if (n < (HOST_BITS_PER_WIDE_INT == 64 ? 5 : 4))
   2351  1.1  mrg 	{
   2352  1.1  mrg 	  HOST_WIDE_INT t = 10;
   2353  1.1  mrg 	  int i;
   2354  1.1  mrg 
   2355  1.1  mrg 	  for (i = 0; i < n; ++i)
   2356  1.1  mrg 	    t *= t;
   2357  1.1  mrg 
   2358  1.1  mrg 	  real_from_integer (&tens[n], VOIDmode, t, UNSIGNED);
   2359  1.1  mrg 	}
   2360  1.1  mrg       else
   2361  1.1  mrg 	{
   2362  1.1  mrg 	  const REAL_VALUE_TYPE *t = ten_to_ptwo (n - 1);
   2363  1.1  mrg 	  do_multiply (&tens[n], t, t);
   2364  1.1  mrg 	}
   2365  1.1  mrg     }
   2366  1.1  mrg 
   2367  1.1  mrg   return &tens[n];
   2368  1.1  mrg }
   2369  1.1  mrg 
   2370  1.1  mrg /* Returns 10**(-2**N).  */
   2371  1.1  mrg 
   2372  1.1  mrg static const REAL_VALUE_TYPE *
   2373  1.1  mrg ten_to_mptwo (int n)
   2374  1.1  mrg {
   2375  1.1  mrg   static REAL_VALUE_TYPE tens[EXP_BITS];
   2376  1.1  mrg 
   2377  1.1  mrg   gcc_assert (n >= 0);
   2378  1.1  mrg   gcc_assert (n < EXP_BITS);
   2379  1.1  mrg 
   2380  1.1  mrg   if (tens[n].cl == rvc_zero)
   2381  1.1  mrg     do_divide (&tens[n], real_digit (1), ten_to_ptwo (n));
   2382  1.1  mrg 
   2383  1.1  mrg   return &tens[n];
   2384  1.1  mrg }
   2385  1.1  mrg 
   2386  1.1  mrg /* Returns N.  */
   2387  1.1  mrg 
   2388  1.1  mrg static const REAL_VALUE_TYPE *
   2389  1.1  mrg real_digit (int n)
   2390  1.1  mrg {
   2391  1.1  mrg   static REAL_VALUE_TYPE num[10];
   2392  1.1  mrg 
   2393  1.1  mrg   gcc_assert (n >= 0);
   2394  1.1  mrg   gcc_assert (n <= 9);
   2395  1.1  mrg 
   2396  1.1  mrg   if (n > 0 && num[n].cl == rvc_zero)
   2397  1.1  mrg     real_from_integer (&num[n], VOIDmode, n, UNSIGNED);
   2398  1.1  mrg 
   2399  1.1  mrg   return &num[n];
   2400  1.1  mrg }
   2401  1.1  mrg 
   2402  1.1  mrg /* Multiply R by 10**EXP.  */
   2403  1.1  mrg 
   2404  1.1  mrg static void
   2405  1.1  mrg times_pten (REAL_VALUE_TYPE *r, int exp)
   2406  1.1  mrg {
   2407  1.1  mrg   REAL_VALUE_TYPE pten, *rr;
   2408  1.1  mrg   bool negative = (exp < 0);
   2409  1.1  mrg   int i;
   2410  1.1  mrg 
   2411  1.1  mrg   if (negative)
   2412  1.1  mrg     {
   2413  1.1  mrg       exp = -exp;
   2414  1.1  mrg       pten = *real_digit (1);
   2415  1.1  mrg       rr = &pten;
   2416  1.1  mrg     }
   2417  1.1  mrg   else
   2418  1.1  mrg     rr = r;
   2419  1.1  mrg 
   2420  1.1  mrg   for (i = 0; exp > 0; ++i, exp >>= 1)
   2421  1.1  mrg     if (exp & 1)
   2422  1.1  mrg       do_multiply (rr, rr, ten_to_ptwo (i));
   2423  1.1  mrg 
   2424  1.1  mrg   if (negative)
   2425  1.1  mrg     do_divide (r, r, &pten);
   2426  1.1  mrg }
   2427  1.1  mrg 
   2428  1.1  mrg /* Returns the special REAL_VALUE_TYPE corresponding to 'e'.  */
   2429  1.1  mrg 
   2430  1.1  mrg const REAL_VALUE_TYPE *
   2431  1.1  mrg dconst_e_ptr (void)
   2432  1.1  mrg {
   2433  1.1  mrg   static REAL_VALUE_TYPE value;
   2434  1.1  mrg 
   2435  1.1  mrg   /* Initialize mathematical constants for constant folding builtins.
   2436  1.1  mrg      These constants need to be given to at least 160 bits precision.  */
   2437  1.1  mrg   if (value.cl == rvc_zero)
   2438  1.1  mrg     {
   2439  1.1  mrg       mpfr_t m;
   2440  1.1  mrg       mpfr_init2 (m, SIGNIFICAND_BITS);
   2441  1.1  mrg       mpfr_set_ui (m, 1, MPFR_RNDN);
   2442  1.1  mrg       mpfr_exp (m, m, MPFR_RNDN);
   2443  1.1  mrg       real_from_mpfr (&value, m, NULL_TREE, MPFR_RNDN);
   2444  1.1  mrg       mpfr_clear (m);
   2445  1.1  mrg 
   2446  1.1  mrg     }
   2447  1.1  mrg   return &value;
   2448  1.1  mrg }
   2449  1.1  mrg 
   2450  1.1  mrg /* Returns a cached REAL_VALUE_TYPE corresponding to 1/n, for various n.  */
   2451  1.1  mrg 
   2452  1.1  mrg #define CACHED_FRACTION(NAME, N)					\
   2453  1.1  mrg   const REAL_VALUE_TYPE *						\
   2454  1.1  mrg   NAME (void)								\
   2455  1.1  mrg   {									\
   2456  1.1  mrg     static REAL_VALUE_TYPE value;					\
   2457  1.1  mrg 									\
   2458  1.1  mrg     /* Initialize mathematical constants for constant folding builtins.	\
   2459  1.1  mrg        These constants need to be given to at least 160 bits		\
   2460  1.1  mrg        precision.  */							\
   2461  1.1  mrg     if (value.cl == rvc_zero)						\
   2462  1.1  mrg       real_arithmetic (&value, RDIV_EXPR, &dconst1, real_digit (N));	\
   2463  1.1  mrg     return &value;							\
   2464  1.1  mrg   }
   2465  1.1  mrg 
   2466  1.1  mrg CACHED_FRACTION (dconst_third_ptr, 3)
   2467  1.1  mrg CACHED_FRACTION (dconst_quarter_ptr, 4)
   2468  1.1  mrg CACHED_FRACTION (dconst_sixth_ptr, 6)
   2469  1.1  mrg CACHED_FRACTION (dconst_ninth_ptr, 9)
   2470  1.1  mrg 
   2471  1.1  mrg /* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2).  */
   2472  1.1  mrg 
   2473  1.1  mrg const REAL_VALUE_TYPE *
   2474  1.1  mrg dconst_sqrt2_ptr (void)
   2475  1.1  mrg {
   2476  1.1  mrg   static REAL_VALUE_TYPE value;
   2477  1.1  mrg 
   2478  1.1  mrg   /* Initialize mathematical constants for constant folding builtins.
   2479  1.1  mrg      These constants need to be given to at least 160 bits precision.  */
   2480  1.1  mrg   if (value.cl == rvc_zero)
   2481  1.1  mrg     {
   2482  1.1  mrg       mpfr_t m;
   2483  1.1  mrg       mpfr_init2 (m, SIGNIFICAND_BITS);
   2484  1.1  mrg       mpfr_sqrt_ui (m, 2, MPFR_RNDN);
   2485  1.1  mrg       real_from_mpfr (&value, m, NULL_TREE, MPFR_RNDN);
   2486  1.1  mrg       mpfr_clear (m);
   2487  1.1  mrg     }
   2488  1.1  mrg   return &value;
   2489  1.1  mrg }
   2490  1.1  mrg 
   2491  1.1  mrg /* Fills R with +Inf.  */
   2492  1.1  mrg 
   2493  1.1  mrg void
   2494  1.1  mrg real_inf (REAL_VALUE_TYPE *r)
   2495  1.1  mrg {
   2496  1.1  mrg   get_inf (r, 0);
   2497  1.1  mrg }
   2498  1.1  mrg 
   2499  1.1  mrg /* Fills R with a NaN whose significand is described by STR.  If QUIET,
   2500  1.1  mrg    we force a QNaN, else we force an SNaN.  The string, if not empty,
   2501  1.1  mrg    is parsed as a number and placed in the significand.  Return true
   2502  1.1  mrg    if the string was successfully parsed.  */
   2503  1.1  mrg 
   2504  1.1  mrg bool
   2505  1.1  mrg real_nan (REAL_VALUE_TYPE *r, const char *str, int quiet,
   2506  1.1  mrg 	  format_helper fmt)
   2507  1.1  mrg {
   2508  1.1  mrg   if (*str == 0)
   2509  1.1  mrg     {
   2510  1.1  mrg       if (quiet)
   2511  1.1  mrg 	get_canonical_qnan (r, 0);
   2512  1.1  mrg       else
   2513  1.1  mrg 	get_canonical_snan (r, 0);
   2514  1.1  mrg     }
   2515  1.1  mrg   else
   2516  1.1  mrg     {
   2517  1.1  mrg       int base = 10, d;
   2518  1.1  mrg 
   2519  1.1  mrg       memset (r, 0, sizeof (*r));
   2520  1.1  mrg       r->cl = rvc_nan;
   2521  1.1  mrg 
   2522  1.1  mrg       /* Parse akin to strtol into the significand of R.  */
   2523  1.1  mrg 
   2524  1.1  mrg       while (ISSPACE (*str))
   2525  1.1  mrg 	str++;
   2526  1.1  mrg       if (*str == '-')
   2527  1.1  mrg 	str++;
   2528  1.1  mrg       else if (*str == '+')
   2529  1.1  mrg 	str++;
   2530  1.1  mrg       if (*str == '0')
   2531  1.1  mrg 	{
   2532  1.1  mrg 	  str++;
   2533  1.1  mrg 	  if (*str == 'x' || *str == 'X')
   2534  1.1  mrg 	    {
   2535  1.1  mrg 	      base = 16;
   2536  1.1  mrg 	      str++;
   2537  1.1  mrg 	    }
   2538  1.1  mrg 	  else
   2539  1.1  mrg 	    base = 8;
   2540  1.1  mrg 	}
   2541  1.1  mrg 
   2542  1.1  mrg       while ((d = hex_value (*str)) < base)
   2543  1.1  mrg 	{
   2544  1.1  mrg 	  REAL_VALUE_TYPE u;
   2545  1.1  mrg 
   2546  1.1  mrg 	  switch (base)
   2547  1.1  mrg 	    {
   2548  1.1  mrg 	    case 8:
   2549  1.1  mrg 	      lshift_significand (r, r, 3);
   2550  1.1  mrg 	      break;
   2551  1.1  mrg 	    case 16:
   2552  1.1  mrg 	      lshift_significand (r, r, 4);
   2553  1.1  mrg 	      break;
   2554  1.1  mrg 	    case 10:
   2555  1.1  mrg 	      lshift_significand_1 (&u, r);
   2556  1.1  mrg 	      lshift_significand (r, r, 3);
   2557  1.1  mrg 	      add_significands (r, r, &u);
   2558  1.1  mrg 	      break;
   2559  1.1  mrg 	    default:
   2560  1.1  mrg 	      gcc_unreachable ();
   2561  1.1  mrg 	    }
   2562  1.1  mrg 
   2563  1.1  mrg 	  get_zero (&u, 0);
   2564  1.1  mrg 	  u.sig[0] = d;
   2565  1.1  mrg 	  add_significands (r, r, &u);
   2566  1.1  mrg 
   2567  1.1  mrg 	  str++;
   2568  1.1  mrg 	}
   2569  1.1  mrg 
   2570  1.1  mrg       /* Must have consumed the entire string for success.  */
   2571  1.1  mrg       if (*str != 0)
   2572  1.1  mrg 	return false;
   2573  1.1  mrg 
   2574  1.1  mrg       /* Shift the significand into place such that the bits
   2575  1.1  mrg 	 are in the most significant bits for the format.  */
   2576  1.1  mrg       lshift_significand (r, r, SIGNIFICAND_BITS - fmt->pnan);
   2577  1.1  mrg 
   2578  1.1  mrg       /* Our MSB is always unset for NaNs.  */
   2579  1.1  mrg       r->sig[SIGSZ-1] &= ~SIG_MSB;
   2580  1.1  mrg 
   2581  1.1  mrg       /* Force quiet or signaling NaN.  */
   2582  1.1  mrg       r->signalling = !quiet;
   2583  1.1  mrg     }
   2584  1.1  mrg 
   2585  1.1  mrg   return true;
   2586  1.1  mrg }
   2587  1.1  mrg 
   2588  1.1  mrg /* Fills R with the largest finite value representable in mode MODE.
   2589  1.1  mrg    If SIGN is nonzero, R is set to the most negative finite value.  */
   2590  1.1  mrg 
   2591  1.1  mrg void
   2592  1.1  mrg real_maxval (REAL_VALUE_TYPE *r, int sign, machine_mode mode)
   2593  1.1  mrg {
   2594  1.1  mrg   const struct real_format *fmt;
   2595  1.1  mrg   int np2;
   2596  1.1  mrg 
   2597  1.1  mrg   fmt = REAL_MODE_FORMAT (mode);
   2598  1.1  mrg   gcc_assert (fmt);
   2599  1.1  mrg   memset (r, 0, sizeof (*r));
   2600  1.1  mrg 
   2601  1.1  mrg   if (fmt->b == 10)
   2602  1.1  mrg     decimal_real_maxval (r, sign, mode);
   2603  1.1  mrg   else
   2604  1.1  mrg     {
   2605  1.1  mrg       r->cl = rvc_normal;
   2606  1.1  mrg       r->sign = sign;
   2607  1.1  mrg       SET_REAL_EXP (r, fmt->emax);
   2608  1.1  mrg 
   2609  1.1  mrg       np2 = SIGNIFICAND_BITS - fmt->p;
   2610  1.1  mrg       memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
   2611  1.1  mrg       clear_significand_below (r, np2);
   2612  1.1  mrg 
   2613  1.1  mrg       if (fmt->pnan < fmt->p)
   2614  1.1  mrg 	/* This is an IBM extended double format made up of two IEEE
   2615  1.1  mrg 	   doubles.  The value of the long double is the sum of the
   2616  1.1  mrg 	   values of the two parts.  The most significant part is
   2617  1.1  mrg 	   required to be the value of the long double rounded to the
   2618  1.1  mrg 	   nearest double.  Rounding means we need a slightly smaller
   2619  1.1  mrg 	   value for LDBL_MAX.  */
   2620  1.1  mrg 	clear_significand_bit (r, SIGNIFICAND_BITS - fmt->pnan - 1);
   2621  1.1  mrg     }
   2622  1.1  mrg }
   2623  1.1  mrg 
   2624  1.1  mrg /* Fills R with 2**N.  */
   2625  1.1  mrg 
   2626  1.1  mrg void
   2627  1.1  mrg real_2expN (REAL_VALUE_TYPE *r, int n, format_helper fmt)
   2628  1.1  mrg {
   2629  1.1  mrg   memset (r, 0, sizeof (*r));
   2630  1.1  mrg 
   2631  1.1  mrg   n++;
   2632  1.1  mrg   if (n > MAX_EXP)
   2633  1.1  mrg     r->cl = rvc_inf;
   2634  1.1  mrg   else if (n < -MAX_EXP)
   2635  1.1  mrg     ;
   2636  1.1  mrg   else
   2637  1.1  mrg     {
   2638  1.1  mrg       r->cl = rvc_normal;
   2639  1.1  mrg       SET_REAL_EXP (r, n);
   2640  1.1  mrg       r->sig[SIGSZ-1] = SIG_MSB;
   2641  1.1  mrg     }
   2642  1.1  mrg   if (fmt.decimal_p ())
   2643  1.1  mrg     decimal_real_convert (r, fmt, r);
   2644  1.1  mrg }
   2645  1.1  mrg 
   2646  1.1  mrg 
   2647  1.1  mrg static void
   2649  1.1  mrg round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
   2650  1.1  mrg {
   2651  1.1  mrg   int p2, np2, i, w;
   2652  1.1  mrg   int emin2m1, emax2;
   2653  1.1  mrg   bool round_up = false;
   2654  1.1  mrg 
   2655  1.1  mrg   if (r->decimal)
   2656  1.1  mrg     {
   2657  1.1  mrg       if (fmt->b == 10)
   2658  1.1  mrg 	{
   2659  1.1  mrg 	  decimal_round_for_format (fmt, r);
   2660  1.1  mrg 	  return;
   2661  1.1  mrg 	}
   2662  1.1  mrg       /* FIXME. We can come here via fp_easy_constant
   2663  1.1  mrg 	 (e.g. -O0 on '_Decimal32 x = 1.0 + 2.0dd'), but have not
   2664  1.1  mrg 	 investigated whether this convert needs to be here, or
   2665  1.1  mrg 	 something else is missing. */
   2666  1.1  mrg       decimal_real_convert (r, REAL_MODE_FORMAT (DFmode), r);
   2667  1.1  mrg     }
   2668  1.1  mrg 
   2669  1.1  mrg   p2 = fmt->p;
   2670  1.1  mrg   emin2m1 = fmt->emin - 1;
   2671  1.1  mrg   emax2 = fmt->emax;
   2672  1.1  mrg 
   2673  1.1  mrg   np2 = SIGNIFICAND_BITS - p2;
   2674  1.1  mrg   switch (r->cl)
   2675  1.1  mrg     {
   2676  1.1  mrg     underflow:
   2677  1.1  mrg       get_zero (r, r->sign);
   2678  1.1  mrg       /* FALLTHRU */
   2679  1.1  mrg     case rvc_zero:
   2680  1.1  mrg       if (!fmt->has_signed_zero)
   2681  1.1  mrg 	r->sign = 0;
   2682  1.1  mrg       return;
   2683  1.1  mrg 
   2684  1.1  mrg     overflow:
   2685  1.1  mrg       get_inf (r, r->sign);
   2686  1.1  mrg     case rvc_inf:
   2687  1.1  mrg       return;
   2688  1.1  mrg 
   2689  1.1  mrg     case rvc_nan:
   2690  1.1  mrg       clear_significand_below (r, np2);
   2691  1.1  mrg       return;
   2692  1.1  mrg 
   2693  1.1  mrg     case rvc_normal:
   2694  1.1  mrg       break;
   2695  1.1  mrg 
   2696  1.1  mrg     default:
   2697  1.1  mrg       gcc_unreachable ();
   2698  1.1  mrg     }
   2699  1.1  mrg 
   2700  1.1  mrg   /* Check the range of the exponent.  If we're out of range,
   2701  1.1  mrg      either underflow or overflow.  */
   2702  1.1  mrg   if (REAL_EXP (r) > emax2)
   2703  1.1  mrg     goto overflow;
   2704  1.1  mrg   else if (REAL_EXP (r) <= emin2m1)
   2705  1.1  mrg     {
   2706  1.1  mrg       int diff;
   2707  1.1  mrg 
   2708  1.1  mrg       if (!fmt->has_denorm)
   2709  1.1  mrg 	{
   2710  1.1  mrg 	  /* Don't underflow completely until we've had a chance to round.  */
   2711  1.1  mrg 	  if (REAL_EXP (r) < emin2m1)
   2712  1.1  mrg 	    goto underflow;
   2713  1.1  mrg 	}
   2714  1.1  mrg       else
   2715  1.1  mrg 	{
   2716  1.1  mrg 	  diff = emin2m1 - REAL_EXP (r) + 1;
   2717  1.1  mrg 	  if (diff > p2)
   2718  1.1  mrg 	    goto underflow;
   2719  1.1  mrg 
   2720  1.1  mrg 	  /* De-normalize the significand.  */
   2721  1.1  mrg 	  r->sig[0] |= sticky_rshift_significand (r, r, diff);
   2722  1.1  mrg 	  SET_REAL_EXP (r, REAL_EXP (r) + diff);
   2723  1.1  mrg 	}
   2724  1.1  mrg     }
   2725  1.1  mrg 
   2726  1.1  mrg   if (!fmt->round_towards_zero)
   2727  1.1  mrg     {
   2728  1.1  mrg       /* There are P2 true significand bits, followed by one guard bit,
   2729  1.1  mrg          followed by one sticky bit, followed by stuff.  Fold nonzero
   2730  1.1  mrg          stuff into the sticky bit.  */
   2731  1.1  mrg       unsigned long sticky;
   2732  1.1  mrg       bool guard, lsb;
   2733  1.1  mrg 
   2734  1.1  mrg       sticky = 0;
   2735  1.1  mrg       for (i = 0, w = (np2 - 1) / HOST_BITS_PER_LONG; i < w; ++i)
   2736  1.1  mrg 	sticky |= r->sig[i];
   2737  1.1  mrg       sticky |= r->sig[w]
   2738  1.1  mrg 		& (((unsigned long)1 << ((np2 - 1) % HOST_BITS_PER_LONG)) - 1);
   2739  1.1  mrg 
   2740  1.1  mrg       guard = test_significand_bit (r, np2 - 1);
   2741  1.1  mrg       lsb = test_significand_bit (r, np2);
   2742  1.1  mrg 
   2743  1.1  mrg       /* Round to even.  */
   2744  1.1  mrg       round_up = guard && (sticky || lsb);
   2745  1.1  mrg     }
   2746  1.1  mrg 
   2747  1.1  mrg   if (round_up)
   2748  1.1  mrg     {
   2749  1.1  mrg       REAL_VALUE_TYPE u;
   2750  1.1  mrg       get_zero (&u, 0);
   2751  1.1  mrg       set_significand_bit (&u, np2);
   2752  1.1  mrg 
   2753  1.1  mrg       if (add_significands (r, r, &u))
   2754  1.1  mrg 	{
   2755  1.1  mrg 	  /* Overflow.  Means the significand had been all ones, and
   2756  1.1  mrg 	     is now all zeros.  Need to increase the exponent, and
   2757  1.1  mrg 	     possibly re-normalize it.  */
   2758  1.1  mrg 	  SET_REAL_EXP (r, REAL_EXP (r) + 1);
   2759  1.1  mrg 	  if (REAL_EXP (r) > emax2)
   2760  1.1  mrg 	    goto overflow;
   2761  1.1  mrg 	  r->sig[SIGSZ-1] = SIG_MSB;
   2762  1.1  mrg 	}
   2763  1.1  mrg     }
   2764  1.1  mrg 
   2765  1.1  mrg   /* Catch underflow that we deferred until after rounding.  */
   2766  1.1  mrg   if (REAL_EXP (r) <= emin2m1)
   2767  1.1  mrg     goto underflow;
   2768  1.1  mrg 
   2769  1.1  mrg   /* Clear out trailing garbage.  */
   2770  1.1  mrg   clear_significand_below (r, np2);
   2771  1.1  mrg }
   2772  1.1  mrg 
   2773  1.1  mrg /* Extend or truncate to a new format.  */
   2774  1.1  mrg 
   2775  1.1  mrg void
   2776  1.1  mrg real_convert (REAL_VALUE_TYPE *r, format_helper fmt,
   2777  1.1  mrg 	      const REAL_VALUE_TYPE *a)
   2778  1.1  mrg {
   2779  1.1  mrg   *r = *a;
   2780  1.1  mrg 
   2781  1.1  mrg   if (a->decimal || fmt->b == 10)
   2782  1.1  mrg     decimal_real_convert (r, fmt, a);
   2783  1.1  mrg 
   2784  1.1  mrg   round_for_format (fmt, r);
   2785  1.1  mrg 
   2786  1.1  mrg   /* Make resulting NaN value to be qNaN. The caller has the
   2787  1.1  mrg      responsibility to avoid the operation if flag_signaling_nans
   2788  1.1  mrg      is on.  */
   2789  1.1  mrg   if (r->cl == rvc_nan)
   2790  1.1  mrg     r->signalling = 0;
   2791  1.1  mrg 
   2792  1.1  mrg   /* round_for_format de-normalizes denormals.  Undo just that part.  */
   2793  1.1  mrg   if (r->cl == rvc_normal)
   2794  1.1  mrg     normalize (r);
   2795  1.1  mrg }
   2796  1.1  mrg 
   2797  1.1  mrg /* Legacy.  Likewise, except return the struct directly.  */
   2798  1.1  mrg 
   2799  1.1  mrg REAL_VALUE_TYPE
   2800  1.1  mrg real_value_truncate (format_helper fmt, REAL_VALUE_TYPE a)
   2801  1.1  mrg {
   2802  1.1  mrg   REAL_VALUE_TYPE r;
   2803  1.1  mrg   real_convert (&r, fmt, &a);
   2804  1.1  mrg   return r;
   2805  1.1  mrg }
   2806  1.1  mrg 
   2807  1.1  mrg /* Return true if truncating to FMT is exact.  */
   2808  1.1  mrg 
   2809  1.1  mrg bool
   2810  1.1  mrg exact_real_truncate (format_helper fmt, const REAL_VALUE_TYPE *a)
   2811  1.1  mrg {
   2812  1.1  mrg   REAL_VALUE_TYPE t;
   2813  1.1  mrg   int emin2m1;
   2814  1.1  mrg 
   2815  1.1  mrg   /* Don't allow conversion to denormals.  */
   2816  1.1  mrg   emin2m1 = fmt->emin - 1;
   2817  1.1  mrg   if (REAL_EXP (a) <= emin2m1)
   2818  1.1  mrg     return false;
   2819  1.1  mrg 
   2820  1.1  mrg   /* After conversion to the new format, the value must be identical.  */
   2821  1.1  mrg   real_convert (&t, fmt, a);
   2822  1.1  mrg   return real_identical (&t, a);
   2823  1.1  mrg }
   2824  1.1  mrg 
   2825  1.1  mrg /* Write R to the given target format.  Place the words of the result
   2826  1.1  mrg    in target word order in BUF.  There are always 32 bits in each
   2827  1.1  mrg    long, no matter the size of the host long.
   2828  1.1  mrg 
   2829  1.1  mrg    Legacy: return word 0 for implementing REAL_VALUE_TO_TARGET_SINGLE.  */
   2830  1.1  mrg 
   2831  1.1  mrg long
   2832  1.1  mrg real_to_target (long *buf, const REAL_VALUE_TYPE *r_orig,
   2833  1.1  mrg 		format_helper fmt)
   2834  1.1  mrg {
   2835  1.1  mrg   REAL_VALUE_TYPE r;
   2836  1.1  mrg   long buf1;
   2837  1.1  mrg 
   2838  1.1  mrg   r = *r_orig;
   2839  1.1  mrg   round_for_format (fmt, &r);
   2840  1.1  mrg 
   2841  1.1  mrg   if (!buf)
   2842  1.1  mrg     buf = &buf1;
   2843  1.1  mrg   (*fmt->encode) (fmt, buf, &r);
   2844  1.1  mrg 
   2845  1.1  mrg   return *buf;
   2846  1.1  mrg }
   2847  1.1  mrg 
   2848  1.1  mrg /* Read R from the given target format.  Read the words of the result
   2849  1.1  mrg    in target word order in BUF.  There are always 32 bits in each
   2850  1.1  mrg    long, no matter the size of the host long.  */
   2851  1.1  mrg 
   2852  1.1  mrg void
   2853  1.1  mrg real_from_target (REAL_VALUE_TYPE *r, const long *buf, format_helper fmt)
   2854  1.1  mrg {
   2855  1.1  mrg   (*fmt->decode) (fmt, r, buf);
   2856  1.1  mrg }
   2857  1.1  mrg 
   2858  1.1  mrg /* Return the number of bits of the largest binary value that the
   2859  1.1  mrg    significand of FMT will hold.  */
   2860  1.1  mrg /* ??? Legacy.  Should get access to real_format directly.  */
   2861  1.1  mrg 
   2862  1.1  mrg int
   2863  1.1  mrg significand_size (format_helper fmt)
   2864  1.1  mrg {
   2865  1.1  mrg   if (fmt == NULL)
   2866  1.1  mrg     return 0;
   2867  1.1  mrg 
   2868  1.1  mrg   if (fmt->b == 10)
   2869  1.1  mrg     {
   2870  1.1  mrg       /* Return the size in bits of the largest binary value that can be
   2871  1.1  mrg 	 held by the decimal coefficient for this format.  This is one more
   2872  1.1  mrg 	 than the number of bits required to hold the largest coefficient
   2873  1.1  mrg 	 of this format.  */
   2874  1.1  mrg       double log2_10 = 3.3219281;
   2875  1.1  mrg       return fmt->p * log2_10;
   2876  1.1  mrg     }
   2877  1.1  mrg   return fmt->p;
   2878  1.1  mrg }
   2879  1.1  mrg 
   2880  1.1  mrg /* Return a hash value for the given real value.  */
   2881  1.1  mrg /* ??? The "unsigned int" return value is intended to be hashval_t,
   2882  1.1  mrg    but I didn't want to pull hashtab.h into real.h.  */
   2883  1.1  mrg 
   2884  1.1  mrg unsigned int
   2885  1.1  mrg real_hash (const REAL_VALUE_TYPE *r)
   2886  1.1  mrg {
   2887  1.1  mrg   unsigned int h;
   2888  1.1  mrg   size_t i;
   2889  1.1  mrg 
   2890  1.1  mrg   h = r->cl | (r->sign << 2);
   2891  1.1  mrg   switch (r->cl)
   2892  1.1  mrg     {
   2893  1.1  mrg     case rvc_zero:
   2894  1.1  mrg     case rvc_inf:
   2895  1.1  mrg       return h;
   2896  1.1  mrg 
   2897  1.1  mrg     case rvc_normal:
   2898  1.1  mrg       h |= (unsigned int)REAL_EXP (r) << 3;
   2899  1.1  mrg       break;
   2900  1.1  mrg 
   2901  1.1  mrg     case rvc_nan:
   2902  1.1  mrg       if (r->signalling)
   2903  1.1  mrg 	h ^= (unsigned int)-1;
   2904  1.1  mrg       if (r->canonical)
   2905  1.1  mrg 	return h;
   2906  1.1  mrg       break;
   2907  1.1  mrg 
   2908  1.1  mrg     default:
   2909  1.1  mrg       gcc_unreachable ();
   2910  1.1  mrg     }
   2911  1.1  mrg 
   2912  1.1  mrg   if (sizeof (unsigned long) > sizeof (unsigned int))
   2913  1.1  mrg     for (i = 0; i < SIGSZ; ++i)
   2914  1.1  mrg       {
   2915  1.1  mrg 	unsigned long s = r->sig[i];
   2916  1.1  mrg 	h ^= s ^ (s >> (HOST_BITS_PER_LONG / 2));
   2917  1.1  mrg       }
   2918  1.1  mrg   else
   2919  1.1  mrg     for (i = 0; i < SIGSZ; ++i)
   2920  1.1  mrg       h ^= r->sig[i];
   2921  1.1  mrg 
   2922  1.1  mrg   return h;
   2923  1.1  mrg }
   2924  1.1  mrg 
   2925  1.1  mrg /* IEEE single-precision format.  */
   2927  1.1  mrg 
   2928  1.1  mrg static void encode_ieee_single (const struct real_format *fmt,
   2929  1.1  mrg 				long *, const REAL_VALUE_TYPE *);
   2930  1.1  mrg static void decode_ieee_single (const struct real_format *,
   2931  1.1  mrg 				REAL_VALUE_TYPE *, const long *);
   2932  1.1  mrg 
   2933  1.1  mrg static void
   2934  1.1  mrg encode_ieee_single (const struct real_format *fmt, long *buf,
   2935  1.1  mrg 		    const REAL_VALUE_TYPE *r)
   2936  1.1  mrg {
   2937  1.1  mrg   unsigned long image, sig, exp;
   2938  1.1  mrg   unsigned long sign = r->sign;
   2939  1.1  mrg   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
   2940  1.1  mrg 
   2941  1.1  mrg   image = sign << 31;
   2942  1.1  mrg   sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
   2943  1.1  mrg 
   2944  1.1  mrg   switch (r->cl)
   2945  1.1  mrg     {
   2946  1.1  mrg     case rvc_zero:
   2947  1.1  mrg       break;
   2948  1.1  mrg 
   2949  1.1  mrg     case rvc_inf:
   2950  1.1  mrg       if (fmt->has_inf)
   2951  1.1  mrg 	image |= 255 << 23;
   2952  1.1  mrg       else
   2953  1.1  mrg 	image |= 0x7fffffff;
   2954  1.1  mrg       break;
   2955  1.1  mrg 
   2956  1.1  mrg     case rvc_nan:
   2957  1.1  mrg       if (fmt->has_nans)
   2958  1.1  mrg 	{
   2959  1.1  mrg 	  if (r->canonical)
   2960  1.1  mrg 	    sig = (fmt->canonical_nan_lsbs_set ? (1 << 22) - 1 : 0);
   2961  1.1  mrg 	  if (r->signalling == fmt->qnan_msb_set)
   2962  1.1  mrg 	    sig &= ~(1 << 22);
   2963  1.1  mrg 	  else
   2964  1.1  mrg 	    sig |= 1 << 22;
   2965  1.1  mrg 	  if (sig == 0)
   2966  1.1  mrg 	    sig = 1 << 21;
   2967  1.1  mrg 
   2968  1.1  mrg 	  image |= 255 << 23;
   2969  1.1  mrg 	  image |= sig;
   2970  1.1  mrg 	}
   2971  1.1  mrg       else
   2972  1.1  mrg 	image |= 0x7fffffff;
   2973  1.1  mrg       break;
   2974  1.1  mrg 
   2975  1.1  mrg     case rvc_normal:
   2976  1.1  mrg       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
   2977  1.1  mrg 	 whereas the intermediate representation is 0.F x 2**exp.
   2978  1.1  mrg 	 Which means we're off by one.  */
   2979  1.1  mrg       if (denormal)
   2980  1.1  mrg 	exp = 0;
   2981  1.1  mrg       else
   2982  1.1  mrg       exp = REAL_EXP (r) + 127 - 1;
   2983  1.1  mrg       image |= exp << 23;
   2984  1.1  mrg       image |= sig;
   2985  1.1  mrg       break;
   2986  1.1  mrg 
   2987  1.1  mrg     default:
   2988  1.1  mrg       gcc_unreachable ();
   2989  1.1  mrg     }
   2990  1.1  mrg 
   2991  1.1  mrg   buf[0] = image;
   2992  1.1  mrg }
   2993  1.1  mrg 
   2994  1.1  mrg static void
   2995  1.1  mrg decode_ieee_single (const struct real_format *fmt, REAL_VALUE_TYPE *r,
   2996  1.1  mrg 		    const long *buf)
   2997  1.1  mrg {
   2998  1.1  mrg   unsigned long image = buf[0] & 0xffffffff;
   2999  1.1  mrg   bool sign = (image >> 31) & 1;
   3000  1.1  mrg   int exp = (image >> 23) & 0xff;
   3001  1.1  mrg 
   3002  1.1  mrg   memset (r, 0, sizeof (*r));
   3003  1.1  mrg   image <<= HOST_BITS_PER_LONG - 24;
   3004  1.1  mrg   image &= ~SIG_MSB;
   3005  1.1  mrg 
   3006  1.1  mrg   if (exp == 0)
   3007  1.1  mrg     {
   3008  1.1  mrg       if (image && fmt->has_denorm)
   3009  1.1  mrg 	{
   3010  1.1  mrg 	  r->cl = rvc_normal;
   3011  1.1  mrg 	  r->sign = sign;
   3012  1.1  mrg 	  SET_REAL_EXP (r, -126);
   3013  1.1  mrg 	  r->sig[SIGSZ-1] = image << 1;
   3014  1.1  mrg 	  normalize (r);
   3015  1.1  mrg 	}
   3016  1.1  mrg       else if (fmt->has_signed_zero)
   3017  1.1  mrg 	r->sign = sign;
   3018  1.1  mrg     }
   3019  1.1  mrg   else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
   3020  1.1  mrg     {
   3021  1.1  mrg       if (image)
   3022  1.1  mrg 	{
   3023  1.1  mrg 	  r->cl = rvc_nan;
   3024  1.1  mrg 	  r->sign = sign;
   3025  1.1  mrg 	  r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
   3026  1.1  mrg 			   ^ fmt->qnan_msb_set);
   3027  1.1  mrg 	  r->sig[SIGSZ-1] = image;
   3028  1.1  mrg 	}
   3029  1.1  mrg       else
   3030  1.1  mrg 	{
   3031  1.1  mrg 	  r->cl = rvc_inf;
   3032  1.1  mrg 	  r->sign = sign;
   3033  1.1  mrg 	}
   3034  1.1  mrg     }
   3035  1.1  mrg   else
   3036  1.1  mrg     {
   3037  1.1  mrg       r->cl = rvc_normal;
   3038  1.1  mrg       r->sign = sign;
   3039  1.1  mrg       SET_REAL_EXP (r, exp - 127 + 1);
   3040  1.1  mrg       r->sig[SIGSZ-1] = image | SIG_MSB;
   3041  1.1  mrg     }
   3042  1.1  mrg }
   3043  1.1  mrg 
   3044  1.1  mrg const struct real_format ieee_single_format =
   3045  1.1  mrg   {
   3046  1.1  mrg     encode_ieee_single,
   3047  1.1  mrg     decode_ieee_single,
   3048  1.1  mrg     2,
   3049  1.1  mrg     24,
   3050  1.1  mrg     24,
   3051  1.1  mrg     -125,
   3052  1.1  mrg     128,
   3053  1.1  mrg     31,
   3054  1.1  mrg     31,
   3055  1.1  mrg     32,
   3056  1.1  mrg     false,
   3057  1.1  mrg     true,
   3058  1.1  mrg     true,
   3059  1.1  mrg     true,
   3060  1.1  mrg     true,
   3061  1.1  mrg     true,
   3062  1.1  mrg     true,
   3063  1.1  mrg     false,
   3064  1.1  mrg     "ieee_single"
   3065  1.1  mrg   };
   3066  1.1  mrg 
   3067  1.1  mrg const struct real_format mips_single_format =
   3068  1.1  mrg   {
   3069  1.1  mrg     encode_ieee_single,
   3070  1.1  mrg     decode_ieee_single,
   3071  1.1  mrg     2,
   3072  1.1  mrg     24,
   3073  1.1  mrg     24,
   3074  1.1  mrg     -125,
   3075  1.1  mrg     128,
   3076  1.1  mrg     31,
   3077  1.1  mrg     31,
   3078  1.1  mrg     32,
   3079  1.1  mrg     false,
   3080  1.1  mrg     true,
   3081  1.1  mrg     true,
   3082  1.1  mrg     true,
   3083  1.1  mrg     true,
   3084  1.1  mrg     true,
   3085  1.1  mrg     false,
   3086  1.1  mrg     true,
   3087  1.1  mrg     "mips_single"
   3088  1.1  mrg   };
   3089  1.1  mrg 
   3090  1.1  mrg const struct real_format motorola_single_format =
   3091  1.1  mrg   {
   3092  1.1  mrg     encode_ieee_single,
   3093  1.1  mrg     decode_ieee_single,
   3094  1.1  mrg     2,
   3095  1.1  mrg     24,
   3096  1.1  mrg     24,
   3097  1.1  mrg     -125,
   3098  1.1  mrg     128,
   3099  1.1  mrg     31,
   3100  1.1  mrg     31,
   3101  1.1  mrg     32,
   3102  1.1  mrg     false,
   3103  1.1  mrg     true,
   3104  1.1  mrg     true,
   3105  1.1  mrg     true,
   3106  1.1  mrg     true,
   3107  1.1  mrg     true,
   3108  1.1  mrg     true,
   3109  1.1  mrg     true,
   3110  1.1  mrg     "motorola_single"
   3111  1.1  mrg   };
   3112  1.1  mrg 
   3113  1.1  mrg /*  SPU Single Precision (Extended-Range Mode) format is the same as IEEE
   3114  1.1  mrg     single precision with the following differences:
   3115  1.1  mrg       - Infinities are not supported.  Instead MAX_FLOAT or MIN_FLOAT
   3116  1.1  mrg 	are generated.
   3117  1.1  mrg       - NaNs are not supported.
   3118  1.1  mrg       - The range of non-zero numbers in binary is
   3119  1.1  mrg 	(001)[1.]000...000 to (255)[1.]111...111.
   3120  1.1  mrg       - Denormals can be represented, but are treated as +0.0 when
   3121  1.1  mrg 	used as an operand and are never generated as a result.
   3122  1.1  mrg       - -0.0 can be represented, but a zero result is always +0.0.
   3123  1.1  mrg       - the only supported rounding mode is trunction (towards zero).  */
   3124  1.1  mrg const struct real_format spu_single_format =
   3125  1.1  mrg   {
   3126  1.1  mrg     encode_ieee_single,
   3127  1.1  mrg     decode_ieee_single,
   3128  1.1  mrg     2,
   3129  1.1  mrg     24,
   3130  1.1  mrg     24,
   3131  1.1  mrg     -125,
   3132  1.1  mrg     129,
   3133  1.1  mrg     31,
   3134  1.1  mrg     31,
   3135  1.1  mrg     0,
   3136  1.1  mrg     true,
   3137  1.1  mrg     false,
   3138  1.1  mrg     false,
   3139  1.1  mrg     false,
   3140  1.1  mrg     true,
   3141  1.1  mrg     true,
   3142  1.1  mrg     false,
   3143  1.1  mrg     false,
   3144  1.1  mrg     "spu_single"
   3145  1.1  mrg   };
   3146  1.1  mrg 
   3147  1.1  mrg /* IEEE double-precision format.  */
   3149  1.1  mrg 
   3150  1.1  mrg static void encode_ieee_double (const struct real_format *fmt,
   3151  1.1  mrg 				long *, const REAL_VALUE_TYPE *);
   3152  1.1  mrg static void decode_ieee_double (const struct real_format *,
   3153  1.1  mrg 				REAL_VALUE_TYPE *, const long *);
   3154  1.1  mrg 
   3155  1.1  mrg static void
   3156  1.1  mrg encode_ieee_double (const struct real_format *fmt, long *buf,
   3157  1.1  mrg 		    const REAL_VALUE_TYPE *r)
   3158  1.1  mrg {
   3159  1.1  mrg   unsigned long image_lo, image_hi, sig_lo, sig_hi, exp;
   3160  1.1  mrg   unsigned long sign = r->sign;
   3161  1.1  mrg   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
   3162  1.1  mrg 
   3163  1.1  mrg   image_hi = sign << 31;
   3164  1.1  mrg   image_lo = 0;
   3165  1.1  mrg 
   3166  1.1  mrg   if (HOST_BITS_PER_LONG == 64)
   3167  1.1  mrg     {
   3168  1.1  mrg       sig_hi = r->sig[SIGSZ-1];
   3169  1.1  mrg       sig_lo = (sig_hi >> (64 - 53)) & 0xffffffff;
   3170  1.1  mrg       sig_hi = (sig_hi >> (64 - 53 + 1) >> 31) & 0xfffff;
   3171  1.1  mrg     }
   3172  1.1  mrg   else
   3173  1.1  mrg     {
   3174  1.1  mrg       sig_hi = r->sig[SIGSZ-1];
   3175  1.1  mrg       sig_lo = r->sig[SIGSZ-2];
   3176  1.1  mrg       sig_lo = (sig_hi << 21) | (sig_lo >> 11);
   3177  1.1  mrg       sig_hi = (sig_hi >> 11) & 0xfffff;
   3178  1.1  mrg     }
   3179  1.1  mrg 
   3180  1.1  mrg   switch (r->cl)
   3181  1.1  mrg     {
   3182  1.1  mrg     case rvc_zero:
   3183  1.1  mrg       break;
   3184  1.1  mrg 
   3185  1.1  mrg     case rvc_inf:
   3186  1.1  mrg       if (fmt->has_inf)
   3187  1.1  mrg 	image_hi |= 2047 << 20;
   3188  1.1  mrg       else
   3189  1.1  mrg 	{
   3190  1.1  mrg 	  image_hi |= 0x7fffffff;
   3191  1.1  mrg 	  image_lo = 0xffffffff;
   3192  1.1  mrg 	}
   3193  1.1  mrg       break;
   3194  1.1  mrg 
   3195  1.1  mrg     case rvc_nan:
   3196  1.1  mrg       if (fmt->has_nans)
   3197  1.1  mrg 	{
   3198  1.1  mrg 	  if (r->canonical)
   3199  1.1  mrg 	    {
   3200  1.1  mrg 	      if (fmt->canonical_nan_lsbs_set)
   3201  1.1  mrg 		{
   3202  1.1  mrg 		  sig_hi = (1 << 19) - 1;
   3203  1.1  mrg 		  sig_lo = 0xffffffff;
   3204  1.1  mrg 		}
   3205  1.1  mrg 	      else
   3206  1.1  mrg 		{
   3207  1.1  mrg 		  sig_hi = 0;
   3208  1.1  mrg 		  sig_lo = 0;
   3209  1.1  mrg 		}
   3210  1.1  mrg 	    }
   3211  1.1  mrg 	  if (r->signalling == fmt->qnan_msb_set)
   3212  1.1  mrg 	    sig_hi &= ~(1 << 19);
   3213  1.1  mrg 	  else
   3214  1.1  mrg 	    sig_hi |= 1 << 19;
   3215  1.1  mrg 	  if (sig_hi == 0 && sig_lo == 0)
   3216  1.1  mrg 	    sig_hi = 1 << 18;
   3217  1.1  mrg 
   3218  1.1  mrg 	  image_hi |= 2047 << 20;
   3219  1.1  mrg 	  image_hi |= sig_hi;
   3220  1.1  mrg 	  image_lo = sig_lo;
   3221  1.1  mrg 	}
   3222  1.1  mrg       else
   3223  1.1  mrg 	{
   3224  1.1  mrg 	  image_hi |= 0x7fffffff;
   3225  1.1  mrg 	  image_lo = 0xffffffff;
   3226  1.1  mrg 	}
   3227  1.1  mrg       break;
   3228  1.1  mrg 
   3229  1.1  mrg     case rvc_normal:
   3230  1.1  mrg       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
   3231  1.1  mrg 	 whereas the intermediate representation is 0.F x 2**exp.
   3232  1.1  mrg 	 Which means we're off by one.  */
   3233  1.1  mrg       if (denormal)
   3234  1.1  mrg 	exp = 0;
   3235  1.1  mrg       else
   3236  1.1  mrg 	exp = REAL_EXP (r) + 1023 - 1;
   3237  1.1  mrg       image_hi |= exp << 20;
   3238  1.1  mrg       image_hi |= sig_hi;
   3239  1.1  mrg       image_lo = sig_lo;
   3240  1.1  mrg       break;
   3241  1.1  mrg 
   3242  1.1  mrg     default:
   3243  1.1  mrg       gcc_unreachable ();
   3244  1.1  mrg     }
   3245  1.1  mrg 
   3246  1.1  mrg   if (FLOAT_WORDS_BIG_ENDIAN)
   3247  1.1  mrg     buf[0] = image_hi, buf[1] = image_lo;
   3248  1.1  mrg   else
   3249  1.1  mrg     buf[0] = image_lo, buf[1] = image_hi;
   3250  1.1  mrg }
   3251  1.1  mrg 
   3252  1.1  mrg static void
   3253  1.1  mrg decode_ieee_double (const struct real_format *fmt, REAL_VALUE_TYPE *r,
   3254  1.1  mrg 		    const long *buf)
   3255  1.1  mrg {
   3256  1.1  mrg   unsigned long image_hi, image_lo;
   3257  1.1  mrg   bool sign;
   3258  1.1  mrg   int exp;
   3259  1.1  mrg 
   3260  1.1  mrg   if (FLOAT_WORDS_BIG_ENDIAN)
   3261  1.1  mrg     image_hi = buf[0], image_lo = buf[1];
   3262  1.1  mrg   else
   3263  1.1  mrg     image_lo = buf[0], image_hi = buf[1];
   3264  1.1  mrg   image_lo &= 0xffffffff;
   3265  1.1  mrg   image_hi &= 0xffffffff;
   3266  1.1  mrg 
   3267  1.1  mrg   sign = (image_hi >> 31) & 1;
   3268  1.1  mrg   exp = (image_hi >> 20) & 0x7ff;
   3269  1.1  mrg 
   3270  1.1  mrg   memset (r, 0, sizeof (*r));
   3271  1.1  mrg 
   3272  1.1  mrg   image_hi <<= 32 - 21;
   3273  1.1  mrg   image_hi |= image_lo >> 21;
   3274  1.1  mrg   image_hi &= 0x7fffffff;
   3275  1.1  mrg   image_lo <<= 32 - 21;
   3276  1.1  mrg 
   3277  1.1  mrg   if (exp == 0)
   3278  1.1  mrg     {
   3279  1.1  mrg       if ((image_hi || image_lo) && fmt->has_denorm)
   3280  1.1  mrg 	{
   3281  1.1  mrg 	  r->cl = rvc_normal;
   3282  1.1  mrg 	  r->sign = sign;
   3283  1.1  mrg 	  SET_REAL_EXP (r, -1022);
   3284  1.1  mrg 	  if (HOST_BITS_PER_LONG == 32)
   3285  1.1  mrg 	    {
   3286  1.1  mrg 	      image_hi = (image_hi << 1) | (image_lo >> 31);
   3287  1.1  mrg 	      image_lo <<= 1;
   3288  1.1  mrg 	      r->sig[SIGSZ-1] = image_hi;
   3289  1.1  mrg 	      r->sig[SIGSZ-2] = image_lo;
   3290  1.1  mrg 	    }
   3291  1.1  mrg 	  else
   3292  1.1  mrg 	    {
   3293  1.1  mrg 	      image_hi = (image_hi << 31 << 2) | (image_lo << 1);
   3294  1.1  mrg 	      r->sig[SIGSZ-1] = image_hi;
   3295  1.1  mrg 	    }
   3296  1.1  mrg 	  normalize (r);
   3297  1.1  mrg 	}
   3298  1.1  mrg       else if (fmt->has_signed_zero)
   3299  1.1  mrg 	r->sign = sign;
   3300  1.1  mrg     }
   3301  1.1  mrg   else if (exp == 2047 && (fmt->has_nans || fmt->has_inf))
   3302  1.1  mrg     {
   3303  1.1  mrg       if (image_hi || image_lo)
   3304  1.1  mrg 	{
   3305  1.1  mrg 	  r->cl = rvc_nan;
   3306  1.1  mrg 	  r->sign = sign;
   3307  1.1  mrg 	  r->signalling = ((image_hi >> 30) & 1) ^ fmt->qnan_msb_set;
   3308  1.1  mrg 	  if (HOST_BITS_PER_LONG == 32)
   3309  1.1  mrg 	    {
   3310  1.1  mrg 	      r->sig[SIGSZ-1] = image_hi;
   3311  1.1  mrg 	      r->sig[SIGSZ-2] = image_lo;
   3312  1.1  mrg 	    }
   3313  1.1  mrg 	  else
   3314  1.1  mrg 	    r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo;
   3315  1.1  mrg 	}
   3316  1.1  mrg       else
   3317  1.1  mrg 	{
   3318  1.1  mrg 	  r->cl = rvc_inf;
   3319  1.1  mrg 	  r->sign = sign;
   3320  1.1  mrg 	}
   3321  1.1  mrg     }
   3322  1.1  mrg   else
   3323  1.1  mrg     {
   3324  1.1  mrg       r->cl = rvc_normal;
   3325  1.1  mrg       r->sign = sign;
   3326  1.1  mrg       SET_REAL_EXP (r, exp - 1023 + 1);
   3327  1.1  mrg       if (HOST_BITS_PER_LONG == 32)
   3328  1.1  mrg 	{
   3329  1.1  mrg 	  r->sig[SIGSZ-1] = image_hi | SIG_MSB;
   3330  1.1  mrg 	  r->sig[SIGSZ-2] = image_lo;
   3331  1.1  mrg 	}
   3332  1.1  mrg       else
   3333  1.1  mrg 	r->sig[SIGSZ-1] = (image_hi << 31 << 1) | image_lo | SIG_MSB;
   3334  1.1  mrg     }
   3335  1.1  mrg }
   3336  1.1  mrg 
   3337  1.1  mrg const struct real_format ieee_double_format =
   3338  1.1  mrg   {
   3339  1.1  mrg     encode_ieee_double,
   3340  1.1  mrg     decode_ieee_double,
   3341  1.1  mrg     2,
   3342  1.1  mrg     53,
   3343  1.1  mrg     53,
   3344  1.1  mrg     -1021,
   3345  1.1  mrg     1024,
   3346  1.1  mrg     63,
   3347  1.1  mrg     63,
   3348  1.1  mrg     64,
   3349  1.1  mrg     false,
   3350  1.1  mrg     true,
   3351  1.1  mrg     true,
   3352  1.1  mrg     true,
   3353  1.1  mrg     true,
   3354  1.1  mrg     true,
   3355  1.1  mrg     true,
   3356  1.1  mrg     false,
   3357  1.1  mrg     "ieee_double"
   3358  1.1  mrg   };
   3359  1.1  mrg 
   3360  1.1  mrg const struct real_format mips_double_format =
   3361  1.1  mrg   {
   3362  1.1  mrg     encode_ieee_double,
   3363  1.1  mrg     decode_ieee_double,
   3364  1.1  mrg     2,
   3365  1.1  mrg     53,
   3366  1.1  mrg     53,
   3367  1.1  mrg     -1021,
   3368  1.1  mrg     1024,
   3369  1.1  mrg     63,
   3370  1.1  mrg     63,
   3371  1.1  mrg     64,
   3372  1.1  mrg     false,
   3373  1.1  mrg     true,
   3374  1.1  mrg     true,
   3375  1.1  mrg     true,
   3376  1.1  mrg     true,
   3377  1.1  mrg     true,
   3378  1.1  mrg     false,
   3379  1.1  mrg     true,
   3380  1.1  mrg     "mips_double"
   3381  1.1  mrg   };
   3382  1.1  mrg 
   3383  1.1  mrg const struct real_format motorola_double_format =
   3384  1.1  mrg   {
   3385  1.1  mrg     encode_ieee_double,
   3386  1.1  mrg     decode_ieee_double,
   3387  1.1  mrg     2,
   3388  1.1  mrg     53,
   3389  1.1  mrg     53,
   3390  1.1  mrg     -1021,
   3391  1.1  mrg     1024,
   3392  1.1  mrg     63,
   3393  1.1  mrg     63,
   3394  1.1  mrg     64,
   3395  1.1  mrg     false,
   3396  1.1  mrg     true,
   3397  1.1  mrg     true,
   3398  1.1  mrg     true,
   3399  1.1  mrg     true,
   3400  1.1  mrg     true,
   3401  1.1  mrg     true,
   3402  1.1  mrg     true,
   3403  1.1  mrg     "motorola_double"
   3404  1.1  mrg   };
   3405  1.1  mrg 
   3406  1.1  mrg /* IEEE extended real format.  This comes in three flavors: Intel's as
   3408  1.1  mrg    a 12 byte image, Intel's as a 16 byte image, and Motorola's.  Intel
   3409  1.1  mrg    12- and 16-byte images may be big- or little endian; Motorola's is
   3410  1.1  mrg    always big endian.  */
   3411  1.1  mrg 
   3412  1.1  mrg /* Helper subroutine which converts from the internal format to the
   3413  1.1  mrg    12-byte little-endian Intel format.  Functions below adjust this
   3414  1.1  mrg    for the other possible formats.  */
   3415  1.1  mrg static void
   3416  1.1  mrg encode_ieee_extended (const struct real_format *fmt, long *buf,
   3417  1.1  mrg 		      const REAL_VALUE_TYPE *r)
   3418  1.1  mrg {
   3419  1.1  mrg   unsigned long image_hi, sig_hi, sig_lo;
   3420  1.1  mrg   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
   3421  1.1  mrg 
   3422  1.1  mrg   image_hi = r->sign << 15;
   3423  1.1  mrg   sig_hi = sig_lo = 0;
   3424  1.1  mrg 
   3425  1.1  mrg   switch (r->cl)
   3426  1.1  mrg     {
   3427  1.1  mrg     case rvc_zero:
   3428  1.1  mrg       break;
   3429  1.1  mrg 
   3430  1.1  mrg     case rvc_inf:
   3431  1.1  mrg       if (fmt->has_inf)
   3432  1.1  mrg 	{
   3433  1.1  mrg 	  image_hi |= 32767;
   3434  1.1  mrg 
   3435  1.1  mrg 	  /* Intel requires the explicit integer bit to be set, otherwise
   3436  1.1  mrg 	     it considers the value a "pseudo-infinity".  Motorola docs
   3437  1.1  mrg 	     say it doesn't care.  */
   3438  1.1  mrg 	  sig_hi = 0x80000000;
   3439  1.1  mrg 	}
   3440  1.1  mrg       else
   3441  1.1  mrg 	{
   3442  1.1  mrg 	  image_hi |= 32767;
   3443  1.1  mrg 	  sig_lo = sig_hi = 0xffffffff;
   3444  1.1  mrg 	}
   3445  1.1  mrg       break;
   3446  1.1  mrg 
   3447  1.1  mrg     case rvc_nan:
   3448  1.1  mrg       if (fmt->has_nans)
   3449  1.1  mrg 	{
   3450  1.1  mrg 	  image_hi |= 32767;
   3451  1.1  mrg 	  if (r->canonical)
   3452  1.1  mrg 	    {
   3453  1.1  mrg 	      if (fmt->canonical_nan_lsbs_set)
   3454  1.1  mrg 		{
   3455  1.1  mrg 		  sig_hi = (1 << 30) - 1;
   3456  1.1  mrg 		  sig_lo = 0xffffffff;
   3457  1.1  mrg 		}
   3458  1.1  mrg 	    }
   3459  1.1  mrg 	  else if (HOST_BITS_PER_LONG == 32)
   3460  1.1  mrg 	    {
   3461  1.1  mrg 	      sig_hi = r->sig[SIGSZ-1];
   3462  1.1  mrg 	      sig_lo = r->sig[SIGSZ-2];
   3463  1.1  mrg 	    }
   3464  1.1  mrg 	  else
   3465  1.1  mrg 	    {
   3466  1.1  mrg 	      sig_lo = r->sig[SIGSZ-1];
   3467  1.1  mrg 	      sig_hi = sig_lo >> 31 >> 1;
   3468  1.1  mrg 	      sig_lo &= 0xffffffff;
   3469  1.1  mrg 	    }
   3470  1.1  mrg 	  if (r->signalling == fmt->qnan_msb_set)
   3471  1.1  mrg 	    sig_hi &= ~(1 << 30);
   3472  1.1  mrg 	  else
   3473  1.1  mrg 	    sig_hi |= 1 << 30;
   3474  1.1  mrg 	  if ((sig_hi & 0x7fffffff) == 0 && sig_lo == 0)
   3475  1.1  mrg 	    sig_hi = 1 << 29;
   3476  1.1  mrg 
   3477  1.1  mrg 	  /* Intel requires the explicit integer bit to be set, otherwise
   3478  1.1  mrg 	     it considers the value a "pseudo-nan".  Motorola docs say it
   3479  1.1  mrg 	     doesn't care.  */
   3480  1.1  mrg 	  sig_hi |= 0x80000000;
   3481  1.1  mrg 	}
   3482  1.1  mrg       else
   3483  1.1  mrg 	{
   3484  1.1  mrg 	  image_hi |= 32767;
   3485  1.1  mrg 	  sig_lo = sig_hi = 0xffffffff;
   3486  1.1  mrg 	}
   3487  1.1  mrg       break;
   3488  1.1  mrg 
   3489  1.1  mrg     case rvc_normal:
   3490  1.1  mrg       {
   3491  1.1  mrg 	int exp = REAL_EXP (r);
   3492  1.1  mrg 
   3493  1.1  mrg 	/* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
   3494  1.1  mrg 	   whereas the intermediate representation is 0.F x 2**exp.
   3495  1.1  mrg 	   Which means we're off by one.
   3496  1.1  mrg 
   3497  1.1  mrg 	   Except for Motorola, which consider exp=0 and explicit
   3498  1.1  mrg 	   integer bit set to continue to be normalized.  In theory
   3499  1.1  mrg 	   this discrepancy has been taken care of by the difference
   3500  1.1  mrg 	   in fmt->emin in round_for_format.  */
   3501  1.1  mrg 
   3502  1.1  mrg 	if (denormal)
   3503  1.1  mrg 	  exp = 0;
   3504  1.1  mrg 	else
   3505  1.1  mrg 	  {
   3506  1.1  mrg 	    exp += 16383 - 1;
   3507  1.1  mrg 	    gcc_assert (exp >= 0);
   3508  1.1  mrg 	  }
   3509  1.1  mrg 	image_hi |= exp;
   3510  1.1  mrg 
   3511  1.1  mrg 	if (HOST_BITS_PER_LONG == 32)
   3512  1.1  mrg 	  {
   3513  1.1  mrg 	    sig_hi = r->sig[SIGSZ-1];
   3514  1.1  mrg 	    sig_lo = r->sig[SIGSZ-2];
   3515  1.1  mrg 	  }
   3516  1.1  mrg 	else
   3517  1.1  mrg 	  {
   3518  1.1  mrg 	    sig_lo = r->sig[SIGSZ-1];
   3519  1.1  mrg 	    sig_hi = sig_lo >> 31 >> 1;
   3520  1.1  mrg 	    sig_lo &= 0xffffffff;
   3521  1.1  mrg 	  }
   3522  1.1  mrg       }
   3523  1.1  mrg       break;
   3524  1.1  mrg 
   3525  1.1  mrg     default:
   3526  1.1  mrg       gcc_unreachable ();
   3527  1.1  mrg     }
   3528  1.1  mrg 
   3529  1.1  mrg   buf[0] = sig_lo, buf[1] = sig_hi, buf[2] = image_hi;
   3530  1.1  mrg }
   3531  1.1  mrg 
   3532  1.1  mrg /* Convert from the internal format to the 12-byte Motorola format
   3533  1.1  mrg    for an IEEE extended real.  */
   3534  1.1  mrg static void
   3535  1.1  mrg encode_ieee_extended_motorola (const struct real_format *fmt, long *buf,
   3536  1.1  mrg 			       const REAL_VALUE_TYPE *r)
   3537  1.1  mrg {
   3538  1.1  mrg   long intermed[3];
   3539  1.1  mrg   encode_ieee_extended (fmt, intermed, r);
   3540  1.1  mrg 
   3541  1.1  mrg   if (r->cl == rvc_inf)
   3542  1.1  mrg     /* For infinity clear the explicit integer bit again, so that the
   3543  1.1  mrg        format matches the canonical infinity generated by the FPU.  */
   3544  1.1  mrg     intermed[1] = 0;
   3545  1.1  mrg 
   3546  1.1  mrg   /* Motorola chips are assumed always to be big-endian.  Also, the
   3547  1.1  mrg      padding in a Motorola extended real goes between the exponent and
   3548  1.1  mrg      the mantissa.  At this point the mantissa is entirely within
   3549  1.1  mrg      elements 0 and 1 of intermed, and the exponent entirely within
   3550  1.1  mrg      element 2, so all we have to do is swap the order around, and
   3551  1.1  mrg      shift element 2 left 16 bits.  */
   3552  1.1  mrg   buf[0] = intermed[2] << 16;
   3553  1.1  mrg   buf[1] = intermed[1];
   3554  1.1  mrg   buf[2] = intermed[0];
   3555  1.1  mrg }
   3556  1.1  mrg 
   3557  1.1  mrg /* Convert from the internal format to the 12-byte Intel format for
   3558  1.1  mrg    an IEEE extended real.  */
   3559  1.1  mrg static void
   3560  1.1  mrg encode_ieee_extended_intel_96 (const struct real_format *fmt, long *buf,
   3561  1.1  mrg 			       const REAL_VALUE_TYPE *r)
   3562  1.1  mrg {
   3563  1.1  mrg   if (FLOAT_WORDS_BIG_ENDIAN)
   3564  1.1  mrg     {
   3565  1.1  mrg       /* All the padding in an Intel-format extended real goes at the high
   3566  1.1  mrg 	 end, which in this case is after the mantissa, not the exponent.
   3567  1.1  mrg 	 Therefore we must shift everything down 16 bits.  */
   3568  1.1  mrg       long intermed[3];
   3569  1.1  mrg       encode_ieee_extended (fmt, intermed, r);
   3570  1.1  mrg       buf[0] = ((intermed[2] << 16) | ((unsigned long)(intermed[1] & 0xFFFF0000) >> 16));
   3571  1.1  mrg       buf[1] = ((intermed[1] << 16) | ((unsigned long)(intermed[0] & 0xFFFF0000) >> 16));
   3572  1.1  mrg       buf[2] =  (intermed[0] << 16);
   3573  1.1  mrg     }
   3574  1.1  mrg   else
   3575  1.1  mrg     /* encode_ieee_extended produces what we want directly.  */
   3576  1.1  mrg     encode_ieee_extended (fmt, buf, r);
   3577  1.1  mrg }
   3578  1.1  mrg 
   3579  1.1  mrg /* Convert from the internal format to the 16-byte Intel format for
   3580  1.1  mrg    an IEEE extended real.  */
   3581  1.1  mrg static void
   3582  1.1  mrg encode_ieee_extended_intel_128 (const struct real_format *fmt, long *buf,
   3583  1.1  mrg 				const REAL_VALUE_TYPE *r)
   3584  1.1  mrg {
   3585  1.1  mrg   /* All the padding in an Intel-format extended real goes at the high end.  */
   3586  1.1  mrg   encode_ieee_extended_intel_96 (fmt, buf, r);
   3587  1.1  mrg   buf[3] = 0;
   3588  1.1  mrg }
   3589  1.1  mrg 
   3590  1.1  mrg /* As above, we have a helper function which converts from 12-byte
   3591  1.1  mrg    little-endian Intel format to internal format.  Functions below
   3592  1.1  mrg    adjust for the other possible formats.  */
   3593  1.1  mrg static void
   3594  1.1  mrg decode_ieee_extended (const struct real_format *fmt, REAL_VALUE_TYPE *r,
   3595  1.1  mrg 		      const long *buf)
   3596  1.1  mrg {
   3597  1.1  mrg   unsigned long image_hi, sig_hi, sig_lo;
   3598  1.1  mrg   bool sign;
   3599  1.1  mrg   int exp;
   3600  1.1  mrg 
   3601  1.1  mrg   sig_lo = buf[0], sig_hi = buf[1], image_hi = buf[2];
   3602  1.1  mrg   sig_lo &= 0xffffffff;
   3603  1.1  mrg   sig_hi &= 0xffffffff;
   3604  1.1  mrg   image_hi &= 0xffffffff;
   3605  1.1  mrg 
   3606  1.1  mrg   sign = (image_hi >> 15) & 1;
   3607  1.1  mrg   exp = image_hi & 0x7fff;
   3608  1.1  mrg 
   3609  1.1  mrg   memset (r, 0, sizeof (*r));
   3610  1.1  mrg 
   3611  1.1  mrg   if (exp == 0)
   3612  1.1  mrg     {
   3613  1.1  mrg       if ((sig_hi || sig_lo) && fmt->has_denorm)
   3614  1.1  mrg 	{
   3615  1.1  mrg 	  r->cl = rvc_normal;
   3616  1.1  mrg 	  r->sign = sign;
   3617  1.1  mrg 
   3618  1.1  mrg 	  /* When the IEEE format contains a hidden bit, we know that
   3619  1.1  mrg 	     it's zero at this point, and so shift up the significand
   3620  1.1  mrg 	     and decrease the exponent to match.  In this case, Motorola
   3621  1.1  mrg 	     defines the explicit integer bit to be valid, so we don't
   3622  1.1  mrg 	     know whether the msb is set or not.  */
   3623  1.1  mrg 	  SET_REAL_EXP (r, fmt->emin);
   3624  1.1  mrg 	  if (HOST_BITS_PER_LONG == 32)
   3625  1.1  mrg 	    {
   3626  1.1  mrg 	      r->sig[SIGSZ-1] = sig_hi;
   3627  1.1  mrg 	      r->sig[SIGSZ-2] = sig_lo;
   3628  1.1  mrg 	    }
   3629  1.1  mrg 	  else
   3630  1.1  mrg 	    r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
   3631  1.1  mrg 
   3632  1.1  mrg 	  normalize (r);
   3633  1.1  mrg 	}
   3634  1.1  mrg       else if (fmt->has_signed_zero)
   3635  1.1  mrg 	r->sign = sign;
   3636  1.1  mrg     }
   3637  1.1  mrg   else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
   3638  1.1  mrg     {
   3639  1.1  mrg       /* See above re "pseudo-infinities" and "pseudo-nans".
   3640  1.1  mrg 	 Short summary is that the MSB will likely always be
   3641  1.1  mrg 	 set, and that we don't care about it.  */
   3642  1.1  mrg       sig_hi &= 0x7fffffff;
   3643  1.1  mrg 
   3644  1.1  mrg       if (sig_hi || sig_lo)
   3645  1.1  mrg 	{
   3646  1.1  mrg 	  r->cl = rvc_nan;
   3647  1.1  mrg 	  r->sign = sign;
   3648  1.1  mrg 	  r->signalling = ((sig_hi >> 30) & 1) ^ fmt->qnan_msb_set;
   3649  1.1  mrg 	  if (HOST_BITS_PER_LONG == 32)
   3650  1.1  mrg 	    {
   3651  1.1  mrg 	      r->sig[SIGSZ-1] = sig_hi;
   3652  1.1  mrg 	      r->sig[SIGSZ-2] = sig_lo;
   3653  1.1  mrg 	    }
   3654  1.1  mrg 	  else
   3655  1.1  mrg 	    r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
   3656  1.1  mrg 	}
   3657  1.1  mrg       else
   3658  1.1  mrg 	{
   3659  1.1  mrg 	  r->cl = rvc_inf;
   3660  1.1  mrg 	  r->sign = sign;
   3661  1.1  mrg 	}
   3662  1.1  mrg     }
   3663  1.1  mrg   else
   3664  1.1  mrg     {
   3665  1.1  mrg       r->cl = rvc_normal;
   3666  1.1  mrg       r->sign = sign;
   3667  1.1  mrg       SET_REAL_EXP (r, exp - 16383 + 1);
   3668  1.1  mrg       if (HOST_BITS_PER_LONG == 32)
   3669  1.1  mrg 	{
   3670  1.1  mrg 	  r->sig[SIGSZ-1] = sig_hi;
   3671  1.1  mrg 	  r->sig[SIGSZ-2] = sig_lo;
   3672  1.1  mrg 	}
   3673  1.1  mrg       else
   3674  1.1  mrg 	r->sig[SIGSZ-1] = (sig_hi << 31 << 1) | sig_lo;
   3675  1.1  mrg     }
   3676  1.1  mrg }
   3677  1.1  mrg 
   3678  1.1  mrg /* Convert from the internal format to the 12-byte Motorola format
   3679  1.1  mrg    for an IEEE extended real.  */
   3680  1.1  mrg static void
   3681  1.1  mrg decode_ieee_extended_motorola (const struct real_format *fmt, REAL_VALUE_TYPE *r,
   3682  1.1  mrg 			       const long *buf)
   3683  1.1  mrg {
   3684  1.1  mrg   long intermed[3];
   3685  1.1  mrg 
   3686  1.1  mrg   /* Motorola chips are assumed always to be big-endian.  Also, the
   3687  1.1  mrg      padding in a Motorola extended real goes between the exponent and
   3688  1.1  mrg      the mantissa; remove it.  */
   3689  1.1  mrg   intermed[0] = buf[2];
   3690  1.1  mrg   intermed[1] = buf[1];
   3691  1.1  mrg   intermed[2] = (unsigned long)buf[0] >> 16;
   3692  1.1  mrg 
   3693  1.1  mrg   decode_ieee_extended (fmt, r, intermed);
   3694  1.1  mrg }
   3695  1.1  mrg 
   3696  1.1  mrg /* Convert from the internal format to the 12-byte Intel format for
   3697  1.1  mrg    an IEEE extended real.  */
   3698  1.1  mrg static void
   3699  1.1  mrg decode_ieee_extended_intel_96 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
   3700  1.1  mrg 			       const long *buf)
   3701  1.1  mrg {
   3702  1.1  mrg   if (FLOAT_WORDS_BIG_ENDIAN)
   3703  1.1  mrg     {
   3704  1.1  mrg       /* All the padding in an Intel-format extended real goes at the high
   3705  1.1  mrg 	 end, which in this case is after the mantissa, not the exponent.
   3706  1.1  mrg 	 Therefore we must shift everything up 16 bits.  */
   3707  1.1  mrg       long intermed[3];
   3708  1.1  mrg 
   3709  1.1  mrg       intermed[0] = (((unsigned long)buf[2] >> 16) | (buf[1] << 16));
   3710  1.1  mrg       intermed[1] = (((unsigned long)buf[1] >> 16) | (buf[0] << 16));
   3711  1.1  mrg       intermed[2] =  ((unsigned long)buf[0] >> 16);
   3712  1.1  mrg 
   3713  1.1  mrg       decode_ieee_extended (fmt, r, intermed);
   3714  1.1  mrg     }
   3715  1.1  mrg   else
   3716  1.1  mrg     /* decode_ieee_extended produces what we want directly.  */
   3717  1.1  mrg     decode_ieee_extended (fmt, r, buf);
   3718  1.1  mrg }
   3719  1.1  mrg 
   3720  1.1  mrg /* Convert from the internal format to the 16-byte Intel format for
   3721  1.1  mrg    an IEEE extended real.  */
   3722  1.1  mrg static void
   3723  1.1  mrg decode_ieee_extended_intel_128 (const struct real_format *fmt, REAL_VALUE_TYPE *r,
   3724  1.1  mrg 				const long *buf)
   3725  1.1  mrg {
   3726  1.1  mrg   /* All the padding in an Intel-format extended real goes at the high end.  */
   3727  1.1  mrg   decode_ieee_extended_intel_96 (fmt, r, buf);
   3728  1.1  mrg }
   3729  1.1  mrg 
   3730  1.1  mrg const struct real_format ieee_extended_motorola_format =
   3731  1.1  mrg   {
   3732  1.1  mrg     encode_ieee_extended_motorola,
   3733  1.1  mrg     decode_ieee_extended_motorola,
   3734  1.1  mrg     2,
   3735  1.1  mrg     64,
   3736  1.1  mrg     64,
   3737  1.1  mrg     -16382,
   3738  1.1  mrg     16384,
   3739  1.1  mrg     95,
   3740  1.1  mrg     95,
   3741  1.1  mrg     0,
   3742  1.1  mrg     false,
   3743  1.1  mrg     true,
   3744  1.1  mrg     true,
   3745  1.1  mrg     true,
   3746  1.1  mrg     true,
   3747  1.1  mrg     true,
   3748  1.1  mrg     true,
   3749  1.1  mrg     true,
   3750  1.1  mrg     "ieee_extended_motorola"
   3751  1.1  mrg   };
   3752  1.1  mrg 
   3753  1.1  mrg const struct real_format ieee_extended_intel_96_format =
   3754  1.1  mrg   {
   3755  1.1  mrg     encode_ieee_extended_intel_96,
   3756  1.1  mrg     decode_ieee_extended_intel_96,
   3757  1.1  mrg     2,
   3758  1.1  mrg     64,
   3759  1.1  mrg     64,
   3760  1.1  mrg     -16381,
   3761  1.1  mrg     16384,
   3762  1.1  mrg     79,
   3763  1.1  mrg     79,
   3764  1.1  mrg     65,
   3765  1.1  mrg     false,
   3766  1.1  mrg     true,
   3767  1.1  mrg     true,
   3768  1.1  mrg     true,
   3769  1.1  mrg     true,
   3770  1.1  mrg     true,
   3771  1.1  mrg     true,
   3772  1.1  mrg     false,
   3773  1.1  mrg     "ieee_extended_intel_96"
   3774  1.1  mrg   };
   3775  1.1  mrg 
   3776  1.1  mrg const struct real_format ieee_extended_intel_128_format =
   3777  1.1  mrg   {
   3778  1.1  mrg     encode_ieee_extended_intel_128,
   3779  1.1  mrg     decode_ieee_extended_intel_128,
   3780  1.1  mrg     2,
   3781  1.1  mrg     64,
   3782  1.1  mrg     64,
   3783  1.1  mrg     -16381,
   3784  1.1  mrg     16384,
   3785  1.1  mrg     79,
   3786  1.1  mrg     79,
   3787  1.1  mrg     65,
   3788  1.1  mrg     false,
   3789  1.1  mrg     true,
   3790  1.1  mrg     true,
   3791  1.1  mrg     true,
   3792  1.1  mrg     true,
   3793  1.1  mrg     true,
   3794  1.1  mrg     true,
   3795  1.1  mrg     false,
   3796  1.1  mrg     "ieee_extended_intel_128"
   3797  1.1  mrg   };
   3798  1.1  mrg 
   3799  1.1  mrg /* The following caters to i386 systems that set the rounding precision
   3800  1.1  mrg    to 53 bits instead of 64, e.g. FreeBSD.  */
   3801  1.1  mrg const struct real_format ieee_extended_intel_96_round_53_format =
   3802  1.1  mrg   {
   3803  1.1  mrg     encode_ieee_extended_intel_96,
   3804  1.1  mrg     decode_ieee_extended_intel_96,
   3805  1.1  mrg     2,
   3806  1.1  mrg     53,
   3807  1.1  mrg     53,
   3808  1.1  mrg     -16381,
   3809  1.1  mrg     16384,
   3810  1.1  mrg     79,
   3811  1.1  mrg     79,
   3812  1.1  mrg     33,
   3813  1.1  mrg     false,
   3814  1.1  mrg     true,
   3815  1.1  mrg     true,
   3816  1.1  mrg     true,
   3817  1.1  mrg     true,
   3818  1.1  mrg     true,
   3819  1.1  mrg     true,
   3820  1.1  mrg     false,
   3821  1.1  mrg     "ieee_extended_intel_96_round_53"
   3822  1.1  mrg   };
   3823  1.1  mrg 
   3824  1.1  mrg /* IBM 128-bit extended precision format: a pair of IEEE double precision
   3826  1.1  mrg    numbers whose sum is equal to the extended precision value.  The number
   3827  1.1  mrg    with greater magnitude is first.  This format has the same magnitude
   3828  1.1  mrg    range as an IEEE double precision value, but effectively 106 bits of
   3829  1.1  mrg    significand precision.  Infinity and NaN are represented by their IEEE
   3830  1.1  mrg    double precision value stored in the first number, the second number is
   3831  1.1  mrg    +0.0 or -0.0 for Infinity and don't-care for NaN.  */
   3832  1.1  mrg 
   3833  1.1  mrg static void encode_ibm_extended (const struct real_format *fmt,
   3834  1.1  mrg 				 long *, const REAL_VALUE_TYPE *);
   3835  1.1  mrg static void decode_ibm_extended (const struct real_format *,
   3836  1.1  mrg 				 REAL_VALUE_TYPE *, const long *);
   3837  1.1  mrg 
   3838  1.1  mrg static void
   3839  1.1  mrg encode_ibm_extended (const struct real_format *fmt, long *buf,
   3840  1.1  mrg 		     const REAL_VALUE_TYPE *r)
   3841  1.1  mrg {
   3842  1.1  mrg   REAL_VALUE_TYPE u, normr, v;
   3843  1.1  mrg   const struct real_format *base_fmt;
   3844  1.1  mrg 
   3845  1.1  mrg   base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
   3846  1.1  mrg 
   3847  1.1  mrg   /* Renormalize R before doing any arithmetic on it.  */
   3848  1.1  mrg   normr = *r;
   3849  1.1  mrg   if (normr.cl == rvc_normal)
   3850  1.1  mrg     normalize (&normr);
   3851  1.1  mrg 
   3852  1.1  mrg   /* u = IEEE double precision portion of significand.  */
   3853  1.1  mrg   u = normr;
   3854  1.1  mrg   round_for_format (base_fmt, &u);
   3855  1.1  mrg   encode_ieee_double (base_fmt, &buf[0], &u);
   3856  1.1  mrg 
   3857  1.1  mrg   if (u.cl == rvc_normal)
   3858  1.1  mrg     {
   3859  1.1  mrg       do_add (&v, &normr, &u, 1);
   3860  1.1  mrg       /* Call round_for_format since we might need to denormalize.  */
   3861  1.1  mrg       round_for_format (base_fmt, &v);
   3862  1.1  mrg       encode_ieee_double (base_fmt, &buf[2], &v);
   3863  1.1  mrg     }
   3864  1.1  mrg   else
   3865  1.1  mrg     {
   3866  1.1  mrg       /* Inf, NaN, 0 are all representable as doubles, so the
   3867  1.1  mrg 	 least-significant part can be 0.0.  */
   3868  1.1  mrg       buf[2] = 0;
   3869  1.1  mrg       buf[3] = 0;
   3870  1.1  mrg     }
   3871  1.1  mrg }
   3872  1.1  mrg 
   3873  1.1  mrg static void
   3874  1.1  mrg decode_ibm_extended (const struct real_format *fmt ATTRIBUTE_UNUSED, REAL_VALUE_TYPE *r,
   3875  1.1  mrg 		     const long *buf)
   3876  1.1  mrg {
   3877  1.1  mrg   REAL_VALUE_TYPE u, v;
   3878  1.1  mrg   const struct real_format *base_fmt;
   3879  1.1  mrg 
   3880  1.1  mrg   base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
   3881  1.1  mrg   decode_ieee_double (base_fmt, &u, &buf[0]);
   3882  1.1  mrg 
   3883  1.1  mrg   if (u.cl != rvc_zero && u.cl != rvc_inf && u.cl != rvc_nan)
   3884  1.1  mrg     {
   3885  1.1  mrg       decode_ieee_double (base_fmt, &v, &buf[2]);
   3886  1.1  mrg       do_add (r, &u, &v, 0);
   3887  1.1  mrg     }
   3888  1.1  mrg   else
   3889  1.1  mrg     *r = u;
   3890  1.1  mrg }
   3891  1.1  mrg 
   3892  1.1  mrg const struct real_format ibm_extended_format =
   3893  1.1  mrg   {
   3894  1.1  mrg     encode_ibm_extended,
   3895  1.1  mrg     decode_ibm_extended,
   3896  1.1  mrg     2,
   3897  1.1  mrg     53 + 53,
   3898  1.1  mrg     53,
   3899  1.1  mrg     -1021 + 53,
   3900  1.1  mrg     1024,
   3901  1.1  mrg     127,
   3902  1.1  mrg     -1,
   3903  1.1  mrg     0,
   3904  1.1  mrg     false,
   3905  1.1  mrg     true,
   3906  1.1  mrg     true,
   3907  1.1  mrg     true,
   3908  1.1  mrg     true,
   3909  1.1  mrg     true,
   3910  1.1  mrg     true,
   3911  1.1  mrg     false,
   3912  1.1  mrg     "ibm_extended"
   3913  1.1  mrg   };
   3914  1.1  mrg 
   3915  1.1  mrg const struct real_format mips_extended_format =
   3916  1.1  mrg   {
   3917  1.1  mrg     encode_ibm_extended,
   3918  1.1  mrg     decode_ibm_extended,
   3919  1.1  mrg     2,
   3920  1.1  mrg     53 + 53,
   3921  1.1  mrg     53,
   3922  1.1  mrg     -1021 + 53,
   3923  1.1  mrg     1024,
   3924  1.1  mrg     127,
   3925  1.1  mrg     -1,
   3926  1.1  mrg     0,
   3927  1.1  mrg     false,
   3928  1.1  mrg     true,
   3929  1.1  mrg     true,
   3930  1.1  mrg     true,
   3931  1.1  mrg     true,
   3932  1.1  mrg     true,
   3933  1.1  mrg     false,
   3934  1.1  mrg     true,
   3935  1.1  mrg     "mips_extended"
   3936  1.1  mrg   };
   3937  1.1  mrg 
   3938  1.1  mrg 
   3939  1.1  mrg /* IEEE quad precision format.  */
   3941  1.1  mrg 
   3942  1.1  mrg static void encode_ieee_quad (const struct real_format *fmt,
   3943  1.1  mrg 			      long *, const REAL_VALUE_TYPE *);
   3944  1.1  mrg static void decode_ieee_quad (const struct real_format *,
   3945  1.1  mrg 			      REAL_VALUE_TYPE *, const long *);
   3946  1.1  mrg 
   3947  1.1  mrg static void
   3948  1.1  mrg encode_ieee_quad (const struct real_format *fmt, long *buf,
   3949  1.1  mrg 		  const REAL_VALUE_TYPE *r)
   3950  1.1  mrg {
   3951  1.1  mrg   unsigned long image3, image2, image1, image0, exp;
   3952  1.1  mrg   unsigned long sign = r->sign;
   3953  1.1  mrg   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
   3954  1.1  mrg   REAL_VALUE_TYPE u;
   3955  1.1  mrg 
   3956  1.1  mrg   image3 = sign << 31;
   3957  1.1  mrg   image2 = 0;
   3958  1.1  mrg   image1 = 0;
   3959  1.1  mrg   image0 = 0;
   3960  1.1  mrg 
   3961  1.1  mrg   rshift_significand (&u, r, SIGNIFICAND_BITS - 113);
   3962  1.1  mrg 
   3963  1.1  mrg   switch (r->cl)
   3964  1.1  mrg     {
   3965  1.1  mrg     case rvc_zero:
   3966  1.1  mrg       break;
   3967  1.1  mrg 
   3968  1.1  mrg     case rvc_inf:
   3969  1.1  mrg       if (fmt->has_inf)
   3970  1.1  mrg 	image3 |= 32767 << 16;
   3971  1.1  mrg       else
   3972  1.1  mrg 	{
   3973  1.1  mrg 	  image3 |= 0x7fffffff;
   3974  1.1  mrg 	  image2 = 0xffffffff;
   3975  1.1  mrg 	  image1 = 0xffffffff;
   3976  1.1  mrg 	  image0 = 0xffffffff;
   3977  1.1  mrg 	}
   3978  1.1  mrg       break;
   3979  1.1  mrg 
   3980  1.1  mrg     case rvc_nan:
   3981  1.1  mrg       if (fmt->has_nans)
   3982  1.1  mrg 	{
   3983  1.1  mrg 	  image3 |= 32767 << 16;
   3984  1.1  mrg 
   3985  1.1  mrg 	  if (r->canonical)
   3986  1.1  mrg 	    {
   3987  1.1  mrg 	      if (fmt->canonical_nan_lsbs_set)
   3988  1.1  mrg 		{
   3989  1.1  mrg 		  image3 |= 0x7fff;
   3990  1.1  mrg 		  image2 = image1 = image0 = 0xffffffff;
   3991  1.1  mrg 		}
   3992  1.1  mrg 	    }
   3993  1.1  mrg 	  else if (HOST_BITS_PER_LONG == 32)
   3994  1.1  mrg 	    {
   3995  1.1  mrg 	      image0 = u.sig[0];
   3996  1.1  mrg 	      image1 = u.sig[1];
   3997  1.1  mrg 	      image2 = u.sig[2];
   3998  1.1  mrg 	      image3 |= u.sig[3] & 0xffff;
   3999  1.1  mrg 	    }
   4000  1.1  mrg 	  else
   4001  1.1  mrg 	    {
   4002  1.1  mrg 	      image0 = u.sig[0];
   4003  1.1  mrg 	      image1 = image0 >> 31 >> 1;
   4004  1.1  mrg 	      image2 = u.sig[1];
   4005  1.1  mrg 	      image3 |= (image2 >> 31 >> 1) & 0xffff;
   4006  1.1  mrg 	      image0 &= 0xffffffff;
   4007  1.1  mrg 	      image2 &= 0xffffffff;
   4008  1.1  mrg 	    }
   4009  1.1  mrg 	  if (r->signalling == fmt->qnan_msb_set)
   4010  1.1  mrg 	    image3 &= ~0x8000;
   4011  1.1  mrg 	  else
   4012  1.1  mrg 	    image3 |= 0x8000;
   4013  1.1  mrg 	  if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
   4014  1.1  mrg 	    image3 |= 0x4000;
   4015  1.1  mrg 	}
   4016  1.1  mrg       else
   4017  1.1  mrg 	{
   4018  1.1  mrg 	  image3 |= 0x7fffffff;
   4019  1.1  mrg 	  image2 = 0xffffffff;
   4020  1.1  mrg 	  image1 = 0xffffffff;
   4021  1.1  mrg 	  image0 = 0xffffffff;
   4022  1.1  mrg 	}
   4023  1.1  mrg       break;
   4024  1.1  mrg 
   4025  1.1  mrg     case rvc_normal:
   4026  1.1  mrg       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
   4027  1.1  mrg 	 whereas the intermediate representation is 0.F x 2**exp.
   4028  1.1  mrg 	 Which means we're off by one.  */
   4029  1.1  mrg       if (denormal)
   4030  1.1  mrg 	exp = 0;
   4031  1.1  mrg       else
   4032  1.1  mrg 	exp = REAL_EXP (r) + 16383 - 1;
   4033  1.1  mrg       image3 |= exp << 16;
   4034  1.1  mrg 
   4035  1.1  mrg       if (HOST_BITS_PER_LONG == 32)
   4036  1.1  mrg 	{
   4037  1.1  mrg 	  image0 = u.sig[0];
   4038  1.1  mrg 	  image1 = u.sig[1];
   4039  1.1  mrg 	  image2 = u.sig[2];
   4040  1.1  mrg 	  image3 |= u.sig[3] & 0xffff;
   4041  1.1  mrg 	}
   4042  1.1  mrg       else
   4043  1.1  mrg 	{
   4044  1.1  mrg 	  image0 = u.sig[0];
   4045  1.1  mrg 	  image1 = image0 >> 31 >> 1;
   4046  1.1  mrg 	  image2 = u.sig[1];
   4047  1.1  mrg 	  image3 |= (image2 >> 31 >> 1) & 0xffff;
   4048  1.1  mrg 	  image0 &= 0xffffffff;
   4049  1.1  mrg 	  image2 &= 0xffffffff;
   4050  1.1  mrg 	}
   4051  1.1  mrg       break;
   4052  1.1  mrg 
   4053  1.1  mrg     default:
   4054  1.1  mrg       gcc_unreachable ();
   4055  1.1  mrg     }
   4056  1.1  mrg 
   4057  1.1  mrg   if (FLOAT_WORDS_BIG_ENDIAN)
   4058  1.1  mrg     {
   4059  1.1  mrg       buf[0] = image3;
   4060  1.1  mrg       buf[1] = image2;
   4061  1.1  mrg       buf[2] = image1;
   4062  1.1  mrg       buf[3] = image0;
   4063  1.1  mrg     }
   4064  1.1  mrg   else
   4065  1.1  mrg     {
   4066  1.1  mrg       buf[0] = image0;
   4067  1.1  mrg       buf[1] = image1;
   4068  1.1  mrg       buf[2] = image2;
   4069  1.1  mrg       buf[3] = image3;
   4070  1.1  mrg     }
   4071  1.1  mrg }
   4072  1.1  mrg 
   4073  1.1  mrg static void
   4074  1.1  mrg decode_ieee_quad (const struct real_format *fmt, REAL_VALUE_TYPE *r,
   4075  1.1  mrg 		  const long *buf)
   4076  1.1  mrg {
   4077  1.1  mrg   unsigned long image3, image2, image1, image0;
   4078  1.1  mrg   bool sign;
   4079  1.1  mrg   int exp;
   4080  1.1  mrg 
   4081  1.1  mrg   if (FLOAT_WORDS_BIG_ENDIAN)
   4082  1.1  mrg     {
   4083  1.1  mrg       image3 = buf[0];
   4084  1.1  mrg       image2 = buf[1];
   4085  1.1  mrg       image1 = buf[2];
   4086  1.1  mrg       image0 = buf[3];
   4087  1.1  mrg     }
   4088  1.1  mrg   else
   4089  1.1  mrg     {
   4090  1.1  mrg       image0 = buf[0];
   4091  1.1  mrg       image1 = buf[1];
   4092  1.1  mrg       image2 = buf[2];
   4093  1.1  mrg       image3 = buf[3];
   4094  1.1  mrg     }
   4095  1.1  mrg   image0 &= 0xffffffff;
   4096  1.1  mrg   image1 &= 0xffffffff;
   4097  1.1  mrg   image2 &= 0xffffffff;
   4098  1.1  mrg 
   4099  1.1  mrg   sign = (image3 >> 31) & 1;
   4100  1.1  mrg   exp = (image3 >> 16) & 0x7fff;
   4101  1.1  mrg   image3 &= 0xffff;
   4102  1.1  mrg 
   4103  1.1  mrg   memset (r, 0, sizeof (*r));
   4104  1.1  mrg 
   4105  1.1  mrg   if (exp == 0)
   4106  1.1  mrg     {
   4107  1.1  mrg       if ((image3 | image2 | image1 | image0) && fmt->has_denorm)
   4108  1.1  mrg 	{
   4109  1.1  mrg 	  r->cl = rvc_normal;
   4110  1.1  mrg 	  r->sign = sign;
   4111  1.1  mrg 
   4112  1.1  mrg 	  SET_REAL_EXP (r, -16382 + (SIGNIFICAND_BITS - 112));
   4113  1.1  mrg 	  if (HOST_BITS_PER_LONG == 32)
   4114  1.1  mrg 	    {
   4115  1.1  mrg 	      r->sig[0] = image0;
   4116  1.1  mrg 	      r->sig[1] = image1;
   4117  1.1  mrg 	      r->sig[2] = image2;
   4118  1.1  mrg 	      r->sig[3] = image3;
   4119  1.1  mrg 	    }
   4120  1.1  mrg 	  else
   4121  1.1  mrg 	    {
   4122  1.1  mrg 	      r->sig[0] = (image1 << 31 << 1) | image0;
   4123  1.1  mrg 	      r->sig[1] = (image3 << 31 << 1) | image2;
   4124  1.1  mrg 	    }
   4125  1.1  mrg 
   4126  1.1  mrg 	  normalize (r);
   4127  1.1  mrg 	}
   4128  1.1  mrg       else if (fmt->has_signed_zero)
   4129  1.1  mrg 	r->sign = sign;
   4130  1.1  mrg     }
   4131  1.1  mrg   else if (exp == 32767 && (fmt->has_nans || fmt->has_inf))
   4132  1.1  mrg     {
   4133  1.1  mrg       if (image3 | image2 | image1 | image0)
   4134  1.1  mrg 	{
   4135  1.1  mrg 	  r->cl = rvc_nan;
   4136  1.1  mrg 	  r->sign = sign;
   4137  1.1  mrg 	  r->signalling = ((image3 >> 15) & 1) ^ fmt->qnan_msb_set;
   4138  1.1  mrg 
   4139  1.1  mrg 	  if (HOST_BITS_PER_LONG == 32)
   4140  1.1  mrg 	    {
   4141  1.1  mrg 	      r->sig[0] = image0;
   4142  1.1  mrg 	      r->sig[1] = image1;
   4143  1.1  mrg 	      r->sig[2] = image2;
   4144  1.1  mrg 	      r->sig[3] = image3;
   4145  1.1  mrg 	    }
   4146  1.1  mrg 	  else
   4147  1.1  mrg 	    {
   4148  1.1  mrg 	      r->sig[0] = (image1 << 31 << 1) | image0;
   4149  1.1  mrg 	      r->sig[1] = (image3 << 31 << 1) | image2;
   4150  1.1  mrg 	    }
   4151  1.1  mrg 	  lshift_significand (r, r, SIGNIFICAND_BITS - 113);
   4152  1.1  mrg 	}
   4153  1.1  mrg       else
   4154  1.1  mrg 	{
   4155  1.1  mrg 	  r->cl = rvc_inf;
   4156  1.1  mrg 	  r->sign = sign;
   4157  1.1  mrg 	}
   4158  1.1  mrg     }
   4159  1.1  mrg   else
   4160  1.1  mrg     {
   4161  1.1  mrg       r->cl = rvc_normal;
   4162  1.1  mrg       r->sign = sign;
   4163  1.1  mrg       SET_REAL_EXP (r, exp - 16383 + 1);
   4164  1.1  mrg 
   4165  1.1  mrg       if (HOST_BITS_PER_LONG == 32)
   4166  1.1  mrg 	{
   4167  1.1  mrg 	  r->sig[0] = image0;
   4168  1.1  mrg 	  r->sig[1] = image1;
   4169  1.1  mrg 	  r->sig[2] = image2;
   4170  1.1  mrg 	  r->sig[3] = image3;
   4171  1.1  mrg 	}
   4172  1.1  mrg       else
   4173  1.1  mrg 	{
   4174  1.1  mrg 	  r->sig[0] = (image1 << 31 << 1) | image0;
   4175  1.1  mrg 	  r->sig[1] = (image3 << 31 << 1) | image2;
   4176  1.1  mrg 	}
   4177  1.1  mrg       lshift_significand (r, r, SIGNIFICAND_BITS - 113);
   4178  1.1  mrg       r->sig[SIGSZ-1] |= SIG_MSB;
   4179  1.1  mrg     }
   4180  1.1  mrg }
   4181  1.1  mrg 
   4182  1.1  mrg const struct real_format ieee_quad_format =
   4183  1.1  mrg   {
   4184  1.1  mrg     encode_ieee_quad,
   4185  1.1  mrg     decode_ieee_quad,
   4186  1.1  mrg     2,
   4187  1.1  mrg     113,
   4188  1.1  mrg     113,
   4189  1.1  mrg     -16381,
   4190  1.1  mrg     16384,
   4191  1.1  mrg     127,
   4192  1.1  mrg     127,
   4193  1.1  mrg     128,
   4194  1.1  mrg     false,
   4195  1.1  mrg     true,
   4196  1.1  mrg     true,
   4197  1.1  mrg     true,
   4198  1.1  mrg     true,
   4199  1.1  mrg     true,
   4200  1.1  mrg     true,
   4201  1.1  mrg     false,
   4202  1.1  mrg     "ieee_quad"
   4203  1.1  mrg   };
   4204  1.1  mrg 
   4205  1.1  mrg const struct real_format mips_quad_format =
   4206  1.1  mrg   {
   4207  1.1  mrg     encode_ieee_quad,
   4208  1.1  mrg     decode_ieee_quad,
   4209  1.1  mrg     2,
   4210  1.1  mrg     113,
   4211  1.1  mrg     113,
   4212  1.1  mrg     -16381,
   4213  1.1  mrg     16384,
   4214  1.1  mrg     127,
   4215  1.1  mrg     127,
   4216  1.1  mrg     128,
   4217  1.1  mrg     false,
   4218  1.1  mrg     true,
   4219  1.1  mrg     true,
   4220  1.1  mrg     true,
   4221  1.1  mrg     true,
   4222  1.1  mrg     true,
   4223  1.1  mrg     false,
   4224  1.1  mrg     true,
   4225  1.1  mrg     "mips_quad"
   4226  1.1  mrg   };
   4227  1.1  mrg 
   4228  1.1  mrg /* Descriptions of VAX floating point formats can be found beginning at
   4230  1.1  mrg 
   4231  1.1  mrg    http://h71000.www7.hp.com/doc/73FINAL/4515/4515pro_013.html#f_floating_point_format
   4232  1.1  mrg 
   4233  1.1  mrg    The thing to remember is that they're almost IEEE, except for word
   4234  1.1  mrg    order, exponent bias, and the lack of infinities, nans, and denormals.
   4235  1.1  mrg 
   4236  1.1  mrg    We don't implement the H_floating format here, simply because neither
   4237  1.1  mrg    the VAX or Alpha ports use it.  */
   4238  1.1  mrg 
   4239  1.1  mrg static void encode_vax_f (const struct real_format *fmt,
   4240  1.1  mrg 			  long *, const REAL_VALUE_TYPE *);
   4241  1.1  mrg static void decode_vax_f (const struct real_format *,
   4242  1.1  mrg 			  REAL_VALUE_TYPE *, const long *);
   4243  1.1  mrg static void encode_vax_d (const struct real_format *fmt,
   4244  1.1  mrg 			  long *, const REAL_VALUE_TYPE *);
   4245  1.1  mrg static void decode_vax_d (const struct real_format *,
   4246  1.1  mrg 			  REAL_VALUE_TYPE *, const long *);
   4247  1.1  mrg static void encode_vax_g (const struct real_format *fmt,
   4248  1.1  mrg 			  long *, const REAL_VALUE_TYPE *);
   4249  1.1  mrg static void decode_vax_g (const struct real_format *,
   4250  1.1  mrg 			  REAL_VALUE_TYPE *, const long *);
   4251  1.1  mrg 
   4252  1.1  mrg static void
   4253  1.1  mrg encode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
   4254  1.1  mrg 	      const REAL_VALUE_TYPE *r)
   4255  1.1  mrg {
   4256  1.1  mrg   unsigned long sign, exp, sig, image;
   4257  1.1  mrg 
   4258  1.1  mrg   sign = r->sign << 15;
   4259  1.1  mrg 
   4260  1.1  mrg   switch (r->cl)
   4261  1.1  mrg     {
   4262  1.1  mrg     case rvc_zero:
   4263  1.1  mrg       image = 0;
   4264  1.1  mrg       break;
   4265  1.1  mrg 
   4266  1.1  mrg     case rvc_inf:
   4267  1.1  mrg     case rvc_nan:
   4268  1.1  mrg       image = 0xffff7fff | sign;
   4269  1.1  mrg       break;
   4270  1.1  mrg 
   4271  1.1  mrg     case rvc_normal:
   4272  1.1  mrg       sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
   4273  1.1  mrg       exp = REAL_EXP (r) + 128;
   4274  1.1  mrg 
   4275  1.1  mrg       image = (sig << 16) & 0xffff0000;
   4276  1.1  mrg       image |= sign;
   4277  1.1  mrg       image |= exp << 7;
   4278  1.1  mrg       image |= sig >> 16;
   4279  1.1  mrg       break;
   4280  1.1  mrg 
   4281  1.1  mrg     default:
   4282  1.1  mrg       gcc_unreachable ();
   4283  1.1  mrg     }
   4284  1.1  mrg 
   4285  1.1  mrg   buf[0] = image;
   4286  1.1  mrg }
   4287  1.1  mrg 
   4288  1.1  mrg static void
   4289  1.1  mrg decode_vax_f (const struct real_format *fmt ATTRIBUTE_UNUSED,
   4290  1.1  mrg 	      REAL_VALUE_TYPE *r, const long *buf)
   4291  1.1  mrg {
   4292  1.1  mrg   unsigned long image = buf[0] & 0xffffffff;
   4293  1.1  mrg   int exp = (image >> 7) & 0xff;
   4294  1.1  mrg 
   4295  1.1  mrg   memset (r, 0, sizeof (*r));
   4296  1.1  mrg 
   4297  1.1  mrg   if (exp != 0)
   4298  1.1  mrg     {
   4299  1.1  mrg       r->cl = rvc_normal;
   4300  1.1  mrg       r->sign = (image >> 15) & 1;
   4301  1.1  mrg       SET_REAL_EXP (r, exp - 128);
   4302  1.1  mrg 
   4303  1.1  mrg       image = ((image & 0x7f) << 16) | ((image >> 16) & 0xffff);
   4304  1.1  mrg       r->sig[SIGSZ-1] = (image << (HOST_BITS_PER_LONG - 24)) | SIG_MSB;
   4305  1.1  mrg     }
   4306  1.1  mrg }
   4307  1.1  mrg 
   4308  1.1  mrg static void
   4309  1.1  mrg encode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
   4310  1.1  mrg 	      const REAL_VALUE_TYPE *r)
   4311  1.1  mrg {
   4312  1.1  mrg   unsigned long image0, image1, sign = r->sign << 15;
   4313  1.1  mrg 
   4314  1.1  mrg   switch (r->cl)
   4315  1.1  mrg     {
   4316  1.1  mrg     case rvc_zero:
   4317  1.1  mrg       image0 = image1 = 0;
   4318  1.1  mrg       break;
   4319  1.1  mrg 
   4320  1.1  mrg     case rvc_inf:
   4321  1.1  mrg     case rvc_nan:
   4322  1.1  mrg       image0 = 0xffff7fff | sign;
   4323  1.1  mrg       image1 = 0xffffffff;
   4324  1.1  mrg       break;
   4325  1.1  mrg 
   4326  1.1  mrg     case rvc_normal:
   4327  1.1  mrg       /* Extract the significand into straight hi:lo.  */
   4328  1.1  mrg       if (HOST_BITS_PER_LONG == 64)
   4329  1.1  mrg 	{
   4330  1.1  mrg 	  image0 = r->sig[SIGSZ-1];
   4331  1.1  mrg 	  image1 = (image0 >> (64 - 56)) & 0xffffffff;
   4332  1.1  mrg 	  image0 = (image0 >> (64 - 56 + 1) >> 31) & 0x7fffff;
   4333  1.1  mrg 	}
   4334  1.1  mrg       else
   4335  1.1  mrg 	{
   4336  1.1  mrg 	  image0 = r->sig[SIGSZ-1];
   4337  1.1  mrg 	  image1 = r->sig[SIGSZ-2];
   4338  1.1  mrg 	  image1 = (image0 << 24) | (image1 >> 8);
   4339  1.1  mrg 	  image0 = (image0 >> 8) & 0xffffff;
   4340  1.1  mrg 	}
   4341  1.1  mrg 
   4342  1.1  mrg       /* Rearrange the half-words of the significand to match the
   4343  1.1  mrg 	 external format.  */
   4344  1.1  mrg       image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff007f;
   4345  1.1  mrg       image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
   4346  1.1  mrg 
   4347  1.1  mrg       /* Add the sign and exponent.  */
   4348  1.1  mrg       image0 |= sign;
   4349  1.1  mrg       image0 |= (REAL_EXP (r) + 128) << 7;
   4350  1.1  mrg       break;
   4351  1.1  mrg 
   4352  1.1  mrg     default:
   4353  1.1  mrg       gcc_unreachable ();
   4354  1.1  mrg     }
   4355  1.1  mrg 
   4356  1.1  mrg   if (FLOAT_WORDS_BIG_ENDIAN)
   4357  1.1  mrg     buf[0] = image1, buf[1] = image0;
   4358  1.1  mrg   else
   4359  1.1  mrg     buf[0] = image0, buf[1] = image1;
   4360  1.1  mrg }
   4361  1.1  mrg 
   4362  1.1  mrg static void
   4363  1.1  mrg decode_vax_d (const struct real_format *fmt ATTRIBUTE_UNUSED,
   4364  1.1  mrg 	      REAL_VALUE_TYPE *r, const long *buf)
   4365  1.1  mrg {
   4366  1.1  mrg   unsigned long image0, image1;
   4367  1.1  mrg   int exp;
   4368  1.1  mrg 
   4369  1.1  mrg   if (FLOAT_WORDS_BIG_ENDIAN)
   4370  1.1  mrg     image1 = buf[0], image0 = buf[1];
   4371  1.1  mrg   else
   4372  1.1  mrg     image0 = buf[0], image1 = buf[1];
   4373  1.1  mrg   image0 &= 0xffffffff;
   4374  1.1  mrg   image1 &= 0xffffffff;
   4375  1.1  mrg 
   4376  1.1  mrg   exp = (image0 >> 7) & 0xff;
   4377  1.1  mrg 
   4378  1.1  mrg   memset (r, 0, sizeof (*r));
   4379  1.1  mrg 
   4380  1.1  mrg   if (exp != 0)
   4381  1.1  mrg     {
   4382  1.1  mrg       r->cl = rvc_normal;
   4383  1.1  mrg       r->sign = (image0 >> 15) & 1;
   4384  1.1  mrg       SET_REAL_EXP (r, exp - 128);
   4385  1.1  mrg 
   4386  1.1  mrg       /* Rearrange the half-words of the external format into
   4387  1.1  mrg 	 proper ascending order.  */
   4388  1.1  mrg       image0 = ((image0 & 0x7f) << 16) | ((image0 >> 16) & 0xffff);
   4389  1.1  mrg       image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
   4390  1.1  mrg 
   4391  1.1  mrg       if (HOST_BITS_PER_LONG == 64)
   4392  1.1  mrg 	{
   4393  1.1  mrg 	  image0 = (image0 << 31 << 1) | image1;
   4394  1.1  mrg 	  image0 <<= 64 - 56;
   4395  1.1  mrg 	  image0 |= SIG_MSB;
   4396  1.1  mrg 	  r->sig[SIGSZ-1] = image0;
   4397  1.1  mrg 	}
   4398  1.1  mrg       else
   4399  1.1  mrg 	{
   4400  1.1  mrg 	  r->sig[SIGSZ-1] = image0;
   4401  1.1  mrg 	  r->sig[SIGSZ-2] = image1;
   4402  1.1  mrg 	  lshift_significand (r, r, 2*HOST_BITS_PER_LONG - 56);
   4403  1.1  mrg 	  r->sig[SIGSZ-1] |= SIG_MSB;
   4404  1.1  mrg 	}
   4405  1.1  mrg     }
   4406  1.1  mrg }
   4407  1.1  mrg 
   4408  1.1  mrg static void
   4409  1.1  mrg encode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
   4410  1.1  mrg 	      const REAL_VALUE_TYPE *r)
   4411  1.1  mrg {
   4412  1.1  mrg   unsigned long image0, image1, sign = r->sign << 15;
   4413  1.1  mrg 
   4414  1.1  mrg   switch (r->cl)
   4415  1.1  mrg     {
   4416  1.1  mrg     case rvc_zero:
   4417  1.1  mrg       image0 = image1 = 0;
   4418  1.1  mrg       break;
   4419  1.1  mrg 
   4420  1.1  mrg     case rvc_inf:
   4421  1.1  mrg     case rvc_nan:
   4422  1.1  mrg       image0 = 0xffff7fff | sign;
   4423  1.1  mrg       image1 = 0xffffffff;
   4424  1.1  mrg       break;
   4425  1.1  mrg 
   4426  1.1  mrg     case rvc_normal:
   4427  1.1  mrg       /* Extract the significand into straight hi:lo.  */
   4428  1.1  mrg       if (HOST_BITS_PER_LONG == 64)
   4429  1.1  mrg 	{
   4430  1.1  mrg 	  image0 = r->sig[SIGSZ-1];
   4431  1.1  mrg 	  image1 = (image0 >> (64 - 53)) & 0xffffffff;
   4432  1.1  mrg 	  image0 = (image0 >> (64 - 53 + 1) >> 31) & 0xfffff;
   4433  1.1  mrg 	}
   4434  1.1  mrg       else
   4435  1.1  mrg 	{
   4436  1.1  mrg 	  image0 = r->sig[SIGSZ-1];
   4437  1.1  mrg 	  image1 = r->sig[SIGSZ-2];
   4438  1.1  mrg 	  image1 = (image0 << 21) | (image1 >> 11);
   4439  1.1  mrg 	  image0 = (image0 >> 11) & 0xfffff;
   4440  1.1  mrg 	}
   4441  1.1  mrg 
   4442  1.1  mrg       /* Rearrange the half-words of the significand to match the
   4443  1.1  mrg 	 external format.  */
   4444  1.1  mrg       image0 = ((image0 << 16) | (image0 >> 16)) & 0xffff000f;
   4445  1.1  mrg       image1 = ((image1 << 16) | (image1 >> 16)) & 0xffffffff;
   4446  1.1  mrg 
   4447  1.1  mrg       /* Add the sign and exponent.  */
   4448  1.1  mrg       image0 |= sign;
   4449  1.1  mrg       image0 |= (REAL_EXP (r) + 1024) << 4;
   4450  1.1  mrg       break;
   4451  1.1  mrg 
   4452  1.1  mrg     default:
   4453  1.1  mrg       gcc_unreachable ();
   4454  1.1  mrg     }
   4455  1.1  mrg 
   4456  1.1  mrg   if (FLOAT_WORDS_BIG_ENDIAN)
   4457  1.1  mrg     buf[0] = image1, buf[1] = image0;
   4458  1.1  mrg   else
   4459  1.1  mrg     buf[0] = image0, buf[1] = image1;
   4460  1.1  mrg }
   4461  1.1  mrg 
   4462  1.1  mrg static void
   4463  1.1  mrg decode_vax_g (const struct real_format *fmt ATTRIBUTE_UNUSED,
   4464  1.1  mrg 	      REAL_VALUE_TYPE *r, const long *buf)
   4465  1.1  mrg {
   4466  1.1  mrg   unsigned long image0, image1;
   4467  1.1  mrg   int exp;
   4468  1.1  mrg 
   4469  1.1  mrg   if (FLOAT_WORDS_BIG_ENDIAN)
   4470  1.1  mrg     image1 = buf[0], image0 = buf[1];
   4471  1.1  mrg   else
   4472  1.1  mrg     image0 = buf[0], image1 = buf[1];
   4473  1.1  mrg   image0 &= 0xffffffff;
   4474  1.1  mrg   image1 &= 0xffffffff;
   4475  1.1  mrg 
   4476  1.1  mrg   exp = (image0 >> 4) & 0x7ff;
   4477  1.1  mrg 
   4478  1.1  mrg   memset (r, 0, sizeof (*r));
   4479  1.1  mrg 
   4480  1.1  mrg   if (exp != 0)
   4481  1.1  mrg     {
   4482  1.1  mrg       r->cl = rvc_normal;
   4483  1.1  mrg       r->sign = (image0 >> 15) & 1;
   4484  1.1  mrg       SET_REAL_EXP (r, exp - 1024);
   4485  1.1  mrg 
   4486  1.1  mrg       /* Rearrange the half-words of the external format into
   4487  1.1  mrg 	 proper ascending order.  */
   4488  1.1  mrg       image0 = ((image0 & 0xf) << 16) | ((image0 >> 16) & 0xffff);
   4489  1.1  mrg       image1 = ((image1 & 0xffff) << 16) | ((image1 >> 16) & 0xffff);
   4490  1.1  mrg 
   4491  1.1  mrg       if (HOST_BITS_PER_LONG == 64)
   4492  1.1  mrg 	{
   4493  1.1  mrg 	  image0 = (image0 << 31 << 1) | image1;
   4494  1.1  mrg 	  image0 <<= 64 - 53;
   4495  1.1  mrg 	  image0 |= SIG_MSB;
   4496  1.1  mrg 	  r->sig[SIGSZ-1] = image0;
   4497  1.1  mrg 	}
   4498  1.1  mrg       else
   4499  1.1  mrg 	{
   4500  1.1  mrg 	  r->sig[SIGSZ-1] = image0;
   4501  1.1  mrg 	  r->sig[SIGSZ-2] = image1;
   4502  1.1  mrg 	  lshift_significand (r, r, 64 - 53);
   4503  1.1  mrg 	  r->sig[SIGSZ-1] |= SIG_MSB;
   4504  1.1  mrg 	}
   4505  1.1  mrg     }
   4506  1.1  mrg }
   4507  1.1  mrg 
   4508  1.1  mrg const struct real_format vax_f_format =
   4509  1.1  mrg   {
   4510  1.1  mrg     encode_vax_f,
   4511  1.1  mrg     decode_vax_f,
   4512  1.1  mrg     2,
   4513  1.1  mrg     24,
   4514  1.1  mrg     24,
   4515  1.1  mrg     -127,
   4516  1.1  mrg     127,
   4517  1.1  mrg     15,
   4518  1.1  mrg     15,
   4519  1.1  mrg     0,
   4520  1.1  mrg     false,
   4521  1.1  mrg     false,
   4522  1.1  mrg     false,
   4523  1.1  mrg     false,
   4524  1.1  mrg     false,
   4525  1.1  mrg     false,
   4526  1.1  mrg     false,
   4527  1.1  mrg     false,
   4528  1.1  mrg     "vax_f"
   4529  1.1  mrg   };
   4530  1.1  mrg 
   4531  1.1  mrg const struct real_format vax_d_format =
   4532  1.1  mrg   {
   4533  1.1  mrg     encode_vax_d,
   4534  1.1  mrg     decode_vax_d,
   4535  1.1  mrg     2,
   4536  1.1  mrg     56,
   4537  1.1  mrg     56,
   4538  1.1  mrg     -127,
   4539  1.1  mrg     127,
   4540  1.1  mrg     15,
   4541  1.1  mrg     15,
   4542  1.1  mrg     0,
   4543  1.1  mrg     false,
   4544  1.1  mrg     false,
   4545  1.1  mrg     false,
   4546  1.1  mrg     false,
   4547  1.1  mrg     false,
   4548  1.1  mrg     false,
   4549  1.1  mrg     false,
   4550  1.1  mrg     false,
   4551  1.1  mrg     "vax_d"
   4552  1.1  mrg   };
   4553  1.1  mrg 
   4554  1.1  mrg const struct real_format vax_g_format =
   4555  1.1  mrg   {
   4556  1.1  mrg     encode_vax_g,
   4557  1.1  mrg     decode_vax_g,
   4558  1.1  mrg     2,
   4559  1.1  mrg     53,
   4560  1.1  mrg     53,
   4561  1.1  mrg     -1023,
   4562  1.1  mrg     1023,
   4563  1.1  mrg     15,
   4564  1.1  mrg     15,
   4565  1.1  mrg     0,
   4566  1.1  mrg     false,
   4567  1.1  mrg     false,
   4568  1.1  mrg     false,
   4569  1.1  mrg     false,
   4570  1.1  mrg     false,
   4571  1.1  mrg     false,
   4572  1.1  mrg     false,
   4573  1.1  mrg     false,
   4574  1.1  mrg     "vax_g"
   4575  1.1  mrg   };
   4576  1.1  mrg 
   4577  1.1  mrg /* Encode real R into a single precision DFP value in BUF.  */
   4579  1.1  mrg static void
   4580  1.1  mrg encode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
   4581  1.1  mrg                        long *buf ATTRIBUTE_UNUSED,
   4582  1.1  mrg 		       const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
   4583  1.1  mrg {
   4584  1.1  mrg   encode_decimal32 (fmt, buf, r);
   4585  1.1  mrg }
   4586  1.1  mrg 
   4587  1.1  mrg /* Decode a single precision DFP value in BUF into a real R.  */
   4588  1.1  mrg static void
   4589  1.1  mrg decode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
   4590  1.1  mrg 		       REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
   4591  1.1  mrg 		       const long *buf ATTRIBUTE_UNUSED)
   4592  1.1  mrg {
   4593  1.1  mrg   decode_decimal32 (fmt, r, buf);
   4594  1.1  mrg }
   4595  1.1  mrg 
   4596  1.1  mrg /* Encode real R into a double precision DFP value in BUF.  */
   4597  1.1  mrg static void
   4598  1.1  mrg encode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
   4599  1.1  mrg 		       long *buf ATTRIBUTE_UNUSED,
   4600  1.1  mrg 		       const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
   4601  1.1  mrg {
   4602  1.1  mrg   encode_decimal64 (fmt, buf, r);
   4603  1.1  mrg }
   4604  1.1  mrg 
   4605  1.1  mrg /* Decode a double precision DFP value in BUF into a real R.  */
   4606  1.1  mrg static void
   4607  1.1  mrg decode_decimal_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
   4608  1.1  mrg 		       REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
   4609  1.1  mrg 		       const long *buf ATTRIBUTE_UNUSED)
   4610  1.1  mrg {
   4611  1.1  mrg   decode_decimal64 (fmt, r, buf);
   4612  1.1  mrg }
   4613  1.1  mrg 
   4614  1.1  mrg /* Encode real R into a quad precision DFP value in BUF.  */
   4615  1.1  mrg static void
   4616  1.1  mrg encode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
   4617  1.1  mrg 		     long *buf ATTRIBUTE_UNUSED,
   4618  1.1  mrg 		     const REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED)
   4619  1.1  mrg {
   4620  1.1  mrg   encode_decimal128 (fmt, buf, r);
   4621  1.1  mrg }
   4622  1.1  mrg 
   4623  1.1  mrg /* Decode a quad precision DFP value in BUF into a real R.  */
   4624  1.1  mrg static void
   4625  1.1  mrg decode_decimal_quad (const struct real_format *fmt ATTRIBUTE_UNUSED,
   4626  1.1  mrg 		     REAL_VALUE_TYPE *r ATTRIBUTE_UNUSED,
   4627  1.1  mrg 		     const long *buf ATTRIBUTE_UNUSED)
   4628  1.1  mrg {
   4629  1.1  mrg   decode_decimal128 (fmt, r, buf);
   4630  1.1  mrg }
   4631  1.1  mrg 
   4632  1.1  mrg /* Single precision decimal floating point (IEEE 754). */
   4633  1.1  mrg const struct real_format decimal_single_format =
   4634  1.1  mrg   {
   4635  1.1  mrg     encode_decimal_single,
   4636  1.1  mrg     decode_decimal_single,
   4637  1.1  mrg     10,
   4638  1.1  mrg     7,
   4639  1.1  mrg     7,
   4640  1.1  mrg     -94,
   4641  1.1  mrg     97,
   4642  1.1  mrg     31,
   4643  1.1  mrg     31,
   4644  1.1  mrg     32,
   4645  1.1  mrg     false,
   4646  1.1  mrg     true,
   4647  1.1  mrg     true,
   4648  1.1  mrg     true,
   4649  1.1  mrg     true,
   4650  1.1  mrg     true,
   4651  1.1  mrg     true,
   4652  1.1  mrg     false,
   4653  1.1  mrg     "decimal_single"
   4654  1.1  mrg   };
   4655  1.1  mrg 
   4656  1.1  mrg /* Double precision decimal floating point (IEEE 754). */
   4657  1.1  mrg const struct real_format decimal_double_format =
   4658  1.1  mrg   {
   4659  1.1  mrg     encode_decimal_double,
   4660  1.1  mrg     decode_decimal_double,
   4661  1.1  mrg     10,
   4662  1.1  mrg     16,
   4663  1.1  mrg     16,
   4664  1.1  mrg     -382,
   4665  1.1  mrg     385,
   4666  1.1  mrg     63,
   4667  1.1  mrg     63,
   4668  1.1  mrg     64,
   4669  1.1  mrg     false,
   4670  1.1  mrg     true,
   4671  1.1  mrg     true,
   4672  1.1  mrg     true,
   4673  1.1  mrg     true,
   4674  1.1  mrg     true,
   4675  1.1  mrg     true,
   4676  1.1  mrg     false,
   4677  1.1  mrg     "decimal_double"
   4678  1.1  mrg   };
   4679  1.1  mrg 
   4680  1.1  mrg /* Quad precision decimal floating point (IEEE 754). */
   4681  1.1  mrg const struct real_format decimal_quad_format =
   4682  1.1  mrg   {
   4683  1.1  mrg     encode_decimal_quad,
   4684  1.1  mrg     decode_decimal_quad,
   4685  1.1  mrg     10,
   4686  1.1  mrg     34,
   4687  1.1  mrg     34,
   4688  1.1  mrg     -6142,
   4689  1.1  mrg     6145,
   4690  1.1  mrg     127,
   4691  1.1  mrg     127,
   4692  1.1  mrg     128,
   4693  1.1  mrg     false,
   4694  1.1  mrg     true,
   4695  1.1  mrg     true,
   4696  1.1  mrg     true,
   4697  1.1  mrg     true,
   4698  1.1  mrg     true,
   4699  1.1  mrg     true,
   4700  1.1  mrg     false,
   4701  1.1  mrg     "decimal_quad"
   4702  1.1  mrg   };
   4703  1.1  mrg 
   4704  1.1  mrg /* Encode half-precision floats.  This routine is used both for the IEEE
   4706  1.1  mrg    ARM alternative encodings.  */
   4707  1.1  mrg static void
   4708  1.1  mrg encode_ieee_half (const struct real_format *fmt, long *buf,
   4709  1.1  mrg 		  const REAL_VALUE_TYPE *r)
   4710  1.1  mrg {
   4711  1.1  mrg   unsigned long image, sig, exp;
   4712  1.1  mrg   unsigned long sign = r->sign;
   4713  1.1  mrg   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
   4714  1.1  mrg 
   4715  1.1  mrg   image = sign << 15;
   4716  1.1  mrg   sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 11)) & 0x3ff;
   4717  1.1  mrg 
   4718  1.1  mrg   switch (r->cl)
   4719  1.1  mrg     {
   4720  1.1  mrg     case rvc_zero:
   4721  1.1  mrg       break;
   4722  1.1  mrg 
   4723  1.1  mrg     case rvc_inf:
   4724  1.1  mrg       if (fmt->has_inf)
   4725  1.1  mrg 	image |= 31 << 10;
   4726  1.1  mrg       else
   4727  1.1  mrg 	image |= 0x7fff;
   4728  1.1  mrg       break;
   4729  1.1  mrg 
   4730  1.1  mrg     case rvc_nan:
   4731  1.1  mrg       if (fmt->has_nans)
   4732  1.1  mrg 	{
   4733  1.1  mrg 	  if (r->canonical)
   4734  1.1  mrg 	    sig = (fmt->canonical_nan_lsbs_set ? (1 << 9) - 1 : 0);
   4735  1.1  mrg 	  if (r->signalling == fmt->qnan_msb_set)
   4736  1.1  mrg 	    sig &= ~(1 << 9);
   4737  1.1  mrg 	  else
   4738  1.1  mrg 	    sig |= 1 << 9;
   4739  1.1  mrg 	  if (sig == 0)
   4740  1.1  mrg 	    sig = 1 << 8;
   4741  1.1  mrg 
   4742  1.1  mrg 	  image |= 31 << 10;
   4743  1.1  mrg 	  image |= sig;
   4744  1.1  mrg 	}
   4745  1.1  mrg       else
   4746  1.1  mrg 	image |= 0x3ff;
   4747  1.1  mrg       break;
   4748  1.1  mrg 
   4749  1.1  mrg     case rvc_normal:
   4750  1.1  mrg       /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
   4751  1.1  mrg 	 whereas the intermediate representation is 0.F x 2**exp.
   4752  1.1  mrg 	 Which means we're off by one.  */
   4753  1.1  mrg       if (denormal)
   4754  1.1  mrg 	exp = 0;
   4755  1.1  mrg       else
   4756  1.1  mrg 	exp = REAL_EXP (r) + 15 - 1;
   4757  1.1  mrg       image |= exp << 10;
   4758  1.1  mrg       image |= sig;
   4759  1.1  mrg       break;
   4760  1.1  mrg 
   4761  1.1  mrg     default:
   4762  1.1  mrg       gcc_unreachable ();
   4763  1.1  mrg     }
   4764  1.1  mrg 
   4765  1.1  mrg   buf[0] = image;
   4766  1.1  mrg }
   4767  1.1  mrg 
   4768  1.1  mrg /* Decode half-precision floats.  This routine is used both for the IEEE
   4769  1.1  mrg    ARM alternative encodings.  */
   4770  1.1  mrg static void
   4771  1.1  mrg decode_ieee_half (const struct real_format *fmt, REAL_VALUE_TYPE *r,
   4772  1.1  mrg 		  const long *buf)
   4773  1.1  mrg {
   4774  1.1  mrg   unsigned long image = buf[0] & 0xffff;
   4775  1.1  mrg   bool sign = (image >> 15) & 1;
   4776  1.1  mrg   int exp = (image >> 10) & 0x1f;
   4777  1.1  mrg 
   4778  1.1  mrg   memset (r, 0, sizeof (*r));
   4779  1.1  mrg   image <<= HOST_BITS_PER_LONG - 11;
   4780  1.1  mrg   image &= ~SIG_MSB;
   4781  1.1  mrg 
   4782  1.1  mrg   if (exp == 0)
   4783  1.1  mrg     {
   4784  1.1  mrg       if (image && fmt->has_denorm)
   4785  1.1  mrg 	{
   4786  1.1  mrg 	  r->cl = rvc_normal;
   4787  1.1  mrg 	  r->sign = sign;
   4788  1.1  mrg 	  SET_REAL_EXP (r, -14);
   4789  1.1  mrg 	  r->sig[SIGSZ-1] = image << 1;
   4790  1.1  mrg 	  normalize (r);
   4791  1.1  mrg 	}
   4792  1.1  mrg       else if (fmt->has_signed_zero)
   4793  1.1  mrg 	r->sign = sign;
   4794  1.1  mrg     }
   4795  1.1  mrg   else if (exp == 31 && (fmt->has_nans || fmt->has_inf))
   4796  1.1  mrg     {
   4797  1.1  mrg       if (image)
   4798  1.1  mrg 	{
   4799  1.1  mrg 	  r->cl = rvc_nan;
   4800  1.1  mrg 	  r->sign = sign;
   4801  1.1  mrg 	  r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
   4802  1.1  mrg 			   ^ fmt->qnan_msb_set);
   4803  1.1  mrg 	  r->sig[SIGSZ-1] = image;
   4804  1.1  mrg 	}
   4805  1.1  mrg       else
   4806  1.1  mrg 	{
   4807  1.1  mrg 	  r->cl = rvc_inf;
   4808  1.1  mrg 	  r->sign = sign;
   4809  1.1  mrg 	}
   4810  1.1  mrg     }
   4811  1.1  mrg   else
   4812  1.1  mrg     {
   4813  1.1  mrg       r->cl = rvc_normal;
   4814  1.1  mrg       r->sign = sign;
   4815  1.1  mrg       SET_REAL_EXP (r, exp - 15 + 1);
   4816  1.1  mrg       r->sig[SIGSZ-1] = image | SIG_MSB;
   4817  1.1  mrg     }
   4818  1.1  mrg }
   4819  1.1  mrg 
   4820  1.1  mrg /* Encode arm_bfloat types.  */
   4821  1.1  mrg static void
   4822  1.1  mrg encode_arm_bfloat_half (const struct real_format *fmt, long *buf,
   4823  1.1  mrg 		    const REAL_VALUE_TYPE *r)
   4824  1.1  mrg {
   4825  1.1  mrg   unsigned long image, sig, exp;
   4826  1.1  mrg   unsigned long sign = r->sign;
   4827  1.1  mrg   bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
   4828  1.1  mrg 
   4829  1.1  mrg   image = sign << 15;
   4830  1.1  mrg   sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 8)) & 0x7f;
   4831  1.1  mrg 
   4832  1.1  mrg   switch (r->cl)
   4833  1.1  mrg     {
   4834  1.1  mrg     case rvc_zero:
   4835  1.1  mrg       break;
   4836  1.1  mrg 
   4837  1.1  mrg     case rvc_inf:
   4838  1.1  mrg       if (fmt->has_inf)
   4839  1.1  mrg 	image |= 255 << 7;
   4840  1.1  mrg       else
   4841  1.1  mrg 	image |= 0x7fff;
   4842  1.1  mrg       break;
   4843  1.1  mrg 
   4844  1.1  mrg     case rvc_nan:
   4845  1.1  mrg       if (fmt->has_nans)
   4846  1.1  mrg 	{
   4847  1.1  mrg 	  if (r->canonical)
   4848  1.1  mrg 	    sig = (fmt->canonical_nan_lsbs_set ? (1 << 6) - 1 : 0);
   4849  1.1  mrg 	  if (r->signalling == fmt->qnan_msb_set)
   4850  1.1  mrg 	    sig &= ~(1 << 6);
   4851  1.1  mrg 	  else
   4852  1.1  mrg 	    sig |= 1 << 6;
   4853  1.1  mrg 	  if (sig == 0)
   4854  1.1  mrg 	    sig = 1 << 5;
   4855  1.1  mrg 
   4856  1.1  mrg 	  image |= 255 << 7;
   4857  1.1  mrg 	  image |= sig;
   4858  1.1  mrg 	}
   4859  1.1  mrg       else
   4860  1.1  mrg 	image |= 0x7fff;
   4861  1.1  mrg       break;
   4862  1.1  mrg 
   4863  1.1  mrg     case rvc_normal:
   4864  1.1  mrg       if (denormal)
   4865  1.1  mrg 	exp = 0;
   4866  1.1  mrg       else
   4867  1.1  mrg       exp = REAL_EXP (r) + 127 - 1;
   4868  1.1  mrg       image |= exp << 7;
   4869  1.1  mrg       image |= sig;
   4870  1.1  mrg       break;
   4871  1.1  mrg 
   4872  1.1  mrg     default:
   4873  1.1  mrg       gcc_unreachable ();
   4874  1.1  mrg     }
   4875  1.1  mrg 
   4876  1.1  mrg   buf[0] = image;
   4877  1.1  mrg }
   4878  1.1  mrg 
   4879  1.1  mrg /* Decode arm_bfloat types.  */
   4880  1.1  mrg static void
   4881  1.1  mrg decode_arm_bfloat_half (const struct real_format *fmt, REAL_VALUE_TYPE *r,
   4882  1.1  mrg 		    const long *buf)
   4883  1.1  mrg {
   4884  1.1  mrg   unsigned long image = buf[0] & 0xffff;
   4885  1.1  mrg   bool sign = (image >> 15) & 1;
   4886  1.1  mrg   int exp = (image >> 7) & 0xff;
   4887  1.1  mrg 
   4888  1.1  mrg   memset (r, 0, sizeof (*r));
   4889  1.1  mrg   image <<= HOST_BITS_PER_LONG - 8;
   4890  1.1  mrg   image &= ~SIG_MSB;
   4891  1.1  mrg 
   4892  1.1  mrg   if (exp == 0)
   4893  1.1  mrg     {
   4894  1.1  mrg       if (image && fmt->has_denorm)
   4895  1.1  mrg 	{
   4896  1.1  mrg 	  r->cl = rvc_normal;
   4897  1.1  mrg 	  r->sign = sign;
   4898  1.1  mrg 	  SET_REAL_EXP (r, -126);
   4899  1.1  mrg 	  r->sig[SIGSZ-1] = image << 1;
   4900  1.1  mrg 	  normalize (r);
   4901  1.1  mrg 	}
   4902  1.1  mrg       else if (fmt->has_signed_zero)
   4903  1.1  mrg 	r->sign = sign;
   4904  1.1  mrg     }
   4905  1.1  mrg   else if (exp == 255 && (fmt->has_nans || fmt->has_inf))
   4906  1.1  mrg     {
   4907  1.1  mrg       if (image)
   4908  1.1  mrg 	{
   4909  1.1  mrg 	  r->cl = rvc_nan;
   4910  1.1  mrg 	  r->sign = sign;
   4911  1.1  mrg 	  r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
   4912  1.1  mrg 			   ^ fmt->qnan_msb_set);
   4913  1.1  mrg 	  r->sig[SIGSZ-1] = image;
   4914  1.1  mrg 	}
   4915  1.1  mrg       else
   4916  1.1  mrg 	{
   4917  1.1  mrg 	  r->cl = rvc_inf;
   4918  1.1  mrg 	  r->sign = sign;
   4919  1.1  mrg 	}
   4920  1.1  mrg     }
   4921  1.1  mrg   else
   4922  1.1  mrg     {
   4923  1.1  mrg       r->cl = rvc_normal;
   4924  1.1  mrg       r->sign = sign;
   4925  1.1  mrg       SET_REAL_EXP (r, exp - 127 + 1);
   4926  1.1  mrg       r->sig[SIGSZ-1] = image | SIG_MSB;
   4927  1.1  mrg     }
   4928  1.1  mrg }
   4929  1.1  mrg 
   4930  1.1  mrg /* Half-precision format, as specified in IEEE 754R.  */
   4931  1.1  mrg const struct real_format ieee_half_format =
   4932  1.1  mrg   {
   4933  1.1  mrg     encode_ieee_half,
   4934  1.1  mrg     decode_ieee_half,
   4935  1.1  mrg     2,
   4936  1.1  mrg     11,
   4937  1.1  mrg     11,
   4938  1.1  mrg     -13,
   4939  1.1  mrg     16,
   4940  1.1  mrg     15,
   4941  1.1  mrg     15,
   4942  1.1  mrg     16,
   4943  1.1  mrg     false,
   4944  1.1  mrg     true,
   4945  1.1  mrg     true,
   4946  1.1  mrg     true,
   4947  1.1  mrg     true,
   4948  1.1  mrg     true,
   4949  1.1  mrg     true,
   4950  1.1  mrg     false,
   4951  1.1  mrg     "ieee_half"
   4952  1.1  mrg   };
   4953  1.1  mrg 
   4954  1.1  mrg /* ARM's alternative half-precision format, similar to IEEE but with
   4955  1.1  mrg    no reserved exponent value for NaNs and infinities; rather, it just
   4956  1.1  mrg    extends the range of exponents by one.  */
   4957  1.1  mrg const struct real_format arm_half_format =
   4958  1.1  mrg   {
   4959  1.1  mrg     encode_ieee_half,
   4960  1.1  mrg     decode_ieee_half,
   4961  1.1  mrg     2,
   4962  1.1  mrg     11,
   4963  1.1  mrg     11,
   4964  1.1  mrg     -13,
   4965  1.1  mrg     17,
   4966  1.1  mrg     15,
   4967  1.1  mrg     15,
   4968  1.1  mrg     0,
   4969  1.1  mrg     false,
   4970  1.1  mrg     true,
   4971  1.1  mrg     false,
   4972  1.1  mrg     false,
   4973  1.1  mrg     true,
   4974  1.1  mrg     true,
   4975  1.1  mrg     false,
   4976  1.1  mrg     false,
   4977  1.1  mrg     "arm_half"
   4978  1.1  mrg   };
   4979  1.1  mrg 
   4980  1.1  mrg /* ARM Bfloat half-precision format.  This format resembles a truncated
   4981  1.1  mrg    (16-bit) version of the 32-bit IEEE 754 single-precision floating-point
   4982  1.1  mrg    format.  */
   4983  1.1  mrg const struct real_format arm_bfloat_half_format =
   4984  1.1  mrg   {
   4985  1.1  mrg     encode_arm_bfloat_half,
   4986  1.1  mrg     decode_arm_bfloat_half,
   4987  1.1  mrg     2,
   4988  1.1  mrg     8,
   4989  1.1  mrg     8,
   4990  1.1  mrg     -125,
   4991  1.1  mrg     128,
   4992  1.1  mrg     15,
   4993  1.1  mrg     15,
   4994  1.1  mrg     0,
   4995  1.1  mrg     false,
   4996  1.1  mrg     true,
   4997  1.1  mrg     true,
   4998  1.1  mrg     true,
   4999  1.1  mrg     true,
   5000  1.1  mrg     true,
   5001  1.1  mrg     true,
   5002  1.1  mrg     false,
   5003  1.1  mrg     "arm_bfloat_half"
   5004  1.1  mrg   };
   5005  1.1  mrg 
   5006  1.1  mrg 
   5007  1.1  mrg /* A synthetic "format" for internal arithmetic.  It's the size of the
   5009  1.1  mrg    internal significand minus the two bits needed for proper rounding.
   5010  1.1  mrg    The encode and decode routines exist only to satisfy our paranoia
   5011  1.1  mrg    harness.  */
   5012  1.1  mrg 
   5013  1.1  mrg static void encode_internal (const struct real_format *fmt,
   5014  1.1  mrg 			     long *, const REAL_VALUE_TYPE *);
   5015  1.1  mrg static void decode_internal (const struct real_format *,
   5016  1.1  mrg 			     REAL_VALUE_TYPE *, const long *);
   5017  1.1  mrg 
   5018  1.1  mrg static void
   5019  1.1  mrg encode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED, long *buf,
   5020  1.1  mrg 		 const REAL_VALUE_TYPE *r)
   5021  1.1  mrg {
   5022  1.1  mrg   memcpy (buf, r, sizeof (*r));
   5023  1.1  mrg }
   5024  1.1  mrg 
   5025  1.1  mrg static void
   5026  1.1  mrg decode_internal (const struct real_format *fmt ATTRIBUTE_UNUSED,
   5027  1.1  mrg 		 REAL_VALUE_TYPE *r, const long *buf)
   5028  1.1  mrg {
   5029  1.1  mrg   memcpy (r, buf, sizeof (*r));
   5030  1.1  mrg }
   5031  1.1  mrg 
   5032  1.1  mrg const struct real_format real_internal_format =
   5033  1.1  mrg   {
   5034  1.1  mrg     encode_internal,
   5035  1.1  mrg     decode_internal,
   5036  1.1  mrg     2,
   5037  1.1  mrg     SIGNIFICAND_BITS - 2,
   5038  1.1  mrg     SIGNIFICAND_BITS - 2,
   5039  1.1  mrg     -MAX_EXP,
   5040  1.1  mrg     MAX_EXP,
   5041  1.1  mrg     -1,
   5042  1.1  mrg     -1,
   5043  1.1  mrg     0,
   5044  1.1  mrg     false,
   5045  1.1  mrg     false,
   5046  1.1  mrg     true,
   5047  1.1  mrg     true,
   5048  1.1  mrg     false,
   5049  1.1  mrg     true,
   5050  1.1  mrg     true,
   5051  1.1  mrg     false,
   5052  1.1  mrg     "real_internal"
   5053  1.1  mrg   };
   5054  1.1  mrg 
   5055  1.1  mrg /* Calculate X raised to the integer exponent N in format FMT and store
   5057  1.1  mrg    the result in R.  Return true if the result may be inexact due to
   5058  1.1  mrg    loss of precision.  The algorithm is the classic "left-to-right binary
   5059  1.1  mrg    method" described in section 4.6.3 of Donald Knuth's "Seminumerical
   5060  1.1  mrg    Algorithms", "The Art of Computer Programming", Volume 2.  */
   5061  1.1  mrg 
   5062  1.1  mrg bool
   5063  1.1  mrg real_powi (REAL_VALUE_TYPE *r, format_helper fmt,
   5064  1.1  mrg 	   const REAL_VALUE_TYPE *x, HOST_WIDE_INT n)
   5065  1.1  mrg {
   5066  1.1  mrg   unsigned HOST_WIDE_INT bit;
   5067  1.1  mrg   REAL_VALUE_TYPE t;
   5068  1.1  mrg   bool inexact = false;
   5069  1.1  mrg   bool init = false;
   5070  1.1  mrg   bool neg;
   5071  1.1  mrg   int i;
   5072  1.1  mrg 
   5073  1.1  mrg   if (n == 0)
   5074  1.1  mrg     {
   5075  1.1  mrg       *r = dconst1;
   5076  1.1  mrg       return false;
   5077  1.1  mrg     }
   5078  1.1  mrg   else if (n < 0)
   5079  1.1  mrg     {
   5080  1.1  mrg       /* Don't worry about overflow, from now on n is unsigned.  */
   5081  1.1  mrg       neg = true;
   5082  1.1  mrg       n = -n;
   5083  1.1  mrg     }
   5084  1.1  mrg   else
   5085  1.1  mrg     neg = false;
   5086  1.1  mrg 
   5087  1.1  mrg   t = *x;
   5088  1.1  mrg   bit = HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1);
   5089  1.1  mrg   for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
   5090  1.1  mrg     {
   5091  1.1  mrg       if (init)
   5092  1.1  mrg 	{
   5093  1.1  mrg 	  inexact |= do_multiply (&t, &t, &t);
   5094  1.1  mrg 	  if (n & bit)
   5095  1.1  mrg 	    inexact |= do_multiply (&t, &t, x);
   5096  1.1  mrg 	}
   5097  1.1  mrg       else if (n & bit)
   5098  1.1  mrg 	init = true;
   5099  1.1  mrg       bit >>= 1;
   5100  1.1  mrg     }
   5101  1.1  mrg 
   5102  1.1  mrg   if (neg)
   5103  1.1  mrg     inexact |= do_divide (&t, &dconst1, &t);
   5104  1.1  mrg 
   5105  1.1  mrg   real_convert (r, fmt, &t);
   5106  1.1  mrg   return inexact;
   5107  1.1  mrg }
   5108  1.1  mrg 
   5109  1.1  mrg /* Round X to the nearest integer not larger in absolute value, i.e.
   5110  1.1  mrg    towards zero, placing the result in R in format FMT.  */
   5111  1.1  mrg 
   5112  1.1  mrg void
   5113  1.1  mrg real_trunc (REAL_VALUE_TYPE *r, format_helper fmt,
   5114  1.1  mrg 	    const REAL_VALUE_TYPE *x)
   5115  1.1  mrg {
   5116  1.1  mrg   do_fix_trunc (r, x);
   5117  1.1  mrg   if (fmt)
   5118  1.1  mrg     real_convert (r, fmt, r);
   5119  1.1  mrg }
   5120  1.1  mrg 
   5121  1.1  mrg /* Round X to the largest integer not greater in value, i.e. round
   5122  1.1  mrg    down, placing the result in R in format FMT.  */
   5123  1.1  mrg 
   5124  1.1  mrg void
   5125  1.1  mrg real_floor (REAL_VALUE_TYPE *r, format_helper fmt,
   5126  1.1  mrg 	    const REAL_VALUE_TYPE *x)
   5127  1.1  mrg {
   5128  1.1  mrg   REAL_VALUE_TYPE t;
   5129  1.1  mrg 
   5130  1.1  mrg   do_fix_trunc (&t, x);
   5131  1.1  mrg   if (! real_identical (&t, x) && x->sign)
   5132  1.1  mrg     do_add (&t, &t, &dconstm1, 0);
   5133  1.1  mrg   if (fmt)
   5134  1.1  mrg     real_convert (r, fmt, &t);
   5135  1.1  mrg   else
   5136  1.1  mrg     *r = t;
   5137  1.1  mrg }
   5138  1.1  mrg 
   5139  1.1  mrg /* Round X to the smallest integer not less then argument, i.e. round
   5140  1.1  mrg    up, placing the result in R in format FMT.  */
   5141  1.1  mrg 
   5142  1.1  mrg void
   5143  1.1  mrg real_ceil (REAL_VALUE_TYPE *r, format_helper fmt,
   5144  1.1  mrg 	   const REAL_VALUE_TYPE *x)
   5145  1.1  mrg {
   5146  1.1  mrg   REAL_VALUE_TYPE t;
   5147  1.1  mrg 
   5148  1.1  mrg   do_fix_trunc (&t, x);
   5149  1.1  mrg   if (! real_identical (&t, x) && ! x->sign)
   5150  1.1  mrg     do_add (&t, &t, &dconst1, 0);
   5151  1.1  mrg   if (fmt)
   5152  1.1  mrg     real_convert (r, fmt, &t);
   5153  1.1  mrg   else
   5154  1.1  mrg     *r = t;
   5155  1.1  mrg }
   5156  1.1  mrg 
   5157  1.1  mrg /* Round X to the nearest integer, but round halfway cases away from
   5158  1.1  mrg    zero.  */
   5159  1.1  mrg 
   5160  1.1  mrg void
   5161  1.1  mrg real_round (REAL_VALUE_TYPE *r, format_helper fmt,
   5162  1.1  mrg 	    const REAL_VALUE_TYPE *x)
   5163  1.1  mrg {
   5164  1.1  mrg   do_add (r, x, &dconsthalf, x->sign);
   5165  1.1  mrg   do_fix_trunc (r, r);
   5166  1.1  mrg   if (fmt)
   5167  1.1  mrg     real_convert (r, fmt, r);
   5168  1.1  mrg }
   5169  1.1  mrg 
   5170  1.1  mrg /* Return true (including 0) if integer part of R is even, else return
   5171  1.1  mrg    false.  The function is not valid for rvc_inf and rvc_nan classes.  */
   5172  1.1  mrg 
   5173  1.1  mrg static bool
   5174  1.1  mrg is_even (REAL_VALUE_TYPE *r)
   5175  1.1  mrg {
   5176  1.1  mrg   gcc_assert (r->cl != rvc_inf);
   5177  1.1  mrg   gcc_assert (r->cl != rvc_nan);
   5178  1.1  mrg 
   5179  1.1  mrg   if (r->cl == rvc_zero)
   5180  1.1  mrg     return true;
   5181  1.1  mrg 
   5182  1.1  mrg   /* For (-1,1), number is even.  */
   5183  1.1  mrg   if (REAL_EXP (r) <= 0)
   5184  1.1  mrg     return true;
   5185  1.1  mrg 
   5186  1.1  mrg   /* Check lowest bit, if not set, return true.  */
   5187  1.1  mrg   else if (REAL_EXP (r) <= SIGNIFICAND_BITS)
   5188  1.1  mrg     {
   5189  1.1  mrg       unsigned int n = SIGNIFICAND_BITS - REAL_EXP (r);
   5190  1.1  mrg       int w = n / HOST_BITS_PER_LONG;
   5191  1.1  mrg 
   5192  1.1  mrg       unsigned long num = ((unsigned long)1 << (n % HOST_BITS_PER_LONG));
   5193  1.1  mrg 
   5194  1.1  mrg       if ((r->sig[w] & num) == 0)
   5195  1.1  mrg 	return true;
   5196  1.1  mrg     }
   5197  1.1  mrg   else
   5198  1.1  mrg     return true;
   5199  1.1  mrg 
   5200  1.1  mrg   return false;
   5201  1.1  mrg }
   5202  1.1  mrg 
   5203  1.1  mrg /* Return true if R is halfway between two integers, else return
   5204  1.1  mrg    false.  */
   5205  1.1  mrg 
   5206  1.1  mrg static bool
   5207  1.1  mrg is_halfway_below (const REAL_VALUE_TYPE *r)
   5208  1.1  mrg {
   5209  1.1  mrg   if (r->cl != rvc_normal)
   5210  1.1  mrg     return false;
   5211  1.1  mrg 
   5212  1.1  mrg   /* For numbers (-0.5,0) and (0,0.5).  */
   5213  1.1  mrg   if (REAL_EXP (r) < 0)
   5214  1.1  mrg     return false;
   5215  1.1  mrg 
   5216  1.1  mrg   else if (REAL_EXP (r) < SIGNIFICAND_BITS)
   5217  1.1  mrg     {
   5218  1.1  mrg       unsigned int n = SIGNIFICAND_BITS - REAL_EXP (r) - 1;
   5219  1.1  mrg       int w = n / HOST_BITS_PER_LONG;
   5220  1.1  mrg 
   5221  1.1  mrg       for (int i = 0; i < w; ++i)
   5222  1.1  mrg 	if (r->sig[i] != 0)
   5223  1.1  mrg 	  return false;
   5224  1.1  mrg 
   5225  1.1  mrg       unsigned long num = 1UL << (n % HOST_BITS_PER_LONG);
   5226  1.1  mrg 
   5227  1.1  mrg       if ((r->sig[w] & num) != 0 && (r->sig[w] & (num - 1)) == 0)
   5228  1.1  mrg 	return true;
   5229  1.1  mrg     }
   5230  1.1  mrg   return false;
   5231  1.1  mrg }
   5232  1.1  mrg 
   5233  1.1  mrg /* Round X to nearest integer, rounding halfway cases towards even.  */
   5234  1.1  mrg 
   5235  1.1  mrg void
   5236  1.1  mrg real_roundeven (REAL_VALUE_TYPE *r, format_helper fmt,
   5237  1.1  mrg 		const REAL_VALUE_TYPE *x)
   5238  1.1  mrg {
   5239  1.1  mrg   if (is_halfway_below (x))
   5240  1.1  mrg     {
   5241  1.1  mrg       /* Special case as -0.5 rounds to -0.0 and
   5242  1.1  mrg 	 similarly +0.5 rounds to +0.0.  */
   5243  1.1  mrg       if (REAL_EXP (x) == 0)
   5244  1.1  mrg 	{
   5245  1.1  mrg 	  *r = *x;
   5246  1.1  mrg 	  clear_significand_below (r, SIGNIFICAND_BITS);
   5247  1.1  mrg 	}
   5248  1.1  mrg       else
   5249  1.1  mrg 	{
   5250  1.1  mrg 	  do_add (r, x, &dconsthalf, x->sign);
   5251  1.1  mrg 	  if (!is_even (r))
   5252  1.1  mrg 	    do_add (r, r, &dconstm1, x->sign);
   5253  1.1  mrg 	}
   5254  1.1  mrg       if (fmt)
   5255  1.1  mrg 	real_convert (r, fmt, r);
   5256  1.1  mrg     }
   5257  1.1  mrg   else
   5258  1.1  mrg     real_round (r, fmt, x);
   5259  1.1  mrg }
   5260  1.1  mrg 
   5261  1.1  mrg /* Set the sign of R to the sign of X.  */
   5262  1.1  mrg 
   5263  1.1  mrg void
   5264  1.1  mrg real_copysign (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *x)
   5265  1.1  mrg {
   5266  1.1  mrg   r->sign = x->sign;
   5267  1.1  mrg }
   5268  1.1  mrg 
   5269  1.1  mrg /* Check whether the real constant value given is an integer.
   5270  1.1  mrg    Returns false for signaling NaN.  */
   5271  1.1  mrg 
   5272  1.1  mrg bool
   5273  1.1  mrg real_isinteger (const REAL_VALUE_TYPE *c, format_helper fmt)
   5274  1.1  mrg {
   5275  1.1  mrg   REAL_VALUE_TYPE cint;
   5276  1.1  mrg 
   5277  1.1  mrg   real_trunc (&cint, fmt, c);
   5278  1.1  mrg   return real_identical (c, &cint);
   5279  1.1  mrg }
   5280  1.1  mrg 
   5281  1.1  mrg /* Check whether C is an integer that fits in a HOST_WIDE_INT,
   5282  1.1  mrg    storing it in *INT_OUT if so.  */
   5283  1.1  mrg 
   5284  1.1  mrg bool
   5285  1.1  mrg real_isinteger (const REAL_VALUE_TYPE *c, HOST_WIDE_INT *int_out)
   5286  1.1  mrg {
   5287  1.1  mrg   REAL_VALUE_TYPE cint;
   5288  1.1  mrg 
   5289  1.1  mrg   HOST_WIDE_INT n = real_to_integer (c);
   5290  1.1  mrg   real_from_integer (&cint, VOIDmode, n, SIGNED);
   5291  1.1  mrg   if (real_identical (c, &cint))
   5292  1.1  mrg     {
   5293  1.1  mrg       *int_out = n;
   5294  1.1  mrg       return true;
   5295  1.1  mrg     }
   5296  1.1  mrg   return false;
   5297  1.1  mrg }
   5298  1.1  mrg 
   5299  1.1  mrg /* Calculate nextafter (X, Y) or nexttoward (X, Y).  Return true if
   5300  1.1  mrg    underflow or overflow needs to be raised.  */
   5301  1.1  mrg 
   5302  1.1  mrg bool
   5303  1.1  mrg real_nextafter (REAL_VALUE_TYPE *r, format_helper fmt,
   5304  1.1  mrg 		const REAL_VALUE_TYPE *x, const REAL_VALUE_TYPE *y)
   5305  1.1  mrg {
   5306  1.1  mrg   int cmp = do_compare (x, y, 2);
   5307  1.1  mrg   /* If either operand is NaN, return qNaN.  */
   5308  1.1  mrg   if (cmp == 2)
   5309  1.1  mrg     {
   5310  1.1  mrg       get_canonical_qnan (r, 0);
   5311  1.1  mrg       return false;
   5312  1.1  mrg     }
   5313  1.1  mrg   /* If x == y, return y cast to target type.  */
   5314  1.1  mrg   if (cmp == 0)
   5315  1.1  mrg     {
   5316  1.1  mrg       real_convert (r, fmt, y);
   5317  1.1  mrg       return false;
   5318  1.1  mrg     }
   5319  1.1  mrg 
   5320  1.1  mrg   if (x->cl == rvc_zero)
   5321  1.1  mrg     {
   5322  1.1  mrg       get_zero (r, y->sign);
   5323  1.1  mrg       r->cl = rvc_normal;
   5324  1.1  mrg       SET_REAL_EXP (r, fmt->emin - fmt->p + 1);
   5325  1.1  mrg       r->sig[SIGSZ - 1] = SIG_MSB;
   5326  1.1  mrg       return false;
   5327  1.1  mrg     }
   5328  1.1  mrg 
   5329  1.1  mrg   int np2 = SIGNIFICAND_BITS - fmt->p;
   5330  1.1  mrg   /* For denormals adjust np2 correspondingly.  */
   5331  1.1  mrg   if (x->cl == rvc_normal && REAL_EXP (x) < fmt->emin)
   5332  1.1  mrg     np2 += fmt->emin - REAL_EXP (x);
   5333  1.1  mrg 
   5334  1.1  mrg   REAL_VALUE_TYPE u;
   5335  1.1  mrg   get_zero (r, x->sign);
   5336  1.1  mrg   get_zero (&u, 0);
   5337  1.1  mrg   set_significand_bit (&u, np2);
   5338  1.1  mrg   r->cl = rvc_normal;
   5339  1.1  mrg   SET_REAL_EXP (r, REAL_EXP (x));
   5340  1.1  mrg 
   5341  1.1  mrg   if (x->cl == rvc_inf)
   5342  1.1  mrg     {
   5343  1.1  mrg       bool borrow = sub_significands (r, r, &u, 0);
   5344  1.1  mrg       gcc_assert (borrow);
   5345  1.1  mrg       SET_REAL_EXP (r, fmt->emax);
   5346  1.1  mrg     }
   5347  1.1  mrg   else if (cmp == (x->sign ? 1 : -1))
   5348  1.1  mrg     {
   5349  1.1  mrg       if (add_significands (r, x, &u))
   5350  1.1  mrg 	{
   5351  1.1  mrg 	  /* Overflow.  Means the significand had been all ones, and
   5352  1.1  mrg 	     is now all zeros.  Need to increase the exponent, and
   5353  1.1  mrg 	     possibly re-normalize it.  */
   5354  1.1  mrg 	  SET_REAL_EXP (r, REAL_EXP (r) + 1);
   5355  1.1  mrg 	  if (REAL_EXP (r) > fmt->emax)
   5356  1.1  mrg 	    {
   5357  1.1  mrg 	      get_inf (r, x->sign);
   5358  1.1  mrg 	      return true;
   5359  1.1  mrg 	    }
   5360  1.1  mrg 	  r->sig[SIGSZ - 1] = SIG_MSB;
   5361  1.1  mrg 	}
   5362  1.1  mrg     }
   5363  1.1  mrg   else
   5364  1.1  mrg     {
   5365  1.1  mrg       if (REAL_EXP (x) > fmt->emin && x->sig[SIGSZ - 1] == SIG_MSB)
   5366  1.1  mrg 	{
   5367  1.1  mrg 	  int i;
   5368  1.1  mrg 	  for (i = SIGSZ - 2; i >= 0; i--)
   5369  1.1  mrg 	    if (x->sig[i])
   5370  1.1  mrg 	      break;
   5371  1.1  mrg 	  if (i < 0)
   5372  1.1  mrg 	    {
   5373  1.1  mrg 	      /* When mantissa is 1.0, we need to subtract only
   5374  1.1  mrg 		 half of u: nextafter (1.0, 0.0) is 1.0 - __DBL_EPSILON__ / 2
   5375  1.1  mrg 		 rather than 1.0 - __DBL_EPSILON__.  */
   5376  1.1  mrg 	      clear_significand_bit (&u, np2);
   5377  1.1  mrg 	      np2--;
   5378  1.1  mrg 	      set_significand_bit (&u, np2);
   5379  1.1  mrg 	    }
   5380  1.1  mrg 	}
   5381  1.1  mrg       sub_significands (r, x, &u, 0);
   5382  1.1  mrg     }
   5383  1.1  mrg 
   5384  1.1  mrg   /* Clear out trailing garbage.  */
   5385  1.1  mrg   clear_significand_below (r, np2);
   5386  1.1  mrg   normalize (r);
   5387  1.1  mrg   if (REAL_EXP (r) <= fmt->emin - fmt->p)
   5388  1.1  mrg     {
   5389  1.1  mrg       get_zero (r, x->sign);
   5390  1.1  mrg       return true;
   5391  1.1  mrg     }
   5392  1.1  mrg   return r->cl == rvc_zero || REAL_EXP (r) < fmt->emin;
   5393  1.1  mrg }
   5394  1.1  mrg 
   5395  1.1  mrg /* Write into BUF the maximum representable finite floating-point
   5396  1.1  mrg    number, (1 - b**-p) * b**emax for a given FP format FMT as a hex
   5397  1.1  mrg    float string.  LEN is the size of BUF, and the buffer must be large
   5398  1.1  mrg    enough to contain the resulting string.  If NORM_MAX, instead write
   5399  1.1  mrg    the maximum representable finite normalized floating-point number,
   5400  1.1  mrg    defined to be such that all choices of digits for that exponent are
   5401  1.1  mrg    representable in the format (this only makes a difference for IBM
   5402  1.1  mrg    long double).  */
   5403  1.1  mrg 
   5404  1.1  mrg void
   5405  1.1  mrg get_max_float (const struct real_format *fmt, char *buf, size_t len,
   5406  1.1  mrg 	       bool norm_max)
   5407  1.1  mrg {
   5408  1.1  mrg   if (fmt->b == 10)
   5409  1.1  mrg     {
   5410  1.1  mrg       char *p = buf;
   5411  1.1  mrg       for (int i = fmt->p; i; i--)
   5412  1.1  mrg 	{
   5413  1.1  mrg 	  *p++ = '9';
   5414  1.1  mrg 	  if (i == fmt->p)
   5415  1.1  mrg 	    *p++ = '.';
   5416  1.1  mrg 	}
   5417  1.1  mrg       /* fmt->p plus 1, to account for the decimal point and fmt->emax
   5418  1.1  mrg 	 minus 1 because the digits are nines, not 1.0.  */
   5419  1.1  mrg       sprintf (buf + fmt->p + 1, "E%d", fmt->emax - 1);
   5420  1.1  mrg       gcc_assert (strlen (buf) < len);
   5421  1.1  mrg       return;
   5422  1.1  mrg     }
   5423  1.1  mrg 
   5424  1.1  mrg   int i, n;
   5425  1.1  mrg   char *p;
   5426  1.1  mrg   bool is_ibm_extended = fmt->pnan < fmt->p;
   5427  1.1  mrg 
   5428  1.1  mrg   strcpy (buf, "0x0.");
   5429  1.1  mrg   n = fmt->p;
   5430  1.1  mrg   for (i = 0, p = buf + 4; i + 3 < n; i += 4)
   5431  1.1  mrg     *p++ = 'f';
   5432  1.1  mrg   if (i < n)
   5433  1.1  mrg     *p++ = "08ce"[n - i];
   5434  1.1  mrg   sprintf (p, "p%d",
   5435  1.1  mrg 	   (is_ibm_extended && norm_max) ? fmt->emax - 1 : fmt->emax);
   5436  1.1  mrg   if (is_ibm_extended && !norm_max)
   5437  1.1  mrg     {
   5438  1.1  mrg       /* This is an IBM extended double format made up of two IEEE
   5439  1.1  mrg 	 doubles.  The value of the long double is the sum of the
   5440  1.1  mrg 	 values of the two parts.  The most significant part is
   5441  1.1  mrg 	 required to be the value of the long double rounded to the
   5442  1.1  mrg 	 nearest double.  Rounding means we need a slightly smaller
   5443  1.1  mrg 	 value for LDBL_MAX.  */
   5444  1.1  mrg       buf[4 + fmt->pnan / 4] = "7bde"[fmt->pnan % 4];
   5445  1.1  mrg     }
   5446  1.1  mrg 
   5447  1.1  mrg   gcc_assert (strlen (buf) < len);
   5448  1.1  mrg }
   5449  1.1  mrg 
   5450  1.1  mrg /* True if all values of integral type can be represented
   5451  1.1  mrg    by this floating-point type exactly.  */
   5452  1.1  mrg 
   5453  1.1  mrg bool format_helper::can_represent_integral_type_p (tree type) const
   5454  1.1  mrg {
   5455  1.1  mrg   gcc_assert (! decimal_p () && INTEGRAL_TYPE_P (type));
   5456  1.1  mrg 
   5457  1.1  mrg   /* INT?_MIN is power-of-two so it takes
   5458  1.1  mrg      only one mantissa bit.  */
   5459  1.1  mrg   bool signed_p = TYPE_SIGN (type) == SIGNED;
   5460  1.1  mrg   return TYPE_PRECISION (type) - signed_p <= significand_size (*this);
   5461  1.1  mrg }
   5462  1.1  mrg 
   5463  1.1  mrg /* True if mode M has a NaN representation and
   5464  1.1  mrg    the treatment of NaN operands is important.  */
   5465  1.1  mrg 
   5466  1.1  mrg bool
   5467  1.1  mrg HONOR_NANS (machine_mode m)
   5468  1.1  mrg {
   5469  1.1  mrg   return MODE_HAS_NANS (m) && !flag_finite_math_only;
   5470  1.1  mrg }
   5471  1.1  mrg 
   5472  1.1  mrg bool
   5473  1.1  mrg HONOR_NANS (const_tree t)
   5474  1.1  mrg {
   5475  1.1  mrg   return HONOR_NANS (element_mode (t));
   5476  1.1  mrg }
   5477  1.1  mrg 
   5478  1.1  mrg bool
   5479  1.1  mrg HONOR_NANS (const_rtx x)
   5480  1.1  mrg {
   5481  1.1  mrg   return HONOR_NANS (GET_MODE (x));
   5482  1.1  mrg }
   5483  1.1  mrg 
   5484  1.1  mrg /* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs).  */
   5485  1.1  mrg 
   5486  1.1  mrg bool
   5487  1.1  mrg HONOR_SNANS (machine_mode m)
   5488  1.1  mrg {
   5489  1.1  mrg   return flag_signaling_nans && HONOR_NANS (m);
   5490  1.1  mrg }
   5491  1.1  mrg 
   5492  1.1  mrg bool
   5493  1.1  mrg HONOR_SNANS (const_tree t)
   5494  1.1  mrg {
   5495  1.1  mrg   return HONOR_SNANS (element_mode (t));
   5496  1.1  mrg }
   5497  1.1  mrg 
   5498  1.1  mrg bool
   5499  1.1  mrg HONOR_SNANS (const_rtx x)
   5500  1.1  mrg {
   5501  1.1  mrg   return HONOR_SNANS (GET_MODE (x));
   5502  1.1  mrg }
   5503  1.1  mrg 
   5504  1.1  mrg /* As for HONOR_NANS, but true if the mode can represent infinity and
   5505  1.1  mrg    the treatment of infinite values is important.  */
   5506  1.1  mrg 
   5507  1.1  mrg bool
   5508  1.1  mrg HONOR_INFINITIES (machine_mode m)
   5509  1.1  mrg {
   5510  1.1  mrg   return MODE_HAS_INFINITIES (m) && !flag_finite_math_only;
   5511  1.1  mrg }
   5512  1.1  mrg 
   5513  1.1  mrg bool
   5514  1.1  mrg HONOR_INFINITIES (const_tree t)
   5515  1.1  mrg {
   5516  1.1  mrg   return HONOR_INFINITIES (element_mode (t));
   5517  1.1  mrg }
   5518  1.1  mrg 
   5519  1.1  mrg bool
   5520  1.1  mrg HONOR_INFINITIES (const_rtx x)
   5521  1.1  mrg {
   5522  1.1  mrg   return HONOR_INFINITIES (GET_MODE (x));
   5523  1.1  mrg }
   5524  1.1  mrg 
   5525  1.1  mrg /* Like HONOR_NANS, but true if the given mode distinguishes between
   5526  1.1  mrg    positive and negative zero, and the sign of zero is important.  */
   5527  1.1  mrg 
   5528  1.1  mrg bool
   5529  1.1  mrg HONOR_SIGNED_ZEROS (machine_mode m)
   5530  1.1  mrg {
   5531  1.1  mrg   return MODE_HAS_SIGNED_ZEROS (m) && flag_signed_zeros;
   5532  1.1  mrg }
   5533  1.1  mrg 
   5534  1.1  mrg bool
   5535  1.1  mrg HONOR_SIGNED_ZEROS (const_tree t)
   5536  1.1  mrg {
   5537  1.1  mrg   return HONOR_SIGNED_ZEROS (element_mode (t));
   5538  1.1  mrg }
   5539  1.1  mrg 
   5540  1.1  mrg bool
   5541  1.1  mrg HONOR_SIGNED_ZEROS (const_rtx x)
   5542  1.1  mrg {
   5543  1.1  mrg   return HONOR_SIGNED_ZEROS (GET_MODE (x));
   5544  1.1  mrg }
   5545  1.1  mrg 
   5546  1.1  mrg /* Like HONOR_NANS, but true if given mode supports sign-dependent rounding,
   5547  1.1  mrg    and the rounding mode is important.  */
   5548  1.1  mrg 
   5549  1.1  mrg bool
   5550  1.1  mrg HONOR_SIGN_DEPENDENT_ROUNDING (machine_mode m)
   5551  1.1  mrg {
   5552  1.1  mrg   return MODE_HAS_SIGN_DEPENDENT_ROUNDING (m) && flag_rounding_math;
   5553  1.1  mrg }
   5554  1.1  mrg 
   5555  1.1  mrg bool
   5556  1.1  mrg HONOR_SIGN_DEPENDENT_ROUNDING (const_tree t)
   5557  1.1  mrg {
   5558  1.1  mrg   return HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (t));
   5559  1.1  mrg }
   5560  1.1  mrg 
   5561  1.1  mrg bool
   5562  1.1  mrg HONOR_SIGN_DEPENDENT_ROUNDING (const_rtx x)
   5563  1.1  mrg {
   5564  1.1  mrg   return HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (x));
   5565  1.1  mrg }
   5566  1.1  mrg 
   5567  1.1  mrg /* Fills r with the largest value such that 1 + r*r won't overflow.
   5568  1.1  mrg    This is used in both sin (atan (x)) and cos (atan(x)) optimizations. */
   5569  1.1  mrg 
   5570  1.1  mrg void
   5571  1.1  mrg build_sinatan_real (REAL_VALUE_TYPE * r, tree type)
   5572  1.1  mrg {
   5573  1.1  mrg   REAL_VALUE_TYPE maxval;
   5574  1.1  mrg   mpfr_t mpfr_const1, mpfr_c, mpfr_maxval;
   5575  1.1  mrg   machine_mode mode = TYPE_MODE (type);
   5576  1.1  mrg   const struct real_format * fmt = REAL_MODE_FORMAT (mode);
   5577           
   5578             real_maxval (&maxval, 0, mode);
   5579           
   5580             mpfr_inits (mpfr_const1, mpfr_c, mpfr_maxval, NULL);
   5581           
   5582             mpfr_from_real (mpfr_const1, &dconst1, MPFR_RNDN);
   5583             mpfr_from_real (mpfr_maxval, &maxval,  MPFR_RNDN);
   5584           
   5585             mpfr_sub (mpfr_c, mpfr_maxval, mpfr_const1, MPFR_RNDN);
   5586             mpfr_sqrt (mpfr_c, mpfr_c, MPFR_RNDZ);
   5587           
   5588             real_from_mpfr (r, mpfr_c, fmt, MPFR_RNDZ);
   5589           
   5590             mpfr_clears (mpfr_const1, mpfr_c, mpfr_maxval, NULL);
   5591           }
   5592