Part 3 of 4, split from the full patch.  Additional optimization
opportunity, since the MSP430 does a lot of conversions between HImode
and PSImode.

gcc/
        * expr.c (convert_move): If the target has an explicit converter,
        use it.

Index: gcc/expr.c
===================================================================
--- gcc/expr.c  (revision 211858)
+++ gcc/expr.c  (working copy)
@@ -405,12 +405,32 @@ convert_move (rtx to, rtx from, int unsi
                                                                       from)
                          : gen_rtx_FLOAT_EXTEND (to_mode, from));
       return;
     }
 
   /* Handle pointer conversion.  */                    /* SPEE 900220.  */
+  /* If the target has a converter from FROM_MODE to TO_MODE, use it.  */
+  {
+    convert_optab ctab;
+
+    if (GET_MODE_PRECISION (from_mode) > GET_MODE_PRECISION (to_mode))
+      ctab = trunc_optab;
+    else if (unsignedp)
+      ctab = zext_optab;
+    else
+      ctab = sext_optab;
+
+    if (convert_optab_handler (ctab, to_mode, from_mode)
+       != CODE_FOR_nothing)
+      {
+       emit_unop_insn (convert_optab_handler (ctab, to_mode, from_mode),
+                       to, from, UNKNOWN);
+       return;
+      }
+  }
+
   /* Targets are expected to provide conversion insns between PxImode and
      xImode for all MODE_PARTIAL_INT modes they use, but no others.  */
   if (GET_MODE_CLASS (to_mode) == MODE_PARTIAL_INT)
     {
       enum machine_mode full_mode
        = smallest_mode_for_size (GET_MODE_BITSIZE (to_mode), MODE_INT);

Reply via email to