From 27eef9cececccd37254c9106b02fd965369650eb Mon Sep 17 00:00:00 2001 From: John Carr Date: Wed, 22 Apr 1998 12:57:04 +0000 Subject: [PATCH] emit-rtl.c (gen_highpart): The high part of a CONST_INT is not zero if... * emit-rtl.c (gen_highpart): The high part of a CONST_INT is not zero if HOST_BITS_PER_WIDE_INT is larger than BITS_PER_WORD. * final.c (split_double): Sign extend both halves of a split CONST_INT. From-SVN: r19375 --- gcc/ChangeLog | 7 +++++++ gcc/emit-rtl.c | 13 ++++++++----- gcc/final.c | 14 +++++--------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cbed5aa665e..7f8466b948e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Wed Apr 22 15:52:22 1998 John Carr + + * emit-rtl.c (gen_highpart): The high part of a CONST_INT is not zero + if HOST_BITS_PER_WIDE_INT is larger than BITS_PER_WORD. + + * final.c (split_double): Sign extend both halves of a split CONST_INT. + Wed Apr 22 10:42:45 1998 Jeffrey A Law (law@cygnus.com) * mips.c (compute_frame_size): Change only argument to a HOST_WIDE_INT. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index aafc41c28eb..0516927b161 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -720,14 +720,13 @@ gen_lowpart_common (mode, x) : GEN_INT (CONST_DOUBLE_LOW (x))); else { - /* MODE must be narrower than HOST_BITS_PER_INT. */ + /* MODE must be narrower than HOST_BITS_PER_WIDE_INT. */ int width = GET_MODE_BITSIZE (mode); HOST_WIDE_INT val = (GET_CODE (x) == CONST_INT ? INTVAL (x) : CONST_DOUBLE_LOW (x)); - if (((val & ((HOST_WIDE_INT) (-1) << (width - 1))) - != ((HOST_WIDE_INT) (-1) << (width - 1)))) - val &= ((HOST_WIDE_INT) 1 << width) - 1; + /* Sign extend to HOST_WIDE_INT. */ + val = val << (HOST_BITS_PER_WIDE_INT - width) >> (HOST_BITS_PER_WIDE_INT - width); return (GET_CODE (x) == CONST_INT && INTVAL (x) == val ? x : GEN_INT (val)); @@ -984,7 +983,11 @@ gen_highpart (mode, x) ) return GEN_INT (CONST_DOUBLE_HIGH (x) & GET_MODE_MASK (mode)); else if (GET_CODE (x) == CONST_INT) - return const0_rtx; + { + if (HOST_BITS_PER_WIDE_INT <= BITS_PER_WORD) + return const0_rtx; + return GEN_INT (INTVAL (x) >> (HOST_BITS_PER_WIDE_INT - BITS_PER_WORD)); + } else if (GET_CODE (x) == MEM) { register int offset = 0; diff --git a/gcc/final.c b/gcc/final.c index 038de928be9..393da70adeb 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -3677,16 +3677,12 @@ split_double (value, first, second) if (HOST_BITS_PER_WIDE_INT >= (2 * BITS_PER_WORD)) { /* In this case the CONST_INT holds both target words. - Extract the bits from it into two word-sized pieces. */ + Extract the bits from it into two word-sized pieces. + Sign extend each half to HOST_WIDE_INT. */ rtx low, high; - HOST_WIDE_INT word_mask; - /* Avoid warnings for shift count >= BITS_PER_WORD. */ - int shift_count = BITS_PER_WORD - 1; - - word_mask = (HOST_WIDE_INT) 1 << shift_count; - word_mask |= word_mask - 1; - low = GEN_INT (INTVAL (value) & word_mask); - high = GEN_INT ((INTVAL (value) >> (shift_count + 1)) & word_mask); + + low = GEN_INT (INTVAL (value) << (HOST_BITS_PER_WIDE_INT - BITS_PER_WORD) >> (HOST_BITS_PER_WIDE_INT - BITS_PER_WORD)); + high = GEN_INT (INTVAL (value) << (HOST_BITS_PER_WIDE_INT - 2 * BITS_PER_WORD) >> (HOST_BITS_PER_WIDE_INT - BITS_PER_WORD)); if (WORDS_BIG_ENDIAN) { *first = high; -- 2.30.2