Commit c0e3f87d by Richard Henderson Committed by Richard Henderson

recog.c (validate_replace_rtx_1): Consider subregs when replacing a register…

recog.c (validate_replace_rtx_1): Consider subregs when replacing a register with a constant inside a...

        * recog.c (validate_replace_rtx_1): Consider subregs when
        replacing a register with a constant inside a sign/zero_extend.

From-SVN: r37352
parent 662f340b
2000-11-09 Richard Henderson <rth@redhat.com> 2000-11-09 Richard Henderson <rth@redhat.com>
* recog.c (validate_replace_rtx_1): Consider subregs when
replacing a register with a constant inside a sign/zero_extend.
* config/alpha/linux.h (HANDLE_PRAGMA_PACK_PUSH_POP): Define. * config/alpha/linux.h (HANDLE_PRAGMA_PACK_PUSH_POP): Define.
2000-11-09 Geoffrey Keating <geoffk@redhat.com> 2000-11-09 Geoffrey Keating <geoffk@redhat.com>
......
...@@ -480,14 +480,29 @@ validate_replace_rtx_1 (loc, from, to, object) ...@@ -480,14 +480,29 @@ validate_replace_rtx_1 (loc, from, to, object)
/* In these cases, the operation to be performed depends on the mode /* In these cases, the operation to be performed depends on the mode
of the operand. If we are replacing the operand with a VOIDmode of the operand. If we are replacing the operand with a VOIDmode
constant, we lose the information. So try to simplify the operation constant, we lose the information. So try to simplify the operation
in that case. If it fails, substitute in something that we know in that case. */
won't be recognized. */
if (GET_MODE (to) == VOIDmode if (GET_MODE (to) == VOIDmode
&& rtx_equal_p (XEXP (x, 0), from)) && (rtx_equal_p (XEXP (x, 0), from)
|| (GET_CODE (XEXP (x, 0)) == SUBREG
&& rtx_equal_p (SUBREG_REG (XEXP (x, 0)), from))))
{ {
rtx new = simplify_unary_operation (code, GET_MODE (x), to, rtx new = NULL_RTX;
GET_MODE (from));
if (new == 0) /* 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 the above didn't fail, perform the extension from the
mode of the operand (and not the mode of FROM). */
if (to)
new = simplify_unary_operation (code, GET_MODE (x), to,
GET_MODE (XEXP (x, 0)));
/* If any of the above failed, substitute in something that
we know won't be recognized. */
if (!new)
new = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx); new = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
validate_change (object, loc, new, 1); validate_change (object, loc, new, 1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment