https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65151
--- Comment #7 from Oleg Endo <olegendo at gcc dot gnu.org> --- The following fixes the problem: Index: gcc/config/sh/sh.c =================================================================== --- gcc/config/sh/sh.c (revision 220889) +++ gcc/config/sh/sh.c (working copy) @@ -12049,6 +12049,9 @@ bool sh_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode) { + if (regno == T_REG) + return mode == SImode || mode == HImode || mode == QImode; + if (SPECIAL_REGISTER_P (regno)) return mode == SImode; Index: gcc/config/sh/sh.md =================================================================== --- gcc/config/sh/sh.md (revision 220889) +++ gcc/config/sh/sh.md (working copy) @@ -11224,6 +11224,13 @@ "movt %0" [(set_attr "type" "arith")]) +(define_insn "*movt" + [(set (match_operand:QIHI 0 "arith_reg_dest" "=r") + (match_operand:QIHI 1 "t_reg_operand"))] + "TARGET_SH1" + "movt %0" + [(set_attr "type" "arith")]) + (define_insn "movrt" [(set (match_operand:SI 0 "arith_reg_dest" "=r") (xor:SI (match_operand:SI 1 "t_reg_operand" "") (const_int 1)))] However, I've not tested it for any further side effects.