On 12/07/2015 06:53 AM, Chen Gang wrote:
> -(define_insn "insn_cmpne_<I48MODE:mode><I48MODE2:mode>"
> -  [(set (match_operand:I48MODE2 0 "register_operand" "=r")
> -     (ne:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "rO")
> -                  (match_operand:I48MODE 2 "reg_or_cint_operand" "rO")))]
> +(define_insn "insn_cmpne_di<I48MODE:mode>"
> +  [(set (match_operand:I48MODE 0 "register_operand" "=r")
> +     (ne:I48MODE (match_operand:DI 1 "reg_or_0_operand" "rO")
> +                  (match_operand:DI 2 "reg_or_cint_operand" "rO")))]
>    ""
>    "cmpne\t%0, %r1, %r2")
>   
> -(define_insn "insn_cmpeq_<I48MODE:mode><I48MODE2:mode>"
> -  [(set (match_operand:I48MODE2 0 "register_operand" "=r,r")
> -     (eq:I48MODE2 (match_operand:I48MODE 1 "reg_or_0_operand" "%rO,rO")
> -                  (match_operand:I48MODE 2 "reg_or_cint_operand" "I,rO")))]
> +(define_insn "insn_cmpne_si<I48MODE:mode>"
> +  [(set (match_operand:I48MODE 0 "register_operand" "=r")
> +     (ne:I48MODE (match_operand:SI 1 "reg_or_0_operand" "rO")
> +                  (match_operand:SI 2 "reg_or_cint_operand" "rO")))]
> +  ""
> +  "xor\t%0, %r1, %r2; bfextu\t%0, %0, 0, 31; cmpne\t%0, %0, zero"
> +  [(set_attr "type" "cannot_bundle")])
> +

The preferred solution is to remove SImode comparisons entirely, so that the
middle-end extends the data itself.

In addition, you might experiment with removing the SImode result of the
comparisons here.  We don't have them for Alpha (only DImode result), and we
don't miss them; when SImode results are required they are created via subregs.


r~

Reply via email to