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