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