00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "config.h"
00022 #include "system.h"
00023 #include "coretypes.h"
00024 #include "tm.h"
00025 #include "tree.h"
00026 #include "toplev.h"
00027 #include "real.h"
00028 #include "tm_p.h"
00029 #include "dfp.h"
00030
00031
00032
00033
00034 #include "decimal128.h"
00035 #include "decimal64.h"
00036 #include "decimal32.h"
00037 #include "decNumber.h"
00038
00039 static uint32_t
00040 dfp_byte_swap (uint32_t in)
00041 {
00042 uint32_t out = 0;
00043 unsigned char *p = (unsigned char *) &out;
00044 union {
00045 uint32_t i;
00046 unsigned char b[4];
00047 } u;
00048
00049 u.i = in;
00050 p[0] = u.b[3];
00051 p[1] = u.b[2];
00052 p[2] = u.b[1];
00053 p[3] = u.b[0];
00054
00055 return out;
00056 }
00057
00058
00059
00060
00061
00062 static void
00063 decimal_from_decnumber (REAL_VALUE_TYPE *r, decNumber *dn, decContext *context)
00064 {
00065 memset (r, 0, sizeof (REAL_VALUE_TYPE));
00066
00067 r->cl = rvc_normal;
00068 if (decNumberIsZero (dn))
00069 r->cl = rvc_zero;
00070 if (decNumberIsNaN (dn))
00071 r->cl = rvc_nan;
00072 if (decNumberIsInfinite (dn))
00073 r->cl = rvc_inf;
00074 if (context->status & DEC_Overflow)
00075 r->cl = rvc_inf;
00076 if (decNumberIsNegative (dn))
00077 r->sign = 1;
00078 r->decimal = 1;
00079
00080 if (r->cl != rvc_normal)
00081 return;
00082
00083 decContextDefault (context, DEC_INIT_DECIMAL128);
00084 context->traps = 0;
00085
00086 decimal128FromNumber ((decimal128 *) r->sig, dn, context);
00087 }
00088
00089
00090
00091 void
00092 decimal_real_from_string (REAL_VALUE_TYPE *r, const char *s)
00093 {
00094 decNumber dn;
00095 decContext set;
00096 decContextDefault (&set, DEC_INIT_DECIMAL128);
00097 set.traps = 0;
00098
00099 decNumberFromString (&dn, (char *) s, &set);
00100
00101
00102
00103
00104 decimal_from_decnumber (r, &dn, &set);
00105 }
00106
00107
00108
00109 static void
00110 decimal_to_decnumber (const REAL_VALUE_TYPE *r, decNumber *dn)
00111 {
00112 decContext set;
00113 decContextDefault (&set, DEC_INIT_DECIMAL128);
00114 set.traps = 0;
00115
00116 switch (r->cl)
00117 {
00118 case rvc_zero:
00119 decNumberZero (dn);
00120 break;
00121 case rvc_inf:
00122 decNumberFromString (dn, (char *)"Infinity", &set);
00123 break;
00124 case rvc_nan:
00125 if (r->signalling)
00126 decNumberFromString (dn, (char *)"snan", &set);
00127 else
00128 decNumberFromString (dn, (char *)"nan", &set);
00129 break;
00130 case rvc_normal:
00131 gcc_assert (r->decimal);
00132 decimal128ToNumber ((decimal128 *) r->sig, dn);
00133 break;
00134 default:
00135 gcc_unreachable ();
00136 }
00137
00138
00139 if (r->sign != decNumberIsNegative (dn))
00140 dn->bits ^= DECNEG;
00141 }
00142
00143
00144
00145 void
00146 encode_decimal32 (const struct real_format *fmt ATTRIBUTE_UNUSED,
00147 long *buf, const REAL_VALUE_TYPE *r)
00148 {
00149 decNumber dn;
00150 decimal32 d32;
00151 decContext set;
00152
00153 decContextDefault (&set, DEC_INIT_DECIMAL128);
00154 set.traps = 0;
00155
00156 decimal_to_decnumber (r, &dn);
00157 decimal32FromNumber (&d32, &dn, &set);
00158
00159 if (FLOAT_WORDS_BIG_ENDIAN)
00160 buf[0] = *(uint32_t *) d32.bytes;
00161 else
00162 buf[0] = dfp_byte_swap (*(uint32_t *) d32.bytes);
00163 }
00164
00165
00166
00167 void
00168 decode_decimal32 (const struct real_format *fmt ATTRIBUTE_UNUSED,
00169 REAL_VALUE_TYPE *r, const long *buf)
00170 {
00171 decNumber dn;
00172 decimal32 d32;
00173 decContext set;
00174
00175 decContextDefault (&set, DEC_INIT_DECIMAL128);
00176 set.traps = 0;
00177
00178 if (FLOAT_WORDS_BIG_ENDIAN)
00179 *((uint32_t *) d32.bytes) = (uint32_t) buf[0];
00180 else
00181 *((uint32_t *) d32.bytes) = dfp_byte_swap ((uint32_t) buf[0]);
00182
00183 decimal32ToNumber (&d32, &dn);
00184 decimal_from_decnumber (r, &dn, &set);
00185 }
00186
00187
00188
00189 void
00190 encode_decimal64 (const struct real_format *fmt ATTRIBUTE_UNUSED,
00191 long *buf, const REAL_VALUE_TYPE *r)
00192 {
00193 decNumber dn;
00194 decimal64 d64;
00195 decContext set;
00196
00197 decContextDefault (&set, DEC_INIT_DECIMAL128);
00198 set.traps = 0;
00199
00200 decimal_to_decnumber (r, &dn);
00201 decimal64FromNumber (&d64, &dn, &set);
00202
00203 if (FLOAT_WORDS_BIG_ENDIAN)
00204 {
00205 buf[0] = *(uint32_t *) &d64.bytes[0];
00206 buf[1] = *(uint32_t *) &d64.bytes[4];
00207 }
00208 else
00209 {
00210 buf[1] = dfp_byte_swap (*(uint32_t *) &d64.bytes[0]);
00211 buf[0] = dfp_byte_swap (*(uint32_t *) &d64.bytes[4]);
00212 }
00213 }
00214
00215
00216
00217 void
00218 decode_decimal64 (const struct real_format *fmt ATTRIBUTE_UNUSED,
00219 REAL_VALUE_TYPE *r, const long *buf)
00220 {
00221 decNumber dn;
00222 decimal64 d64;
00223 decContext set;
00224
00225 decContextDefault (&set, DEC_INIT_DECIMAL128);
00226 set.traps = 0;
00227
00228 if (FLOAT_WORDS_BIG_ENDIAN)
00229 {
00230 *((uint32_t *) &d64.bytes[0]) = (uint32_t) buf[0];
00231 *((uint32_t *) &d64.bytes[4]) = (uint32_t) buf[1];
00232 }
00233 else
00234 {
00235 *((uint32_t *) &d64.bytes[0]) = dfp_byte_swap ((uint32_t) buf[1]);
00236 *((uint32_t *) &d64.bytes[4]) = dfp_byte_swap ((uint32_t) buf[0]);
00237 }
00238
00239 decimal64ToNumber (&d64, &dn);
00240 decimal_from_decnumber (r, &dn, &set);
00241 }
00242
00243
00244
00245 void
00246 encode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED,
00247 long *buf, const REAL_VALUE_TYPE *r)
00248 {
00249 decNumber dn;
00250 decContext set;
00251 decimal128 d128;
00252
00253 decContextDefault (&set, DEC_INIT_DECIMAL128);
00254 set.traps = 0;
00255
00256 decimal_to_decnumber (r, &dn);
00257 decimal128FromNumber (&d128, &dn, &set);
00258
00259 if (FLOAT_WORDS_BIG_ENDIAN)
00260 {
00261 buf[0] = *(uint32_t *) &d128.bytes[0];
00262 buf[1] = *(uint32_t *) &d128.bytes[4];
00263 buf[2] = *(uint32_t *) &d128.bytes[8];
00264 buf[3] = *(uint32_t *) &d128.bytes[12];
00265 }
00266 else
00267 {
00268 buf[0] = dfp_byte_swap (*(uint32_t *) &d128.bytes[12]);
00269 buf[1] = dfp_byte_swap (*(uint32_t *) &d128.bytes[8]);
00270 buf[2] = dfp_byte_swap (*(uint32_t *) &d128.bytes[4]);
00271 buf[3] = dfp_byte_swap (*(uint32_t *) &d128.bytes[0]);
00272 }
00273 }
00274
00275
00276
00277 void
00278 decode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED,
00279 REAL_VALUE_TYPE *r, const long *buf)
00280 {
00281 decNumber dn;
00282 decimal128 d128;
00283 decContext set;
00284
00285 decContextDefault (&set, DEC_INIT_DECIMAL128);
00286 set.traps = 0;
00287
00288 if (FLOAT_WORDS_BIG_ENDIAN)
00289 {
00290 *((uint32_t *) &d128.bytes[0]) = (uint32_t) buf[0];
00291 *((uint32_t *) &d128.bytes[4]) = (uint32_t) buf[1];
00292 *((uint32_t *) &d128.bytes[8]) = (uint32_t) buf[2];
00293 *((uint32_t *) &d128.bytes[12]) = (uint32_t) buf[3];
00294 }
00295 else
00296 {
00297 *((uint32_t *) &d128.bytes[0]) = dfp_byte_swap ((uint32_t) buf[3]);
00298 *((uint32_t *) &d128.bytes[4]) = dfp_byte_swap ((uint32_t) buf[2]);
00299 *((uint32_t *) &d128.bytes[8]) = dfp_byte_swap ((uint32_t) buf[1]);
00300 *((uint32_t *) &d128.bytes[12]) = dfp_byte_swap ((uint32_t) buf[0]);
00301 }
00302
00303 decimal128ToNumber (&d128, &dn);
00304 decimal_from_decnumber (r, &dn, &set);
00305 }
00306
00307
00308
00309
00310 static void
00311 decimal_to_binary (REAL_VALUE_TYPE *to, const REAL_VALUE_TYPE *from,
00312 enum machine_mode mode)
00313 {
00314 char string[256];
00315 decimal128 *d128;
00316 d128 = (decimal128 *) from->sig;
00317
00318 decimal128ToString (d128, string);
00319 real_from_string3 (to, string, mode);
00320 }
00321
00322
00323
00324
00325
00326 static void
00327 decimal_from_binary (REAL_VALUE_TYPE *to, const REAL_VALUE_TYPE *from)
00328 {
00329 char string[256];
00330
00331
00332 real_to_decimal (string, from, sizeof (string), 0, 1);
00333 decimal_real_from_string (to, string);
00334 }
00335
00336
00337
00338
00339
00340 int
00341 decimal_do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
00342 int nan_result)
00343 {
00344 decContext set;
00345 decNumber dn, dn2, dn3;
00346 REAL_VALUE_TYPE a1, b1;
00347
00348
00349 if (!a->decimal)
00350 {
00351 decimal_from_binary (&a1, a);
00352 a = &a1;
00353 }
00354 if (!b->decimal)
00355 {
00356 decimal_from_binary (&b1, b);
00357 b = &b1;
00358 }
00359
00360
00361 decContextDefault (&set, DEC_INIT_DECIMAL128);
00362 set.traps = 0;
00363 decimal128ToNumber ((decimal128 *) a->sig, &dn2);
00364 decimal128ToNumber ((decimal128 *) b->sig, &dn3);
00365
00366
00367 decNumberCompare (&dn, &dn2, &dn3, &set);
00368
00369
00370 if (decNumberIsNaN (&dn))
00371 return nan_result;
00372 else if (decNumberIsZero (&dn))
00373 return 0;
00374 else if (decNumberIsNegative (&dn))
00375 return -1;
00376 else
00377 return 1;
00378 }
00379
00380
00381
00382 void
00383 decimal_round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
00384 {
00385 decNumber dn;
00386 decContext set;
00387
00388
00389 if (r->cl != rvc_normal)
00390 return;
00391
00392 decContextDefault (&set, DEC_INIT_DECIMAL128);
00393 set.traps = 0;
00394 decimal128ToNumber ((decimal128 *) r->sig, &dn);
00395
00396 if (fmt == &decimal_quad_format)
00397 {
00398
00399 return;
00400 }
00401 else if (fmt == &decimal_single_format)
00402 {
00403 decimal32 d32;
00404 decContextDefault (&set, DEC_INIT_DECIMAL32);
00405 set.traps = 0;
00406
00407 decimal32FromNumber (&d32, &dn, &set);
00408 decimal32ToNumber (&d32, &dn);
00409 }
00410 else if (fmt == &decimal_double_format)
00411 {
00412 decimal64 d64;
00413 decContextDefault (&set, DEC_INIT_DECIMAL64);
00414 set.traps = 0;
00415
00416 decimal64FromNumber (&d64, &dn, &set);
00417 decimal64ToNumber (&d64, &dn);
00418 }
00419 else
00420 gcc_unreachable ();
00421
00422 decimal_from_decnumber (r, &dn, &set);
00423 }
00424
00425
00426
00427
00428 void
00429 decimal_real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
00430 const REAL_VALUE_TYPE *a)
00431 {
00432 const struct real_format *fmt = REAL_MODE_FORMAT (mode);
00433
00434 if (a->decimal && fmt->b == 10)
00435 return;
00436 if (a->decimal)
00437 decimal_to_binary (r, a, mode);
00438 else
00439 decimal_from_binary (r, a);
00440 }
00441
00442
00443
00444
00445
00446
00447
00448 void
00449 decimal_real_to_decimal (char *str, const REAL_VALUE_TYPE *r_orig,
00450 size_t buf_size,
00451 size_t digits ATTRIBUTE_UNUSED,
00452 int crop_trailing_zeros ATTRIBUTE_UNUSED)
00453 {
00454 decimal128 *d128 = (decimal128*) r_orig->sig;
00455
00456
00457
00458 gcc_assert (buf_size >= 24);
00459 decimal128ToString (d128, str);
00460 }
00461
00462 static bool
00463 decimal_do_add (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0,
00464 const REAL_VALUE_TYPE *op1, int subtract_p)
00465 {
00466 decNumber dn;
00467 decContext set;
00468 decNumber dn2, dn3;
00469
00470 decimal_to_decnumber (op0, &dn2);
00471 decimal_to_decnumber (op1, &dn3);
00472
00473 decContextDefault (&set, DEC_INIT_DECIMAL128);
00474 set.traps = 0;
00475
00476 if (subtract_p)
00477 decNumberSubtract (&dn, &dn2, &dn3, &set);
00478 else
00479 decNumberAdd (&dn, &dn2, &dn3, &set);
00480
00481 decimal_from_decnumber (r, &dn, &set);
00482
00483
00484 return (set.status & DEC_Inexact);
00485 }
00486
00487
00488
00489 static bool
00490 decimal_do_multiply (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0,
00491 const REAL_VALUE_TYPE *op1)
00492 {
00493 decContext set;
00494 decNumber dn, dn2, dn3;
00495
00496 decimal_to_decnumber (op0, &dn2);
00497 decimal_to_decnumber (op1, &dn3);
00498
00499 decContextDefault (&set, DEC_INIT_DECIMAL128);
00500 set.traps = 0;
00501
00502 decNumberMultiply (&dn, &dn2, &dn3, &set);
00503 decimal_from_decnumber (r, &dn, &set);
00504
00505
00506 return (set.status & DEC_Inexact);
00507 }
00508
00509
00510
00511 static bool
00512 decimal_do_divide (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *op0,
00513 const REAL_VALUE_TYPE *op1)
00514 {
00515 decContext set;
00516 decNumber dn, dn2, dn3;
00517
00518 decimal_to_decnumber (op0, &dn2);
00519 decimal_to_decnumber (op1, &dn3);
00520
00521 decContextDefault (&set, DEC_INIT_DECIMAL128);
00522 set.traps = 0;
00523
00524 decNumberDivide (&dn, &dn2, &dn3, &set);
00525 decimal_from_decnumber (r, &dn, &set);
00526
00527
00528 return (set.status & DEC_Inexact);
00529 }
00530
00531
00532
00533
00534 void
00535 decimal_do_fix_trunc (REAL_VALUE_TYPE *r, const REAL_VALUE_TYPE *a)
00536 {
00537 decNumber dn, dn2;
00538 decContext set;
00539
00540 decContextDefault (&set, DEC_INIT_DECIMAL128);
00541 set.traps = 0;
00542 set.round = DEC_ROUND_DOWN;
00543 decimal128ToNumber ((decimal128 *) a->sig, &dn2);
00544
00545 decNumberToIntegralValue (&dn, &dn2, &set);
00546 decimal_from_decnumber (r, &dn, &set);
00547 }
00548
00549
00550
00551 HOST_WIDE_INT
00552 decimal_real_to_integer (const REAL_VALUE_TYPE *r)
00553 {
00554 decContext set;
00555 decNumber dn, dn2, dn3;
00556 REAL_VALUE_TYPE to;
00557 char string[256];
00558
00559 decContextDefault (&set, DEC_INIT_DECIMAL128);
00560 set.traps = 0;
00561 set.round = DEC_ROUND_DOWN;
00562 decimal128ToNumber ((decimal128 *) r->sig, &dn);
00563
00564 decNumberToIntegralValue (&dn2, &dn, &set);
00565 decNumberZero (&dn3);
00566 decNumberRescale (&dn, &dn2, &dn3, &set);
00567
00568
00569
00570 decNumberToString (&dn, string);
00571 real_from_string (&to, string);
00572 return real_to_integer (&to);
00573 }
00574
00575
00576
00577 void
00578 decimal_real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
00579 const REAL_VALUE_TYPE *r)
00580 {
00581 decContext set;
00582 decNumber dn, dn2, dn3;
00583 REAL_VALUE_TYPE to;
00584 char string[256];
00585
00586 decContextDefault (&set, DEC_INIT_DECIMAL128);
00587 set.traps = 0;
00588 set.round = DEC_ROUND_DOWN;
00589 decimal128ToNumber ((decimal128 *) r->sig, &dn);
00590
00591 decNumberToIntegralValue (&dn2, &dn, &set);
00592 decNumberZero (&dn3);
00593 decNumberRescale (&dn, &dn2, &dn3, &set);
00594
00595
00596
00597 decNumberToString (&dn, string);
00598 real_from_string (&to, string);
00599 real_to_integer2 (plow, phigh, &to);
00600 }
00601
00602
00603
00604
00605
00606 bool
00607 decimal_real_arithmetic (REAL_VALUE_TYPE *r, enum tree_code code,
00608 const REAL_VALUE_TYPE *op0,
00609 const REAL_VALUE_TYPE *op1)
00610 {
00611 REAL_VALUE_TYPE a, b;
00612
00613
00614 if (!op0->decimal)
00615 {
00616 decimal_from_binary (&a, op0);
00617 op0 = &a;
00618 }
00619 if (op1 && !op1->decimal)
00620 {
00621 decimal_from_binary (&b, op1);
00622 op1 = &b;
00623 }
00624
00625 switch (code)
00626 {
00627 case PLUS_EXPR:
00628 return decimal_do_add (r, op0, op1, 0);
00629
00630 case MINUS_EXPR:
00631 return decimal_do_add (r, op0, op1, 1);
00632
00633 case MULT_EXPR:
00634 return decimal_do_multiply (r, op0, op1);
00635
00636 case RDIV_EXPR:
00637 return decimal_do_divide (r, op0, op1);
00638
00639 case MIN_EXPR:
00640 if (op1->cl == rvc_nan)
00641 *r = *op1;
00642 else if (real_compare (UNLT_EXPR, op0, op1))
00643 *r = *op0;
00644 else
00645 *r = *op1;
00646 return false;
00647
00648 case MAX_EXPR:
00649 if (op1->cl == rvc_nan)
00650 *r = *op1;
00651 else if (real_compare (LT_EXPR, op0, op1))
00652 *r = *op1;
00653 else
00654 *r = *op0;
00655 return false;
00656
00657 case NEGATE_EXPR:
00658 {
00659 decimal128 *d128;
00660 *r = *op0;
00661 d128 = (decimal128 *) r->sig;
00662
00663 d128->bytes[0] ^= 1 << 7;
00664
00665 r->sign ^= 1;
00666 }
00667 return false;
00668
00669 case ABS_EXPR:
00670 {
00671 decimal128 *d128;
00672 *r = *op0;
00673 d128 = (decimal128 *) r->sig;
00674
00675 d128->bytes[0] &= 0x7f;
00676
00677 r->sign = 0;
00678 }
00679 return false;
00680
00681 case FIX_TRUNC_EXPR:
00682 decimal_do_fix_trunc (r, op0);
00683 return false;
00684
00685 default:
00686 gcc_unreachable ();
00687 }
00688 }
00689
00690
00691
00692
00693 void
00694 decimal_real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
00695 {
00696 char *max;
00697
00698 switch (mode)
00699 {
00700 case SDmode:
00701 max = (char *) "9.999999E96";
00702 break;
00703 case DDmode:
00704 max = (char *) "9.999999999999999E384";
00705 break;
00706 case TDmode:
00707 max = (char *) "9.999999999999999999999999999999999E6144";
00708 break;
00709 default:
00710 gcc_unreachable ();
00711 }
00712
00713 decimal_real_from_string (r, max);
00714 if (sign)
00715 r->sig[0] |= 0x80000000;
00716 }