expr.c (emit_move_insn_1): If there is no move pattern for the original mode...
authorRichard Sandiford <rsandifo@redhat.com>
Fri, 26 Sep 2003 06:08:48 +0000 (06:08 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 26 Sep 2003 06:08:48 +0000 (06:08 +0000)
* 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

gcc/ChangeLog
gcc/expr.c

index 6ead1c02d1bbab56938db7a9ecf0f5acae13158e..534e99b493a94079d000d01cbca380c5897746be 100644 (file)
@@ -1,3 +1,8 @@
+2003-09-26  Richard Sandiford  <rsandifo@redhat.com>
+
+       * 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  <rsandifo@redhat.com>
 
        * combine.c (if_then_else_cond): Tighten mode check.
index 633f4a755379699060abded00b9001cf91b1f38a..6ad93c506ab9f6d4abacd34ba52c29cc41f9d658 100644 (file)
@@ -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.  */