emit-rtl.c (gen_highpart): The high part of a CONST_INT is not zero if...
authorJohn Carr <jfc@mit.edu>
Wed, 22 Apr 1998 12:57:04 +0000 (12:57 +0000)
committerJohn Carr <jfc@gcc.gnu.org>
Wed, 22 Apr 1998 12:57:04 +0000 (12:57 +0000)
* 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
gcc/emit-rtl.c
gcc/final.c

index cbed5aa665e3bf99719a4f8bf063a8e79a6175b7..7f8466b948e44e69f4f25c0717999098559f6e39 100644 (file)
@@ -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.
index aafc41c28ebad8f9936bc7659b1ca72a725f0320..0516927b161d48a09832169ab6bc08eb27cd4e10 100644 (file)
@@ -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;
index 038de928be96aef6cabfd25fb8e802fbff51914d..393da70adebf83aaff338f80ca53c8349387d06b 100644 (file)
@@ -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;