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:
parent
d998b9b1e4
commit
36afee79d3
|
@ -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
|
||||
|
|
86
gcc/dfp.c
86
gcc/dfp.c
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue