Hi Kaz, Oleg, On 09/19/2013 01:15 AM, Kaz Kojima wrote: > Christian Bruel <christian.br...@st.com> wrote: >> && (!can_create_pseudo_p () && REG_P (operands[0]) && REG_P (operands[1]))" >> >> is necessary ? > It looks an another hack to allow the 2nd and 3rd alternatives only > when reloading. If so, it might be a bit cleaner to use a special > predicate like > > This still looks complicated to me. I have tested for sh-superh-elf and sh-linux the attached patch that just "fixes" the issue reported by Richard with no regression and absolutely no differences in code generation for CSIBe and a few other benches (eembc, coremark, ...). The spill alternatives are correctly selected and the original PR still passes.
If OK I'd like to apply it to trunk/4.8. If there is the need for an additional hack, How about sending it separately ? Many thanks, Christian
2013-09-13 Christian Bruel <christian.br...@st.com> * config/sh/sh.md (mov<mode>_reg_reg): Use general_movd*_operand predicate and guard insn with reg only operand. Index: gcc/config/sh/sh.md =================================================================== --- gcc/config/sh/sh.md (revision 202699) +++ gcc/config/sh/sh.md (working copy) @@ -6894,9 +6894,11 @@ label: ;; reloading MAC subregs otherwise. For that probably special patterns ;; would be required. (define_insn "*mov<mode>_reg_reg" - [(set (match_operand:QIHI 0 "arith_reg_dest" "=r,m,*z") - (match_operand:QIHI 1 "register_operand" "r,*z,m"))] - "TARGET_SH1 && !t_reg_operand (operands[1], VOIDmode)" + [(set (match_operand:QIHI 0 "general_movdst_operand" "=r,m,*z") + (match_operand:QIHI 1 "general_movsrc_operand" "r,*z,m"))] + "TARGET_SH1 && !t_reg_operand (operands[1], VOIDmode) + && arith_reg_dest (operands[0], <MODE>mode) + && register_operand (operands[1], <MODE>mode)" "@ mov %1,%0 mov.<bw> %1,%0