OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [real.c] - Blame information for rev 824

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.