From c0e3f87d491b3a0e99cfc95717753d130006dfd7 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 9 Nov 2000 16:07:52 -0800 Subject: [PATCH] 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 --- gcc/ChangeLog | 3 +++ gcc/recog.c | 27 +++++++++++++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e0fe0ed2fd0..d8dde6af720 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2000-11-09 Richard Henderson + * 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. 2000-11-09 Geoffrey Keating diff --git a/gcc/recog.c b/gcc/recog.c index b8b532e2403..c01f884ebb4 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -480,14 +480,29 @@ validate_replace_rtx_1 (loc, from, to, object) /* In these cases, the operation to be performed depends on the mode of the operand. If we are replacing the operand with a VOIDmode constant, we lose the information. So try to simplify the operation - in that case. If it fails, substitute in something that we know - won't be recognized. */ + in that case. */ 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, - GET_MODE (from)); - if (new == 0) + rtx new = NULL_RTX; + + /* 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); validate_change (object, loc, new, 1); -- 2.30.2