Hello! In addition to mask registers, QImode and HImode fixups in HARD_REGNO_CALLER_SAVE_MODE apply only to general registers.
2017-01-16 Uros Bizjak <ubiz...@gmail.com> * config/i386/i386.h (HARD_REGNO_CALLER_SAVE_MODE): Apply HImode and QImode fixups to general and mask registers only. Bootstrapped and regression tested on x86_64-linux-gnu. Committed to mainline SVN. Uros.
Index: config/i386/i386.h =================================================================== --- config/i386/i386.h (revision 244497) +++ config/i386/i386.h (working copy) @@ -1211,9 +1211,10 @@ extern const char *host_detect_local_cpu (int argc (CC_REGNO_P (REGNO) ? VOIDmode \ : (MODE) == VOIDmode && (NREGS) != 1 ? VOIDmode \ : (MODE) == VOIDmode ? choose_hard_reg_mode ((REGNO), (NREGS), false) \ - : (MODE) == HImode && !(TARGET_PARTIAL_REG_STALL \ + : (MODE) == HImode && !((GENERAL_REGNO_P (REGNO) \ + && TARGET_PARTIAL_REG_STALL) \ || MASK_REGNO_P (REGNO)) ? SImode \ - : (MODE) == QImode && !(TARGET_64BIT || QI_REGNO_P (REGNO) \ + : (MODE) == QImode && !(ANY_QI_REGNO_P (REGNO) \ || MASK_REGNO_P (REGNO)) ? SImode \ : (MODE))