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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [dfp.c] - Blame information for rev 38

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

Line No. Rev Author Line
1 38 julius
/* Decimal floating point support.
2
   Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
3
 
4
This file is part of GCC.
5
 
6
GCC is free software; you can redistribute it and/or modify it under
7
the terms of the GNU General Public License as published by the Free
8
Software Foundation; either version 3, or (at your option) any later
9
version.
10
 
11
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12
WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14
for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with GCC; see the file COPYING3.  If not see
18
<http://www.gnu.org/licenses/>.  */
19
 
20
#include "config.h"
21
#include "system.h"
22
#include "coretypes.h"
23
#include "tm.h"
24
#include "tree.h"
25
#include "toplev.h"
26
#include "real.h"
27
#include "tm_p.h"
28
#include "dfp.h"
29
 
30
/* The order of the following headers is important for making sure
31
   decNumber structure is large enough to hold decimal128 digits.  */
32
 
33
#include "decimal128.h"
34
#include "decimal64.h"
35
#include "decimal32.h"
36
#include "decNumber.h"
37
 
38
static uint32_t
39
dfp_byte_swap (uint32_t in)
40
{
41
  uint32_t out = 0;
42
  unsigned char *p = (unsigned char *) &out;
43
  union {
44
    uint32_t i;
45
    unsigned char b[4];
46
  } u;
47
 
48
  u.i = in;
49
  p[0] = u.b[3];
50
  p[1] = u.b[2];
51
  p[2] = u.b[1];
52
  p[3] = u.b[0];
53
 
54
  return out;
55
}
56
 
57
/* Initialize R (a real with the decimal flag set) from DN.  Can
58
   utilize status passed in via CONTEXT, if a previous operation had
59
   interesting status.  */
60
 
61
static void
62
decimal_from_decnumber (REAL_VALUE_TYPE *r, decNumber *dn, decContext *context)
63
{
64
  memset (r, 0, sizeof (REAL_VALUE_TYPE));
65
 
66
  r->cl = rvc_normal;
67
  if (decNumberIsZero (dn))
68
    r->cl = rvc_zero;
69
  if (decNumberIsNaN (dn))
70
    r->cl = rvc_nan;
71
  if (decNumberIsInfinite (dn))
72
    r->cl = rvc_inf;
73
  if (context->status & DEC_Overflow)
74
    r->cl = rvc_inf;
75
  if (decNumberIsNegative (dn))
76
    r->sign = 1;
77
  r->decimal = 1;
78
 
79
  if (r->cl != rvc_normal)
80
    return;
81
 
82
  decContextDefault (context, DEC_INIT_DECIMAL128);
83
  context->traps = 0;
84
 
85
  decimal128FromNumber ((decimal128 *) r->sig, dn, context);
86
}
87
 
88
/* Create decimal encoded R from string S.  */
89
 
90
void
91
decimal_real_from_string (REAL_VALUE_TYPE *r, const char *s)
92
{
93
  decNumber dn;
94
  decContext set;
95
  decContextDefault (&set, DEC_INIT_DECIMAL128);
96
  set.traps = 0;
97
 
98
  decNumberFromString (&dn, (char *) s, &set);
99
 
100
  /* It would be more efficient to store directly in decNumber format,
101
     but that is impractical from current data structure size.
102
     Encoding as a decimal128 is much more compact.  */
103
  decimal_from_decnumber (r, &dn, &set);
104
}
105
 
106
/* Initialize a decNumber from a REAL_VALUE_TYPE.  */
107
 
108
static void
109
decimal_to_decnumber (const REAL_VALUE_TYPE *r, decNumber *dn)
110
{
111
  decContext set;
112
  decContextDefault (&set, DEC_INIT_DECIMAL128);
113
  set.traps = 0;
114
 
115
  switch (r->cl)
116
    {
117
    case rvc_zero:
118
      decNumberZero (dn);
119
      break;
120
    case rvc_inf:
121
      decNumberFromString (dn, (char *)"Infinity", &set);
122
      break;
123
    case rvc_nan:
124
      if (r->signalling)
125
        decNumberFromString (dn, (char *)"snan", &set);
126
      else
127
        decNumberFromString (dn, (char *)"nan", &set);
128
      break;
129
    case rvc_normal:
130
      gcc_assert (r->decimal);
131
      decimal128ToNumber ((decimal128 *) r->sig, dn);
132
      break;
133
    default:
134
      gcc_unreachable ();
135
    }
136
 
137
  /* Fix up sign bit.  */
138
  if (r->sign != decNumberIsNegative (dn))
139
    dn->bits ^= DECNEG;
140
}
141
 
