After LRA transition, HImode constants that don't fit into signed 12 bits are no longer subject to constant synthesis:
/* example */ void test(void) { short foo = 32767; __asm__ ("" :: "r"(foo)); } ;; before .literal_position .literal .LC0, 32767 test: l32r a9, .LC0 ret.n This patch fixes that: ;; after test: movi.n a9, -1 extui a9, a9, 17, 15 ret.n gcc/ChangeLog: * config/xtensa/xtensa.md (2 split patterns related to constsynth): Change to also accept HImode operands. --- gcc/config/xtensa/xtensa.md | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md index f3953aa26b0..5242eb3c006 100644 --- a/gcc/config/xtensa/xtensa.md +++ b/gcc/config/xtensa/xtensa.md @@ -1291,28 +1291,36 @@ (set_attr "length" "2,2,2,2,2,2,3,3,3,3,6,3,3,3,3,3")]) (define_split - [(set (match_operand:SI 0 "register_operand") - (match_operand:SI 1 "const_int_operand"))] + [(set (match_operand 0 "register_operand") + (match_operand 1 "const_int_operand"))] "!TARGET_CONST16 && !TARGET_AUTO_LITPOOLS && ! xtensa_split1_finished_p () - && ! xtensa_simm12b (INTVAL (operands[1]))" + && ! xtensa_simm12b (INTVAL (operands[1])) + && GET_MODE (operands[0]) == GET_MODE (operands[1]) + && (GET_MODE (operands[0]) == SImode + || GET_MODE (operands[0]) == HImode)" [(set (match_dup 0) (match_dup 1))] { - operands[1] = force_const_mem (SImode, operands[1]); + operands[1] = force_const_mem (GET_MODE (operands[0]), operands[1]); }) (define_split - [(set (match_operand:SI 0 "register_operand") - (match_operand:SI 1 "constantpool_operand"))] - "! optimize_debug && reload_completed" + [(set (match_operand 0 "register_operand") + (match_operand 1 "constantpool_operand"))] + "! optimize_debug && reload_completed + && GET_MODE (operands[0]) == GET_MODE (operands[1]) + && (GET_MODE (operands[0]) == SImode + || GET_MODE (operands[0]) == HImode)" [(const_int 0)] { - rtx x = avoid_constant_pool_reference (operands[1]); - if (! CONST_INT_P (x)) + rtx x, dst; + if (! CONST_INT_P (x = avoid_constant_pool_reference (operands[1]))) FAIL; - if (! xtensa_constantsynth (operands[0], INTVAL (x))) - emit_move_insn (operands[0], x); + if (GET_MODE (dst = operands[0]) == HImode) + dst = gen_rtx_REG (SImode, REGNO (dst)); + if (! xtensa_constantsynth (dst, INTVAL (x))) + emit_move_insn (dst, x); DONE; }) -- 2.30.2