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

Reply via email to