142
/* Encode a real into an IEEE 754R decimal32 type.  */
143
 
144
void
145
encode_decimal32 (const struct real_format *fmt ATTRIBUTE_UNUSED,
146
                  long *buf, const REAL_VALUE_TYPE *r)
147
{
148
  decNumber dn;
149
  decimal32 d32;
150
  decContext set;
151
 
152
  decContextDefault (&set, DEC_INIT_DECIMAL128);
153
  set.traps = 0;
154
 
155
  decimal_to_decnumber (r, &dn);
156
  decimal32FromNumber (&d32, &dn, &set);
157
 
158
  if (FLOAT_WORDS_BIG_ENDIAN)
159
    buf[0] = *(uint32_t *) d32.bytes;
160
  else
161
    buf[0] = dfp_byte_swap (*(uint32_t *) d32.bytes);
162
}
163
 
164
/* Decode an IEEE 754R decimal32 type into a real.  */
165
 
166
void
167
decode_decimal32 (const struct real_format *fmt ATTRIBUTE_UNUSED,
168
                  REAL_VALUE_TYPE *r, const long *buf)
169
{
170
  decNumber dn;
171
  decimal32 d32;
172
  decContext set;
173
 
174
  decContextDefault (&set, DEC_INIT_DECIMAL128);
175
  set.traps = 0;
176
 
177
  if (FLOAT_WORDS_BIG_ENDIAN)
178
    *((uint32_t *) d32.bytes) = (uint32_t) buf[0];
179
  else
180
    *((uint32_t *) d32.bytes) = dfp_byte_swap ((uint32_t) buf[0]);
181
 
182
  decimal32ToNumber (&d32, &dn);
183
  decimal_from_decnumber (r, &dn, &set);
184
}
185
 
186
/* Encode a real into an IEEE 754R decimal64 type.  */
187
 
188
void
189
encode_decimal64 (const struct real_format *fmt ATTRIBUTE_UNUSED,
190
                  long *buf, const REAL_VALUE_TYPE *r)
191
{
192
  decNumber dn;
193
  decimal64 d64;
194
  decContext set;
195
 
196
  decContextDefault (&set, DEC_INIT_DECIMAL128);
197
  set.traps = 0;
198
 
199
  decimal_to_decnumber (r, &dn);
200
  decimal64FromNumber (&d64, &dn, &set);
201
 
202
  if (FLOAT_WORDS_BIG_ENDIAN)
203
    {
204
      buf[0] = *(uint32_t *) &d64.bytes[0];
205
      buf[1] = *(uint32_t *) &d64.bytes[4];
206
    }
207
  else
208
    {
209
      buf[1] = dfp_byte_swap (*(uint32_t *) &d64.bytes[0]);
210
      buf[0] = dfp_byte_swap (*(uint32_t *) &d64.bytes[4]);
211
    }
212
}
213
 
214
/* Decode an IEEE 754R decimal64 type into a real.  */
215
 
216
void
217
decode_decimal64 (const struct real_format *fmt ATTRIBUTE_UNUSED,
218
                  REAL_VALUE_TYPE *r, const long *buf)
219
{
220
  decNumber dn;
221
  decimal64 d64;
222
  decContext set;
223
 
224
  decContextDefault (&set, DEC_INIT_DECIMAL128);
225
  set.traps = 0;
226
 
227
  if (FLOAT_WORDS_BIG_ENDIAN)
228
    {
229
      *((uint32_t *) &d64.bytes[0]) = (uint32_t) buf[0];
230
      *((uint32_t *) &d64.bytes[4]) = (uint32_t) buf[1];
231
    }
232
  else
233
    {
234
      *((uint32_t *) &d64.bytes[0]) = dfp_byte_swap ((uint32_t) buf[1]);
235
      *((uint32_t *) &d64.bytes[4]) = dfp_byte_swap ((uint32_t) buf[0]);
236
    }
237
 
238
  decimal64ToNumber (&d64, &dn);
239
  decimal_from_decnumber (r, &dn, &set);
240
}
241
 
