Commit 312992f5 by Jakub Jelinek

dfp: Fix decimal_to_binary [PR94111]

As e.g. decimal_from_decnumber shows, the REAL_VALUE_TYPE representation
contains a decimal128 embedded in ->sig only if it is rvc_normal, for
other kinds like rvc_inf or rvc_nan, ->sig is ignored and everything is
contained in the REAL_VALUE_TYPE flags (cl, sign, signalling and decimal).
decimal_to_binary which is used when folding a decimal{32,64,128} constant
to a binary floating point type ignores this and thus folds infinities and
NaNs into +0.0.
The following patch fixes that by only doing that for rvc_normal.
Similarly to the binary to decimal folding, it goes through a string, in
order to e.g. deal with canonical NaN mantissas, or binary float formats
that don't support infinities and/or NaNs.

2020-03-11  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/94111
	* dfp.c (decimal_to_binary): Only use decimal128ToString if from->cl
	is rvc_normal, otherwise use real_to_decimal to print the number to
	string.

	* gcc.dg/dfp/pr94111.c: New test.
parent 05ac4d9c
2020-03-11 Jakub Jelinek <jakub@redhat.com>
PR middle-end/94111
* dfp.c (decimal_to_binary): Only use decimal128ToString if from->cl
is rvc_normal, otherwise use real_to_decimal to print the number to
string.
PR tree-optimization/94114
* tree-loop-distribution.c (generate_memset_builtin): Call
rewrite_to_non_trapping_overflow even on mem.
......
......@@ -342,9 +342,13 @@ decimal_to_binary (REAL_VALUE_TYPE *to, const REAL_VALUE_TYPE *from,
const real_format *fmt)
{
char string[256];
const decimal128 *const d128 = (const decimal128 *) from->sig;
decimal128ToString (d128, string);
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);
}
......
2020-03-11 Jakub Jelinek <jakub@redhat.com>
PR middle-end/94111
* gcc.dg/dfp/pr94111.c: New test.
PR tree-optimization/94114
* gcc.dg/pr94114.c: New test.
......
/* PR middle-end/94111 */
/* { dg-do run } */
/* { dg-options "-O2" } */
int
main ()
{
_Decimal32 d = (_Decimal32) __builtin_inff ();
if (!__builtin_isinf ((double) d))
__builtin_abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment