Explicitly switch between the JR and JRC instructions for the table jump in `casesi_internal_mips16_<mode>', depending on their availability in the ISA level chosen, taking away the reliance on assembler relaxation. Adjust the instruction count accordingly now that we control the length of this code piece ourselves.
gcc/ * config/mips/mips.md (casesi_internal_mips16_<mode>): Explicitly switch between JR and JRC for the table jump. Adjust instruction count. --- OK to apply? Maciej gcc-mips16-casesi-ret.diff Index: gcc/gcc/config/mips/mips.md =================================================================== --- gcc.orig/gcc/config/mips/mips.md 2016-11-12 10:57:13.000000000 +0000 +++ gcc/gcc/config/mips/mips.md 2016-11-12 10:57:30.158107981 +0000 @@ -6442,9 +6442,15 @@ output_asm_insn ("<d>addu\t%4, %4, %5", operands); - return "j\t%4"; + if (GENERATE_MIPS16E) + return "jrc\t%4"; + else + return "jr\t%4"; } - [(set_attr "insn_count" "11")]) + [(set (attr "insn_count") + (if_then_else (match_test "GENERATE_MIPS16E") + (const_string "10") + (const_string "11")))]) ;; For TARGET_USE_GOT, we save the gp in the jmp_buf as well. ;; While it is possible to either pull it off the stack (in the