aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2000-10-05 18:53:33 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2000-10-05 18:53:33 +0200
commite389897bcd904611f78753b05a512e73ddaf15e7 (patch)
treeb9a2bfc5cba9c5bd927e638e6f77612c2d776746
parentab9b1e42390e727953c03078a31e9d31440a69f7 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/dwarf2out.c2
-rw-r--r--gcc/emit-rtl.c26
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
}