From 3f980cf79d678288be2dff76bfb96aa8a394bfb0 Mon Sep 17 00:00:00 2001 From: jakub Date: Thu, 5 Oct 2000 16:53:33 +0000 Subject: * 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 --- gcc/emit-rtl.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'gcc/emit-rtl.c') 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 } -- cgit v1.2.1