Il 05/12/2012 15:22, Marc Glisse ha scritto:
> +
> +     /* The x86 back-end uses VEC_CONCAT to set an element in a V2DF, but
> +        VEC_MERGE for scalar operations that preserve the other elements
> +        of a vector.  */
> +     if (GET_CODE (trueop1) == VEC_SELECT
> +         && GET_MODE (XEXP (trueop1, 0)) == mode
> +         && XVECLEN (XEXP (trueop1, 1), 0) == 1
> +         && INTVAL (XVECEXP (XEXP (trueop1, 1), 0, 0)) == 1)
> +       {
> +         rtx newop0 = gen_rtx_fmt_e (VEC_DUPLICATE, mode, trueop0);
> +         rtx newop1 = XEXP (trueop1, 0);
> +         return gen_rtx_fmt_eee (VEC_MERGE, mode, newop0, newop1,
> +                                 const1_rtx);
> +       }

So this changes this:

   (vec_concat:M R1:N (vec_select:N V2:M [1]))

to this

   (vec_merge:M (vec_duplicate:M R1:N) V2:M [1])

I wonder if more patterns in i386.md should be canonicalized.
Basically, the occurrences of gen_rtx_VEC_CONCAT should be changed to
simplify_gen_binary, and the fallout fixed.

Otherwise you have patterns that will not match if someone does generate
the vec_concat via simplify_gen_binary.

Paolo

Reply via email to