[3/4] change specific int128 -> generic intN
diff mbox

Message ID 201406242339.s5ONdlX9012977@greed.delorie.com
State New
Headers show

Commit Message

DJ Delorie June 24, 2014, 11:39 p.m. UTC
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.

Patch
diff mbox

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);