242
/* Encode a real into an IEEE 754R decimal128 type.  */
243
 
244
void
245
encode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED,
246
                   long *buf, const REAL_VALUE_TYPE *r)
247
{
248
  decNumber dn;
249
  decContext set;
250
  decimal128 d128;
251
 
252
  decContextDefault (&set, DEC_INIT_DECIMAL128);
253
  set.traps = 0;
254
 
255
  decimal_to_decnumber (r, &dn);
256
  decimal128FromNumber (&d128, &dn, &set);
257
 
258
  if (FLOAT_WORDS_BIG_ENDIAN)
259
    {
260
      buf[0] = *(uint32_t *) &d128.bytes[0];
261
      buf[1] = *(uint32_t *) &d128.bytes[4];
262
      buf[2] = *(uint32_t *) &d128.bytes[8];
263
      buf[3] = *(uint32_t *) &d128.bytes[12];
264
    }
265
  else
266
    {
267
      buf[0] = dfp_byte_swap (*(uint32_t *) &d128.bytes[12]);
268
      buf[1] = dfp_byte_swap (*(uint32_t *) &d128.bytes[8]);
269
      buf[2] = dfp_byte_swap (*(uint32_t *) &d128.bytes[4]);
270
      buf[3] = dfp_byte_swap (*(uint32_t *) &d128.bytes[0]);
271
    }
272
}
273
 
274
/* Decode an IEEE 754R decimal128 type into a real.  */
275
 
276
void
277
decode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED,
278
                   REAL_VALUE_TYPE *r, const long *buf)
279
{
280
  decNumber dn;
281
  decimal128 d128;
282
  decContext set;
283
 
284
  decContextDefault (&set, DEC_INIT_DECIMAL128);
285
  set.traps = 0;
286
 
287
  if (FLOAT_WORDS_BIG_ENDIAN)
288
    {
289
      *((uint32_t *) &d128.bytes[0])  = (uint32_t) buf[0];
290
      *((uint32_t *) &d128.bytes[4])  = (uint32_t) buf[1];
291
      *((uint32_t *) &d128.bytes[8])  = (uint32_t) buf[2];
292
      *((uint32_t *) &d128.bytes[12]) = (uint32_t) buf[3];
293
    }
294
  else
295
    {
296
      *((uint32_t *) &d128.bytes[0])  = dfp_byte_swap ((uint32_t) buf[3]);
297
      *((uint32_t *) &d128.bytes[4])  = dfp_byte_swap ((uint32_t) buf[2]);
298
      *((uint32_t *) &d128.bytes[8])  = dfp_byte_swap ((uint32_t) buf[1]);
299
      *((uint32_t *) &d128.bytes[12]) = dfp_byte_swap ((uint32_t) buf[0]);
300
    }
301
 
302
  decimal128ToNumber (&d128, &dn);
303
  decimal_from_decnumber (r, &dn, &set);
304
}
305
 
306
/* Helper function to convert from a binary real internal
307
   representation.  */
308
 
309
static void
310
decimal_to_binary (REAL_VALUE_TYPE *to, const REAL_VALUE_TYPE *from,
311
                   enum machine_mode mode)
312
{
313
  char string[256];
314
  decimal128 *d128;
315
  d128 = (decimal128 *) from->sig;
316
 
317
  decimal128ToString (d128, string);
318
  real_from_string3 (to, string, mode);
319
}
320
 
321
 
322
/* Helper function to convert from a binary real internal
323
   representation.  */
324
 
325
static void
326
decimal_from_binary (REAL_VALUE_TYPE *to, const REAL_VALUE_TYPE *from)
327
{
328
  char string[256];
329
 
330
  /* We convert to string, then to decNumber then to decimal128.  */
331
  real_to_decimal (string, from, sizeof (string), 0, 1);
332
  decimal_real_from_string (to, string);
333
}
334
 
335
/* Helper function to real.c:do_compare() to handle decimal internal
336
   representation including when one of the operands is still in the
337
   binary internal representation.  */
338
 
339
int
340
decimal_do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
341
                    int nan_result)
