/* Decimal floating point support.
- Copyright (C) 2005-2013 Free Software Foundation, Inc.
+ Copyright (C) 2005-2020 Free Software Foundation, Inc.
This file is part of GCC.
#include "coretypes.h"
#include "tm.h"
#include "tree.h"
-#include "tm_p.h"
#include "dfp.h"
/* The order of the following headers is important for making sure
decNumber structure is large enough to hold decimal128 digits. */
#include "decimal128.h"
-#include "decimal128Local.h"
#include "decimal64.h"
#include "decimal32.h"
-#include "decNumber.h"
#ifndef WORDS_BIGENDIAN
#define WORDS_BIGENDIAN 0
static void
decimal_to_binary (REAL_VALUE_TYPE *to, const REAL_VALUE_TYPE *from,
- enum machine_mode mode)
+ const real_format *fmt)
{
char string[256];
- const decimal128 *const d128 = (const decimal128 *) from->sig;
-
- decimal128ToString (d128, string);
- real_from_string3 (to, string, mode);
+ if (from->cl == rvc_normal)
+ {
+ const decimal128 *const d128 = (const decimal128 *) from->sig;
+ decimal128ToString (d128, string);
+ }
+ else
+ real_to_decimal (string, from, sizeof (string), 0, 1);
+ real_from_string3 (to, string, fmt);
}
binary and decimal types. */
void
-decimal_real_convert (REAL_VALUE_TYPE *r, enum machine_mode mode,
+decimal_real_convert (REAL_VALUE_TYPE *r, const real_format *fmt,
const REAL_VALUE_TYPE *a)
{
- const struct real_format *fmt = REAL_MODE_FORMAT (mode);
-
if (a->decimal && fmt->b == 10)
return;
if (a->decimal)
- decimal_to_binary (r, a, mode);
+ decimal_to_binary (r, a, fmt);
else
decimal_from_binary (r, a);
}
return real_to_integer (&to);
}
-/* Likewise, but to an integer pair, HI+LOW. */
+/* Likewise, but returns a wide_int with PRECISION. *FAIL is set if the
+ value does not fit. */
-void
-decimal_real_to_integer2 (HOST_WIDE_INT *plow, HOST_WIDE_INT *phigh,
- const REAL_VALUE_TYPE *r)
+wide_int
+decimal_real_to_integer (const REAL_VALUE_TYPE *r, bool *fail, int precision)
{
decContext set;
decNumber dn, dn2, dn3;
function. */
decNumberToString (&dn, string);
real_from_string (&to, string);
- real_to_integer2 (plow, phigh, &to);
+ return real_to_integer (&to, fail, precision);
}
/* Perform the decimal floating point operation described by CODE.
If SIGN is nonzero, R is set to the most negative finite value. */
void
-decimal_real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
+decimal_real_maxval (REAL_VALUE_TYPE *r, int sign, machine_mode mode)
{
const char *max;
switch (mode)
{
- case SDmode:
+ case E_SDmode:
max = "9.999999E96";
break;
- case DDmode:
+ case E_DDmode:
max = "9.999999999999999E384";
break;
- case TDmode:
+ case E_TDmode:
max = "9.999999999999999999999999999999999E6144";
break;
default: