From f5bccbd106b8a46be84733f7cb7a0edfd753fb7e Mon Sep 17 00:00:00 2001 From: pbrook Date: Wed, 29 Mar 2006 16:33:54 +0000 Subject: [PATCH] 2006-03-29 Paul Brook * reload1.c (choose_reload_regs): Check for all RTX_AUTOINC operators. (inc_for_reload): Handle PRE_MODIFY and POST_MODIFY addresses. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112500 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/reload1.c | 27 ++++++++++++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ab85ea1eac..19e54d9a25d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2006-03-29 Paul Brook + * reload1.c (choose_reload_regs): Check for all RTX_AUTOINC operators. + (inc_for_reload): Handle PRE_MODIFY and POST_MODIFY addresses. + +2006-03-29 Paul Brook + PR middle-end/23623 * targhooks.c (default_narrow_bitfield): New fuction. * targhooks.h (default_narrow_bitfield): add prototype. diff --git a/gcc/reload1.c b/gcc/reload1.c index a735cfed00f..b9d7f8ed4ae 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -5505,10 +5505,7 @@ choose_reload_regs (struct insn_chain *chain) mode = GET_MODE (rld[r].in_reg); } #ifdef AUTO_INC_DEC - else if ((GET_CODE (rld[r].in_reg) == PRE_INC - || GET_CODE (rld[r].in_reg) == PRE_DEC - || GET_CODE (rld[r].in_reg) == POST_INC - || GET_CODE (rld[r].in_reg) == POST_DEC) + else if (GET_RTX_CLASS (GET_CODE (rld[r].in_reg)) == RTX_AUTOINC && REG_P (XEXP (rld[r].in_reg, 0))) { regno = REGNO (XEXP (rld[r].in_reg, 0)); @@ -8115,7 +8112,8 @@ inc_for_reload (rtx reloadreg, rtx in, rtx value, int inc_amount) /* REG or MEM to be copied and incremented. */ rtx incloc = XEXP (value, 0); /* Nonzero if increment after copying. */ - int post = (GET_CODE (value) == POST_DEC || GET_CODE (value) == POST_INC); + int post = (GET_CODE (value) == POST_DEC || GET_CODE (value) == POST_INC + || GET_CODE (value) == POST_MODIFY); rtx last; rtx inc; rtx add_insn; @@ -8130,10 +8128,18 @@ inc_for_reload (rtx reloadreg, rtx in, rtx value, int inc_amount) if (REG_P (incloc)) reg_last_reload_reg[REGNO (incloc)] = 0; - if (GET_CODE (value) == PRE_DEC || GET_CODE (value) == POST_DEC) - inc_amount = -inc_amount; + if (GET_CODE (value) == PRE_MODIFY || GET_CODE (value) == POST_MODIFY) + { + gcc_assert (GET_CODE (XEXP (value, 1)) == PLUS); + inc = XEXP (XEXP (value, 1), 1); + } + else + { + if (GET_CODE (value) == PRE_DEC || GET_CODE (value) == POST_DEC) + inc_amount = -inc_amount; - inc = GEN_INT (inc_amount); + inc = GEN_INT (inc_amount); + } /* If this is post-increment, first copy the location to the reload reg. */ if (post && real_in != reloadreg) @@ -8193,7 +8199,10 @@ inc_for_reload (rtx reloadreg, rtx in, rtx value, int inc_amount) emit_insn (gen_add2_insn (reloadreg, inc)); store = emit_insn (gen_move_insn (incloc, reloadreg)); - emit_insn (gen_add2_insn (reloadreg, GEN_INT (-inc_amount))); + if (GET_CODE (inc) == CONST_INT) + emit_insn (gen_add2_insn (reloadreg, GEN_INT (-INTVAL(inc)))); + else + emit_insn (gen_sub2_insn (reloadreg, inc)); } return store; -- 2.11.4.GIT