342
{
343
  decContext set;
344
  decNumber dn, dn2, dn3;
345
  REAL_VALUE_TYPE a1, b1;
346
 
347
  /* If either operand is non-decimal, create temporary versions.  */
348
  if (!a->decimal)
349
    {
350
      decimal_from_binary (&a1, a);
351
      a = &a1;
352
    }
353
  if (!b->decimal)
354
    {
355
      decimal_from_binary (&b1, b);
356
      b = &b1;
357
    }
358
 
359
  /* Convert into decNumber form for comparison operation.  */
360
  decContextDefault (&set, DEC_INIT_DECIMAL128);
361
  set.traps = 0;
362
  decimal128ToNumber ((decimal128 *) a->sig, &dn2);
363
  decimal128ToNumber ((decimal128 *) b->sig, &dn3);
364
 
365
  /* Finally, do the comparison.  */
366
  decNumberCompare (&dn, &dn2, &dn3, &set);
367
 
368
  /* Return the comparison result.  */
369
  if (decNumberIsNaN (&dn))
370
    return nan_result;
371
  else if (decNumberIsZero (&dn))
372
    return 0;
373
  else if (decNumberIsNegative (&dn))
374
    return -1;
375
  else
376
    return 1;
377
}
378
 
379
/* Helper to round_for_format, handling decimal float types.  */
380
 
381
void
382
decimal_round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
383
{
384
  decNumber dn;
385
  decContext set;
386
 
387
  /* Real encoding occurs later.  */
388
  if (r->cl != rvc_normal)
389
    return;
390
 
391
  decContextDefault (&set, DEC_INIT_DECIMAL128);
392
  set.traps = 0;
393
  decimal128ToNumber ((decimal128 *) r->sig, &dn);
394
 
395
  if (fmt == &decimal_quad_format)
396
    {
397
      /* The internal format is already in this format.  */
398
      return;
399
    }
400
  else if (fmt == &decimal_single_format)
401
    {
402
      decimal32 d32;
403
      decContextDefault (&set, DEC_INIT_DECIMAL32);
404
      set.traps = 0;
405
 
406
      decimal32FromNumber (&d32, &dn, &set);
407
      decimal32ToNumber (&d32, &dn);
408
    }
409
  else if (fmt == &decimal_double_format)
410
    {
411
      decimal64 d64;
412
      decContextDefault (&set, DEC_INIT_DECIMAL64);
413
      set.traps = 0;
414
 
415
      decimal64FromNumber (&d64, &dn, &set);
416
      decimal64ToNumber (&d64, &dn);
417
    }
418
  else
419
    gcc_unreachable ();
420
 
421
  decimal_from_decnumber (r, &dn, &set);
422
}
423
 
424
/* Extend or truncate to a new mode.  Handles conversions between
425
   binary and decimal types.  */
426
 
427
void
428
decimal_real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
429
                      const REAL_VALUE_TYPE *a)
430
{
431
  const struct real_format *fmt = REAL_MODE_FORMAT (mode);
432
 
433
  if (a->decimal && fmt->b == 10)
434
    return;
435
  if (a->decimal)
436
      decimal_to_binary (r, a, mode);
437
  else
438
      decimal_from_binary (r, a);
439
}
440
 
441
/* Render R_ORIG as a decimal floating point constant.  Emit DIGITS
442
   significant digits in the result, bounded by BUF_SIZE.  If DIGITS
443
   is 0, choose the maximum for the representation.  If
444
   CROP_TRAILING_ZEROS, strip trailing zeros.  Currently, not honoring
445
   DIGITS or CROP_TRAILING_ZEROS.  */
446
 
447
void
448
decimal_real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig,
449
                         size_t buf_size,
450
                         size_t digits ATTRIBUTE_UNUSED,
451
                         int crop_trailing_zeros ATTRIBUTE_UNUSED)
452
{
453
  decimal128 *d128 = (decimal128*) r_orig->sig;
454
 
455
  /* decimal128ToString requires space for at least 24 characters;
456
     Require two more for suffix.  */
457
  gcc_assert (buf_size >= 24);
458
  decimal128ToString (d128, str);
459
}
460
 
461
static bool
462
decimal_do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0,
463
                const REAL_VALUE_TYPE *op1, int subtract_p)
