@@ -101,7 +101,8 @@
static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *);
-static void decimal_from_integer (REAL_VALUE_TYPE *);
+static void decimal_from_integer (REAL_VALUE_TYPE *,
+ const struct real_format *);
static void decimal_integer_string (char *, const REAL_VALUE_TYPE *,
size_t);
@@ -2265,8 +2266,8 @@
}
if (fmt.decimal_p ())
- decimal_from_integer (r);
- if (fmt)
+ decimal_from_integer (r, fmt);
+ else if (fmt)
real_convert (r, fmt, r);
}
@@ -2320,12 +2321,12 @@
/* Convert a real with an integral value to decimal float. */
static void
-decimal_from_integer (REAL_VALUE_TYPE *r)
+decimal_from_integer (REAL_VALUE_TYPE *r, const struct real_format *fmt)
{
char str[256];
decimal_integer_string (str, r, sizeof (str) - 1);
- decimal_real_from_string (r, str);
+ decimal_real_from_string (r, str, fmt);
}
/* Returns 10**2**N. */
@@ -67,11 +67,19 @@ decimal_from_decnumber (REAL_VALUE_TYPE
/* Create decimal encoded R from string S. */
void
-decimal_real_from_string (REAL_VALUE_TYPE *r, const char *s)
+decimal_real_from_string (REAL_VALUE_TYPE *r, const char *s,
+ const real_format *fmt)
{
decNumber dn;
decContext set;
- decContextDefault (&set, DEC_INIT_DECIMAL128);
+ if (fmt == &decimal_quad_format)
+ decContextDefault (&set, DEC_INIT_DECIMAL128);
+ else if (fmt == &decimal_double_format)
+ decContextDefault (&set, DEC_INIT_DECIMAL64);
+ else if (fmt == &decimal_single_format)
+ decContextDefault (&set, DEC_INIT_DECIMAL64);
+ else
+ gcc_unreachable ();
set.traps = 0;
decNumberFromString (&dn, s, &set);
@@ -82,6 +90,12 @@ decimal_real_from_string (REAL_VALUE_TYP
decimal_from_decnumber (r, &dn, &set);
}
+void
+decimal_real_from_string (REAL_VALUE_TYPE *r, const char *s)
+{
+ decimal_real_from_string (r, s, &decimal_quad_format);
+}
+
/* Initialize a decNumber from a REAL_VALUE_TYPE. */
static void
@@ -33,6 +33,8 @@ void encode_decimal128 (const struct rea
/* Arithmetic and conversion functions. */
int decimal_do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
void decimal_real_from_string (REAL_VALUE_TYPE *, const char *);
+void decimal_real_from_string (REAL_VALUE_TYPE *, const char *,
+ const real_format *fmt);
void decimal_round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
void decimal_real_convert (REAL_VALUE_TYPE *, const real_format *,
const REAL_VALUE_TYPE *);