aboutsummaryrefslogtreecommitdiff
path: root/gcc/emit-rtl.c
diff options
context:
space:
mode:
authorJim Wilson <wilson@cygnus.com>1999-02-10 17:28:24 +0000
committerJim Wilson <wilson@gcc.gnu.org>1999-02-10 09:28:24 -0800
commitb5a3eb844512505aed41fb3a0cb4e3f45c082589 (patch)
tree893f28e5cc7f90ccdec4e2184b9e0139d7125f68 /gcc/emit-rtl.c
parent01dd4564b6358bed9004a3f8daa41234d1555108 (diff)
downloadgcc-b5a3eb844512505aed41fb3a0cb4e3f45c082589.zip
gcc-b5a3eb844512505aed41fb3a0cb4e3f45c082589.tar.gz
gcc-b5a3eb844512505aed41fb3a0cb4e3f45c082589.tar.bz2
Fix 64b-x-32b cross compiler breakage. Make alpha-x-m32r work again.
* emit-rtl.c (operand_subword): Sign extend REAL_VALUE_TO_TARGET_SINGLE result. * final.c (split_double): Sign extend REAL_VALUE_TO_TARGET_DOUBLE result. * real.c (endian): Delete sign extension code. * config/m32r/m32r.md (movsf_insn+1): REAL_VALUE_TO_TARGET_SINGLE call replaced with operand_subword call. From-SVN: r25140
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r--gcc/emit-rtl.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 2e48bde..a761c45 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -1303,6 +1303,18 @@ operand_subword (op, i, validate_address, mode)
REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
REAL_VALUE_TO_TARGET_SINGLE (rv, l);
+ /* If 32 bits is an entire word for the target, but not for the host,
+ then sign-extend on the host so that the number will look the same
+ way on the host that it would on the target. See for instance
+ simplify_unary_operation. The #if is needed to avoid compiler
+ warnings. */
+
+#if HOST_BITS_PER_LONG > 32
+ if (BITS_PER_WORD < HOST_BITS_PER_LONG && BITS_PER_WORD == 32
+ && (l & ((long) 1 << 31)))
+ l |= ((long) (-1) << 32);
+#endif
+
if (BITS_PER_WORD == 16)
{
if ((i & 0x1) == !WORDS_BIG_ENDIAN)