recog.c (validate_replace_rtx_1): In ZERO_EXTEND / SIGN_EXTEND case...
authorJ"orn Rennecke <amylaar@redhat.com>
Mon, 22 Jan 2001 16:58:08 +0000 (16:58 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Mon, 22 Jan 2001 16:58:08 +0000 (16:58 +0000)
* recog.c (validate_replace_rtx_1): In ZERO_EXTEND / SIGN_EXTEND
case, don't use operand_subword to calculate a SUBREG that is
wider than a word.

* rtl.texi: Comparisons yield 0 or STORE_FLAG_VALUE.

From-SVN: r39183

gcc/ChangeLog
gcc/recog.c
gcc/rtl.texi

index 47d9e2e9d2931800a0ebad89aa70968124eff510..de416749e654721d4d8ce1896118c9a634cf1937 100644 (file)
@@ -1,3 +1,11 @@
+Mon Jan 22 16:53:06 2001  J"orn Rennecke <amylaar@redhat.com>
+
+       * recog.c (validate_replace_rtx_1): In ZERO_EXTEND / SIGN_EXTEND
+       case, don't use operand_subword to calculate a SUBREG that is
+       wider than a word.
+
+       * rtl.texi: Comparisons yield 0 or STORE_FLAG_VALUE.
+
 2001-01-22 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
 
        * c4x.c (c4x_valid_rptb_p, c4x_label_ref_used_p): New functions.
index 4257d7c08c0547d2b42d3b4b0fb90d16fec5034f..4dab907c84891fd48f682108c0ddc244ae323e94 100644 (file)
@@ -491,8 +491,42 @@ validate_replace_rtx_1 (loc, from, to, object)
          /* If there is a subreg involved, crop to the portion of the
             constant that we are interested in.  */
          if (GET_CODE (XEXP (x, 0)) == SUBREG)
-           to = operand_subword (to, SUBREG_WORD (XEXP (x, 0)),
-                                 0, GET_MODE (from));
+           {
+             if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) <= UNITS_PER_WORD)
+               to = operand_subword (to, SUBREG_WORD (XEXP (x, 0)),
+                                     0, GET_MODE (from));
+             else if (GET_MODE_CLASS (GET_MODE (from)) == MODE_INT
+                      && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
+                          <= HOST_BITS_PER_WIDE_INT))
+               {
+                 int i = SUBREG_WORD (XEXP (x, 0)) * BITS_PER_WORD;
+                 HOST_WIDE_INT valh;
+                 unsigned HOST_WIDE_INT vall;
+
+                 if (GET_CODE (to) == CONST_INT)
+                   {
+                     vall = INTVAL (to);
+                     valh = (HOST_WIDE_INT) vall < 0 ? ~0 : 0;
+                   }
+                 else
+                   {
+                     vall = CONST_DOUBLE_LOW (to);
+                     valh = CONST_DOUBLE_HIGH (to);
+                   }
+
+                 if (WORDS_BIG_ENDIAN)
+                   i = (GET_MODE_BITSIZE (GET_MODE (from))
+                        - GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - i);
+                 if (i > 0 && i < HOST_BITS_PER_WIDE_INT)
+                   vall = vall >> i | valh << (HOST_BITS_PER_WIDE_INT - i);
+                 else if (i >= HOST_BITS_PER_WIDE_INT)
+                   vall = valh >> (i - HOST_BITS_PER_WIDE_INT);
+                 to = GEN_INT (trunc_int_for_mode (vall,
+                                                   GET_MODE (XEXP (x, 0))));
+               }
+             else
+               to = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
+           }
 
          /* If the above didn't fail, perform the extension from the
             mode of the operand (and not the mode of FROM).  */
index 4cb0eb7014b354fe310f505c8de2af064e0d0c88..6ed90f8fe77394ba7842e9d4f86180219eb40c73 100644 (file)
@@ -1628,20 +1628,20 @@ point comparisons are distinguished by the machine modes of the operands.
 @findex eq
 @cindex equal
 @item (eq:@var{m} @var{x} @var{y})
-1 if the values represented by @var{x} and @var{y} are equal,
-otherwise 0.
+@code{STORE_FLAG_VALUE} if the values represented by @var{x} and @var{y}
+are equal, otherwise 0.
 
 @findex ne
 @cindex not equal
 @item (ne:@var{m} @var{x} @var{y})
-1 if the values represented by @var{x} and @var{y} are not equal,
-otherwise 0.
+@code{STORE_FLAG_VALUE} if the values represented by @var{x} and @var{y}
+are not equal, otherwise 0.
 
 @findex gt
 @cindex greater than
 @item (gt:@var{m} @var{x} @var{y})
-1 if the @var{x} is greater than @var{y}.  If they are fixed-point,
-the comparison is done in a signed sense.
+@code{STORE_FLAG_VALUE} if the @var{x} is greater than @var{y}.  If they
+are fixed-point, the comparison is done in a signed sense.
 
 @findex gtu
 @cindex greater than