http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52437
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-02-29 20:37:49 UTC --- I've tried: @@ -3899,7 +3899,7 @@ (vec_merge:VI4F_128 (vec_duplicate:VI4F_128 (match_operand:<ssescalarmode> 2 "general_operand" - " x,m,*r,m,x,x,*rm,*rm,x,fF,*r")) + " x,m,*r,m,x,x,*rm,*rm,x,fF,*re")) (match_operand:VI4F_128 1 "vector_move_operand" " C,C,C ,C,0,x,0 ,x ,0,0 ,0") (const_int 1)))] and that worked too. If you want to swap the m/fF/0 alternative with m/*r/0 alternative (extended with additional e or n, which one is right?), then you should also swap (eq_attr "alternative" "9") (const_string "fmov") (eq_attr "alternative" "10") (const_string "imov")