re PR target/70322 (STV doesn't optimize andn)
authorUros Bizjak <uros@gcc.gnu.org>
Sun, 4 Dec 2016 14:38:05 +0000 (15:38 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Sun, 4 Dec 2016 14:38:05 +0000 (15:38 +0100)
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:

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

From-SVN: r243228

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr70322-4.c [new file with mode: 0644]

index 496c691afdce7cac075f994777c4b91a7bdb93fb..e888c036fe1567006eced2b6be68e2a4fbb28b83 100644 (file)
@@ -1,10 +1,17 @@
+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.
+
 2016-12-03  Eric Botcazou  <ebotcazou@adacore.com>
 
        * lra-constraints.c (emit_spill_move): Use gen_lowpart_SUBREG in all
        cases to build a lowpart SUBREG.
 
 2016-12-03  Eric Botcazou  <ebotcazou@adacore.com>
-            David S. Miller  <davem@davemloft.net>
+           David S. Miller  <davem@davemloft.net>
 
        * config/sparc/constraints.md (U): Adjust comment.
        * config/sparc/sparc.md (lra): New attribute.
index 0bee09b2c60d5bb8042dfe268345a7771343551d..41717da822afe34e92d74a35187ff4fb50e61043 100644 (file)
@@ -2826,6 +2826,7 @@ dimode_scalar_to_vector_candidate_p (rtx_insn *insn)
        return false;
       break;
 
+    case NEG:
     case NOT:
       break;
 
@@ -2851,7 +2852,8 @@ dimode_scalar_to_vector_candidate_p (rtx_insn *insn)
 
   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 84fc6fa83bc65ddae44c1b2076fc0ec4f4ed742a..a323678ff7f9a328be12134caadf32f5a1ee94c0 100644 (file)
@@ -1,3 +1,8 @@
+2016-12-04  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/70322
+       * gcc.target/i386/pr70322-4.c: New test.
+
 2016-12-03  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/43207
diff --git a/gcc/testsuite/gcc.target/i386/pr70322-4.c b/gcc/testsuite/gcc.target/i386/pr70322-4.c
new file mode 100644 (file)
index 0000000..8a02b9b
--- /dev/null
@@ -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;
+}