expr.c (convert_move): If the target has an explicit converter, use it.
authorDJ Delorie <dj@redhat.com>
Fri, 29 Aug 2014 23:19:42 +0000 (19:19 -0400)
committerDJ Delorie <dj@gcc.gnu.org>
Fri, 29 Aug 2014 23:19:42 +0000 (19:19 -0400)
* expr.c (convert_move): If the target has an explicit converter,
use it.

From-SVN: r214747

gcc/ChangeLog
gcc/expr.c

index f5500c9299fec269f827548abaa39bf883062f62..04dda801ede724a8c2f112ea569d86a01ce68a9a 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-29  DJ Delorie  <dj@redhat.com>
+
+       * expr.c (convert_move): If the target has an explicit converter,
+       use it.
+
 2014-08-29  David Malcolm  <dmalcolm@redhat.com>
 
        * gdbinit.in: Skip various inline functions in rtl.h when
index 49c22c5ec4e0543f6d9879469b1934f2e25e3f9b..e7a7c16a0cb0f754e819935feda05ed5c09b363d 100644 (file)
@@ -410,6 +410,26 @@ convert_move (rtx to, rtx from, int unsignedp)
     }
 
   /* 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)