summaryrefslogtreecommitdiff
path: root/gcc/emit-rtl.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-05 16:53:33 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-05 16:53:33 +0000
commit3f980cf79d678288be2dff76bfb96aa8a394bfb0 (patch)
treeb9a2bfc5cba9c5bd927e638e6f77612c2d776746 /gcc/emit-rtl.c
parent7ab8525511995884249eb8edb36b204906b976ae (diff)
downloadgcc-3f980cf79d678288be2dff76bfb96aa8a394bfb0.tar.gz
* 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). git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36728 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r--gcc/emit-rtl.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 2a4bdb9fcdb..c5ddeb081ed 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
}