From eb294a2f2c9c562b10e723e654e4187b5b4aa341 Mon Sep 17 00:00:00 2001 From: wilson Date: Wed, 10 Feb 1999 17:28:24 +0000 Subject: 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@25140 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/emit-rtl.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'gcc/emit-rtl.c') diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 2e48bde2983..a761c45745a 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) -- cgit v1.2.1