On Sat, 12 Apr 2014, Richard Sandiford wrote:

> I went ahead and applied the adjusted version of the patch to trunk
> as below (because I wanted to add a testcase too).

 I believe you need to adjust constraints to ensure constant 0 is known to 
produce a 16-bit instruction encoding where possible.  Otherwise you'll 
end up with suboptimal code when the instruction is in a branch delay 
slot.  E.g. here:

> --- gcc/config/mips/mips.md   2014-04-12 10:36:09.105788710 +0100
> +++ gcc/config/mips/mips.md   2014-04-12 10:38:48.925225200 +0100
> @@ -4437,7 +4437,7 @@ (define_expand "mov<mode>"
>  
>  (define_insn "*mov<mode>_internal"
>    [(set (match_operand:IMOVE32 0 "nonimmediate_operand" 
> "=d,!u,!u,d,e,!u,!ks,d,ZS,ZT,m,*f,*f,*d,*m,*d,*z,*a,*d,*B*C*D,*B*C*D,*d,*m")
> -     (match_operand:IMOVE32 1 "move_operand" 
> "d,J,Udb7,Yd,Yf,ZT,ZS,m,!ks,!u,dJ,*d*J,*m,*f,*f,*z,*d,*J*d,*a,*d,*m,*B*C*D,*B*C*D"))]
> +     (match_operand:IMOVE32 1 "move_operand" 
> "d,J,Udb7,Yd,Yf,ZT,ZS,m,!ks,!kb,dJ,*d*J,*m,*f,*f,*z,*d,*J*d,*a,*d,*m,*B*C*D,*B*C*D"))]
>    "!TARGET_MIPS16
>     && (register_operand (operands[0], <MODE>mode)
>         || reg_or_0_operand (operands[1], <MODE>mode))"

using:

        (match_operand:IMOVE32 1 "move_operand" 
"d,J,Udb7,Yd,Yf,ZT,ZS,m,!ks,!kbJ,dJ,*d*J,*m,*f,*f,*z,*d,*J*d,*a,*d,*m,*B*C*D,*B*C*D"))]

will make:

        jals    foo
         sw     $0, 0($2)

be produced (6 bytes) rather than:

        jal     foo
         sw     $0, 0($2)

(8 bytes), because the "!kbJ"/"ZT" constraint pair will match rather than 
more general "dJ"/"m".  Likewise with the other two RTL patterns.  I'm 
fairly sure you'll be able to come up with an appropriate test case to 
cover it (or to prove me wrong if I missed something here).

  Maciej

Reply via email to