aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-03-30 12:38:21 +0000
committerJakub Jelinek <jakub@redhat.com>2016-03-30 12:38:21 +0000
commit373c27d73ef17d32be80325aeaeda8ff46aaccd6 (patch)
tree676cd56cd10dc8ca9b93578f17ec17969f0ad407
parentcc0ff3253e4adaa959b3f4f8a7ee8eafe7b28b2b (diff)
Backported from mainline
2016-03-02 Jakub Jelinek <jakub@redhat.com> PR target/70028 * config/i386/i386.md (kmovw): Move m constraint to 2nd alternative. (*movhi_internal): Put mask moves from and to memory separately from moves from/to GPRs. * gcc.target/i386/pr70028.c: New test. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-5-branch@234558 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.md13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr70028.c19
4 files changed, 38 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b11e7ad2530..f234be8d382 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,13 @@
2016-03-30 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
+ 2016-03-02 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/70028
+ * config/i386/i386.md (kmovw): Move m constraint to 2nd alternative.
+ (*movhi_internal): Put mask moves from and to memory separately
+ from moves from/to GPRs.
+
2016-02-26 Jakub Jelinek <jakub@redhat.com>
PR target/69969
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index fa0affab0a0..7553a70af90 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -2416,7 +2416,7 @@
(define_insn "kmovw"
[(set (match_operand:HI 0 "nonimmediate_operand" "=k,k")
(unspec:HI
- [(match_operand:HI 1 "nonimmediate_operand" "rm,k")]
+ [(match_operand:HI 1 "nonimmediate_operand" "r,km")]
UNSPEC_KMOV))]
"!(MEM_P (operands[0]) && MEM_P (operands[1])) && TARGET_AVX512F"
"@
@@ -2428,8 +2428,8 @@
(define_insn "*movhi_internal"
- [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r ,r ,m ,k,k,rm")
- (match_operand:HI 1 "general_operand" "r ,rn,rm,rn,rm,k,k"))]
+ [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r ,r ,m ,k,k, r,m")
+ (match_operand:HI 1 "general_operand" "r ,rn,rm,rn,r,km,k,k"))]
"!(MEM_P (operands[0]) && MEM_P (operands[1]))"
{
switch (get_attr_type (insn))
@@ -2443,7 +2443,8 @@
switch (which_alternative)
{
case 4: return "kmovw\t{%k1, %0|%0, %k1}";
- case 5: return "kmovw\t{%1, %0|%0, %1}";
+ case 5: /* FALLTHRU */
+ case 7: return "kmovw\t{%1, %0|%0, %1}";
case 6: return "kmovw\t{%1, %k0|%k0, %1}";
default: gcc_unreachable ();
}
@@ -2456,7 +2457,7 @@
}
}
[(set (attr "type")
- (cond [(eq_attr "alternative" "4,5,6")
+ (cond [(eq_attr "alternative" "4,5,6,7")
(const_string "mskmov")
(match_test "optimize_function_for_size_p (cfun)")
(const_string "imov")
@@ -2473,7 +2474,7 @@
]
(const_string "imov")))
(set (attr "prefix")
- (if_then_else (eq_attr "alternative" "4,5,6")
+ (if_then_else (eq_attr "alternative" "4,5,6,7")
(const_string "vex")
(const_string "orig")))
(set (attr "mode")
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 082f79f1cc7..8d78a3c3872 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,6 +1,11 @@
2016-03-30 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
+ 2016-03-02 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/70028
+ * gcc.target/i386/pr70028.c: New test.
+
2016-02-26 Jakub Jelinek <jakub@redhat.com>
PR target/69969
diff --git a/gcc/testsuite/gcc.target/i386/pr70028.c b/gcc/testsuite/gcc.target/i386/pr70028.c
new file mode 100644
index 00000000000..c071aad7403
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr70028.c
@@ -0,0 +1,19 @@
+/* PR target/70028 */
+/* { dg-do assemble { target avx512bw } } */
+/* { dg-require-effective-target int128 } */
+/* { dg-require-effective-target masm_intel } */
+/* { dg-options "-O2 -fno-forward-propagate -mavx512bw -masm=intel" } */
+
+typedef unsigned short A;
+typedef int B __attribute__ ((vector_size (32)));
+typedef unsigned __int128 C;
+typedef __int128 D __attribute__ ((vector_size (32)));
+
+C
+foo (A a, int b, unsigned c, C d, A e, unsigned f, B g, D h)
+{
+ g[1] ^= (A) ~ a;
+ a ^= (unsigned) g[0];
+ h %= (D) h | 1;
+ return a + b + c + d + e + g[0] + g[1] + h[1];
+}