diff options
author | Jakub Jelinek <jakub@redhat.com> | 2000-10-05 18:53:33 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2000-10-05 18:53:33 +0200 |
commit | e389897bcd904611f78753b05a512e73ddaf15e7 (patch) | |
tree | b9a2bfc5cba9c5bd927e638e6f77612c2d776746 | |
parent | ab9b1e42390e727953c03078a31e9d31440a69f7 (diff) | |
download | gcc-e389897bcd904611f78753b05a512e73ddaf15e7.zip gcc-e389897bcd904611f78753b05a512e73ddaf15e7.tar.gz gcc-e389897bcd904611f78753b05a512e73ddaf15e7.tar.bz2 |
emit-rtl.c (gen_lowpart_common): Fix conversion from float to integral mode with HOST_BITS_PER_WIDE_INT 64.
* emit-rtl.c (gen_lowpart_common) [REAL_ARITHMETICS]: Fix conversion
from float to integral mode with HOST_BITS_PER_WIDE_INT 64.
* dwarf2out.c (add_const_value_attribute): Divide by 4, not
sizeof(long).
From-SVN: r36728
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 2 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 26 |
3 files changed, 26 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 540f54a..2b01059 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2000-10-05 Jakub Jelinek <jakub@redhat.com> + + * emit-rtl.c (gen_lowpart_common) [REAL_ARITHMETICS]: Fix conversion + from float to integral mode with HOST_BITS_PER_WIDE_INT 64. + * dwarf2out.c (add_const_value_attribute): Divide by 4, not + sizeof(long). + Thu Oct 5 09:31:31 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> * fold-const.c (fold, case MINUS_EXPR, case EQ_EXPR): Perform diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index bc1964a..4e520fe 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -7692,7 +7692,7 @@ add_const_value_attribute (die, rtl) if (GET_MODE_CLASS (mode) == MODE_FLOAT) { - register unsigned length = GET_MODE_SIZE (mode) / sizeof (long); + register unsigned length = GET_MODE_SIZE (mode) / 4; long *array = (long *) xmalloc (sizeof (long) * length); REAL_VALUE_TYPE rv; diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 2a4bdb9..c5ddeb0 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -942,10 +942,12 @@ gen_lowpart_common (mode, x) break; #if LONG_DOUBLE_TYPE_SIZE == 96 case XFmode: + REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, i + endian); + i[3-3*endian] = 0; #else case TFmode: -#endif REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, i); +#endif break; default: abort (); @@ -964,13 +966,21 @@ gen_lowpart_common (mode, x) for (c = 0; c < 4; c++) i[c] &= ~ (0L); - - return immed_double_const (i[endian * 3] - | (((HOST_WIDE_INT) i[1 + endian]) << 32), - i[2 - endian] - | (((HOST_WIDE_INT) i[3 - endian * 3]) - << 32), - mode); + + switch (GET_MODE (x)) + { + case SFmode: + case DFmode: + return immed_double_const (((unsigned long) i[endian]) | + (((HOST_WIDE_INT) i[1-endian]) << 32), + 0, mode); + default: + return immed_double_const (((unsigned long) i[endian*3]) | + (((HOST_WIDE_INT) i[1+endian]) << 32), + ((unsigned long) i[2-endian]) | + (((HOST_WIDE_INT) i[3-endian*3]) << 32), + mode); + } } #endif } |