diff mbox

[i386] Handle NEG in 32-bit stv pass (PR target/70322)

Message ID CAFULd4a-H3k3Cuc+xqEPnnA8geqGpmq9ZAG6wmnS+UOwX1wGDg@mail.gmail.com
State New
Headers show

Commit Message

Uros Bizjak Dec. 4, 2016, 2:42 p.m. UTC
Hello!

Attached patch implements NEG handling in 32-bit stv pass as 0 - val.
Everything besides the conversion itself was already in place.

2016-12-04  Uros Bizjak  <ubizjak@gmail.com>

    PR target/70322
    * config/i386/i386.c (dimode_scalar_to_vector_candidate_p): Handle NEG.
    (dimode_scalar_chain::compute_convert_gain): Ditto.
    (dimode_scalar_chain::convert_insn): Ditto.

testsuite/ChangeLog:

2016-12-04  Uros Bizjak  <ubizjak@gmail.com>

    PR target/70322
    * gcc.target/i386/pr70322-4.c: New test.

Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.

Committed to mainline SVN.

Uros.
diff mbox

Patch

Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 243227)
+++ config/i386/i386.c	(working copy)
@@ -2826,6 +2826,7 @@  dimode_scalar_to_vector_candidate_p (rtx_insn *ins
 	return false;
       break;
 
+    case NEG:
     case NOT:
       break;
 
@@ -2851,7 +2852,8 @@  dimode_scalar_to_vector_candidate_p (rtx_insn *ins
 
   if ((GET_MODE (XEXP (src, 0)) != DImode
        && !CONST_INT_P (XEXP (src, 0)))
-      || (GET_CODE (src) != NOT
+      || (GET_CODE (src) != NEG
+	  && GET_CODE (src) != NOT
 	  && GET_MODE (XEXP (src, 1)) != DImode
 	  && !CONST_INT_P (XEXP (src, 1))))
     return false;
@@ -3419,7 +3421,8 @@  dimode_scalar_chain::compute_convert_gain ()
 	  if (CONST_INT_P (XEXP (src, 1)))
 	    gain -= vector_const_cost (XEXP (src, 1));
 	}
-      else if (GET_CODE (src) == NOT)
+      else if (GET_CODE (src) == NEG
+	       || GET_CODE (src) == NOT)
 	gain += ix86_cost->add - COSTS_N_INSNS (1);
       else if (GET_CODE (src) == COMPARE)
 	{
@@ -3776,6 +3779,14 @@  dimode_scalar_chain::convert_insn (rtx_insn *insn)
       PUT_MODE (src, V2DImode);
       break;
 
+    case NEG:
+      src = XEXP (src, 0);
+      convert_op (&src, insn);
+      subreg = gen_reg_rtx (V2DImode);
+      emit_insn_before (gen_move_insn (subreg, CONST0_RTX (V2DImode)), insn);
+      src = gen_rtx_MINUS (V2DImode, subreg, src);
+      break;
+
     case NOT:
       src = XEXP (src, 0);
       convert_op (&src, insn);
Index: testsuite/gcc.target/i386/pr70322-4.c
===================================================================
--- testsuite/gcc.target/i386/pr70322-4.c	(nonexistent)
+++ testsuite/gcc.target/i386/pr70322-4.c	(working copy)
@@ -0,0 +1,13 @@ 
+/* PR target/70322 */
+/* { dg-do compile { target ia32 } } */
+/* { dg-options "-O2 -msse2 -mstv" } */
+/* { dg-final { scan-assembler "psub" } } */
+/* { dg-final { scan-assembler "por" } } */
+
+extern long long z;
+
+void
+foo (long long x, long long y)
+{
+  z = -x | y;
+}