aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2016-12-04 15:38:05 +0100
committerUros Bizjak <uros@gcc.gnu.org>2016-12-04 15:38:05 +0100
commit6b7d84532342ed038a07d850ddacf7a86106a998 (patch)
tree7e3242ff6da9239e948b52cac4248cba291a04c3 /gcc
parentc818397a989cda38cf335a411360307dea311c99 (diff)
downloadgcc-6b7d84532342ed038a07d850ddacf7a86106a998.zip
gcc-6b7d84532342ed038a07d850ddacf7a86106a998.tar.gz
gcc-6b7d84532342ed038a07d850ddacf7a86106a998.tar.bz2
re PR target/70322 (STV doesn't optimize andn)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/i386/i386.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr70322-4.c13
4 files changed, 39 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 496c691..e888c03 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 0bee09b..41717da 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 84fc6fa..a323678 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..8a02b9b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr70322-4.c
@@ -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;
+}