re PR middle-end/39986 (decimal float constant is incorrect when cc1 is a 64-bit binary)

PR middle-end/39986
	* dfp.c (encode_decimal32, decode_decimal32, encode_decimal64,
	decode_decimal64, encode_decimal128, decode_decimal128): Avoid
	32-bit memcpy into long.

From-SVN: r147253
This commit is contained in:
Janis Johnson 2009-05-07 21:38:46 +00:00 committed by Janis Johnson
parent d998b9b1e4
commit 36afee79d3
2 changed files with 66 additions and 27 deletions

View File

@ -1,3 +1,10 @@
2009-05-07 Janis Johnson <janis187@us.ibm.com>
PR middle-end/39986
* dfp.c (encode_decimal32, decode_decimal32, encode_decimal64,
decode_decimal64, encode_decimal128, decode_decimal128): Avoid
32-bit memcpy into long.
2009-05-07 Jakub Jelinek <jakub@redhat.com>
PR middle-end/40057

View File

@ -1,5 +1,5 @@
/* Decimal floating point support.
Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
This file is part of GCC.
@ -132,6 +132,7 @@ encode_decimal32 (const struct real_format *fmt ATTRIBUTE_UNUSED,
decNumber dn;
decimal32 d32;
decContext set;
int32_t image;
decContextDefault (&set, DEC_INIT_DECIMAL128);
set.traps = 0;
@ -139,7 +140,8 @@ encode_decimal32 (const struct real_format *fmt ATTRIBUTE_UNUSED,
decimal_to_decnumber (r, &dn);
decimal32FromNumber (&d32, &dn, &set);
buf[0] = *(uint32_t *) d32.bytes;
memcpy (&image, d32.bytes, sizeof (int32_t));
buf[0] = image;
}
/* Decode an IEEE 754 decimal32 type into a real. */
@ -151,11 +153,13 @@ decode_decimal32 (const struct real_format *fmt ATTRIBUTE_UNUSED,
decNumber dn;
decimal32 d32;
decContext set;
int32_t image;
decContextDefault (&set, DEC_INIT_DECIMAL128);
set.traps = 0;
*((uint32_t *) d32.bytes) = (uint32_t) buf[0];
image = buf[0];
memcpy (&d32.bytes, &image, sizeof (int32_t));
decimal32ToNumber (&d32, &dn);
decimal_from_decnumber (r, &dn, &set);
@ -170,6 +174,7 @@ encode_decimal64 (const struct real_format *fmt ATTRIBUTE_UNUSED,
decNumber dn;
decimal64 d64;
decContext set;
int32_t image;
decContextDefault (&set, DEC_INIT_DECIMAL128);
set.traps = 0;
@ -179,13 +184,17 @@ encode_decimal64 (const struct real_format *fmt ATTRIBUTE_UNUSED,
if (WORDS_BIGENDIAN == FLOAT_WORDS_BIG_ENDIAN)
{
buf[0] = *(uint32_t *) &d64.bytes[0];
buf[1] = *(uint32_t *) &d64.bytes[4];
memcpy (&image, &d64.bytes[0], sizeof (int32_t));
buf[0] = image;
memcpy (&image, &d64.bytes[4], sizeof (int32_t));
buf[1] = image;
}
else
{
buf[0] = *(uint32_t *) &d64.bytes[4];
buf[1] = *(uint32_t *) &d64.bytes[0];
memcpy (&image, &d64.bytes[4], sizeof (int32_t));
buf[0] = image;
memcpy (&image, &d64.bytes[0], sizeof (int32_t));
buf[1] = image;
}
}
@ -198,19 +207,24 @@ decode_decimal64 (const struct real_format *fmt ATTRIBUTE_UNUSED,
decNumber dn;
decimal64 d64;
decContext set;
int32_t image;
decContextDefault (&set, DEC_INIT_DECIMAL128);
set.traps = 0;
if (WORDS_BIGENDIAN == FLOAT_WORDS_BIG_ENDIAN)
{
*((uint32_t *) &d64.bytes[0]) = (uint32_t) buf[0];
*((uint32_t *) &d64.bytes[4]) = (uint32_t) buf[1];
image = buf[0];
memcpy (&d64.bytes[0], &image, sizeof (int32_t));
image = buf[1];
memcpy (&d64.bytes[4], &image, sizeof (int32_t));
}
else
{
*((uint32_t *) &d64.bytes[0]) = (uint32_t) buf[1];
*((uint32_t *) &d64.bytes[4]) = (uint32_t) buf[0];
image = buf[1];
memcpy (&d64.bytes[0], &image, sizeof (int32_t));
image = buf[0];
memcpy (&d64.bytes[4], &image, sizeof (int32_t));
}
decimal64ToNumber (&d64, &dn);
@ -226,6 +240,7 @@ encode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED,
decNumber dn;
decContext set;
decimal128 d128;
int32_t image;
decContextDefault (&set, DEC_INIT_DECIMAL128);
set.traps = 0;
@ -235,17 +250,25 @@ encode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED,
if (WORDS_BIGENDIAN == FLOAT_WORDS_BIG_ENDIAN)
{
buf[0] = *(uint32_t *) &d128.bytes[0];
buf[1] = *(uint32_t *) &d128.bytes[4];
buf[2] = *(uint32_t *) &d128.bytes[8];
buf[3] = *(uint32_t *) &d128.bytes[12];
memcpy (&image, &d128.bytes[0], sizeof (int32_t));
buf[0] = image;
memcpy (&image, &d128.bytes[4], sizeof (int32_t));
buf[1] = image;
memcpy (&image, &d128.bytes[8], sizeof (int32_t));
buf[2] = image;
memcpy (&image, &d128.bytes[12], sizeof (int32_t));
buf[3] = image;
}
else
{
buf[0] = *(uint32_t *) &d128.bytes[12];
buf[1] = *(uint32_t *) &d128.bytes[8];
buf[2] = *(uint32_t *) &d128.bytes[4];
buf[3] = *(uint32_t *) &d128.bytes[0];
memcpy (&image, &d128.bytes[12], sizeof (int32_t));
buf[0] = image;
memcpy (&image, &d128.bytes[8], sizeof (int32_t));
buf[1] = image;
memcpy (&image, &d128.bytes[4], sizeof (int32_t));
buf[2] = image;
memcpy (&image, &d128.bytes[0], sizeof (int32_t));
buf[3] = image;
}
}
@ -258,23 +281,32 @@ decode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED,
decNumber dn;
decimal128 d128;
decContext set;
int32_t image;
decContextDefault (&set, DEC_INIT_DECIMAL128);
set.traps = 0;
if (WORDS_BIGENDIAN == FLOAT_WORDS_BIG_ENDIAN)
{
*((uint32_t *) &d128.bytes[0]) = (uint32_t) buf[0];
*((uint32_t *) &d128.bytes[4]) = (uint32_t) buf[1];
*((uint32_t *) &d128.bytes[8]) = (uint32_t) buf[2];
*((uint32_t *) &d128.bytes[12]) = (uint32_t) buf[3];
image = buf[0];
memcpy (&d128.bytes[0], &image, sizeof (int32_t));
image = buf[1];
memcpy (&d128.bytes[4], &image, sizeof (int32_t));
image = buf[2];
memcpy (&d128.bytes[8], &image, sizeof (int32_t));
image = buf[3];
memcpy (&d128.bytes[12], &image, sizeof (int32_t));
}
else
{
*((uint32_t *) &d128.bytes[0]) = (uint32_t) buf[3];
*((uint32_t *) &d128.bytes[4]) = (uint32_t) buf[2];
*((uint32_t *) &d128.bytes[8]) = (uint32_t) buf[1];
*((uint32_t *) &d128.bytes[12]) = (uint32_t) buf[0];
image = buf[3];
memcpy (&d128.bytes[0], &image, sizeof (int32_t));
image = buf[2];
memcpy (&d128.bytes[4], &image, sizeof (int32_t));
image = buf[1];
memcpy (&d128.bytes[8], &image, sizeof (int32_t));
image = buf[0];
memcpy (&d128.bytes[12], &image, sizeof (int32_t));
}
decimal128ToNumber (&d128, &dn);