464
{
465
  decNumber dn;
466
  decContext set;
467
  decNumber dn2, dn3;
468
 
469
  decimal_to_decnumber (op0, &dn2);
470
  decimal_to_decnumber (op1, &dn3);
471
 
472
  decContextDefault (&set, DEC_INIT_DECIMAL128);
473
  set.traps = 0;
474
 
475
  if (subtract_p)
476
    decNumberSubtract (&dn, &dn2, &dn3, &set);
477
  else
478
    decNumberAdd (&dn, &dn2, &dn3, &set);
479
 
480
  decimal_from_decnumber (r, &dn, &set);
481
 
482
  /* Return true, if inexact.  */
483
  return (set.status & DEC_Inexact);
484
}
485
 
486
/* Compute R = OP0 * OP1.  */
487
 
488
static bool
489
decimal_do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0,
490
                     const REAL_VALUE_TYPE *op1)
491
{
492
  decContext set;
493
  decNumber dn, dn2, dn3;
494
 
495
  decimal_to_decnumber (op0, &dn2);
496
  decimal_to_decnumber (op1, &dn3);
497
 
498
  decContextDefault (&set, DEC_INIT_DECIMAL128);
499
  set.traps = 0;
500
 
501
  decNumberMultiply (&dn, &dn2, &dn3, &set);
502
  decimal_from_decnumber (r, &dn, &set);
503
 
504
  /* Return true, if inexact.  */
505
  return (set.status & DEC_Inexact);
506
}
507
 
508
/* Compute R = OP0 / OP1.  */
509
 
510
static bool
511
decimal_do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0,
512
                   const REAL_VALUE_TYPE *op1)
513
{
514
  decContext set;
515
  decNumber dn, dn2, dn3;
516
 
517
  decimal_to_decnumber (op0, &dn2);
518
  decimal_to_decnumber (op1, &dn3);
519
 
520
  decContextDefault (&set, DEC_INIT_DECIMAL128);
521
  set.traps = 0;
522
 
523
  decNumberDivide (&dn, &dn2, &dn3, &set);
524
  decimal_from_decnumber (r, &dn, &set);
525
 
526
  /* Return true, if inexact.  */
527
  return (set.status & DEC_Inexact);
528
}
529
 
530
/* Set R to A truncated to an integral value toward zero (decimal
531
   floating point).  */
532
 
533
void
534
decimal_do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
535
{
536
  decNumber dn, dn2;
537
  decContext set;
538
 
539
  decContextDefault (&set, DEC_INIT_DECIMAL128);
540
  set.traps = 0;
541
  set.round = DEC_ROUND_DOWN;
542
  decimal128ToNumber ((decimal128 *) a->sig, &dn2);
543
 
544
  decNumberToIntegralValue (&dn, &dn2, &set);
545
  decimal_from_decnumber (r, &dn, &set);
546
}
547
 
548
/* Render decimal float value R as an integer.  */
549
 
550
HOST_WIDE_INT
551
decimal_real_to_integer (const REAL_VALUE_TYPE *r)
552
{
553
  decContext set;
554
  decNumber dn, dn2, dn3;
555
  REAL_VALUE_TYPE to;
556
  char string[256];
557
 
558
  decContextDefault (&set, DEC_INIT_DECIMAL128);
559
  set.traps = 0;
560
  set.round = DEC_ROUND_DOWN;
561
  decimal128ToNumber ((decimal128 *) r->sig, &dn);
562
 
563
  decNumberToIntegralValue (&dn2, &dn, &set);
564
  decNumberZero (&dn3);
565
  decNumberRescale (&dn, &dn2, &dn3, &set);
566
 
567
  /* Convert to REAL_VALUE_TYPE and call appropriate conversion
568
     function.  */
569
  decNumberToString (&dn, string);
570
  real_from_string (&to, string);
571
  return real_to_integer (&to);
572
}
573
 
574
/* Likewise, but to an integer pair, HI+LOW.  */
575
 
576
void
577
decimal_real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
578
                          const REAL_VALUE_TYPE *r)
579
{
580
  decContext set;
581
  decNumber dn, dn2, dn3;
582
  REAL_VALUE_TYPE to;
583
  char string[256];
584
 
585
  decContextDefault (&set, DEC_INIT_DECIMAL128);
586
  set.traps = 0;
587
  set.round = DEC_ROUND_DOWN;
588
  decimal128ToNumber ((decimal128 *) r->sig, &dn);
589
 
590
  decNumberToIntegralValue (&dn2, &dn, &set);
591
  decNumberZero (&dn3);
592
  decNumberRescale (&dn, &dn2, &dn3, &set);
593
 
594
  /* Conver to REAL_VALUE_TYPE and call appropriate conversion
595
     function.  */
596
  decNumberToString (&dn, string);
597
  real_from_string (&to, string);
598
  real_to_integer2 (plow, phigh, &to);
599
}
600
 
601
/* Perform the decimal floating point operation described by CODE.
602
   For a unary operation, OP1 will be NULL.  This function returns
603
   true if the result may be inexact due to loss of precision.  */
604
 
605
bool
606
decimal_real_arithmetic (REAL_VALUE_TYPE *r, enum tree_code code,
607
                         const REAL_VALUE_TYPE *op0,
608
                         const REAL_VALUE_TYPE *op1)
609
{
610
  REAL_VALUE_TYPE a, b;
611
 
612
  /* If either operand is non-decimal, create temporaries.  */
613
  if (!op0->decimal)
614
    {
615
      decimal_from_binary (&a, op0);
616
      op0 = &a;
617
    }
618
  if (op1 && !op1->decimal)
619
    {
620
      decimal_from_binary (&b, op1);
621
      op1 = &b;
622
    }
623
 
624
  switch (code)
625
    {
626
    case PLUS_EXPR:
627
      return decimal_do_add (r, op0, op1, 0);
628
 
629
    case MINUS_EXPR:
630
      return decimal_do_add (r, op0, op1, 1);
631
 
632
    case MULT_EXPR:
633
      return decimal_do_multiply (r, op0, op1);
634
 
635
    case RDIV_EXPR:
636
      return decimal_do_divide (r, op0, op1);
637
 
638
    case MIN_EXPR:
639
      if (op1->cl == rvc_nan)
640
        *r = *op1;
641
      else if (real_compare (UNLT_EXPR, op0, op1))
642
        *r = *op0;
643
      else
644
        *r = *op1;
645
      return false;
646
 
647
    case MAX_EXPR:
648
      if (op1->cl == rvc_nan)
649
        *r = *op1;
650
      else if (real_compare (LT_EXPR, op0, op1))
651
        *r = *op1;
652
      else
653
        *r = *op0;
654
      return false;
655
 
656
    case NEGATE_EXPR:
657
      {
658
        decimal128 *d128;
659
        *r = *op0;
660
        d128 = (decimal128 *) r->sig;
661
        /* Flip high bit.  */
662
        d128->bytes[0] ^= 1 << 7;
663
        /* Keep sign field in sync.  */
664
        r->sign ^= 1;
665
      }
666
      return false;
667
 
668
    case ABS_EXPR:
669
      {
670
        decimal128 *d128;
671
        *r = *op0;
672
        d128 = (decimal128 *) r->sig;
673
        /* Clear high bit.  */
674
        d128->bytes[0] &= 0x7f;
675
        /* Keep sign field in sync.  */
676
        r->sign = 0;
677
      }
678
      return false;
679
 
680
    case FIX_TRUNC_EXPR:
681
      decimal_do_fix_trunc (r, op0);
682
      return false;
683
 
684
    default:
685
      gcc_unreachable ();
686
    }
687
}
688
 
689
/* Fills R with the largest finite value representable in mode MODE.
690
   If SIGN is nonzero, R is set to the most negative finite value.  */
691
 
692
void
693
decimal_real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
694
{
695
  char *max;
696
 
697
  switch (mode)
698
    {
699
    case SDmode:
700
      max = (char *) "9.999999E96";
701
      break;
702
    case DDmode:
703
      max = (char *) "9.999999999999999E384";
704
      break;
705
    case TDmode:
706
      max = (char *) "9.999999999999999999999999999999999E6144";
707
      break;
708
    default:
709
      gcc_unreachable ();
710
    }
711
 
712
  decimal_real_from_string (r, max);
713
  if (sign)
714
    r->sig[0] |= 0x80000000;
715
}

powered by: WebSVN 2.1.0

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