https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91814
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- ISTR discussing this but holding back a fix at the time we weren't sure if we'd preserve the non-subreg sets. So sth like Index: gcc/config/i386/i386-features.c =================================================================== --- gcc/config/i386/i386-features.c (revision 275698) +++ gcc/config/i386/i386-features.c (working copy) @@ -668,6 +668,8 @@ scalar_chain::emit_conversion_insns (rtx static rtx gen_gpr_to_xmm_move_src (enum machine_mode vmode, rtx gpr) { + if (!x86_64_general_operand (gpr, GET_MODE_INNER (vmode))) + gpr = force_reg (GET_MODE_INNER (vmode), gpr); switch (GET_MODE_NUNITS (vmode)) { case 1: fixes it with the question whether the use of x86_64_general_operand is correct and whether it's necessary for the NUNITS == 1 case (which IIRC isn't exercised anyway).