summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/i386/i386.c7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr70421.c22
-rw-r--r--gcc/testsuite/gcc.target/i386/avx512f-pr70421.c15
5 files changed, 56 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 641bf2579c2..db870ff9689 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/70421
+ * config/i386/i386.c (ix86_expand_vector_set): Fix up argument order
+ in gen_blendm expander.
+
2016-03-30 Nick Clifton <nickc@redhat.com>
PR target/62254
@@ -5,7 +11,7 @@
case where we are already provided with an SImode SUBREG.
2016-03-30 Michael Matz <matz@suse.de>
- Richard Biener <rguenther@suse.de>
+ Richard Biener <rguenther@suse.de>
PR ipa/12392
* ipa-polymorphic-call.c (struct type_change_info): Change
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index f700a25e1c0..7a75a31741b 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -46932,7 +46932,12 @@ half:
{
tmp = gen_reg_rtx (mode);
emit_insn (gen_rtx_SET (tmp, gen_rtx_VEC_DUPLICATE (mode, val)));
- emit_insn (gen_blendm (target, tmp, target,
+ /* The avx512*_blendm<mode> expanders have different operand order
+ from VEC_MERGE. In VEC_MERGE, the first input operand is used for
+ elements where the mask is set and second input operand otherwise,
+ in {sse,avx}*_*blend* the first input operand is used for elements
+ where the mask is clear and second input operand otherwise. */
+ emit_insn (gen_blendm (target, target, tmp,
force_reg (mmode,
gen_int_mode (1 << elt, mmode))));
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2d0ecdab899..b2dfebfa0a7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/70421
+ * gcc.dg/torture/pr70421.c: New test.
+ * gcc.target/i386/avx512f-pr70421.c: New test.
+
2016-03-30 Patrick Palka <ppalka@gcc.gnu.org>
PR tree-optimization/59124
diff --git a/gcc/testsuite/gcc.dg/torture/pr70421.c b/gcc/testsuite/gcc.dg/torture/pr70421.c
new file mode 100644
index 00000000000..8f97acd42be
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr70421.c
@@ -0,0 +1,22 @@
+/* PR target/70421 */
+/* { dg-do run } */
+/* { dg-additional-options "-Wno-psabi -w" } */
+
+typedef unsigned V __attribute__ ((vector_size (64)));
+
+unsigned __attribute__ ((noinline, noclone))
+foo (unsigned x, V u, V v)
+{
+ v[1] ^= v[2];
+ x ^= ((V) v)[u[0]];
+ return x;
+}
+
+int
+main ()
+{
+ unsigned x = foo (0x10, (V) { 1 }, (V) { 0x100, 0x1000, 0x10000 });
+ if (x != 0x11010)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-pr70421.c b/gcc/testsuite/gcc.target/i386/avx512f-pr70421.c
new file mode 100644
index 00000000000..60e1e2a8863
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512f-pr70421.c
@@ -0,0 +1,15 @@
+/* PR target/70421 */
+/* { dg-do run } */
+/* { dg-require-effective-target avx512f } */
+/* { dg-options "-O2 -mavx512f" } */
+
+#include "avx512f-check.h"
+
+#define main() do_main()
+#include "../../gcc.dg/torture/pr70421.c"
+
+static void
+avx512f_test (void)
+{
+ do_main ();
+}