https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109855
--- Comment #4 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> --- I guess the problem is that the define_subst output template has: (match_operand:<VDBL> 0) which creates a new operand 0 with an empty predicate and constraint, as opposed to a (match_dup 0), which would be substituted with the original operand 0. Unfortunately (match_dup:<VDBL> 0) doesn't work as a way of inserting the original destination with a different mode, since the :<VDBL> is ignored. Perhaps we should “fix” that. Alternatively: (match_operand:<VDBL> 0 "register_operand" "=w") should work, but probably locks us into using patterns that have one alternative only.