recog.c (validate_replace_rtx_1): In ZERO_EXTEND / SIGN_EXTEND case...
* 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
This commit is contained in:
parent
62e4a75853
commit
44e4159d60
@ -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.
|
||||
|
38
gcc/recog.c
38
gcc/recog.c
@ -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). */
|
||||
|
12
gcc/rtl.texi
12
gcc/rtl.texi
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user