From: Richard Sandiford Date: Fri, 26 Sep 2003 06:08:48 +0000 (+0000) Subject: expr.c (emit_move_insn_1): If there is no move pattern for the original mode... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5581fc9110377e8a08394f985a17c3e0cb31227a;p=gcc.git expr.c (emit_move_insn_1): If there is no move pattern for the original mode... * expr.c (emit_move_insn_1): If there is no move pattern for the original mode, try using a pattern for the corresponding integer mode. From-SVN: r71816 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ead1c02d1b..534e99b493a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-09-26 Richard Sandiford + + * expr.c (emit_move_insn_1): If there is no move pattern for the + original mode, try using a pattern for the corresponding integer mode. + 2003-09-26 Richard Sandiford * combine.c (if_then_else_cond): Tighten mode check. diff --git a/gcc/expr.c b/gcc/expr.c index 633f4a75537..6ad93c506ab 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -3491,6 +3491,17 @@ emit_move_insn_1 (rtx x, rtx y) return emit_insn (GEN_FCN (insn_code) (x, y)); } + /* Try using a move pattern for the corresponding integer mode. This is + only safe when simplify_subreg can convert MODE constants into integer + constants. At present, it can only do this reliably if the value + fits within a HOST_WIDE_INT. */ + else if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT + && (submode = int_mode_for_mode (mode)) != BLKmode + && mov_optab->handlers[submode].insn_code != CODE_FOR_nothing) + return emit_insn (GEN_FCN (mov_optab->handlers[submode].insn_code) + (simplify_gen_subreg (submode, x, mode, 0), + simplify_gen_subreg (submode, y, mode, 0))); + /* This will handle any multi-word or full-word mode that lacks a move_insn pattern. However, you will get better code if you define such patterns, even if they must turn into multiple assembler instructions. */