mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-08 16:07:24 +08:00
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
This commit is contained in:
parent
3f4ea1dee8
commit
27eef9cece
@ -1,3 +1,10 @@
|
||||
Wed Apr 22 15:52:22 1998 John Carr <jfc@mit.edu>
|
||||
|
||||
* 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.
|
||||
|
@ -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;
|
||||
|
12
gcc/final.c
12
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;
|
||||
|
Loading…
Reference in New Issue
Block a user