aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJohn Carr <jfc@mit.edu>1998-04-22 12:57:04 +0000
committerJohn Carr <jfc@gcc.gnu.org>1998-04-22 12:57:04 +0000
commit27eef9cececccd37254c9106b02fd965369650eb (patch)
tree37289efcae710e9b3892cb4a63490d76a9c2b2c7 /gcc
parent3f4ea1dee8bf07bf77f7b7417fe77652be421afc (diff)
downloadgcc-27eef9cececccd37254c9106b02fd965369650eb.zip
gcc-27eef9cececccd37254c9106b02fd965369650eb.tar.gz
gcc-27eef9cececccd37254c9106b02fd965369650eb.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/emit-rtl.c13
-rw-r--r--gcc/final.c14
3 files changed, 20 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cbed5aa..7f8466b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index aafc41c..0516927 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 038de92..393da70 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;